libre-webui 0.25.0 → 0.26.0

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 (510) hide show
  1. package/README.md +32 -22
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +26 -4
  4. package/backend/dist/index.js.map +1 -1
  5. package/backend/dist/middleware/auth.d.ts +7 -0
  6. package/backend/dist/middleware/auth.d.ts.map +1 -1
  7. package/backend/dist/middleware/auth.js +26 -0
  8. package/backend/dist/middleware/auth.js.map +1 -1
  9. package/backend/dist/middleware/index.d.ts +20 -0
  10. package/backend/dist/middleware/index.d.ts.map +1 -1
  11. package/backend/dist/middleware/index.js +105 -2
  12. package/backend/dist/middleware/index.js.map +1 -1
  13. package/backend/dist/models/personaModel.d.ts.map +1 -1
  14. package/backend/dist/models/personaModel.js +2 -0
  15. package/backend/dist/models/personaModel.js.map +1 -1
  16. package/backend/dist/observability/otel.d.ts +40 -0
  17. package/backend/dist/observability/otel.d.ts.map +1 -0
  18. package/backend/dist/observability/otel.js +337 -0
  19. package/backend/dist/observability/otel.js.map +1 -0
  20. package/backend/dist/observability/requestContext.d.ts +14 -0
  21. package/backend/dist/observability/requestContext.d.ts.map +1 -0
  22. package/backend/dist/observability/requestContext.js +21 -0
  23. package/backend/dist/observability/requestContext.js.map +1 -0
  24. package/backend/dist/persistence/chatGenerationTypes.d.ts +9 -0
  25. package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -1
  26. package/backend/dist/persistence/extensionTypes.d.ts +13 -0
  27. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -1
  28. package/backend/dist/persistence/extensionTypes.js.map +1 -1
  29. package/backend/dist/persistence/index.d.ts +1 -1
  30. package/backend/dist/persistence/index.d.ts.map +1 -1
  31. package/backend/dist/persistence/index.js.map +1 -1
  32. package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts +9 -0
  33. package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts.map +1 -0
  34. package/backend/dist/persistence/postgresAgentFoundationMigration.js +164 -0
  35. package/backend/dist/persistence/postgresAgentFoundationMigration.js.map +1 -0
  36. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
  37. package/backend/dist/persistence/postgresExtensionRepositories.js +46 -2
  38. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
  39. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts +10 -0
  40. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts.map +1 -0
  41. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js +148 -0
  42. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js.map +1 -0
  43. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  44. package/backend/dist/persistence/postgresMigrationRegistry.js +10 -0
  45. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  46. package/backend/dist/persistence/postgresNotesV2Migration.d.ts +4 -0
  47. package/backend/dist/persistence/postgresNotesV2Migration.d.ts.map +1 -0
  48. package/backend/dist/persistence/postgresNotesV2Migration.js +57 -0
  49. package/backend/dist/persistence/postgresNotesV2Migration.js.map +1 -0
  50. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  51. package/backend/dist/persistence/postgresResourceRepositories.js +1646 -11
  52. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  53. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts +9 -0
  54. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts.map +1 -0
  55. package/backend/dist/persistence/postgresSkillFilesMigration.js +50 -0
  56. package/backend/dist/persistence/postgresSkillFilesMigration.js.map +1 -0
  57. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts +10 -0
  58. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts.map +1 -0
  59. package/backend/dist/persistence/postgresTeamCollaborationMigration.js +161 -0
  60. package/backend/dist/persistence/postgresTeamCollaborationMigration.js.map +1 -0
  61. package/backend/dist/persistence/resourceTypes.d.ts +541 -3
  62. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  63. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  64. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  65. package/backend/dist/persistence/sqliteExtensionRepositories.js +26 -4
  66. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  67. package/backend/dist/persistence/sqliteMigrations.d.ts +9 -0
  68. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  69. package/backend/dist/persistence/sqliteMigrations.js +1196 -29
  70. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  71. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  72. package/backend/dist/persistence/sqliteResourceRepositories.js +1523 -134
  73. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  74. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  75. package/backend/dist/persistence/sqliteToPostgresMigration.js +257 -3
  76. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  77. package/backend/dist/platform/jobs/domainJobContracts.d.ts +8 -0
  78. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
  79. package/backend/dist/platform/jobs/domainJobContracts.js +8 -0
  80. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
  81. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  82. package/backend/dist/platform/jobs/domainJobHandlers.js +310 -3
  83. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  84. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -1
  85. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +4 -2
  86. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -1
  87. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -1
  88. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +4 -2
  89. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -1
  90. package/backend/dist/platform/storage/pgVectorStore.d.ts +2 -1
  91. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -1
  92. package/backend/dist/platform/storage/pgVectorStore.js +51 -0
  93. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -1
  94. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +8 -2
  95. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -1
  96. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -1
  97. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +25 -4
  98. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -1
  99. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +2 -1
  100. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -1
  101. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +35 -0
  102. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -1
  103. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -1
  104. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +26 -3
  105. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -1
  106. package/backend/dist/platform/storage/vectorStore.d.ts +14 -0
  107. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -1
  108. package/backend/dist/platform/storage/vectorStore.js.map +1 -1
  109. package/backend/dist/routes/access.d.ts.map +1 -1
  110. package/backend/dist/routes/access.js +84 -3
  111. package/backend/dist/routes/access.js.map +1 -1
  112. package/backend/dist/routes/calendar.d.ts.map +1 -1
  113. package/backend/dist/routes/calendar.js +125 -22
  114. package/backend/dist/routes/calendar.js.map +1 -1
  115. package/backend/dist/routes/channels.d.ts +3 -0
  116. package/backend/dist/routes/channels.d.ts.map +1 -0
  117. package/backend/dist/routes/channels.js +447 -0
  118. package/backend/dist/routes/channels.js.map +1 -0
  119. package/backend/dist/routes/chat.d.ts.map +1 -1
  120. package/backend/dist/routes/chat.js +195 -7
  121. package/backend/dist/routes/chat.js.map +1 -1
  122. package/backend/dist/routes/costs.d.ts +3 -0
  123. package/backend/dist/routes/costs.d.ts.map +1 -0
  124. package/backend/dist/routes/costs.js +191 -0
  125. package/backend/dist/routes/costs.js.map +1 -0
  126. package/backend/dist/routes/documents.d.ts.map +1 -1
  127. package/backend/dist/routes/documents.js +64 -21
  128. package/backend/dist/routes/documents.js.map +1 -1
  129. package/backend/dist/routes/evaluations.d.ts +3 -0
  130. package/backend/dist/routes/evaluations.d.ts.map +1 -0
  131. package/backend/dist/routes/evaluations.js +352 -0
  132. package/backend/dist/routes/evaluations.js.map +1 -0
  133. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  134. package/backend/dist/routes/imageGen.js +2 -1
  135. package/backend/dist/routes/imageGen.js.map +1 -1
  136. package/backend/dist/routes/media.d.ts.map +1 -1
  137. package/backend/dist/routes/media.js +228 -7
  138. package/backend/dist/routes/media.js.map +1 -1
  139. package/backend/dist/routes/notes.d.ts.map +1 -1
  140. package/backend/dist/routes/notes.js +149 -36
  141. package/backend/dist/routes/notes.js.map +1 -1
  142. package/backend/dist/routes/notifications.d.ts +3 -0
  143. package/backend/dist/routes/notifications.d.ts.map +1 -0
  144. package/backend/dist/routes/notifications.js +213 -0
  145. package/backend/dist/routes/notifications.js.map +1 -0
  146. package/backend/dist/routes/openaiCompat.d.ts +3 -0
  147. package/backend/dist/routes/openaiCompat.d.ts.map +1 -0
  148. package/backend/dist/routes/openaiCompat.js +314 -0
  149. package/backend/dist/routes/openaiCompat.js.map +1 -0
  150. package/backend/dist/routes/personas.js +1 -1
  151. package/backend/dist/routes/personas.js.map +1 -1
  152. package/backend/dist/routes/prompts.d.ts +3 -0
  153. package/backend/dist/routes/prompts.d.ts.map +1 -0
  154. package/backend/dist/routes/prompts.js +173 -0
  155. package/backend/dist/routes/prompts.js.map +1 -0
  156. package/backend/dist/routes/search.d.ts.map +1 -1
  157. package/backend/dist/routes/search.js +29 -1
  158. package/backend/dist/routes/search.js.map +1 -1
  159. package/backend/dist/routes/skills.d.ts +3 -0
  160. package/backend/dist/routes/skills.d.ts.map +1 -0
  161. package/backend/dist/routes/skills.js +246 -0
  162. package/backend/dist/routes/skills.js.map +1 -0
  163. package/backend/dist/routes/stt.d.ts.map +1 -1
  164. package/backend/dist/routes/stt.js +2 -1
  165. package/backend/dist/routes/stt.js.map +1 -1
  166. package/backend/dist/routes/tools.d.ts +3 -0
  167. package/backend/dist/routes/tools.d.ts.map +1 -0
  168. package/backend/dist/routes/tools.js +359 -0
  169. package/backend/dist/routes/tools.js.map +1 -0
  170. package/backend/dist/routes/tts.d.ts.map +1 -1
  171. package/backend/dist/routes/tts.js +63 -8
  172. package/backend/dist/routes/tts.js.map +1 -1
  173. package/backend/dist/routes/voiceAccess.d.ts +3 -0
  174. package/backend/dist/routes/voiceAccess.d.ts.map +1 -0
  175. package/backend/dist/routes/voiceAccess.js +102 -0
  176. package/backend/dist/routes/voiceAccess.js.map +1 -0
  177. package/backend/dist/services/apiTokenService.d.ts +2 -2
  178. package/backend/dist/services/apiTokenService.d.ts.map +1 -1
  179. package/backend/dist/services/apiTokenService.js +7 -0
  180. package/backend/dist/services/apiTokenService.js.map +1 -1
  181. package/backend/dist/services/authorizationService.d.ts +8 -4
  182. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  183. package/backend/dist/services/authorizationService.js +31 -1
  184. package/backend/dist/services/authorizationService.js.map +1 -1
  185. package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
  186. package/backend/dist/services/automationSchedulerService.js +33 -3
  187. package/backend/dist/services/automationSchedulerService.js.map +1 -1
  188. package/backend/dist/services/automationService.d.ts +4 -1
  189. package/backend/dist/services/automationService.d.ts.map +1 -1
  190. package/backend/dist/services/automationService.js +25 -2
  191. package/backend/dist/services/automationService.js.map +1 -1
  192. package/backend/dist/services/builtinToolsService.d.ts +20 -0
  193. package/backend/dist/services/builtinToolsService.d.ts.map +1 -0
  194. package/backend/dist/services/builtinToolsService.js +661 -0
  195. package/backend/dist/services/builtinToolsService.js.map +1 -0
  196. package/backend/dist/services/calendarService.d.ts +74 -0
  197. package/backend/dist/services/calendarService.d.ts.map +1 -0
  198. package/backend/dist/services/calendarService.js +339 -0
  199. package/backend/dist/services/calendarService.js.map +1 -0
  200. package/backend/dist/services/channelService.d.ts +195 -0
  201. package/backend/dist/services/channelService.d.ts.map +1 -0
  202. package/backend/dist/services/channelService.js +1057 -0
  203. package/backend/dist/services/channelService.js.map +1 -0
  204. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  205. package/backend/dist/services/chatRequestService.js +29 -1
  206. package/backend/dist/services/chatRequestService.js.map +1 -1
  207. package/backend/dist/services/chatService.d.ts +61 -1
  208. package/backend/dist/services/chatService.d.ts.map +1 -1
  209. package/backend/dist/services/chatService.js +218 -1
  210. package/backend/dist/services/chatService.js.map +1 -1
  211. package/backend/dist/services/chatToolRuntimeService.d.ts +55 -0
  212. package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -0
  213. package/backend/dist/services/chatToolRuntimeService.js +389 -0
  214. package/backend/dist/services/chatToolRuntimeService.js.map +1 -0
  215. package/backend/dist/services/costGovernanceService.d.ts +102 -0
  216. package/backend/dist/services/costGovernanceService.d.ts.map +1 -0
  217. package/backend/dist/services/costGovernanceService.js +463 -0
  218. package/backend/dist/services/costGovernanceService.js.map +1 -0
  219. package/backend/dist/services/dataArchiveService.d.ts +6 -0
  220. package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
  221. package/backend/dist/services/dataArchiveService.js +23 -4
  222. package/backend/dist/services/dataArchiveService.js.map +1 -1
  223. package/backend/dist/services/documentService.d.ts +58 -1
  224. package/backend/dist/services/documentService.d.ts.map +1 -1
  225. package/backend/dist/services/documentService.js +289 -84
  226. package/backend/dist/services/documentService.js.map +1 -1
  227. package/backend/dist/services/durableChatGenerationService.d.ts +9 -0
  228. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  229. package/backend/dist/services/durableChatGenerationService.js +152 -11
  230. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  231. package/backend/dist/services/evaluationService.d.ts +111 -0
  232. package/backend/dist/services/evaluationService.d.ts.map +1 -0
  233. package/backend/dist/services/evaluationService.js +403 -0
  234. package/backend/dist/services/evaluationService.js.map +1 -0
  235. package/backend/dist/services/galleryService.d.ts +6 -0
  236. package/backend/dist/services/galleryService.d.ts.map +1 -1
  237. package/backend/dist/services/galleryService.js +26 -0
  238. package/backend/dist/services/galleryService.js.map +1 -1
  239. package/backend/dist/services/mcpClientService.d.ts +29 -0
  240. package/backend/dist/services/mcpClientService.d.ts.map +1 -0
  241. package/backend/dist/services/mcpClientService.js +189 -0
  242. package/backend/dist/services/mcpClientService.js.map +1 -0
  243. package/backend/dist/services/noteService.d.ts +71 -0
  244. package/backend/dist/services/noteService.d.ts.map +1 -0
  245. package/backend/dist/services/noteService.js +397 -0
  246. package/backend/dist/services/noteService.js.map +1 -0
  247. package/backend/dist/services/notificationService.d.ts +55 -0
  248. package/backend/dist/services/notificationService.d.ts.map +1 -0
  249. package/backend/dist/services/notificationService.js +308 -0
  250. package/backend/dist/services/notificationService.js.map +1 -0
  251. package/backend/dist/services/openApiToolService.d.ts +38 -0
  252. package/backend/dist/services/openApiToolService.d.ts.map +1 -0
  253. package/backend/dist/services/openApiToolService.js +254 -0
  254. package/backend/dist/services/openApiToolService.js.map +1 -0
  255. package/backend/dist/services/personaService.d.ts +18 -2
  256. package/backend/dist/services/personaService.d.ts.map +1 -1
  257. package/backend/dist/services/personaService.js +113 -4
  258. package/backend/dist/services/personaService.js.map +1 -1
  259. package/backend/dist/services/pluginImageGenerationService.d.ts +19 -0
  260. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  261. package/backend/dist/services/pluginImageGenerationService.js +121 -0
  262. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  263. package/backend/dist/services/pluginService.d.ts +7 -0
  264. package/backend/dist/services/pluginService.d.ts.map +1 -1
  265. package/backend/dist/services/pluginService.js +8 -2
  266. package/backend/dist/services/pluginService.js.map +1 -1
  267. package/backend/dist/services/promptService.d.ts +74 -0
  268. package/backend/dist/services/promptService.d.ts.map +1 -0
  269. package/backend/dist/services/promptService.js +513 -0
  270. package/backend/dist/services/promptService.js.map +1 -0
  271. package/backend/dist/services/resourceGrantService.d.ts.map +1 -1
  272. package/backend/dist/services/resourceGrantService.js +62 -17
  273. package/backend/dist/services/resourceGrantService.js.map +1 -1
  274. package/backend/dist/services/searchService.d.ts +29 -0
  275. package/backend/dist/services/searchService.d.ts.map +1 -0
  276. package/backend/dist/services/searchService.js +0 -0
  277. package/backend/dist/services/searchService.js.map +1 -0
  278. package/backend/dist/services/securityAuditService.d.ts.map +1 -1
  279. package/backend/dist/services/securityAuditService.js +2 -1
  280. package/backend/dist/services/securityAuditService.js.map +1 -1
  281. package/backend/dist/services/sharedResourceAccess.d.ts +25 -0
  282. package/backend/dist/services/sharedResourceAccess.d.ts.map +1 -0
  283. package/backend/dist/services/sharedResourceAccess.js +59 -0
  284. package/backend/dist/services/sharedResourceAccess.js.map +1 -0
  285. package/backend/dist/services/skillService.d.ts +137 -0
  286. package/backend/dist/services/skillService.d.ts.map +1 -0
  287. package/backend/dist/services/skillService.js +852 -0
  288. package/backend/dist/services/skillService.js.map +1 -0
  289. package/backend/dist/services/toolAccessService.d.ts +9 -0
  290. package/backend/dist/services/toolAccessService.d.ts.map +1 -0
  291. package/backend/dist/services/toolAccessService.js +60 -0
  292. package/backend/dist/services/toolAccessService.js.map +1 -0
  293. package/backend/dist/services/toolApprovalService.d.ts +34 -0
  294. package/backend/dist/services/toolApprovalService.d.ts.map +1 -0
  295. package/backend/dist/services/toolApprovalService.js +188 -0
  296. package/backend/dist/services/toolApprovalService.js.map +1 -0
  297. package/backend/dist/services/toolGatewayService.d.ts +53 -0
  298. package/backend/dist/services/toolGatewayService.d.ts.map +1 -0
  299. package/backend/dist/services/toolGatewayService.js +249 -0
  300. package/backend/dist/services/toolGatewayService.js.map +1 -0
  301. package/backend/dist/services/toolServerService.d.ts +57 -0
  302. package/backend/dist/services/toolServerService.d.ts.map +1 -0
  303. package/backend/dist/services/toolServerService.js +521 -0
  304. package/backend/dist/services/toolServerService.js.map +1 -0
  305. package/backend/dist/services/voiceAccessService.d.ts +10 -0
  306. package/backend/dist/services/voiceAccessService.d.ts.map +1 -0
  307. package/backend/dist/services/voiceAccessService.js +74 -0
  308. package/backend/dist/services/voiceAccessService.js.map +1 -0
  309. package/backend/dist/services/voiceProfileService.d.ts +20 -0
  310. package/backend/dist/services/voiceProfileService.d.ts.map +1 -1
  311. package/backend/dist/services/voiceProfileService.js +60 -0
  312. package/backend/dist/services/voiceProfileService.js.map +1 -1
  313. package/backend/dist/storage.d.ts +28 -1
  314. package/backend/dist/storage.d.ts.map +1 -1
  315. package/backend/dist/storage.js +100 -1
  316. package/backend/dist/storage.js.map +1 -1
  317. package/backend/dist/storageMappers.d.ts +2 -2
  318. package/backend/dist/storageMappers.d.ts.map +1 -1
  319. package/backend/dist/storageMappers.js.map +1 -1
  320. package/backend/dist/types/index.d.ts +197 -2
  321. package/backend/dist/types/index.d.ts.map +1 -1
  322. package/backend/dist/types/index.js.map +1 -1
  323. package/backend/dist/types/tools.d.ts +137 -0
  324. package/backend/dist/types/tools.d.ts.map +1 -0
  325. package/backend/dist/types/tools.js +25 -0
  326. package/backend/dist/types/tools.js.map +1 -0
  327. package/backend/dist/utils/chatDocumentContext.d.ts +26 -1
  328. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  329. package/backend/dist/utils/chatDocumentContext.js +87 -18
  330. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  331. package/backend/dist/utils/documentExtraction.d.ts +69 -0
  332. package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
  333. package/backend/dist/utils/documentExtraction.js +545 -0
  334. package/backend/dist/utils/documentExtraction.js.map +1 -0
  335. package/backend/dist/utils/hybridRetrieval.d.ts +34 -0
  336. package/backend/dist/utils/hybridRetrieval.d.ts.map +1 -0
  337. package/backend/dist/utils/hybridRetrieval.js +119 -0
  338. package/backend/dist/utils/hybridRetrieval.js.map +1 -0
  339. package/backend/dist/utils/icsCalendar.d.ts +27 -0
  340. package/backend/dist/utils/icsCalendar.d.ts.map +1 -0
  341. package/backend/dist/utils/icsCalendar.js +313 -0
  342. package/backend/dist/utils/icsCalendar.js.map +1 -0
  343. package/backend/dist/utils/imageEditUpload.d.ts +29 -0
  344. package/backend/dist/utils/imageEditUpload.d.ts.map +1 -0
  345. package/backend/dist/utils/imageEditUpload.js +82 -0
  346. package/backend/dist/utils/imageEditUpload.js.map +1 -0
  347. package/backend/dist/utils/logRedaction.d.ts +2 -0
  348. package/backend/dist/utils/logRedaction.d.ts.map +1 -0
  349. package/backend/dist/utils/logRedaction.js +66 -0
  350. package/backend/dist/utils/logRedaction.js.map +1 -0
  351. package/backend/dist/utils/logger.d.ts +3 -0
  352. package/backend/dist/utils/logger.d.ts.map +1 -1
  353. package/backend/dist/utils/logger.js +63 -20
  354. package/backend/dist/utils/logger.js.map +1 -1
  355. package/backend/dist/utils/pluginChatAdapter.d.ts +5 -1
  356. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  357. package/backend/dist/utils/pluginChatAdapter.js +83 -0
  358. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  359. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  360. package/backend/dist/utils/resourceLimits.d.ts +61 -2
  361. package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
  362. package/backend/dist/utils/resourceLimits.js +59 -0
  363. package/backend/dist/utils/resourceLimits.js.map +1 -1
  364. package/backend/dist/utils/toolEgress.d.ts +22 -0
  365. package/backend/dist/utils/toolEgress.d.ts.map +1 -0
  366. package/backend/dist/utils/toolEgress.js +157 -0
  367. package/backend/dist/utils/toolEgress.js.map +1 -0
  368. package/backend/dist/utils/websocketMessages.d.ts +6 -0
  369. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  370. package/backend/dist/utils/websocketMessages.js +8 -0
  371. package/backend/dist/utils/websocketMessages.js.map +1 -1
  372. package/backend/dist/utils/zipArchive.d.ts +32 -0
  373. package/backend/dist/utils/zipArchive.d.ts.map +1 -0
  374. package/backend/dist/utils/zipArchive.js +171 -0
  375. package/backend/dist/utils/zipArchive.js.map +1 -0
  376. package/backend/dist/websocketServer.d.ts.map +1 -1
  377. package/backend/dist/websocketServer.js +142 -35
  378. package/backend/dist/websocketServer.js.map +1 -1
  379. package/backend/package.json +1 -1
  380. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  381. package/frontend/dist/assets/index-BPsH9FII.js +80 -0
  382. package/frontend/dist/assets/index-BtXF0Oxa.css +1 -0
  383. package/frontend/dist/index.html +18 -18
  384. package/frontend/dist/js/{ArtifactContainer-CpUi6ekF.js → ArtifactContainer-CIoFoMv8.js} +1 -1
  385. package/frontend/dist/js/{ArtifactDemoPage-BeNs3gHp.js → ArtifactDemoPage-D0JEIAbZ.js} +1 -1
  386. package/frontend/dist/js/{ArtifactSandboxFrame-qsj_Y3LV.js → ArtifactSandboxFrame-REazyIrx.js} +2 -2
  387. package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +1 -0
  388. package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +1 -0
  389. package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
  390. package/frontend/dist/js/CalendarPage-DLjasZOd.js +1 -0
  391. package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +1 -0
  392. package/frontend/dist/js/ChatPage-BAgBHUES.js +16 -0
  393. package/frontend/dist/js/EvaluationsPage-Bm8FRoeX.js +2 -0
  394. package/frontend/dist/js/{FirstTimeSetup-Df0YJni3.js → FirstTimeSetup-BxJapNul.js} +1 -1
  395. package/frontend/dist/js/GalleryPage-DHz9DkK7.js +1 -0
  396. package/frontend/dist/js/HomePage-BqNy-FWX.js +1 -0
  397. package/frontend/dist/js/LibreClawPage-BDzDILjY.js +1 -0
  398. package/frontend/dist/js/{ModelManagerModals-DcLGYN3l.js → ModelManagerModals-DX9eT5r2.js} +1 -1
  399. package/frontend/dist/js/ModelSelector-ol8mK2ja.js +1 -0
  400. package/frontend/dist/js/NotesPage-DzHEx2O4.js +3 -0
  401. package/frontend/dist/js/{OptimizedSyntaxHighlighter-Dz7D1LPB.js → OptimizedSyntaxHighlighter-CZNPwN0i.js} +1 -1
  402. package/frontend/dist/js/PersonasPage-M_WKH2a9.js +13 -0
  403. package/frontend/dist/js/PluginUsagePage-Ctoka6JZ.js +1 -0
  404. package/frontend/dist/js/RichMessageContent-BqgafH4p.js +3 -0
  405. package/frontend/dist/js/SettingsModal-R9EDadAV.js +19 -0
  406. package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
  407. package/frontend/dist/js/SystemPage-aOkrSuY7.js +1 -0
  408. package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +1 -0
  409. package/frontend/dist/js/WorkPage-DxZISerQ.js +6 -0
  410. package/frontend/dist/js/api-6bSMtSNh.js +14 -0
  411. package/frontend/dist/js/{appStore-0JnCUlEq.js → appStore-CdObhQBb.js} +2 -2
  412. package/frontend/dist/js/ar-DT_VLBO3.js +2 -0
  413. package/frontend/dist/js/{authStore-DbMdvNgJ.js → authStore-DbqqrfZv.js} +3 -3
  414. package/frontend/dist/js/{babel-BsYoxD-7.js → babel-DSqqk5kt.js} +1 -1
  415. package/frontend/dist/js/bn-BrvEqhGA.js +2 -0
  416. package/frontend/dist/js/chatStore-DbZPJNsu.js +3 -0
  417. package/frontend/dist/js/{config-DSOYQ9a3.js → config-8KdgjtEx.js} +1 -1
  418. package/frontend/dist/js/cs-BthnM_YI.js +2 -0
  419. package/frontend/dist/js/da-DCth-6_j.js +2 -0
  420. package/frontend/dist/js/de-BBWt0gJ_.js +2 -0
  421. package/frontend/dist/js/es-DuslOPqM.js +2 -0
  422. package/frontend/dist/js/{estree-BcnBcOAx.js → estree-BU5-LV_1.js} +3 -3
  423. package/frontend/dist/js/evaluationsApi-CwZJsgeG.js +1 -0
  424. package/frontend/dist/js/fr-DZAeg46S.js +2 -0
  425. package/frontend/dist/js/hi-ijDSiY77.js +2 -0
  426. package/frontend/dist/js/{html-DkY55Jys.js → html-DeoAy2bo.js} +2 -2
  427. package/frontend/dist/js/id-BS6qS0oq.js +2 -0
  428. package/frontend/dist/js/is-CO2PMDte.js +2 -0
  429. package/frontend/dist/js/it-ChhxT4hs.js +2 -0
  430. package/frontend/dist/js/ja-cyeqUeJN.js +2 -0
  431. package/frontend/dist/js/ko-CfqHTLXj.js +2 -0
  432. package/frontend/dist/js/{markdown-IZSI9DXw.js → markdown-DOLsYkBY.js} +3 -3
  433. package/frontend/dist/js/markdown-core-BK7WVOb7.js +32 -0
  434. package/frontend/dist/js/{markdown-math-DK846gXU.js → markdown-math-e1ByS3KY.js} +5 -5
  435. package/frontend/dist/js/{messageCodeStyles-BFNR9Wv6.js → messageCodeStyles-DhVgizF-.js} +2 -2
  436. package/frontend/dist/js/ms-DZ5pACe1.js +2 -0
  437. package/frontend/dist/js/nl-BsRsnOVp.js +2 -0
  438. package/frontend/dist/js/pl-DXSTAW4M.js +2 -0
  439. package/frontend/dist/js/{postcss-BJ0okz7n.js → postcss-Bg15EcFE.js} +1 -1
  440. package/frontend/dist/js/pt-DmDx0JxB.js +2 -0
  441. package/frontend/dist/js/{react-vendor-C5yShNlM.js → react-vendor-BG_HPV6X.js} +1 -1
  442. package/frontend/dist/js/router-vendor-CbexJIsv.js +1 -0
  443. package/frontend/dist/js/ru-d2g8EWfY.js +2 -0
  444. package/frontend/dist/js/{standalone-Csw3jfJ_.js → standalone-BO5pzI8_.js} +3 -3
  445. package/frontend/dist/js/sv-CIhYUTVQ.js +2 -0
  446. package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-DcR9Vhb7.js} +3 -3
  447. package/frontend/dist/js/th-B3wSxanB.js +2 -0
  448. package/frontend/dist/js/tr-R4UGgPOY.js +2 -0
  449. package/frontend/dist/js/{typescript-CnF4UVx7.js → typescript-6GJ8APmn.js} +1 -1
  450. package/frontend/dist/js/ui-CV0LYmkM.js +2 -0
  451. package/frontend/dist/js/ui-vendor-CWjIBW-z.js +177 -0
  452. package/frontend/dist/js/uk-BzUF4Vkt.js +2 -0
  453. package/frontend/dist/js/{useTranslation-Bho4HCyg.js → useTranslation-5b5UhAc9.js} +1 -1
  454. package/frontend/dist/js/{utils-D9W1Lnkn.js → utils-BGrdX9ie.js} +1 -1
  455. package/frontend/dist/js/{utils-vendor-DWh39_3x.js → utils-vendor-9bQ62WeD.js} +1 -1
  456. package/frontend/dist/js/vi-CKc6Fg4h.js +2 -0
  457. package/frontend/dist/js/{workApi-C3uy9EDT.js → workApi-BruWTlHM.js} +3 -3
  458. package/frontend/dist/js/{yaml-DzT5hBSH.js → yaml-DUeWcOOH.js} +2 -2
  459. package/frontend/dist/js/zh-CXL-kDe8.js +2 -0
  460. package/package.json +2 -2
  461. package/plugins/openai.json +52 -9
  462. package/frontend/dist/assets/index-6o-Hc2wS.js +0 -41
  463. package/frontend/dist/assets/index-D-pM957b.css +0 -1
  464. package/frontend/dist/js/ArtifactSlideOutPanel-CSFRluWA.js +0 -1
  465. package/frontend/dist/js/AutomationsPage-KUeWoZNv.js +0 -1
  466. package/frontend/dist/js/CalendarPage-D9I972w8.js +0 -1
  467. package/frontend/dist/js/ChatPage-CmBx4oAL.js +0 -16
  468. package/frontend/dist/js/GalleryPage-bLCrdJN_.js +0 -1
  469. package/frontend/dist/js/HomePage-Uc6PEg-U.js +0 -1
  470. package/frontend/dist/js/LibreClawPage-CG63DHg1.js +0 -1
  471. package/frontend/dist/js/ModelSelector-yxJC64rM.js +0 -1
  472. package/frontend/dist/js/ModelsPage-1R_TxgmJ.js +0 -2
  473. package/frontend/dist/js/NotesPage-L65j5HoW.js +0 -1
  474. package/frontend/dist/js/PersonasPage-CKeBpHIH.js +0 -13
  475. package/frontend/dist/js/PluginUsagePage-BX1SKMbW.js +0 -1
  476. package/frontend/dist/js/RichMessageContent-DiySVYGB.js +0 -3
  477. package/frontend/dist/js/SettingsModal-68SG1uZ2.js +0 -1
  478. package/frontend/dist/js/SystemPage-CytpZiQV.js +0 -1
  479. package/frontend/dist/js/UserManagementPage-BzJBvZiS.js +0 -1
  480. package/frontend/dist/js/WorkPage-C8gr0QJe.js +0 -6
  481. package/frontend/dist/js/api-BDtqBtqw.js +0 -14
  482. package/frontend/dist/js/ar-CSpi37Gr.js +0 -2
  483. package/frontend/dist/js/bn-CyH1BeDD.js +0 -2
  484. package/frontend/dist/js/chatStore-CHQ2uINS.js +0 -3
  485. package/frontend/dist/js/cs-Cv2NfRK5.js +0 -2
  486. package/frontend/dist/js/da-D6D6IvPK.js +0 -2
  487. package/frontend/dist/js/de-BNoJJTrT.js +0 -2
  488. package/frontend/dist/js/es-kzo9C7q_.js +0 -2
  489. package/frontend/dist/js/fr-CjHYvJRp.js +0 -2
  490. package/frontend/dist/js/hi-BU98AdCQ.js +0 -2
  491. package/frontend/dist/js/id-CpdedejX.js +0 -2
  492. package/frontend/dist/js/is-Cp5dDWBH.js +0 -2
  493. package/frontend/dist/js/it-CuH_cK4U.js +0 -2
  494. package/frontend/dist/js/ja-BWXXXiHn.js +0 -2
  495. package/frontend/dist/js/ko-DQgv2M1t.js +0 -2
  496. package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
  497. package/frontend/dist/js/ms-DCcRoIcX.js +0 -2
  498. package/frontend/dist/js/nl-CbKR1_EU.js +0 -2
  499. package/frontend/dist/js/pl-CRyJZccn.js +0 -2
  500. package/frontend/dist/js/pt-BXYmHFGH.js +0 -2
  501. package/frontend/dist/js/router-vendor-DGFGM3EP.js +0 -1
  502. package/frontend/dist/js/ru-M9SyZG4b.js +0 -2
  503. package/frontend/dist/js/sv-DJ486LTU.js +0 -2
  504. package/frontend/dist/js/th-Ch7gKtZv.js +0 -2
  505. package/frontend/dist/js/tr-ClehWhSC.js +0 -2
  506. package/frontend/dist/js/ui-CC-K19wO.js +0 -2
  507. package/frontend/dist/js/ui-vendor-B1UgO3vd.js +0 -177
  508. package/frontend/dist/js/uk-BqAd5zHF.js +0 -2
  509. package/frontend/dist/js/vi-D9gjlDVB.js +0 -2
  510. package/frontend/dist/js/zh-DKTyHkiR.js +0 -2
@@ -0,0 +1,661 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * First-party chat tools (TOOL-01). Every builtin executes with the
19
+ * invoking user's identity and effective permissions: web search honors
20
+ * the web-search feature gate, document search reaches the user's own and
21
+ * shared collections, and skill loading resolves the user's own enabled
22
+ * skills. Mutating tools (notes, calendar) are marked side-effecting and
23
+ * run behind the standard approval flow. Outputs are bounded before they
24
+ * re-enter the model.
25
+ */
26
+ import { randomUUID } from 'node:crypto';
27
+ import { ResourcePolicyError } from '../utils/resourceLimits.js';
28
+ import { userCanUseWebSearch, webSearch } from './webSearchService.js';
29
+ import documentService from './documentService.js';
30
+ import { readDocumentSegments, resolveSegmentLabel, } from '../utils/documentExtraction.js';
31
+ import { getSkillBySlug, getSkillFile, listSkillFiles, listSkills, } from './skillService.js';
32
+ import { createNote, getNote, listNotes, NoteError, updateNote, } from './noteService.js';
33
+ const MAX_RESULT_CHARS = 24000;
34
+ const READ_DOCUMENT_WINDOW = 8000;
35
+ const bounded = (text) => text.length > MAX_RESULT_CHARS
36
+ ? {
37
+ text: `${text.slice(0, MAX_RESULT_CHARS)}\n[truncated]`,
38
+ truncated: true,
39
+ }
40
+ : { text, truncated: false };
41
+ const asString = (value) => typeof value === 'string' ? value : '';
42
+ const BUILTIN_TOOLS = [
43
+ {
44
+ name: 'web_search',
45
+ description: 'Search the web and return result titles, URLs, and snippets. Use for current events or facts outside the conversation.',
46
+ paramsSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ query: { type: 'string', description: 'The search query' },
50
+ max_results: {
51
+ type: 'integer',
52
+ description: 'Maximum results to return',
53
+ },
54
+ },
55
+ required: ['query'],
56
+ },
57
+ available: async (context) => userCanUseWebSearch({
58
+ id: context.actor.userId,
59
+ ...(context.actor.role !== undefined
60
+ ? { role: context.actor.role }
61
+ : {}),
62
+ ...(context.actor.status !== undefined
63
+ ? { status: context.actor.status }
64
+ : {}),
65
+ }),
66
+ execute: async (args, context) => {
67
+ const query = asString(args.query).trim();
68
+ if (!query) {
69
+ return {
70
+ text: 'A search query is required.',
71
+ isError: true,
72
+ truncated: false,
73
+ };
74
+ }
75
+ const maxResults = typeof args.max_results === 'number' ? args.max_results : undefined;
76
+ const results = await webSearch(query, maxResults, context.signal);
77
+ if (results.length === 0) {
78
+ return { text: 'No results found.', isError: false, truncated: false };
79
+ }
80
+ const rendered = results
81
+ .map((result, index) => `${index + 1}. ${result.title}\n${result.url}\n${result.content}`)
82
+ .join('\n\n');
83
+ return { ...bounded(rendered), isError: false };
84
+ },
85
+ },
86
+ {
87
+ name: 'search_documents',
88
+ description: "Search the user's uploaded documents and knowledge collections; returns matching passages with their source document.",
89
+ paramsSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ query: { type: 'string', description: 'What to look for' },
93
+ limit: { type: 'integer', description: 'Maximum passages to return' },
94
+ },
95
+ required: ['query'],
96
+ },
97
+ available: async () => true,
98
+ execute: async (args, context) => {
99
+ const query = asString(args.query).trim();
100
+ if (!query) {
101
+ return {
102
+ text: 'A search query is required.',
103
+ isError: true,
104
+ truncated: false,
105
+ };
106
+ }
107
+ const limit = Math.min(Math.max(typeof args.limit === 'number' ? Math.trunc(args.limit) : 5, 1), 10);
108
+ const chunks = await documentService.searchDocuments(query, context.actor.userId, context.sessionId, limit, context.collectionIds ? [...context.collectionIds] : undefined, context.signal);
109
+ if (chunks.length === 0) {
110
+ return {
111
+ text: 'No matching passages found in the available documents.',
112
+ isError: false,
113
+ truncated: false,
114
+ };
115
+ }
116
+ const titles = new Map();
117
+ for (const chunk of chunks) {
118
+ if (titles.has(chunk.documentId))
119
+ continue;
120
+ const document = await documentService.getDocument(chunk.documentId, context.actor.userId);
121
+ titles.set(chunk.documentId, document?.title || document?.filename || chunk.documentId);
122
+ }
123
+ const rendered = chunks
124
+ .map(chunk => {
125
+ const cite = [
126
+ titles.get(chunk.documentId),
127
+ `chunk ${chunk.chunkIndex}`,
128
+ ...(chunk.location ? [chunk.location] : []),
129
+ ].join(' · ');
130
+ return `[${cite}]\n${chunk.content}`;
131
+ })
132
+ .join('\n\n');
133
+ return { ...bounded(rendered), isError: false };
134
+ },
135
+ },
136
+ {
137
+ name: 'list_documents',
138
+ description: 'List the documents available to this chat: its uploads, attached knowledge collections, and standing uploads. Returns ids for read_document.',
139
+ paramsSchema: {
140
+ type: 'object',
141
+ properties: {},
142
+ },
143
+ available: async () => true,
144
+ execute: async (_args, context) => {
145
+ const documents = await documentService.getDocumentsInScope(context.actor.userId, context.sessionId, context.collectionIds ? [...context.collectionIds] : undefined);
146
+ if (documents.length === 0) {
147
+ return {
148
+ text: 'No documents are available in this chat.',
149
+ isError: false,
150
+ truncated: false,
151
+ };
152
+ }
153
+ const rendered = documents
154
+ .map(document => {
155
+ const chars = (document.content ?? '').length;
156
+ const type = document.fileType ?? 'txt';
157
+ return `- ${document.filename} (id: ${document.id}, ${type}, ${chars} chars)`;
158
+ })
159
+ .join('\n');
160
+ return { ...bounded(rendered), isError: false };
161
+ },
162
+ },
163
+ {
164
+ name: 'read_document',
165
+ description: 'Read part of an available document by id. Returns up to 8000 characters from the requested offset with its source location.',
166
+ paramsSchema: {
167
+ type: 'object',
168
+ properties: {
169
+ document_id: {
170
+ type: 'string',
171
+ description: 'The document id from list_documents or search results',
172
+ },
173
+ offset: {
174
+ type: 'integer',
175
+ description: 'Character offset to start reading from (default 0)',
176
+ },
177
+ },
178
+ required: ['document_id'],
179
+ },
180
+ available: async () => true,
181
+ execute: async (args, context) => {
182
+ const documentId = asString(args.document_id).trim();
183
+ if (!documentId) {
184
+ return {
185
+ text: 'A document_id is required.',
186
+ isError: true,
187
+ truncated: false,
188
+ };
189
+ }
190
+ const documents = await documentService.getDocumentsInScope(context.actor.userId, context.sessionId, context.collectionIds ? [...context.collectionIds] : undefined);
191
+ const document = documents.find(candidate => candidate.id === documentId);
192
+ if (!document) {
193
+ return {
194
+ text: `No available document has the id "${documentId}". Call list_documents first.`,
195
+ isError: true,
196
+ truncated: false,
197
+ };
198
+ }
199
+ const content = document.content ?? '';
200
+ const total = content.length;
201
+ const requestedOffset = typeof args.offset === 'number' && Number.isFinite(args.offset)
202
+ ? Math.trunc(args.offset)
203
+ : 0;
204
+ const offset = Math.min(Math.max(requestedOffset, 0), total);
205
+ const window = content.slice(offset, offset + READ_DOCUMENT_WINDOW);
206
+ if (!window) {
207
+ return {
208
+ text: `The document "${document.filename}" has ${total} characters; offset ${offset} is past its end.`,
209
+ isError: true,
210
+ truncated: false,
211
+ };
212
+ }
213
+ const location = resolveSegmentLabel(readDocumentSegments(document.metadata), offset, offset + window.length);
214
+ const end = offset + window.length;
215
+ const header = [
216
+ `# ${document.filename}`,
217
+ `chars ${offset}-${end} of ${total}`,
218
+ ...(location ? [location] : []),
219
+ ...(end < total ? [`continue with offset ${end}`] : []),
220
+ ].join(' · ');
221
+ return { ...bounded(`${header}\n\n${window}`), isError: false };
222
+ },
223
+ },
224
+ {
225
+ name: 'list_notes',
226
+ description: "List the user's notes (own and shared) with their ids and titles.",
227
+ paramsSchema: {
228
+ type: 'object',
229
+ properties: {},
230
+ },
231
+ available: async () => true,
232
+ execute: async (_args, context) => {
233
+ const all = await listNotes(context.actor);
234
+ if (all.length === 0) {
235
+ return {
236
+ text: 'No notes exist yet.',
237
+ isError: false,
238
+ truncated: false,
239
+ };
240
+ }
241
+ const rendered = all
242
+ .map(entry => {
243
+ const marks = [
244
+ ...(entry.pinned ? ['pinned'] : []),
245
+ ...(entry.shared ? [`shared, ${entry.shared.permission}`] : []),
246
+ ];
247
+ const suffix = marks.length > 0 ? ` [${marks.join('; ')}]` : '';
248
+ return `- ${entry.title || 'Untitled'} (id: ${entry.id})${suffix}`;
249
+ })
250
+ .join('\n');
251
+ return { ...bounded(rendered), isError: false };
252
+ },
253
+ },
254
+ {
255
+ name: 'read_note',
256
+ description: 'Read the full content of one note by its id.',
257
+ paramsSchema: {
258
+ type: 'object',
259
+ properties: {
260
+ note_id: { type: 'string', description: 'The note id from list_notes' },
261
+ },
262
+ required: ['note_id'],
263
+ },
264
+ available: async () => true,
265
+ execute: async (args, context) => {
266
+ const noteId = asString(args.note_id).trim();
267
+ try {
268
+ const note = await getNote(context.actor, noteId);
269
+ return {
270
+ ...bounded(`# ${note.title || 'Untitled'}\n\n${note.content}`),
271
+ isError: false,
272
+ };
273
+ }
274
+ catch (error) {
275
+ if (error instanceof NoteError) {
276
+ return { text: error.message, isError: true, truncated: false };
277
+ }
278
+ throw error;
279
+ }
280
+ },
281
+ },
282
+ {
283
+ name: 'create_note',
284
+ description: 'Create a new note with a title and Markdown content. Requires approval.',
285
+ sideEffect: true,
286
+ paramsSchema: {
287
+ type: 'object',
288
+ properties: {
289
+ title: { type: 'string', description: 'The note title' },
290
+ content: { type: 'string', description: 'The Markdown note content' },
291
+ },
292
+ required: ['title', 'content'],
293
+ },
294
+ available: async () => true,
295
+ execute: async (args, context) => {
296
+ try {
297
+ const note = await createNote(context.actor, {
298
+ title: asString(args.title),
299
+ content: asString(args.content),
300
+ });
301
+ return {
302
+ text: `Created note "${note.title}" (id: ${note.id}).`,
303
+ isError: false,
304
+ truncated: false,
305
+ };
306
+ }
307
+ catch (error) {
308
+ if (error instanceof NoteError) {
309
+ return { text: error.message, isError: true, truncated: false };
310
+ }
311
+ throw error;
312
+ }
313
+ },
314
+ },
315
+ {
316
+ name: 'update_note',
317
+ description: 'Replace the content (and optionally the title) of an existing note. The previous state is kept as a restorable revision. Requires approval.',
318
+ sideEffect: true,
319
+ paramsSchema: {
320
+ type: 'object',
321
+ properties: {
322
+ note_id: { type: 'string', description: 'The note id from list_notes' },
323
+ content: {
324
+ type: 'string',
325
+ description: 'The complete replacement Markdown content',
326
+ },
327
+ title: { type: 'string', description: 'Optional replacement title' },
328
+ },
329
+ required: ['note_id', 'content'],
330
+ },
331
+ available: async () => true,
332
+ execute: async (args, context) => {
333
+ const noteId = asString(args.note_id).trim();
334
+ try {
335
+ const note = await updateNote(context.actor, noteId, {
336
+ content: asString(args.content),
337
+ ...(typeof args.title === 'string' ? { title: args.title } : {}),
338
+ });
339
+ return {
340
+ text: `Updated note "${note.title}" (id: ${note.id}); the previous version is saved as a revision.`,
341
+ isError: false,
342
+ truncated: false,
343
+ };
344
+ }
345
+ catch (error) {
346
+ if (error instanceof NoteError) {
347
+ return { text: error.message, isError: true, truncated: false };
348
+ }
349
+ throw error;
350
+ }
351
+ },
352
+ },
353
+ {
354
+ name: 'list_calendar_events',
355
+ description: "List the user's calendar events (own and shared calendars) in a " +
356
+ 'date range. Times are epoch milliseconds.',
357
+ paramsSchema: {
358
+ type: 'object',
359
+ properties: {
360
+ from: {
361
+ type: 'number',
362
+ description: 'Range start as epoch milliseconds',
363
+ },
364
+ to: { type: 'number', description: 'Range end as epoch milliseconds' },
365
+ },
366
+ required: ['from', 'to'],
367
+ },
368
+ available: async () => true,
369
+ execute: async (args, context) => {
370
+ const from = Number(args.from);
371
+ const to = Number(args.to);
372
+ if (!Number.isSafeInteger(from) ||
373
+ !Number.isSafeInteger(to) ||
374
+ to <= from) {
375
+ return {
376
+ text: 'from and to must be an increasing epoch-ms range.',
377
+ isError: true,
378
+ truncated: false,
379
+ };
380
+ }
381
+ try {
382
+ const { calendarService } = await import('./calendarService.js');
383
+ const { events } = await calendarService.listEventsForActor(context.actor, { from, to });
384
+ const scoped = events.filter(event => event.startAt >= from && event.startAt < to);
385
+ if (scoped.length === 0) {
386
+ return {
387
+ text: 'No calendar events in this range.',
388
+ isError: false,
389
+ truncated: false,
390
+ };
391
+ }
392
+ const rendered = scoped
393
+ .sort((left, right) => left.startAt - right.startAt)
394
+ .map(event => {
395
+ const start = new Date(event.startAt).toISOString();
396
+ const marks = [
397
+ ...(event.allDay ? ['all-day'] : []),
398
+ ...(event.recurrence ? ['recurring'] : []),
399
+ ...(event.shared ? ['shared'] : []),
400
+ ];
401
+ const suffix = marks.length > 0 ? ` [${marks.join('; ')}]` : '';
402
+ return `- ${start} ${event.title} (id: ${event.id})${suffix}`;
403
+ })
404
+ .join('\n');
405
+ return { ...bounded(rendered), isError: false };
406
+ }
407
+ catch (error) {
408
+ if (error instanceof ResourcePolicyError) {
409
+ return { text: error.message, isError: true, truncated: false };
410
+ }
411
+ throw error;
412
+ }
413
+ },
414
+ },
415
+ {
416
+ name: 'create_calendar_event',
417
+ description: 'Create a calendar event. Times are epoch milliseconds. Requires approval.',
418
+ sideEffect: true,
419
+ paramsSchema: {
420
+ type: 'object',
421
+ properties: {
422
+ title: { type: 'string', description: 'The event title' },
423
+ start_at: {
424
+ type: 'number',
425
+ description: 'Event start as epoch milliseconds',
426
+ },
427
+ end_at: {
428
+ type: 'number',
429
+ description: 'Optional event end as epoch milliseconds',
430
+ },
431
+ notes: { type: 'string', description: 'Optional event notes' },
432
+ all_day: {
433
+ type: 'boolean',
434
+ description: 'Whether the event is all-day',
435
+ },
436
+ },
437
+ required: ['title', 'start_at'],
438
+ },
439
+ available: async () => true,
440
+ execute: async (args, context) => {
441
+ const startAt = Number(args.start_at);
442
+ const endAt = args.end_at !== undefined ? Number(args.end_at) : undefined;
443
+ if (!Number.isSafeInteger(startAt) ||
444
+ (endAt !== undefined &&
445
+ (!Number.isSafeInteger(endAt) || endAt < startAt))) {
446
+ return {
447
+ text: 'start_at (and optional end_at) must be epoch milliseconds.',
448
+ isError: true,
449
+ truncated: false,
450
+ };
451
+ }
452
+ try {
453
+ const { calendarService } = await import('./calendarService.js');
454
+ const now = Date.now();
455
+ const saved = await calendarService.saveEventForActor(context.actor, {
456
+ id: randomUUID(),
457
+ title: asString(args.title),
458
+ ...(typeof args.notes === 'string' && args.notes
459
+ ? { notes: args.notes }
460
+ : {}),
461
+ startAt,
462
+ ...(endAt !== undefined ? { endAt } : {}),
463
+ allDay: args.all_day === true,
464
+ createdAt: now,
465
+ updatedAt: now,
466
+ }, undefined);
467
+ return {
468
+ text: `Created event "${saved.event.title}" at ` +
469
+ `${new Date(saved.event.startAt).toISOString()} ` +
470
+ `(id: ${saved.event.id}).`,
471
+ isError: false,
472
+ truncated: false,
473
+ };
474
+ }
475
+ catch (error) {
476
+ if (error instanceof ResourcePolicyError) {
477
+ return { text: error.message, isError: true, truncated: false };
478
+ }
479
+ throw error;
480
+ }
481
+ },
482
+ },
483
+ {
484
+ name: 'delete_calendar_event',
485
+ description: 'Delete one calendar event by its id. Requires approval.',
486
+ sideEffect: true,
487
+ paramsSchema: {
488
+ type: 'object',
489
+ properties: {
490
+ event_id: {
491
+ type: 'string',
492
+ description: 'The event id from list_calendar_events',
493
+ },
494
+ },
495
+ required: ['event_id'],
496
+ },
497
+ available: async () => true,
498
+ execute: async (args, context) => {
499
+ const { calendarService } = await import('./calendarService.js');
500
+ const deleted = await calendarService.deleteEventForActor(context.actor, asString(args.event_id).trim());
501
+ return deleted
502
+ ? { text: 'Event deleted.', isError: false, truncated: false }
503
+ : { text: 'Event not found.', isError: true, truncated: false };
504
+ },
505
+ },
506
+ {
507
+ name: 'load_skill',
508
+ description: 'Load the full instructions of one of the available skills by its slug.',
509
+ paramsSchema: {
510
+ type: 'object',
511
+ properties: {
512
+ slug: { type: 'string', description: 'The skill slug to load' },
513
+ },
514
+ required: ['slug'],
515
+ },
516
+ available: async (context) => (await availableSkills(context)).length > 0,
517
+ execute: async (args, context) => {
518
+ const slug = asString(args.slug).trim();
519
+ const permitted = await availableSkills(context);
520
+ const listed = permitted.find(skill => skill.slug === slug);
521
+ const skill = listed
522
+ ? await getSkillBySlug(context.actor.userId, slug)
523
+ : null;
524
+ if (!skill || !skill.enabled) {
525
+ return {
526
+ text: `No enabled skill named "${slug}" is available.`,
527
+ isError: true,
528
+ truncated: false,
529
+ };
530
+ }
531
+ const files = (await listSkillFiles(skill.id, context.actor)) ?? [];
532
+ const inventory = files.length > 0
533
+ ? [
534
+ '',
535
+ '',
536
+ 'Bundled files (read one with read_skill_file):',
537
+ ...files.map(file => `- ${file.path} (${file.size} bytes)`),
538
+ ].join('\n')
539
+ : '';
540
+ return {
541
+ ...bounded(`# Skill: ${skill.name}\n\n${skill.instructions}${inventory}`),
542
+ isError: false,
543
+ };
544
+ },
545
+ },
546
+ {
547
+ name: 'read_skill_file',
548
+ description: 'Read a file bundled with a loaded skill. Pass the skill slug and the relative path listed by load_skill.',
549
+ paramsSchema: {
550
+ type: 'object',
551
+ properties: {
552
+ slug: { type: 'string', description: 'The skill slug' },
553
+ path: {
554
+ type: 'string',
555
+ description: 'The bundled file path, as listed by load_skill',
556
+ },
557
+ },
558
+ required: ['slug', 'path'],
559
+ },
560
+ available: async (context) => (await availableSkills(context)).length > 0,
561
+ execute: async (args, context) => {
562
+ const slug = asString(args.slug).trim();
563
+ const path = asString(args.path).trim();
564
+ const permitted = await availableSkills(context);
565
+ const listed = permitted.find(skill => skill.slug === slug);
566
+ const skill = listed
567
+ ? await getSkillBySlug(context.actor.userId, slug)
568
+ : null;
569
+ if (!skill || !skill.enabled) {
570
+ return {
571
+ text: `No enabled skill named "${slug}" is available.`,
572
+ isError: true,
573
+ truncated: false,
574
+ };
575
+ }
576
+ let file;
577
+ try {
578
+ file = await getSkillFile(skill.id, context.actor, path);
579
+ }
580
+ catch {
581
+ file = null;
582
+ }
583
+ if (!file) {
584
+ return {
585
+ text: `The skill "${slug}" bundles no file at "${path}". Call load_skill to list its files.`,
586
+ isError: true,
587
+ truncated: false,
588
+ };
589
+ }
590
+ return {
591
+ ...bounded(`# ${slug}/${file.path}\n\n${file.content}`),
592
+ isError: false,
593
+ };
594
+ },
595
+ },
596
+ ];
597
+ const MAX_MANIFEST_SKILLS = 30;
598
+ /** Enabled skills visible to this turn, honoring a profile's skill binding. */
599
+ const availableSkills = async (context) => {
600
+ const skills = await listSkills(context.actor.userId);
601
+ return skills
602
+ .filter(skill => skill.enabled)
603
+ .filter(skill => !context.skillIds || context.skillIds.includes(skill.id))
604
+ .slice(0, MAX_MANIFEST_SKILLS)
605
+ .map(skill => ({
606
+ slug: skill.slug,
607
+ name: skill.name,
608
+ description: skill.description,
609
+ }));
610
+ };
611
+ /**
612
+ * The lazy skill manifest travels in the load_skill tool description, so it
613
+ * reaches the model identically on every provider without touching the
614
+ * system-prompt plumbing.
615
+ */
616
+ const loadSkillDescription = (skills) => [
617
+ 'Load the full instructions of one of the available skills by its slug before applying it. Available skills:',
618
+ ...skills.map(skill => `- ${skill.slug}: ${skill.name} — ${skill.description.slice(0, 200)}`),
619
+ ].join('\n');
620
+ export const BUILTIN_TOOL_NAMES = BUILTIN_TOOLS.map(tool => tool.name);
621
+ /** The builtin tools available to this actor, optionally filtered by name. */
622
+ export async function effectiveBuiltinTools(context, names) {
623
+ const catalog = [];
624
+ for (const tool of BUILTIN_TOOLS) {
625
+ if (names && !names.includes(tool.name))
626
+ continue;
627
+ if (!(await tool.available(context)))
628
+ continue;
629
+ const description = tool.name === 'load_skill'
630
+ ? loadSkillDescription(await availableSkills(context))
631
+ : tool.description;
632
+ catalog.push({
633
+ name: tool.name,
634
+ description,
635
+ paramsSchema: tool.paramsSchema,
636
+ sideEffect: tool.sideEffect === true,
637
+ source: 'builtin',
638
+ toolName: tool.name,
639
+ });
640
+ }
641
+ return catalog;
642
+ }
643
+ export async function executeBuiltinTool(name, args, context) {
644
+ const tool = BUILTIN_TOOLS.find(candidate => candidate.name === name);
645
+ if (!tool) {
646
+ return {
647
+ text: `Unknown builtin tool: ${name}`,
648
+ isError: true,
649
+ truncated: false,
650
+ };
651
+ }
652
+ if (!(await tool.available(context))) {
653
+ return {
654
+ text: `The ${name} tool is not available to this account.`,
655
+ isError: true,
656
+ truncated: false,
657
+ };
658
+ }
659
+ return tool.execute(args, context);
660
+ }
661
+ //# sourceMappingURL=builtinToolsService.js.map