nolo-cli 0.1.31 → 0.1.33

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 (1215) hide show
  1. package/agent-runtime/agentRecordConfig.ts +2 -0
  2. package/agent-runtime/hostAdapter.ts +1 -0
  3. package/agent-runtime/index.ts +0 -21
  4. package/agent-runtime/localToolPolicy.ts +6 -13
  5. package/agent-runtime/localWorkspaceTools.ts +30 -333
  6. package/agent-runtime/platformChatProvider.ts +1 -4
  7. package/agent-runtime/runtimeToolPolicy.ts +47 -32
  8. package/agentAliases.ts +14 -11
  9. package/agentCommandSupport.ts +2 -2
  10. package/agentInternalCommandEntries.ts +2 -11
  11. package/agentListCommands.ts +19 -28
  12. package/agentMachineCommands.ts +29 -103
  13. package/agentPullCommand.ts +17 -9
  14. package/agentRecordCommands.ts +3 -5
  15. package/agentRecordHelpers.ts +26 -102
  16. package/agentRunCommand.ts +416 -37
  17. package/agentRuntimeLocal.ts +0 -10
  18. package/ai/agent/agentSlice.ts +1 -589
  19. package/ai/agent/cliExecutor.ts +19 -323
  20. package/ai/index.ts +1 -1
  21. package/authCommands.ts +2 -36
  22. package/cli/agentAliases.ts +63 -0
  23. package/cli/agentCommandSupport.ts +77 -0
  24. package/cli/agentInternalCommandEntries.ts +34 -0
  25. package/cli/agentListCommands.ts +123 -0
  26. package/cli/agentListHelpers.ts +187 -0
  27. package/cli/agentMachineCommands.ts +402 -0
  28. package/cli/agentPullCommand.ts +147 -0
  29. package/cli/agentRecordCommands.ts +141 -0
  30. package/cli/agentRecordHelpers.ts +395 -0
  31. package/{agentRunParsing.ts → cli/agentRunCommand.ts} +299 -70
  32. package/cli/agentRuntimeLocal.ts +45 -0
  33. package/cli/authCommands.ts +230 -0
  34. package/cli/cliCommandAdapters.ts +28 -0
  35. package/cli/cliCommandDispatch.ts +66 -0
  36. package/cli/cliCommandFactories.ts +66 -0
  37. package/cli/cliCommandTypes.ts +49 -0
  38. package/cli/cliEnvHelpers.ts +44 -0
  39. package/cli/client/agentConfigResolver.ts +1 -0
  40. package/cli/client/agentRun.ts +984 -0
  41. package/cli/client/compactDialog.ts +222 -0
  42. package/cli/client/hybridRecordStore.ts +52 -0
  43. package/cli/client/localAgentRecords.ts +7 -0
  44. package/cli/client/localDialogRecords.ts +30 -0
  45. package/cli/client/localProviderResolver.ts +1 -0
  46. package/cli/client/localRuntimeAdapter.ts +539 -0
  47. package/cli/client/localToolPolicy.ts +8 -0
  48. package/cli/client/profileConfig.ts +101 -0
  49. package/cli/client/streamingOutput.ts +38 -0
  50. package/cli/client/taskRunPrompt.ts +27 -0
  51. package/cli/client/taskWorktree.ts +8 -0
  52. package/cli/client/workspaceSession.ts +11 -0
  53. package/cli/commandRegistry.ts +95 -0
  54. package/cli/connectorRunArtifact.ts +121 -0
  55. package/cli/connectorWebSocketTarget.ts +105 -0
  56. package/cli/defaultServer.ts +1 -0
  57. package/cli/internalCommandEntries.ts +12 -0
  58. package/cli/localRuntimeDb.ts +28 -0
  59. package/cli/machineCommands.ts +323 -0
  60. package/{connector-experimental/daemonLauncher.ts → cli/machineDaemonCommands.ts} +20 -58
  61. package/cli/machineHeartbeatCommands.ts +30 -0
  62. package/cli/machineStatusCommands.ts +95 -0
  63. package/cli/machineWatchCommands.ts +41 -0
  64. package/cli/machineWsPromptMaterialization.ts +89 -0
  65. package/cli/machineWsRunDispatch.ts +601 -0
  66. package/cli/machineWsSession.ts +211 -0
  67. package/cli/offlineMarxistsAgentCommand.ts +314 -0
  68. package/cli/runtimeDoctorCommands.ts +118 -0
  69. package/cli/runtimeModeArgs.ts +33 -0
  70. package/cli/scriptCommandEntries.ts +71 -0
  71. package/cli/systemInternalCommandEntries.ts +65 -0
  72. package/cli/tableCommands.ts +218 -0
  73. package/{taskRunActions.ts → cli/taskRunCommand.ts} +152 -9
  74. package/cli/tui/readlineWorkspace.ts +141 -0
  75. package/cli/tui/session.ts +379 -0
  76. package/cli/updateCommands.ts +134 -0
  77. package/cli/workflowInternalCommandEntries.ts +11 -0
  78. package/cliEnvHelpers.ts +21 -162
  79. package/client/agentConfigResolver.test.ts +2 -0
  80. package/client/agentRun.test.ts +10 -171
  81. package/client/agentRun.ts +853 -57
  82. package/client/localRuntimeAdapter.test.ts +9 -168
  83. package/client/localRuntimeAdapter.ts +22 -159
  84. package/client/localToolPolicy.test.ts +4 -28
  85. package/client/streamingOutput.ts +3 -1
  86. package/client/taskRunPrompt.ts +24 -7
  87. package/commandRegistry.ts +2 -2
  88. package/connectorRunArtifact.ts +10 -34
  89. package/connectorWebSocketTarget.ts +59 -8
  90. package/database/server/db.ts +34 -15
  91. package/internalCommandEntries.ts +0 -8
  92. package/localRuntimeDb.ts +2 -39
  93. package/machineCommands.ts +189 -184
  94. package/machineDaemonCommands.ts +165 -9
  95. package/machineHeartbeatCommands.ts +2 -1
  96. package/machineStatusCommands.ts +13 -5
  97. package/machineWatchCommands.ts +1 -1
  98. package/machineWsRunDispatch.ts +13 -47
  99. package/machineWsSession.ts +28 -9
  100. package/offlineMarxistsAgentCommand.ts +314 -0
  101. package/package.json +121 -198
  102. package/runtimeDoctorCommands.ts +69 -18
  103. package/scriptCommandEntries.ts +45 -5
  104. package/tableCommands.ts +133 -33
  105. package/taskRunCommand.ts +211 -16
  106. package/tui/session.ts +372 -43
  107. package/workflowInternalCommandEntries.ts +0 -20
  108. package/agent-runtime/dialogStatus.ts +0 -139
  109. package/agent-runtime/hostRuntimeCapabilities.ts +0 -7
  110. package/agent-runtime/hostRuntimeConfig.ts +0 -86
  111. package/agent-runtime/shellCommandPolicy.ts +0 -117
  112. package/agent-runtime/toolGate.ts +0 -38
  113. package/agentCreateCustomCommands.ts +0 -278
  114. package/agentDialogsCommands.ts +0 -227
  115. package/agentDoctorCommands.ts +0 -203
  116. package/agentRunLocalWorkspace.ts +0 -182
  117. package/agentSuperviseCommands.ts +0 -8
  118. package/agentUnpublishCommands.ts +0 -113
  119. package/ai/agent/_executeModel.ts +0 -144
  120. package/ai/agent/agentRunDialogLineage.ts +0 -56
  121. package/ai/agent/appWorkingMemory.ts +0 -126
  122. package/ai/agent/avatarUtils.ts +0 -24
  123. package/ai/agent/buildEditingContext.ts +0 -378
  124. package/ai/agent/buildSystemPrompt.ts +0 -580
  125. package/ai/agent/canvasEditingContext.ts +0 -49
  126. package/ai/agent/cleanAgentMessages.ts +0 -140
  127. package/ai/agent/cliChatClient.ts +0 -153
  128. package/ai/agent/contextCompiler.ts +0 -107
  129. package/ai/agent/contextLayerContract.ts +0 -44
  130. package/ai/agent/createAgentSchema.ts +0 -258
  131. package/ai/agent/executeToolCall.ts +0 -59
  132. package/ai/agent/fetchAgentContexts.ts +0 -42
  133. package/ai/agent/generatePrompt.ts +0 -3
  134. package/ai/agent/getFullChatContextKeys.ts +0 -168
  135. package/ai/agent/guidedCreation/assistant.ts +0 -82
  136. package/ai/agent/guidedCreation/capabilities.ts +0 -84
  137. package/ai/agent/guidedCreation/draft.ts +0 -62
  138. package/ai/agent/guidedCreation/types.ts +0 -38
  139. package/ai/agent/hooks/fetchPublicAgents.ts +0 -108
  140. package/ai/agent/hooks/useAgentConfig.ts +0 -89
  141. package/ai/agent/hooks/useAgentDialog.ts +0 -35
  142. package/ai/agent/hooks/useAgentFormValidation.ts +0 -202
  143. package/ai/agent/hooks/usePublicAgents.ts +0 -377
  144. package/ai/agent/pageBuilderHandoffRules.ts +0 -75
  145. package/ai/agent/persistMessageWithFixedId.ts +0 -37
  146. package/ai/agent/planSlice.ts +0 -259
  147. package/ai/agent/publicAgentCatalog.ts +0 -359
  148. package/ai/agent/publicAgentIdentity.ts +0 -76
  149. package/ai/agent/referenceUtils.ts +0 -229
  150. package/ai/agent/runAgentBackground.ts +0 -238
  151. package/ai/agent/runAgentClientLoop.ts +0 -141
  152. package/ai/agent/runtimeGuidance.ts +0 -116
  153. package/ai/agent/server/fetchPublicAgents.ts +0 -158
  154. package/ai/agent/serverOrigin.ts +0 -7
  155. package/ai/agent/startParallelAgentStreams.ts +0 -424
  156. package/ai/agent/startupProtocol.ts +0 -53
  157. package/ai/agent/streamAgentChatTurn.ts +0 -1876
  158. package/ai/agent/streamAgentChatTurnUtils.ts +0 -1068
  159. package/ai/agent/types.ts +0 -73
  160. package/ai/agent/utils/imageOutput.ts +0 -39
  161. package/ai/agent/utils/publicImageAgentMode.ts +0 -26
  162. package/ai/agent/utils/sortUtils.ts +0 -250
  163. package/ai/agent/web/agentDisplayUtils.ts +0 -171
  164. package/ai/agent/web/referencePickerUtils.ts +0 -146
  165. package/ai/agent/web/useAgentModelAvatarComponent.ts +0 -32
  166. package/ai/agent/web/useGuidedAgentCreation.ts +0 -238
  167. package/ai/ai.locale.ts +0 -1103
  168. package/ai/chat/accumulateToolCallChunks.ts +0 -126
  169. package/ai/chat/fetchUtils.native.ts +0 -278
  170. package/ai/chat/fetchUtils.ts +0 -155
  171. package/ai/chat/inlineImageUrlsForCustomProvider.ts +0 -117
  172. package/ai/chat/parseApiError.ts +0 -67
  173. package/ai/chat/parseMultilineSSE.ts +0 -95
  174. package/ai/chat/sendOpenAICompletionsRequest.native.ts +0 -710
  175. package/ai/chat/sendOpenAICompletionsRequest.ts +0 -897
  176. package/ai/chat/sendOpenAIResponseRequest.ts +0 -654
  177. package/ai/chat/shouldUseServerProxy.ts +0 -18
  178. package/ai/chat/sseClient.native.ts +0 -91
  179. package/ai/chat/sseClient.ts +0 -67
  180. package/ai/chat/streamReader.native.ts +0 -31
  181. package/ai/chat/streamReader.ts +0 -62
  182. package/ai/chat/updateTotalUsage.ts +0 -96
  183. package/ai/context/buildReferenceContext.ts +0 -437
  184. package/ai/context/calculateContextUsage.ts +0 -133
  185. package/ai/context/retention.ts +0 -165
  186. package/ai/context/tokenUtils.ts +0 -78
  187. package/ai/llm/agentCapabilities.ts +0 -74
  188. package/ai/llm/calculateGeminiImageTokens.ts +0 -57
  189. package/ai/llm/deepinfra.ts +0 -94
  190. package/ai/llm/fireworks.ts +0 -68
  191. package/ai/llm/generateRequestBody.ts +0 -165
  192. package/ai/llm/getModelContextWindow.ts +0 -84
  193. package/ai/llm/getNoloKey.ts +0 -37
  194. package/ai/llm/getPricing.ts +0 -252
  195. package/ai/llm/hooks/useModelPricing.ts +0 -75
  196. package/ai/llm/imagePricing.ts +0 -66
  197. package/ai/llm/isResponseAPIModel.ts +0 -13
  198. package/ai/llm/kimi.ts +0 -23
  199. package/ai/llm/mimo.ts +0 -71
  200. package/ai/llm/mistral.ts +0 -21
  201. package/ai/llm/modelAvatar.ts +0 -428
  202. package/ai/llm/models.ts +0 -45
  203. package/ai/llm/openrouterModels.ts +0 -6
  204. package/ai/llm/providers.ts +0 -313
  205. package/ai/llm/reasoningModels.ts +0 -29
  206. package/ai/llm/types.ts +0 -82
  207. package/ai/llm/usageRequestOptions.ts +0 -59
  208. package/ai/memory/capture.ts +0 -148
  209. package/ai/memory/consolidate.ts +0 -104
  210. package/ai/memory/delete.ts +0 -148
  211. package/ai/memory/overlay.ts +0 -84
  212. package/ai/memory/query.ts +0 -38
  213. package/ai/memory/queryShared.ts +0 -160
  214. package/ai/memory/rank.ts +0 -105
  215. package/ai/memory/recentRelationshipRecap.ts +0 -247
  216. package/ai/memory/remember.ts +0 -167
  217. package/ai/memory/runtime.ts +0 -76
  218. package/ai/memory/store.ts +0 -20
  219. package/ai/memory/storeShared.ts +0 -77
  220. package/ai/memory/types.ts +0 -46
  221. package/ai/memory/understanding.ts +0 -349
  222. package/ai/memory/understandingGreeting.ts +0 -264
  223. package/ai/messages/type.ts +0 -20
  224. package/ai/policy/commercialMultiplier.ts +0 -16
  225. package/ai/policy/personalizationDialog.ts +0 -333
  226. package/ai/policy/runtimePolicy.ts +0 -440
  227. package/ai/policy/selfUpdateFields.ts +0 -48
  228. package/ai/policy/types.ts +0 -64
  229. package/ai/skills/referenceRuntime.ts +0 -274
  230. package/ai/skills/skillDiagnostics.ts +0 -251
  231. package/ai/skills/skillDocBuilder.ts +0 -139
  232. package/ai/skills/skillReferenceSummary.ts +0 -63
  233. package/ai/skills/skillSummaryMarker.ts +0 -26
  234. package/ai/taskRun/taskRunProtocol.ts +0 -897
  235. package/ai/token/billingAdminAuditEvent.ts +0 -68
  236. package/ai/token/billingAdminAuditEventWriter.ts +0 -41
  237. package/ai/token/billingAnomaly.ts +0 -90
  238. package/ai/token/billingAnomalyLifecycle.ts +0 -54
  239. package/ai/token/billingAnomalyLifecycleWriter.ts +0 -44
  240. package/ai/token/billingAnomalyWriter.ts +0 -41
  241. package/ai/token/calculatePrice.ts +0 -577
  242. package/ai/token/db.ts +0 -98
  243. package/ai/token/deepinfraReconciliation.ts +0 -153
  244. package/ai/token/deepinfraRequestIdQuery.ts +0 -92
  245. package/ai/token/externalToolCost.ts +0 -354
  246. package/ai/token/hooks/useRecords.ts +0 -65
  247. package/ai/token/missingUsageEstimate.ts +0 -51
  248. package/ai/token/modelUsageQuery.ts +0 -269
  249. package/ai/token/normalizeUsage.ts +0 -124
  250. package/ai/token/openaiImageGenerationUsage.ts +0 -56
  251. package/ai/token/openaiReconciliation.ts +0 -188
  252. package/ai/token/prepareTokenUsageData.ts +0 -93
  253. package/ai/token/providerBillableEvent.ts +0 -84
  254. package/ai/token/providerBillableEventWriter.ts +0 -36
  255. package/ai/token/providerBillingAnomalyDrilldown.ts +0 -308
  256. package/ai/token/providerBillingDrilldown.ts +0 -361
  257. package/ai/token/providerBillingHealthReport.ts +0 -366
  258. package/ai/token/providerCall.ts +0 -144
  259. package/ai/token/providerCallSweeper.ts +0 -168
  260. package/ai/token/providerCallWriter.ts +0 -33
  261. package/ai/token/providerCredential.ts +0 -89
  262. package/ai/token/providerCredentialAnomaly.ts +0 -154
  263. package/ai/token/providerCredentialLifecycle.ts +0 -59
  264. package/ai/token/providerCredentialLifecycleWriter.ts +0 -44
  265. package/ai/token/providerCredentialRegistry.ts +0 -83
  266. package/ai/token/providerCredentialRegistryCommand.ts +0 -97
  267. package/ai/token/providerCredentialRegistryList.ts +0 -124
  268. package/ai/token/providerCredentialRegistryResolver.ts +0 -150
  269. package/ai/token/providerCredentialRegistryWriter.ts +0 -41
  270. package/ai/token/providerCredentialRotationCommand.ts +0 -102
  271. package/ai/token/providerCredentialRuntime.ts +0 -56
  272. package/ai/token/providerDispatchIntent.ts +0 -67
  273. package/ai/token/providerDispatchIntentWriter.ts +0 -36
  274. package/ai/token/providerGateway.ts +0 -260
  275. package/ai/token/providerReconciliation.ts +0 -148
  276. package/ai/token/providerReconciliationLocal.ts +0 -97
  277. package/ai/token/providerReconciliationRunner.ts +0 -165
  278. package/ai/token/providerReconciliationWriter.ts +0 -41
  279. package/ai/token/query.ts +0 -88
  280. package/ai/token/queryUserTokens.ts +0 -59
  281. package/ai/token/ratingResult.ts +0 -202
  282. package/ai/token/ratingResultWriter.ts +0 -33
  283. package/ai/token/resolveBillingTarget.ts +0 -52
  284. package/ai/token/saveTokenRecord.ts +0 -53
  285. package/ai/token/serverDialogProjection.ts +0 -80
  286. package/ai/token/serverTokenWriter.ts +0 -153
  287. package/ai/token/stats.ts +0 -21
  288. package/ai/token/tokenThunks.ts +0 -24
  289. package/ai/token/types.ts +0 -103
  290. package/ai/tools/agent/agentTools.ts +0 -235
  291. package/ai/tools/agent/agentUpdateShared.ts +0 -311
  292. package/ai/tools/agent/callAgentTool.ts +0 -138
  293. package/ai/tools/agent/createAgentTool.ts +0 -512
  294. package/ai/tools/agent/createDialogTool.ts +0 -69
  295. package/ai/tools/agent/createSkillAgentTool.ts +0 -62
  296. package/ai/tools/agent/parallelBudget.ts +0 -221
  297. package/ai/tools/agent/prepareAgentDraftTool.ts +0 -173
  298. package/ai/tools/agent/presets/appBuilderPreset.ts +0 -152
  299. package/ai/tools/agent/runLlmTool.ts +0 -96
  300. package/ai/tools/agent/runStreamingAgentTool.ts +0 -72
  301. package/ai/tools/agent/skillAgentArgs.ts +0 -106
  302. package/ai/tools/agent/skillAgentPreset.ts +0 -89
  303. package/ai/tools/agent/startAgentDialogTool.ts +0 -53
  304. package/ai/tools/agent/streamParallelAgentsTool.ts +0 -122
  305. package/ai/tools/agent/updateAgentTool.ts +0 -96
  306. package/ai/tools/agent/updateSelfTool.ts +0 -113
  307. package/ai/tools/amazonProductScraperTool.ts +0 -86
  308. package/ai/tools/apifyActorClient.ts +0 -45
  309. package/ai/tools/appEditGuard.ts +0 -372
  310. package/ai/tools/appReadSnapshot.ts +0 -153
  311. package/ai/tools/appTools.ts +0 -1549
  312. package/ai/tools/applyEditTool.ts +0 -259
  313. package/ai/tools/applyLineEditsTool.ts +0 -315
  314. package/ai/tools/browserTools/click.ts +0 -33
  315. package/ai/tools/browserTools/closeSession.ts +0 -29
  316. package/ai/tools/browserTools/common.ts +0 -27
  317. package/ai/tools/browserTools/openSession.ts +0 -48
  318. package/ai/tools/browserTools/readContent.ts +0 -38
  319. package/ai/tools/browserTools/selectOption.ts +0 -46
  320. package/ai/tools/browserTools/typeText.ts +0 -42
  321. package/ai/tools/category/createCategoryTool.ts +0 -66
  322. package/ai/tools/category/queryContentsByCategoryTool.ts +0 -69
  323. package/ai/tools/category/updateContentCategoryTool.ts +0 -75
  324. package/ai/tools/cfBrowserTools.ts +0 -319
  325. package/ai/tools/cfSpeechToTextTool.ts +0 -49
  326. package/ai/tools/checkEnvTool.ts +0 -102
  327. package/ai/tools/cloudflareCrawlTool.ts +0 -289
  328. package/ai/tools/codeSearchTool.ts +0 -123
  329. package/ai/tools/codeTools.ts +0 -101
  330. package/ai/tools/convertMarxistsBookTool.ts +0 -103
  331. package/ai/tools/createDocTool.ts +0 -132
  332. package/ai/tools/createPlanTool.ts +0 -999
  333. package/ai/tools/createSkillDocTool.ts +0 -155
  334. package/ai/tools/createWorkflowTool.ts +0 -154
  335. package/ai/tools/deepseekOcrTool.ts +0 -34
  336. package/ai/tools/delayTool.ts +0 -31
  337. package/ai/tools/deleteSpacesTool.ts +0 -325
  338. package/ai/tools/deleteSpacesToolModel.ts +0 -159
  339. package/ai/tools/devReloadUtils.ts +0 -29
  340. package/ai/tools/dialogMessageSearch.ts +0 -137
  341. package/ai/tools/doctorSkillTool.ts +0 -72
  342. package/ai/tools/ecommerceScraperTool.ts +0 -86
  343. package/ai/tools/emailTools.ts +0 -549
  344. package/ai/tools/evalSkillTool.ts +0 -92
  345. package/ai/tools/exaSearchTool.ts +0 -64
  346. package/ai/tools/execShellTool.ts +0 -266
  347. package/ai/tools/executeSqlTool.ts +0 -192
  348. package/ai/tools/fetchWebpageSupport.ts +0 -333
  349. package/ai/tools/fetchWebpageTool.ts +0 -97
  350. package/ai/tools/geminiImagePreviewTool.ts +0 -361
  351. package/ai/tools/generateDocxTool.ts +0 -215
  352. package/ai/tools/googleSearchScraperTool.ts +0 -106
  353. package/ai/tools/importDataTool.ts +0 -133
  354. package/ai/tools/importSkillTool.ts +0 -162
  355. package/ai/tools/index.ts +0 -2132
  356. package/ai/tools/jdProductScraperTool.ts +0 -821
  357. package/ai/tools/listFilesTool.ts +0 -85
  358. package/ai/tools/listUserSpacesTool.ts +0 -113
  359. package/ai/tools/localFilesTool.ts +0 -276
  360. package/ai/tools/marxistsOfflineBook.ts +0 -253
  361. package/ai/tools/modelUsageTools.ts +0 -206
  362. package/ai/tools/olmOcrTool.ts +0 -34
  363. package/ai/tools/openaiImageTool.ts +0 -267
  364. package/ai/tools/prepareTools.ts +0 -23
  365. package/ai/tools/readDocTool.ts +0 -84
  366. package/ai/tools/readFileTool.ts +0 -214
  367. package/ai/tools/readTool.ts +0 -194
  368. package/ai/tools/readXPostTool.ts +0 -229
  369. package/ai/tools/rememberMemoryTool.ts +0 -84
  370. package/ai/tools/remotionVideoTool.ts +0 -151
  371. package/ai/tools/searchDialogMessagesTool.ts +0 -222
  372. package/ai/tools/searchRepoTool.ts +0 -118
  373. package/ai/tools/searchWorkspaceTool.ts +0 -259
  374. package/ai/tools/skillFollowup.ts +0 -86
  375. package/ai/tools/surfWeatherTool.ts +0 -169
  376. package/ai/tools/table/addTableRowTool.ts +0 -217
  377. package/ai/tools/table/createTableTool.ts +0 -315
  378. package/ai/tools/table/rowTools.ts +0 -371
  379. package/ai/tools/table/schemaTools.ts +0 -244
  380. package/ai/tools/table/shareTableTool.ts +0 -148
  381. package/ai/tools/table/toolShared.ts +0 -129
  382. package/ai/tools/taobaoTmallProductScraperTool.ts +0 -49
  383. package/ai/tools/toolApiClient.ts +0 -255
  384. package/ai/tools/toolNameAliases.ts +0 -70
  385. package/ai/tools/toolResultError.ts +0 -42
  386. package/ai/tools/toolRunSlice.ts +0 -303
  387. package/ai/tools/toolSchemaCompatibility.ts +0 -53
  388. package/ai/tools/toolVisibility.ts +0 -4
  389. package/ai/tools/types.ts +0 -20
  390. package/ai/tools/uiAskChoiceTool.ts +0 -104
  391. package/ai/tools/updateContentTitleTool.ts +0 -84
  392. package/ai/tools/updateDocTool.ts +0 -105
  393. package/ai/tools/updateUserPreferenceProfileTool.ts +0 -145
  394. package/ai/tools/wereadGatewayTool.ts +0 -152
  395. package/ai/tools/whisperTool.ts +0 -77
  396. package/ai/tools/writeFileTool.ts +0 -213
  397. package/ai/tools/youtubeScraperTool.ts +0 -116
  398. package/ai/tools/ziweiChartTool.ts +0 -678
  399. package/ai/types.ts +0 -55
  400. package/ai/workflow/workflowExecutor.ts +0 -323
  401. package/ai/workflow/workflowSlice.ts +0 -73
  402. package/ai/workflow/workflowTypes.ts +0 -106
  403. package/app/actions/syncAppRecord.ts +0 -73
  404. package/app/admin/adminPages.ts +0 -22
  405. package/app/colors.ts +0 -1
  406. package/app/constants/animationSets.ts +0 -21
  407. package/app/constants/appEditor.ts +0 -99
  408. package/app/constants/clientDownloads.ts +0 -54
  409. package/app/constants/desktopReleaseManifest.ts +0 -68
  410. package/app/constants/homeTabs.ts +0 -15
  411. package/app/constants/routePaths.ts +0 -15
  412. package/app/email/emailApiRoutes.ts +0 -14
  413. package/app/favorite/favoriteSlice.ts +0 -690
  414. package/app/favorite/type.ts +0 -43
  415. package/app/favorite/useAgentFavorite.ts +0 -43
  416. package/app/favorite/useContentFavorite.ts +0 -41
  417. package/app/fetchOwnedApps.ts +0 -269
  418. package/app/guide/quickStartGuide.ts +0 -128
  419. package/app/hooks/deleteDbKey.ts +0 -233
  420. package/app/hooks/index.ts +0 -4
  421. package/app/hooks/useAppDetail.ts +0 -208
  422. package/app/hooks/useAppVersions.ts +0 -52
  423. package/app/hooks/useAutoResizeTextarea.ts +0 -29
  424. package/app/hooks/useChatPageTitle.ts +0 -85
  425. package/app/hooks/useClipboardFiles.ts +0 -20
  426. package/app/hooks/useDesktopLocalConnectorAutostart.ts +0 -38
  427. package/app/hooks/useDragResize.ts +0 -91
  428. package/app/hooks/useElementSizeVar.ts +0 -24
  429. package/app/hooks/useFileDropZone.ts +0 -52
  430. package/app/hooks/useHasMounted.ts +0 -11
  431. package/app/hooks/useImageLoadFallback.ts +0 -19
  432. package/app/hooks/useIsMobile.ts +0 -46
  433. package/app/hooks/useMyApps.ts +0 -375
  434. package/app/hooks/useMyContentItems.ts +0 -91
  435. package/app/hooks/useNewMessageNotification.ts +0 -81
  436. package/app/hooks/usePageMeta.ts +0 -107
  437. package/app/hooks/useRecentlyOpened.ts +0 -84
  438. package/app/hooks/useUnifiedStore.ts +0 -11
  439. package/app/hooks/useUserNotifications.ts +0 -197
  440. package/app/hooks.ts +0 -55
  441. package/app/i18n/clientResources.ts +0 -65
  442. package/app/i18n/i18n.base.ts +0 -14
  443. package/app/i18n/i18n.config.ts +0 -67
  444. package/app/i18n/i18n.server.ts +0 -13
  445. package/app/i18n/index.ts +0 -15
  446. package/app/i18n/mapLanguage.ts +0 -11
  447. package/app/i18n/translations/appBuilder.locale.ts +0 -453
  448. package/app/i18n/translations/error.locale.ts +0 -246
  449. package/app/i18n/translations/interface.locale.ts +0 -2174
  450. package/app/i18n/translations/pricing.locale.ts +0 -397
  451. package/app/i18n/translations/seo.locale.ts +0 -129
  452. package/app/i18n/types.ts +0 -6
  453. package/app/notifications/formatNotification.ts +0 -134
  454. package/app/notifications/model.ts +0 -77
  455. package/app/notifications/notificationSlice.ts +0 -141
  456. package/app/notifications/useNotificationActions.ts +0 -67
  457. package/app/pages/homeTabState.ts +0 -57
  458. package/app/pages/quickChatFlow.ts +0 -109
  459. package/app/pages/rechargeCheckout.ts +0 -23
  460. package/app/pages/usePageArt.ts +0 -91
  461. package/app/realtime/sharedSse.ts +0 -182
  462. package/app/reducer.ts +0 -36
  463. package/app/seo/pageMeta.ts +0 -123
  464. package/app/settings/config.ts +0 -54
  465. package/app/settings/dbActionThunks.ts +0 -34
  466. package/app/settings/defaultSpacePreference.ts +0 -87
  467. package/app/settings/navItems.ts +0 -73
  468. package/app/settings/prepareUserSetting.ts +0 -11
  469. package/app/settings/settingsRecord.ts +0 -8
  470. package/app/settings/web/chat-config/useAutoSaveGlobalPrompt.ts +0 -59
  471. package/app/settings/web/machineStatus.ts +0 -23
  472. package/app/settings/web/useSettingsStylesheet.ts +0 -28
  473. package/app/settings/web/userSecurityUtils.ts +0 -21
  474. package/app/stateViews/runtime.ts +0 -86
  475. package/app/store.ts +0 -53
  476. package/app/theme/colors.ts +0 -280
  477. package/app/theme/fontPreference.ts +0 -77
  478. package/app/theme/index.ts +0 -7
  479. package/app/theme/theme.config.ts +0 -120
  480. package/app/theme/themeModeBootstrap.ts +0 -123
  481. package/app/theme/useSystemTheme.ts +0 -33
  482. package/app/types/appSummary.ts +0 -114
  483. package/app/types.ts +0 -358
  484. package/app/utils/appDeploySource.ts +0 -50
  485. package/app/utils/appKeys.ts +0 -55
  486. package/app/utils/appRuntimeUrl.ts +0 -51
  487. package/app/utils/async.ts +0 -28
  488. package/app/utils/asyncMapStatus.ts +0 -31
  489. package/app/utils/clipboard.ts +0 -86
  490. package/app/utils/credits.ts +0 -12
  491. package/app/utils/desktopAgentRuntimeStatusClient.ts +0 -43
  492. package/app/utils/desktopAgentRuntimeTurnClient.ts +0 -73
  493. package/app/utils/desktopLocalConnectorClient.ts +0 -83
  494. package/app/utils/env.ts +0 -12
  495. package/app/utils/excelToSlate.ts +0 -430
  496. package/app/utils/fileReaders.ts +0 -12
  497. package/app/utils/fileUtils.ts +0 -229
  498. package/app/utils/imageUtils.native.ts +0 -96
  499. package/app/utils/imageUtils.ts +0 -274
  500. package/app/utils/ime.ts +0 -43
  501. package/app/utils/myContentItems.ts +0 -290
  502. package/app/utils/processDateRange.ts +0 -30
  503. package/app/utils/retryFetch.ts +0 -61
  504. package/app/utils/slateToExcel.ts +0 -58
  505. package/app/utils/toast.native.ts +0 -42
  506. package/app/utils/toast.ts +0 -3
  507. package/app/web/spaceInitGuard.ts +0 -28
  508. package/auth/action/signOutAction.ts +0 -0
  509. package/auth/action/signUpAction.ts +0 -227
  510. package/auth/actor.ts +0 -16
  511. package/auth/adminPermissions.ts +0 -18
  512. package/auth/authSlice.ts +0 -531
  513. package/auth/billing.ts +0 -130
  514. package/auth/client/deleteUserRequest.ts +0 -86
  515. package/auth/client/loginRequest.ts +0 -14
  516. package/auth/hooks/useAuth.ts +0 -9
  517. package/auth/hooks/useDeleteOwnAccount.ts +0 -50
  518. package/auth/hooks/useDeleteOwnAccountFlow.ts +0 -66
  519. package/auth/hooks/useDeleteUser.ts +0 -45
  520. package/auth/hooks/useEnableUser.ts +0 -50
  521. package/auth/hooks/useFetchUsers.ts +0 -80
  522. package/auth/hooks/useRechargeUser.ts +0 -82
  523. package/auth/index.ts +0 -1
  524. package/auth/invite.ts +0 -19
  525. package/auth/locale.ts +0 -84
  526. package/auth/resetAuthScopedClientState.ts +0 -27
  527. package/auth/rn/tokenManager.ts +0 -72
  528. package/auth/routes.ts +0 -173
  529. package/auth/server/accessActivity.ts +0 -144
  530. package/auth/server/adminPermissions.ts +0 -43
  531. package/auth/server/adminUsageReport.ts +0 -375
  532. package/auth/server/billingAnomalies.ts +0 -235
  533. package/auth/server/billingFullChainSimulator.ts +0 -325
  534. package/auth/server/billingUsageReport.ts +0 -231
  535. package/auth/server/cliLogin.ts +0 -198
  536. package/auth/server/creatorEarningCreditConversion.ts +0 -523
  537. package/auth/server/creatorEarningsLedger.ts +0 -165
  538. package/auth/server/creatorEarningsReport.ts +0 -299
  539. package/auth/server/creatorSettlementLedger.ts +0 -386
  540. package/auth/server/creatorSettlementReport.ts +0 -442
  541. package/auth/server/creatorSplitConfig.ts +0 -191
  542. package/auth/server/deduct.ts +0 -277
  543. package/auth/server/delete.ts +0 -895
  544. package/auth/server/disable.ts +0 -62
  545. package/auth/server/emailAutomation.ts +0 -360
  546. package/auth/server/emailAutomationConfig.ts +0 -88
  547. package/auth/server/emailAutomationRules.ts +0 -94
  548. package/auth/server/emailAutomationTemplates.ts +0 -131
  549. package/auth/server/emailAutomationTypes.ts +0 -38
  550. package/auth/server/emailDbConfig.ts +0 -149
  551. package/auth/server/emailDelivery.ts +0 -964
  552. package/auth/server/emailDeliveryGuards.ts +0 -285
  553. package/auth/server/emailPolicy.ts +0 -43
  554. package/auth/server/emailPreferences.ts +0 -119
  555. package/auth/server/emailProvider.ts +0 -277
  556. package/auth/server/emailReport.ts +0 -441
  557. package/auth/server/emailRuntimeConfig.ts +0 -86
  558. package/auth/server/emailScenarioNotifications.ts +0 -341
  559. package/auth/server/enable.ts +0 -62
  560. package/auth/server/getRechargeHistory.ts +0 -111
  561. package/auth/server/getUser.ts +0 -72
  562. package/auth/server/gptProAccess.ts +0 -44
  563. package/auth/server/inviteReward.ts +0 -298
  564. package/auth/server/inviteRewardEmail.ts +0 -1
  565. package/auth/server/ledger.ts +0 -422
  566. package/auth/server/ledgerAudit.ts +0 -424
  567. package/auth/server/ledgerWitness.ts +0 -472
  568. package/auth/server/listusers.ts +0 -156
  569. package/auth/server/locks.ts +0 -32
  570. package/auth/server/login.ts +0 -184
  571. package/auth/server/productBillingSplits.ts +0 -166
  572. package/auth/server/productEntitlements.ts +0 -142
  573. package/auth/server/productPurchase.ts +0 -390
  574. package/auth/server/providerBillingDrilldown.ts +0 -47
  575. package/auth/server/providerBillingHealth.ts +0 -71
  576. package/auth/server/providerCredentials.ts +0 -136
  577. package/auth/server/recharge.ts +0 -290
  578. package/auth/server/revenueShareLedger.ts +0 -389
  579. package/auth/server/revenueShareReport.ts +0 -258
  580. package/auth/server/revenueSplitPolicy.ts +0 -119
  581. package/auth/server/revokeSessions.ts +0 -60
  582. package/auth/server/route.ts +0 -272
  583. package/auth/server/sendEmail.ts +0 -177
  584. package/auth/server/shared.ts +0 -51
  585. package/auth/server/signup.ts +0 -430
  586. package/auth/server/signupIpQuota.ts +0 -44
  587. package/auth/server/token.ts +0 -107
  588. package/auth/server/tokenUsageBilling.ts +0 -323
  589. package/auth/server/transfer.ts +0 -40
  590. package/auth/server/usageManagementAccess.ts +0 -43
  591. package/auth/server/usageReport.ts +0 -59
  592. package/auth/server/utils.ts +0 -200
  593. package/auth/sessionTokenVersion.ts +0 -38
  594. package/auth/token.ts +0 -63
  595. package/auth/tokenCookie.ts +0 -1
  596. package/auth/types.ts +0 -40
  597. package/auth/utils.ts +0 -110
  598. package/auth/web/bootstrapAuthState.ts +0 -60
  599. package/auth/web/tokenManager.ts +0 -61
  600. package/auth/web/useRegister.ts +0 -70
  601. package/build.ts +0 -16
  602. package/buildPublish.ts +0 -135
  603. package/buildPublishArtifactAssembly.ts +0 -407
  604. package/buildPublishImportAnalysis.ts +0 -242
  605. package/chat/chat.locale.ts +0 -804
  606. package/chat/dialog/actions/addCybotAction.ts +0 -52
  607. package/chat/dialog/actions/addReferenceKeysAction.ts +0 -62
  608. package/chat/dialog/actions/builtinDialogLlm.ts +0 -35
  609. package/chat/dialog/actions/cleanupCliSession.ts +0 -40
  610. package/chat/dialog/actions/compactDialogAndForkAction.ts +0 -47
  611. package/chat/dialog/actions/createDialogAction.ts +0 -372
  612. package/chat/dialog/actions/createScheduledTaskAction.ts +0 -78
  613. package/chat/dialog/actions/handleSendMessageAction.ts +0 -197
  614. package/chat/dialog/actions/handleSendMessageResolver.ts +0 -29
  615. package/chat/dialog/actions/removeCybotAction.ts +0 -6
  616. package/chat/dialog/actions/removeDialogAgentAction.ts +0 -44
  617. package/chat/dialog/actions/replacePrimaryCybotAction.ts +0 -6
  618. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +0 -52
  619. package/chat/dialog/actions/updateDialogSummaryAction.ts +0 -405
  620. package/chat/dialog/actions/updateDialogTitleAction.ts +0 -151
  621. package/chat/dialog/actions/updateDialogTitlePolicy.ts +0 -30
  622. package/chat/dialog/actions/updateTokensAction.ts +0 -233
  623. package/chat/dialog/dialogAgents.ts +0 -54
  624. package/chat/dialog/dialogLaunchScope.ts +0 -32
  625. package/chat/dialog/dialogPageRenderMode.ts +0 -182
  626. package/chat/dialog/dialogSlice.ts +0 -872
  627. package/chat/dialog/dialogTitle.ts +0 -81
  628. package/chat/dialog/dialogTokenStats.ts +0 -12
  629. package/chat/dialog/dialogUrl.ts +0 -6
  630. package/chat/dialog/ensureDialogSpaceAction.ts +0 -208
  631. package/chat/dialog/goal.ts +0 -108
  632. package/chat/dialog/hooks/useStreamingSymbol.ts +0 -63
  633. package/chat/dialog/objectAssistantRegistry.ts +0 -286
  634. package/chat/dialog/schedule.ts +0 -17
  635. package/chat/dialog/useCreateDialog.ts +0 -52
  636. package/chat/hooks/sendPermissionResolver.ts +0 -128
  637. package/chat/hooks/useChatInput.ts +0 -130
  638. package/chat/hooks/useChatInputSeed.ts +0 -31
  639. package/chat/hooks/useMessageInteraction.ts +0 -412
  640. package/chat/hooks/useSendPermission.ts +0 -92
  641. package/chat/hooks/useThinkingVisibility.ts +0 -27
  642. package/chat/messages/browserImageUrl.ts +0 -48
  643. package/chat/messages/deleteMessages.ts +0 -47
  644. package/chat/messages/fetchAndCacheMessages.ts +0 -119
  645. package/chat/messages/fetchConvMsgs.ts +0 -51
  646. package/chat/messages/fetchMessages.ts +0 -84
  647. package/chat/messages/fileUrl.ts +0 -13
  648. package/chat/messages/generateMessageKey.ts +0 -21
  649. package/chat/messages/hooks/useBase64Migration.ts +0 -115
  650. package/chat/messages/messageAgent.ts +0 -8
  651. package/chat/messages/messageContent.ts +0 -199
  652. package/chat/messages/messageContract.ts +0 -88
  653. package/chat/messages/messageSlice.ts +0 -1195
  654. package/chat/messages/pendingAttachmentParts.ts +0 -143
  655. package/chat/messages/sendFirstMessage.ts +0 -190
  656. package/chat/messages/toolPresentation.ts +0 -212
  657. package/chat/messages/toolThunks.ts +0 -625
  658. package/chat/messages/types.ts +0 -185
  659. package/chat/messages/web/ChatDisplayContext.ts +0 -14
  660. package/chat/messages/web/ToolMessageTypes.ts +0 -23
  661. package/chat/messages/web/diffViewerModel.ts +0 -61
  662. package/chat/messages/web/groupToolEntries.ts +0 -44
  663. package/chat/messages/web/groupToolMessages.ts +0 -35
  664. package/chat/messages/web/inlineReactArtifactParser.ts +0 -63
  665. package/chat/messages/web/streamingMarkdownModel.ts +0 -41
  666. package/chat/messages/web/toolDisplayName.ts +0 -22
  667. package/chat/messages/web/useLoopStopReason.ts +0 -43
  668. package/chat/messages/web/useStreamingReveal.ts +0 -91
  669. package/chat/messages/ziweiChartDoc.ts +0 -94
  670. package/chat/web/docxToSlate.ts +0 -597
  671. package/chat/web/fileProcessor.ts +0 -442
  672. package/chat/web/hooks/useProgressiveDisplayCount.ts +0 -102
  673. package/chat/web/messageInputAgentUi.ts +0 -277
  674. package/chat/web/messageInputKeyBehavior.ts +0 -53
  675. package/chat/web/messageInputMention.ts +0 -102
  676. package/chat/web/messageInputSendResolver.ts +0 -51
  677. package/chat/web/messageSlashCommands.ts +0 -10
  678. package/chat/web/pdfOcrProcessor.ts +0 -131
  679. package/chat/web/sidebar/allViewSearch.ts +0 -87
  680. package/chat/web/sidebar/types.ts +0 -12
  681. package/chat/web/sidebar/useChatSidebarFilteredData.ts +0 -141
  682. package/chat/web/sidebar/useSidebarDragAndDrop.ts +0 -56
  683. package/cliIoTypes.ts +0 -3
  684. package/cliRuntimeDoctorReport.ts +0 -193
  685. package/client/agentRunInput.ts +0 -10
  686. package/client/agentRunLocalExecution.test.ts +0 -123
  687. package/client/agentRunLocalExecution.ts +0 -124
  688. package/client/agentRunLocalExecutor.ts +0 -179
  689. package/client/agentRunRuntimeSelection.test.ts +0 -158
  690. package/client/agentRunRuntimeSelection.ts +0 -155
  691. package/client/agentRunServerTransport.ts +0 -394
  692. package/client/agentRunTaskRunRecorder.ts +0 -176
  693. package/connector-experimental/index.ts +0 -5
  694. package/core/builtinAgents.ts +0 -202
  695. package/core/coin.ts +0 -42
  696. package/core/config.ts +0 -15
  697. package/core/crypto.ts +0 -51
  698. package/core/events/types.ts +0 -145
  699. package/core/generateKeyPairFromSeedV1.ts +0 -15
  700. package/core/generateMainKey.ts +0 -22
  701. package/core/init.ts +0 -41
  702. package/core/localOrigins.ts +0 -8
  703. package/core/password.ts +0 -13
  704. package/core/prefix.ts +0 -23
  705. package/create/editor/blockCommands.ts +0 -118
  706. package/create/editor/highlightExample.ts +0 -66
  707. package/create/editor/imageUpload.ts +0 -66
  708. package/create/editor/mark.ts +0 -15
  709. package/create/editor/plugins/normalizeChineseTypography.ts +0 -85
  710. package/create/editor/plugins/withBlockStructure.ts +0 -53
  711. package/create/editor/plugins/withChineseTypography.ts +0 -61
  712. package/create/editor/plugins/withLayout.ts +0 -30
  713. package/create/editor/plugins/withLinks.ts +0 -13
  714. package/create/editor/plugins/withMentions.ts +0 -15
  715. package/create/editor/plugins/withTables.ts +0 -52
  716. package/create/editor/tableCommands.ts +0 -270
  717. package/create/editor/theme/prism/default.ts +0 -145
  718. package/create/editor/theme/prism/githubDark.ts +0 -139
  719. package/create/editor/theme/prism/githubLight.ts +0 -139
  720. package/create/editor/theme/prism/index.ts +0 -23
  721. package/create/editor/theme/prism/okaidia.ts +0 -197
  722. package/create/editor/toolMentionOptions.ts +0 -19
  723. package/create/editor/transforms/fromMarkdown/index.ts +0 -260
  724. package/create/editor/transforms/fromMarkdown/inline.ts +0 -285
  725. package/create/editor/transforms/fromMarkdown/table.ts +0 -130
  726. package/create/editor/transforms/markdownToSlate.ts +0 -24
  727. package/create/editor/transforms/slateToRenderMarkdown.ts +0 -218
  728. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +0 -224
  729. package/create/editor/transforms/slateToText.ts +0 -33
  730. package/create/editor/types.ts +0 -120
  731. package/create/editor/utils/editorFactory.ts +0 -54
  732. package/create/editor/utils/hasPlainCodeBlock.ts +0 -39
  733. package/create/editor/utils/linkCommands.ts +0 -63
  734. package/create/editor/utils/pdfToSlate.ts +0 -706
  735. package/create/editor/utils/slateUtils.ts +0 -233
  736. package/create/editor/utils/txtToSlate.ts +0 -40
  737. package/create/hooks/category.ts +0 -82
  738. package/create/routePaths.ts +0 -5
  739. package/create/space/addSpaceAction.ts +0 -193
  740. package/create/space/category/categoryActions.ts +0 -427
  741. package/create/space/changeSpaceAction.ts +0 -36
  742. package/create/space/constants.ts +0 -8
  743. package/create/space/content/addContentAction.ts +0 -116
  744. package/create/space/content/contentThunks.ts +0 -90
  745. package/create/space/content/deleteContentFromSpaceAction.ts +0 -187
  746. package/create/space/content/deleteMultipleContentAction.ts +0 -112
  747. package/create/space/content/moveContentAction.ts +0 -285
  748. package/create/space/content/updateContentCategoryAction.ts +0 -154
  749. package/create/space/content/updateContentTitleAction.ts +0 -106
  750. package/create/space/content/uploadAndAddFileToSpaceAction.ts +0 -98
  751. package/create/space/contentKeyUtils.ts +0 -117
  752. package/create/space/contentLabels.ts +0 -56
  753. package/create/space/contentTypeMeta.ts +0 -170
  754. package/create/space/deleteSpaceAction.ts +0 -276
  755. package/create/space/fetchSpaceAction.ts +0 -70
  756. package/create/space/fetchSpaceSidebarStateAction.ts +0 -26
  757. package/create/space/hooks/agentFetchRetry.ts +0 -19
  758. package/create/space/hooks/useAgentFetcher.ts +0 -149
  759. package/create/space/hooks/useGroupedContent.ts +0 -118
  760. package/create/space/hooks/useSpaceEvents.ts +0 -43
  761. package/create/space/initialSpace.ts +0 -78
  762. package/create/space/loadDefaultSpaceAction.ts +0 -57
  763. package/create/space/member/addMemberAction.ts +0 -79
  764. package/create/space/member/fetchUserSpaceMembershipsAction.ts +0 -386
  765. package/create/space/member/memberThunks.ts +0 -47
  766. package/create/space/member/removeMemberAction.ts +0 -67
  767. package/create/space/publicCatalogSpace.ts +0 -39
  768. package/create/space/resolvePreferredSpaceId.ts +0 -113
  769. package/create/space/sidebarVisibleTypes.ts +0 -241
  770. package/create/space/space.locale.ts +0 -1053
  771. package/create/space/spaceAccess.ts +0 -182
  772. package/create/space/spaceCollapsedState.ts +0 -54
  773. package/create/space/spaceKeys.ts +0 -65
  774. package/create/space/spaceSlice.ts +0 -328
  775. package/create/space/spaceThunks.ts +0 -410
  776. package/create/space/types.ts +0 -27
  777. package/create/space/updateSpaceAction.ts +0 -107
  778. package/create/space/utils/permissions.ts +0 -47
  779. package/create/space/validateSpacePermission.ts +0 -38
  780. package/create/types.ts +0 -21
  781. package/create/version/appVersionReplication.ts +0 -160
  782. package/create/version/versionApi.ts +0 -142
  783. package/customCodingAgentFlow.ts +0 -208
  784. package/customCodingAgentRecord.ts +0 -179
  785. package/database/actions/agentReadResolution.ts +0 -27
  786. package/database/actions/cacheMergedUserData.ts +0 -64
  787. package/database/actions/common.ts +0 -279
  788. package/database/actions/deleteFile.ts +0 -40
  789. package/database/actions/fetchUserData.ts +0 -16
  790. package/database/actions/fileContent.ts +0 -125
  791. package/database/actions/patch.ts +0 -155
  792. package/database/actions/read.ts +0 -378
  793. package/database/actions/readAndWait.ts +0 -197
  794. package/database/actions/readOutcome.ts +0 -45
  795. package/database/actions/readRequestManager.ts +0 -120
  796. package/database/actions/readResolution.ts +0 -102
  797. package/database/actions/remove.ts +0 -94
  798. package/database/actions/replication.ts +0 -366
  799. package/database/actions/upload.ts +0 -174
  800. package/database/actions/upsert.ts +0 -56
  801. package/database/actions/write.ts +0 -140
  802. package/database/client/db.native.ts +0 -73
  803. package/database/client/db.ts +0 -51
  804. package/database/client/fetchUserData.ts +0 -61
  805. package/database/client/handleError.ts +0 -19
  806. package/database/client/queryRequest.ts +0 -21
  807. package/database/dbActionThunks.ts +0 -1
  808. package/database/dbSlice.ts +0 -149
  809. package/database/email.ts +0 -42
  810. package/database/fileRing.ts +0 -51
  811. package/database/fileSharding.ts +0 -70
  812. package/database/fileStorage.native.ts +0 -92
  813. package/database/fileStorage.ts +0 -232
  814. package/database/fileUrl.ts +0 -34
  815. package/database/hooks/useUserData.ts +0 -495
  816. package/database/index.ts +0 -1
  817. package/database/keys.ts +0 -765
  818. package/database/queryPrefixes.ts +0 -14
  819. package/database/requests.ts +0 -443
  820. package/database/runtimeServerContext.ts +0 -35
  821. package/database/server/MemoryDB.ts +0 -76
  822. package/database/server/actorAccess.ts +0 -76
  823. package/database/server/agentDelegation.ts +0 -125
  824. package/database/server/authorityStoreConformance.ts +0 -209
  825. package/database/server/authorityStoreTypes.ts +0 -31
  826. package/database/server/coreDataOwnership.ts +0 -13
  827. package/database/server/coreDataProxy.ts +0 -93
  828. package/database/server/cybotReadonly.ts +0 -18
  829. package/database/server/dataHandlers.ts +0 -117
  830. package/database/server/delete.ts +0 -516
  831. package/database/server/emailRepository.ts +0 -1482
  832. package/database/server/fileRead.ts +0 -337
  833. package/database/server/fileService.ts +0 -437
  834. package/database/server/handleTransaction.ts +0 -86
  835. package/database/server/legacyServerDb.ts +0 -58
  836. package/database/server/levelAuthorityStore.ts +0 -75
  837. package/database/server/memoryAuthorityStore.ts +0 -133
  838. package/database/server/patch.ts +0 -291
  839. package/database/server/query.ts +0 -178
  840. package/database/server/read.ts +0 -314
  841. package/database/server/recordIdentity.ts +0 -100
  842. package/database/server/resourceAccess.ts +0 -213
  843. package/database/server/routes.ts +0 -110
  844. package/database/server/serverStoreFactory.ts +0 -124
  845. package/database/server/spaceMemberAuthority.ts +0 -68
  846. package/database/server/storeBatchCompat.ts +0 -37
  847. package/database/server/testAuthorityStore.ts +0 -76
  848. package/database/server/upload.ts +0 -159
  849. package/database/server/write.ts +0 -492
  850. package/database/server/writeAuthority.ts +0 -133
  851. package/database/sqliteDb.ts +0 -46
  852. package/database/table/deleteTable.ts +0 -120
  853. package/database/tenantPlacement.ts +0 -57
  854. package/database/tombstones.ts +0 -52
  855. package/database/userDataLoadDecision.ts +0 -17
  856. package/database/userDataMerge.ts +0 -95
  857. package/database/userPreferenceRegister.ts +0 -108
  858. package/database/utils/dbPath.ts +0 -47
  859. package/database/utils/ulid.native.ts +0 -6
  860. package/database/utils/ulid.ts +0 -1
  861. package/dialogDataAccess.ts +0 -186
  862. package/dialogInternalCommandEntries.ts +0 -11
  863. package/dialogReadCommands.ts +0 -180
  864. package/dialogReadHelpers.ts +0 -226
  865. package/dialogStatusCommands.ts +0 -123
  866. package/docInternalCommandEntries.ts +0 -20
  867. package/hybridReadHelpers.ts +0 -109
  868. package/integrations/anthropic/anthropicModels.ts +0 -47
  869. package/integrations/anthropic/type.ts +0 -41
  870. package/integrations/deepseek/models.ts +0 -67
  871. package/integrations/google/models.ts +0 -356
  872. package/integrations/openai/chatCompletionStreamMode.ts +0 -10
  873. package/integrations/openai/filterAndCleanMessages.ts +0 -284
  874. package/integrations/openai/flexTier.ts +0 -102
  875. package/integrations/openai/generateOpenAIRequestBody.ts +0 -274
  876. package/integrations/openai/generateResponseRequestBody.ts +0 -77
  877. package/integrations/openai/models.ts +0 -271
  878. package/integrations/openai/providerBodyCompatibility.ts +0 -23
  879. package/integrations/openai/responsesHelpers.ts +0 -297
  880. package/integrations/postmark/index.ts +0 -57
  881. package/integrations/resend/index.ts +0 -353
  882. package/integrations/weather/getWeather.ts +0 -24
  883. package/integrations/weather/index.ts +0 -6
  884. package/integrations/weather/routes.ts +0 -31
  885. package/integrations/weather/weatherApi.ts +0 -27
  886. package/integrations/weather/weatherConstants.ts +0 -2
  887. package/integrations/weather/weatherI18n.ts +0 -50
  888. package/integrations/weather/weatherService.ts +0 -50
  889. package/integrations/weather/weatherTypes.ts +0 -140
  890. package/integrations/weather/weatherUtils.ts +0 -46
  891. package/integrations/x-reader/backends/localBrowser.ts +0 -215
  892. package/integrations/x-reader/backends/publicFallback.ts +0 -31
  893. package/integrations/x-reader/backends/rawCdp.ts +0 -218
  894. package/integrations/x-reader/bridge/chromeBridgeManager.ts +0 -235
  895. package/integrations/x-reader/bridge/readXPostWithBridge.ts +0 -73
  896. package/integrations/x-reader/fixtureParser.ts +0 -101
  897. package/integrations/x-reader/index.ts +0 -9
  898. package/integrations/x-reader/redaction.ts +0 -27
  899. package/integrations/x-reader/types.ts +0 -109
  900. package/integrations/x-reader/visibleTextParser.ts +0 -108
  901. package/integrations/xai/models.ts +0 -13
  902. package/machineCommandPrompts.ts +0 -79
  903. package/machineCommandResolution.ts +0 -43
  904. package/noloReadBridgePrompt.ts +0 -16
  905. package/pageCreateCommands.ts +0 -219
  906. package/pageDeleteCommands.ts +0 -167
  907. package/pageReadCommands.ts +0 -151
  908. package/pageUpdateCommands.ts +0 -249
  909. package/pageWriteHelpers.ts +0 -209
  910. package/publishPackage.ts +0 -36
  911. package/render/canvas/canvasEditContext.ts +0 -127
  912. package/render/canvas/canvasRuntime.ts +0 -57
  913. package/render/canvas/canvasSnapshotParser.ts +0 -76
  914. package/render/canvas/canvasTree.ts +0 -308
  915. package/render/canvas/types.ts +0 -46
  916. package/render/layout/deleteBehavior.ts +0 -52
  917. package/render/layout/mainLayoutSidebar.ts +0 -17
  918. package/render/layout/mainLayoutViewMode.ts +0 -81
  919. package/render/layout/topbarUtils.ts +0 -87
  920. package/render/layout/useDevReloadPending.ts +0 -30
  921. package/render/page/createPageAction.ts +0 -183
  922. package/render/page/docSlice.ts +0 -468
  923. package/render/page/server/createPage.ts +0 -176
  924. package/render/page/server/handleCreatePage.ts +0 -82
  925. package/render/page/server/index.ts +0 -4
  926. package/render/page/types.ts +0 -17
  927. package/render/page/useKeyboardSave.ts +0 -48
  928. package/render/styles/zIndex.ts +0 -12
  929. package/render/surf/WeatherIconStyles.ts +0 -17
  930. package/render/surf/color.ts +0 -9
  931. package/render/surf/config.ts +0 -46
  932. package/render/surf/screens/style.ts +0 -1
  933. package/render/surf/styles/ToggleButtonStyles.ts +0 -8
  934. package/render/surf/utils/groupedWeatherData.ts +0 -32
  935. package/render/surf/weatherUtils.ts +0 -50
  936. package/render/table/createTableAction.ts +0 -270
  937. package/render/table/deleteTableAction.ts +0 -129
  938. package/render/table/fetchAndCacheTableRows.ts +0 -174
  939. package/render/table/tableSlice.ts +0 -1106
  940. package/render/table/tableView.ts +0 -289
  941. package/render/table/toolValueUtils.ts +0 -363
  942. package/render/table/types.ts +0 -252
  943. package/render/table/useCreateTable.ts +0 -72
  944. package/render/table/useTable.ts +0 -61
  945. package/render/table/utils/tableSerialization.ts +0 -50
  946. package/render/web/elements/artifactPreviewCode.ts +0 -43
  947. package/render/web/elements/artifactRuntimePreload.ts +0 -52
  948. package/render/web/elements/codeBlockAutoPreview.ts +0 -10
  949. package/render/web/elements/mermaidPreview.ts +0 -21
  950. package/render/web/ui/useInlineEdit.ts +0 -135
  951. package/runtimeInternalCommandEntries.ts +0 -15
  952. package/runtimePassthroughCommands.ts +0 -22
  953. package/scriptPassthroughHelpers.ts +0 -28
  954. package/secretScanHelpers.ts +0 -31
  955. package/server/agentEmailRegistrationRoutes.ts +0 -29
  956. package/server/agentRunRouteContract.ts +0 -9
  957. package/server/agentRunRoutes.ts +0 -10
  958. package/server/api/methods.ts +0 -355
  959. package/server/api/tableHandlers.ts +0 -58
  960. package/server/api/types.ts +0 -27
  961. package/server/apiContract.ts +0 -88
  962. package/server/apiRouteAdapter.ts +0 -218
  963. package/server/appBundler.ts +0 -90
  964. package/server/appRoutes.ts +0 -92
  965. package/server/artifactIconsRoute.ts +0 -89
  966. package/server/artifactRuntimeRoute.ts +0 -136
  967. package/server/authenticateToken.ts +0 -118
  968. package/server/billingLedgerRoutes.ts +0 -63
  969. package/server/buildManifest.ts +0 -54
  970. package/server/cliChatRoutes.ts +0 -5
  971. package/server/cloudflareRoutes.ts +0 -35
  972. package/server/coreHeaders.ts +0 -29
  973. package/server/coreReadiness.ts +0 -48
  974. package/server/coreRoutes.ts +0 -65
  975. package/server/coreRuntime.ts +0 -98
  976. package/server/createResponse.ts +0 -68
  977. package/server/cryptoPaymentRoutes.ts +0 -8
  978. package/server/databaseRoutes.ts +0 -225
  979. package/server/desktopRuntimeRoutes.ts +0 -120
  980. package/server/devBuildInfo.ts +0 -51
  981. package/server/devReload.ts +0 -161
  982. package/server/devToolPathPolicy.ts +0 -59
  983. package/server/devToolRoutes.ts +0 -274
  984. package/server/email/cloudflareEmailProvider.ts +0 -119
  985. package/server/email/cloudflareInboundBridge.ts +0 -121
  986. package/server/email/cloudflareInboundWorker.ts +0 -28
  987. package/server/email/provider.ts +0 -149
  988. package/server/email/providerRegistry.ts +0 -22
  989. package/server/emailInboundRoutes.ts +0 -17
  990. package/server/entry.ts +0 -211
  991. package/server/handleRPCRequest.ts +0 -117
  992. package/server/handlers/activityStatsHandler.ts +0 -77
  993. package/server/handlers/agentEmailRegistrationE2EHandler.ts +0 -408
  994. package/server/handlers/agentEmailRegistrationE2ERoutes.ts +0 -6
  995. package/server/handlers/agentRun/agentLookup.ts +0 -71
  996. package/server/handlers/agentRun/autonomousRuntime.ts +0 -356
  997. package/server/handlers/agentRun/backgroundRunDialog.ts +0 -31
  998. package/server/handlers/agentRun/builtinAgents.ts +0 -271
  999. package/server/handlers/agentRun/continueDialogContext.ts +0 -102
  1000. package/server/handlers/agentRun/conversationReference.ts +0 -111
  1001. package/server/handlers/agentRun/debugContext.ts +0 -58
  1002. package/server/handlers/agentRun/dialogLookup.ts +0 -68
  1003. package/server/handlers/agentRun/foregroundStreamDialog.ts +0 -13
  1004. package/server/handlers/agentRun/index.ts +0 -2090
  1005. package/server/handlers/agentRun/localRuntimeBootstrap.ts +0 -85
  1006. package/server/handlers/agentRun/loop.ts +0 -2622
  1007. package/server/handlers/agentRun/machineConnector.ts +0 -283
  1008. package/server/handlers/agentRun/machineRunAudit.ts +0 -50
  1009. package/server/handlers/agentRun/modelUsageToolHandlers.ts +0 -371
  1010. package/server/handlers/agentRun/referenceRuntime.ts +0 -50
  1011. package/server/handlers/agentRun/requestContext.ts +0 -90
  1012. package/server/handlers/agentRun/response.ts +0 -27
  1013. package/server/handlers/agentRun/runBilling.ts +0 -108
  1014. package/server/handlers/agentRun/runDialogPreparation.ts +0 -55
  1015. package/server/handlers/agentRun/runtimeBinding.ts +0 -61
  1016. package/server/handlers/agentRun/runtimeContext.ts +0 -143
  1017. package/server/handlers/agentRun/runtimeExecutionContext.ts +0 -165
  1018. package/server/handlers/agentRun/runtimePreparation.ts +0 -195
  1019. package/server/handlers/agentRun/runtimeRouting.ts +0 -73
  1020. package/server/handlers/agentRun/runtimeSystemMessages.ts +0 -230
  1021. package/server/handlers/agentRun/saveDialog.ts +0 -1383
  1022. package/server/handlers/agentRun/syncRunDialog.ts +0 -90
  1023. package/server/handlers/agentRun/tableActivityProjection.ts +0 -132
  1024. package/server/handlers/agentRun/taskRunControlPrompt.ts +0 -122
  1025. package/server/handlers/agentRun/taskRunToolHandler.ts +0 -581
  1026. package/server/handlers/agentRun/toolExecutor.ts +0 -2873
  1027. package/server/handlers/agentRun/toolPolicyGuards.ts +0 -295
  1028. package/server/handlers/agentRun/types.ts +0 -95
  1029. package/server/handlers/agentRun/workspaceLease.ts +0 -58
  1030. package/server/handlers/alphaTestRouteGuard.ts +0 -30
  1031. package/server/handlers/apifyActorHandler.ts +0 -170
  1032. package/server/handlers/appDeployFlow.ts +0 -876
  1033. package/server/handlers/appDeployHandler.ts +0 -4
  1034. package/server/handlers/appDeployMutationHandlers.ts +0 -133
  1035. package/server/handlers/appDeployReadHandlers.ts +0 -321
  1036. package/server/handlers/appDeployShared.ts +0 -230
  1037. package/server/handlers/appDeployStatusStore.ts +0 -185
  1038. package/server/handlers/appDomainHandler.ts +0 -482
  1039. package/server/handlers/appLegacyInfraCleanup.ts +0 -10
  1040. package/server/handlers/appSandboxHandler.ts +0 -1076
  1041. package/server/handlers/appSourceReadiness.ts +0 -75
  1042. package/server/handlers/appSpaceAccess.ts +0 -186
  1043. package/server/handlers/applyEditHandler.ts +0 -544
  1044. package/server/handlers/applyLineEditsHandler.ts +0 -1058
  1045. package/server/handlers/billingLedgerAuditHandler.ts +0 -82
  1046. package/server/handlers/billingLedgerWitnessHandler.ts +0 -161
  1047. package/server/handlers/billingUsageReportHandler.ts +0 -90
  1048. package/server/handlers/browserToolHandler.ts +0 -450
  1049. package/server/handlers/cfTextToSpeechHandler.ts +0 -137
  1050. package/server/handlers/cfWhisperHandler.ts +0 -206
  1051. package/server/handlers/chatBillingSse.ts +0 -79
  1052. package/server/handlers/chatHandler.ts +0 -817
  1053. package/server/handlers/chatProxyRouting.ts +0 -404
  1054. package/server/handlers/chatUpstreamRetry.ts +0 -385
  1055. package/server/handlers/checkEnvHandler.ts +0 -250
  1056. package/server/handlers/cliChatHandler.ts +0 -266
  1057. package/server/handlers/cloudflareBrowserHandler.ts +0 -275
  1058. package/server/handlers/cloudflareCrawlHandler.ts +0 -260
  1059. package/server/handlers/codeSearchHandler.ts +0 -484
  1060. package/server/handlers/connector/connectorConnectionRegistry.ts +0 -240
  1061. package/server/handlers/connector/connectorWebSocket.ts +0 -121
  1062. package/server/handlers/creatorEarningsReportHandler.ts +0 -97
  1063. package/server/handlers/creatorSettlementReportHandler.ts +0 -98
  1064. package/server/handlers/deepseekOcrHandler.ts +0 -114
  1065. package/server/handlers/deleteMemoryHandler.ts +0 -115
  1066. package/server/handlers/desktopAgentRuntimeAdapter.ts +0 -307
  1067. package/server/handlers/desktopAgentRuntimeHostCapabilities.ts +0 -25
  1068. package/server/handlers/desktopAgentRuntimeReadiness.ts +0 -62
  1069. package/server/handlers/desktopAgentRuntimeStatusHandler.ts +0 -62
  1070. package/server/handlers/desktopAgentRuntimeTurnHandler.ts +0 -169
  1071. package/server/handlers/desktopAgentRuntimeTurnService.ts +0 -346
  1072. package/server/handlers/desktopClipboardHandler.ts +0 -104
  1073. package/server/handlers/desktopFiles/handler.ts +0 -159
  1074. package/server/handlers/desktopFiles/operations.ts +0 -202
  1075. package/server/handlers/desktopFiles/sandbox.ts +0 -62
  1076. package/server/handlers/desktopFiles/store.ts +0 -81
  1077. package/server/handlers/desktopLlamaRuntimeHandler.ts +0 -394
  1078. package/server/handlers/desktopLocalConnectorHandler.ts +0 -101
  1079. package/server/handlers/desktopUpdaterHandler.ts +0 -240
  1080. package/server/handlers/dialogEvents.ts +0 -10
  1081. package/server/handlers/emailInboundHandler.ts +0 -65
  1082. package/server/handlers/eventBus.ts +0 -160
  1083. package/server/handlers/exaSearchHandler.ts +0 -73
  1084. package/server/handlers/execShellHandler.ts +0 -661
  1085. package/server/handlers/favoriteHandlers.ts +0 -423
  1086. package/server/handlers/fetchWebpageHandler.ts +0 -117
  1087. package/server/handlers/fileOutlineHandler.ts +0 -107
  1088. package/server/handlers/geminiImagePreviewHandler.ts +0 -612
  1089. package/server/handlers/getDialogBillingHandler.ts +0 -152
  1090. package/server/handlers/getTransactionsHandler.ts +0 -110
  1091. package/server/handlers/googleNativeChat.ts +0 -572
  1092. package/server/handlers/listFilesHandler.ts +0 -139
  1093. package/server/handlers/machines/machineAuth.ts +0 -149
  1094. package/server/handlers/machines/machineBinding.ts +0 -60
  1095. package/server/handlers/machines/machineHandlers.ts +0 -265
  1096. package/server/handlers/machines/machineInstallAssets.ts +0 -565
  1097. package/server/handlers/machines/machineRegistry.ts +0 -89
  1098. package/server/handlers/notificationEmitter.ts +0 -191
  1099. package/server/handlers/notificationsHandler.ts +0 -94
  1100. package/server/handlers/olmOcrHandler.ts +0 -115
  1101. package/server/handlers/openaiImageHandler.ts +0 -500
  1102. package/server/handlers/providerCallsRecentHandler.ts +0 -234
  1103. package/server/handlers/providerHealthHandler.ts +0 -36
  1104. package/server/handlers/providerReconciliationRunHandler.ts +0 -180
  1105. package/server/handlers/providerRequestIdsHandler.ts +0 -105
  1106. package/server/handlers/publicHandler.ts +0 -209
  1107. package/server/handlers/readFileHandler.ts +0 -300
  1108. package/server/handlers/readXPostHandler.ts +0 -180
  1109. package/server/handlers/rememberMemoryHandler.ts +0 -69
  1110. package/server/handlers/remotionRenderHandler.ts +0 -236
  1111. package/server/handlers/renderMarkdownHandler.ts +0 -66
  1112. package/server/handlers/revenueShareReportHandler.ts +0 -96
  1113. package/server/handlers/searchRepoHandler.ts +0 -159
  1114. package/server/handlers/tableAccess.ts +0 -38
  1115. package/server/handlers/tableToolHandlers.ts +0 -755
  1116. package/server/handlers/typecheckWorker.ts +0 -54
  1117. package/server/handlers/userEvents.ts +0 -6
  1118. package/server/handlers/userSecretsHandler.ts +0 -221
  1119. package/server/handlers/versionHandler.ts +0 -286
  1120. package/server/handlers/versionStore.ts +0 -184
  1121. package/server/handlers/wereadGatewayHandler.ts +0 -48
  1122. package/server/handlers/whisperHandler.ts +0 -158
  1123. package/server/handlers/writeFileHandler.ts +0 -168
  1124. package/server/html/desktopReleaseManifest.server.ts +0 -17
  1125. package/server/html/generateErrorResponse.ts +0 -22
  1126. package/server/html/serializeState.ts +0 -9
  1127. package/server/html/ssrPreload.ts +0 -249
  1128. package/server/html/template.ts +0 -275
  1129. package/server/httpCompression.ts +0 -102
  1130. package/server/index.ts +0 -0
  1131. package/server/liveReloadScript.ts +0 -105
  1132. package/server/luIconNames.ts +0 -14
  1133. package/server/machineRoutes.ts +0 -44
  1134. package/server/mediaRoutes.ts +0 -25
  1135. package/server/memoryRoutes.ts +0 -14
  1136. package/server/normalizedStatusRoutes.ts +0 -23
  1137. package/server/payments/crypto/cryptoUsdcBaseAddressPool.ts +0 -49
  1138. package/server/payments/crypto/cryptoUsdcBaseConfig.ts +0 -120
  1139. package/server/payments/crypto/cryptoUsdcBasePaymentProvider.ts +0 -137
  1140. package/server/payments/crypto/cryptoUsdcBaseScanner.ts +0 -272
  1141. package/server/payments/crypto/cryptoUsdcBaseWatcher.ts +0 -40
  1142. package/server/payments/crypto/cryptoUsdtTronAddressPool.ts +0 -49
  1143. package/server/payments/crypto/cryptoUsdtTronConfig.ts +0 -120
  1144. package/server/payments/crypto/cryptoUsdtTronPaymentProvider.ts +0 -135
  1145. package/server/payments/crypto/cryptoUsdtTronScanner.ts +0 -315
  1146. package/server/payments/crypto/cryptoUsdtTronWatcher.ts +0 -40
  1147. package/server/payments/paymentProvider.ts +0 -6
  1148. package/server/payments/paymentRoutes.ts +0 -27
  1149. package/server/payments/rechargeCredits.ts +0 -69
  1150. package/server/payments/waffo/waffoPaymentProvider.ts +0 -344
  1151. package/server/preview/previewCapability.ts +0 -90
  1152. package/server/preview/previewConfig.ts +0 -54
  1153. package/server/preview/previewGateway.ts +0 -71
  1154. package/server/preview/previewRealtime.ts +0 -33
  1155. package/server/providerHealthProbe.ts +0 -198
  1156. package/server/providerHealthRoutes.ts +0 -19
  1157. package/server/publicPaths.ts +0 -12
  1158. package/server/publicRequestHandler.ts +0 -15
  1159. package/server/reactAppBuilder.ts +0 -416
  1160. package/server/realtimeRoutes.ts +0 -69
  1161. package/server/renderStream.ts +0 -20
  1162. package/server/routeFactory.ts +0 -45
  1163. package/server/routes.ts +0 -125
  1164. package/server/runtimeRole.ts +0 -15
  1165. package/server/safeTempFile.ts +0 -48
  1166. package/server/scheduler/scheduledTaskRuntime.ts +0 -230
  1167. package/server/scheduler/schedulerService.ts +0 -290
  1168. package/server/serverDrain.ts +0 -129
  1169. package/server/services/browserSessionManager.ts +0 -354
  1170. package/server/shareRoutes.ts +0 -86
  1171. package/server/sqliteRoutes.ts +0 -141
  1172. package/server/taskRunBridgeRoutes.ts +0 -98
  1173. package/server/tasks.ts +0 -113
  1174. package/server/waffoPaymentRoutes.ts +0 -5
  1175. package/server/webUtilityRoutes.ts +0 -50
  1176. package/server/workerValidator.ts +0 -224
  1177. package/share/action.ts +0 -225
  1178. package/share/clientTableReplication.ts +0 -160
  1179. package/share/helpers.ts +0 -302
  1180. package/share/keys.ts +0 -243
  1181. package/share/link.ts +0 -40
  1182. package/share/loadOwnerShares.ts +0 -154
  1183. package/share/paidAccess.ts +0 -32
  1184. package/share/publicSharePolicy.ts +0 -27
  1185. package/share/server/fetchCommunityShares.ts +0 -45
  1186. package/share/server/helpers.ts +0 -204
  1187. package/share/server/importShare.ts +0 -144
  1188. package/share/server/listCommunityShares.ts +0 -167
  1189. package/share/server/purchaseDoc.ts +0 -216
  1190. package/share/server/readCommunityShareCover.ts +0 -74
  1191. package/share/server/readSharedTable.ts +0 -140
  1192. package/share/server/tableReplication.ts +0 -354
  1193. package/share/shareSlice.ts +0 -53
  1194. package/share/tableShareState.ts +0 -74
  1195. package/share/types.ts +0 -100
  1196. package/spaceAttachCommands.ts +0 -135
  1197. package/spaceCategoryCommands.ts +0 -263
  1198. package/spaceCommands.ts +0 -295
  1199. package/spaceDeleteCommands.ts +0 -312
  1200. package/spaceInternalCommandEntries.ts +0 -21
  1201. package/spaceMutationHelpers.ts +0 -135
  1202. package/spaceReadCommands.ts +0 -323
  1203. package/tableDataOutput.ts +0 -41
  1204. package/tableDataSafety.ts +0 -26
  1205. package/tableMetaCommands.ts +0 -307
  1206. package/tableMutationCommands.ts +0 -266
  1207. package/tableQueryParsing.ts +0 -90
  1208. package/tableQueryRequest.ts +0 -53
  1209. package/taskRunParsing.ts +0 -86
  1210. package/taskRunPromptShared.ts +0 -55
  1211. package/tui/tuiCatalog.ts +0 -22
  1212. package/tui/tuiCommandInterpreter.test.ts +0 -169
  1213. package/tui/tuiCommandInterpreter.ts +0 -253
  1214. package/tui/tuiPresentation.test.ts +0 -154
  1215. package/tui/tuiPresentation.ts +0 -146
@@ -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
- }