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
@@ -42,8 +42,14 @@ import {
42
42
  type HybridRecordStore,
43
43
  } from "./hybridRecordStore";
44
44
  import { executeLocalToolWithPolicy } from "./localToolPolicy";
45
- import { taskRunFunctionSchema } from "../ai/tools/agent/taskRunTool";
45
+ import { inferCaptureIntent } from "../ai/policy/runtimePolicy";
46
+ import { TOOL_PACKS } from "../ai/tools/toolPacks";
47
+ import { prepareTools } from "../ai/tools/prepareTools";
46
48
  import {
49
+ LOCAL_CODEX_AGENT_ID,
50
+ LOCAL_CODEX_AGENT_KEY,
51
+ LOCAL_QODER_AGENT_ID,
52
+ LOCAL_QODER_AGENT_KEY,
47
53
  MIMO_MONTH_AGENT_KEY,
48
54
  NOLO_DEFAULT_AGENT_ID,
49
55
  NOLO_DEFAULT_AGENT_KEY,
@@ -56,6 +62,14 @@ import {
56
62
  } from "../agent-runtime/noloWorkspaceTools";
57
63
  import { executeCli as defaultExecuteCli, type CliExecuteResult, type CliImageInput } from "../ai/agent/cliExecutor";
58
64
  import { buildCliPrompt } from "../ai/agent/cliPrompt";
65
+ import {
66
+ readXhsProfileFunc,
67
+ readXhsProfileFunctionSchema,
68
+ } from "../ai/tools/readXhsProfileTool";
69
+ import {
70
+ readXPostFunc,
71
+ readXPostFunctionSchema,
72
+ } from "../ai/tools/readXPostTool";
59
73
 
60
74
  type EnvLike = Record<string, string | undefined>;
61
75
  type FetchInput = Parameters<typeof fetch>[0];
@@ -78,6 +92,14 @@ export const BUILTIN_NOLO_AGENT_ID = NOLO_DEFAULT_AGENT_ID;
78
92
  export const BUILTIN_NOLO_AGENT_KEY = NOLO_DEFAULT_AGENT_KEY;
79
93
  const CLI_DIR = dirname(fileURLToPath(import.meta.url));
80
94
  const CLI_ENTRYPOINT = join(CLI_DIR, "..", "index.ts");
95
+ const LOCAL_SERVER_TABLE_TOOL_NAMES = [
96
+ "createTable",
97
+ "addTableRow",
98
+ "addTableRows",
99
+ "updateTableRow",
100
+ "updateTableRows",
101
+ ] as const;
102
+ const LOCAL_SERVER_TABLE_TOOL_NAME_SET = new Set<string>(LOCAL_SERVER_TABLE_TOOL_NAMES);
81
103
 
82
104
  export type CliLocalRuntimeDb = CliKvDb;
83
105
 
@@ -91,6 +113,8 @@ export type CliLocalRuntimeAdapterDeps = {
91
113
  cwd?: string;
92
114
  output?: { write(chunk: string): unknown };
93
115
  localToolExecutors?: Record<string, (call: any) => Promise<{ content: string; metadata?: Record<string, unknown> }>>;
116
+ readXPost?: typeof readXPostFunc;
117
+ readXhsProfile?: typeof readXhsProfileFunc;
94
118
  executeCli?: LocalCliExecutor;
95
119
  sleep?: (ms: number) => Promise<void>;
96
120
  loopbackRequest?: (input: FetchInput, init?: FetchInit) => Promise<Response>;
@@ -108,6 +132,55 @@ function resolveLocalUserId(env: EnvLike) {
108
132
  return env.NOLO_LOCAL_USER_ID || env.NOLO_USER_ID || "local";
109
133
  }
110
134
 
135
+ function resolveBuiltinLocalCliAgentConfig(agentRef: string, userId: string): AgentRuntimeAgentConfig | null {
136
+ const normalized = agentRef.trim();
137
+ if (normalized === LOCAL_CODEX_AGENT_KEY || normalized === LOCAL_CODEX_AGENT_ID) {
138
+ return {
139
+ key: LOCAL_CODEX_AGENT_KEY,
140
+ name: "Local Codex",
141
+ prompt: "You are a local Codex CLI coding agent. Use the workspace and dialog evidence available to you, keep changes scoped, run relevant checks, and report worktree, branch, commit or dirty diff, tests, and blockers.",
142
+ apiSource: "cli",
143
+ provider: "cli",
144
+ cliProvider: "codex",
145
+ toolNames: ["readFile", "searchFiles", "execShell"],
146
+ rawRecord: {
147
+ dbKey: LOCAL_CODEX_AGENT_KEY,
148
+ id: LOCAL_CODEX_AGENT_ID,
149
+ userId,
150
+ type: "agent",
151
+ name: "Local Codex",
152
+ apiSource: "cli",
153
+ provider: "cli",
154
+ cliProvider: "codex",
155
+ },
156
+ };
157
+ }
158
+ if (normalized === LOCAL_QODER_AGENT_KEY || normalized === LOCAL_QODER_AGENT_ID) {
159
+ return {
160
+ key: LOCAL_QODER_AGENT_KEY,
161
+ name: "Local Qoder",
162
+ prompt: "You are a local Qoder CLI coding agent. Use the workspace and dialog evidence available to you, keep changes scoped, run relevant checks, and report worktree, branch, commit or dirty diff, tests, and blockers.",
163
+ apiSource: "cli",
164
+ provider: "cli",
165
+ cliProvider: "qoder",
166
+ model: "Qwen3.7-Max",
167
+ toolNames: ["readFile", "searchFiles", "execShell"],
168
+ rawRecord: {
169
+ dbKey: LOCAL_QODER_AGENT_KEY,
170
+ id: LOCAL_QODER_AGENT_ID,
171
+ userId,
172
+ type: "agent",
173
+ name: "Local Qoder",
174
+ apiSource: "cli",
175
+ provider: "cli",
176
+ cliProvider: "qoder",
177
+ model: "Qwen3.7-Max",
178
+ },
179
+ };
180
+ }
181
+ return null;
182
+ }
183
+
111
184
  function parseLocalToolBudgets(env: EnvLike) {
112
185
  const raw = env.NOLO_LOCAL_TOOL_BUDGETS?.trim();
113
186
  if (!raw) return {};
@@ -235,12 +308,14 @@ function buildRequestTimeoutSignal(timeoutMs?: number) {
235
308
  if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
236
309
  return undefined;
237
310
  }
238
- if (typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function") {
239
- return AbortSignal.timeout(timeoutMs);
240
- }
241
311
  const controller = new AbortController();
242
- setTimeout(() => controller.abort(new Error(`request timed out after ${timeoutMs}ms`)), timeoutMs);
243
- return controller.signal;
312
+ const timeout = setTimeout(() => {
313
+ controller.abort(new Error(`request timed out after ${timeoutMs}ms`));
314
+ }, timeoutMs);
315
+ return {
316
+ signal: controller.signal,
317
+ clear: () => clearTimeout(timeout),
318
+ };
244
319
  }
245
320
 
246
321
  function summarizeEndpoint(value: unknown) {
@@ -353,6 +428,25 @@ function shouldExposeLocalPlatformTools(agentKey?: string) {
353
428
  return agentKey !== MIMO_MONTH_AGENT_KEY;
354
429
  }
355
430
 
431
+ function addDefaultLightWebToolsForConfiguredAgents(
432
+ toolNames: string[],
433
+ agentConfig?: AgentRuntimeAgentConfig | null,
434
+ ) {
435
+ const explicitToolNames = Array.isArray((agentConfig as any)?.toolSurface?.explicitToolNames)
436
+ ? (agentConfig as any).toolSurface.explicitToolNames
437
+ : agentConfig?.toolNames;
438
+ if (!Array.isArray(explicitToolNames) || explicitToolNames.length === 0) return toolNames;
439
+ const webCapable = explicitToolNames.some((toolName) =>
440
+ toolName === "fetchWebpage" ||
441
+ toolName === "exa_search" ||
442
+ toolName === "read_x_post" ||
443
+ toolName === "read_xhs_profile" ||
444
+ toolName.startsWith("browser_")
445
+ );
446
+ if (!webCapable) return toolNames;
447
+ return [...new Set([...toolNames, ...TOOL_PACKS.LIGHT_WEB])];
448
+ }
449
+
356
450
  function buildOpenAiTools(args: { agentKey?: string; toolNames?: string[]; env: EnvLike }) {
357
451
  const toolset = buildLocalWorkspaceToolsetForEnv(args);
358
452
  const exposePlatformTools = shouldExposeLocalPlatformTools(args.agentKey);
@@ -360,6 +454,14 @@ function buildOpenAiTools(args: { agentKey?: string; toolNames?: string[]; env:
360
454
  ...buildLocalWorkspaceOpenAiTools({
361
455
  toolNames: toolset.toolNames,
362
456
  exposeShellTools: toolset.exposeShellTools,
457
+ listFilesDescriptionVariant: resolveListFilesDescriptionVariant(args.env),
458
+ listFilesParameterVariant: resolveListFilesParameterVariant(args.env),
459
+ readFileDescriptionVariant: resolveReadFileDescriptionVariant(args.env),
460
+ readFileParameterVariant: resolveReadFileParameterVariant(args.env),
461
+ globFilesDescriptionVariant: resolveGlobFilesDescriptionVariant(args.env),
462
+ globFilesParameterVariant: resolveGlobFilesParameterVariant(args.env),
463
+ searchFilesDescriptionVariant: resolveSearchFilesDescriptionVariant(args.env),
464
+ searchFilesParameterVariant: resolveSearchFilesParameterVariant(args.env),
363
465
  }),
364
466
  ...(exposePlatformTools ? buildServerPlatformOpenAiTools({ toolNames: args.toolNames }) : []),
365
467
  ...(exposePlatformTools ? buildNoloWorkspaceOpenAiTools({ toolNames: args.toolNames }) : []),
@@ -367,35 +469,94 @@ function buildOpenAiTools(args: { agentKey?: string; toolNames?: string[]; env:
367
469
  }
368
470
 
369
471
  function buildLocalWorkspaceToolsetForEnv(args: { toolNames?: string[]; env: EnvLike }) {
370
- void args.env;
371
472
  const toolset = buildLocalWorkspaceToolset({
372
473
  declaredToolNames: args.toolNames,
373
474
  exposeShellTools: true,
475
+ useDeclaredToolNamesOnly: shouldUseDeclaredOnlyLocalWorkspaceTools(args.env),
374
476
  });
375
477
  return toolset;
376
478
  }
377
479
 
378
480
  function buildLocalPolicyToolNames(args: { toolNames?: string[]; env: EnvLike }) {
379
- void args.env;
380
481
  return [
381
482
  ...buildLocalWorkspacePolicyToolNames({
382
483
  declaredToolNames: args.toolNames,
383
484
  exposeShellTools: true,
485
+ useDeclaredToolNamesOnly: shouldUseDeclaredOnlyLocalWorkspaceTools(args.env),
384
486
  }),
385
- ...((args.toolNames ?? []).includes("taskRun") ? ["taskRun"] : []),
487
+ ...((args.toolNames ?? []).includes("read_x_post") ? ["read_x_post"] : []),
488
+ ...((args.toolNames ?? []).includes("read_xhs_profile") ? ["read_xhs_profile"] : []),
489
+ ...(args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
386
490
  ...filterNoloWorkspaceToolNames(args.toolNames),
387
491
  ];
388
492
  }
389
493
 
494
+ function shouldUseDeclaredOnlyLocalWorkspaceTools(env: EnvLike) {
495
+ const value = env.NOLO_LOCAL_WORKSPACE_TOOLSET || env.NOLO_LOCAL_TOOLSET_MODE || "";
496
+ return value === "declared-only" || value === "declared";
497
+ }
498
+
499
+ function resolveGlobFilesDescriptionVariant(env: EnvLike) {
500
+ return resolveLocalWorkspaceDescriptionVariant(env.NOLO_GLOBFILES_DESCRIPTION_VARIANT);
501
+ }
502
+
503
+ function resolveListFilesDescriptionVariant(env: EnvLike) {
504
+ return resolveLocalWorkspaceDescriptionVariant(env.NOLO_LISTFILES_DESCRIPTION_VARIANT);
505
+ }
506
+
507
+ function resolveListFilesParameterVariant(env: EnvLike) {
508
+ return resolveLocalWorkspaceParameterVariant(env.NOLO_LISTFILES_PARAMETER_VARIANT);
509
+ }
510
+
511
+ function resolveReadFileDescriptionVariant(env: EnvLike) {
512
+ return resolveLocalWorkspaceDescriptionVariant(env.NOLO_READFILE_DESCRIPTION_VARIANT);
513
+ }
514
+
515
+ function resolveReadFileParameterVariant(env: EnvLike) {
516
+ return resolveLocalWorkspaceParameterVariant(env.NOLO_READFILE_PARAMETER_VARIANT);
517
+ }
518
+
519
+ function resolveGlobFilesParameterVariant(env: EnvLike) {
520
+ return resolveLocalWorkspaceParameterVariant(env.NOLO_GLOBFILES_PARAMETER_VARIANT);
521
+ }
522
+
523
+ function resolveSearchFilesDescriptionVariant(env: EnvLike) {
524
+ return resolveLocalWorkspaceDescriptionVariant(env.NOLO_SEARCHFILES_DESCRIPTION_VARIANT);
525
+ }
526
+
527
+ function resolveSearchFilesParameterVariant(env: EnvLike) {
528
+ return resolveLocalWorkspaceParameterVariant(env.NOLO_SEARCHFILES_PARAMETER_VARIANT);
529
+ }
530
+
531
+ function resolveLocalWorkspaceDescriptionVariant(value: string | undefined) {
532
+ return value === "brief" || value === "strategy" || value === "workflow" || value === "antiShell"
533
+ ? value
534
+ : "strategy";
535
+ }
536
+
537
+ function resolveLocalWorkspaceParameterVariant(value: string | undefined) {
538
+ return value === "minimal" || value === "scoped" || value === "rich" ? value : "rich";
539
+ }
540
+
390
541
  function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
391
542
  const toolNames = new Set(args.toolNames ?? []);
543
+ const tableTools = prepareTools(
544
+ (args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
545
+ );
392
546
  return [
393
- ...(toolNames.has("taskRun")
547
+ ...(toolNames.has("read_xhs_profile")
394
548
  ? [{
395
549
  type: "function",
396
- function: taskRunFunctionSchema,
550
+ function: readXhsProfileFunctionSchema,
397
551
  }]
398
552
  : []),
553
+ ...(toolNames.has("read_x_post")
554
+ ? [{
555
+ type: "function",
556
+ function: readXPostFunctionSchema,
557
+ }]
558
+ : []),
559
+ ...tableTools,
399
560
  ];
400
561
  }
401
562
 
@@ -467,30 +628,65 @@ function buildServerPlatformToolExecutors(args: {
467
628
  env: EnvLike;
468
629
  fetchImpl: typeof fetch;
469
630
  }) {
470
- return {
471
- taskRun: async (call: any) => {
472
- const serverUrl = resolveRuntimeServerUrl(args.env);
473
- const authToken = resolveRuntimeAuthToken(args.env);
474
- if (!serverUrl) throw new Error("taskRun requires NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
475
- if (!authToken) throw new Error("taskRun requires AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
476
- const response = await args.fetchImpl(`${serverUrl}/api/task-run`, {
477
- method: "POST",
478
- headers: {
479
- "Content-Type": "application/json",
480
- Authorization: `Bearer ${authToken}`,
481
- },
482
- body: JSON.stringify(parseNoloWorkspaceToolArguments(call.arguments)),
483
- });
484
- const text = await response.text().catch(() => "");
485
- if (!response.ok) {
486
- throw new Error(`taskRun bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
487
- }
488
- return {
489
- content: text,
490
- metadata: { serverPlatformTool: true },
491
- };
492
- },
631
+ const postServer = async (path: string, body: object) => {
632
+ const serverUrl = resolveRuntimeServerUrl(args.env);
633
+ const authToken = resolveRuntimeAuthToken(args.env);
634
+ if (!serverUrl) throw new Error("server platform tools require NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
635
+ if (!authToken) throw new Error("server platform tools require AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
636
+ const response = await args.fetchImpl(`${serverUrl}${path}`, {
637
+ method: "POST",
638
+ headers: {
639
+ "Content-Type": "application/json",
640
+ Authorization: `Bearer ${authToken}`,
641
+ },
642
+ body: JSON.stringify(body),
643
+ });
644
+ const text = await response.text().catch(() => "");
645
+ if (!response.ok) {
646
+ throw new Error(`server platform tool bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
647
+ }
648
+ return text;
649
+ };
650
+ const guardExplicitTableCapture = (call: any) => {
651
+ if (inferCaptureIntent(String(call.userInput ?? "")) === "strong") return null;
652
+ return JSON.stringify({
653
+ error: "knowledge_capture_requires_confirmation",
654
+ message:
655
+ "当前本地运行不允许自动写入表格。只有当用户在当前请求里明确要求保存、建表、写入 table 或做成数据集时,才能继续;否则请先询问用户。",
656
+ policy: {
657
+ capability: "knowledge_capture",
658
+ target: "table",
659
+ mode: "explicit-only-local",
660
+ },
661
+ });
493
662
  };
663
+ const tableExecutors = Object.fromEntries(
664
+ LOCAL_SERVER_TABLE_TOOL_NAMES.map((toolName) => [
665
+ toolName,
666
+ async (call: any) => {
667
+ const blocked = guardExplicitTableCapture(call);
668
+ if (blocked) {
669
+ return {
670
+ content: blocked,
671
+ metadata: { serverPlatformTool: true, tableWriteBlocked: true },
672
+ };
673
+ }
674
+ const parsed = parseNoloWorkspaceToolArguments(call.arguments);
675
+ const path =
676
+ toolName === "createTable" ? "/api/table/create"
677
+ : toolName === "addTableRow" ? "/api/table/add-row"
678
+ : toolName === "addTableRows" ? "/api/table/add-rows"
679
+ : toolName === "updateTableRow" ? "/api/table/update-row"
680
+ : "/api/table/update-rows";
681
+ const content = await postServer(path, parsed);
682
+ return {
683
+ content,
684
+ metadata: { serverPlatformTool: true, tableWrite: true },
685
+ };
686
+ },
687
+ ]),
688
+ );
689
+ return tableExecutors;
494
690
  }
495
691
 
496
692
  function buildLocalToolExecutors(args: {
@@ -498,6 +694,8 @@ function buildLocalToolExecutors(args: {
498
694
  env: EnvLike;
499
695
  fetchImpl: typeof fetch;
500
696
  localToolExecutors?: CliLocalRuntimeAdapterDeps["localToolExecutors"];
697
+ readXPost?: CliLocalRuntimeAdapterDeps["readXPost"];
698
+ readXhsProfile?: CliLocalRuntimeAdapterDeps["readXhsProfile"];
501
699
  commandTimeoutMs?: number;
502
700
  commandOutputLimit?: number;
503
701
  }) {
@@ -514,6 +712,38 @@ function buildLocalToolExecutors(args: {
514
712
  ...buildCliWorkspaceToolExecutors({
515
713
  env: args.env,
516
714
  }),
715
+ read_x_post: async (call: any) => {
716
+ const parsedArgs = (() => {
717
+ try { return JSON.parse(call.arguments || "{}"); } catch { return {}; }
718
+ })();
719
+ const result = await (args.readXPost ?? readXPostFunc)(
720
+ parsedArgs,
721
+ undefined,
722
+ );
723
+ return {
724
+ content: JSON.stringify(result.rawData),
725
+ metadata: {
726
+ xPostLocalBridge: true,
727
+ displayData: result.displayData,
728
+ },
729
+ };
730
+ },
731
+ read_xhs_profile: async (call: any) => {
732
+ const parsedArgs = (() => {
733
+ try { return JSON.parse(call.arguments || "{}"); } catch { return {}; }
734
+ })();
735
+ const result = await (args.readXhsProfile ?? readXhsProfileFunc)(
736
+ parsedArgs,
737
+ undefined,
738
+ );
739
+ return {
740
+ content: JSON.stringify(result.rawData),
741
+ metadata: {
742
+ xhsLocalBridge: true,
743
+ displayData: result.displayData,
744
+ },
745
+ };
746
+ },
517
747
  ...(args.localToolExecutors ?? {}),
518
748
  };
519
749
  }
@@ -599,6 +829,8 @@ export function createCliLocalRuntimeAdapter(
599
829
  env: deps.env,
600
830
  fetchImpl,
601
831
  localToolExecutors: deps.localToolExecutors,
832
+ readXPost: deps.readXPost,
833
+ readXhsProfile: deps.readXhsProfile,
602
834
  ...runtimeToolExecutionLimits,
603
835
  });
604
836
 
@@ -606,16 +838,22 @@ export function createCliLocalRuntimeAdapter(
606
838
  host: "cli",
607
839
  capabilities: ["leveldb-agent-config", "local-provider", "leveldb-persistence", "local-tools"],
608
840
  loadAgentConfig: async (agentRef) => {
841
+ const storedAgentConfig = await readAgentFromStore({
842
+ agentRef,
843
+ store: await resolveStore(deps),
844
+ userId,
845
+ });
846
+ const fallbackLocalCliAgentConfig =
847
+ storedAgentConfig ? null : resolveBuiltinLocalCliAgentConfig(agentRef, userId);
609
848
  const agentConfig = withResolvedRuntimeToolSurface(
610
- await readAgentFromStore({
611
- agentRef,
612
- store: await resolveStore(deps),
613
- userId,
614
- }),
849
+ storedAgentConfig ?? fallbackLocalCliAgentConfig,
615
850
  deps.env
616
851
  );
617
852
  const requestedToolNames = agentConfig
618
- ? resolveRequestedRuntimeToolNames({ agentConfig })
853
+ ? addDefaultLightWebToolsForConfiguredAgents(
854
+ resolveRequestedRuntimeToolNames({ agentConfig }),
855
+ agentConfig,
856
+ )
619
857
  : [];
620
858
  activeAgentToolNames = buildLocalPolicyToolNames({
621
859
  toolNames: requestedToolNames,
@@ -629,6 +867,8 @@ export function createCliLocalRuntimeAdapter(
629
867
  env: deps.env,
630
868
  fetchImpl,
631
869
  localToolExecutors: deps.localToolExecutors,
870
+ readXPost: deps.readXPost,
871
+ readXhsProfile: deps.readXhsProfile,
632
872
  ...runtimeToolExecutionLimits,
633
873
  });
634
874
  return agentConfig;
@@ -712,9 +952,10 @@ export function createCliLocalRuntimeAdapter(
712
952
  return {
713
953
  model: providerConfig.model,
714
954
  complete: async (messages, options) => {
715
- const requestedToolNames = resolveRequestedRuntimeToolNames({
955
+ const requestedToolNames = addDefaultLightWebToolsForConfiguredAgents(
956
+ resolveRequestedRuntimeToolNames({ agentConfig }),
716
957
  agentConfig,
717
- });
958
+ );
718
959
  const tools = buildOpenAiTools({
719
960
  agentKey: agentConfig.key,
720
961
  toolNames: requestedToolNames,
@@ -725,7 +966,7 @@ export function createCliLocalRuntimeAdapter(
725
966
  messages,
726
967
  tools,
727
968
  });
728
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
969
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
729
970
  logLocalRuntimeDiagnostic("provider.request.start", {
730
971
  agentKey: agentConfig.key,
731
972
  transport: "platform-proxy",
@@ -740,11 +981,11 @@ export function createCliLocalRuntimeAdapter(
740
981
  });
741
982
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
742
983
  ...request.init,
743
- ...(signal ? { signal } : {}),
984
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
744
985
  }, {
745
986
  sleep: deps.sleep,
746
987
  loopbackRequest,
747
- });
988
+ }).finally(() => timeoutSignal?.clear());
748
989
  const raw = await res.text().catch(() => "");
749
990
  logLocalRuntimeDiagnostic("provider.request.result", {
750
991
  agentKey: agentConfig.key,
@@ -785,9 +1026,10 @@ export function createCliLocalRuntimeAdapter(
785
1026
  return {
786
1027
  model: providerConfig.model,
787
1028
  complete: async (messages, options) => {
788
- const requestedToolNames = resolveRequestedRuntimeToolNames({
1029
+ const requestedToolNames = addDefaultLightWebToolsForConfiguredAgents(
1030
+ resolveRequestedRuntimeToolNames({ agentConfig }),
789
1031
  agentConfig,
790
- });
1032
+ );
791
1033
  const tools = buildOpenAiTools({
792
1034
  agentKey: agentConfig.key,
793
1035
  toolNames: requestedToolNames,
@@ -798,7 +1040,7 @@ export function createCliLocalRuntimeAdapter(
798
1040
  messages,
799
1041
  tools,
800
1042
  });
801
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
1043
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
802
1044
  logLocalRuntimeDiagnostic("provider.request.start", {
803
1045
  agentKey: agentConfig.key,
804
1046
  transport: "direct-openai-compatible",
@@ -812,11 +1054,11 @@ export function createCliLocalRuntimeAdapter(
812
1054
  });
813
1055
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
814
1056
  ...request.init,
815
- ...(signal ? { signal } : {}),
1057
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
816
1058
  }, {
817
1059
  sleep: deps.sleep,
818
1060
  loopbackRequest,
819
- });
1061
+ }).finally(() => timeoutSignal?.clear());
820
1062
  const raw = await res.text().catch(() => "");
821
1063
  logLocalRuntimeDiagnostic("provider.request.result", {
822
1064
  agentKey: agentConfig.key,
@@ -14,6 +14,7 @@ export const COMMANDS: CommandEntry[] = [
14
14
  ];
15
15
 
16
16
  export const GROUP_ORDER = [
17
+ "run",
17
18
  "chat",
18
19
  "doc",
19
20
  "skill-doc",
@@ -21,9 +22,9 @@ export const GROUP_ORDER = [
21
22
  "agent",
22
23
  "doctor",
23
24
  "dialog",
25
+ "memory",
24
26
  "space",
25
27
  "table",
26
- "task-run",
27
28
  "llama",
28
29
  "model-runtime",
29
30
  "dev",
@@ -55,23 +56,25 @@ export function renderHelpText() {
55
56
  " nolo doctor",
56
57
  " nolo doctor runtime",
57
58
  " nolo update",
59
+ ' nolo run "review this repository" # no Nolo login required; uses local Codex CLI',
58
60
  ' nolo doc create --title "Trip Notes" --body "hello" --sync local,us --dry-run',
59
61
  ' nolo skill-doc create --title "Agent Query Skill" --description "Inspect recent agent dialogs" --sync local,main,us',
60
62
  " nolo agent list --json",
61
63
  " nolo space list --json",
62
64
  " nolo agent pull agent-pub-01APPBUILDER00000001YAII3I",
63
- " nolo agent read agent-pub-01APPBUILDER00000001YAII3I",
64
- ' nolo agent run frontend-implementer --msg "polish notifications"',
65
+ " nolo agent read agent-pub-01APPBUILDER00000001YAII3I",
66
+ " nolo agent usage qoder",
67
+ ' nolo agent run frontend-implementer --msg "polish notifications"',
65
68
  " nolo agent bind-current agent-user-1-agent-1",
66
69
  " nolo agent runtime-doctor agent-user-1-agent-1",
67
70
  ' nolo agent smoke-current agent-user-1-agent-1 --msg "ping"',
68
71
  ' nolo chat --agent agent-pub-01APPBUILDER00000001YAII3I --msg "你好"',
72
+ " nolo memory delete --source-dialog 01ABC... --yes --json",
69
73
  " nolo space read 01KKY77TT0DA9NY7TNW3R7255N --content-key page-user-id --brief",
70
74
  " nolo space delete --name-prefix rn_owner_verify_0504 --yes",
71
75
  " nolo table query --table 01ABCXYZ",
72
76
  ' nolo table query --table meta-0e95801d90-NOLOTASKBOARD --columns \'["title","status","owner","priority","codeStatus"]\' --no-base-fields --output items',
73
77
  ' nolo table update-row --table meta-0e95801d90-NOLOTASKBOARD --row 01ROWID --changes \'{"status":"已完成"}\'',
74
- " nolo task-run read-context --row-dbkey row-user-table-row",
75
78
  " nolo llama status",
76
79
  ];
77
80
 
@@ -17,19 +17,20 @@ type CommandProbe = {
17
17
  args: string[];
18
18
  };
19
19
 
20
- const COMMAND_CAPABILITIES: Array<[probes: CommandProbe[], capability: string]> = [
21
- [[{ command: "codex", args: ["--version"] }], "codex-cli"],
22
- [[{ command: "claude", args: ["--version"] }], "claude-code"],
20
+ const COMMAND_CAPABILITIES: Array<[probes: CommandProbe[], capabilities: string[]]> = [
21
+ [[{ command: "codex", args: ["--version"] }], ["codex-cli"]],
22
+ [[{ command: "claude", args: ["--version"] }], ["claude-code"]],
23
23
  [
24
24
  [
25
25
  { command: "gh", args: ["--version"] },
26
26
  { command: "gh", args: ["copilot", "--", "--help"] },
27
27
  ],
28
- "copilot-cli",
28
+ ["copilot-cli"],
29
29
  ],
30
- [[{ command: "gemini", args: ["--version"] }], "gemini-cli"],
31
- [[{ command: "kimi", args: ["--version"] }], "kimi-cli"],
32
- [[{ command: "agy", args: ["--help"] }], "agy-cli"],
30
+ [[{ command: "gemini", args: ["--version"] }], ["gemini-cli"]],
31
+ [[{ command: "kimi", args: ["--version"] }], ["kimi-cli"]],
32
+ [[{ command: "agy", args: ["--help"] }], ["agy-cli"]],
33
+ [[{ command: "qoder", args: ["--version"] }], ["qoder-cli", "qoder-usage"]],
33
34
  ];
34
35
 
35
36
  function defaultCommandExists(command: string) {
@@ -58,12 +59,12 @@ export function detectRuntimeCapabilities(
58
59
  const env = options.env ?? process.env;
59
60
  const capabilities: string[] = [];
60
61
 
61
- for (const [probes, capability] of COMMAND_CAPABILITIES) {
62
+ for (const [probes, detectedCapabilities] of COMMAND_CAPABILITIES) {
62
63
  if (!probes.every((probe) => commandExists(probe.command))) continue;
63
64
  if (options.probeLaunchable && !probes.every((probe) => commandLaunchable(probe.command, probe.args))) {
64
65
  continue;
65
66
  }
66
- capabilities.push(capability);
67
+ capabilities.push(...detectedCapabilities);
67
68
  }
68
69
 
69
70
  if (env.NOLO_LOCAL_LLM_ENDPOINT || env.LLAMA_SERVER_URL) {