nolo-cli 0.1.40 → 0.1.42

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 (482) hide show
  1. package/README.md +27 -12
  2. package/agent-runtime/agentThread.ts +222 -0
  3. package/agent-runtime/agentThreadAdmission.ts +74 -0
  4. package/agent-runtime/dialogWritePlan.ts +42 -0
  5. package/agent-runtime/hostAdapter.ts +1 -0
  6. package/agent-runtime/hybridRecordStore.ts +5 -3
  7. package/agent-runtime/index.ts +43 -0
  8. package/agent-runtime/localLoop.ts +31 -2
  9. package/agent-runtime/localToolPolicy.ts +1 -0
  10. package/agent-runtime/localWorkspaceTools.ts +1258 -78
  11. package/agent-runtime/noloWorkspaceTools.ts +20 -1
  12. package/agent-runtime/runtimeToolPolicy.ts +1 -5
  13. package/agent-runtime/runtimeToolSurface.ts +1 -0
  14. package/agentAliases.ts +29 -9
  15. package/agentInternalCommandEntries.ts +11 -3
  16. package/agentMachineCommands.ts +1 -0
  17. package/agentRecordCommands.ts +2 -2
  18. package/agentRecordHelpers.ts +59 -6
  19. package/agentRunCommand.ts +84 -19
  20. package/ai/agent/_executeModel.ts +146 -0
  21. package/ai/agent/agentSlice.ts +556 -1
  22. package/ai/agent/appWorkingMemory.ts +126 -0
  23. package/ai/agent/buildEditingContext.ts +378 -0
  24. package/ai/agent/buildSystemPrompt.ts +599 -0
  25. package/ai/agent/canvasEditingContext.ts +49 -0
  26. package/ai/agent/cleanAgentMessages.ts +140 -0
  27. package/ai/agent/cliChatClient.ts +153 -0
  28. package/ai/agent/cliExecutor.ts +264 -46
  29. package/ai/agent/contextCompiler.ts +107 -0
  30. package/ai/agent/contextLayerContract.ts +44 -0
  31. package/ai/agent/createAgentSchema.ts +272 -0
  32. package/ai/agent/currentTimeContext.ts +65 -0
  33. package/ai/agent/executeToolCall.ts +58 -0
  34. package/ai/agent/fetchAgentContexts.ts +42 -0
  35. package/ai/agent/generatePrompt.ts +3 -0
  36. package/ai/agent/getFullChatContextKeys.ts +168 -0
  37. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  38. package/ai/agent/guidedCreation/types.ts +38 -0
  39. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  40. package/ai/agent/liveAudioModel.ts +2 -0
  41. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  42. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  43. package/ai/agent/planSlice.ts +259 -0
  44. package/ai/agent/referenceUtils.ts +229 -0
  45. package/ai/agent/runAgentBackground.ts +310 -0
  46. package/ai/agent/runAgentClientLoop.ts +164 -0
  47. package/ai/agent/runtimeGuidance.ts +116 -0
  48. package/ai/agent/serverOrigin.ts +7 -0
  49. package/ai/agent/startParallelAgentStreams.ts +424 -0
  50. package/ai/agent/startupProtocol.ts +53 -0
  51. package/ai/agent/streamAgentChatTurn.ts +2135 -0
  52. package/ai/agent/streamAgentChatTurnUtils.ts +923 -0
  53. package/ai/agent/toolFailureGuard.ts +99 -0
  54. package/ai/agent/types.ts +73 -0
  55. package/ai/agent/utils/imageOutput.ts +37 -0
  56. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  57. package/ai/ai.locale.ts +1165 -0
  58. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  59. package/ai/chat/fetchUtils.ts +143 -0
  60. package/ai/chat/inlineImageUrlsForCustomProvider.ts +122 -0
  61. package/ai/chat/parseApiError.ts +67 -0
  62. package/ai/chat/parseMultilineSSE.ts +95 -0
  63. package/ai/chat/sendOpenAICompletionsRequest.ts +921 -0
  64. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  65. package/ai/chat/serverProxyRetry.ts +102 -0
  66. package/ai/chat/shouldUseServerProxy.ts +18 -0
  67. package/ai/chat/streamRetry.ts +46 -0
  68. package/ai/chat/updateTotalUsage.ts +89 -0
  69. package/ai/context/buildReferenceContext.ts +437 -0
  70. package/ai/context/retention.ts +165 -0
  71. package/ai/context/tokenUtils.ts +78 -0
  72. package/ai/llm/agentCapabilities.ts +74 -0
  73. package/ai/llm/deepinfra.ts +79 -0
  74. package/ai/llm/fireworks.ts +68 -0
  75. package/ai/llm/generateRequestBody.ts +165 -0
  76. package/ai/llm/getModelContextWindow.ts +93 -0
  77. package/ai/llm/getPricing.ts +252 -0
  78. package/ai/llm/imagePricing.ts +66 -0
  79. package/ai/llm/isResponseAPIModel.ts +13 -0
  80. package/ai/llm/kimi.ts +22 -0
  81. package/ai/llm/mimo.ts +99 -0
  82. package/ai/llm/mistral.ts +21 -0
  83. package/ai/llm/models.ts +45 -0
  84. package/ai/llm/openrouterModels.ts +31 -0
  85. package/ai/llm/providers.ts +313 -0
  86. package/ai/llm/reasoningModels.ts +27 -0
  87. package/ai/llm/types.ts +82 -0
  88. package/ai/llm/usageRequestOptions.ts +59 -0
  89. package/ai/memory/policy.ts +49 -0
  90. package/ai/memory/queryShared.ts +167 -0
  91. package/ai/memory/recentRelationshipRecap.ts +251 -0
  92. package/ai/memory/remember.ts +111 -0
  93. package/ai/memory/scope.ts +74 -0
  94. package/ai/memory/store.ts +20 -0
  95. package/ai/memory/storeShared.ts +76 -0
  96. package/ai/memory/types.ts +52 -0
  97. package/ai/memory/understanding.ts +341 -0
  98. package/ai/memory/understandingGreeting.ts +264 -0
  99. package/ai/policy/personalizationDialog.ts +333 -0
  100. package/ai/policy/runtimePolicy.ts +526 -0
  101. package/ai/policy/selfUpdateFields.ts +48 -0
  102. package/ai/policy/types.ts +64 -0
  103. package/ai/skills/referenceRuntime.ts +274 -0
  104. package/ai/skills/skillDiagnostics.ts +251 -0
  105. package/ai/skills/skillDocBuilder.ts +139 -0
  106. package/ai/skills/skillSummaryMarker.ts +26 -0
  107. package/ai/token/calculatePrice.ts +576 -0
  108. package/ai/token/missingUsageEstimate.ts +42 -0
  109. package/ai/token/normalizeUsage.ts +124 -0
  110. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  111. package/ai/token/prepareTokenUsageData.ts +93 -0
  112. package/ai/token/resolveBillingTarget.ts +52 -0
  113. package/ai/token/saveTokenRecord.ts +53 -0
  114. package/ai/token/types.ts +103 -0
  115. package/ai/tools/agent/agentTools.ts +214 -0
  116. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  117. package/ai/tools/agent/callAgentTool.ts +139 -0
  118. package/ai/tools/agent/createAgentTool.ts +512 -0
  119. package/ai/tools/agent/createDialogTool.ts +69 -0
  120. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  121. package/ai/tools/agent/parallelBudget.ts +221 -0
  122. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  123. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  124. package/ai/tools/agent/runLlmTool.ts +96 -0
  125. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  126. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  127. package/ai/tools/agent/startAgentDialogTool.ts +54 -0
  128. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  129. package/ai/tools/agent/updateAgentTool.ts +96 -0
  130. package/ai/tools/agent/updateSelfTool.ts +113 -0
  131. package/ai/tools/amazonProductScraperTool.ts +86 -0
  132. package/ai/tools/apifyActorClient.ts +45 -0
  133. package/ai/tools/appEditGuard.ts +372 -0
  134. package/ai/tools/appReadSnapshot.ts +153 -0
  135. package/ai/tools/appTools.ts +1549 -0
  136. package/ai/tools/applyEditTool.ts +259 -0
  137. package/ai/tools/applyLineEditsTool.ts +315 -0
  138. package/ai/tools/browserTools/click.ts +33 -0
  139. package/ai/tools/browserTools/closeSession.ts +29 -0
  140. package/ai/tools/browserTools/common.ts +27 -0
  141. package/ai/tools/browserTools/openSession.ts +48 -0
  142. package/ai/tools/browserTools/readContent.ts +38 -0
  143. package/ai/tools/browserTools/selectOption.ts +46 -0
  144. package/ai/tools/browserTools/typeText.ts +42 -0
  145. package/ai/tools/category/createCategoryTool.ts +66 -0
  146. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  147. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  148. package/ai/tools/cfBrowserTools.ts +319 -0
  149. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  150. package/ai/tools/checkEnvTool.ts +102 -0
  151. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  152. package/ai/tools/codeSearchTool.ts +123 -0
  153. package/ai/tools/codeTools.ts +101 -0
  154. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  155. package/ai/tools/createDocTool.ts +132 -0
  156. package/ai/tools/createSkillDocTool.ts +155 -0
  157. package/ai/tools/createWorkflowTool.ts +154 -0
  158. package/ai/tools/delayTool.ts +31 -0
  159. package/ai/tools/deleteSpacesTool.ts +325 -0
  160. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  161. package/ai/tools/devReloadUtils.ts +29 -0
  162. package/ai/tools/dialogMessageSearch.ts +137 -0
  163. package/ai/tools/doctorSkillTool.ts +72 -0
  164. package/ai/tools/ecommerceScraperTool.ts +86 -0
  165. package/ai/tools/emailTools.ts +549 -0
  166. package/ai/tools/evalSkillTool.ts +92 -0
  167. package/ai/tools/exaSearchTool.ts +63 -0
  168. package/ai/tools/execShellTool.ts +266 -0
  169. package/ai/tools/executeSqlTool.ts +192 -0
  170. package/ai/tools/fetchWebpageSupport.ts +333 -0
  171. package/ai/tools/fetchWebpageTool.ts +97 -0
  172. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  173. package/ai/tools/generateDocxTool.ts +215 -0
  174. package/ai/tools/googleSearchScraperTool.ts +106 -0
  175. package/ai/tools/importDataTool.ts +133 -0
  176. package/ai/tools/importSkillTool.ts +162 -0
  177. package/ai/tools/index.ts +2290 -0
  178. package/ai/tools/jdProductScraperTool.ts +821 -0
  179. package/ai/tools/listUserSpacesTool.ts +113 -0
  180. package/ai/tools/localFilesTool.ts +276 -0
  181. package/ai/tools/marxistsOfflineBook.ts +253 -0
  182. package/ai/tools/modelUsageTools.ts +206 -0
  183. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  184. package/ai/tools/olmOcrTool.ts +33 -0
  185. package/ai/tools/openaiImageTool.ts +267 -0
  186. package/ai/tools/prepareTools.ts +193 -0
  187. package/ai/tools/readDocTool.ts +88 -0
  188. package/ai/tools/readFileTool.ts +214 -0
  189. package/ai/tools/readTool.ts +194 -0
  190. package/ai/tools/readXPostTool.ts +229 -0
  191. package/ai/tools/readXhsProfileTool.ts +638 -0
  192. package/ai/tools/rememberMemoryTool.ts +84 -0
  193. package/ai/tools/remotionVideoTool.ts +151 -0
  194. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  195. package/ai/tools/searchWorkspaceTool.ts +259 -0
  196. package/ai/tools/skillFollowup.ts +86 -0
  197. package/ai/tools/surfWeatherTool.ts +169 -0
  198. package/ai/tools/table/addTableRowTool.ts +217 -0
  199. package/ai/tools/table/createTableTool.ts +326 -0
  200. package/ai/tools/table/rowTools.ts +386 -0
  201. package/ai/tools/table/schemaTools.ts +244 -0
  202. package/ai/tools/table/shareTableTool.ts +148 -0
  203. package/ai/tools/table/toolShared.ts +129 -0
  204. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  205. package/ai/tools/toolApiClient.ts +279 -0
  206. package/ai/tools/toolPacks.ts +19 -0
  207. package/ai/tools/toolResultError.ts +42 -0
  208. package/ai/tools/toolRunSlice.ts +303 -0
  209. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  210. package/ai/tools/uiAskChoiceTool.ts +104 -0
  211. package/ai/tools/updateContentTitleTool.ts +84 -0
  212. package/ai/tools/updateDocTool.ts +105 -0
  213. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  214. package/ai/tools/wereadGatewayTool.ts +152 -0
  215. package/ai/tools/whisperTool.ts +76 -0
  216. package/ai/tools/writeFileTool.ts +213 -0
  217. package/ai/tools/youtubeScraperTool.ts +116 -0
  218. package/ai/tools/ziweiChartTool.ts +678 -0
  219. package/ai/types.ts +58 -0
  220. package/ai/workflow/workflowExecutor.ts +323 -0
  221. package/ai/workflow/workflowSlice.ts +73 -0
  222. package/ai/workflow/workflowTypes.ts +106 -0
  223. package/app/actions/syncAppRecord.ts +73 -0
  224. package/app/constants/animationSets.ts +21 -0
  225. package/app/constants/appEditor.ts +99 -0
  226. package/app/favorite/deletedFavoriteProjection.ts +31 -0
  227. package/app/favorite/favoriteSlice.ts +690 -0
  228. package/app/favorite/type.ts +43 -0
  229. package/app/hooks/deleteDbKey.ts +254 -0
  230. package/app/i18n/client.ts +13 -0
  231. package/app/i18n/i18n.base.ts +14 -0
  232. package/app/i18n/i18n.config.ts +77 -0
  233. package/app/i18n/index.ts +15 -0
  234. package/app/i18n/mapLanguage.ts +11 -0
  235. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  236. package/app/i18n/translations/error.locale.ts +246 -0
  237. package/app/i18n/translations/interface.locale.ts +2206 -0
  238. package/app/i18n/translations/pricing.locale.ts +397 -0
  239. package/app/i18n/translations/privacy.locale.ts +168 -0
  240. package/app/i18n/translations/seo.locale.ts +129 -0
  241. package/app/i18n/translations/terms.locale.ts +124 -0
  242. package/app/i18n/types.ts +6 -0
  243. package/app/notifications/model.ts +77 -0
  244. package/app/notifications/notificationSlice.ts +141 -0
  245. package/app/reducer.ts +36 -0
  246. package/app/settings/dbActionThunks.ts +34 -0
  247. package/app/settings/defaultSpacePreference.ts +87 -0
  248. package/app/settings/settingSlice.tsx +1212 -0
  249. package/app/settings/settingsRecord.ts +8 -0
  250. package/app/stateViews/runtime.ts +90 -0
  251. package/app/store.ts +55 -0
  252. package/app/theme/colors.ts +280 -0
  253. package/app/theme/fontPreference.ts +77 -0
  254. package/app/theme/theme.config.ts +120 -0
  255. package/app/theme/themeModeBootstrap.ts +123 -0
  256. package/app/types/appSummary.ts +118 -0
  257. package/app/types.ts +358 -0
  258. package/app/utils/appKeys.ts +55 -0
  259. package/app/utils/async.ts +28 -0
  260. package/app/utils/desktopAgentRuntimeTurnClient.ts +75 -0
  261. package/app/utils/env.ts +17 -0
  262. package/app/utils/fileUtils.ts +229 -0
  263. package/app/utils/imageUtils.ts +274 -0
  264. package/app/utils/myContentItems.ts +289 -0
  265. package/app/utils/retryAfter.ts +36 -0
  266. package/app/utils/retryFetch.ts +61 -0
  267. package/app/utils/toast.ts +3 -0
  268. package/auth/action/signUpAction.ts +227 -0
  269. package/auth/adminPermissions.ts +78 -0
  270. package/auth/authSlice.ts +531 -0
  271. package/auth/client/loginRequest.ts +14 -0
  272. package/auth/resetAuthScopedClientState.ts +27 -0
  273. package/auth/routes.ts +183 -0
  274. package/auth/token.ts +63 -0
  275. package/auth/types.ts +40 -0
  276. package/chat/chat.locale.ts +817 -0
  277. package/chat/dialog/actions/addCybotAction.ts +52 -0
  278. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  279. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  280. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  281. package/chat/dialog/actions/createDialogAction.ts +379 -0
  282. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  283. package/chat/dialog/actions/handleSendMessageAction.ts +202 -0
  284. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  285. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  286. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  287. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  288. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  289. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  290. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  291. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  292. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  293. package/chat/dialog/dialogAgents.ts +72 -0
  294. package/chat/dialog/dialogAttachmentCleanup.ts +135 -0
  295. package/chat/dialog/dialogSlice.ts +985 -0
  296. package/chat/dialog/dialogTitle.ts +81 -0
  297. package/chat/dialog/dialogTokenStats.ts +12 -0
  298. package/chat/dialog/dialogUrl.ts +6 -0
  299. package/chat/dialog/goal.ts +108 -0
  300. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  301. package/chat/dialog/schedule.ts +17 -0
  302. package/chat/messages/activityCompletion.ts +97 -0
  303. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  304. package/chat/messages/fetchConvMsgs.ts +51 -0
  305. package/chat/messages/fileUrl.ts +13 -0
  306. package/chat/messages/imagePayloadPersistence.ts +22 -0
  307. package/chat/messages/messageAgent.ts +8 -0
  308. package/chat/messages/messageContent.ts +203 -0
  309. package/chat/messages/messageContract.ts +88 -0
  310. package/chat/messages/messageSlice.ts +1386 -0
  311. package/chat/messages/toolThunks.ts +646 -0
  312. package/chat/messages/types.ts +8 -1
  313. package/chat/messages/web/toolDisplayName.ts +686 -0
  314. package/cli/agentAliases.ts +29 -9
  315. package/cli/agentInternalCommandEntries.ts +11 -3
  316. package/cli/agentMachineCommands.ts +1 -0
  317. package/cli/agentRecordCommands.ts +2 -2
  318. package/cli/agentRecordHelpers.ts +59 -6
  319. package/cli/agentRunCommand.ts +84 -19
  320. package/cli/client/agentRun.ts +92 -261
  321. package/cli/client/localRuntimeAdapter.ts +292 -50
  322. package/cli/commandRegistry.ts +7 -4
  323. package/cli/dialogAttachmentCleanup.ts +151 -0
  324. package/cli/dialogCommands.ts +163 -61
  325. package/cli/dialogInternalCommandEntries.ts +1 -1
  326. package/cli/docCreateCommands.ts +345 -0
  327. package/cli/docInternalCommandEntries.ts +11 -0
  328. package/cli/docPageHelpers.ts +80 -0
  329. package/cli/docSkillHelpers.ts +67 -0
  330. package/cli/docSpaceHelpers.ts +46 -0
  331. package/cli/internalCommandEntries.ts +4 -0
  332. package/cli/machineCommands.ts +18 -34
  333. package/cli/memoryCommands.ts +253 -0
  334. package/cli/memoryInternalCommandEntries.ts +9 -0
  335. package/cli/qoderUsageProbe.ts +252 -0
  336. package/cli/scriptCommandEntries.ts +0 -3
  337. package/cli/secretScan.ts +31 -0
  338. package/cli/tableCommands.ts +248 -13
  339. package/cli/workflowInternalCommandEntries.ts +2 -3
  340. package/client/agentRun.test.ts +119 -83
  341. package/client/agentRun.ts +92 -261
  342. package/client/localRuntimeAdapter.test.ts +894 -32
  343. package/client/localRuntimeAdapter.ts +292 -50
  344. package/commandRegistry.ts +7 -4
  345. package/connector-experimental/capabilities.ts +10 -9
  346. package/core/builtinAgents.ts +209 -0
  347. package/core/config.ts +15 -0
  348. package/core/crypto.ts +51 -0
  349. package/core/generateKeyPairFromSeedV1.ts +15 -0
  350. package/core/generateMainKey.ts +22 -0
  351. package/core/init.ts +41 -0
  352. package/core/localOrigins.ts +8 -0
  353. package/core/password.ts +13 -0
  354. package/core/prefix.ts +23 -0
  355. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  356. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  357. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  358. package/create/editor/transforms/markdownToSlate.ts +24 -0
  359. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  360. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  361. package/create/editor/transforms/slateToText.ts +33 -0
  362. package/create/editor/utils/slateUtils.ts +233 -0
  363. package/create/space/addSpaceAction.ts +193 -0
  364. package/create/space/category/categoryActions.ts +427 -0
  365. package/create/space/changeSpaceAction.ts +36 -0
  366. package/create/space/constants.ts +8 -0
  367. package/create/space/content/addContentAction.ts +116 -0
  368. package/create/space/content/contentThunks.ts +90 -0
  369. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  370. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  371. package/create/space/content/moveContentAction.ts +285 -0
  372. package/create/space/content/updateContentCategoryAction.ts +154 -0
  373. package/create/space/content/updateContentTitleAction.ts +151 -0
  374. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  375. package/create/space/contentKeyUtils.ts +117 -0
  376. package/create/space/deleteSpaceAction.ts +276 -0
  377. package/create/space/fetchSpaceAction.ts +70 -0
  378. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  379. package/create/space/loadDefaultSpaceAction.ts +57 -0
  380. package/create/space/member/addMemberAction.ts +79 -0
  381. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  382. package/create/space/member/memberThunks.ts +47 -0
  383. package/create/space/member/removeMemberAction.ts +67 -0
  384. package/create/space/resolvePreferredSpaceId.ts +113 -0
  385. package/create/space/sidebarVisibleTypes.ts +260 -0
  386. package/create/space/space.locale.ts +1087 -0
  387. package/create/space/spaceAccess.ts +182 -0
  388. package/create/space/spaceCollapsedState.ts +54 -0
  389. package/create/space/spaceKeys.ts +65 -0
  390. package/create/space/spaceSlice.ts +328 -0
  391. package/create/space/spaceThunks.ts +410 -0
  392. package/create/space/types.ts +27 -0
  393. package/create/space/updateSpaceAction.ts +107 -0
  394. package/create/space/utils/permissions.ts +47 -0
  395. package/create/types.ts +21 -0
  396. package/database/actions/agentReadResolution.ts +33 -0
  397. package/database/actions/common.ts +243 -0
  398. package/database/actions/deleteFile.ts +40 -0
  399. package/database/actions/fileContent.ts +125 -0
  400. package/database/actions/patch.ts +155 -0
  401. package/database/actions/read.ts +358 -0
  402. package/database/actions/readAndWait.ts +260 -0
  403. package/database/actions/readRequestManager.ts +120 -0
  404. package/database/actions/readResolution.ts +125 -0
  405. package/database/actions/remove.ts +94 -0
  406. package/database/actions/replication.ts +477 -0
  407. package/database/actions/upload.ts +186 -0
  408. package/database/actions/upsert.ts +56 -0
  409. package/database/actions/write.ts +146 -0
  410. package/database/authority/ownerKey.ts +80 -0
  411. package/database/authority/recordAuthority.ts +67 -0
  412. package/database/authority/userAuthorityRegistry.ts +54 -0
  413. package/database/client/fetchUserData.ts +61 -0
  414. package/database/dbActionThunks.ts +1 -0
  415. package/database/dbSlice.ts +149 -0
  416. package/database/fileRing.ts +51 -0
  417. package/database/fileStorage.ts +232 -0
  418. package/database/fileUrl.ts +34 -0
  419. package/database/keys.ts +767 -0
  420. package/database/queryPrefixes.ts +14 -0
  421. package/database/requests.ts +443 -0
  422. package/database/runtimeServerContext.ts +54 -0
  423. package/database/tenantPlacement.ts +57 -0
  424. package/database/userPreferenceRegister.ts +131 -0
  425. package/database/utils/ulid.ts +1 -0
  426. package/dialogAttachmentCleanup.ts +151 -0
  427. package/dialogCommands.ts +163 -61
  428. package/dialogInternalCommandEntries.ts +1 -1
  429. package/docCreateCommands.ts +345 -0
  430. package/docInternalCommandEntries.ts +11 -0
  431. package/docPageHelpers.ts +80 -0
  432. package/docSkillHelpers.ts +67 -0
  433. package/docSpaceHelpers.ts +46 -0
  434. package/integrations/anthropic/anthropicModels.ts +47 -0
  435. package/integrations/deepseek/models.ts +37 -0
  436. package/integrations/google/models.ts +341 -0
  437. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  438. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  439. package/integrations/openai/flexTier.ts +102 -0
  440. package/integrations/openai/generateOpenAIRequestBody.ts +271 -0
  441. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  442. package/integrations/openai/models.ts +271 -0
  443. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  444. package/integrations/openai/responsesHelpers.ts +297 -0
  445. package/integrations/x-reader/types.ts +109 -0
  446. package/integrations/xai/models.ts +13 -0
  447. package/integrations/xhs-reader/redaction.ts +68 -0
  448. package/integrations/xhs-reader/types.ts +277 -0
  449. package/integrations/xhs-reader/url.ts +80 -0
  450. package/internalCommandEntries.ts +4 -0
  451. package/machineCommands.ts +18 -34
  452. package/memoryCommands.ts +253 -0
  453. package/memoryInternalCommandEntries.ts +9 -0
  454. package/package.json +454 -9
  455. package/qoderUsageProbe.ts +252 -0
  456. package/render/contentIcon/types.ts +167 -0
  457. package/render/page/createPageAction.ts +183 -0
  458. package/render/page/docSlice.ts +495 -0
  459. package/render/page/types.ts +19 -0
  460. package/render/table/createTableAction.ts +274 -0
  461. package/render/table/deleteTableAction.ts +193 -0
  462. package/render/table/fetchAndCacheTableRows.ts +174 -0
  463. package/render/table/tableSlice.ts +1167 -0
  464. package/render/table/toolValueUtils.ts +363 -0
  465. package/render/table/types.ts +262 -0
  466. package/render/table/utils/tableSerialization.ts +50 -0
  467. package/scriptCommandEntries.ts +0 -3
  468. package/secretScan.ts +31 -0
  469. package/server/handlers/agentRun/types.ts +105 -0
  470. package/share/action.ts +225 -0
  471. package/share/helpers.ts +302 -0
  472. package/share/keys.ts +243 -0
  473. package/share/publicSharePolicy.ts +27 -0
  474. package/share/shareSlice.ts +53 -0
  475. package/share/types.ts +100 -0
  476. package/tableCommands.ts +248 -13
  477. package/workflowInternalCommandEntries.ts +2 -3
  478. package/ai/tools/agent/taskRunTool.ts +0 -112
  479. package/cli/client/taskRunPrompt.ts +0 -27
  480. package/cli/taskRunCommand.ts +0 -265
  481. package/client/taskRunPrompt.ts +0 -27
  482. package/taskRunCommand.ts +0 -265
@@ -0,0 +1,153 @@
1
+ import type {
2
+ KnowledgeCaptureLevel,
3
+ SpaceContextLevel,
4
+ TonePreset,
5
+ } from "../policy/types";
6
+ import {
7
+ normalizeAgentUpdateFieldList,
8
+ type AgentUpdateField,
9
+ } from "../policy/selfUpdateFields";
10
+
11
+ async function dispatchSetSettings(thunkApi: any, changes: Record<string, unknown>) {
12
+ const injectedSetSettings = thunkApi?.extra?.setSettings;
13
+ const setSettings =
14
+ typeof injectedSetSettings === "function"
15
+ ? injectedSetSettings
16
+ : (await import("../../app/settings/settingSlice")).setSettings;
17
+ await thunkApi.dispatch(setSettings(changes as any)).unwrap();
18
+ }
19
+
20
+ export interface UpdateUserPreferenceProfileArgs {
21
+ userTonePreset?: TonePreset;
22
+ knowledgeCaptureLevel?: KnowledgeCaptureLevel;
23
+ spaceContextLevel?: SpaceContextLevel;
24
+ autoApproveSelfUpdateFields?: AgentUpdateField[];
25
+ globalPrompt?: string;
26
+ defaultAgentId?: string;
27
+ summary?: string;
28
+ }
29
+
30
+ export const updateUserPreferenceProfileFunctionSchema = {
31
+ name: "updateUserPreferenceProfile",
32
+ description: [
33
+ "当你已经明确收集到用户的个性化偏好时,使用本工具把这些偏好保存到用户设置里。",
34
+ "适用于保存 tone、knowledge capture、space context,以及用户的 global prompt / 自我介绍摘要。",
35
+ "只有在用户已经明确表达或确认后才调用;不要在信息不充分时猜测。",
36
+ "调用后,你应当用自然语言简要总结已保存的设置,并说明用户之后可以继续调整。",
37
+ ].join("\n"),
38
+ parameters: {
39
+ type: "object",
40
+ properties: {
41
+ userTonePreset: {
42
+ type: "string",
43
+ enum: ["default", "direct", "pragmatic", "friendly", "professional"],
44
+ description: "用户偏好的交流语气。",
45
+ },
46
+ knowledgeCaptureLevel: {
47
+ type: "integer",
48
+ enum: [1, 2, 3, 4],
49
+ description: "知识沉淀级别:1 不主动创建;2 先问再创建;3 回答后建议;4 高价值结果可自动创建。",
50
+ },
51
+ spaceContextLevel: {
52
+ type: "integer",
53
+ enum: [1, 2, 3, 4],
54
+ description: "空间上下文级别:1 不自动读取;2 只看结构和标题;3 轻量读取;4 自适应读取。",
55
+ },
56
+ autoApproveSelfUpdateFields: {
57
+ type: "array",
58
+ items: {
59
+ type: "string",
60
+ enum: [
61
+ "name",
62
+ "model",
63
+ "provider",
64
+ "prompt",
65
+ "introduction",
66
+ "greeting",
67
+ "isPublic",
68
+ "tags",
69
+ "tools",
70
+ "references",
71
+ "temperature",
72
+ "top_p",
73
+ "frequency_penalty",
74
+ "presence_penalty",
75
+ "max_tokens",
76
+ "reasoning_effort",
77
+ ],
78
+ },
79
+ description: "哪些 updateSelf 字段以后不再询问用户,直接自动通过。",
80
+ },
81
+ globalPrompt: {
82
+ type: "string",
83
+ description: "可选:用户希望长期保留的一小段通用偏好说明。未明确确认时不要写。",
84
+ },
85
+ defaultAgentId: {
86
+ type: "string",
87
+ description: "可选:用户明确要求切换首页默认 agent 时才填写。",
88
+ },
89
+ summary: {
90
+ type: "string",
91
+ description: "给开发和日志看的简短总结,不会影响设置本身。",
92
+ },
93
+ },
94
+ } as const,
95
+ };
96
+
97
+ export async function updateUserPreferenceProfileFunc(
98
+ args: UpdateUserPreferenceProfileArgs,
99
+ thunkApi: any
100
+ ): Promise<{ rawData: unknown; displayData: string }> {
101
+ const changes: Record<string, unknown> = {};
102
+
103
+ if (args.userTonePreset) {
104
+ changes.userTonePreset = args.userTonePreset;
105
+ }
106
+ if (typeof args.knowledgeCaptureLevel === "number") {
107
+ changes.knowledgeCaptureLevel = args.knowledgeCaptureLevel;
108
+ }
109
+ if (typeof args.spaceContextLevel === "number") {
110
+ changes.spaceContextLevel = args.spaceContextLevel;
111
+ changes.enableReadCurrentSpace = args.spaceContextLevel > 1;
112
+ }
113
+ if (Array.isArray(args.autoApproveSelfUpdateFields)) {
114
+ changes.autoApproveSelfUpdateFields = normalizeAgentUpdateFieldList(
115
+ args.autoApproveSelfUpdateFields,
116
+ []
117
+ );
118
+ }
119
+ if (typeof args.globalPrompt === "string" && args.globalPrompt.trim()) {
120
+ changes.globalPrompt = args.globalPrompt.trim();
121
+ }
122
+ if (typeof args.defaultAgentId === "string" && args.defaultAgentId.trim()) {
123
+ changes.defaultAgentId = args.defaultAgentId.trim();
124
+ }
125
+
126
+ if (Object.keys(changes).length === 0) {
127
+ throw new Error("没有可保存的用户偏好设置。");
128
+ }
129
+
130
+ await dispatchSetSettings(thunkApi, changes);
131
+
132
+ const rawData = {
133
+ success: true,
134
+ updated: changes,
135
+ summary: args.summary?.trim() || null,
136
+ };
137
+
138
+ const labels: string[] = [];
139
+ if (changes.userTonePreset) labels.push(`语气=${changes.userTonePreset}`);
140
+ if (changes.knowledgeCaptureLevel)
141
+ labels.push(`知识沉淀=${changes.knowledgeCaptureLevel}`);
142
+ if (changes.spaceContextLevel)
143
+ labels.push(`空间读取=${changes.spaceContextLevel}`);
144
+ if (changes.autoApproveSelfUpdateFields)
145
+ labels.push("自我更新免询问字段已更新");
146
+ if (changes.defaultAgentId) labels.push("默认助手已更新");
147
+ if (changes.globalPrompt) labels.push("通用提示词已更新");
148
+
149
+ return {
150
+ rawData,
151
+ displayData: `已保存用户偏好:${labels.join(",")}`,
152
+ };
153
+ }
@@ -0,0 +1,152 @@
1
+ import { callToolApi } from "./toolApiClient";
2
+
3
+ export const WEREAD_DEFAULT_SKILL_VERSION = "1.0.3";
4
+ export const WEREAD_GATEWAY_URL = "https://i.weread.qq.com/api/agent/gateway";
5
+
6
+ export interface WereadGatewayArgs {
7
+ api_name?: string;
8
+ skill_version?: string;
9
+ params?: Record<string, unknown>;
10
+ [key: string]: unknown;
11
+ }
12
+
13
+ export interface WereadGatewayRunOptions {
14
+ apiKey: string;
15
+ fetchImpl?: typeof fetch;
16
+ }
17
+
18
+ export const wereadGatewayFunctionSchema = {
19
+ name: "wereadGateway",
20
+ description:
21
+ "调用微信读书 Agent API Gateway。用于搜索书籍、查看书架、阅读统计、笔记划线、书评和推荐。业务参数必须平铺在请求体顶层。",
22
+ parameters: {
23
+ type: "object",
24
+ properties: {
25
+ api_name: {
26
+ type: "string",
27
+ description: "微信读书接口名,例如 /store/search、/shelf/sync、/user/notebooks。",
28
+ },
29
+ skill_version: {
30
+ type: "string",
31
+ description: "微信读书 skill 版本;未传时使用当前内置版本。",
32
+ },
33
+ params: {
34
+ type: "object",
35
+ description: "业务参数对象。工具会自动把字段平铺到请求体顶层,不会以 params 包裹转发。",
36
+ additionalProperties: true,
37
+ },
38
+ },
39
+ required: ["api_name"],
40
+ } as const,
41
+ };
42
+
43
+ const RESERVED_ARG_KEYS = new Set(["api_name", "skill_version", "params"]);
44
+
45
+ function normalizeApiName(value: unknown): string {
46
+ return typeof value === "string" ? value.trim() : "";
47
+ }
48
+
49
+ function normalizeSkillVersion(value: unknown): string {
50
+ return typeof value === "string" && value.trim()
51
+ ? value.trim()
52
+ : WEREAD_DEFAULT_SKILL_VERSION;
53
+ }
54
+
55
+ function normalizeParams(value: unknown): Record<string, unknown> {
56
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
57
+ return value as Record<string, unknown>;
58
+ }
59
+
60
+ export function buildWereadGatewayRequestBody(args: WereadGatewayArgs): Record<string, unknown> {
61
+ const apiName = normalizeApiName(args.api_name);
62
+ if (!apiName) {
63
+ throw new Error("wereadGateway 需要 api_name。");
64
+ }
65
+
66
+ const flattened: Record<string, unknown> = {
67
+ ...normalizeParams(args.params),
68
+ };
69
+ for (const [key, value] of Object.entries(args)) {
70
+ if (!RESERVED_ARG_KEYS.has(key)) {
71
+ flattened[key] = value;
72
+ }
73
+ }
74
+
75
+ return {
76
+ api_name: apiName,
77
+ ...flattened,
78
+ skill_version: normalizeSkillVersion(args.skill_version),
79
+ };
80
+ }
81
+
82
+ function extractUpgradeMessage(data: unknown): string | null {
83
+ const upgradeInfo = (data as any)?.upgrade_info;
84
+ return typeof upgradeInfo?.message === "string" && upgradeInfo.message.trim()
85
+ ? upgradeInfo.message.trim()
86
+ : null;
87
+ }
88
+
89
+ function extractErrcode(data: unknown): number {
90
+ const raw = (data as any)?.errcode;
91
+ return typeof raw === "number" && Number.isFinite(raw) ? raw : 0;
92
+ }
93
+
94
+ function extractErrorMessage(data: unknown): string {
95
+ const record = data as any;
96
+ return (
97
+ (typeof record?.errmsg === "string" && record.errmsg.trim()) ||
98
+ (typeof record?.message === "string" && record.message.trim()) ||
99
+ "微信读书接口返回错误"
100
+ );
101
+ }
102
+
103
+ export async function runWereadGatewayRequest(
104
+ args: WereadGatewayArgs,
105
+ options: WereadGatewayRunOptions
106
+ ): Promise<{ rawData: unknown; displayData: string }> {
107
+ const apiKey = options.apiKey.trim();
108
+ if (!apiKey) {
109
+ throw new Error("缺少 WEREAD_API_KEY。请先在设置 -> 密钥中保存 WEREAD_API_KEY。");
110
+ }
111
+
112
+ const body = buildWereadGatewayRequestBody(args);
113
+ const fetchImpl = options.fetchImpl ?? fetch;
114
+ const response = await fetchImpl(WEREAD_GATEWAY_URL, {
115
+ method: "POST",
116
+ headers: {
117
+ Authorization: `Bearer ${apiKey}`,
118
+ "Content-Type": "application/json",
119
+ },
120
+ body: JSON.stringify(body),
121
+ });
122
+
123
+ const data = await response.json().catch(async () => ({
124
+ errmsg: await response.text().catch(() => ""),
125
+ }));
126
+ if (!response.ok) {
127
+ throw new Error(`微信读书接口请求失败:HTTP ${response.status}`);
128
+ }
129
+
130
+ const upgradeMessage = extractUpgradeMessage(data);
131
+ if (upgradeMessage) {
132
+ throw new Error(`微信读书 Skill 需要升级:${upgradeMessage}`);
133
+ }
134
+
135
+ const errcode = extractErrcode(data);
136
+ if (errcode !== 0) {
137
+ throw new Error(`微信读书接口返回错误 ${errcode}:${extractErrorMessage(data)}`);
138
+ }
139
+
140
+ const apiName = String(body.api_name);
141
+ return {
142
+ rawData: data,
143
+ displayData: `微信读书接口 ${apiName} 调用成功。\n\n${JSON.stringify(data, null, 2)}`,
144
+ };
145
+ }
146
+
147
+ export async function wereadGatewayFunc(
148
+ args: WereadGatewayArgs,
149
+ thunkApi: any
150
+ ): Promise<{ rawData: unknown; displayData: string }> {
151
+ return callToolApi(thunkApi, "/api/weread/gateway", args, { withAuth: true });
152
+ }
@@ -0,0 +1,76 @@
1
+ import { callToolApi } from "./toolApiClient";
2
+
3
+ const SHARED_PARAMS = {
4
+ type: "object",
5
+ properties: {
6
+ audioUrl: {
7
+ type: "string",
8
+ description:
9
+ "音频来源:内部文件 ID (file-... 或 ULID)、公开 http/https URL,或 base64 data URI(data:audio/...;base64,...)。支持 mp3、wav、m4a、ogg、flac 等常见格式。",
10
+ },
11
+ language: {
12
+ type: "string",
13
+ description:
14
+ "可选,指定音频语言以提升精度(如 'zh'、'en'、'ja')。不指定则自动检测。",
15
+ },
16
+ },
17
+ required: ["audioUrl"],
18
+ };
19
+
20
+ // ── whisper-large-v3-turbo(快速、便宜)──────────────────
21
+
22
+ export const whisperTurboSchema = {
23
+ name: "whisper_turbo",
24
+ description:
25
+ "使用 openai/whisper-large-v3-turbo 对音频进行语音转文字(ASR)。速度快、价格低($0.0002/min),适合大多数场景的实时或批量转录。",
26
+ parameters: SHARED_PARAMS,
27
+ };
28
+
29
+ export const whisperTurboFunc = async (
30
+ input: any,
31
+ thunkApi: any
32
+ ): Promise<any> => {
33
+ const { audioUrl, language } = input;
34
+ const data = await callToolApi(
35
+ thunkApi,
36
+ "/api/whisper-turbo",
37
+ { audioUrl, language },
38
+ { withAuth: true }
39
+ );
40
+ return {
41
+ summary: "Transcription completed",
42
+ text: data.text || "",
43
+ language: data.language,
44
+ duration: data.duration,
45
+ rawData: data,
46
+ };
47
+ };
48
+
49
+ // ── whisper-large-v3(高精度)────────────────────────────
50
+
51
+ export const whisperV3Schema = {
52
+ name: "whisper_v3",
53
+ description:
54
+ "使用 openai/whisper-large-v3 对音频进行高精度语音转文字(ASR)。精度更高(尤其多语言/中文),价格稍高($0.00045/min),适合对准确率要求严格的场景。",
55
+ parameters: SHARED_PARAMS,
56
+ };
57
+
58
+ export const whisperV3Func = async (
59
+ input: any,
60
+ thunkApi: any
61
+ ): Promise<any> => {
62
+ const { audioUrl, language } = input;
63
+ const data = await callToolApi(
64
+ thunkApi,
65
+ "/api/whisper-v3",
66
+ { audioUrl, language },
67
+ { withAuth: true }
68
+ );
69
+ return {
70
+ summary: "Transcription completed",
71
+ text: data.text || "",
72
+ language: data.language,
73
+ duration: data.duration,
74
+ rawData: data,
75
+ };
76
+ };
@@ -0,0 +1,213 @@
1
+ // 文件路径: packages/ai/tools/writeFileTool.ts
2
+
3
+ import { bumpDevReloadSuppressIfSelfEditing } from "./devReloadUtils";
4
+ import { buildToolRequestHeaders, getToolBaseUrl } from "./toolApiClient";
5
+
6
+ // ---- Types ----
7
+
8
+ export type WriteFileArgs = {
9
+ /**
10
+ * 目标文件相对项目根目录(bun-nolo)的路径,例如:
11
+ * - packages/chat/src/messages/web/NewComponent.tsx
12
+ * - packages/server/some-script.ts
13
+ */
14
+ filePath: string;
15
+ /**
16
+ * 要写入文件的完整内容。
17
+ * - 如果文件不存在:将创建新文件,并写入该内容;
18
+ * - 如果文件已存在:
19
+ * - overwrite = true:覆盖原有内容;
20
+ * - overwrite 未设置或为 false:请求会失败。
21
+ */
22
+ content: string;
23
+ overwrite?: boolean;
24
+ };
25
+
26
+ // ---- 工具 Schema,供 LLM 调用 ----
27
+
28
+ export const writeFileFunctionSchema = {
29
+ name: "writeFile",
30
+ description: [
31
+ "在后端服务器上写入一个完整文件的内容,可用于新建文件或覆盖已有文件。",
32
+ "",
33
+ "适用场景:",
34
+ "- 新建一个全新的代码文件(例如新组件、新工具函数、配置文件等)",
35
+ "- 覆盖一个文件的全部内容(当你需要重写整个文件时)",
36
+ "",
37
+ "行为约定:",
38
+ "- 当目标文件不存在:直接创建新文件并写入 content。",
39
+ "- 当目标文件已存在:",
40
+ " - 如果 overwrite=true,则覆盖原文件内容;",
41
+ " - 否则请求会失败,以避免意外覆盖。",
42
+ "",
43
+ "返回数据约定(rawData.response 中):",
44
+ "- created / overwritten:指示本次操作是新建还是覆盖。",
45
+ "- newContent:写入后的完整文件内容(统一使用 \\n 作为换行符),用于 UI 中的代码预览。",
46
+ "- diff:如果文件原本存在,则返回基于旧内容与 newContent 的行级 diff(diffLines 结果),用于 UI 中的 Diff 视图。",
47
+ "",
48
+ "注意:",
49
+ "- filePath 必须是相对项目根目录(bun-nolo)的相对路径,且不能越出项目根目录。",
50
+ "- 建议只在“新建文件/全量重写”时使用本工具;修改部分内容时优先使用 applyEdit。",
51
+ "- 如果用户给了 URL 或网页资料来驱动本次改动,先抓取网页并核对字段,再决定是否需要整文件覆盖。",
52
+ ].join("\n"),
53
+ parameters: {
54
+ type: "object",
55
+ properties: {
56
+ filePath: {
57
+ type: "string",
58
+ description:
59
+ "目标文件相对项目根目录(bun-nolo)的路径,例如: packages/chat/src/messages/web/NewComponent.tsx",
60
+ },
61
+ content: {
62
+ type: "string",
63
+ description:
64
+ "要写入文件的完整内容。对于新建文件,就是文件的全部内容;对于覆盖已有文件,会用该内容替换原内容。",
65
+ },
66
+ overwrite: {
67
+ type: "boolean",
68
+ description:
69
+ "是否允许覆盖已存在的文件。缺省或为 false 时,如果文件已存在将报错;true 时允许覆盖。",
70
+ },
71
+ },
72
+ required: ["filePath", "content"],
73
+ },
74
+ };
75
+
76
+ // ---- 预览执行:不写文件,只展示信息 ----
77
+
78
+ export async function writeFilePreviewFunc(
79
+ args: WriteFileArgs,
80
+ _thunkApi: any
81
+ ): Promise<{ rawData: any; displayData?: string }> {
82
+ const { filePath, content, overwrite } = args;
83
+
84
+ if (!filePath || typeof filePath !== "string") {
85
+ throw new Error("writeFile 预览失败:必须提供有效的 filePath 字符串。");
86
+ }
87
+ if (typeof content !== "string") {
88
+ throw new Error("writeFile 预览失败:content 必须是字符串。");
89
+ }
90
+
91
+ const mode = overwrite ? "允许覆盖(已存在则覆盖)" : "仅新建(已存在则报错)";
92
+ const lengthInfo = `内容长度: ${content.length} 个字符`;
93
+
94
+ return {
95
+ rawData: {
96
+ previewOnly: true,
97
+ filePath,
98
+ overwrite: !!overwrite,
99
+ content,
100
+ },
101
+ displayData: `⏸️ 文件写入预览: ${filePath}(模式: ${mode},${lengthInfo})`,
102
+ };
103
+ }
104
+
105
+ // ---- 真正执行:POST 到后端 /api/write-file ----
106
+
107
+ export async function writeFileFunc(
108
+ args: WriteFileArgs,
109
+ thunkApi: any,
110
+ context?: { parentMessageId?: string; signal?: AbortSignal; agentKey?: string }
111
+ ): Promise<{ rawData: any; displayData?: string }> {
112
+ const { filePath, content, overwrite } = args;
113
+
114
+ if (!filePath || typeof filePath !== "string") {
115
+ throw new Error("写入文件失败:必须提供有效的 filePath 字符串。");
116
+ }
117
+ if (typeof content !== "string") {
118
+ throw new Error("写入文件失败:content 必须是字符串。");
119
+ }
120
+
121
+ try {
122
+ const baseUrl = getToolBaseUrl(thunkApi);
123
+
124
+ if (!baseUrl) {
125
+ throw new Error("写入文件失败:无法获取 writeFile 服务器地址。");
126
+ }
127
+
128
+ const apiUrl = `${baseUrl.replace(/\/+$/, "")}/api/write-file`;
129
+
130
+ // 自举写入前增加 reload 抑制
131
+ bumpDevReloadSuppressIfSelfEditing(filePath);
132
+
133
+ const response = await fetch(apiUrl, {
134
+ method: "POST",
135
+ headers: buildToolRequestHeaders(thunkApi, {
136
+ withAuth: true,
137
+ agentKey: context?.agentKey,
138
+ }),
139
+ signal: context?.signal,
140
+ body: JSON.stringify({ filePath, content, overwrite }),
141
+ });
142
+
143
+ const status = response.status;
144
+ const textBody = await response.text();
145
+ let data: any = {};
146
+ try {
147
+ data = textBody ? JSON.parse(textBody) : {};
148
+ } catch {
149
+ // 非 JSON 的情况忽略解析错误
150
+ }
151
+
152
+ // 409:文件已存在但未允许覆盖 → 视为“写入冲突”,不抛异常
153
+ if (status === 409) {
154
+ const serverMsg =
155
+ data?.error ||
156
+ "写入文件失败:目标文件已存在,且 overwrite 未设置为 true。";
157
+
158
+ return {
159
+ rawData: {
160
+ applied: false,
161
+ conflict: true,
162
+ fileExists: true,
163
+ filePath,
164
+ overwrite: !!overwrite,
165
+ serverMessage: serverMsg,
166
+ },
167
+ displayData: [
168
+ "⏸️ 检测到目标文件已存在,暂未写入。",
169
+ `- filePath: ${filePath}`,
170
+ `- 服务器消息: ${serverMsg}`,
171
+ "",
172
+ "如需覆盖,请在下一次调用 writeFile 时显式设置 overwrite: true。",
173
+ ].join("\n"),
174
+ };
175
+ }
176
+
177
+ if (!response.ok || data?.error) {
178
+ const errMsg =
179
+ data?.error ||
180
+ `writeFile API 请求失败,状态码: ${status}. 响应: ${textBody}`;
181
+ console.error("writeFile API Error:", errMsg);
182
+ throw new Error(errMsg);
183
+ }
184
+
185
+ const created: boolean | undefined = data?.created;
186
+ const overwrittenFlag: boolean | undefined = data?.overwritten;
187
+
188
+ let actionDesc = "写入";
189
+ if (created === true) {
190
+ actionDesc = "新建";
191
+ } else if (overwrittenFlag === true) {
192
+ actionDesc = "覆盖";
193
+ }
194
+
195
+ return {
196
+ rawData: {
197
+ applied: true,
198
+ filePath,
199
+ overwrite: !!overwrite,
200
+ // 把这次写入的原始内容也附带上,方便调试
201
+ content,
202
+ // 服务端返回的详细结果(包括 newContent / diff 等)
203
+ response: data,
204
+ },
205
+ displayData: `✅ 已成功${actionDesc}文件: ${filePath}`,
206
+ };
207
+ } catch (error: any) {
208
+ console.error("执行 writeFile 时发生错误:", error);
209
+ throw new Error(
210
+ `写入文件 (${filePath}) 失败:${error?.message || String(error)}`
211
+ );
212
+ }
213
+ }