@nocobase/app-plugin-agents 2.0.0-beta.0 → 2.0.0-beta.10

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 (365) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +26 -4
  3. package/dist/client/chat/api.d.ts +6 -1
  4. package/dist/client/chat/api.d.ts.map +1 -1
  5. package/dist/client/chat/api.js +18 -0
  6. package/dist/client/chat/api.js.map +1 -1
  7. package/dist/client/chat/coalesced-invalidation.d.ts +3 -8
  8. package/dist/client/chat/coalesced-invalidation.d.ts.map +1 -1
  9. package/dist/client/chat/coalesced-invalidation.js +16 -21
  10. package/dist/client/chat/coalesced-invalidation.js.map +1 -1
  11. package/dist/client/chat/controller.d.ts +30 -3
  12. package/dist/client/chat/controller.d.ts.map +1 -1
  13. package/dist/client/chat/controller.js +477 -78
  14. package/dist/client/chat/controller.js.map +1 -1
  15. package/dist/client/chat/notices.d.ts +12 -0
  16. package/dist/client/chat/notices.d.ts.map +1 -0
  17. package/dist/client/chat/notices.js +15 -0
  18. package/dist/client/chat/notices.js.map +1 -0
  19. package/dist/client/chat/provider.d.ts.map +1 -1
  20. package/dist/client/chat/provider.js +7 -4
  21. package/dist/client/chat/provider.js.map +1 -1
  22. package/dist/client/chat/submissions.d.ts +16 -0
  23. package/dist/client/chat/submissions.d.ts.map +1 -1
  24. package/dist/client/chat/submissions.js +22 -0
  25. package/dist/client/chat/submissions.js.map +1 -1
  26. package/dist/client/chat/use-chat.d.ts +4 -2
  27. package/dist/client/chat/use-chat.d.ts.map +1 -1
  28. package/dist/client/chat/use-chat.js +83 -51
  29. package/dist/client/chat/use-chat.js.map +1 -1
  30. package/dist/client/chat.d.ts +1 -0
  31. package/dist/client/chat.d.ts.map +1 -1
  32. package/dist/client/chat.js +1 -0
  33. package/dist/client/chat.js.map +1 -1
  34. package/dist/client/components/page-container.js +1 -1
  35. package/dist/client/components/page-container.js.map +1 -1
  36. package/dist/client/components/route-child-page.d.ts +1 -1
  37. package/dist/client/components/route-child-page.d.ts.map +1 -1
  38. package/dist/client/components/route-child-page.js +18 -2
  39. package/dist/client/components/route-child-page.js.map +1 -1
  40. package/dist/client/components/route-overlay.d.ts +4 -1
  41. package/dist/client/components/route-overlay.d.ts.map +1 -1
  42. package/dist/client/components/route-overlay.js +32 -3
  43. package/dist/client/components/route-overlay.js.map +1 -1
  44. package/dist/client/components/ui/alert-dialog.d.ts +3 -1
  45. package/dist/client/components/ui/alert-dialog.d.ts.map +1 -1
  46. package/dist/client/components/ui/alert-dialog.js +2 -2
  47. package/dist/client/components/ui/alert-dialog.js.map +1 -1
  48. package/dist/client/components/unsaved-changes.d.ts.map +1 -1
  49. package/dist/client/components/unsaved-changes.js +17 -4
  50. package/dist/client/components/unsaved-changes.js.map +1 -1
  51. package/dist/client/components/use-route-overlay.d.ts +2 -9
  52. package/dist/client/components/use-route-overlay.d.ts.map +1 -1
  53. package/dist/client/components/use-route-overlay.js +5 -3
  54. package/dist/client/components/use-route-overlay.js.map +1 -1
  55. package/dist/client/hooks/use-realtime-topic.d.ts +1 -1
  56. package/dist/client/hooks/use-realtime-topic.d.ts.map +1 -1
  57. package/dist/client/hooks/use-realtime-topic.js +8 -4
  58. package/dist/client/hooks/use-realtime-topic.js.map +1 -1
  59. package/dist/client/kit.d.ts.map +1 -1
  60. package/dist/client/kit.js +30 -5
  61. package/dist/client/kit.js.map +1 -1
  62. package/dist/client/locales/de-DE.d.ts.map +1 -1
  63. package/dist/client/locales/de-DE.js +137 -109
  64. package/dist/client/locales/de-DE.js.map +1 -1
  65. package/dist/client/locales/en-US.d.ts +2 -0
  66. package/dist/client/locales/en-US.d.ts.map +1 -1
  67. package/dist/client/locales/en-US.js +4 -2
  68. package/dist/client/locales/en-US.js.map +1 -1
  69. package/dist/client/locales/es-ES.d.ts.map +1 -1
  70. package/dist/client/locales/es-ES.js +214 -186
  71. package/dist/client/locales/es-ES.js.map +1 -1
  72. package/dist/client/locales/fr-FR.d.ts.map +1 -1
  73. package/dist/client/locales/fr-FR.js +146 -118
  74. package/dist/client/locales/fr-FR.js.map +1 -1
  75. package/dist/client/locales/id-ID.d.ts.map +1 -1
  76. package/dist/client/locales/id-ID.js +135 -107
  77. package/dist/client/locales/id-ID.js.map +1 -1
  78. package/dist/client/locales/index.d.ts.map +1 -1
  79. package/dist/client/locales/index.js +2 -0
  80. package/dist/client/locales/index.js.map +1 -1
  81. package/dist/client/locales/ja-JP.d.ts.map +1 -1
  82. package/dist/client/locales/ja-JP.js +218 -190
  83. package/dist/client/locales/ja-JP.js.map +1 -1
  84. package/dist/client/locales/ko-KR.d.ts +5 -0
  85. package/dist/client/locales/ko-KR.d.ts.map +1 -0
  86. package/dist/client/locales/ko-KR.js +1311 -0
  87. package/dist/client/locales/ko-KR.js.map +1 -0
  88. package/dist/client/locales/pt-BR.d.ts.map +1 -1
  89. package/dist/client/locales/pt-BR.js +208 -180
  90. package/dist/client/locales/pt-BR.js.map +1 -1
  91. package/dist/client/locales/ru-RU.d.ts +5 -0
  92. package/dist/client/locales/ru-RU.d.ts.map +1 -0
  93. package/dist/client/locales/ru-RU.js +1341 -0
  94. package/dist/client/locales/ru-RU.js.map +1 -0
  95. package/dist/client/locales/runWait.en-US.d.ts +2 -0
  96. package/dist/client/locales/runWait.en-US.d.ts.map +1 -1
  97. package/dist/client/locales/runWait.en-US.js +2 -0
  98. package/dist/client/locales/runWait.en-US.js.map +1 -1
  99. package/dist/client/locales/runWait.zh-CN.d.ts.map +1 -1
  100. package/dist/client/locales/runWait.zh-CN.js +2 -0
  101. package/dist/client/locales/runWait.zh-CN.js.map +1 -1
  102. package/dist/client/locales/runtimes.en-US.d.ts +1 -0
  103. package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
  104. package/dist/client/locales/runtimes.en-US.js +3 -2
  105. package/dist/client/locales/runtimes.en-US.js.map +1 -1
  106. package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
  107. package/dist/client/locales/runtimes.zh-CN.js +3 -2
  108. package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
  109. package/dist/client/locales/vi-VN.d.ts.map +1 -1
  110. package/dist/client/locales/vi-VN.js +174 -146
  111. package/dist/client/locales/vi-VN.js.map +1 -1
  112. package/dist/client/locales/zh-CN.d.ts.map +1 -1
  113. package/dist/client/locales/zh-CN.js +4 -2
  114. package/dist/client/locales/zh-CN.js.map +1 -1
  115. package/dist/client/locales/zh-TW.d.ts.map +1 -1
  116. package/dist/client/locales/zh-TW.js +151 -123
  117. package/dist/client/locales/zh-TW.js.map +1 -1
  118. package/dist/client/pages/agents/agent-dialog.js +4 -1
  119. package/dist/client/pages/agents/agent-dialog.js.map +1 -1
  120. package/dist/client/pages/runtimes/quota.d.ts +3 -2
  121. package/dist/client/pages/runtimes/quota.d.ts.map +1 -1
  122. package/dist/client/pages/runtimes/quota.js +8 -3
  123. package/dist/client/pages/runtimes/quota.js.map +1 -1
  124. package/dist/client/pages/runtimes/runner-runs.d.ts.map +1 -1
  125. package/dist/client/pages/runtimes/runner-runs.js +2 -8
  126. package/dist/client/pages/runtimes/runner-runs.js.map +1 -1
  127. package/dist/client/pages/runtimes/runner-tools.d.ts.map +1 -1
  128. package/dist/client/pages/runtimes/runner-tools.js +7 -16
  129. package/dist/client/pages/runtimes/runner-tools.js.map +1 -1
  130. package/dist/client/pages/runtimes/workspace-diagnostics.js +3 -3
  131. package/dist/client/pages/runtimes/workspace-diagnostics.js.map +1 -1
  132. package/dist/client/pages/usage/date-range-picker.d.ts.map +1 -1
  133. package/dist/client/pages/usage/date-range-picker.js +3 -1
  134. package/dist/client/pages/usage/date-range-picker.js.map +1 -1
  135. package/dist/client/routes.d.ts.map +1 -1
  136. package/dist/client/routes.js +7 -0
  137. package/dist/client/routes.js.map +1 -1
  138. package/dist/client/runs/format-wait.d.ts.map +1 -1
  139. package/dist/client/runs/format-wait.js +2 -0
  140. package/dist/client/runs/format-wait.js.map +1 -1
  141. package/dist/database/migrations/.manifest.json +16 -0
  142. package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts +4 -0
  143. package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts.map +1 -0
  144. package/dist/database/migrations/202611070001_ag_run_runner_pin.js +17 -0
  145. package/dist/database/migrations/202611070001_ag_run_runner_pin.js.map +1 -0
  146. package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts +4 -0
  147. package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts.map +1 -0
  148. package/dist/database/migrations/202611080001_ag_conversation_shares.js +25 -0
  149. package/dist/database/migrations/202611080001_ag_conversation_shares.js.map +1 -0
  150. package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts +4 -0
  151. package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts.map +1 -0
  152. package/dist/database/migrations/202611080002_ag_run_failure_params.js +17 -0
  153. package/dist/database/migrations/202611080002_ag_run_failure_params.js.map +1 -0
  154. package/dist/database/migrations/202611090001_ag_runner_preference.d.ts +9 -0
  155. package/dist/database/migrations/202611090001_ag_runner_preference.d.ts.map +1 -0
  156. package/dist/database/migrations/202611090001_ag_runner_preference.js +28 -0
  157. package/dist/database/migrations/202611090001_ag_runner_preference.js.map +1 -0
  158. package/dist/package.json +1 -1
  159. package/dist/server/composition.d.ts +7 -1
  160. package/dist/server/composition.d.ts.map +1 -1
  161. package/dist/server/composition.js +14 -2
  162. package/dist/server/composition.js.map +1 -1
  163. package/dist/server/core/agents/agent.service.d.ts +2 -1
  164. package/dist/server/core/agents/agent.service.d.ts.map +1 -1
  165. package/dist/server/core/agents/agent.service.js.map +1 -1
  166. package/dist/server/core/agents/agent.store.d.ts +2 -2
  167. package/dist/server/core/agents/agent.store.d.ts.map +1 -1
  168. package/dist/server/core/agents/agent.store.js +8 -2
  169. package/dist/server/core/agents/agent.store.js.map +1 -1
  170. package/dist/server/core/brief/brief.d.ts +10 -5
  171. package/dist/server/core/brief/brief.d.ts.map +1 -1
  172. package/dist/server/core/brief/brief.js +36 -13
  173. package/dist/server/core/brief/brief.js.map +1 -1
  174. package/dist/server/core/brief/index.d.ts +1 -1
  175. package/dist/server/core/brief/index.d.ts.map +1 -1
  176. package/dist/server/core/brief/index.js +1 -1
  177. package/dist/server/core/brief/index.js.map +1 -1
  178. package/dist/server/core/conversations/attachments.d.ts +2 -12
  179. package/dist/server/core/conversations/attachments.d.ts.map +1 -1
  180. package/dist/server/core/conversations/attachments.js +56 -14
  181. package/dist/server/core/conversations/attachments.js.map +1 -1
  182. package/dist/server/core/conversations/chat-settings.d.ts +1 -1
  183. package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
  184. package/dist/server/core/conversations/chat-settings.js +6 -0
  185. package/dist/server/core/conversations/chat-settings.js.map +1 -1
  186. package/dist/server/core/conversations/conversation.service.d.ts +3 -1
  187. package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
  188. package/dist/server/core/conversations/conversation.service.js +212 -21
  189. package/dist/server/core/conversations/conversation.service.js.map +1 -1
  190. package/dist/server/core/conversations/conversation.store.d.ts +2 -0
  191. package/dist/server/core/conversations/conversation.store.d.ts.map +1 -1
  192. package/dist/server/core/conversations/conversation.store.js.map +1 -1
  193. package/dist/server/core/conversations/index.d.ts +1 -0
  194. package/dist/server/core/conversations/index.d.ts.map +1 -1
  195. package/dist/server/core/conversations/links.d.ts +3 -0
  196. package/dist/server/core/conversations/links.d.ts.map +1 -1
  197. package/dist/server/core/conversations/links.js +43 -5
  198. package/dist/server/core/conversations/links.js.map +1 -1
  199. package/dist/server/core/conversations/ports.d.ts +8 -2
  200. package/dist/server/core/conversations/ports.d.ts.map +1 -1
  201. package/dist/server/core/conversations/shares.d.ts +38 -0
  202. package/dist/server/core/conversations/shares.d.ts.map +1 -0
  203. package/dist/server/core/conversations/shares.js +189 -0
  204. package/dist/server/core/conversations/shares.js.map +1 -0
  205. package/dist/server/core/runs/claim.d.ts +22 -3
  206. package/dist/server/core/runs/claim.d.ts.map +1 -1
  207. package/dist/server/core/runs/claim.js +260 -42
  208. package/dist/server/core/runs/claim.js.map +1 -1
  209. package/dist/server/core/runs/extensions.d.ts +30 -2
  210. package/dist/server/core/runs/extensions.d.ts.map +1 -1
  211. package/dist/server/core/runs/extensions.js +18 -1
  212. package/dist/server/core/runs/extensions.js.map +1 -1
  213. package/dist/server/core/runs/git-credentials.d.ts.map +1 -1
  214. package/dist/server/core/runs/git-credentials.js +24 -2
  215. package/dist/server/core/runs/git-credentials.js.map +1 -1
  216. package/dist/server/core/runs/identity.d.ts.map +1 -1
  217. package/dist/server/core/runs/identity.js +9 -0
  218. package/dist/server/core/runs/identity.js.map +1 -1
  219. package/dist/server/core/runs/index.d.ts +3 -2
  220. package/dist/server/core/runs/index.d.ts.map +1 -1
  221. package/dist/server/core/runs/index.js +2 -1
  222. package/dist/server/core/runs/index.js.map +1 -1
  223. package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
  224. package/dist/server/core/runs/lifecycle.js +14 -0
  225. package/dist/server/core/runs/lifecycle.js.map +1 -1
  226. package/dist/server/core/runs/npm-credentials.d.ts +35 -0
  227. package/dist/server/core/runs/npm-credentials.d.ts.map +1 -0
  228. package/dist/server/core/runs/npm-credentials.js +83 -0
  229. package/dist/server/core/runs/npm-credentials.js.map +1 -0
  230. package/dist/server/core/runs/ports.d.ts +19 -2
  231. package/dist/server/core/runs/ports.d.ts.map +1 -1
  232. package/dist/server/core/runs/ports.js.map +1 -1
  233. package/dist/server/core/runs/preview.d.ts +1 -4
  234. package/dist/server/core/runs/preview.d.ts.map +1 -1
  235. package/dist/server/core/runs/preview.js +10 -5
  236. package/dist/server/core/runs/preview.js.map +1 -1
  237. package/dist/server/core/runs/quota-wait.d.ts +7 -0
  238. package/dist/server/core/runs/quota-wait.d.ts.map +1 -0
  239. package/dist/server/core/runs/quota-wait.js +56 -0
  240. package/dist/server/core/runs/quota-wait.js.map +1 -0
  241. package/dist/server/core/runs/run-data-purge.d.ts.map +1 -1
  242. package/dist/server/core/runs/run-data-purge.js +1 -0
  243. package/dist/server/core/runs/run-data-purge.js.map +1 -1
  244. package/dist/server/core/runs/run.service.d.ts +29 -5
  245. package/dist/server/core/runs/run.service.d.ts.map +1 -1
  246. package/dist/server/core/runs/run.service.js +101 -10
  247. package/dist/server/core/runs/run.service.js.map +1 -1
  248. package/dist/server/core/runs/run.store.d.ts +24 -0
  249. package/dist/server/core/runs/run.store.d.ts.map +1 -1
  250. package/dist/server/core/runs/run.store.js +44 -0
  251. package/dist/server/core/runs/run.store.js.map +1 -1
  252. package/dist/server/core/runs/sweeper.d.ts.map +1 -1
  253. package/dist/server/core/runs/sweeper.js +2 -0
  254. package/dist/server/core/runs/sweeper.js.map +1 -1
  255. package/dist/server/core/runs/transitions.d.ts +1 -0
  256. package/dist/server/core/runs/transitions.d.ts.map +1 -1
  257. package/dist/server/core/runs/transitions.js +15 -1
  258. package/dist/server/core/runs/transitions.js.map +1 -1
  259. package/dist/server/core/runs/workload.d.ts +2 -2
  260. package/dist/server/core/runs/workload.d.ts.map +1 -1
  261. package/dist/server/core/runs/workload.js +62 -9
  262. package/dist/server/core/runs/workload.js.map +1 -1
  263. package/dist/server/kernel/clock.d.ts +2 -0
  264. package/dist/server/kernel/clock.d.ts.map +1 -1
  265. package/dist/server/kernel/clock.js +14 -0
  266. package/dist/server/kernel/clock.js.map +1 -1
  267. package/dist/server/kernel/events.d.ts +6 -1
  268. package/dist/server/kernel/events.d.ts.map +1 -1
  269. package/dist/server/kernel/events.js.map +1 -1
  270. package/dist/server/locales/de-DE.js +3 -3
  271. package/dist/server/locales/de-DE.js.map +1 -1
  272. package/dist/server/locales/es-ES.js +6 -6
  273. package/dist/server/locales/es-ES.js.map +1 -1
  274. package/dist/server/locales/fr-FR.js +4 -4
  275. package/dist/server/locales/fr-FR.js.map +1 -1
  276. package/dist/server/locales/id-ID.js +5 -5
  277. package/dist/server/locales/id-ID.js.map +1 -1
  278. package/dist/server/locales/index.d.ts.map +1 -1
  279. package/dist/server/locales/index.js +2 -0
  280. package/dist/server/locales/index.js.map +1 -1
  281. package/dist/server/locales/ja-JP.d.ts.map +1 -1
  282. package/dist/server/locales/ja-JP.js +6 -6
  283. package/dist/server/locales/ja-JP.js.map +1 -1
  284. package/dist/server/locales/ko-KR.d.ts +5 -0
  285. package/dist/server/locales/ko-KR.d.ts.map +1 -0
  286. package/dist/server/locales/ko-KR.js +59 -0
  287. package/dist/server/locales/ko-KR.js.map +1 -0
  288. package/dist/server/locales/pt-BR.js +6 -6
  289. package/dist/server/locales/pt-BR.js.map +1 -1
  290. package/dist/server/locales/ru-RU.d.ts +5 -0
  291. package/dist/server/locales/ru-RU.d.ts.map +1 -0
  292. package/dist/server/locales/ru-RU.js +59 -0
  293. package/dist/server/locales/ru-RU.js.map +1 -0
  294. package/dist/server/locales/vi-VN.js +6 -6
  295. package/dist/server/locales/vi-VN.js.map +1 -1
  296. package/dist/server/locales/zh-TW.d.ts.map +1 -1
  297. package/dist/server/locales/zh-TW.js +6 -6
  298. package/dist/server/locales/zh-TW.js.map +1 -1
  299. package/dist/server/online/agent/persistence/store.d.ts.map +1 -1
  300. package/dist/server/online/agent/persistence/store.js +3 -0
  301. package/dist/server/online/agent/persistence/store.js.map +1 -1
  302. package/dist/server/online/agent/runner/backend.d.ts.map +1 -1
  303. package/dist/server/online/agent/runner/backend.js +17 -8
  304. package/dist/server/online/agent/runner/backend.js.map +1 -1
  305. package/dist/server/online/agent/runner/projection.d.ts +1 -1
  306. package/dist/server/online/agent/runner/projection.d.ts.map +1 -1
  307. package/dist/server/online/agent/runner/projection.js +8 -1
  308. package/dist/server/online/agent/runner/projection.js.map +1 -1
  309. package/dist/server/providers/agents.d.ts.map +1 -1
  310. package/dist/server/providers/agents.js +3 -0
  311. package/dist/server/providers/agents.js.map +1 -1
  312. package/dist/server/routes/admin.d.ts +1 -0
  313. package/dist/server/routes/admin.d.ts.map +1 -1
  314. package/dist/server/routes/admin.js +32 -2
  315. package/dist/server/routes/admin.js.map +1 -1
  316. package/dist/server/routes/chat.d.ts.map +1 -1
  317. package/dist/server/routes/chat.js +99 -16
  318. package/dist/server/routes/chat.js.map +1 -1
  319. package/dist/server/routes/index.d.ts.map +1 -1
  320. package/dist/server/routes/index.js +8 -2
  321. package/dist/server/routes/index.js.map +1 -1
  322. package/dist/server/routes/run.js +1 -1
  323. package/dist/server/routes/run.js.map +1 -1
  324. package/dist/server/routes/runners/admin.d.ts.map +1 -1
  325. package/dist/server/routes/runners/admin.js +3 -3
  326. package/dist/server/routes/runners/admin.js.map +1 -1
  327. package/dist/server/routes/runners/install.d.ts.map +1 -1
  328. package/dist/server/routes/runners/install.js +5 -0
  329. package/dist/server/routes/runners/install.js.map +1 -1
  330. package/dist/server/routes/runners/runner.d.ts.map +1 -1
  331. package/dist/server/routes/runners/runner.js +13 -22
  332. package/dist/server/routes/runners/runner.js.map +1 -1
  333. package/dist/server/routes/runners/runs.d.ts +1 -1
  334. package/dist/server/routes/runners/runs.d.ts.map +1 -1
  335. package/dist/server/routes/runners/runs.js +20 -1
  336. package/dist/server/routes/runners/runs.js.map +1 -1
  337. package/dist/server/routes/schemas.d.ts +5 -1
  338. package/dist/server/routes/schemas.d.ts.map +1 -1
  339. package/dist/server/routes/schemas.js +33 -8
  340. package/dist/server/routes/schemas.js.map +1 -1
  341. package/dist/server/runners/runner.service.d.ts.map +1 -1
  342. package/dist/server/runners/runner.service.js +17 -5
  343. package/dist/server/runners/runner.service.js.map +1 -1
  344. package/dist/server/tokens.d.ts +1 -1
  345. package/dist/server/tokens.d.ts.map +1 -1
  346. package/dist/server/tokens.js.map +1 -1
  347. package/dist/shared/briefs.d.ts +2 -6
  348. package/dist/shared/briefs.d.ts.map +1 -1
  349. package/dist/shared/conversations.d.ts +38 -1
  350. package/dist/shared/conversations.d.ts.map +1 -1
  351. package/dist/shared/conversations.js +10 -0
  352. package/dist/shared/conversations.js.map +1 -1
  353. package/dist/shared/runs.d.ts +11 -3
  354. package/dist/shared/runs.d.ts.map +1 -1
  355. package/dist/shared/runs.js +2 -0
  356. package/dist/shared/runs.js.map +1 -1
  357. package/dist/shared/ui-message.d.ts +2 -2
  358. package/dist/shared/ui-message.d.ts.map +1 -1
  359. package/dist/shared/ui-message.js +1 -1
  360. package/dist/shared/ui-message.js.map +1 -1
  361. package/docs/conversation-sharing.md +55 -0
  362. package/package.json +16 -16
  363. package/skills/nocobase-app-plugin-agents/references/extension-points.md +2 -0
  364. package/skills/nocobase-app-plugin-agents/references/runners.md +1 -1
  365. package/skills/nocobase-app-plugin-agents/references/verification-and-troubleshooting.md +2 -1
@@ -12,6 +12,8 @@ import { type ConversationRecord } from './conversation.store.js';
12
12
  import type { ConversationService } from './ports.js';
13
13
  import type { AppUIMessage } from '../../../shared/online-agent.js';
14
14
  export interface ConversationServiceDeps {
15
+ /** Reuse the native backend's registered public tool projections, without an executable session facade. */
16
+ readonly nativeHistory?: (messages: unknown[]) => Promise<AppUIMessage[]>;
15
17
  readonly nativeNotice?: (unit: Tx, record: ConversationRecord, id: string, parts: AppUIMessage['parts']) => Promise<unknown>;
16
18
  readonly tx: TxRunner;
17
19
  readonly measure?: (phase: string, durationMs: number) => void;
@@ -20,7 +22,7 @@ export interface ConversationServiceDeps {
20
22
  readonly agents: Pick<AgentService, 'mayInvoke' | 'get' | 'list'>;
21
23
  readonly runners: Pick<RunnerService, 'list' | 'all'>;
22
24
  readonly eligibility: Pick<ClaimEligibility, 'canClaim' | 'runnersFor' | 'prepare'>;
23
- readonly runs: Pick<RunService, 'enqueue' | 'cancel' | 'withdrawQueued' | 'get' | 'detail'>;
25
+ readonly runs: Pick<RunService, 'enqueue' | 'cancel' | 'withdrawQueued' | 'get' | 'detail' | 'queueWait'>;
24
26
  readonly people: People;
25
27
  readonly settings: ChatSettingsService;
26
28
  readonly contextKinds: PageContextKinds;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.service.d.ts","sourceRoot":"","sources":["../../../../server/core/conversations/conversation.service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AA+D3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAQnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAQL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAGhB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAYL,KAAK,kBAAkB,EAGxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAIV,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAapB,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,iCAAiC,CAAC;AAK/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,IAAI,EAAE,EAAE,EACR,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IAClE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IACtD,QAAQ,CAAC,WAAW,EAAE,IAAI,CACxB,gBAAgB,EAChB,UAAU,GAAG,YAAY,GAAG,SAAS,CACtC,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,IAAI,CACjB,UAAU,EACV,SAAS,GAAG,QAAQ,GAAG,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAC3D,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,6FAA6F;IAC7F,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,OAAO,KACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,+FAA+F;IAC/F,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC;AA6LD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,uBAAuB,GAC5B,mBAAmB,CA47ErB"}
1
+ {"version":3,"file":"conversation.service.d.ts","sourceRoot":"","sources":["../../../../server/core/conversations/conversation.service.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ import { conversationAccess, createConversationShares, sharesRepo, } from './shares.js';
2
+ import { runnerUIPage } from '../../online/agent/runner/projection.js';
3
+ import { NativeMessages } from '../../online/agent/messages/projection.js';
4
+ import { OnlineAgentConfigurator } from '../../online/agent/configuration.js';
1
5
  import { outputBlock, TERMINAL_RUN_STATUSES } from '@nocobase/agent-protocol';
2
6
  import { historicalPageContext, hasContent, renderPageContext, } from './page-context.js';
3
7
  import { nativeExecutionStatus, runnerBinding, } from '../../online/agent/persistence/state.js';
@@ -206,6 +210,12 @@ export function createConversationService(deps) {
206
210
  return workspace.resolve(conn, conversation, prepared);
207
211
  }
208
212
  const sources = createSources();
213
+ const shares = createConversationShares({
214
+ tx,
215
+ ids,
216
+ people: deps.people,
217
+ now,
218
+ });
209
219
  const links = createConversationLinks({
210
220
  tx,
211
221
  ids,
@@ -264,6 +274,7 @@ export function createConversationService(deps) {
264
274
  : null;
265
275
  }
266
276
  async function summaries(conn, records) {
277
+ const linked = await links.summaries(conn, records);
267
278
  const agents = new Map();
268
279
  for (const record of records)
269
280
  for (const id of [
@@ -279,6 +290,7 @@ export function createConversationService(deps) {
279
290
  const machines = new Map((runnerIds.length ? await deps.runners.all(conn, runnerIds) : []).map((runner) => [runner.id, runner]));
280
291
  return Promise.all(records.map(async (record) => ({
281
292
  id: record.id,
293
+ links: linked.get(record.id) ?? [],
282
294
  title: record.title,
283
295
  titleSource: record.titleSource,
284
296
  category: record.category,
@@ -392,6 +404,9 @@ export function createConversationService(deps) {
392
404
  effort: typeof jsonObject(record.metadata).effort === 'string'
393
405
  ? jsonObject(record.metadata).effort
394
406
  : null,
407
+ wait: summary.mode === 'runner' && summary.run?.status === 'queued'
408
+ ? await deps.runs.queueWait(summary.run.id, record.runnerId)
409
+ : null,
395
410
  availability: await availabilityFor(conn, agent, record.userId),
396
411
  canFallback: Boolean(target),
397
412
  canRestore: !runnerBinding(record.metadata) &&
@@ -400,7 +415,48 @@ export function createConversationService(deps) {
400
415
  }
401
416
  async function detail(userId, id) {
402
417
  const conn = tx.read();
403
- return detailOf(conn, await owned(conn, userId, id));
418
+ const { record, share } = await conversationAccess(conn, userId, id);
419
+ if (!share)
420
+ return detailOf(conn, record);
421
+ // Whitelist snapshot fields: no latest runner, project, execution, usage, wait or owner attention.
422
+ return {
423
+ id,
424
+ title: share.title,
425
+ titleSource: 'user',
426
+ category: 'chat',
427
+ showInChatList: false,
428
+ source: 'panel',
429
+ mode: record.mode,
430
+ agent: jsonObject(record.metadata).onlineAgent
431
+ ? {
432
+ id: 'online',
433
+ name: 'Online agent',
434
+ nameText: null,
435
+ avatar: null,
436
+ archived: false,
437
+ }
438
+ : {
439
+ ...agentRef(record.agentId, record.agentId ? await findAgent(conn, record.agentId) : null),
440
+ avatar: null,
441
+ archived: false,
442
+ },
443
+ fallbackFrom: null,
444
+ read: true,
445
+ lastMessageAt: share.snapshotAt,
446
+ archivedAt: null,
447
+ createdAt: record.createdAt,
448
+ updatedAt: share.updatedAt,
449
+ run: null,
450
+ lastSeq: Number(share.cutoffSeq),
451
+ links: [],
452
+ availability: { online: false, reason: null, onlineRunners: 0 },
453
+ canFallback: false,
454
+ canRestore: false,
455
+ snapshot: {
456
+ cutoffSeq: Number(share.cutoffSeq),
457
+ snapshotAt: share.snapshotAt,
458
+ },
459
+ };
404
460
  }
405
461
  // -------------------------------------------------------------------------------------------------------------------
406
462
  // Writing
@@ -594,10 +650,11 @@ export function createConversationService(deps) {
594
650
  // Turning run events into messages
595
651
  // -------------------------------------------------------------------------------------------------------------------
596
652
  /** Appends the run's new text events as assistant messages, in the caller's transaction. */
597
- async function syncIn(unit, run) {
653
+ async function syncIn(unit, run, lockedRecord) {
598
654
  if (run.subject.kind !== CONVERSATION_SUBJECT)
599
655
  return;
600
- const record = await lockConversation(unit.conn, run.subject.id, now());
656
+ const record = lockedRecord ??
657
+ (await lockConversation(unit.conn, run.subject.id, now()));
601
658
  if (!record || record.userId !== run.actorUserId)
602
659
  return;
603
660
  let after;
@@ -739,6 +796,9 @@ export function createConversationService(deps) {
739
796
  const released = deps.attachments
740
797
  ? await deps.attachments.release(unit.conn, record.id)
741
798
  : async () => { };
799
+ await sharesRepo(unit.conn).deleteMany({
800
+ filter: { conversationId: record.id },
801
+ });
742
802
  await messagesRepo(unit.conn).deleteMany({
743
803
  filter: { conversationId: record.id },
744
804
  });
@@ -1097,6 +1157,35 @@ export function createConversationService(deps) {
1097
1157
  messageId: `runner:${run.id}`,
1098
1158
  revision: Number(answered.seq) + 1,
1099
1159
  });
1160
+ // Stop ends this turn; messages the Agent never acknowledged retain their identity in the next one.
1161
+ // A queued withdrawal or system cancellation must not start more work.
1162
+ if (run.status === 'cancelled' &&
1163
+ run.cancelRequestedAt !== null &&
1164
+ run.cancelledById === record.userId &&
1165
+ record.mode === 'runner' &&
1166
+ record.agentId === run.agentId) {
1167
+ const queued = await messagesRepo(unit.conn).findMany({
1168
+ filter: (f) => f.and([
1169
+ f.string('conversationId').eq(record.id),
1170
+ f.string('runId').eq(run.id),
1171
+ f.string('role').eq('user'),
1172
+ f.json('metadata').path(['queued']).eq(true),
1173
+ ]),
1174
+ sort: (sort) => sort.field('seq').asc(),
1175
+ });
1176
+ const pending = queued.filter((message) => {
1177
+ const metadata = metadataOf(message);
1178
+ return !metadata.pickedUp && !metadata.withdrawn;
1179
+ });
1180
+ if (pending.length) {
1181
+ await wake(unit, record, pending);
1182
+ for (const message of pending)
1183
+ changed(unit, record, {
1184
+ messageId: message.id,
1185
+ revision: Number(message.seq),
1186
+ });
1187
+ }
1188
+ }
1100
1189
  await attend(unit, record.id, run);
1101
1190
  },
1102
1191
  },
@@ -1211,6 +1300,12 @@ export function createConversationService(deps) {
1211
1300
  ((switching || !record.runnerId) &&
1212
1301
  !(await canAnswer(unit.conn, agent, userId))))
1213
1302
  throw conflict('This agent has no available execution environment.');
1303
+ if (realtime.queue) {
1304
+ // Keep already received replies before this follow-up, under the admission's existing conversation lock.
1305
+ const working = open.find((run) => run.status !== 'queued');
1306
+ await syncIn(unit, working, record);
1307
+ record = (await findConversation(unit.conn, id));
1308
+ }
1214
1309
  turnEffort =
1215
1310
  typeof jsonObject(record.metadata).turnEffort === 'string'
1216
1311
  ? jsonObject(record.metadata).turnEffort
@@ -1319,6 +1414,81 @@ export function createConversationService(deps) {
1319
1414
  }
1320
1415
  const service = {
1321
1416
  binding,
1417
+ shares,
1418
+ async snapshotMessages(userId, id, query) {
1419
+ const conn = tx.read();
1420
+ const { record, share } = await conversationAccess(conn, userId, id);
1421
+ if (!share)
1422
+ return null;
1423
+ const cutoff = Number(share.cutoffSeq);
1424
+ let page;
1425
+ if (record.mode === 'runner' || !jsonObject(record.metadata).onlineAgent)
1426
+ page = await runnerUIPage(tx, id, cutoff, query, deps.basePath?.() ?? '', cutoff);
1427
+ else {
1428
+ const rows = await messagesRepo(conn).findMany({
1429
+ filter: (f) => f.and([
1430
+ f.string('conversationId').eq(id),
1431
+ f.number('seq').lte(cutoff),
1432
+ ...(query.ids
1433
+ ? [f.or(query.ids.map((key) => f.string('id').eq(key)))]
1434
+ : []),
1435
+ ...(query.before !== undefined
1436
+ ? [f.number('seq').lt(query.before)]
1437
+ : []),
1438
+ ...(query.after !== undefined
1439
+ ? [f.number('seq').gt(query.after)]
1440
+ : []),
1441
+ ]),
1442
+ sort: (s) => query.after !== undefined || query.ids
1443
+ ? s.field('seq').asc()
1444
+ : s.field('seq').desc(),
1445
+ limit: query.ids ? query.ids.length : query.limit + 1,
1446
+ });
1447
+ const hasMore = !query.ids && rows.length > query.limit;
1448
+ const selected = rows.slice(0, query.ids ? rows.length : query.limit);
1449
+ if (query.after === undefined && !query.ids)
1450
+ selected.reverse();
1451
+ const native = new NativeMessages(new OnlineAgentConfigurator());
1452
+ page = {
1453
+ items: selected.length
1454
+ ? await (deps.nativeHistory ??
1455
+ (async (values) => native.public(await native.validate(values))))(selected.map((row) => jsonObject(row.content).original))
1456
+ : [],
1457
+ lastSeq: cutoff,
1458
+ hasMore,
1459
+ ...(query.after !== undefined && hasMore && selected.length
1460
+ ? { nextAfter: Number(selected.at(-1).seq) }
1461
+ : {}),
1462
+ };
1463
+ }
1464
+ for (const message of page.items) {
1465
+ if (message.metadata) {
1466
+ delete message.metadata.queue;
1467
+ delete message.metadata.executionId;
1468
+ delete message.metadata.turnId;
1469
+ }
1470
+ // A shared transcript contains historical content; linked records are always resolved as this viewer.
1471
+ if (message.metadata?.context) {
1472
+ const context = message.metadata.context;
1473
+ message.metadata.context = await deps.contextKinds.resolve(conn, userId, {
1474
+ route: '',
1475
+ items: context.items.map(({ kind, id }) => ({ kind, id })),
1476
+ });
1477
+ }
1478
+ const indexes = message.parts.flatMap((part, index) => part.type === 'data-turn' || part.type === 'data-phase'
1479
+ ? []
1480
+ : [index]);
1481
+ if (message.metadata?.sourceRecords)
1482
+ message.metadata.sourceRecords = message.metadata.sourceRecords
1483
+ .filter((source) => indexes.includes(source.partIndex))
1484
+ .map((source) => ({
1485
+ ...source,
1486
+ partIndex: indexes.indexOf(source.partIndex),
1487
+ }));
1488
+ message.parts = indexes.map((index) => message.parts[index]);
1489
+ }
1490
+ return page;
1491
+ },
1322
1492
  contextKinds: deps.contextKinds,
1323
1493
  sources,
1324
1494
  ownedTitles,
@@ -1598,7 +1768,7 @@ export function createConversationService(deps) {
1598
1768
  sendRealtime: (userId, id, request, input) => sendMessage(userId, id, request, input),
1599
1769
  async withdraw(userId, id, messageId) {
1600
1770
  await tx.run(async (unit) => {
1601
- const record = await lockOwned(unit, userId, id, true);
1771
+ let record = await owned(unit.conn, userId, id);
1602
1772
  const message = await messagesRepo(unit.conn).findOne({
1603
1773
  filter: { id: messageId, conversationId: id },
1604
1774
  });
@@ -1607,25 +1777,44 @@ export function createConversationService(deps) {
1607
1777
  const metadata = jsonObject(message.metadata);
1608
1778
  if (metadata.withdrawn)
1609
1779
  return;
1610
- // Taken back only while no runner has it: one conditional update, which a delivery racing it cannot both
1611
- // pass (`markDelivered` updates only an input not handled).
1612
- const taken = !metadata.queued ||
1613
- metadata.pickedUp ||
1614
- typeof metadata.inputId !== 'string' ||
1615
- (await inputsRepo(unit.conn).updateMany({
1616
- filter: (f) => f.and([
1617
- f.string('id').eq(metadata.inputId),
1618
- f.date('deliveredAt').empty(),
1619
- f.date('handledAt').empty(),
1620
- ]),
1621
- values: { handledAt: now() },
1622
- })).updatedCount !== 1;
1623
- if (taken)
1624
- throw conversationConflict('messageTaken', 'The agent already has this message.');
1780
+ if (!metadata.queued && message.runId) {
1781
+ // Match claim's run-before-conversation order. An initial turn has no queued-follow-up marker.
1782
+ // End only a still-unclaimed run, using the existing guarded queued withdrawal. If claim wins, the transaction rolls back and the running turn is kept.
1783
+ const run = await findRunRecord(unit.conn, message.runId);
1784
+ if (!run || run.status !== 'queued' || run.runnerId !== null)
1785
+ throw conversationConflict('messageTaken', 'The agent already has this message.');
1786
+ const ended = await deps.runs.withdrawQueued({
1787
+ subject: subjectOf(id),
1788
+ agentId: record.agentId,
1789
+ actorUserId: userId,
1790
+ byUserId: userId,
1791
+ }, unit);
1792
+ if (!ended.some((run) => run.id === message.runId))
1793
+ throw conversationConflict('messageTaken', 'The agent already has this message.');
1794
+ record = await lockOwned(unit, userId, id, true);
1795
+ }
1796
+ else {
1797
+ record = await lockOwned(unit, userId, id, true);
1798
+ // Taken back only while no runner has it: one conditional update, which a delivery racing it cannot both
1799
+ // pass (`markDelivered` updates only an input not handled).
1800
+ const taken = !metadata.queued ||
1801
+ metadata.pickedUp ||
1802
+ typeof metadata.inputId !== 'string' ||
1803
+ (await inputsRepo(unit.conn).updateMany({
1804
+ filter: (f) => f.and([
1805
+ f.string('id').eq(metadata.inputId),
1806
+ f.date('deliveredAt').empty(),
1807
+ f.date('handledAt').empty(),
1808
+ ]),
1809
+ values: { handledAt: now() },
1810
+ })).updatedCount !== 1;
1811
+ if (taken)
1812
+ throw conversationConflict('messageTaken', 'The agent already has this message.');
1813
+ }
1625
1814
  await messagesRepo(unit.conn).updateMany({
1626
1815
  filter: { id: message.id },
1627
1816
  values: {
1628
- metadata: asJson({ ...metadata, withdrawn: true }),
1817
+ metadata: asJson({ ...metadata, queued: true, withdrawn: true }),
1629
1818
  updatedAt: now(),
1630
1819
  },
1631
1820
  });
@@ -1690,7 +1879,9 @@ export function createConversationService(deps) {
1690
1879
  filter: { id },
1691
1880
  values,
1692
1881
  });
1693
- changed(unit, record);
1882
+ changed(unit, record, values.seenSeq === undefined
1883
+ ? undefined
1884
+ : { seenSeq: values.seenSeq });
1694
1885
  });
1695
1886
  return detail(userId, id);
1696
1887
  },