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
@@ -0,0 +1,38 @@
1
+ import type { ReferenceItem } from "../../../app/types";
2
+
3
+ export type GuidedAgentCapabilityId =
4
+ | "webSearch"
5
+ | "docs"
6
+ | "tables"
7
+ | "agents"
8
+ | "apps";
9
+
10
+ export type GuidedAgentReferenceChoice = ReferenceItem & {
11
+ selected: boolean;
12
+ reason?: string;
13
+ };
14
+
15
+ export type GuidedAgentDraft = {
16
+ name: string;
17
+ introduction: string;
18
+ prompt: string;
19
+ promptSummary: string;
20
+ provider: string;
21
+ model: string;
22
+ isPublic: boolean;
23
+ capabilityIds: GuidedAgentCapabilityId[];
24
+ toolIds: string[];
25
+ references: GuidedAgentReferenceChoice[];
26
+ tags: string[];
27
+ unresolved: string[];
28
+ };
29
+
30
+ export type GuidedAgentAssistantMessage = {
31
+ id: string;
32
+ role: "user" | "assistant";
33
+ content: string;
34
+ };
35
+
36
+ export type GuidedAgentValidationResult =
37
+ | { ok: true }
38
+ | { ok: false; missing: string[] };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Predicate: does this agent only support live audio mode and
3
+ * cannot be used through normal text chat completions?
4
+ *
5
+ * Returns `true` when the agent's model is a live-preview variant that
6
+ * will fail if sent through ordinary OpenAI-compatible text completions.
7
+ */
8
+ export function isLiveAudioOnlyAgent(agent: {
9
+ defaultInteractionMode?: string;
10
+ provider?: string;
11
+ model?: string;
12
+ }): boolean {
13
+ if (agent.defaultInteractionMode !== "live_audio") return false;
14
+
15
+ const provider = String(agent.provider || "").toLowerCase();
16
+ const model = String(agent.model || "").toLowerCase();
17
+
18
+ // Google live-preview models are live-only
19
+ if (provider === "google" && model.includes("live")) return true;
20
+
21
+ // Gemini Live / native audio models are live-only.
22
+ if (model.includes("live-preview") || model.includes("live-001")) return true;
23
+ if (model.includes("native-audio")) return true;
24
+
25
+ return false;
26
+ }
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_GOOGLE_LIVE_AUDIO_MODEL =
2
+ "gemini-2.5-flash-native-audio-preview-12-2025";
@@ -0,0 +1,75 @@
1
+ export const PAGE_BUILDER_AGENT_PUBLIC_KEY =
2
+ "agent-pub-01PAGEBUILDR00000000FT7R9G";
3
+
4
+ export type PageBuilderScenario = {
5
+ id: string;
6
+ label: string;
7
+ userIntent: string;
8
+ prompt: string;
9
+ };
10
+
11
+ export const PAGE_BUILDER_SCENARIOS: PageBuilderScenario[] = [
12
+ {
13
+ id: "information-display",
14
+ label: "信息展示",
15
+ userIntent: "主页、产品介绍、服务介绍、作品集、活动页、报价页",
16
+ prompt:
17
+ "帮我做一个独立 AI 产品顾问的个人主页。要看起来专业,包含个人定位、能提供的服务卡片、代表成果卡片、可信背书和联系合作按钮。",
18
+ },
19
+ {
20
+ id: "data-analysis",
21
+ label: "数据分析",
22
+ userIntent: "日报、周报、经营看板、质检报告、销售漏斗、反馈分析",
23
+ prompt:
24
+ "帮我做一个 AI 客服质检日报,包含核心指标、近 7 天风险趋势、异常会话明细表,以及明天需要跟进的建议。",
25
+ },
26
+ {
27
+ id: "process-guide",
28
+ label: "流程说明",
29
+ userIntent: "教程、SOP、onboarding、操作指南、课程步骤、申请流程",
30
+ prompt:
31
+ "帮我做一个新员工使用 CRM 的交互教程页面,包含学习目标、操作步骤、示例练习、检查清单和下一步按钮。",
32
+ },
33
+ {
34
+ id: "decision-comparison",
35
+ label: "决策比较",
36
+ userIntent: "方案对比、产品选型、候选人对比、竞品分析、采购建议",
37
+ prompt:
38
+ "帮我做一个三款 CRM 方案对比页,包含对比维度表格、每个方案的优缺点卡片、评分、适合团队类型和最终推荐。",
39
+ },
40
+ {
41
+ id: "plan-roadmap",
42
+ label: "计划排布",
43
+ userIntent: "项目计划、学习计划、健身计划、内容日历、发布节奏",
44
+ prompt:
45
+ "帮我做一个 30 天内容发布计划页面,包含阶段目标、每周任务、优先级、里程碑卡片和风险提醒。",
46
+ },
47
+ {
48
+ id: "mixed-pitch",
49
+ label: "混合长尾",
50
+ userIntent: "汇报页、融资材料、复杂项目概览,混合展示、数据、计划、对比",
51
+ prompt:
52
+ "给一个早期 AI 客服创业项目做一页融资汇报页,包含市场机会、关键数据指标卡、增长趋势图、产品路线、竞品对比表、团队介绍和下一步计划。",
53
+ },
54
+ ];
55
+
56
+ const scenarioLines = PAGE_BUILDER_SCENARIOS.map(
57
+ (scenario) => `- ${scenario.label}:${scenario.userIntent}`
58
+ ).join("\n");
59
+
60
+ export const PAGE_BUILDER_HANDOFF_INSTRUCTIONS = `--- 页面生成助手 handoff ---
61
+ 当用户需要把内容变成“可看的页面/报告/看板/教程/对比页/计划页”时,可以把本轮交给页面生成助手。
62
+
63
+ 目标 Agent:
64
+ - agentKey: ${PAGE_BUILDER_AGENT_PUBLIC_KEY}
65
+ - 推荐工具: runStreamingAgent
66
+
67
+ 适合 handoff 的视觉意图大类:
68
+ ${scenarioLines}
69
+
70
+ 调用边界:
71
+ - 用户明确要求“做成页面 / 看板 / 报告 / 教程 / 主页 / 对比页 / 计划表 / 可视化”时,可以直接 runStreamingAgent。
72
+ - 如果用户只是讨论内容,但你判断“文字回答不如可视化页面”,先询问用户:“这个更适合做成一页可视化页面,要我生成一个可交互版本吗?”
73
+ - 不要把普通问答、闲聊、代码解释、纯文本总结强行交给页面生成助手。
74
+ - handoff 时,把用户原始需求和你已确认的业务上下文一起放进 userInput,不要要求用户理解 React、HTML、代码块或运行时。
75
+ - 页面生成助手只负责生成和修改可交互页面;你仍负责判断、解释、澄清和后续协调。`;
@@ -0,0 +1,37 @@
1
+ import { DataType } from "../../create/types";
2
+ import { write } from "../../database/dbSlice";
3
+ import { addUserMessage } from "../../chat/messages/messageSlice";
4
+ import type { Message } from "../../chat/messages/types";
5
+
6
+ export async function persistMessageWithFixedId(
7
+ dispatch: any,
8
+ message: Message
9
+ ): Promise<void> {
10
+ dispatch(addUserMessage(message));
11
+
12
+ const { controller, ...messageToWrite } = message;
13
+
14
+ try {
15
+ const writeRequest = dispatch(
16
+ write({
17
+ data: {
18
+ ...messageToWrite,
19
+ type: DataType.MSG,
20
+ },
21
+ customKey: message.dbKey,
22
+ })
23
+ );
24
+
25
+ if (writeRequest && typeof writeRequest.unwrap === "function") {
26
+ await writeRequest.unwrap();
27
+ return;
28
+ }
29
+
30
+ await writeRequest;
31
+ } catch (error) {
32
+ console.error(
33
+ "[persistMessageWithFixedId] Failed to persist fixed-id message:",
34
+ error
35
+ );
36
+ }
37
+ }
@@ -0,0 +1,259 @@
1
+ // ai/agent/planSlice.ts
2
+ // 管理计划(Plan)的 Redux 状态
3
+ // 支持普通步骤和反思步骤(reflect step)
4
+
5
+ import { type PayloadAction, createSlice } from "@reduxjs/toolkit";
6
+ import type { RootState } from "../../app/store";
7
+
8
+ // --- Interfaces ---
9
+
10
+ export interface PlanState {
11
+ planDetails: string;
12
+ currentProgress: number;
13
+ }
14
+
15
+ // 单个工具调用的接口
16
+ export interface ToolCall {
17
+ tool_name: string;
18
+ parameters: any;
19
+ }
20
+
21
+ // 反思决策的输出结构
22
+ export interface ReflectDecision {
23
+ action: "continue" | "stop" | "insert_steps";
24
+ reason: string;
25
+ steps?: Omit<Step, "status" | "result">[]; // 仅当 action 是 insert_steps 时
26
+ }
27
+
28
+ // Step 类型:normal 或 reflect
29
+ export type StepType = "normal" | "reflect";
30
+
31
+ export interface Step {
32
+ id: string;
33
+ title: string;
34
+ type?: StepType; // 默认 "normal"
35
+ status: "pending" | "in-progress" | "completed" | "failed";
36
+
37
+ // normal step 使用
38
+ calls?: ToolCall[];
39
+
40
+ // reflect step 使用
41
+ reflectInput?: string; // 给反思 LLM 的提示
42
+
43
+ // 通用
44
+ details?: any;
45
+ result?: any[]; // normal step: 工具调用结果; reflect step: ReflectDecision
46
+ }
47
+
48
+ // Plan 执行配置
49
+ export interface PlanExecutionConfig {
50
+ maxReflectCount?: number; // 最多允许多少次 reflect step,默认不限
51
+ maxTotalSteps?: number; // 最多执行多少个 step(包括动态插入的),默认不限
52
+ maxTimeMs?: number; // 最大执行时间(毫秒),默认不限
53
+ }
54
+
55
+ interface PlanSliceState {
56
+ plan: PlanState | null;
57
+ steps: Step[];
58
+ currentStep: string | null;
59
+ executionConfig: PlanExecutionConfig | null;
60
+ // 执行统计
61
+ stats: {
62
+ reflectCount: number;
63
+ totalStepsExecuted: number;
64
+ startTime: number | null;
65
+ };
66
+ }
67
+
68
+ // --- Initial State ---
69
+
70
+ const initialState: PlanSliceState = {
71
+ plan: null,
72
+ steps: [],
73
+ currentStep: null,
74
+ executionConfig: null,
75
+ stats: {
76
+ reflectCount: 0,
77
+ totalStepsExecuted: 0,
78
+ startTime: null,
79
+ },
80
+ };
81
+
82
+ // --- Slice Definition ---
83
+
84
+ const planSlice = createSlice({
85
+ name: "plan",
86
+ initialState,
87
+ reducers: {
88
+ // 设置整个计划的顶层信息
89
+ setPlan: (state, action: PayloadAction<PlanState>) => {
90
+ state.plan = action.payload;
91
+ },
92
+
93
+ // 更新计划的整体进度
94
+ updatePlanProgress: (state, action: PayloadAction<number>) => {
95
+ if (state.plan) {
96
+ state.plan.currentProgress = action.payload;
97
+ }
98
+ },
99
+
100
+ // 清除整个计划
101
+ clearPlan: (state) => {
102
+ state.plan = null;
103
+ state.steps = [];
104
+ state.currentStep = null;
105
+ state.executionConfig = null;
106
+ state.stats = {
107
+ reflectCount: 0,
108
+ totalStepsExecuted: 0,
109
+ startTime: null,
110
+ };
111
+ },
112
+
113
+ // 设置计划的所有步骤
114
+ setSteps: (state, action: PayloadAction<Step[]>) => {
115
+ state.steps = action.payload;
116
+ },
117
+
118
+ // 更新单个步骤的状态或结果
119
+ updateStep: (
120
+ state,
121
+ action: PayloadAction<{ id: string; updates: Partial<Step> }>
122
+ ) => {
123
+ const step = state.steps.find((s) => s.id === action.payload.id);
124
+ if (step) {
125
+ Object.assign(step, action.payload.updates);
126
+ }
127
+ },
128
+
129
+ // 设置当前正在执行的步骤ID
130
+ setCurrentStep: (state, action: PayloadAction<string | null>) => {
131
+ state.currentStep = action.payload;
132
+ },
133
+
134
+ // 清除所有步骤信息
135
+ clearSteps: (state) => {
136
+ state.steps = [];
137
+ state.currentStep = null;
138
+ },
139
+
140
+ // 新增:在指定步骤之后插入新步骤
141
+ insertStepsAfter: (
142
+ state,
143
+ action: PayloadAction<{
144
+ afterStepId: string;
145
+ newSteps: Step[];
146
+ }>
147
+ ) => {
148
+ const { afterStepId, newSteps } = action.payload;
149
+ const index = state.steps.findIndex((s) => s.id === afterStepId);
150
+ if (index !== -1) {
151
+ // 在 afterStepId 之后插入新步骤
152
+ state.steps.splice(index + 1, 0, ...newSteps);
153
+ }
154
+ },
155
+
156
+ // 新增:移除指定步骤之后的所有待执行步骤
157
+ removeStepsAfter: (state, action: PayloadAction<string>) => {
158
+ const afterStepId = action.payload;
159
+ const index = state.steps.findIndex((s) => s.id === afterStepId);
160
+ if (index !== -1) {
161
+ // 只保留 afterStepId 及之前的步骤,以及已完成的步骤
162
+ state.steps = state.steps.filter(
163
+ (s, i) => i <= index || s.status === "completed"
164
+ );
165
+ }
166
+ },
167
+
168
+ // 新增:设置执行配置
169
+ setExecutionConfig: (
170
+ state,
171
+ action: PayloadAction<PlanExecutionConfig | null>
172
+ ) => {
173
+ state.executionConfig = action.payload;
174
+ },
175
+
176
+ // 新增:更新执行统计
177
+ updateStats: (
178
+ state,
179
+ action: PayloadAction<Partial<PlanSliceState["stats"]>>
180
+ ) => {
181
+ Object.assign(state.stats, action.payload);
182
+ },
183
+
184
+ // 新增:增加反思计数
185
+ incrementReflectCount: (state) => {
186
+ state.stats.reflectCount += 1;
187
+ },
188
+
189
+ // 新增:增加已执行步骤计数
190
+ incrementStepsExecuted: (state) => {
191
+ state.stats.totalStepsExecuted += 1;
192
+ },
193
+
194
+ // 新增:设置开始时间
195
+ setStartTime: (state, action: PayloadAction<number>) => {
196
+ state.stats.startTime = action.payload;
197
+ },
198
+ },
199
+ selectors: {
200
+ selectPlanState: (state: PlanSliceState) => state.plan,
201
+ selectStepsState: (state: PlanSliceState) => state.steps,
202
+ selectCurrentStepIdState: (state: PlanSliceState) => state.currentStep,
203
+ selectExecutionConfigState: (state: PlanSliceState) =>
204
+ state.executionConfig,
205
+ selectStatsState: (state: PlanSliceState) => state.stats,
206
+ },
207
+ });
208
+
209
+ // --- Exports ---
210
+
211
+ export const {
212
+ setPlan,
213
+ updatePlanProgress,
214
+ clearPlan,
215
+ setSteps,
216
+ updateStep,
217
+ setCurrentStep,
218
+ clearSteps,
219
+ insertStepsAfter,
220
+ removeStepsAfter,
221
+ setExecutionConfig,
222
+ updateStats,
223
+ incrementReflectCount,
224
+ incrementStepsExecuted,
225
+ setStartTime,
226
+ } = planSlice.actions;
227
+
228
+ export default planSlice.reducer;
229
+
230
+ // Selectors
231
+ export const selectPlan = (state: RootState): PlanState | null =>
232
+ state.plan.plan;
233
+
234
+ export const selectSteps = (state: RootState): Step[] => state.plan.steps;
235
+
236
+ export const selectCurrentStepId = (state: RootState): string | null =>
237
+ state.plan.currentStep;
238
+
239
+ export const selectCurrentStepDetails = (state: RootState): Step | null => {
240
+ if (!state.plan.currentStep) return null;
241
+ return (
242
+ state.plan.steps.find((step) => step.id === state.plan.currentStep) || null
243
+ );
244
+ };
245
+
246
+ export const selectExecutionConfig = (
247
+ state: RootState
248
+ ): PlanExecutionConfig | null => state.plan.executionConfig;
249
+
250
+ export const selectPlanStats = (state: RootState): PlanSliceState["stats"] =>
251
+ state.plan.stats;
252
+
253
+ // 新增:获取待执行的步骤
254
+ export const selectPendingSteps = (state: RootState): Step[] =>
255
+ state.plan.steps.filter((s) => s.status === "pending");
256
+
257
+ // 新增:获取已完成的步骤
258
+ export const selectCompletedSteps = (state: RootState): Step[] =>
259
+ state.plan.steps.filter((s) => s.status === "completed");
@@ -0,0 +1,229 @@
1
+ import type { AppDispatch } from "../../app/store";
2
+ import type { ReferenceItem } from "../../app/types";
3
+ import { read } from "../../database/dbSlice";
4
+ import {
5
+ extractRuntimePageCapabilities,
6
+ resolveSkillGraphFromRoots,
7
+ type SkillRuntimePageLike,
8
+ } from "../skills/referenceRuntime";
9
+
10
+ export type ResolvedReferenceAssets = {
11
+ references: ReferenceItem[];
12
+ referencedTools: string[];
13
+ recommendedSkillTools: string[];
14
+ recommendedSkillHints: string[];
15
+ skillPromptPatches: string[];
16
+ contentByKey: Map<string, any>;
17
+ };
18
+
19
+ export type ResolvedContentTools = {
20
+ tools: string[];
21
+ recommendedSkillTools: string[];
22
+ recommendedSkillHints: string[];
23
+ skillPromptPatches: string[];
24
+ contentByKey: Map<string, any>;
25
+ };
26
+
27
+ const loadContentsByKeys = async (
28
+ keys: string[],
29
+ dispatch: AppDispatch,
30
+ preloaded?: Map<string, any>
31
+ ): Promise<Map<string, any>> => {
32
+ const contentByKey = new Map<string, SkillRuntimePageLike>();
33
+ const uniqueKeys = Array.from(new Set(keys.filter(Boolean)));
34
+ await Promise.all(
35
+ uniqueKeys.map(async (dbKey) => {
36
+ if (preloaded?.has(dbKey)) {
37
+ const content = preloaded.get(dbKey);
38
+ if (content) contentByKey.set(dbKey, content);
39
+ return;
40
+ }
41
+ try {
42
+ const content = await dispatch(read({ dbKey })).unwrap();
43
+ if (content) contentByKey.set(dbKey, content);
44
+ } catch {
45
+ // ignore missing content
46
+ }
47
+ })
48
+ );
49
+ return contentByKey;
50
+ };
51
+
52
+ export const resolveReferenceAssets = async (
53
+ references: ReferenceItem[] | undefined,
54
+ dispatch: AppDispatch)
55
+ : Promise<ResolvedReferenceAssets> => {
56
+ if (!Array.isArray(references) || references.length === 0) {
57
+ return {
58
+ references: [],
59
+ referencedTools: [],
60
+ recommendedSkillTools: [],
61
+ recommendedSkillHints: [],
62
+ skillPromptPatches: [],
63
+ contentByKey: new Map(),
64
+ };
65
+ }
66
+
67
+ const entries = await Promise.all(
68
+ references.
69
+ filter((ref) => ref?.dbKey).
70
+ map(async (ref) => {
71
+ try {
72
+ const content = await dispatch(read({ dbKey: ref.dbKey })).unwrap();
73
+ return { ref, content };
74
+ } catch {
75
+ return { ref, content: null };
76
+ }
77
+ })
78
+ );
79
+
80
+ const contentByKey = new Map<string, any>();
81
+ const toolSet = new Set<string>();
82
+ const recommendedToolSet = new Set<string>();
83
+ const recommendedSkillHints = new Set<string>();
84
+ const skillPromptPatches = new Set<string>();
85
+ const normalizedReferences: ReferenceItem[] = [];
86
+ const hardSkillKeys = new Set<string>();
87
+ const softSkillKeys = new Set<string>();
88
+
89
+ for (const { ref, content } of entries) {
90
+ if (content) {
91
+ contentByKey.set(ref.dbKey, content);
92
+ }
93
+
94
+ const capabilities = extractRuntimePageCapabilities(content);
95
+ for (const tool of capabilities.directTools) {
96
+ toolSet.add(tool);
97
+ }
98
+ for (const tool of capabilities.hardSkillTools) {
99
+ toolSet.add(tool);
100
+ }
101
+ for (const hint of capabilities.softSkillHints) {
102
+ recommendedSkillHints.add(hint);
103
+ }
104
+ for (const patch of capabilities.promptPatches) {
105
+ skillPromptPatches.add(patch);
106
+ }
107
+ for (const skillKey of capabilities.hardSkillKeys) {
108
+ hardSkillKeys.add(skillKey);
109
+ }
110
+ for (const skillKey of capabilities.softSkillKeys) {
111
+ softSkillKeys.add(skillKey);
112
+ }
113
+
114
+ normalizedReferences.push({
115
+ ...ref,
116
+ type: capabilities.shouldUpgradeReference ? "instruction" : ref.type,
117
+ });
118
+ }
119
+
120
+ const resolvedSkillLinks = await resolveSkillGraphFromRoots({
121
+ roots: [
122
+ ...Array.from(hardSkillKeys).map((identifier) => ({ identifier, mode: "required" as const })),
123
+ ...Array.from(softSkillKeys).map((identifier) => ({ identifier, mode: "recommended" as const })),
124
+ ],
125
+ loadPage: async (identifier) => {
126
+ const loaded = await loadContentsByKeys([identifier], dispatch, contentByKey);
127
+ return loaded.get(identifier) ?? null;
128
+ },
129
+ contentByKey,
130
+ });
131
+ resolvedSkillLinks.contentByKey.forEach((value, key) => contentByKey.set(key, value));
132
+ for (const tool of resolvedSkillLinks.requiredTools) {
133
+ toolSet.add(tool);
134
+ }
135
+ for (const tool of resolvedSkillLinks.recommendedTools) {
136
+ recommendedToolSet.add(tool);
137
+ }
138
+ for (const hint of resolvedSkillLinks.recommendedSkillHints) {
139
+ recommendedSkillHints.add(hint);
140
+ }
141
+ for (const patch of resolvedSkillLinks.skillPromptPatches) {
142
+ skillPromptPatches.add(patch);
143
+ }
144
+
145
+ return {
146
+ references: normalizedReferences,
147
+ referencedTools: Array.from(toolSet),
148
+ recommendedSkillTools: Array.from(recommendedToolSet),
149
+ recommendedSkillHints: Array.from(recommendedSkillHints),
150
+ skillPromptPatches: Array.from(skillPromptPatches),
151
+ contentByKey
152
+ };
153
+ };
154
+
155
+ export const resolveToolsFromKeys = async (
156
+ keys: string[],
157
+ dispatch: AppDispatch,
158
+ preloaded?: Map<string, any>)
159
+ : Promise<ResolvedContentTools> => {
160
+ if (!Array.isArray(keys) || keys.length === 0) {
161
+ return {
162
+ tools: [],
163
+ recommendedSkillTools: [],
164
+ recommendedSkillHints: [],
165
+ skillPromptPatches: [],
166
+ contentByKey: new Map(),
167
+ };
168
+ }
169
+
170
+ const contentByKey = await loadContentsByKeys(keys, dispatch, preloaded);
171
+ const toolSet = new Set<string>();
172
+ const recommendedToolSet = new Set<string>();
173
+ const recommendedSkillHints = new Set<string>();
174
+ const skillPromptPatches = new Set<string>();
175
+ const hardSkillKeys = new Set<string>();
176
+ const softSkillKeys = new Set<string>();
177
+
178
+ for (const content of contentByKey.values()) {
179
+ const capabilities = extractRuntimePageCapabilities(content);
180
+ for (const tool of [...capabilities.directTools, ...capabilities.hardSkillTools]) {
181
+ toolSet.add(tool);
182
+ }
183
+ for (const hint of capabilities.softSkillHints) {
184
+ recommendedSkillHints.add(hint);
185
+ }
186
+ for (const patch of capabilities.promptPatches) {
187
+ skillPromptPatches.add(patch);
188
+ }
189
+ for (const skillKey of capabilities.hardSkillKeys) {
190
+ hardSkillKeys.add(skillKey);
191
+ }
192
+ for (const skillKey of capabilities.softSkillKeys) {
193
+ softSkillKeys.add(skillKey);
194
+ }
195
+ }
196
+
197
+ const resolvedSkillLinks = await resolveSkillGraphFromRoots({
198
+ roots: [
199
+ ...Array.from(hardSkillKeys).map((identifier) => ({ identifier, mode: "required" as const })),
200
+ ...Array.from(softSkillKeys).map((identifier) => ({ identifier, mode: "recommended" as const })),
201
+ ],
202
+ loadPage: async (identifier) => {
203
+ const loaded = await loadContentsByKeys([identifier], dispatch, contentByKey);
204
+ return loaded.get(identifier) ?? null;
205
+ },
206
+ contentByKey,
207
+ });
208
+ resolvedSkillLinks.contentByKey.forEach((value, key) => contentByKey.set(key, value));
209
+ for (const tool of resolvedSkillLinks.requiredTools) {
210
+ toolSet.add(tool);
211
+ }
212
+ for (const tool of resolvedSkillLinks.recommendedTools) {
213
+ recommendedToolSet.add(tool);
214
+ }
215
+ for (const hint of resolvedSkillLinks.recommendedSkillHints) {
216
+ recommendedSkillHints.add(hint);
217
+ }
218
+ for (const patch of resolvedSkillLinks.skillPromptPatches) {
219
+ skillPromptPatches.add(patch);
220
+ }
221
+
222
+ return {
223
+ tools: Array.from(toolSet),
224
+ recommendedSkillTools: Array.from(recommendedToolSet),
225
+ recommendedSkillHints: Array.from(recommendedSkillHints),
226
+ skillPromptPatches: Array.from(skillPromptPatches),
227
+ contentByKey
228
+ };
229
+ };