nolo-cli 0.1.39 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +4 -4
  2. package/agent-runtime/dialogWritePlan.ts +39 -0
  3. package/agent-runtime/hostAdapter.ts +4 -0
  4. package/agent-runtime/hybridRecordStore.ts +5 -3
  5. package/agent-runtime/index.ts +15 -0
  6. package/agent-runtime/localLoop.ts +87 -7
  7. package/agent-runtime/localToolPolicy.ts +2 -13
  8. package/agent-runtime/localWorkspaceTools.ts +42 -110
  9. package/agent-runtime/runtimeToolPolicy.ts +2 -11
  10. package/agent-runtime/runtimeToolSurface.ts +198 -0
  11. package/agent-runtime/types.ts +1 -0
  12. package/agentAliases.ts +2 -1
  13. package/agentRunCommand.ts +10 -32
  14. package/agentRuntimeLocal.ts +1 -0
  15. package/ai/agent/_executeModel.ts +146 -0
  16. package/ai/agent/agentSlice.ts +556 -1
  17. package/ai/agent/appWorkingMemory.ts +126 -0
  18. package/ai/agent/buildEditingContext.ts +378 -0
  19. package/ai/agent/buildSystemPrompt.ts +585 -0
  20. package/ai/agent/canvasEditingContext.ts +49 -0
  21. package/ai/agent/cleanAgentMessages.ts +140 -0
  22. package/ai/agent/cliChatClient.ts +153 -0
  23. package/ai/agent/cliExecutor.ts +314 -40
  24. package/ai/agent/contextCompiler.ts +107 -0
  25. package/ai/agent/contextLayerContract.ts +44 -0
  26. package/ai/agent/createAgentSchema.ts +272 -0
  27. package/ai/agent/currentTimeContext.ts +65 -0
  28. package/ai/agent/executeToolCall.ts +58 -0
  29. package/ai/agent/fetchAgentContexts.ts +42 -0
  30. package/ai/agent/generatePrompt.ts +3 -0
  31. package/ai/agent/getFullChatContextKeys.ts +168 -0
  32. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  33. package/ai/agent/guidedCreation/types.ts +38 -0
  34. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  35. package/ai/agent/liveAudioModel.ts +2 -0
  36. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  37. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  38. package/ai/agent/planSlice.ts +259 -0
  39. package/ai/agent/referenceUtils.ts +229 -0
  40. package/ai/agent/runAgentBackground.ts +310 -0
  41. package/ai/agent/runAgentClientLoop.ts +164 -0
  42. package/ai/agent/runtimeGuidance.ts +116 -0
  43. package/ai/agent/serverOrigin.ts +7 -0
  44. package/ai/agent/startParallelAgentStreams.ts +424 -0
  45. package/ai/agent/startupProtocol.ts +53 -0
  46. package/ai/agent/streamAgentChatTurn.ts +2001 -0
  47. package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
  48. package/ai/agent/toolFailureGuard.ts +99 -0
  49. package/ai/agent/types.ts +73 -0
  50. package/ai/agent/utils/imageOutput.ts +37 -0
  51. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  52. package/ai/ai.locale.ts +1095 -0
  53. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  54. package/ai/chat/fetchUtils.ts +143 -0
  55. package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
  56. package/ai/chat/parseApiError.ts +67 -0
  57. package/ai/chat/parseMultilineSSE.ts +95 -0
  58. package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
  59. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  60. package/ai/chat/serverProxyRetry.ts +102 -0
  61. package/ai/chat/shouldUseServerProxy.ts +18 -0
  62. package/ai/chat/streamRetry.ts +46 -0
  63. package/ai/chat/updateTotalUsage.ts +89 -0
  64. package/ai/context/buildReferenceContext.ts +437 -0
  65. package/ai/context/retention.ts +165 -0
  66. package/ai/context/tokenUtils.ts +78 -0
  67. package/ai/llm/agentCapabilities.ts +74 -0
  68. package/ai/llm/deepinfra.ts +79 -0
  69. package/ai/llm/fireworks.ts +68 -0
  70. package/ai/llm/generateRequestBody.ts +165 -0
  71. package/ai/llm/getModelContextWindow.ts +93 -0
  72. package/ai/llm/getPricing.ts +252 -0
  73. package/ai/llm/imagePricing.ts +66 -0
  74. package/ai/llm/isResponseAPIModel.ts +13 -0
  75. package/ai/llm/kimi.ts +23 -0
  76. package/ai/llm/mimo.ts +99 -0
  77. package/ai/llm/mistral.ts +21 -0
  78. package/ai/llm/models.ts +45 -0
  79. package/ai/llm/openrouterModels.ts +6 -0
  80. package/ai/llm/providers.ts +313 -0
  81. package/ai/llm/reasoningModels.ts +27 -0
  82. package/ai/llm/types.ts +82 -0
  83. package/ai/llm/usageRequestOptions.ts +59 -0
  84. package/ai/memory/queryShared.ts +161 -0
  85. package/ai/memory/recentRelationshipRecap.ts +247 -0
  86. package/ai/memory/remember.ts +167 -0
  87. package/ai/memory/store.ts +20 -0
  88. package/ai/memory/storeShared.ts +76 -0
  89. package/ai/memory/types.ts +46 -0
  90. package/ai/memory/understanding.ts +349 -0
  91. package/ai/memory/understandingGreeting.ts +264 -0
  92. package/ai/policy/personalizationDialog.ts +333 -0
  93. package/ai/policy/runtimePolicy.ts +454 -0
  94. package/ai/policy/selfUpdateFields.ts +48 -0
  95. package/ai/policy/types.ts +64 -0
  96. package/ai/skills/referenceRuntime.ts +274 -0
  97. package/ai/skills/skillDiagnostics.ts +251 -0
  98. package/ai/skills/skillDocBuilder.ts +139 -0
  99. package/ai/skills/skillSummaryMarker.ts +26 -0
  100. package/ai/token/calculatePrice.ts +576 -0
  101. package/ai/token/missingUsageEstimate.ts +42 -0
  102. package/ai/token/normalizeUsage.ts +124 -0
  103. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  104. package/ai/token/prepareTokenUsageData.ts +93 -0
  105. package/ai/token/resolveBillingTarget.ts +52 -0
  106. package/ai/token/saveTokenRecord.ts +53 -0
  107. package/ai/token/types.ts +103 -0
  108. package/ai/tools/agent/agentTools.ts +235 -0
  109. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  110. package/ai/tools/agent/callAgentTool.ts +139 -0
  111. package/ai/tools/agent/createAgentTool.ts +512 -0
  112. package/ai/tools/agent/createDialogTool.ts +69 -0
  113. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  114. package/ai/tools/agent/parallelBudget.ts +221 -0
  115. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  116. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  117. package/ai/tools/agent/runLlmTool.ts +96 -0
  118. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  119. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  120. package/ai/tools/agent/startAgentDialogTool.ts +53 -0
  121. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  122. package/ai/tools/agent/updateAgentTool.ts +96 -0
  123. package/ai/tools/agent/updateSelfTool.ts +113 -0
  124. package/ai/tools/amazonProductScraperTool.ts +86 -0
  125. package/ai/tools/apifyActorClient.ts +45 -0
  126. package/ai/tools/appEditGuard.ts +372 -0
  127. package/ai/tools/appReadSnapshot.ts +153 -0
  128. package/ai/tools/appTools.ts +1549 -0
  129. package/ai/tools/applyEditTool.ts +259 -0
  130. package/ai/tools/applyLineEditsTool.ts +315 -0
  131. package/ai/tools/browserTools/click.ts +33 -0
  132. package/ai/tools/browserTools/closeSession.ts +29 -0
  133. package/ai/tools/browserTools/common.ts +27 -0
  134. package/ai/tools/browserTools/openSession.ts +48 -0
  135. package/ai/tools/browserTools/readContent.ts +38 -0
  136. package/ai/tools/browserTools/selectOption.ts +46 -0
  137. package/ai/tools/browserTools/typeText.ts +42 -0
  138. package/ai/tools/category/createCategoryTool.ts +66 -0
  139. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  140. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  141. package/ai/tools/cfBrowserTools.ts +319 -0
  142. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  143. package/ai/tools/checkEnvTool.ts +102 -0
  144. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  145. package/ai/tools/codeSearchTool.ts +123 -0
  146. package/ai/tools/codeTools.ts +101 -0
  147. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  148. package/ai/tools/createDocTool.ts +132 -0
  149. package/ai/tools/createSkillDocTool.ts +155 -0
  150. package/ai/tools/createWorkflowTool.ts +154 -0
  151. package/ai/tools/delayTool.ts +31 -0
  152. package/ai/tools/deleteSpacesTool.ts +325 -0
  153. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  154. package/ai/tools/devReloadUtils.ts +29 -0
  155. package/ai/tools/dialogMessageSearch.ts +137 -0
  156. package/ai/tools/doctorSkillTool.ts +72 -0
  157. package/ai/tools/ecommerceScraperTool.ts +86 -0
  158. package/ai/tools/emailTools.ts +549 -0
  159. package/ai/tools/evalSkillTool.ts +92 -0
  160. package/ai/tools/exaSearchTool.ts +63 -0
  161. package/ai/tools/execShellTool.ts +266 -0
  162. package/ai/tools/executeSqlTool.ts +192 -0
  163. package/ai/tools/fetchWebpageSupport.ts +333 -0
  164. package/ai/tools/fetchWebpageTool.ts +97 -0
  165. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  166. package/ai/tools/generateDocxTool.ts +215 -0
  167. package/ai/tools/googleSearchScraperTool.ts +106 -0
  168. package/ai/tools/importDataTool.ts +133 -0
  169. package/ai/tools/importSkillTool.ts +162 -0
  170. package/ai/tools/index.ts +2308 -0
  171. package/ai/tools/jdProductScraperTool.ts +821 -0
  172. package/ai/tools/listUserSpacesTool.ts +113 -0
  173. package/ai/tools/localFilesTool.ts +276 -0
  174. package/ai/tools/marxistsOfflineBook.ts +253 -0
  175. package/ai/tools/modelUsageTools.ts +206 -0
  176. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  177. package/ai/tools/olmOcrTool.ts +33 -0
  178. package/ai/tools/openaiImageTool.ts +267 -0
  179. package/ai/tools/prepareTools.ts +23 -0
  180. package/ai/tools/readDocTool.ts +88 -0
  181. package/ai/tools/readFileTool.ts +214 -0
  182. package/ai/tools/readTool.ts +194 -0
  183. package/ai/tools/readXPostTool.ts +229 -0
  184. package/ai/tools/readXhsProfileTool.ts +627 -0
  185. package/ai/tools/rememberMemoryTool.ts +84 -0
  186. package/ai/tools/remotionVideoTool.ts +151 -0
  187. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  188. package/ai/tools/searchWorkspaceTool.ts +259 -0
  189. package/ai/tools/skillFollowup.ts +86 -0
  190. package/ai/tools/surfWeatherTool.ts +169 -0
  191. package/ai/tools/table/addTableRowTool.ts +217 -0
  192. package/ai/tools/table/createTableTool.ts +315 -0
  193. package/ai/tools/table/rowTools.ts +386 -0
  194. package/ai/tools/table/schemaTools.ts +244 -0
  195. package/ai/tools/table/shareTableTool.ts +148 -0
  196. package/ai/tools/table/toolShared.ts +129 -0
  197. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  198. package/ai/tools/toolApiClient.ts +279 -0
  199. package/ai/tools/toolResultError.ts +42 -0
  200. package/ai/tools/toolRunSlice.ts +303 -0
  201. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  202. package/ai/tools/uiAskChoiceTool.ts +104 -0
  203. package/ai/tools/updateContentTitleTool.ts +84 -0
  204. package/ai/tools/updateDocTool.ts +105 -0
  205. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  206. package/ai/tools/wereadGatewayTool.ts +152 -0
  207. package/ai/tools/whisperTool.ts +76 -0
  208. package/ai/tools/writeFileTool.ts +213 -0
  209. package/ai/tools/youtubeScraperTool.ts +116 -0
  210. package/ai/tools/ziweiChartTool.ts +678 -0
  211. package/ai/types.ts +55 -0
  212. package/ai/workflow/workflowExecutor.ts +323 -0
  213. package/ai/workflow/workflowSlice.ts +73 -0
  214. package/ai/workflow/workflowTypes.ts +106 -0
  215. package/app/actions/syncAppRecord.ts +73 -0
  216. package/app/constants/animationSets.ts +21 -0
  217. package/app/constants/appEditor.ts +99 -0
  218. package/app/favorite/favoriteSlice.ts +690 -0
  219. package/app/favorite/type.ts +43 -0
  220. package/app/hooks/deleteDbKey.ts +233 -0
  221. package/app/i18n/client.ts +13 -0
  222. package/app/i18n/i18n.base.ts +14 -0
  223. package/app/i18n/i18n.config.ts +77 -0
  224. package/app/i18n/index.ts +15 -0
  225. package/app/i18n/mapLanguage.ts +11 -0
  226. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  227. package/app/i18n/translations/error.locale.ts +246 -0
  228. package/app/i18n/translations/interface.locale.ts +2174 -0
  229. package/app/i18n/translations/pricing.locale.ts +397 -0
  230. package/app/i18n/translations/privacy.locale.ts +168 -0
  231. package/app/i18n/translations/seo.locale.ts +129 -0
  232. package/app/i18n/translations/terms.locale.ts +124 -0
  233. package/app/i18n/types.ts +6 -0
  234. package/app/notifications/model.ts +77 -0
  235. package/app/notifications/notificationSlice.ts +141 -0
  236. package/app/reducer.ts +36 -0
  237. package/app/settings/dbActionThunks.ts +34 -0
  238. package/app/settings/defaultSpacePreference.ts +87 -0
  239. package/app/settings/settingSlice.tsx +1212 -0
  240. package/app/settings/settingsRecord.ts +8 -0
  241. package/app/stateViews/runtime.ts +90 -0
  242. package/app/store.ts +55 -0
  243. package/app/theme/colors.ts +280 -0
  244. package/app/theme/fontPreference.ts +77 -0
  245. package/app/theme/theme.config.ts +120 -0
  246. package/app/theme/themeModeBootstrap.ts +123 -0
  247. package/app/types/appSummary.ts +114 -0
  248. package/app/types.ts +358 -0
  249. package/app/utils/appKeys.ts +55 -0
  250. package/app/utils/async.ts +28 -0
  251. package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
  252. package/app/utils/env.ts +17 -0
  253. package/app/utils/fileUtils.ts +229 -0
  254. package/app/utils/imageUtils.ts +274 -0
  255. package/app/utils/myContentItems.ts +289 -0
  256. package/app/utils/retryAfter.ts +36 -0
  257. package/app/utils/retryFetch.ts +61 -0
  258. package/app/utils/toast.ts +3 -0
  259. package/auth/action/signUpAction.ts +227 -0
  260. package/auth/adminPermissions.ts +18 -0
  261. package/auth/authSlice.ts +531 -0
  262. package/auth/client/loginRequest.ts +14 -0
  263. package/auth/resetAuthScopedClientState.ts +27 -0
  264. package/auth/routes.ts +178 -0
  265. package/auth/token.ts +63 -0
  266. package/auth/types.ts +40 -0
  267. package/chat/chat.locale.ts +813 -0
  268. package/chat/dialog/actions/addCybotAction.ts +52 -0
  269. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  270. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  271. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  272. package/chat/dialog/actions/createDialogAction.ts +379 -0
  273. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  274. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  275. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  276. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  277. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  278. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  279. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  280. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  281. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  282. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  283. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  284. package/chat/dialog/dialogAgents.ts +72 -0
  285. package/chat/dialog/dialogSlice.ts +872 -0
  286. package/chat/dialog/dialogTitle.ts +81 -0
  287. package/chat/dialog/dialogTokenStats.ts +12 -0
  288. package/chat/dialog/dialogUrl.ts +6 -0
  289. package/chat/dialog/goal.ts +108 -0
  290. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  291. package/chat/dialog/schedule.ts +17 -0
  292. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  293. package/chat/messages/fetchConvMsgs.ts +51 -0
  294. package/chat/messages/fileUrl.ts +13 -0
  295. package/chat/messages/messageAgent.ts +8 -0
  296. package/chat/messages/messageContent.ts +199 -0
  297. package/chat/messages/messageContract.ts +88 -0
  298. package/chat/messages/messageSlice.ts +1367 -0
  299. package/chat/messages/toolThunks.ts +625 -0
  300. package/cli/agentAliases.ts +2 -1
  301. package/cli/agentRunCommand.ts +10 -32
  302. package/cli/agentRuntimeLocal.ts +1 -0
  303. package/cli/client/agentRun.ts +67 -95
  304. package/cli/client/localRuntimeAdapter.ts +323 -54
  305. package/cli/commandRegistry.ts +2 -2
  306. package/cli/machineWsRunDispatch.ts +51 -6
  307. package/cli/offlineMarxistsAgentCommand.ts +6 -4
  308. package/client/agentConfigResolver.test.ts +2 -2
  309. package/client/agentRun.test.ts +175 -57
  310. package/client/agentRun.ts +67 -95
  311. package/client/localRuntimeAdapter.test.ts +682 -37
  312. package/client/localRuntimeAdapter.ts +323 -54
  313. package/client/localRuntimeDryRun.test.ts +23 -9
  314. package/client/localToolPolicy.test.ts +4 -4
  315. package/commandRegistry.ts +2 -2
  316. package/core/builtinAgents.ts +209 -0
  317. package/core/config.ts +15 -0
  318. package/core/crypto.ts +51 -0
  319. package/core/generateKeyPairFromSeedV1.ts +15 -0
  320. package/core/generateMainKey.ts +22 -0
  321. package/core/init.ts +41 -0
  322. package/core/localOrigins.ts +8 -0
  323. package/core/password.ts +13 -0
  324. package/core/prefix.ts +23 -0
  325. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  326. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  327. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  328. package/create/editor/transforms/markdownToSlate.ts +24 -0
  329. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  330. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  331. package/create/editor/transforms/slateToText.ts +33 -0
  332. package/create/editor/utils/slateUtils.ts +233 -0
  333. package/create/space/addSpaceAction.ts +193 -0
  334. package/create/space/category/categoryActions.ts +427 -0
  335. package/create/space/changeSpaceAction.ts +36 -0
  336. package/create/space/constants.ts +8 -0
  337. package/create/space/content/addContentAction.ts +116 -0
  338. package/create/space/content/contentThunks.ts +90 -0
  339. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  340. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  341. package/create/space/content/moveContentAction.ts +285 -0
  342. package/create/space/content/updateContentCategoryAction.ts +154 -0
  343. package/create/space/content/updateContentTitleAction.ts +151 -0
  344. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  345. package/create/space/contentKeyUtils.ts +117 -0
  346. package/create/space/deleteSpaceAction.ts +276 -0
  347. package/create/space/fetchSpaceAction.ts +70 -0
  348. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  349. package/create/space/loadDefaultSpaceAction.ts +57 -0
  350. package/create/space/member/addMemberAction.ts +79 -0
  351. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  352. package/create/space/member/memberThunks.ts +47 -0
  353. package/create/space/member/removeMemberAction.ts +67 -0
  354. package/create/space/resolvePreferredSpaceId.ts +113 -0
  355. package/create/space/sidebarVisibleTypes.ts +241 -0
  356. package/create/space/space.locale.ts +1087 -0
  357. package/create/space/spaceAccess.ts +182 -0
  358. package/create/space/spaceCollapsedState.ts +54 -0
  359. package/create/space/spaceKeys.ts +65 -0
  360. package/create/space/spaceSlice.ts +328 -0
  361. package/create/space/spaceThunks.ts +410 -0
  362. package/create/space/types.ts +27 -0
  363. package/create/space/updateSpaceAction.ts +107 -0
  364. package/create/space/utils/permissions.ts +47 -0
  365. package/create/types.ts +21 -0
  366. package/database/actions/agentReadResolution.ts +33 -0
  367. package/database/actions/common.ts +243 -0
  368. package/database/actions/deleteFile.ts +40 -0
  369. package/database/actions/fileContent.ts +125 -0
  370. package/database/actions/patch.ts +155 -0
  371. package/database/actions/read.ts +358 -0
  372. package/database/actions/readAndWait.ts +260 -0
  373. package/database/actions/readRequestManager.ts +120 -0
  374. package/database/actions/readResolution.ts +125 -0
  375. package/database/actions/remove.ts +94 -0
  376. package/database/actions/replication.ts +477 -0
  377. package/database/actions/upload.ts +186 -0
  378. package/database/actions/upsert.ts +56 -0
  379. package/database/actions/write.ts +146 -0
  380. package/database/authority/ownerKey.ts +80 -0
  381. package/database/authority/recordAuthority.ts +67 -0
  382. package/database/authority/userAuthorityRegistry.ts +54 -0
  383. package/database/client/fetchUserData.ts +61 -0
  384. package/database/dbActionThunks.ts +1 -0
  385. package/database/dbSlice.ts +149 -0
  386. package/database/fileRing.ts +51 -0
  387. package/database/fileStorage.ts +232 -0
  388. package/database/fileUrl.ts +34 -0
  389. package/database/keys.ts +767 -0
  390. package/database/queryPrefixes.ts +14 -0
  391. package/database/requests.ts +443 -0
  392. package/database/runtimeServerContext.ts +54 -0
  393. package/database/server/levelAuthorityStore.ts +20 -1
  394. package/database/tenantPlacement.ts +57 -0
  395. package/database/userPreferenceRegister.ts +131 -0
  396. package/database/utils/ulid.ts +1 -0
  397. package/integrations/anthropic/anthropicModels.ts +47 -0
  398. package/integrations/deepseek/models.ts +37 -0
  399. package/integrations/google/models.ts +341 -0
  400. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  401. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  402. package/integrations/openai/flexTier.ts +102 -0
  403. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  404. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  405. package/integrations/openai/models.ts +271 -0
  406. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  407. package/integrations/openai/responsesHelpers.ts +297 -0
  408. package/integrations/x-reader/types.ts +109 -0
  409. package/integrations/xai/models.ts +13 -0
  410. package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
  411. package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
  412. package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
  413. package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
  414. package/integrations/xhs-reader/normalize.ts +390 -0
  415. package/integrations/xhs-reader/orchestrator.ts +178 -0
  416. package/integrations/xhs-reader/redaction.ts +68 -0
  417. package/integrations/xhs-reader/types.ts +244 -0
  418. package/integrations/xhs-reader/url.ts +57 -0
  419. package/machineWsRunDispatch.ts +51 -6
  420. package/offlineMarxistsAgentCommand.ts +6 -4
  421. package/package.json +430 -3
  422. package/render/page/createPageAction.ts +183 -0
  423. package/render/page/docSlice.ts +468 -0
  424. package/render/page/types.ts +17 -0
  425. package/render/table/createTableAction.ts +270 -0
  426. package/render/table/deleteTableAction.ts +193 -0
  427. package/render/table/fetchAndCacheTableRows.ts +174 -0
  428. package/render/table/tableSlice.ts +1106 -0
  429. package/render/table/toolValueUtils.ts +363 -0
  430. package/render/table/types.ts +252 -0
  431. package/render/table/utils/tableSerialization.ts +50 -0
  432. package/server/handlers/agentRun/types.ts +104 -0
  433. package/share/action.ts +225 -0
  434. package/share/helpers.ts +302 -0
  435. package/share/keys.ts +243 -0
  436. package/share/publicSharePolicy.ts +27 -0
  437. package/share/shareSlice.ts +53 -0
  438. package/share/types.ts +100 -0
@@ -21,6 +21,7 @@ import {
21
21
  resolveCurrentRunRuntimeToolPolicy,
22
22
  resolveLocalWorkspaceExecutorOptionsFromPolicy,
23
23
  resolveRequestedRuntimeToolNames,
24
+ resolveRuntimeToolSurfaceForAgent,
24
25
  shouldUsePlatformChatProvider,
25
26
  } from "../agentRuntimeLocal";
26
27
  import type { AgentRuntimeChatMessage } from "../agent-runtime";
@@ -41,8 +42,11 @@ import {
41
42
  type HybridRecordStore,
42
43
  } from "./hybridRecordStore";
43
44
  import { executeLocalToolWithPolicy } from "./localToolPolicy";
45
+ import { inferCaptureIntent } from "../ai/policy/runtimePolicy";
46
+ import { prepareTools } from "../ai/tools/prepareTools";
44
47
  import { taskRunFunctionSchema } from "../ai/tools/agent/taskRunTool";
45
48
  import {
49
+ MIMO_MONTH_AGENT_KEY,
46
50
  NOLO_DEFAULT_AGENT_ID,
47
51
  NOLO_DEFAULT_AGENT_KEY,
48
52
  } from "../agentAliases";
@@ -50,20 +54,45 @@ import {
50
54
  buildNoloWorkspaceCliToolExecutors,
51
55
  buildNoloWorkspaceOpenAiTools,
52
56
  filterNoloWorkspaceToolNames,
53
- NOLO_WORKSPACE_TOOL_NAMES,
54
- NOLO_WORKSPACE_TOOL_PROMPT,
55
57
  parseNoloWorkspaceToolArguments,
56
58
  } from "../agent-runtime/noloWorkspaceTools";
59
+ import { executeCli as defaultExecuteCli, type CliExecuteResult, type CliImageInput } from "../ai/agent/cliExecutor";
60
+ import { buildCliPrompt } from "../ai/agent/cliPrompt";
61
+ import {
62
+ readXhsProfileFunc,
63
+ readXhsProfileFunctionSchema,
64
+ } from "../ai/tools/readXhsProfileTool";
65
+ import { resolveDefaultXhsProfileDir } from "../integrations/xhs-reader/bridge/readXhsProfileWithBridge";
57
66
 
58
67
  type EnvLike = Record<string, string | undefined>;
59
68
  type FetchInput = Parameters<typeof fetch>[0];
60
69
  type FetchInit = Parameters<typeof fetch>[1];
70
+ type LocalCliExecutor = (
71
+ provider: string,
72
+ prompt: string,
73
+ options: {
74
+ model?: string;
75
+ timeout?: number;
76
+ cwd?: string;
77
+ yolo?: boolean;
78
+ env?: Record<string, string | undefined>;
79
+ imageInputs?: CliImageInput[];
80
+ }
81
+ ) => Promise<CliExecuteResult>;
61
82
  const TRANSIENT_FETCH_MAX_ATTEMPTS = 8;
62
83
  const TRANSIENT_FETCH_RETRY_BASE_DELAY_MS = 250;
63
84
  export const BUILTIN_NOLO_AGENT_ID = NOLO_DEFAULT_AGENT_ID;
64
85
  export const BUILTIN_NOLO_AGENT_KEY = NOLO_DEFAULT_AGENT_KEY;
65
86
  const CLI_DIR = dirname(fileURLToPath(import.meta.url));
66
87
  const CLI_ENTRYPOINT = join(CLI_DIR, "..", "index.ts");
88
+ const LOCAL_SERVER_TABLE_TOOL_NAMES = [
89
+ "createTable",
90
+ "addTableRow",
91
+ "addTableRows",
92
+ "updateTableRow",
93
+ "updateTableRows",
94
+ ] as const;
95
+ const LOCAL_SERVER_TABLE_TOOL_NAME_SET = new Set<string>(LOCAL_SERVER_TABLE_TOOL_NAMES);
67
96
 
68
97
  export type CliLocalRuntimeDb = CliKvDb;
69
98
 
@@ -77,6 +106,8 @@ export type CliLocalRuntimeAdapterDeps = {
77
106
  cwd?: string;
78
107
  output?: { write(chunk: string): unknown };
79
108
  localToolExecutors?: Record<string, (call: any) => Promise<{ content: string; metadata?: Record<string, unknown> }>>;
109
+ readXhsProfile?: typeof readXhsProfileFunc;
110
+ executeCli?: LocalCliExecutor;
80
111
  sleep?: (ms: number) => Promise<void>;
81
112
  loopbackRequest?: (input: FetchInput, init?: FetchInit) => Promise<Response>;
82
113
  };
@@ -93,10 +124,6 @@ function resolveLocalUserId(env: EnvLike) {
93
124
  return env.NOLO_LOCAL_USER_ID || env.NOLO_USER_ID || "local";
94
125
  }
95
126
 
96
- function shellModeEnabled(env: EnvLike) {
97
- return env.NOLO_LOCAL_SHELL_MODE === "worktree";
98
- }
99
-
100
127
  function parseLocalToolBudgets(env: EnvLike) {
101
128
  const raw = env.NOLO_LOCAL_TOOL_BUDGETS?.trim();
102
129
  if (!raw) return {};
@@ -224,12 +251,14 @@ function buildRequestTimeoutSignal(timeoutMs?: number) {
224
251
  if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
225
252
  return undefined;
226
253
  }
227
- if (typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function") {
228
- return AbortSignal.timeout(timeoutMs);
229
- }
230
254
  const controller = new AbortController();
231
- setTimeout(() => controller.abort(new Error(`request timed out after ${timeoutMs}ms`)), timeoutMs);
232
- return controller.signal;
255
+ const timeout = setTimeout(() => {
256
+ controller.abort(new Error(`request timed out after ${timeoutMs}ms`));
257
+ }, timeoutMs);
258
+ return {
259
+ signal: controller.signal,
260
+ clear: () => clearTimeout(timeout),
261
+ };
233
262
  }
234
263
 
235
264
  function summarizeEndpoint(value: unknown) {
@@ -251,7 +280,79 @@ function parseJsonObject(raw: string) {
251
280
  }
252
281
  }
253
282
 
283
+ function isCliProviderAgent(agentConfig: AgentRuntimeAgentConfig) {
284
+ return Boolean(
285
+ agentConfig.apiSource === "cli" ||
286
+ agentConfig.provider === "cli" ||
287
+ agentConfig.cliProvider
288
+ );
289
+ }
290
+
291
+ function resolveCliProviderName(agentConfig: AgentRuntimeAgentConfig) {
292
+ return (agentConfig.cliProvider || agentConfig.provider || "codex").trim() || "codex";
293
+ }
294
+
295
+ function stringifyRuntimeMessageContent(content: AgentRuntimeChatMessage["content"]) {
296
+ if (typeof content === "string") return content;
297
+ if (Array.isArray(content)) {
298
+ return content
299
+ .map((part) => {
300
+ if (typeof part === "string") return part;
301
+ if (part && typeof part === "object" && "text" in part) {
302
+ return String((part as any).text ?? "");
303
+ }
304
+ return JSON.stringify(part);
305
+ })
306
+ .filter((part) => part.trim())
307
+ .join("\n");
308
+ }
309
+ return content == null ? "" : String(content);
310
+ }
311
+
312
+ function buildPromptForCliProvider(messages: AgentRuntimeChatMessage[]) {
313
+ const systemPrompt = messages
314
+ .filter((message) => message.role === "system")
315
+ .map((message) => stringifyRuntimeMessageContent(message.content).trim())
316
+ .filter(Boolean)
317
+ .join("\n\n");
318
+ const taskPrompt = messages
319
+ .filter((message) => message.role !== "system")
320
+ .map((message) => {
321
+ const content = stringifyRuntimeMessageContent(message.content).trim();
322
+ if (!content) return "";
323
+ return `[${message.role}]\n${content}`;
324
+ })
325
+ .filter(Boolean)
326
+ .join("\n\n");
327
+ return buildCliPrompt(systemPrompt, taskPrompt);
328
+ }
329
+
330
+ function collectCliProviderImageInputs(messages: AgentRuntimeChatMessage[]) {
331
+ const urls: string[] = [];
332
+ for (const message of messages) {
333
+ if (!Array.isArray(message.content)) continue;
334
+ for (const part of message.content) {
335
+ if (
336
+ part &&
337
+ typeof part === "object" &&
338
+ (part as any).type === "image_url" &&
339
+ typeof (part as any).image_url?.url === "string" &&
340
+ (part as any).image_url.url.trim()
341
+ ) {
342
+ urls.push((part as any).image_url.url.trim());
343
+ }
344
+ }
345
+ }
346
+ return urls;
347
+ }
348
+
254
349
  function logLocalRuntimeDiagnostic(event: string, fields: Record<string, unknown>) {
350
+ if (
351
+ process.env.NOLO_LOCAL_RUNTIME_DEBUG !== "1" &&
352
+ process.env.NOLO_DEBUG !== "1"
353
+ ) {
354
+ return;
355
+ }
255
356
  console.error(`[nolo-local-runtime] ${event} ${JSON.stringify(fields)}`);
256
357
  }
257
358
 
@@ -266,39 +367,51 @@ function summarizeOpenAiToolNames(tools: Array<Record<string, unknown>>) {
266
367
  .filter((name): name is string => Boolean(name));
267
368
  }
268
369
 
269
- function buildOpenAiTools(args: { toolNames?: string[]; env: EnvLike }) {
370
+ function shouldExposeLocalPlatformTools(agentKey?: string) {
371
+ return agentKey !== MIMO_MONTH_AGENT_KEY;
372
+ }
373
+
374
+ function buildOpenAiTools(args: { agentKey?: string; toolNames?: string[]; env: EnvLike }) {
270
375
  const toolset = buildLocalWorkspaceToolsetForEnv(args);
376
+ const exposePlatformTools = shouldExposeLocalPlatformTools(args.agentKey);
271
377
  return [
272
378
  ...buildLocalWorkspaceOpenAiTools({
273
379
  toolNames: toolset.toolNames,
274
380
  exposeShellTools: toolset.exposeShellTools,
275
381
  }),
276
- ...buildServerPlatformOpenAiTools({ toolNames: args.toolNames }),
277
- ...buildNoloWorkspaceOpenAiTools({ toolNames: args.toolNames }),
382
+ ...(exposePlatformTools ? buildServerPlatformOpenAiTools({ toolNames: args.toolNames }) : []),
383
+ ...(exposePlatformTools ? buildNoloWorkspaceOpenAiTools({ toolNames: args.toolNames }) : []),
278
384
  ];
279
385
  }
280
386
 
281
387
  function buildLocalWorkspaceToolsetForEnv(args: { toolNames?: string[]; env: EnvLike }) {
388
+ void args.env;
282
389
  const toolset = buildLocalWorkspaceToolset({
283
390
  declaredToolNames: args.toolNames,
284
- exposeShellTools: shellModeEnabled(args.env),
391
+ exposeShellTools: true,
285
392
  });
286
393
  return toolset;
287
394
  }
288
395
 
289
396
  function buildLocalPolicyToolNames(args: { toolNames?: string[]; env: EnvLike }) {
397
+ void args.env;
290
398
  return [
291
399
  ...buildLocalWorkspacePolicyToolNames({
292
400
  declaredToolNames: args.toolNames,
293
- exposeShellTools: shellModeEnabled(args.env),
401
+ exposeShellTools: true,
294
402
  }),
295
403
  ...((args.toolNames ?? []).includes("taskRun") ? ["taskRun"] : []),
404
+ ...((args.toolNames ?? []).includes("read_xhs_profile") ? ["read_xhs_profile"] : []),
405
+ ...(args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
296
406
  ...filterNoloWorkspaceToolNames(args.toolNames),
297
407
  ];
298
408
  }
299
409
 
300
410
  function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
301
411
  const toolNames = new Set(args.toolNames ?? []);
412
+ const tableTools = prepareTools(
413
+ (args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
414
+ );
302
415
  return [
303
416
  ...(toolNames.has("taskRun")
304
417
  ? [{
@@ -306,6 +419,13 @@ function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
306
419
  function: taskRunFunctionSchema,
307
420
  }]
308
421
  : []),
422
+ ...(toolNames.has("read_xhs_profile")
423
+ ? [{
424
+ type: "function",
425
+ function: readXhsProfileFunctionSchema,
426
+ }]
427
+ : []),
428
+ ...tableTools,
309
429
  ];
310
430
  }
311
431
 
@@ -336,16 +456,32 @@ function isBuiltinNoloAgentConfig(agentConfig: AgentRuntimeAgentConfig | null |
336
456
  return isBuiltinNoloAgentRef(key) || isBuiltinNoloAgentRef(id);
337
457
  }
338
458
 
339
- function withBuiltinNoloCliTools(agentConfig: AgentRuntimeAgentConfig | null) {
340
- if (!agentConfig || !isBuiltinNoloAgentConfig(agentConfig)) return agentConfig;
341
- const toolNames = [...new Set([...(agentConfig.toolNames ?? []), ...NOLO_WORKSPACE_TOOL_NAMES])];
459
+ function withResolvedRuntimeToolSurface(
460
+ agentConfig: AgentRuntimeAgentConfig | null,
461
+ env: EnvLike
462
+ ) {
463
+ if (!agentConfig) return agentConfig;
464
+ const currentUserId = resolveLocalUserId(env);
465
+ const rawRecord = (agentConfig as any).rawRecord ?? {};
466
+ const ownerId =
467
+ typeof rawRecord.userId === "string" && rawRecord.userId.trim()
468
+ ? rawRecord.userId.trim()
469
+ : null;
470
+ const toolSurface = resolveRuntimeToolSurfaceForAgent({
471
+ explicitToolNames: agentConfig.toolNames,
472
+ currentUserId,
473
+ agentOwnerId: ownerId,
474
+ agentKey: rawRecord.dbKey ?? agentConfig.key,
475
+ isPublic: !isBuiltinNoloAgentConfig(agentConfig) && rawRecord.isPublic === true,
476
+ sharingLevel: typeof rawRecord.sharingLevel === "string" ? rawRecord.sharingLevel : null,
477
+ trustedPrivateInvocation: isBuiltinNoloAgentConfig(agentConfig),
478
+ runtimeHost: "cli",
479
+ });
342
480
  return {
343
481
  ...agentConfig,
344
- toolNames,
345
- prompt: [
346
- agentConfig.prompt?.trim() ?? "",
347
- NOLO_WORKSPACE_TOOL_PROMPT,
348
- ].filter(Boolean).join("\n\n"),
482
+ toolNames: toolSurface.finalToolNames,
483
+ toolSurface,
484
+ prompt: agentConfig.prompt,
349
485
  };
350
486
  }
351
487
 
@@ -361,29 +497,72 @@ function buildServerPlatformToolExecutors(args: {
361
497
  env: EnvLike;
362
498
  fetchImpl: typeof fetch;
363
499
  }) {
500
+ const postServer = async (path: string, body: object) => {
501
+ const serverUrl = resolveRuntimeServerUrl(args.env);
502
+ const authToken = resolveRuntimeAuthToken(args.env);
503
+ if (!serverUrl) throw new Error("server platform tools require NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
504
+ if (!authToken) throw new Error("server platform tools require AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
505
+ const response = await args.fetchImpl(`${serverUrl}${path}`, {
506
+ method: "POST",
507
+ headers: {
508
+ "Content-Type": "application/json",
509
+ Authorization: `Bearer ${authToken}`,
510
+ },
511
+ body: JSON.stringify(body),
512
+ });
513
+ const text = await response.text().catch(() => "");
514
+ if (!response.ok) {
515
+ throw new Error(`server platform tool bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
516
+ }
517
+ return text;
518
+ };
519
+ const guardExplicitTableCapture = (call: any) => {
520
+ if (inferCaptureIntent(String(call.userInput ?? "")) === "strong") return null;
521
+ return JSON.stringify({
522
+ error: "knowledge_capture_requires_confirmation",
523
+ message:
524
+ "当前本地运行不允许自动写入表格。只有当用户在当前请求里明确要求保存、建表、写入 table 或做成数据集时,才能继续;否则请先询问用户。",
525
+ policy: {
526
+ capability: "knowledge_capture",
527
+ target: "table",
528
+ mode: "explicit-only-local",
529
+ },
530
+ });
531
+ };
532
+ const tableExecutors = Object.fromEntries(
533
+ LOCAL_SERVER_TABLE_TOOL_NAMES.map((toolName) => [
534
+ toolName,
535
+ async (call: any) => {
536
+ const blocked = guardExplicitTableCapture(call);
537
+ if (blocked) {
538
+ return {
539
+ content: blocked,
540
+ metadata: { serverPlatformTool: true, tableWriteBlocked: true },
541
+ };
542
+ }
543
+ const parsed = parseNoloWorkspaceToolArguments(call.arguments);
544
+ const path =
545
+ toolName === "createTable" ? "/api/table/create"
546
+ : toolName === "addTableRow" ? "/api/table/add-row"
547
+ : toolName === "addTableRows" ? "/api/table/add-rows"
548
+ : toolName === "updateTableRow" ? "/api/table/update-row"
549
+ : "/api/table/update-rows";
550
+ const content = await postServer(path, parsed);
551
+ return {
552
+ content,
553
+ metadata: { serverPlatformTool: true, tableWrite: true },
554
+ };
555
+ },
556
+ ]),
557
+ );
364
558
  return {
365
559
  taskRun: async (call: any) => {
366
- const serverUrl = resolveRuntimeServerUrl(args.env);
367
- const authToken = resolveRuntimeAuthToken(args.env);
368
- if (!serverUrl) throw new Error("taskRun requires NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
369
- if (!authToken) throw new Error("taskRun requires AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
370
- const response = await args.fetchImpl(`${serverUrl}/api/task-run`, {
371
- method: "POST",
372
- headers: {
373
- "Content-Type": "application/json",
374
- Authorization: `Bearer ${authToken}`,
375
- },
376
- body: JSON.stringify(parseNoloWorkspaceToolArguments(call.arguments)),
377
- });
378
- const text = await response.text().catch(() => "");
379
- if (!response.ok) {
380
- throw new Error(`taskRun bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
381
- }
382
560
  return {
383
- content: text,
561
+ content: await postServer("/api/task-run", parseNoloWorkspaceToolArguments(call.arguments)),
384
562
  metadata: { serverPlatformTool: true },
385
563
  };
386
564
  },
565
+ ...tableExecutors,
387
566
  };
388
567
  }
389
568
 
@@ -392,9 +571,34 @@ function buildLocalToolExecutors(args: {
392
571
  env: EnvLike;
393
572
  fetchImpl: typeof fetch;
394
573
  localToolExecutors?: CliLocalRuntimeAdapterDeps["localToolExecutors"];
574
+ readXhsProfile?: CliLocalRuntimeAdapterDeps["readXhsProfile"];
395
575
  commandTimeoutMs?: number;
396
576
  commandOutputLimit?: number;
397
577
  }) {
578
+ const resolveCliDefaultXhsArgs = (parsedArgs: any) => {
579
+ if (
580
+ parsedArgs?.profileDir ||
581
+ parsedArgs?.profile_dir ||
582
+ args.env.NOLO_XHS_READER_PROFILE_DIR
583
+ ) {
584
+ return parsedArgs;
585
+ }
586
+ return {
587
+ ...parsedArgs,
588
+ profileDir: resolveDefaultXhsProfileDir({
589
+ env: {
590
+ ...process.env,
591
+ ...args.env,
592
+ NOLO_DESKTOP: "1",
593
+ NOLO_DESKTOP_CHANNEL:
594
+ args.env.NOLO_DESKTOP_CHANNEL?.trim() ||
595
+ args.env.NOLO_XHS_READER_DESKTOP_CHANNEL?.trim() ||
596
+ "stable",
597
+ },
598
+ }),
599
+ };
600
+ };
601
+
398
602
  return {
399
603
  ...createLocalWorkspaceToolExecutors({
400
604
  workspaceRoot: args.workspaceRoot,
@@ -408,6 +612,22 @@ function buildLocalToolExecutors(args: {
408
612
  ...buildCliWorkspaceToolExecutors({
409
613
  env: args.env,
410
614
  }),
615
+ read_xhs_profile: async (call: any) => {
616
+ const parsedArgs = (() => {
617
+ try { return JSON.parse(call.arguments || "{}"); } catch { return {}; }
618
+ })();
619
+ const result = await (args.readXhsProfile ?? readXhsProfileFunc)(
620
+ resolveCliDefaultXhsArgs(parsedArgs),
621
+ undefined,
622
+ );
623
+ return {
624
+ content: JSON.stringify(result.rawData),
625
+ metadata: {
626
+ xhsLocalBridge: true,
627
+ displayData: result.displayData,
628
+ },
629
+ };
630
+ },
411
631
  ...(args.localToolExecutors ?? {}),
412
632
  };
413
633
  }
@@ -493,6 +713,7 @@ export function createCliLocalRuntimeAdapter(
493
713
  env: deps.env,
494
714
  fetchImpl,
495
715
  localToolExecutors: deps.localToolExecutors,
716
+ readXhsProfile: deps.readXhsProfile,
496
717
  ...runtimeToolExecutionLimits,
497
718
  });
498
719
 
@@ -500,11 +721,14 @@ export function createCliLocalRuntimeAdapter(
500
721
  host: "cli",
501
722
  capabilities: ["leveldb-agent-config", "local-provider", "leveldb-persistence", "local-tools"],
502
723
  loadAgentConfig: async (agentRef) => {
503
- const agentConfig = withBuiltinNoloCliTools(await readAgentFromStore({
504
- agentRef,
505
- store: await resolveStore(deps),
506
- userId,
507
- }));
724
+ const agentConfig = withResolvedRuntimeToolSurface(
725
+ await readAgentFromStore({
726
+ agentRef,
727
+ store: await resolveStore(deps),
728
+ userId,
729
+ }),
730
+ deps.env
731
+ );
508
732
  const requestedToolNames = agentConfig
509
733
  ? resolveRequestedRuntimeToolNames({ agentConfig })
510
734
  : [];
@@ -520,6 +744,7 @@ export function createCliLocalRuntimeAdapter(
520
744
  env: deps.env,
521
745
  fetchImpl,
522
746
  localToolExecutors: deps.localToolExecutors,
747
+ readXhsProfile: deps.readXhsProfile,
523
748
  ...runtimeToolExecutionLimits,
524
749
  });
525
750
  return agentConfig;
@@ -537,6 +762,50 @@ export function createCliLocalRuntimeAdapter(
537
762
  cwd: workspaceRoot,
538
763
  }),
539
764
  resolveProvider: async (agentConfig) => {
765
+ if (isCliProviderAgent(agentConfig)) {
766
+ const provider = resolveCliProviderName(agentConfig);
767
+ logLocalRuntimeDiagnostic("provider.selected", {
768
+ agentKey: agentConfig.key,
769
+ transport: "local-cli",
770
+ apiSource: agentConfig.apiSource ?? null,
771
+ provider,
772
+ model: agentConfig.model ?? null,
773
+ cwd: workspaceRoot,
774
+ });
775
+ return {
776
+ model: agentConfig.model || provider,
777
+ complete: async (messages, options) => {
778
+ const executeCli = deps.executeCli ?? (defaultExecuteCli as LocalCliExecutor);
779
+ const imageUrls = collectCliProviderImageInputs(messages);
780
+ const imageInputs: CliImageInput[] | undefined =
781
+ imageUrls.length > 0
782
+ ? imageUrls.map((url) => ({ source: url }))
783
+ : undefined;
784
+ const prompt = buildPromptForCliProvider(messages);
785
+ try {
786
+ const result = await executeCli(provider, prompt, {
787
+ ...(agentConfig.model ? { model: agentConfig.model } : {}),
788
+ ...(options?.timeoutMs ? { timeout: options.timeoutMs } : {}),
789
+ cwd: workspaceRoot,
790
+ yolo: true,
791
+ env: deps.env,
792
+ ...(imageInputs ? { imageInputs } : {}),
793
+ });
794
+ return {
795
+ content: result.text,
796
+ model: agentConfig.model || provider,
797
+ raw: result.raw,
798
+ };
799
+ } catch (error) {
800
+ const message = error instanceof Error ? error.message : String(error);
801
+ throw new Error(
802
+ `Local CLI provider "${provider}" is unavailable or failed: ${message}`
803
+ );
804
+ }
805
+ },
806
+ };
807
+ }
808
+
540
809
  if (shouldUsePlatformChatProvider(deps.env, agentConfig)) {
541
810
  const providerConfig = resolvePlatformChatProviderConfig({
542
811
  agentConfig,
@@ -563,6 +832,7 @@ export function createCliLocalRuntimeAdapter(
563
832
  agentConfig,
564
833
  });
565
834
  const tools = buildOpenAiTools({
835
+ agentKey: agentConfig.key,
566
836
  toolNames: requestedToolNames,
567
837
  env: deps.env,
568
838
  });
@@ -571,7 +841,7 @@ export function createCliLocalRuntimeAdapter(
571
841
  messages,
572
842
  tools,
573
843
  });
574
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
844
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
575
845
  logLocalRuntimeDiagnostic("provider.request.start", {
576
846
  agentKey: agentConfig.key,
577
847
  transport: "platform-proxy",
@@ -582,16 +852,15 @@ export function createCliLocalRuntimeAdapter(
582
852
  toolCount: tools.length,
583
853
  requestedToolNames,
584
854
  openAiToolNames: summarizeOpenAiToolNames(tools),
585
- shellMode: deps.env.NOLO_LOCAL_SHELL_MODE ?? null,
586
855
  timeoutMs: options?.timeoutMs ?? null,
587
856
  });
588
857
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
589
858
  ...request.init,
590
- ...(signal ? { signal } : {}),
859
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
591
860
  }, {
592
861
  sleep: deps.sleep,
593
862
  loopbackRequest,
594
- });
863
+ }).finally(() => timeoutSignal?.clear());
595
864
  const raw = await res.text().catch(() => "");
596
865
  logLocalRuntimeDiagnostic("provider.request.result", {
597
866
  agentKey: agentConfig.key,
@@ -636,6 +905,7 @@ export function createCliLocalRuntimeAdapter(
636
905
  agentConfig,
637
906
  });
638
907
  const tools = buildOpenAiTools({
908
+ agentKey: agentConfig.key,
639
909
  toolNames: requestedToolNames,
640
910
  env: deps.env,
641
911
  });
@@ -644,7 +914,7 @@ export function createCliLocalRuntimeAdapter(
644
914
  messages,
645
915
  tools,
646
916
  });
647
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
917
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
648
918
  logLocalRuntimeDiagnostic("provider.request.start", {
649
919
  agentKey: agentConfig.key,
650
920
  transport: "direct-openai-compatible",
@@ -654,16 +924,15 @@ export function createCliLocalRuntimeAdapter(
654
924
  toolCount: tools.length,
655
925
  requestedToolNames,
656
926
  openAiToolNames: summarizeOpenAiToolNames(tools),
657
- shellMode: deps.env.NOLO_LOCAL_SHELL_MODE ?? null,
658
927
  timeoutMs: options?.timeoutMs ?? null,
659
928
  });
660
929
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
661
930
  ...request.init,
662
- ...(signal ? { signal } : {}),
931
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
663
932
  }, {
664
933
  sleep: deps.sleep,
665
934
  loopbackRequest,
666
- });
935
+ }).finally(() => timeoutSignal?.clear());
667
936
  const raw = await res.text().catch(() => "");
668
937
  logLocalRuntimeDiagnostic("provider.request.result", {
669
938
  agentKey: agentConfig.key,
@@ -7,6 +7,26 @@ import { runLocalAgentTurn } from "../agent-runtime/localLoop";
7
7
  import { createCliLocalRuntimeAdapter } from "./localRuntimeAdapter";
8
8
 
9
9
  describe("CLI local runtime dry run", () => {
10
+ const DEFAULT_PRIVATE_LOCAL_TOOL_NAMES = [
11
+ "listFiles",
12
+ "readFile",
13
+ "writeFile",
14
+ "editFile",
15
+ "searchFiles",
16
+ "execShell",
17
+ "listDialogs",
18
+ "readDialog",
19
+ "listAgents",
20
+ "readAgent",
21
+ "listSpaces",
22
+ "readSpace",
23
+ "readDoc",
24
+ "readSkillDoc",
25
+ "queryTableRows",
26
+ "cliWhoami",
27
+ "cliDoctor",
28
+ ];
29
+
10
30
  test("lets a declared workspace file tool write a file and save the tool trace", async () => {
11
31
  const workspaceRoot = mkdtempSync(join(tmpdir(), "nolo-local-runtime-dry-run-"));
12
32
  try {
@@ -18,7 +38,7 @@ describe("CLI local runtime dry run", () => {
18
38
  prompt: "Use workspace file tools to edit files.",
19
39
  model: "qwen-coder",
20
40
  tools: [
21
- { type: "function", function: { name: "writeWorkspaceFile" } },
41
+ { type: "function", function: { name: "writeFile" } },
22
42
  ],
23
43
  }],
24
44
  ]);
@@ -52,13 +72,7 @@ describe("CLI local runtime dry run", () => {
52
72
  const body = JSON.parse(String(init?.body));
53
73
  completeCount += 1;
54
74
  if (completeCount === 1) {
55
- expect(body.tools.map((tool: any) => tool.function.name)).toEqual([
56
- "writeWorkspaceFile",
57
- "listFiles",
58
- "readFile",
59
- "editFile",
60
- "searchFiles",
61
- ]);
75
+ expect(body.tools.map((tool: any) => tool.function.name)).toEqual(DEFAULT_PRIVATE_LOCAL_TOOL_NAMES);
62
76
  return Response.json({
63
77
  model: "qwen-coder",
64
78
  choices: [{
@@ -68,7 +82,7 @@ describe("CLI local runtime dry run", () => {
68
82
  id: "call-1",
69
83
  type: "function",
70
84
  function: {
71
- name: "writeWorkspaceFile",
85
+ name: "writeFile",
72
86
  arguments: JSON.stringify({
73
87
  path: "src/notification.css",
74
88
  content: ".notification { border-radius: 8px; }\n",
@@ -3,20 +3,20 @@ import { describe, expect, test } from "bun:test";
3
3
  import { executeLocalToolWithPolicy, resolveLocalToolPolicy } from "./localToolPolicy";
4
4
 
5
5
  describe("CLI local tool policy", () => {
6
- test("allows execShell in explicit worktree shell mode", () => {
6
+ test("allows execShell by default", () => {
7
7
  expect(resolveLocalToolPolicy({
8
- env: { NOLO_LOCAL_SHELL_MODE: "worktree" },
8
+ env: {},
9
9
  agentToolNames: [],
10
10
  toolName: "execShell",
11
11
  })).toEqual({ allowed: true, toolName: "execShell" });
12
12
  });
13
13
 
14
- test("blocks execShell unless explicit shell mode is enabled", () => {
14
+ test("allows execShell even without env allowlist", () => {
15
15
  expect(resolveLocalToolPolicy({
16
16
  env: { NOLO_LOCAL_ALLOWED_TOOLS: "execShell" },
17
17
  agentToolNames: ["execShell"],
18
18
  toolName: "execShell",
19
- })).toMatchObject({ allowed: false });
19
+ })).toEqual({ allowed: true, toolName: "execShell" });
20
20
  });
21
21
 
22
22
  test("requires both env allowlist and agent declaration", () => {