@nocobase/app-plugin-agents 2.0.0-beta.1 → 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 (337) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/README.md +20 -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/controller.d.ts +5 -0
  8. package/dist/client/chat/controller.d.ts.map +1 -1
  9. package/dist/client/chat/controller.js +37 -13
  10. package/dist/client/chat/controller.js.map +1 -1
  11. package/dist/client/chat/notices.d.ts +12 -0
  12. package/dist/client/chat/notices.d.ts.map +1 -0
  13. package/dist/client/chat/notices.js +15 -0
  14. package/dist/client/chat/notices.js.map +1 -0
  15. package/dist/client/chat/submissions.d.ts +16 -0
  16. package/dist/client/chat/submissions.d.ts.map +1 -1
  17. package/dist/client/chat/submissions.js +22 -0
  18. package/dist/client/chat/submissions.js.map +1 -1
  19. package/dist/client/chat/use-chat.d.ts.map +1 -1
  20. package/dist/client/chat/use-chat.js +1 -0
  21. package/dist/client/chat/use-chat.js.map +1 -1
  22. package/dist/client/chat.d.ts +1 -0
  23. package/dist/client/chat.d.ts.map +1 -1
  24. package/dist/client/chat.js +1 -0
  25. package/dist/client/chat.js.map +1 -1
  26. package/dist/client/components/page-container.js +1 -1
  27. package/dist/client/components/page-container.js.map +1 -1
  28. package/dist/client/components/route-child-page.d.ts +1 -1
  29. package/dist/client/components/route-child-page.d.ts.map +1 -1
  30. package/dist/client/components/route-child-page.js +18 -2
  31. package/dist/client/components/route-child-page.js.map +1 -1
  32. package/dist/client/components/route-overlay.d.ts +4 -1
  33. package/dist/client/components/route-overlay.d.ts.map +1 -1
  34. package/dist/client/components/route-overlay.js +32 -3
  35. package/dist/client/components/route-overlay.js.map +1 -1
  36. package/dist/client/components/ui/alert-dialog.d.ts +3 -1
  37. package/dist/client/components/ui/alert-dialog.d.ts.map +1 -1
  38. package/dist/client/components/ui/alert-dialog.js +2 -2
  39. package/dist/client/components/ui/alert-dialog.js.map +1 -1
  40. package/dist/client/components/unsaved-changes.d.ts.map +1 -1
  41. package/dist/client/components/unsaved-changes.js +17 -4
  42. package/dist/client/components/unsaved-changes.js.map +1 -1
  43. package/dist/client/components/use-route-overlay.d.ts +2 -9
  44. package/dist/client/components/use-route-overlay.d.ts.map +1 -1
  45. package/dist/client/components/use-route-overlay.js +5 -3
  46. package/dist/client/components/use-route-overlay.js.map +1 -1
  47. package/dist/client/locales/de-DE.d.ts.map +1 -1
  48. package/dist/client/locales/de-DE.js +137 -109
  49. package/dist/client/locales/de-DE.js.map +1 -1
  50. package/dist/client/locales/en-US.d.ts +2 -0
  51. package/dist/client/locales/en-US.d.ts.map +1 -1
  52. package/dist/client/locales/en-US.js +4 -2
  53. package/dist/client/locales/en-US.js.map +1 -1
  54. package/dist/client/locales/es-ES.d.ts.map +1 -1
  55. package/dist/client/locales/es-ES.js +214 -186
  56. package/dist/client/locales/es-ES.js.map +1 -1
  57. package/dist/client/locales/fr-FR.d.ts.map +1 -1
  58. package/dist/client/locales/fr-FR.js +146 -118
  59. package/dist/client/locales/fr-FR.js.map +1 -1
  60. package/dist/client/locales/id-ID.d.ts.map +1 -1
  61. package/dist/client/locales/id-ID.js +135 -107
  62. package/dist/client/locales/id-ID.js.map +1 -1
  63. package/dist/client/locales/index.d.ts.map +1 -1
  64. package/dist/client/locales/index.js +2 -0
  65. package/dist/client/locales/index.js.map +1 -1
  66. package/dist/client/locales/ja-JP.d.ts.map +1 -1
  67. package/dist/client/locales/ja-JP.js +218 -190
  68. package/dist/client/locales/ja-JP.js.map +1 -1
  69. package/dist/client/locales/ko-KR.d.ts +5 -0
  70. package/dist/client/locales/ko-KR.d.ts.map +1 -0
  71. package/dist/client/locales/ko-KR.js +1311 -0
  72. package/dist/client/locales/ko-KR.js.map +1 -0
  73. package/dist/client/locales/pt-BR.d.ts.map +1 -1
  74. package/dist/client/locales/pt-BR.js +208 -180
  75. package/dist/client/locales/pt-BR.js.map +1 -1
  76. package/dist/client/locales/ru-RU.d.ts +5 -0
  77. package/dist/client/locales/ru-RU.d.ts.map +1 -0
  78. package/dist/client/locales/ru-RU.js +1341 -0
  79. package/dist/client/locales/ru-RU.js.map +1 -0
  80. package/dist/client/locales/runWait.en-US.d.ts +2 -0
  81. package/dist/client/locales/runWait.en-US.d.ts.map +1 -1
  82. package/dist/client/locales/runWait.en-US.js +2 -0
  83. package/dist/client/locales/runWait.en-US.js.map +1 -1
  84. package/dist/client/locales/runWait.zh-CN.d.ts.map +1 -1
  85. package/dist/client/locales/runWait.zh-CN.js +2 -0
  86. package/dist/client/locales/runWait.zh-CN.js.map +1 -1
  87. package/dist/client/locales/runtimes.en-US.d.ts +1 -0
  88. package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
  89. package/dist/client/locales/runtimes.en-US.js +3 -2
  90. package/dist/client/locales/runtimes.en-US.js.map +1 -1
  91. package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
  92. package/dist/client/locales/runtimes.zh-CN.js +3 -2
  93. package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
  94. package/dist/client/locales/vi-VN.d.ts.map +1 -1
  95. package/dist/client/locales/vi-VN.js +174 -146
  96. package/dist/client/locales/vi-VN.js.map +1 -1
  97. package/dist/client/locales/zh-CN.d.ts.map +1 -1
  98. package/dist/client/locales/zh-CN.js +4 -2
  99. package/dist/client/locales/zh-CN.js.map +1 -1
  100. package/dist/client/locales/zh-TW.d.ts.map +1 -1
  101. package/dist/client/locales/zh-TW.js +151 -123
  102. package/dist/client/locales/zh-TW.js.map +1 -1
  103. package/dist/client/pages/runtimes/quota.d.ts +3 -2
  104. package/dist/client/pages/runtimes/quota.d.ts.map +1 -1
  105. package/dist/client/pages/runtimes/quota.js +8 -3
  106. package/dist/client/pages/runtimes/quota.js.map +1 -1
  107. package/dist/client/pages/runtimes/runner-runs.d.ts.map +1 -1
  108. package/dist/client/pages/runtimes/runner-runs.js +2 -8
  109. package/dist/client/pages/runtimes/runner-runs.js.map +1 -1
  110. package/dist/client/pages/runtimes/runner-tools.d.ts.map +1 -1
  111. package/dist/client/pages/runtimes/runner-tools.js +7 -16
  112. package/dist/client/pages/runtimes/runner-tools.js.map +1 -1
  113. package/dist/client/pages/runtimes/workspace-diagnostics.js +3 -3
  114. package/dist/client/pages/runtimes/workspace-diagnostics.js.map +1 -1
  115. package/dist/client/pages/usage/date-range-picker.d.ts.map +1 -1
  116. package/dist/client/pages/usage/date-range-picker.js +3 -1
  117. package/dist/client/pages/usage/date-range-picker.js.map +1 -1
  118. package/dist/client/routes.d.ts.map +1 -1
  119. package/dist/client/routes.js +7 -0
  120. package/dist/client/routes.js.map +1 -1
  121. package/dist/client/runs/format-wait.d.ts.map +1 -1
  122. package/dist/client/runs/format-wait.js +2 -0
  123. package/dist/client/runs/format-wait.js.map +1 -1
  124. package/dist/database/migrations/.manifest.json +16 -0
  125. package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts +4 -0
  126. package/dist/database/migrations/202611070001_ag_run_runner_pin.d.ts.map +1 -0
  127. package/dist/database/migrations/202611070001_ag_run_runner_pin.js +17 -0
  128. package/dist/database/migrations/202611070001_ag_run_runner_pin.js.map +1 -0
  129. package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts +4 -0
  130. package/dist/database/migrations/202611080001_ag_conversation_shares.d.ts.map +1 -0
  131. package/dist/database/migrations/202611080001_ag_conversation_shares.js +25 -0
  132. package/dist/database/migrations/202611080001_ag_conversation_shares.js.map +1 -0
  133. package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts +4 -0
  134. package/dist/database/migrations/202611080002_ag_run_failure_params.d.ts.map +1 -0
  135. package/dist/database/migrations/202611080002_ag_run_failure_params.js +17 -0
  136. package/dist/database/migrations/202611080002_ag_run_failure_params.js.map +1 -0
  137. package/dist/database/migrations/202611090001_ag_runner_preference.d.ts +9 -0
  138. package/dist/database/migrations/202611090001_ag_runner_preference.d.ts.map +1 -0
  139. package/dist/database/migrations/202611090001_ag_runner_preference.js +28 -0
  140. package/dist/database/migrations/202611090001_ag_runner_preference.js.map +1 -0
  141. package/dist/package.json +1 -1
  142. package/dist/server/composition.d.ts +7 -1
  143. package/dist/server/composition.d.ts.map +1 -1
  144. package/dist/server/composition.js +14 -2
  145. package/dist/server/composition.js.map +1 -1
  146. package/dist/server/core/agents/agent.service.d.ts +2 -1
  147. package/dist/server/core/agents/agent.service.d.ts.map +1 -1
  148. package/dist/server/core/agents/agent.service.js.map +1 -1
  149. package/dist/server/core/agents/agent.store.d.ts +2 -2
  150. package/dist/server/core/agents/agent.store.d.ts.map +1 -1
  151. package/dist/server/core/agents/agent.store.js +8 -2
  152. package/dist/server/core/agents/agent.store.js.map +1 -1
  153. package/dist/server/core/brief/brief.d.ts +10 -5
  154. package/dist/server/core/brief/brief.d.ts.map +1 -1
  155. package/dist/server/core/brief/brief.js +36 -13
  156. package/dist/server/core/brief/brief.js.map +1 -1
  157. package/dist/server/core/brief/index.d.ts +1 -1
  158. package/dist/server/core/brief/index.d.ts.map +1 -1
  159. package/dist/server/core/brief/index.js +1 -1
  160. package/dist/server/core/brief/index.js.map +1 -1
  161. package/dist/server/core/conversations/attachments.d.ts +2 -12
  162. package/dist/server/core/conversations/attachments.d.ts.map +1 -1
  163. package/dist/server/core/conversations/attachments.js +56 -14
  164. package/dist/server/core/conversations/attachments.js.map +1 -1
  165. package/dist/server/core/conversations/chat-settings.d.ts +1 -1
  166. package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
  167. package/dist/server/core/conversations/chat-settings.js +6 -0
  168. package/dist/server/core/conversations/chat-settings.js.map +1 -1
  169. package/dist/server/core/conversations/conversation.service.d.ts +3 -1
  170. package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
  171. package/dist/server/core/conversations/conversation.service.js +198 -18
  172. package/dist/server/core/conversations/conversation.service.js.map +1 -1
  173. package/dist/server/core/conversations/conversation.store.d.ts +2 -0
  174. package/dist/server/core/conversations/conversation.store.d.ts.map +1 -1
  175. package/dist/server/core/conversations/conversation.store.js.map +1 -1
  176. package/dist/server/core/conversations/index.d.ts +1 -0
  177. package/dist/server/core/conversations/index.d.ts.map +1 -1
  178. package/dist/server/core/conversations/links.d.ts.map +1 -1
  179. package/dist/server/core/conversations/links.js +10 -5
  180. package/dist/server/core/conversations/links.js.map +1 -1
  181. package/dist/server/core/conversations/ports.d.ts +8 -2
  182. package/dist/server/core/conversations/ports.d.ts.map +1 -1
  183. package/dist/server/core/conversations/shares.d.ts +38 -0
  184. package/dist/server/core/conversations/shares.d.ts.map +1 -0
  185. package/dist/server/core/conversations/shares.js +189 -0
  186. package/dist/server/core/conversations/shares.js.map +1 -0
  187. package/dist/server/core/runs/claim.d.ts +22 -3
  188. package/dist/server/core/runs/claim.d.ts.map +1 -1
  189. package/dist/server/core/runs/claim.js +260 -42
  190. package/dist/server/core/runs/claim.js.map +1 -1
  191. package/dist/server/core/runs/extensions.d.ts +30 -2
  192. package/dist/server/core/runs/extensions.d.ts.map +1 -1
  193. package/dist/server/core/runs/extensions.js +18 -1
  194. package/dist/server/core/runs/extensions.js.map +1 -1
  195. package/dist/server/core/runs/git-credentials.d.ts.map +1 -1
  196. package/dist/server/core/runs/git-credentials.js +24 -2
  197. package/dist/server/core/runs/git-credentials.js.map +1 -1
  198. package/dist/server/core/runs/identity.d.ts.map +1 -1
  199. package/dist/server/core/runs/identity.js +9 -0
  200. package/dist/server/core/runs/identity.js.map +1 -1
  201. package/dist/server/core/runs/index.d.ts +3 -2
  202. package/dist/server/core/runs/index.d.ts.map +1 -1
  203. package/dist/server/core/runs/index.js +2 -1
  204. package/dist/server/core/runs/index.js.map +1 -1
  205. package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
  206. package/dist/server/core/runs/lifecycle.js +14 -0
  207. package/dist/server/core/runs/lifecycle.js.map +1 -1
  208. package/dist/server/core/runs/npm-credentials.d.ts +35 -0
  209. package/dist/server/core/runs/npm-credentials.d.ts.map +1 -0
  210. package/dist/server/core/runs/npm-credentials.js +83 -0
  211. package/dist/server/core/runs/npm-credentials.js.map +1 -0
  212. package/dist/server/core/runs/ports.d.ts +19 -2
  213. package/dist/server/core/runs/ports.d.ts.map +1 -1
  214. package/dist/server/core/runs/ports.js.map +1 -1
  215. package/dist/server/core/runs/preview.d.ts +1 -4
  216. package/dist/server/core/runs/preview.d.ts.map +1 -1
  217. package/dist/server/core/runs/preview.js +10 -5
  218. package/dist/server/core/runs/preview.js.map +1 -1
  219. package/dist/server/core/runs/quota-wait.d.ts +7 -0
  220. package/dist/server/core/runs/quota-wait.d.ts.map +1 -0
  221. package/dist/server/core/runs/quota-wait.js +56 -0
  222. package/dist/server/core/runs/quota-wait.js.map +1 -0
  223. package/dist/server/core/runs/run-data-purge.d.ts.map +1 -1
  224. package/dist/server/core/runs/run-data-purge.js +1 -0
  225. package/dist/server/core/runs/run-data-purge.js.map +1 -1
  226. package/dist/server/core/runs/run.service.d.ts +28 -4
  227. package/dist/server/core/runs/run.service.d.ts.map +1 -1
  228. package/dist/server/core/runs/run.service.js +94 -9
  229. package/dist/server/core/runs/run.service.js.map +1 -1
  230. package/dist/server/core/runs/run.store.d.ts +24 -0
  231. package/dist/server/core/runs/run.store.d.ts.map +1 -1
  232. package/dist/server/core/runs/run.store.js +44 -0
  233. package/dist/server/core/runs/run.store.js.map +1 -1
  234. package/dist/server/core/runs/sweeper.d.ts.map +1 -1
  235. package/dist/server/core/runs/sweeper.js +2 -0
  236. package/dist/server/core/runs/sweeper.js.map +1 -1
  237. package/dist/server/core/runs/transitions.d.ts +1 -0
  238. package/dist/server/core/runs/transitions.d.ts.map +1 -1
  239. package/dist/server/core/runs/transitions.js +15 -1
  240. package/dist/server/core/runs/transitions.js.map +1 -1
  241. package/dist/server/core/runs/workload.d.ts +2 -2
  242. package/dist/server/core/runs/workload.d.ts.map +1 -1
  243. package/dist/server/core/runs/workload.js +62 -9
  244. package/dist/server/core/runs/workload.js.map +1 -1
  245. package/dist/server/kernel/clock.d.ts +2 -0
  246. package/dist/server/kernel/clock.d.ts.map +1 -1
  247. package/dist/server/kernel/clock.js +14 -0
  248. package/dist/server/kernel/clock.js.map +1 -1
  249. package/dist/server/kernel/events.d.ts +4 -1
  250. package/dist/server/kernel/events.d.ts.map +1 -1
  251. package/dist/server/kernel/events.js.map +1 -1
  252. package/dist/server/locales/de-DE.js +3 -3
  253. package/dist/server/locales/de-DE.js.map +1 -1
  254. package/dist/server/locales/es-ES.js +6 -6
  255. package/dist/server/locales/es-ES.js.map +1 -1
  256. package/dist/server/locales/fr-FR.js +4 -4
  257. package/dist/server/locales/fr-FR.js.map +1 -1
  258. package/dist/server/locales/id-ID.js +5 -5
  259. package/dist/server/locales/id-ID.js.map +1 -1
  260. package/dist/server/locales/index.d.ts.map +1 -1
  261. package/dist/server/locales/index.js +2 -0
  262. package/dist/server/locales/index.js.map +1 -1
  263. package/dist/server/locales/ja-JP.d.ts.map +1 -1
  264. package/dist/server/locales/ja-JP.js +6 -6
  265. package/dist/server/locales/ja-JP.js.map +1 -1
  266. package/dist/server/locales/ko-KR.d.ts +5 -0
  267. package/dist/server/locales/ko-KR.d.ts.map +1 -0
  268. package/dist/server/locales/ko-KR.js +59 -0
  269. package/dist/server/locales/ko-KR.js.map +1 -0
  270. package/dist/server/locales/pt-BR.js +6 -6
  271. package/dist/server/locales/pt-BR.js.map +1 -1
  272. package/dist/server/locales/ru-RU.d.ts +5 -0
  273. package/dist/server/locales/ru-RU.d.ts.map +1 -0
  274. package/dist/server/locales/ru-RU.js +59 -0
  275. package/dist/server/locales/ru-RU.js.map +1 -0
  276. package/dist/server/locales/vi-VN.js +6 -6
  277. package/dist/server/locales/vi-VN.js.map +1 -1
  278. package/dist/server/locales/zh-TW.d.ts.map +1 -1
  279. package/dist/server/locales/zh-TW.js +6 -6
  280. package/dist/server/locales/zh-TW.js.map +1 -1
  281. package/dist/server/online/agent/persistence/store.d.ts.map +1 -1
  282. package/dist/server/online/agent/persistence/store.js +3 -0
  283. package/dist/server/online/agent/persistence/store.js.map +1 -1
  284. package/dist/server/online/agent/runner/projection.d.ts +1 -1
  285. package/dist/server/online/agent/runner/projection.d.ts.map +1 -1
  286. package/dist/server/online/agent/runner/projection.js +8 -1
  287. package/dist/server/online/agent/runner/projection.js.map +1 -1
  288. package/dist/server/routes/admin.d.ts +1 -0
  289. package/dist/server/routes/admin.d.ts.map +1 -1
  290. package/dist/server/routes/admin.js +32 -2
  291. package/dist/server/routes/admin.js.map +1 -1
  292. package/dist/server/routes/chat.d.ts.map +1 -1
  293. package/dist/server/routes/chat.js +99 -16
  294. package/dist/server/routes/chat.js.map +1 -1
  295. package/dist/server/routes/index.d.ts.map +1 -1
  296. package/dist/server/routes/index.js +8 -2
  297. package/dist/server/routes/index.js.map +1 -1
  298. package/dist/server/routes/run.js +1 -1
  299. package/dist/server/routes/run.js.map +1 -1
  300. package/dist/server/routes/runners/admin.d.ts.map +1 -1
  301. package/dist/server/routes/runners/admin.js +3 -3
  302. package/dist/server/routes/runners/admin.js.map +1 -1
  303. package/dist/server/routes/runners/install.d.ts.map +1 -1
  304. package/dist/server/routes/runners/install.js +5 -0
  305. package/dist/server/routes/runners/install.js.map +1 -1
  306. package/dist/server/routes/runners/runner.d.ts.map +1 -1
  307. package/dist/server/routes/runners/runner.js +13 -22
  308. package/dist/server/routes/runners/runner.js.map +1 -1
  309. package/dist/server/routes/runners/runs.d.ts +1 -1
  310. package/dist/server/routes/runners/runs.d.ts.map +1 -1
  311. package/dist/server/routes/runners/runs.js +20 -1
  312. package/dist/server/routes/runners/runs.js.map +1 -1
  313. package/dist/server/routes/schemas.d.ts +4 -0
  314. package/dist/server/routes/schemas.d.ts.map +1 -1
  315. package/dist/server/routes/schemas.js +28 -6
  316. package/dist/server/routes/schemas.js.map +1 -1
  317. package/dist/server/runners/runner.service.d.ts.map +1 -1
  318. package/dist/server/runners/runner.service.js +17 -5
  319. package/dist/server/runners/runner.service.js.map +1 -1
  320. package/dist/server/tokens.d.ts +1 -1
  321. package/dist/server/tokens.d.ts.map +1 -1
  322. package/dist/server/tokens.js.map +1 -1
  323. package/dist/shared/briefs.d.ts +2 -6
  324. package/dist/shared/briefs.d.ts.map +1 -1
  325. package/dist/shared/conversations.d.ts +34 -1
  326. package/dist/shared/conversations.d.ts.map +1 -1
  327. package/dist/shared/conversations.js +10 -0
  328. package/dist/shared/conversations.js.map +1 -1
  329. package/dist/shared/runs.d.ts +11 -3
  330. package/dist/shared/runs.d.ts.map +1 -1
  331. package/dist/shared/runs.js +2 -0
  332. package/dist/shared/runs.js.map +1 -1
  333. package/docs/conversation-sharing.md +55 -0
  334. package/package.json +15 -15
  335. package/skills/nocobase-app-plugin-agents/references/extension-points.md +2 -0
  336. package/skills/nocobase-app-plugin-agents/references/runners.md +1 -1
  337. package/skills/nocobase-app-plugin-agents/references/verification-and-troubleshooting.md +2 -1
@@ -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,
@@ -394,6 +404,9 @@ export function createConversationService(deps) {
394
404
  effort: typeof jsonObject(record.metadata).effort === 'string'
395
405
  ? jsonObject(record.metadata).effort
396
406
  : null,
407
+ wait: summary.mode === 'runner' && summary.run?.status === 'queued'
408
+ ? await deps.runs.queueWait(summary.run.id, record.runnerId)
409
+ : null,
397
410
  availability: await availabilityFor(conn, agent, record.userId),
398
411
  canFallback: Boolean(target),
399
412
  canRestore: !runnerBinding(record.metadata) &&
@@ -402,7 +415,48 @@ export function createConversationService(deps) {
402
415
  }
403
416
  async function detail(userId, id) {
404
417
  const conn = tx.read();
405
- 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
+ };
406
460
  }
407
461
  // -------------------------------------------------------------------------------------------------------------------
408
462
  // Writing
@@ -742,6 +796,9 @@ export function createConversationService(deps) {
742
796
  const released = deps.attachments
743
797
  ? await deps.attachments.release(unit.conn, record.id)
744
798
  : async () => { };
799
+ await sharesRepo(unit.conn).deleteMany({
800
+ filter: { conversationId: record.id },
801
+ });
745
802
  await messagesRepo(unit.conn).deleteMany({
746
803
  filter: { conversationId: record.id },
747
804
  });
@@ -1100,6 +1157,35 @@ export function createConversationService(deps) {
1100
1157
  messageId: `runner:${run.id}`,
1101
1158
  revision: Number(answered.seq) + 1,
1102
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
+ }
1103
1189
  await attend(unit, record.id, run);
1104
1190
  },
1105
1191
  },
@@ -1328,6 +1414,81 @@ export function createConversationService(deps) {
1328
1414
  }
1329
1415
  const service = {
1330
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
+ },
1331
1492
  contextKinds: deps.contextKinds,
1332
1493
  sources,
1333
1494
  ownedTitles,
@@ -1607,7 +1768,7 @@ export function createConversationService(deps) {
1607
1768
  sendRealtime: (userId, id, request, input) => sendMessage(userId, id, request, input),
1608
1769
  async withdraw(userId, id, messageId) {
1609
1770
  await tx.run(async (unit) => {
1610
- const record = await lockOwned(unit, userId, id, true);
1771
+ let record = await owned(unit.conn, userId, id);
1611
1772
  const message = await messagesRepo(unit.conn).findOne({
1612
1773
  filter: { id: messageId, conversationId: id },
1613
1774
  });
@@ -1616,25 +1777,44 @@ export function createConversationService(deps) {
1616
1777
  const metadata = jsonObject(message.metadata);
1617
1778
  if (metadata.withdrawn)
1618
1779
  return;
1619
- // Taken back only while no runner has it: one conditional update, which a delivery racing it cannot both
1620
- // pass (`markDelivered` updates only an input not handled).
1621
- const taken = !metadata.queued ||
1622
- metadata.pickedUp ||
1623
- typeof metadata.inputId !== 'string' ||
1624
- (await inputsRepo(unit.conn).updateMany({
1625
- filter: (f) => f.and([
1626
- f.string('id').eq(metadata.inputId),
1627
- f.date('deliveredAt').empty(),
1628
- f.date('handledAt').empty(),
1629
- ]),
1630
- values: { handledAt: now() },
1631
- })).updatedCount !== 1;
1632
- if (taken)
1633
- 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
+ }
1634
1814
  await messagesRepo(unit.conn).updateMany({
1635
1815
  filter: { id: message.id },
1636
1816
  values: {
1637
- metadata: asJson({ ...metadata, withdrawn: true }),
1817
+ metadata: asJson({ ...metadata, queued: true, withdrawn: true }),
1638
1818
  updatedAt: now(),
1639
1819
  },
1640
1820
  });