@xgjktech/xg_cwork_im 1.19.42 → 1.19.43

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 (370) hide show
  1. package/README.md +492 -492
  2. package/dist/src/account-connection.d.ts +1 -1
  3. package/dist/src/account-connection.d.ts.map +1 -1
  4. package/dist/src/account-connection.js +25 -136
  5. package/dist/src/account-connection.js.map +1 -1
  6. package/dist/src/account-reconciler.d.ts +8 -17
  7. package/dist/src/account-reconciler.d.ts.map +1 -1
  8. package/dist/src/account-reconciler.js +11 -31
  9. package/dist/src/account-reconciler.js.map +1 -1
  10. package/dist/src/account-reconciler.test.js +1 -19
  11. package/dist/src/account-reconciler.test.js.map +1 -1
  12. package/dist/src/action-store-access.d.ts +0 -2
  13. package/dist/src/action-store-access.d.ts.map +1 -1
  14. package/dist/src/action-store-access.js +0 -7
  15. package/dist/src/action-store-access.js.map +1 -1
  16. package/dist/src/active-round-registry.d.ts +0 -6
  17. package/dist/src/active-round-registry.d.ts.map +1 -1
  18. package/dist/src/active-round-registry.js +2 -27
  19. package/dist/src/active-round-registry.js.map +1 -1
  20. package/dist/src/agent-stream-client-registry.d.ts +0 -2
  21. package/dist/src/agent-stream-client-registry.d.ts.map +1 -1
  22. package/dist/src/agent-stream-client-registry.js +1 -6
  23. package/dist/src/agent-stream-client-registry.js.map +1 -1
  24. package/dist/src/apply-sync-mapping.d.ts +1 -1
  25. package/dist/src/apply-sync-mapping.d.ts.map +1 -1
  26. package/dist/src/auth.d.ts +0 -2
  27. package/dist/src/auth.d.ts.map +1 -1
  28. package/dist/src/auth.js +0 -4
  29. package/dist/src/auth.js.map +1 -1
  30. package/dist/src/block-streaming-config.test.js +1 -7
  31. package/dist/src/block-streaming-config.test.js.map +1 -1
  32. package/dist/src/build-project-prompt.test.js +18 -18
  33. package/dist/src/channel-config.d.ts +17 -83
  34. package/dist/src/channel-config.d.ts.map +1 -1
  35. package/dist/src/channel-config.js +13 -46
  36. package/dist/src/channel-config.js.map +1 -1
  37. package/dist/src/channel-config.test.js +1 -58
  38. package/dist/src/channel-config.test.js.map +1 -1
  39. package/dist/src/channel.d.ts +3 -4
  40. package/dist/src/channel.d.ts.map +1 -1
  41. package/dist/src/channel.js +4 -127
  42. package/dist/src/channel.js.map +1 -1
  43. package/dist/src/connection.d.ts +0 -28
  44. package/dist/src/connection.d.ts.map +1 -1
  45. package/dist/src/connection.js +78 -155
  46. package/dist/src/connection.js.map +1 -1
  47. package/dist/src/deliver-text.test.js +22 -22
  48. package/dist/src/delivery/deliver-text.test.js +22 -22
  49. package/dist/src/delivery/turn-deliver-buffer.test.js +25 -25
  50. package/dist/src/dispatch-mentioned-reply.d.ts +2 -7
  51. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  52. package/dist/src/dispatch-mentioned-reply.js +68 -243
  53. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  54. package/dist/src/gateway-session-queue.d.ts +6 -2
  55. package/dist/src/gateway-session-queue.d.ts.map +1 -1
  56. package/dist/src/gateway-session-queue.js +21 -78
  57. package/dist/src/gateway-session-queue.js.map +1 -1
  58. package/dist/src/group-history-tool.d.ts +1 -1
  59. package/dist/src/group-history-tool.d.ts.map +1 -1
  60. package/dist/src/inbound-display.d.ts.map +1 -1
  61. package/dist/src/inbound-display.js +1 -2
  62. package/dist/src/inbound-display.js.map +1 -1
  63. package/dist/src/inbound-input-media.d.ts +1 -1
  64. package/dist/src/inbound-input-media.d.ts.map +1 -1
  65. package/dist/src/inbound-media-local.d.ts +1 -1
  66. package/dist/src/inbound-media-local.d.ts.map +1 -1
  67. package/dist/src/inbound-model.d.ts +0 -9
  68. package/dist/src/inbound-model.d.ts.map +1 -1
  69. package/dist/src/inbound-model.js +0 -26
  70. package/dist/src/inbound-model.js.map +1 -1
  71. package/dist/src/inbound-model.test.js +1 -23
  72. package/dist/src/inbound-model.test.js.map +1 -1
  73. package/dist/src/inbound-terminal-state.d.ts +0 -2
  74. package/dist/src/inbound-terminal-state.d.ts.map +1 -1
  75. package/dist/src/inbound-terminal-state.js +2 -7
  76. package/dist/src/inbound-terminal-state.js.map +1 -1
  77. package/dist/src/modified-file-push-tracker.d.ts +24 -0
  78. package/dist/src/modified-file-push-tracker.d.ts.map +1 -0
  79. package/dist/src/modified-file-push-tracker.js +125 -0
  80. package/dist/src/modified-file-push-tracker.js.map +1 -0
  81. package/dist/src/nas-volumes.d.ts +2 -12
  82. package/dist/src/nas-volumes.d.ts.map +1 -1
  83. package/dist/src/nas-volumes.js +37 -147
  84. package/dist/src/nas-volumes.js.map +1 -1
  85. package/dist/src/nas-volumes.test.js +7 -39
  86. package/dist/src/nas-volumes.test.js.map +1 -1
  87. package/dist/src/per-message-model-pending.d.ts +3 -38
  88. package/dist/src/per-message-model-pending.d.ts.map +1 -1
  89. package/dist/src/per-message-model-pending.js +7 -96
  90. package/dist/src/per-message-model-pending.js.map +1 -1
  91. package/dist/src/plan/action-dispatch-event-compat.test.d.ts +2 -0
  92. package/dist/src/plan/action-dispatch-event-compat.test.d.ts.map +1 -0
  93. package/dist/src/plan/action-dispatch-event-compat.test.js +81 -0
  94. package/dist/src/plan/action-dispatch-event-compat.test.js.map +1 -0
  95. package/dist/src/plan/action-store-lifecycle.test.js +5 -5
  96. package/dist/src/plan/plan-core-db.test.js +9 -9
  97. package/dist/src/plan/plan-core-snapshot.test.js +9 -9
  98. package/dist/src/plan-event-subscription.d.ts +1 -1
  99. package/dist/src/plan-event-subscription.d.ts.map +1 -1
  100. package/dist/src/plan-stat-event.d.ts +15 -4
  101. package/dist/src/plan-stat-event.d.ts.map +1 -1
  102. package/dist/src/plan-stat-event.js +37 -4
  103. package/dist/src/plan-stat-event.js.map +1 -1
  104. package/dist/src/plan-stat-event.test.js +118 -1
  105. package/dist/src/plan-stat-event.test.js.map +1 -1
  106. package/dist/src/plan-store-access.d.ts +23 -0
  107. package/dist/src/plan-store-access.d.ts.map +1 -0
  108. package/dist/src/plan-store-access.js +96 -0
  109. package/dist/src/plan-store-access.js.map +1 -0
  110. package/dist/src/plan-store-access.test.d.ts +2 -0
  111. package/dist/src/plan-store-access.test.d.ts.map +1 -0
  112. package/dist/src/plan-store-access.test.js +207 -0
  113. package/dist/src/plan-store-access.test.js.map +1 -0
  114. package/dist/src/plan-tool-middleware.d.ts +11 -3
  115. package/dist/src/plan-tool-middleware.d.ts.map +1 -1
  116. package/dist/src/plan-tool-middleware.js +60 -11
  117. package/dist/src/plan-tool-middleware.js.map +1 -1
  118. package/dist/src/plan-tool-middleware.test.js +603 -83
  119. package/dist/src/plan-tool-middleware.test.js.map +1 -1
  120. package/dist/src/plan-ws-registry.d.ts +0 -4
  121. package/dist/src/plan-ws-registry.d.ts.map +1 -1
  122. package/dist/src/plan-ws-registry.js +0 -12
  123. package/dist/src/plan-ws-registry.js.map +1 -1
  124. package/dist/src/plan-ws-registry.test.js +1 -19
  125. package/dist/src/plan-ws-registry.test.js.map +1 -1
  126. package/dist/src/progress-display.d.ts +77 -0
  127. package/dist/src/progress-display.d.ts.map +1 -0
  128. package/dist/src/progress-display.js +420 -0
  129. package/dist/src/progress-display.js.map +1 -0
  130. package/dist/src/register-per-message-model-hook.d.ts +2 -10
  131. package/dist/src/register-per-message-model-hook.d.ts.map +1 -1
  132. package/dist/src/register-per-message-model-hook.js +6 -32
  133. package/dist/src/register-per-message-model-hook.js.map +1 -1
  134. package/dist/src/resolve-inbound-group-prompt.d.ts +1 -17
  135. package/dist/src/resolve-inbound-group-prompt.d.ts.map +1 -1
  136. package/dist/src/resolve-inbound-group-prompt.js +2 -16
  137. package/dist/src/resolve-inbound-group-prompt.js.map +1 -1
  138. package/dist/src/run-usage-session.d.ts +1 -4
  139. package/dist/src/run-usage-session.d.ts.map +1 -1
  140. package/dist/src/run-usage-session.js +1 -13
  141. package/dist/src/run-usage-session.js.map +1 -1
  142. package/dist/src/run-usage.d.ts +0 -15
  143. package/dist/src/run-usage.d.ts.map +1 -1
  144. package/dist/src/run-usage.js +4 -30
  145. package/dist/src/run-usage.js.map +1 -1
  146. package/dist/src/run-usage.test.js +11 -99
  147. package/dist/src/run-usage.test.js.map +1 -1
  148. package/dist/src/send-file-tool.d.ts +1 -1
  149. package/dist/src/send-file-tool.d.ts.map +1 -1
  150. package/dist/src/send-group-message-tool.d.ts +1 -1
  151. package/dist/src/send-group-message-tool.d.ts.map +1 -1
  152. package/dist/src/session/build-project-prompt.test.js +18 -18
  153. package/dist/src/session-im-context.d.ts +0 -2
  154. package/dist/src/session-im-context.d.ts.map +1 -1
  155. package/dist/src/session-im-context.js +2 -11
  156. package/dist/src/session-im-context.js.map +1 -1
  157. package/dist/src/subagent-delivery-phase.d.ts +10 -0
  158. package/dist/src/subagent-delivery-phase.d.ts.map +1 -0
  159. package/dist/src/subagent-delivery-phase.js +4 -0
  160. package/dist/src/subagent-delivery-phase.js.map +1 -0
  161. package/dist/src/subagent-delivery-phase.test.d.ts +2 -0
  162. package/dist/src/subagent-delivery-phase.test.d.ts.map +1 -0
  163. package/dist/src/subagent-delivery-phase.test.js +12 -0
  164. package/dist/src/subagent-delivery-phase.test.js.map +1 -0
  165. package/dist/src/subagent-monitor.d.ts +1 -14
  166. package/dist/src/subagent-monitor.d.ts.map +1 -1
  167. package/dist/src/subagent-monitor.js +36 -164
  168. package/dist/src/subagent-monitor.js.map +1 -1
  169. package/dist/src/subagent-monitor.test.js +0 -121
  170. package/dist/src/subagent-monitor.test.js.map +1 -1
  171. package/dist/src/tool-json-result.d.ts +1 -1
  172. package/dist/src/tool-json-result.d.ts.map +1 -1
  173. package/dist/src/turn/turn-agent-event-subscription.d.ts.map +1 -1
  174. package/dist/src/turn/turn-agent-event-subscription.js +14 -0
  175. package/dist/src/turn/turn-agent-event-subscription.js.map +1 -1
  176. package/dist/src/turn-deliver-buffer.test.js +25 -25
  177. package/dist/src/types.d.ts +1 -48
  178. package/dist/src/types.d.ts.map +1 -1
  179. package/dist/src/types.js.map +1 -1
  180. package/dist/src/workspace/nas-volumes.test.js +3 -2
  181. package/dist/src/workspace/nas-volumes.test.js.map +1 -1
  182. package/dist/src/ws-inbound-schema.d.ts.map +1 -1
  183. package/dist/src/ws-inbound-schema.js +0 -1
  184. package/dist/src/ws-inbound-schema.js.map +1 -1
  185. package/openclaw.plugin.json +30 -30
  186. package/package.json +83 -83
  187. package/dist/src/action-store-lifecycle.test.d.ts +0 -2
  188. package/dist/src/action-store-lifecycle.test.d.ts.map +0 -1
  189. package/dist/src/action-store-lifecycle.test.js +0 -195
  190. package/dist/src/action-store-lifecycle.test.js.map +0 -1
  191. package/dist/src/active-cron-context-store.d.ts +0 -20
  192. package/dist/src/active-cron-context-store.d.ts.map +0 -1
  193. package/dist/src/active-cron-context-store.js +0 -73
  194. package/dist/src/active-cron-context-store.js.map +0 -1
  195. package/dist/src/assistant-item-delivery.d.ts +0 -27
  196. package/dist/src/assistant-item-delivery.d.ts.map +0 -1
  197. package/dist/src/assistant-item-delivery.js +0 -134
  198. package/dist/src/assistant-item-delivery.js.map +0 -1
  199. package/dist/src/assistant-item-delivery.test.d.ts +0 -2
  200. package/dist/src/assistant-item-delivery.test.d.ts.map +0 -1
  201. package/dist/src/assistant-item-delivery.test.js +0 -116
  202. package/dist/src/assistant-item-delivery.test.js.map +0 -1
  203. package/dist/src/assistant-item-sink.d.ts +0 -17
  204. package/dist/src/assistant-item-sink.d.ts.map +0 -1
  205. package/dist/src/assistant-item-sink.js +0 -34
  206. package/dist/src/assistant-item-sink.js.map +0 -1
  207. package/dist/src/connection-workspace-event.test.d.ts +0 -2
  208. package/dist/src/connection-workspace-event.test.d.ts.map +0 -1
  209. package/dist/src/connection-workspace-event.test.js +0 -74
  210. package/dist/src/connection-workspace-event.test.js.map +0 -1
  211. package/dist/src/connection.test.d.ts +0 -2
  212. package/dist/src/connection.test.d.ts.map +0 -1
  213. package/dist/src/connection.test.js +0 -110
  214. package/dist/src/connection.test.js.map +0 -1
  215. package/dist/src/cron-appkey-binding-store.d.ts +0 -29
  216. package/dist/src/cron-appkey-binding-store.d.ts.map +0 -1
  217. package/dist/src/cron-appkey-binding-store.js +0 -239
  218. package/dist/src/cron-appkey-binding-store.js.map +0 -1
  219. package/dist/src/cron-appkey-binding-store.test.d.ts +0 -2
  220. package/dist/src/cron-appkey-binding-store.test.d.ts.map +0 -1
  221. package/dist/src/cron-appkey-binding-store.test.js +0 -387
  222. package/dist/src/cron-appkey-binding-store.test.js.map +0 -1
  223. package/dist/src/nas-site.d.ts +0 -16
  224. package/dist/src/nas-site.d.ts.map +0 -1
  225. package/dist/src/nas-site.js +0 -17
  226. package/dist/src/nas-site.js.map +0 -1
  227. package/dist/src/plan-core-adapter.d.ts +0 -54
  228. package/dist/src/plan-core-adapter.d.ts.map +0 -1
  229. package/dist/src/plan-core-adapter.js +0 -104
  230. package/dist/src/plan-core-adapter.js.map +0 -1
  231. package/dist/src/plan-core-adapter.test.d.ts +0 -2
  232. package/dist/src/plan-core-adapter.test.d.ts.map +0 -1
  233. package/dist/src/plan-core-adapter.test.js +0 -183
  234. package/dist/src/plan-core-adapter.test.js.map +0 -1
  235. package/dist/src/plan-core-db.d.ts +0 -22
  236. package/dist/src/plan-core-db.d.ts.map +0 -1
  237. package/dist/src/plan-core-db.js +0 -91
  238. package/dist/src/plan-core-db.js.map +0 -1
  239. package/dist/src/plan-core-db.test.d.ts +0 -2
  240. package/dist/src/plan-core-db.test.d.ts.map +0 -1
  241. package/dist/src/plan-core-db.test.js +0 -115
  242. package/dist/src/plan-core-db.test.js.map +0 -1
  243. package/dist/src/plan-core-snapshot.d.ts +0 -23
  244. package/dist/src/plan-core-snapshot.d.ts.map +0 -1
  245. package/dist/src/plan-core-snapshot.js +0 -66
  246. package/dist/src/plan-core-snapshot.js.map +0 -1
  247. package/dist/src/plan-core-snapshot.test.d.ts +0 -2
  248. package/dist/src/plan-core-snapshot.test.d.ts.map +0 -1
  249. package/dist/src/plan-core-snapshot.test.js +0 -157
  250. package/dist/src/plan-core-snapshot.test.js.map +0 -1
  251. package/dist/src/plugin-dispose.d.ts +0 -22
  252. package/dist/src/plugin-dispose.d.ts.map +0 -1
  253. package/dist/src/plugin-dispose.js +0 -66
  254. package/dist/src/plugin-dispose.js.map +0 -1
  255. package/dist/src/process-shared-store.d.ts +0 -48
  256. package/dist/src/process-shared-store.d.ts.map +0 -1
  257. package/dist/src/process-shared-store.js +0 -89
  258. package/dist/src/process-shared-store.js.map +0 -1
  259. package/dist/src/process-shared-store.test.d.ts +0 -2
  260. package/dist/src/process-shared-store.test.d.ts.map +0 -1
  261. package/dist/src/process-shared-store.test.js +0 -60
  262. package/dist/src/process-shared-store.test.js.map +0 -1
  263. package/dist/src/register-exec-env-hook.d.ts +0 -44
  264. package/dist/src/register-exec-env-hook.d.ts.map +0 -1
  265. package/dist/src/register-exec-env-hook.js +0 -473
  266. package/dist/src/register-exec-env-hook.js.map +0 -1
  267. package/dist/src/register-exec-env-hook.test.d.ts +0 -2
  268. package/dist/src/register-exec-env-hook.test.d.ts.map +0 -1
  269. package/dist/src/register-exec-env-hook.test.js +0 -189
  270. package/dist/src/register-exec-env-hook.test.js.map +0 -1
  271. package/dist/src/register-group-prompt-hook.d.ts +0 -17
  272. package/dist/src/register-group-prompt-hook.d.ts.map +0 -1
  273. package/dist/src/register-group-prompt-hook.js +0 -45
  274. package/dist/src/register-group-prompt-hook.js.map +0 -1
  275. package/dist/src/register-group-prompt-hook.test.d.ts +0 -2
  276. package/dist/src/register-group-prompt-hook.test.d.ts.map +0 -1
  277. package/dist/src/register-group-prompt-hook.test.js +0 -60
  278. package/dist/src/register-group-prompt-hook.test.js.map +0 -1
  279. package/dist/src/register-per-message-model-hook.test.d.ts +0 -2
  280. package/dist/src/register-per-message-model-hook.test.d.ts.map +0 -1
  281. package/dist/src/register-per-message-model-hook.test.js +0 -208
  282. package/dist/src/register-per-message-model-hook.test.js.map +0 -1
  283. package/dist/src/register-run-model-context-hook.d.ts +0 -11
  284. package/dist/src/register-run-model-context-hook.d.ts.map +0 -1
  285. package/dist/src/register-run-model-context-hook.js +0 -23
  286. package/dist/src/register-run-model-context-hook.js.map +0 -1
  287. package/dist/src/reply-dispatch-driver.d.ts +0 -89
  288. package/dist/src/reply-dispatch-driver.d.ts.map +0 -1
  289. package/dist/src/reply-dispatch-driver.js +0 -294
  290. package/dist/src/reply-dispatch-driver.js.map +0 -1
  291. package/dist/src/reply-dispatch-driver.test.d.ts +0 -2
  292. package/dist/src/reply-dispatch-driver.test.d.ts.map +0 -1
  293. package/dist/src/reply-dispatch-driver.test.js +0 -363
  294. package/dist/src/reply-dispatch-driver.test.js.map +0 -1
  295. package/dist/src/run-model-context.d.ts +0 -45
  296. package/dist/src/run-model-context.d.ts.map +0 -1
  297. package/dist/src/run-model-context.js +0 -108
  298. package/dist/src/run-model-context.js.map +0 -1
  299. package/dist/src/run-model-context.test.d.ts +0 -2
  300. package/dist/src/run-model-context.test.d.ts.map +0 -1
  301. package/dist/src/run-model-context.test.js +0 -68
  302. package/dist/src/run-model-context.test.js.map +0 -1
  303. package/dist/src/session-env-store.d.ts +0 -55
  304. package/dist/src/session-env-store.d.ts.map +0 -1
  305. package/dist/src/session-env-store.js +0 -328
  306. package/dist/src/session-env-store.js.map +0 -1
  307. package/dist/src/session-env-store.test.d.ts +0 -2
  308. package/dist/src/session-env-store.test.d.ts.map +0 -1
  309. package/dist/src/session-env-store.test.js +0 -151
  310. package/dist/src/session-env-store.test.js.map +0 -1
  311. package/dist/src/session-group-prompt.d.ts +0 -34
  312. package/dist/src/session-group-prompt.d.ts.map +0 -1
  313. package/dist/src/session-group-prompt.js +0 -101
  314. package/dist/src/session-group-prompt.js.map +0 -1
  315. package/dist/src/session-group-prompt.test.d.ts +0 -2
  316. package/dist/src/session-group-prompt.test.d.ts.map +0 -1
  317. package/dist/src/session-group-prompt.test.js +0 -72
  318. package/dist/src/session-group-prompt.test.js.map +0 -1
  319. package/dist/src/session-model-fallback.d.ts +0 -13
  320. package/dist/src/session-model-fallback.d.ts.map +0 -1
  321. package/dist/src/session-model-fallback.js +0 -24
  322. package/dist/src/session-model-fallback.js.map +0 -1
  323. package/dist/src/tool-event-adapter.d.ts +0 -31
  324. package/dist/src/tool-event-adapter.d.ts.map +0 -1
  325. package/dist/src/tool-event-adapter.js +0 -83
  326. package/dist/src/tool-event-adapter.js.map +0 -1
  327. package/dist/src/tool-event-adapter.test.d.ts +0 -2
  328. package/dist/src/tool-event-adapter.test.d.ts.map +0 -1
  329. package/dist/src/tool-event-adapter.test.js +0 -93
  330. package/dist/src/tool-event-adapter.test.js.map +0 -1
  331. package/dist/src/turn-agent-event-subscription.d.ts +0 -29
  332. package/dist/src/turn-agent-event-subscription.d.ts.map +0 -1
  333. package/dist/src/turn-agent-event-subscription.js +0 -289
  334. package/dist/src/turn-agent-event-subscription.js.map +0 -1
  335. package/dist/src/turn-agent-event-subscription.test.d.ts +0 -2
  336. package/dist/src/turn-agent-event-subscription.test.d.ts.map +0 -1
  337. package/dist/src/turn-agent-event-subscription.test.js +0 -165
  338. package/dist/src/turn-agent-event-subscription.test.js.map +0 -1
  339. package/dist/src/turn-end-controller.d.ts +0 -61
  340. package/dist/src/turn-end-controller.d.ts.map +0 -1
  341. package/dist/src/turn-end-controller.js +0 -239
  342. package/dist/src/turn-end-controller.js.map +0 -1
  343. package/dist/src/turn-end-controller.test.d.ts +0 -2
  344. package/dist/src/turn-end-controller.test.d.ts.map +0 -1
  345. package/dist/src/turn-end-controller.test.js +0 -97
  346. package/dist/src/turn-end-controller.test.js.map +0 -1
  347. package/dist/src/workspace-event-protocol.d.ts +0 -3
  348. package/dist/src/workspace-event-protocol.d.ts.map +0 -1
  349. package/dist/src/workspace-event-protocol.js +0 -3
  350. package/dist/src/workspace-event-protocol.js.map +0 -1
  351. package/dist/src/workspace-event-scheduler.d.ts +0 -54
  352. package/dist/src/workspace-event-scheduler.d.ts.map +0 -1
  353. package/dist/src/workspace-event-scheduler.js +0 -131
  354. package/dist/src/workspace-event-scheduler.js.map +0 -1
  355. package/dist/src/workspace-event-scheduler.test.d.ts +0 -2
  356. package/dist/src/workspace-event-scheduler.test.d.ts.map +0 -1
  357. package/dist/src/workspace-event-scheduler.test.js +0 -157
  358. package/dist/src/workspace-event-scheduler.test.js.map +0 -1
  359. package/dist/src/workspace-event.d.ts +0 -28
  360. package/dist/src/workspace-event.d.ts.map +0 -1
  361. package/dist/src/workspace-event.js +0 -674
  362. package/dist/src/workspace-event.js.map +0 -1
  363. package/dist/src/workspace-event.test.d.ts +0 -2
  364. package/dist/src/workspace-event.test.d.ts.map +0 -1
  365. package/dist/src/workspace-event.test.js +0 -265
  366. package/dist/src/workspace-event.test.js.map +0 -1
  367. package/dist/src/ws-inbound-schema.test.d.ts +0 -2
  368. package/dist/src/ws-inbound-schema.test.d.ts.map +0 -1
  369. package/dist/src/ws-inbound-schema.test.js +0 -58
  370. package/dist/src/ws-inbound-schema.test.js.map +0 -1
@@ -1,25 +1,8 @@
1
1
  /**
2
2
  * 单轮模型覆盖:在 dispatch 前登记,由 before_model_resolve 消费。
3
- *
4
- * 语义:
5
- * - 覆盖只作用于本轮回复的「首次模型解析」(runId 首次调用);模型 fallback 重试不重复覆盖。
6
- * - 若登记时该 session 正处于自动降级(modelOverrideSource === "auto")且用户点名的正是降级来源
7
- * (被冷却/额度跳过的原模型),则放弃覆盖,避免把降级候选改回不可用的原模型。
8
- *
9
- * 注意:OpenClaw 的 replyOptions 并不消费 modelOverride(该字段仅 2026.5.17~2026.5.22 短暂存在,
10
- * 用于 WebChat 图片模型路由,之后已移除)。因此本机制是单轮模型覆盖的唯一生效通道。
3
+ * 弥补 replyOptions.modelOverride 在部分自定义 provider 上解析失败时被 autoFallback 覆盖的问题。
11
4
  */
12
- import type { SessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
13
- export interface PendingPerMessageModelFallbackOrigin {
14
- provider?: string;
15
- model: string;
16
- }
17
- /** 登记时该 session 的自动降级上下文。 */
18
- export interface SessionModelFallbackContext {
19
- sessionInAutoFallback: boolean;
20
- fallbackOrigin?: PendingPerMessageModelFallbackOrigin;
21
- }
22
- export interface PendingPerMessageModel extends SessionModelFallbackContext {
5
+ export interface PendingPerMessageModel {
23
6
  /** 原始 model ref,如 xgjk-newapi/MiniMax-M2.7-Cloud */
24
7
  raw: string;
25
8
  provider?: string;
@@ -28,25 +11,7 @@ export interface PendingPerMessageModel extends SessionModelFallbackContext {
28
11
  export declare function normalizeModelRefRaw(raw: string): string;
29
12
  /** 将 provider/model 或别名拆成 hook 可用的字段 */
30
13
  export declare function splitModelRef(raw: string): PendingPerMessageModel | undefined;
31
- /** 比较用归一化 key:有 provider 时 `provider/model`,否则仅 model。 */
32
- export declare function normalizeModelRefForCompare(provider: string | undefined, model: string | undefined): string;
33
- /**
34
- * 用户点名的目标模型是否就是当前自动降级的来源模型。
35
- * 先比对 model(大小写不敏感);origin 带 provider 时再要求 provider 一致(目标未带 provider 视为通配)。
36
- */
37
- export declare function targetMatchesFallbackOrigin(pending: PendingPerMessageModel): boolean;
38
- /** session 正处于自动降级,且目标就是降级来源时,放弃覆盖。 */
39
- export declare function shouldSkipOverrideForActiveFallback(pending: PendingPerMessageModel): boolean;
40
- /**
41
- * 本轮 run 是否首次解析模型。模型 fallback 会为同一 runId 再次调用 before_model_resolve,
42
- * 此时返回 false,避免降级候选被覆盖回主模型。runId 缺失时不限制。
43
- */
44
- export declare function claimPerMessageModelRun(runId: string | undefined): boolean;
45
- /** 从 session entry 提取自动降级上下文(纯函数,便于单测)。 */
46
- export declare function resolveSessionFallbackContextFromEntry(entry: SessionEntry | undefined): SessionModelFallbackContext;
47
- export declare function setPendingPerMessageModel(sessionKey: string, raw: string, fallbackContext?: SessionModelFallbackContext): PendingPerMessageModel | undefined;
14
+ export declare function setPendingPerMessageModel(sessionKey: string, raw: string): PendingPerMessageModel | undefined;
48
15
  export declare function takePendingPerMessageModel(sessionKey: string | undefined): PendingPerMessageModel | undefined;
49
16
  export declare function clearPendingPerMessageModel(sessionKey: string | undefined): void;
50
- /** 插件卸载/重载时清空全部待消费的单轮模型覆盖。 */
51
- export declare function clearAllPendingPerMessageModel(): void;
52
17
  //# sourceMappingURL=per-message-model-pending.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-message-model-pending.d.ts","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAG9E,MAAM,WAAW,oCAAoC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,WAAW,2BAA2B;IACxC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,oCAAoC,CAAC;CACzD;AAED,MAAM,WAAW,sBAAuB,SAAQ,2BAA2B;IACvE,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAW7E;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,CACvC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAQpF;AAED,uCAAuC;AACvC,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAE5F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAc1E;AAED,2CAA2C;AAC3C,wBAAgB,sCAAsC,CAClD,KAAK,EAAE,YAAY,GAAG,SAAS,GAChC,2BAA2B,CAmB7B;AAED,wBAAgB,yBAAyB,CACrC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE,2BAA2B,GAC9C,sBAAsB,GAAG,SAAS,CAUpC;AAED,wBAAgB,0BAA0B,CACtC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC/B,sBAAsB,GAAG,SAAS,CAMpC;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGhF;AAED,8BAA8B;AAC9B,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
1
+ {"version":3,"file":"per-message-model-pending.d.ts","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,sBAAsB;IACnC,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAW7E;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAK7G;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAM7G;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGhF"}
@@ -1,18 +1,8 @@
1
1
  /**
2
2
  * 单轮模型覆盖:在 dispatch 前登记,由 before_model_resolve 消费。
3
- *
4
- * 语义:
5
- * - 覆盖只作用于本轮回复的「首次模型解析」(runId 首次调用);模型 fallback 重试不重复覆盖。
6
- * - 若登记时该 session 正处于自动降级(modelOverrideSource === "auto")且用户点名的正是降级来源
7
- * (被冷却/额度跳过的原模型),则放弃覆盖,避免把降级候选改回不可用的原模型。
8
- *
9
- * 注意:OpenClaw 的 replyOptions 并不消费 modelOverride(该字段仅 2026.5.17~2026.5.22 短暂存在,
10
- * 用于 WebChat 图片模型路由,之后已移除)。因此本机制是单轮模型覆盖的唯一生效通道。
3
+ * 弥补 replyOptions.modelOverride 在部分自定义 provider 上解析失败时被 autoFallback 覆盖的问题。
11
4
  */
12
- import { getSharedMap } from "./process-shared-store.js";
13
- const pendingBySessionKey = getSharedMap("pending-per-message-model");
14
- const appliedRunIds = getSharedMap("per-message-model-applied-run");
15
- const APPLIED_RUN_TTL_MS = 60 * 60_000;
5
+ const pendingBySessionKey = new Map();
16
6
  export function normalizeModelRefRaw(raw) {
17
7
  return raw.trim().replace(/^["']|["']$/g, "").trim();
18
8
  }
@@ -27,90 +17,16 @@ export function splitModelRef(raw) {
27
17
  const model = normalized.slice(slash + 1).trim();
28
18
  if (!provider || !model)
29
19
  return undefined;
30
- return { raw: normalized, provider, model, sessionInAutoFallback: false };
20
+ return { raw: normalized, provider, model };
31
21
  }
32
- return { raw: normalized, model: normalized, sessionInAutoFallback: false };
22
+ return { raw: normalized, model: normalized };
33
23
  }
34
- /** 比较用归一化 key:有 provider 时 `provider/model`,否则仅 model。 */
35
- export function normalizeModelRefForCompare(provider, model) {
36
- const p = (provider ?? "").trim().toLowerCase();
37
- const m = (model ?? "").trim().toLowerCase();
38
- if (!m)
39
- return "";
40
- return p ? `${p}/${m}` : m;
41
- }
42
- /**
43
- * 用户点名的目标模型是否就是当前自动降级的来源模型。
44
- * 先比对 model(大小写不敏感);origin 带 provider 时再要求 provider 一致(目标未带 provider 视为通配)。
45
- */
46
- export function targetMatchesFallbackOrigin(pending) {
47
- const originModel = pending.fallbackOrigin?.model?.trim().toLowerCase() ?? "";
48
- const targetModel = pending.model.trim().toLowerCase();
49
- if (!originModel || !targetModel || originModel !== targetModel)
50
- return false;
51
- const originProvider = (pending.fallbackOrigin?.provider ?? "").trim().toLowerCase();
52
- if (!originProvider)
53
- return true;
54
- const targetProvider = (pending.provider ?? "").trim().toLowerCase();
55
- return targetProvider === "" || targetProvider === originProvider;
56
- }
57
- /** session 正处于自动降级,且目标就是降级来源时,放弃覆盖。 */
58
- export function shouldSkipOverrideForActiveFallback(pending) {
59
- return pending.sessionInAutoFallback === true && targetMatchesFallbackOrigin(pending);
60
- }
61
- /**
62
- * 本轮 run 是否首次解析模型。模型 fallback 会为同一 runId 再次调用 before_model_resolve,
63
- * 此时返回 false,避免降级候选被覆盖回主模型。runId 缺失时不限制。
64
- */
65
- export function claimPerMessageModelRun(runId) {
66
- const key = runId?.trim();
67
- if (!key)
68
- return true;
69
- const now = Date.now();
70
- for (const [id, ts] of appliedRunIds) {
71
- if (now - ts > APPLIED_RUN_TTL_MS) {
72
- appliedRunIds.delete(id);
73
- }
74
- }
75
- if (appliedRunIds.has(key)) {
76
- return false;
77
- }
78
- appliedRunIds.set(key, now);
79
- return true;
80
- }
81
- /** 从 session entry 提取自动降级上下文(纯函数,便于单测)。 */
82
- export function resolveSessionFallbackContextFromEntry(entry) {
83
- if (!entry)
84
- return { sessionInAutoFallback: false };
85
- const originModel = entry.modelOverrideFallbackOriginModel?.trim();
86
- const originProvider = entry.modelOverrideFallbackOriginProvider?.trim();
87
- const sessionInAutoFallback = entry.modelOverrideSource === "auto";
88
- if (!sessionInAutoFallback && !originModel) {
89
- return { sessionInAutoFallback: false };
90
- }
91
- return {
92
- sessionInAutoFallback,
93
- ...(originModel
94
- ? {
95
- fallbackOrigin: {
96
- ...(originProvider ? { provider: originProvider } : {}),
97
- model: originModel,
98
- },
99
- }
100
- : {}),
101
- };
102
- }
103
- export function setPendingPerMessageModel(sessionKey, raw, fallbackContext) {
24
+ export function setPendingPerMessageModel(sessionKey, raw) {
104
25
  const parsed = splitModelRef(raw);
105
26
  if (!parsed)
106
27
  return undefined;
107
- const pending = {
108
- ...parsed,
109
- sessionInAutoFallback: fallbackContext?.sessionInAutoFallback === true,
110
- ...(fallbackContext?.fallbackOrigin ? { fallbackOrigin: fallbackContext.fallbackOrigin } : {}),
111
- };
112
- pendingBySessionKey.set(sessionKey, pending);
113
- return pending;
28
+ pendingBySessionKey.set(sessionKey, parsed);
29
+ return parsed;
114
30
  }
115
31
  export function takePendingPerMessageModel(sessionKey) {
116
32
  if (!sessionKey?.trim())
@@ -126,9 +42,4 @@ export function clearPendingPerMessageModel(sessionKey) {
126
42
  return;
127
43
  pendingBySessionKey.delete(sessionKey);
128
44
  }
129
- /** 插件卸载/重载时清空全部待消费的单轮模型覆盖。 */
130
- export function clearAllPendingPerMessageModel() {
131
- pendingBySessionKey.clear();
132
- appliedRunIds.clear();
133
- }
134
45
  //# sourceMappingURL=per-message-model-pending.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-message-model-pending.js","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-message-model-pending.js","sourceRoot":"","sources":["../../src/per-message-model-pending.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkC,CAAC;AAEtE,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,aAAa,CAAC,GAAW;IACrC,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAkB,EAAE,GAAW;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAA8B;IACrE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAA8B;IACtE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO;IAChC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=action-dispatch-event-compat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-dispatch-event-compat.test.d.ts","sourceRoot":"","sources":["../../../src/plan/action-dispatch-event-compat.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { DatabaseSync } from "node:sqlite";
6
+ import { afterEach, beforeEach, describe, it } from "node:test";
7
+ import { resolvePlanDbPath } from "@xgjktech/xg-openclaw-shared";
8
+ import { __resetActiveRoundRegistryForTests, registerActiveRound } from "../turn/active-round-registry.js";
9
+ import { createTurnAgentEventHandler, disposeTurnAgentEvents } from "../turn/turn-agent-event-subscription.js";
10
+ import { disposeActionStore, getActionById, setActionStateDir } from "./action-store-access.js";
11
+ import { sendActionRunEvent } from "./action-run-event.js";
12
+ import { createPlanToolResultMiddleware } from "./plan-tool-middleware.js";
13
+ import { resetPlanWsRegistryForTest, setPlanWsClient } from "./plan-ws-registry.js";
14
+ const GROUP = "action-compat-group";
15
+ const SESSION = `agent:test:xg_cwork_im:group:${GROUP}`;
16
+ const EVENT_ID = "evt-action-compat";
17
+ let stateDir;
18
+ let calls;
19
+ let client;
20
+ beforeEach(() => {
21
+ disposeTurnAgentEvents();
22
+ resetPlanWsRegistryForTest();
23
+ __resetActiveRoundRegistryForTests();
24
+ stateDir = mkdtempSync(join(tmpdir(), "xg-action-compat-"));
25
+ setActionStateDir(stateDir);
26
+ const db = new DatabaseSync(resolvePlanDbPath(stateDir));
27
+ db.exec("CREATE TABLE actions (event_id TEXT PRIMARY KEY, doc TEXT NOT NULL)");
28
+ db.prepare("INSERT INTO actions VALUES (?, ?)").run(EVENT_ID, JSON.stringify({
29
+ eventId: EVENT_ID, event: "action_dispatch", action: "ui_refresh", target: "BP",
30
+ version: 1, status: "completed", timestamp: new Date().toISOString(),
31
+ origin: { channel: "xg_cwork_im", to: GROUP }, payload: { data: { text: "x".repeat(600) } },
32
+ }));
33
+ db.close();
34
+ calls = [];
35
+ client = {
36
+ start: async () => { }, streamProgress: async () => { }, streamUsage: async () => { },
37
+ sendEvent: async (opts) => { calls.push(opts); }, end: async () => { },
38
+ };
39
+ setPlanWsClient(GROUP, client, "anchor");
40
+ });
41
+ afterEach(() => {
42
+ disposeActionStore();
43
+ disposeTurnAgentEvents();
44
+ resetPlanWsRegistryForTest();
45
+ __resetActiveRoundRegistryForTests();
46
+ rmSync(stateDir, { recursive: true, force: true });
47
+ });
48
+ function toolResult() {
49
+ const business = { ok: true, eventId: EVENT_ID, event: getActionById(EVENT_ID) };
50
+ return { details: business, content: [{ type: "text", text: JSON.stringify(business) }] };
51
+ }
52
+ function emitResult(result = toolResult(), toolCallId = "tool_call:parent:xg_action_dispatch:1") {
53
+ const handler = createTurnAgentEventHandler();
54
+ handler({
55
+ seq: 1, ts: Date.now(), runId: "run-compat", stream: "tool", sessionKey: SESSION,
56
+ data: { name: "xg_action_dispatch", phase: "result", toolCallId, result },
57
+ }, {});
58
+ }
59
+ describe("Action Dispatch: OpenClaw Default 嵌套工具兼容", () => {
60
+ it("真实 SQLite + tool_call 内层 result:ACTION_DISPATCH 完整发送,TOOL_EVENT 仍为 300 字符预览", () => {
61
+ registerActiveRound({ accountId: "test", groupId: GROUP, agentId: "test", sessionKey: SESSION, replyToMsgId: "anchor", streamClient: client });
62
+ emitResult();
63
+ assert.deepEqual(calls.map((call) => call.event), ["ACTION_DISPATCH", "TOOL_EVENT"]);
64
+ assert.equal(calls[0].data.target, "BP");
65
+ assert.equal((calls[0].data.payload.data.text).length, 600);
66
+ assert.equal(calls[1].data.result.length, 300);
67
+ });
68
+ it("直调只走原中间件,tool 流不重复派发", () => {
69
+ const middleware = createPlanToolResultMiddleware({ getActionById, sendActionRunEvent });
70
+ middleware({ toolName: "xg_action_dispatch", toolCallId: "direct", args: {}, result: toolResult() }, { runtime: "openclaw" });
71
+ emitResult(toolResult(), "direct");
72
+ assert.equal(calls.length, 1);
73
+ });
74
+ it("content-only 结果复用原解析器,缺库记录不派发", () => {
75
+ emitResult({ details: { ok: true, eventId: "missing" }, content: [] });
76
+ assert.equal(calls.length, 0);
77
+ emitResult({ details: undefined, content: toolResult().content });
78
+ assert.equal(calls.length, 1);
79
+ });
80
+ });
81
+ //# sourceMappingURL=action-dispatch-event-compat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-dispatch-event-compat.test.js","sourceRoot":"","sources":["../../../src/plan/action-dispatch-event-compat.test.ts"],"names":[],"mappings":"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"}
@@ -38,11 +38,11 @@ function makeAction(eventId, overrides = {}) {
38
38
  function writeAction(stateDir, action) {
39
39
  const db = new DatabaseSync(resolvePlanDbPath(stateDir));
40
40
  try {
41
- db.exec(`
42
- CREATE TABLE IF NOT EXISTS actions (
43
- event_id TEXT PRIMARY KEY,
44
- doc TEXT NOT NULL
45
- ) STRICT;
41
+ db.exec(`
42
+ CREATE TABLE IF NOT EXISTS actions (
43
+ event_id TEXT PRIMARY KEY,
44
+ doc TEXT NOT NULL
45
+ ) STRICT;
46
46
  `);
47
47
  db.prepare("INSERT INTO actions (event_id, doc) VALUES (?, ?)").run(action.eventId, JSON.stringify(action));
48
48
  }
@@ -18,15 +18,15 @@ function seedAgentDb(baseDir, agentId, rows) {
18
18
  const dbPath = join(agentDir, "openclaw-agent.sqlite");
19
19
  const db = new DatabaseSync(dbPath);
20
20
  try {
21
- db.exec(`
22
- CREATE TABLE session_progress_cards (
23
- session_key TEXT NOT NULL PRIMARY KEY,
24
- markdown TEXT,
25
- steps_json TEXT,
26
- revision INTEGER NOT NULL,
27
- created_at INTEGER NOT NULL,
28
- updated_at INTEGER NOT NULL
29
- ) STRICT;
21
+ db.exec(`
22
+ CREATE TABLE session_progress_cards (
23
+ session_key TEXT NOT NULL PRIMARY KEY,
24
+ markdown TEXT,
25
+ steps_json TEXT,
26
+ revision INTEGER NOT NULL,
27
+ created_at INTEGER NOT NULL,
28
+ updated_at INTEGER NOT NULL
29
+ ) STRICT;
30
30
  `);
31
31
  const insert = db.prepare("INSERT INTO session_progress_cards (session_key, markdown, steps_json, revision, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?);");
32
32
  for (const row of rows) {
@@ -21,15 +21,15 @@ function seedCard(baseDir, agentId, sessionKey, opts) {
21
21
  mkdirSync(agentDir, { recursive: true });
22
22
  const db = new DatabaseSync(join(agentDir, "openclaw-agent.sqlite"));
23
23
  try {
24
- db.exec(`
25
- CREATE TABLE IF NOT EXISTS session_progress_cards (
26
- session_key TEXT NOT NULL PRIMARY KEY,
27
- markdown TEXT,
28
- steps_json TEXT,
29
- revision INTEGER NOT NULL,
30
- created_at INTEGER NOT NULL,
31
- updated_at INTEGER NOT NULL
32
- ) STRICT;
24
+ db.exec(`
25
+ CREATE TABLE IF NOT EXISTS session_progress_cards (
26
+ session_key TEXT NOT NULL PRIMARY KEY,
27
+ markdown TEXT,
28
+ steps_json TEXT,
29
+ revision INTEGER NOT NULL,
30
+ created_at INTEGER NOT NULL,
31
+ updated_at INTEGER NOT NULL
32
+ ) STRICT;
33
33
  `);
34
34
  db.prepare("INSERT INTO session_progress_cards (session_key, markdown, steps_json, revision, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?);").run(sessionKey, opts.markdown ?? null, opts.stepsJson, opts.createdAtMs ?? NOW - HOUR, opts.updatedAtMs ?? NOW - 5 * 60_000);
35
35
  }
@@ -1,4 +1,4 @@
1
- import type { OpenClawPluginApi } from "openclaw/plugin-sdk/channel-plugin-common";
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
2
  import type { Plan } from "@xgjktech/xg-openclaw-shared";
3
3
  export interface PlanEventSubscriptionDeps {
4
4
  /** 按 planId 反查权威 plan(注入 getPlanById) */
@@ -1 +1 @@
1
- {"version":3,"file":"plan-event-subscription.d.ts","sourceRoot":"","sources":["../../src/plan-event-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AASzD,MAAM,WAAW,yBAAyB;IACtC,yCAAyC;IACzC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;IAClD,6CAA6C;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/E;AAED,KAAK,kBAAkB,GAAG,UAAU,CAChC,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,gCAAgC,CAAC,CACzE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEf;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,yBAAyB,GAAG,kBAAkB,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAY3G"}
1
+ {"version":3,"file":"plan-event-subscription.d.ts","sourceRoot":"","sources":["../../src/plan-event-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AASzD,MAAM,WAAW,yBAAyB;IACtC,yCAAyC;IACzC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;IAClD,6CAA6C;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/E;AAED,KAAK,kBAAkB,GAAG,UAAU,CAChC,iBAAiB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,gCAAgC,CAAC,CACzE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEf;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,yBAAyB,GAAG,kBAAkB,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAY3G"}
@@ -1,4 +1,5 @@
1
- import type { Plan } from "@xgjktech/xg-openclaw-shared";
1
+ import { type Plan } from "@xgjktech/xg-openclaw-shared";
2
+ import type { ImStreamClient } from "./connection.js";
2
3
  /**
3
4
  * 组装发往前端的 plan:剥离 origin(内部路由信息,含 sessionKey,前端不需要也不该看到)。
4
5
  * 返回浅拷贝,不 mutate 入参(middleware 拿到的 plan 引用可能别处还要用)。
@@ -6,12 +7,22 @@ import type { Plan } from "@xgjktech/xg-openclaw-shared";
6
7
  export declare function toWirePlan(plan: Plan): Plan;
7
8
  /**
8
9
  * 发送一条 PLAN_STAT。绝不抛、绝不 await 调用方(内部自己 catch)。
9
- *
10
- * 计划状态来自 core progress_card(工具事件 or DB 回放),内部 origin 的
11
- * channel/to 用于路由到对应群的 WS client。
12
10
  */
13
11
  export declare function sendPlanStat(params: {
14
12
  plan: Plan;
15
13
  source: "tool" | "snapshot";
16
14
  }): void;
15
+ /**
16
+ * 登记 WS client(供后续 PLAN_STAT 增量路由),登记完立刻 fire-and-forget 触发一次快照:
17
+ * 反查该群未完成的计划,逐个发 PLAN_STAT(source: "snapshot")。
18
+ *
19
+ * dispatch 是热路径:整个快照过程包 try/catch、绝不 await、绝不抛——快照失败不能连累
20
+ * WS 绑定本身(登记必须先于快照执行、且不受快照结果影响)。
21
+ *
22
+ * `deps.listPlansByOrigin` 默认注入 plan-store-access 的实现;测试可传入假实现
23
+ * 模拟反查异常(红线防御性场景——即便被注入的反查实现意外抛出,本函数也绝不外抛)。
24
+ */
25
+ export declare function registerPlanWsClientAndSnapshot(groupId: string, client: ImStreamClient, replyToMsgId: string, deps?: {
26
+ listPlansByOrigin: (channel: string, to: string) => Plan[];
27
+ }): void;
17
28
  //# sourceMappingURL=plan-stat-event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-stat-event.d.ts","sourceRoot":"","sources":["../../src/plan-stat-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAKzD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG3C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAAG,IAAI,CA4BtF"}
1
+ {"version":3,"file":"plan-stat-event.d.ts","sourceRoot":"","sources":["../../src/plan-stat-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAAG,IAAI,CA4BtF;AAOD;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC3C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,EAAE,CAAA;CAA0B,GAC7F,IAAI,CAqBN"}
@@ -1,4 +1,6 @@
1
- import { getPlanWsClient } from "./plan-ws-registry.js";
1
+ import { isPlanCancelled } from "@xgjktech/xg-openclaw-shared";
2
+ import { getPlanWsClient, setPlanWsClient } from "./plan-ws-registry.js";
3
+ import { listPlansByOrigin } from "./plan-store-access.js";
2
4
  const LOG_PREFIX = "[xg_cwork_im] [plan-stat-event]";
3
5
  /**
4
6
  * 组装发往前端的 plan:剥离 origin(内部路由信息,含 sessionKey,前端不需要也不该看到)。
@@ -10,9 +12,6 @@ export function toWirePlan(plan) {
10
12
  }
11
13
  /**
12
14
  * 发送一条 PLAN_STAT。绝不抛、绝不 await 调用方(内部自己 catch)。
13
- *
14
- * 计划状态来自 core progress_card(工具事件 or DB 回放),内部 origin 的
15
- * channel/to 用于路由到对应群的 WS client。
16
15
  */
17
16
  export function sendPlanStat(params) {
18
17
  const { plan, source } = params;
@@ -38,4 +37,38 @@ export function sendPlanStat(params) {
38
37
  console.warn(`${LOG_PREFIX} 发送失败 planId=${plan.planId} groupId=${to}: ${String(err)}`);
39
38
  });
40
39
  }
40
+ /** 「未完成」判定:计划未取消,且存在 status !== "completed" 的 task。 */
41
+ function isUnfinished(plan) {
42
+ return !isPlanCancelled(plan) && plan.tasks.some((task) => task.status !== "completed");
43
+ }
44
+ /**
45
+ * 登记 WS client(供后续 PLAN_STAT 增量路由),登记完立刻 fire-and-forget 触发一次快照:
46
+ * 反查该群未完成的计划,逐个发 PLAN_STAT(source: "snapshot")。
47
+ *
48
+ * dispatch 是热路径:整个快照过程包 try/catch、绝不 await、绝不抛——快照失败不能连累
49
+ * WS 绑定本身(登记必须先于快照执行、且不受快照结果影响)。
50
+ *
51
+ * `deps.listPlansByOrigin` 默认注入 plan-store-access 的实现;测试可传入假实现
52
+ * 模拟反查异常(红线防御性场景——即便被注入的反查实现意外抛出,本函数也绝不外抛)。
53
+ */
54
+ export function registerPlanWsClientAndSnapshot(groupId, client, replyToMsgId, deps = { listPlansByOrigin }) {
55
+ setPlanWsClient(groupId, client, replyToMsgId);
56
+ try {
57
+ const plans = deps.listPlansByOrigin("xg_cwork_im", groupId);
58
+ const unfinishedPlans = plans.filter(isUnfinished);
59
+ if (unfinishedPlans.length > 1) {
60
+ console.warn("[xg_cwork_im] [plan-telemetry] multi-active " + JSON.stringify({
61
+ to: groupId,
62
+ count: unfinishedPlans.length,
63
+ planIds: unfinishedPlans.map((plan) => plan.planId),
64
+ }));
65
+ }
66
+ for (const plan of unfinishedPlans) {
67
+ sendPlanStat({ plan, source: "snapshot" });
68
+ }
69
+ }
70
+ catch (err) {
71
+ console.warn(`${LOG_PREFIX} 会话快照失败,已吞 groupId=${groupId}: ${String(err)}`);
72
+ }
73
+ }
41
74
  //# sourceMappingURL=plan-stat-event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-stat-event.js","sourceRoot":"","sources":["../../src/plan-stat-event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU;IACjC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC9C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmD;IAC5E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,aAAa,IAAI,CAAC,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CACR,GAAG,UAAU,4CAA4C,IAAI,CAAC,MAAM,YAAY,OAAO,IAAI,QAAQ,EAAE,CACxG,CAAC;QACF,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,sCAAsC,IAAI,CAAC,MAAM,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7F,OAAO;IACX,CAAC;IAED,KAAK,MAAM,CAAC,MAAM;SACb,SAAS,CAAC;QACP,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE;KAC3C,CAAC;SACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACpB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,gBAAgB,IAAI,CAAC,MAAM,YAAY,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"plan-stat-event.js","sourceRoot":"","sources":["../../src/plan-stat-event.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert/strict";
2
2
  import { describe, it, beforeEach } from "node:test";
3
3
  import { resetPlanWsRegistryForTest, setPlanWsClient } from "./plan-ws-registry.js";
4
- import { sendPlanStat, toWirePlan } from "./plan-stat-event.js";
4
+ import { registerPlanWsClientAndSnapshot, sendPlanStat, toWirePlan } from "./plan-stat-event.js";
5
5
  function makePlan(overrides = {}) {
6
6
  return {
7
7
  planId: "plan-1",
@@ -25,6 +25,20 @@ function makeRecordingClient() {
25
25
  };
26
26
  return { client, calls };
27
27
  }
28
+ function captureWarnLines(fn) {
29
+ const original = console.warn;
30
+ const lines = [];
31
+ console.warn = (...args) => {
32
+ lines.push(args.map(String).join(" "));
33
+ };
34
+ try {
35
+ fn();
36
+ }
37
+ finally {
38
+ console.warn = original;
39
+ }
40
+ return lines;
41
+ }
28
42
  beforeEach(() => {
29
43
  resetPlanWsRegistryForTest();
30
44
  });
@@ -128,4 +142,107 @@ describe("sendPlanStat: 🔴 fire-and-forget 红线", () => {
128
142
  assert.equal(result, undefined);
129
143
  });
130
144
  });
145
+ describe("registerPlanWsClientAndSnapshot: 快照路径", () => {
146
+ it("cancelled 计划不推送,未取消未完成计划照常推送", () => {
147
+ const { client, calls } = makeRecordingClient();
148
+ const active = makePlan({
149
+ planId: "plan-active",
150
+ origin: { channel: "xg_cwork_im", to: "g-1" },
151
+ tasks: [{ title: "继续推进", status: "in_progress" }],
152
+ });
153
+ const cancelled = makePlan({
154
+ planId: "plan-cancelled",
155
+ origin: { channel: "xg_cwork_im", to: "g-1" },
156
+ status: "cancelled",
157
+ cancelledAt: "2026-07-31T01:02:03.000Z",
158
+ tasks: [{ title: "旧阻塞", status: "blocked", note: "不应再推" }],
159
+ });
160
+ const finished = makePlan({
161
+ planId: "plan-finished",
162
+ origin: { channel: "xg_cwork_im", to: "g-1" },
163
+ tasks: [{ title: "已完成", status: "completed" }],
164
+ });
165
+ registerPlanWsClientAndSnapshot("g-1", client, "msg-1", {
166
+ listPlansByOrigin: () => [cancelled, active, finished],
167
+ });
168
+ assert.equal(calls.length, 1);
169
+ assert.equal(calls[0].data.plan.planId, active.planId);
170
+ assert.equal(calls[0].data.source, "snapshot");
171
+ });
172
+ it("同群存在 2 份未完成计划时输出一行 multi-active 结构化遥测", () => {
173
+ const { client, calls } = makeRecordingClient();
174
+ const unfinished1 = makePlan({
175
+ planId: "plan-a",
176
+ origin: { channel: "xg_cwork_im", to: "g-1" },
177
+ tasks: [{ title: "t1", status: "in_progress" }],
178
+ });
179
+ const unfinished2 = makePlan({
180
+ planId: "plan-b",
181
+ origin: { channel: "xg_cwork_im", to: "g-1" },
182
+ tasks: [{ title: "t1", status: "blocked", note: "n" }],
183
+ });
184
+ const finished = makePlan({
185
+ planId: "plan-c",
186
+ origin: { channel: "xg_cwork_im", to: "g-1" },
187
+ tasks: [{ title: "t1", status: "completed" }],
188
+ });
189
+ const lines = captureWarnLines(() => {
190
+ registerPlanWsClientAndSnapshot("g-1", client, "msg-1", {
191
+ listPlansByOrigin: () => [unfinished1, unfinished2, finished],
192
+ });
193
+ });
194
+ assert.equal(calls.length, 2);
195
+ assert.ok(calls.every((c) => c.data.source === "snapshot"));
196
+ const planIds = calls.map((c) => c.data.plan.planId).sort();
197
+ assert.deepEqual(planIds, ["plan-a", "plan-b"]);
198
+ assert.deepEqual(lines, [
199
+ "[xg_cwork_im] [plan-telemetry] multi-active " + JSON.stringify({
200
+ to: "g-1",
201
+ count: 2,
202
+ planIds: ["plan-a", "plan-b"],
203
+ }),
204
+ ]);
205
+ });
206
+ it("同群只有 1 份或 0 份未完成计划时不输出 multi-active 遥测", () => {
207
+ const { client } = makeRecordingClient();
208
+ const active = makePlan({
209
+ planId: "plan-active",
210
+ origin: { channel: "xg_cwork_im", to: "g-1" },
211
+ });
212
+ const finished = makePlan({
213
+ planId: "plan-finished",
214
+ origin: { channel: "xg_cwork_im", to: "g-1" },
215
+ tasks: [{ title: "完成", status: "completed" }],
216
+ });
217
+ const cancelled = makePlan({
218
+ planId: "plan-cancelled",
219
+ origin: { channel: "xg_cwork_im", to: "g-1" },
220
+ status: "cancelled",
221
+ });
222
+ const lines = captureWarnLines(() => {
223
+ registerPlanWsClientAndSnapshot("g-1", client, "msg-1", {
224
+ listPlansByOrigin: () => [active, finished, cancelled],
225
+ });
226
+ registerPlanWsClientAndSnapshot("g-1", client, "msg-2", {
227
+ listPlansByOrigin: () => [finished, cancelled],
228
+ });
229
+ });
230
+ assert.deepEqual(lines, []);
231
+ });
232
+ it("🔴 反查抛异常 → registerPlanWsClientAndSnapshot 不抛,且登记本身仍然成功", () => {
233
+ const { client, calls } = makeRecordingClient();
234
+ assert.doesNotThrow(() => {
235
+ registerPlanWsClientAndSnapshot("g-1", client, "msg-1", {
236
+ listPlansByOrigin: () => {
237
+ throw new Error("db locked");
238
+ },
239
+ });
240
+ });
241
+ assert.equal(calls.length, 0, "反查失败不应发出任何 PLAN_STAT");
242
+ // 登记仍然成功:紧接着用同一 client 发一条正常的 PLAN_STAT 应该能路由到
243
+ const plan = makePlan({ origin: { channel: "xg_cwork_im", to: "g-1" } });
244
+ sendPlanStat({ plan, source: "tool" });
245
+ assert.equal(calls.length, 1, "快照失败不能连累 WS 绑定,后续增量应仍能发出");
246
+ });
247
+ });
131
248
  //# sourceMappingURL=plan-stat-event.test.js.map