@xgjktech/xg_cwork_im 1.19.21 → 1.19.23

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 (549) hide show
  1. package/dist/index.d.ts +2 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +26 -26
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/connection/account-connection.d.ts +37 -0
  6. package/dist/src/connection/account-connection.d.ts.map +1 -0
  7. package/dist/src/connection/account-connection.js +548 -0
  8. package/dist/src/connection/account-connection.js.map +1 -0
  9. package/dist/src/connection/account-reconciler.d.ts +64 -0
  10. package/dist/src/connection/account-reconciler.d.ts.map +1 -0
  11. package/dist/src/connection/account-reconciler.js +314 -0
  12. package/dist/src/connection/account-reconciler.js.map +1 -0
  13. package/dist/src/connection/account-reconciler.test.d.ts +2 -0
  14. package/dist/src/connection/account-reconciler.test.d.ts.map +1 -0
  15. package/dist/src/connection/account-reconciler.test.js +166 -0
  16. package/dist/src/connection/account-reconciler.test.js.map +1 -0
  17. package/dist/src/connection/agent-stream-client-registry.d.ts +8 -0
  18. package/dist/src/connection/agent-stream-client-registry.d.ts.map +1 -0
  19. package/dist/src/connection/agent-stream-client-registry.js +19 -0
  20. package/dist/src/connection/agent-stream-client-registry.js.map +1 -0
  21. package/dist/src/connection/connection.d.ts +116 -0
  22. package/dist/src/connection/connection.d.ts.map +1 -0
  23. package/dist/src/connection/connection.js +469 -0
  24. package/dist/src/connection/connection.js.map +1 -0
  25. package/dist/src/connection/connection.test.d.ts +2 -0
  26. package/dist/src/connection/connection.test.d.ts.map +1 -0
  27. package/dist/src/connection/connection.test.js +126 -0
  28. package/dist/src/connection/connection.test.js.map +1 -0
  29. package/dist/src/connection/ws-inbound-schema.d.ts +14 -0
  30. package/dist/src/connection/ws-inbound-schema.d.ts.map +1 -0
  31. package/dist/src/connection/ws-inbound-schema.js +68 -0
  32. package/dist/src/connection/ws-inbound-schema.js.map +1 -0
  33. package/dist/src/connection/ws-inbound-schema.test.d.ts +2 -0
  34. package/dist/src/connection/ws-inbound-schema.test.d.ts.map +1 -0
  35. package/dist/src/connection/ws-inbound-schema.test.js +58 -0
  36. package/dist/src/connection/ws-inbound-schema.test.js.map +1 -0
  37. package/dist/src/delivery/assistant-item-delivery.d.ts +27 -0
  38. package/dist/src/delivery/assistant-item-delivery.d.ts.map +1 -0
  39. package/dist/src/delivery/assistant-item-delivery.js +134 -0
  40. package/dist/src/delivery/assistant-item-delivery.js.map +1 -0
  41. package/dist/src/delivery/assistant-item-delivery.test.d.ts +2 -0
  42. package/dist/src/delivery/assistant-item-delivery.test.d.ts.map +1 -0
  43. package/dist/src/delivery/assistant-item-delivery.test.js +116 -0
  44. package/dist/src/delivery/assistant-item-delivery.test.js.map +1 -0
  45. package/dist/src/delivery/assistant-item-sink.d.ts +17 -0
  46. package/dist/src/delivery/assistant-item-sink.d.ts.map +1 -0
  47. package/dist/src/delivery/assistant-item-sink.js +34 -0
  48. package/dist/src/delivery/assistant-item-sink.js.map +1 -0
  49. package/dist/src/delivery/block-streaming-config.test.d.ts +2 -0
  50. package/dist/src/delivery/block-streaming-config.test.d.ts.map +1 -0
  51. package/dist/src/delivery/block-streaming-config.test.js +91 -0
  52. package/dist/src/delivery/block-streaming-config.test.js.map +1 -0
  53. package/dist/src/delivery/deliver-text.d.ts +30 -0
  54. package/dist/src/delivery/deliver-text.d.ts.map +1 -0
  55. package/dist/src/delivery/deliver-text.js +88 -0
  56. package/dist/src/delivery/deliver-text.js.map +1 -0
  57. package/dist/src/delivery/deliver-text.test.d.ts +2 -0
  58. package/dist/src/delivery/deliver-text.test.d.ts.map +1 -0
  59. package/dist/src/delivery/deliver-text.test.js +117 -0
  60. package/dist/src/delivery/deliver-text.test.js.map +1 -0
  61. package/dist/src/delivery/im-tool-progress.d.ts +4 -0
  62. package/dist/src/delivery/im-tool-progress.d.ts.map +1 -0
  63. package/dist/src/delivery/im-tool-progress.js +87 -0
  64. package/dist/src/delivery/im-tool-progress.js.map +1 -0
  65. package/dist/src/delivery/inbound-terminal-delivery.d.ts +77 -0
  66. package/dist/src/delivery/inbound-terminal-delivery.d.ts.map +1 -0
  67. package/dist/src/delivery/inbound-terminal-delivery.js +251 -0
  68. package/dist/src/delivery/inbound-terminal-delivery.js.map +1 -0
  69. package/dist/src/delivery/inbound-terminal-state.d.ts +68 -0
  70. package/dist/src/delivery/inbound-terminal-state.d.ts.map +1 -0
  71. package/dist/src/delivery/inbound-terminal-state.js +185 -0
  72. package/dist/src/delivery/inbound-terminal-state.js.map +1 -0
  73. package/dist/src/delivery/inbound-terminal-state.test.d.ts +2 -0
  74. package/dist/src/delivery/inbound-terminal-state.test.d.ts.map +1 -0
  75. package/dist/src/delivery/inbound-terminal-state.test.js +224 -0
  76. package/dist/src/delivery/inbound-terminal-state.test.js.map +1 -0
  77. package/dist/src/delivery/send-file-event.d.ts +26 -0
  78. package/dist/src/delivery/send-file-event.d.ts.map +1 -0
  79. package/dist/src/delivery/send-file-event.js +33 -0
  80. package/dist/src/delivery/send-file-event.js.map +1 -0
  81. package/dist/src/delivery/send-file-event.test.d.ts +2 -0
  82. package/dist/src/delivery/send-file-event.test.d.ts.map +1 -0
  83. package/dist/src/delivery/send-file-event.test.js +86 -0
  84. package/dist/src/delivery/send-file-event.test.js.map +1 -0
  85. package/dist/src/delivery/send-service.d.ts +83 -0
  86. package/dist/src/delivery/send-service.d.ts.map +1 -0
  87. package/dist/src/delivery/send-service.js +324 -0
  88. package/dist/src/delivery/send-service.js.map +1 -0
  89. package/dist/src/delivery/send-service.test.d.ts +2 -0
  90. package/dist/src/delivery/send-service.test.d.ts.map +1 -0
  91. package/dist/src/delivery/send-service.test.js +40 -0
  92. package/dist/src/delivery/send-service.test.js.map +1 -0
  93. package/dist/src/delivery/thinking-ws-progress.d.ts +24 -0
  94. package/dist/src/delivery/thinking-ws-progress.d.ts.map +1 -0
  95. package/dist/src/delivery/thinking-ws-progress.js +45 -0
  96. package/dist/src/delivery/thinking-ws-progress.js.map +1 -0
  97. package/dist/src/delivery/thinking-ws-progress.test.d.ts +2 -0
  98. package/dist/src/delivery/thinking-ws-progress.test.d.ts.map +1 -0
  99. package/dist/src/delivery/thinking-ws-progress.test.js +38 -0
  100. package/dist/src/delivery/thinking-ws-progress.test.js.map +1 -0
  101. package/dist/src/delivery/turn-deliver-buffer.d.ts +60 -0
  102. package/dist/src/delivery/turn-deliver-buffer.d.ts.map +1 -0
  103. package/dist/src/delivery/turn-deliver-buffer.js +133 -0
  104. package/dist/src/delivery/turn-deliver-buffer.js.map +1 -0
  105. package/dist/src/delivery/turn-deliver-buffer.test.d.ts +2 -0
  106. package/dist/src/delivery/turn-deliver-buffer.test.d.ts.map +1 -0
  107. package/dist/src/delivery/turn-deliver-buffer.test.js +184 -0
  108. package/dist/src/delivery/turn-deliver-buffer.test.js.map +1 -0
  109. package/dist/src/delivery/user-facing-errors.d.ts +32 -0
  110. package/dist/src/delivery/user-facing-errors.d.ts.map +1 -0
  111. package/dist/src/delivery/user-facing-errors.js +120 -0
  112. package/dist/src/delivery/user-facing-errors.js.map +1 -0
  113. package/dist/src/delivery/user-facing-errors.test.d.ts +2 -0
  114. package/dist/src/delivery/user-facing-errors.test.d.ts.map +1 -0
  115. package/dist/src/delivery/user-facing-errors.test.js +102 -0
  116. package/dist/src/delivery/user-facing-errors.test.js.map +1 -0
  117. package/dist/src/inbound/dispatch-mentioned-reply.d.ts +47 -0
  118. package/dist/src/inbound/dispatch-mentioned-reply.d.ts.map +1 -0
  119. package/dist/src/inbound/dispatch-mentioned-reply.js +1014 -0
  120. package/dist/src/inbound/dispatch-mentioned-reply.js.map +1 -0
  121. package/dist/src/inbound/inbound-archive.d.ts +4 -0
  122. package/dist/src/inbound/inbound-archive.d.ts.map +1 -0
  123. package/dist/src/inbound/inbound-archive.js +105 -0
  124. package/dist/src/inbound/inbound-archive.js.map +1 -0
  125. package/dist/src/inbound/inbound-attachment-meta.d.ts +13 -0
  126. package/dist/src/inbound/inbound-attachment-meta.d.ts.map +1 -0
  127. package/dist/src/inbound/inbound-attachment-meta.js +39 -0
  128. package/dist/src/inbound/inbound-attachment-meta.js.map +1 -0
  129. package/dist/src/inbound/inbound-chat-type.d.ts +33 -0
  130. package/dist/src/inbound/inbound-chat-type.d.ts.map +1 -0
  131. package/dist/src/inbound/inbound-chat-type.js +52 -0
  132. package/dist/src/inbound/inbound-chat-type.js.map +1 -0
  133. package/dist/src/inbound/inbound-display.d.ts +41 -0
  134. package/dist/src/inbound/inbound-display.d.ts.map +1 -0
  135. package/dist/src/inbound/inbound-display.js +170 -0
  136. package/dist/src/inbound/inbound-display.js.map +1 -0
  137. package/dist/src/inbound/reply-dispatch-driver.d.ts +89 -0
  138. package/dist/src/inbound/reply-dispatch-driver.d.ts.map +1 -0
  139. package/dist/src/inbound/reply-dispatch-driver.js +294 -0
  140. package/dist/src/inbound/reply-dispatch-driver.js.map +1 -0
  141. package/dist/src/inbound/reply-dispatch-driver.test.d.ts +2 -0
  142. package/dist/src/inbound/reply-dispatch-driver.test.d.ts.map +1 -0
  143. package/dist/src/inbound/reply-dispatch-driver.test.js +363 -0
  144. package/dist/src/inbound/reply-dispatch-driver.test.js.map +1 -0
  145. package/dist/src/inbound/resolve-inbound-group-prompt.d.ts +37 -0
  146. package/dist/src/inbound/resolve-inbound-group-prompt.d.ts.map +1 -0
  147. package/dist/src/inbound/resolve-inbound-group-prompt.js +57 -0
  148. package/dist/src/inbound/resolve-inbound-group-prompt.js.map +1 -0
  149. package/dist/src/plan/action-run-event.d.ts +20 -0
  150. package/dist/src/plan/action-run-event.d.ts.map +1 -0
  151. package/dist/src/plan/action-run-event.js +62 -0
  152. package/dist/src/plan/action-run-event.js.map +1 -0
  153. package/dist/src/plan/action-run-event.test.d.ts +2 -0
  154. package/dist/src/plan/action-run-event.test.d.ts.map +1 -0
  155. package/dist/src/plan/action-run-event.test.js +83 -0
  156. package/dist/src/plan/action-run-event.test.js.map +1 -0
  157. package/dist/src/plan/action-store-access.d.ts +29 -0
  158. package/dist/src/plan/action-store-access.d.ts.map +1 -0
  159. package/dist/src/plan/action-store-access.js +81 -0
  160. package/dist/src/plan/action-store-access.js.map +1 -0
  161. package/dist/src/plan/action-store-lifecycle.test.d.ts +2 -0
  162. package/dist/src/plan/action-store-lifecycle.test.d.ts.map +1 -0
  163. package/dist/src/plan/action-store-lifecycle.test.js +195 -0
  164. package/dist/src/plan/action-store-lifecycle.test.js.map +1 -0
  165. package/dist/src/plan/plan-core-adapter.d.ts +54 -0
  166. package/dist/src/plan/plan-core-adapter.d.ts.map +1 -0
  167. package/dist/src/plan/plan-core-adapter.js +104 -0
  168. package/dist/src/plan/plan-core-adapter.js.map +1 -0
  169. package/dist/src/plan/plan-core-adapter.test.d.ts +2 -0
  170. package/dist/src/plan/plan-core-adapter.test.d.ts.map +1 -0
  171. package/dist/src/plan/plan-core-adapter.test.js +183 -0
  172. package/dist/src/plan/plan-core-adapter.test.js.map +1 -0
  173. package/dist/src/plan/plan-core-db.d.ts +22 -0
  174. package/dist/src/plan/plan-core-db.d.ts.map +1 -0
  175. package/dist/src/plan/plan-core-db.js +91 -0
  176. package/dist/src/plan/plan-core-db.js.map +1 -0
  177. package/dist/src/plan/plan-core-db.test.d.ts +2 -0
  178. package/dist/src/plan/plan-core-db.test.d.ts.map +1 -0
  179. package/dist/src/plan/plan-core-db.test.js +115 -0
  180. package/dist/src/plan/plan-core-db.test.js.map +1 -0
  181. package/dist/src/plan/plan-core-snapshot.d.ts +23 -0
  182. package/dist/src/plan/plan-core-snapshot.d.ts.map +1 -0
  183. package/dist/src/plan/plan-core-snapshot.js +66 -0
  184. package/dist/src/plan/plan-core-snapshot.js.map +1 -0
  185. package/dist/src/plan/plan-core-snapshot.test.d.ts +2 -0
  186. package/dist/src/plan/plan-core-snapshot.test.d.ts.map +1 -0
  187. package/dist/src/plan/plan-core-snapshot.test.js +157 -0
  188. package/dist/src/plan/plan-core-snapshot.test.js.map +1 -0
  189. package/dist/src/plan/plan-stat-event.d.ts +17 -0
  190. package/dist/src/plan/plan-stat-event.d.ts.map +1 -0
  191. package/dist/src/plan/plan-stat-event.js +41 -0
  192. package/dist/src/plan/plan-stat-event.js.map +1 -0
  193. package/dist/src/plan/plan-stat-event.test.d.ts +2 -0
  194. package/dist/src/plan/plan-stat-event.test.d.ts.map +1 -0
  195. package/dist/src/plan/plan-stat-event.test.js +131 -0
  196. package/dist/src/plan/plan-stat-event.test.js.map +1 -0
  197. package/dist/src/plan/plan-tool-middleware.d.ts +19 -0
  198. package/dist/src/plan/plan-tool-middleware.d.ts.map +1 -0
  199. package/dist/src/plan/plan-tool-middleware.js +63 -0
  200. package/dist/src/plan/plan-tool-middleware.js.map +1 -0
  201. package/dist/src/plan/plan-tool-middleware.test.d.ts +2 -0
  202. package/dist/src/plan/plan-tool-middleware.test.d.ts.map +1 -0
  203. package/dist/src/plan/plan-tool-middleware.test.js +103 -0
  204. package/dist/src/plan/plan-tool-middleware.test.js.map +1 -0
  205. package/dist/src/plan/plan-ws-registry.d.ts +15 -0
  206. package/dist/src/plan/plan-ws-registry.d.ts.map +1 -0
  207. package/dist/src/plan/plan-ws-registry.js +39 -0
  208. package/dist/src/plan/plan-ws-registry.js.map +1 -0
  209. package/dist/src/plan/plan-ws-registry.test.d.ts +2 -0
  210. package/dist/src/plan/plan-ws-registry.test.d.ts.map +1 -0
  211. package/dist/src/plan/plan-ws-registry.test.js +61 -0
  212. package/dist/src/plan/plan-ws-registry.test.js.map +1 -0
  213. package/dist/src/plan/tool-event-adapter.d.ts +31 -0
  214. package/dist/src/plan/tool-event-adapter.d.ts.map +1 -0
  215. package/dist/src/plan/tool-event-adapter.js +83 -0
  216. package/dist/src/plan/tool-event-adapter.js.map +1 -0
  217. package/dist/src/plan/tool-event-adapter.test.d.ts +2 -0
  218. package/dist/src/plan/tool-event-adapter.test.d.ts.map +1 -0
  219. package/dist/src/plan/tool-event-adapter.test.js +93 -0
  220. package/dist/src/plan/tool-event-adapter.test.js.map +1 -0
  221. package/dist/src/plugin/auth.d.ts +32 -0
  222. package/dist/src/plugin/auth.d.ts.map +1 -0
  223. package/dist/src/plugin/auth.js +70 -0
  224. package/dist/src/plugin/auth.js.map +1 -0
  225. package/dist/src/plugin/channel-config.d.ts +716 -0
  226. package/dist/src/plugin/channel-config.d.ts.map +1 -0
  227. package/dist/src/plugin/channel-config.js +405 -0
  228. package/dist/src/plugin/channel-config.js.map +1 -0
  229. package/dist/src/plugin/channel-config.test.d.ts +2 -0
  230. package/dist/src/plugin/channel-config.test.d.ts.map +1 -0
  231. package/dist/src/plugin/channel-config.test.js +113 -0
  232. package/dist/src/plugin/channel-config.test.js.map +1 -0
  233. package/dist/src/plugin/channel-disabled-account.test.d.ts +2 -0
  234. package/dist/src/plugin/channel-disabled-account.test.d.ts.map +1 -0
  235. package/dist/src/plugin/channel-disabled-account.test.js +44 -0
  236. package/dist/src/plugin/channel-disabled-account.test.js.map +1 -0
  237. package/dist/src/plugin/channel-log.d.ts +17 -0
  238. package/dist/src/plugin/channel-log.d.ts.map +1 -0
  239. package/dist/src/plugin/channel-log.js +45 -0
  240. package/dist/src/plugin/channel-log.js.map +1 -0
  241. package/dist/src/plugin/channel.d.ts +17 -0
  242. package/dist/src/plugin/channel.d.ts.map +1 -0
  243. package/dist/src/plugin/channel.js +272 -0
  244. package/dist/src/plugin/channel.js.map +1 -0
  245. package/dist/src/plugin/plugin-dispose.d.ts +22 -0
  246. package/dist/src/plugin/plugin-dispose.d.ts.map +1 -0
  247. package/dist/src/plugin/plugin-dispose.js +66 -0
  248. package/dist/src/plugin/plugin-dispose.js.map +1 -0
  249. package/dist/src/plugin/process-shared-store.d.ts +48 -0
  250. package/dist/src/plugin/process-shared-store.d.ts.map +1 -0
  251. package/dist/src/plugin/process-shared-store.js +89 -0
  252. package/dist/src/plugin/process-shared-store.js.map +1 -0
  253. package/dist/src/plugin/process-shared-store.test.d.ts +2 -0
  254. package/dist/src/plugin/process-shared-store.test.d.ts.map +1 -0
  255. package/dist/src/plugin/process-shared-store.test.js +60 -0
  256. package/dist/src/plugin/process-shared-store.test.js.map +1 -0
  257. package/dist/src/plugin/recommended-system-prompt.d.ts +3 -0
  258. package/dist/src/plugin/recommended-system-prompt.d.ts.map +1 -0
  259. package/dist/src/plugin/recommended-system-prompt.js +8 -0
  260. package/dist/src/plugin/recommended-system-prompt.js.map +1 -0
  261. package/dist/src/plugin/types.d.ts +433 -0
  262. package/dist/src/plugin/types.d.ts.map +1 -0
  263. package/dist/src/plugin/types.js +32 -0
  264. package/dist/src/plugin/types.js.map +1 -0
  265. package/dist/src/session/agent-context-types.d.ts +241 -0
  266. package/dist/src/session/agent-context-types.d.ts.map +1 -0
  267. package/dist/src/session/agent-context-types.js +142 -0
  268. package/dist/src/session/agent-context-types.js.map +1 -0
  269. package/dist/src/session/agent-context-types.test.d.ts +2 -0
  270. package/dist/src/session/agent-context-types.test.d.ts.map +1 -0
  271. package/dist/src/session/agent-context-types.test.js +140 -0
  272. package/dist/src/session/agent-context-types.test.js.map +1 -0
  273. package/dist/src/session/auto-model-router.d.ts +36 -0
  274. package/dist/src/session/auto-model-router.d.ts.map +1 -0
  275. package/dist/src/session/auto-model-router.js +60 -0
  276. package/dist/src/session/auto-model-router.js.map +1 -0
  277. package/dist/src/session/auto-model-router.test.d.ts +2 -0
  278. package/dist/src/session/auto-model-router.test.d.ts.map +1 -0
  279. package/dist/src/session/auto-model-router.test.js +99 -0
  280. package/dist/src/session/auto-model-router.test.js.map +1 -0
  281. package/dist/src/session/build-project-prompt.d.ts +40 -0
  282. package/dist/src/session/build-project-prompt.d.ts.map +1 -0
  283. package/dist/src/session/build-project-prompt.js +190 -0
  284. package/dist/src/session/build-project-prompt.js.map +1 -0
  285. package/dist/src/session/build-project-prompt.test.d.ts +2 -0
  286. package/dist/src/session/build-project-prompt.test.d.ts.map +1 -0
  287. package/dist/src/session/build-project-prompt.test.js +100 -0
  288. package/dist/src/session/build-project-prompt.test.js.map +1 -0
  289. package/dist/src/session/inbound-model.d.ts +39 -0
  290. package/dist/src/session/inbound-model.d.ts.map +1 -0
  291. package/dist/src/session/inbound-model.js +66 -0
  292. package/dist/src/session/inbound-model.js.map +1 -0
  293. package/dist/src/session/inbound-model.test.d.ts +2 -0
  294. package/dist/src/session/inbound-model.test.d.ts.map +1 -0
  295. package/dist/src/session/inbound-model.test.js +88 -0
  296. package/dist/src/session/inbound-model.test.js.map +1 -0
  297. package/dist/src/session/per-message-fallback-notice.d.ts +43 -0
  298. package/dist/src/session/per-message-fallback-notice.d.ts.map +1 -0
  299. package/dist/src/session/per-message-fallback-notice.js +93 -0
  300. package/dist/src/session/per-message-fallback-notice.js.map +1 -0
  301. package/dist/src/session/per-message-fallback-notice.test.d.ts +2 -0
  302. package/dist/src/session/per-message-fallback-notice.test.d.ts.map +1 -0
  303. package/dist/src/session/per-message-fallback-notice.test.js +47 -0
  304. package/dist/src/session/per-message-fallback-notice.test.js.map +1 -0
  305. package/dist/src/session/per-message-model-pending.d.ts +52 -0
  306. package/dist/src/session/per-message-model-pending.d.ts.map +1 -0
  307. package/dist/src/session/per-message-model-pending.js +134 -0
  308. package/dist/src/session/per-message-model-pending.js.map +1 -0
  309. package/dist/src/session/register-group-prompt-hook.d.ts +17 -0
  310. package/dist/src/session/register-group-prompt-hook.d.ts.map +1 -0
  311. package/dist/src/session/register-group-prompt-hook.js +45 -0
  312. package/dist/src/session/register-group-prompt-hook.js.map +1 -0
  313. package/dist/src/session/register-group-prompt-hook.test.d.ts +2 -0
  314. package/dist/src/session/register-group-prompt-hook.test.d.ts.map +1 -0
  315. package/dist/src/session/register-group-prompt-hook.test.js +60 -0
  316. package/dist/src/session/register-group-prompt-hook.test.js.map +1 -0
  317. package/dist/src/session/register-per-message-model-hook.d.ts +14 -0
  318. package/dist/src/session/register-per-message-model-hook.d.ts.map +1 -0
  319. package/dist/src/session/register-per-message-model-hook.js +48 -0
  320. package/dist/src/session/register-per-message-model-hook.js.map +1 -0
  321. package/dist/src/session/register-per-message-model-hook.test.d.ts +2 -0
  322. package/dist/src/session/register-per-message-model-hook.test.d.ts.map +1 -0
  323. package/dist/src/session/register-per-message-model-hook.test.js +208 -0
  324. package/dist/src/session/register-per-message-model-hook.test.js.map +1 -0
  325. package/dist/src/session/register-run-model-context-hook.d.ts +11 -0
  326. package/dist/src/session/register-run-model-context-hook.d.ts.map +1 -0
  327. package/dist/src/session/register-run-model-context-hook.js +23 -0
  328. package/dist/src/session/register-run-model-context-hook.js.map +1 -0
  329. package/dist/src/session/run-model-context.d.ts +45 -0
  330. package/dist/src/session/run-model-context.d.ts.map +1 -0
  331. package/dist/src/session/run-model-context.js +108 -0
  332. package/dist/src/session/run-model-context.js.map +1 -0
  333. package/dist/src/session/run-model-context.test.d.ts +2 -0
  334. package/dist/src/session/run-model-context.test.d.ts.map +1 -0
  335. package/dist/src/session/run-model-context.test.js +68 -0
  336. package/dist/src/session/run-model-context.test.js.map +1 -0
  337. package/dist/src/session/session-env-store.d.ts +55 -0
  338. package/dist/src/session/session-env-store.d.ts.map +1 -0
  339. package/dist/src/session/session-env-store.js +328 -0
  340. package/dist/src/session/session-env-store.js.map +1 -0
  341. package/dist/src/session/session-env-store.test.d.ts +2 -0
  342. package/dist/src/session/session-env-store.test.d.ts.map +1 -0
  343. package/dist/src/session/session-env-store.test.js +151 -0
  344. package/dist/src/session/session-env-store.test.js.map +1 -0
  345. package/dist/src/session/session-group-prompt.d.ts +34 -0
  346. package/dist/src/session/session-group-prompt.d.ts.map +1 -0
  347. package/dist/src/session/session-group-prompt.js +101 -0
  348. package/dist/src/session/session-group-prompt.js.map +1 -0
  349. package/dist/src/session/session-group-prompt.test.d.ts +2 -0
  350. package/dist/src/session/session-group-prompt.test.d.ts.map +1 -0
  351. package/dist/src/session/session-group-prompt.test.js +72 -0
  352. package/dist/src/session/session-group-prompt.test.js.map +1 -0
  353. package/dist/src/session/session-im-context.d.ts +15 -0
  354. package/dist/src/session/session-im-context.d.ts.map +1 -0
  355. package/dist/src/session/session-im-context.js +54 -0
  356. package/dist/src/session/session-im-context.js.map +1 -0
  357. package/dist/src/session/session-model-fallback.d.ts +13 -0
  358. package/dist/src/session/session-model-fallback.d.ts.map +1 -0
  359. package/dist/src/session/session-model-fallback.js +24 -0
  360. package/dist/src/session/session-model-fallback.js.map +1 -0
  361. package/dist/src/tools/active-cron-context-store.d.ts +20 -0
  362. package/dist/src/tools/active-cron-context-store.d.ts.map +1 -0
  363. package/dist/src/tools/active-cron-context-store.js +73 -0
  364. package/dist/src/tools/active-cron-context-store.js.map +1 -0
  365. package/dist/src/tools/cron-appkey-binding-store.d.ts +29 -0
  366. package/dist/src/tools/cron-appkey-binding-store.d.ts.map +1 -0
  367. package/dist/src/tools/cron-appkey-binding-store.js +239 -0
  368. package/dist/src/tools/cron-appkey-binding-store.js.map +1 -0
  369. package/dist/src/tools/cron-appkey-binding-store.test.d.ts +2 -0
  370. package/dist/src/tools/cron-appkey-binding-store.test.d.ts.map +1 -0
  371. package/dist/src/tools/cron-appkey-binding-store.test.js +387 -0
  372. package/dist/src/tools/cron-appkey-binding-store.test.js.map +1 -0
  373. package/dist/src/tools/group-history-tool.d.ts +31 -0
  374. package/dist/src/tools/group-history-tool.d.ts.map +1 -0
  375. package/dist/src/tools/group-history-tool.js +177 -0
  376. package/dist/src/tools/group-history-tool.js.map +1 -0
  377. package/dist/src/tools/register-exec-env-hook.d.ts +44 -0
  378. package/dist/src/tools/register-exec-env-hook.d.ts.map +1 -0
  379. package/dist/src/tools/register-exec-env-hook.js +473 -0
  380. package/dist/src/tools/register-exec-env-hook.js.map +1 -0
  381. package/dist/src/tools/register-exec-env-hook.test.d.ts +2 -0
  382. package/dist/src/tools/register-exec-env-hook.test.d.ts.map +1 -0
  383. package/dist/src/tools/register-exec-env-hook.test.js +189 -0
  384. package/dist/src/tools/register-exec-env-hook.test.js.map +1 -0
  385. package/dist/src/tools/send-file-tool.d.ts +81 -0
  386. package/dist/src/tools/send-file-tool.d.ts.map +1 -0
  387. package/dist/src/tools/send-file-tool.js +363 -0
  388. package/dist/src/tools/send-file-tool.js.map +1 -0
  389. package/dist/src/tools/send-file-tool.test.d.ts +2 -0
  390. package/dist/src/tools/send-file-tool.test.d.ts.map +1 -0
  391. package/dist/src/tools/send-file-tool.test.js +176 -0
  392. package/dist/src/tools/send-file-tool.test.js.map +1 -0
  393. package/dist/src/tools/send-group-message-tool.d.ts +17 -0
  394. package/dist/src/tools/send-group-message-tool.d.ts.map +1 -0
  395. package/dist/src/tools/send-group-message-tool.js +82 -0
  396. package/dist/src/tools/send-group-message-tool.js.map +1 -0
  397. package/dist/src/tools/tool-json-result.d.ts +14 -0
  398. package/dist/src/tools/tool-json-result.d.ts.map +1 -0
  399. package/dist/src/tools/tool-json-result.js +20 -0
  400. package/dist/src/tools/tool-json-result.js.map +1 -0
  401. package/dist/src/turn/active-round-registry.d.ts +35 -0
  402. package/dist/src/turn/active-round-registry.d.ts.map +1 -0
  403. package/dist/src/turn/active-round-registry.js +85 -0
  404. package/dist/src/turn/active-round-registry.js.map +1 -0
  405. package/dist/src/turn/active-round-registry.test.d.ts +2 -0
  406. package/dist/src/turn/active-round-registry.test.d.ts.map +1 -0
  407. package/dist/src/turn/active-round-registry.test.js +62 -0
  408. package/dist/src/turn/active-round-registry.test.js.map +1 -0
  409. package/dist/src/turn/interrupt-round.d.ts +9 -0
  410. package/dist/src/turn/interrupt-round.d.ts.map +1 -0
  411. package/dist/src/turn/interrupt-round.js +44 -0
  412. package/dist/src/turn/interrupt-round.js.map +1 -0
  413. package/dist/src/turn/interrupt-round.test.d.ts +2 -0
  414. package/dist/src/turn/interrupt-round.test.d.ts.map +1 -0
  415. package/dist/src/turn/interrupt-round.test.js +133 -0
  416. package/dist/src/turn/interrupt-round.test.js.map +1 -0
  417. package/dist/src/turn/item-event-guard.d.ts +28 -0
  418. package/dist/src/turn/item-event-guard.d.ts.map +1 -0
  419. package/dist/src/turn/item-event-guard.js +22 -0
  420. package/dist/src/turn/item-event-guard.js.map +1 -0
  421. package/dist/src/turn/item-event-guard.test.d.ts +2 -0
  422. package/dist/src/turn/item-event-guard.test.d.ts.map +1 -0
  423. package/dist/src/turn/item-event-guard.test.js +55 -0
  424. package/dist/src/turn/item-event-guard.test.js.map +1 -0
  425. package/dist/src/turn/run-usage-session.d.ts +13 -0
  426. package/dist/src/turn/run-usage-session.d.ts.map +1 -0
  427. package/dist/src/turn/run-usage-session.js +41 -0
  428. package/dist/src/turn/run-usage-session.js.map +1 -0
  429. package/dist/src/turn/run-usage.d.ts +67 -0
  430. package/dist/src/turn/run-usage.d.ts.map +1 -0
  431. package/dist/src/turn/run-usage.js +119 -0
  432. package/dist/src/turn/run-usage.js.map +1 -0
  433. package/dist/src/turn/run-usage.test.d.ts +2 -0
  434. package/dist/src/turn/run-usage.test.d.ts.map +1 -0
  435. package/dist/src/turn/run-usage.test.js +178 -0
  436. package/dist/src/turn/run-usage.test.js.map +1 -0
  437. package/dist/src/turn/subagent-monitor.d.ts +45 -0
  438. package/dist/src/turn/subagent-monitor.d.ts.map +1 -0
  439. package/dist/src/turn/subagent-monitor.js +498 -0
  440. package/dist/src/turn/subagent-monitor.js.map +1 -0
  441. package/dist/src/turn/subagent-monitor.test.d.ts +2 -0
  442. package/dist/src/turn/subagent-monitor.test.d.ts.map +1 -0
  443. package/dist/src/turn/subagent-monitor.test.js +335 -0
  444. package/dist/src/turn/subagent-monitor.test.js.map +1 -0
  445. package/dist/src/turn/turn-agent-event-subscription.d.ts +29 -0
  446. package/dist/src/turn/turn-agent-event-subscription.d.ts.map +1 -0
  447. package/dist/src/turn/turn-agent-event-subscription.js +350 -0
  448. package/dist/src/turn/turn-agent-event-subscription.js.map +1 -0
  449. package/dist/src/turn/turn-agent-event-subscription.test.d.ts +2 -0
  450. package/dist/src/turn/turn-agent-event-subscription.test.d.ts.map +1 -0
  451. package/dist/src/turn/turn-agent-event-subscription.test.js +257 -0
  452. package/dist/src/turn/turn-agent-event-subscription.test.js.map +1 -0
  453. package/dist/src/turn/turn-end-controller.d.ts +61 -0
  454. package/dist/src/turn/turn-end-controller.d.ts.map +1 -0
  455. package/dist/src/turn/turn-end-controller.js +239 -0
  456. package/dist/src/turn/turn-end-controller.js.map +1 -0
  457. package/dist/src/turn/turn-end-controller.test.d.ts +2 -0
  458. package/dist/src/turn/turn-end-controller.test.d.ts.map +1 -0
  459. package/dist/src/turn/turn-end-controller.test.js +97 -0
  460. package/dist/src/turn/turn-end-controller.test.js.map +1 -0
  461. package/dist/src/turn/ws-run-event-unmapped.d.ts +10 -0
  462. package/dist/src/turn/ws-run-event-unmapped.d.ts.map +1 -0
  463. package/dist/src/turn/ws-run-event-unmapped.js +16 -0
  464. package/dist/src/turn/ws-run-event-unmapped.js.map +1 -0
  465. package/dist/src/turn/ws-run-event-unmapped.test.d.ts +2 -0
  466. package/dist/src/turn/ws-run-event-unmapped.test.d.ts.map +1 -0
  467. package/dist/src/turn/ws-run-event-unmapped.test.js +15 -0
  468. package/dist/src/turn/ws-run-event-unmapped.test.js.map +1 -0
  469. package/dist/src/workspace/apply-sync-mapping.d.ts +15 -0
  470. package/dist/src/workspace/apply-sync-mapping.d.ts.map +1 -0
  471. package/dist/src/workspace/apply-sync-mapping.js +98 -0
  472. package/dist/src/workspace/apply-sync-mapping.js.map +1 -0
  473. package/dist/src/workspace/connection-workspace-event.test.d.ts +2 -0
  474. package/dist/src/workspace/connection-workspace-event.test.d.ts.map +1 -0
  475. package/dist/src/workspace/connection-workspace-event.test.js +74 -0
  476. package/dist/src/workspace/connection-workspace-event.test.js.map +1 -0
  477. package/dist/src/workspace/inbound-file-download.d.ts +15 -0
  478. package/dist/src/workspace/inbound-file-download.d.ts.map +1 -0
  479. package/dist/src/workspace/inbound-file-download.js +48 -0
  480. package/dist/src/workspace/inbound-file-download.js.map +1 -0
  481. package/dist/src/workspace/inbound-input-media.d.ts +43 -0
  482. package/dist/src/workspace/inbound-input-media.d.ts.map +1 -0
  483. package/dist/src/workspace/inbound-input-media.js +230 -0
  484. package/dist/src/workspace/inbound-input-media.js.map +1 -0
  485. package/dist/src/workspace/inbound-media-local.d.ts +49 -0
  486. package/dist/src/workspace/inbound-media-local.d.ts.map +1 -0
  487. package/dist/src/workspace/inbound-media-local.js +194 -0
  488. package/dist/src/workspace/inbound-media-local.js.map +1 -0
  489. package/dist/src/workspace/nas-site.d.ts +16 -0
  490. package/dist/src/workspace/nas-site.d.ts.map +1 -0
  491. package/dist/src/workspace/nas-site.js +17 -0
  492. package/dist/src/workspace/nas-site.js.map +1 -0
  493. package/dist/src/workspace/nas-volume-fs-sync.d.ts +37 -0
  494. package/dist/src/workspace/nas-volume-fs-sync.d.ts.map +1 -0
  495. package/dist/src/workspace/nas-volume-fs-sync.js +156 -0
  496. package/dist/src/workspace/nas-volume-fs-sync.js.map +1 -0
  497. package/dist/src/workspace/nas-volume-fs-sync.test.d.ts +2 -0
  498. package/dist/src/workspace/nas-volume-fs-sync.test.d.ts.map +1 -0
  499. package/dist/src/workspace/nas-volume-fs-sync.test.js +49 -0
  500. package/dist/src/workspace/nas-volume-fs-sync.test.js.map +1 -0
  501. package/dist/src/workspace/nas-volumes.d.ts +73 -0
  502. package/dist/src/workspace/nas-volumes.d.ts.map +1 -0
  503. package/dist/src/workspace/nas-volumes.js +546 -0
  504. package/dist/src/workspace/nas-volumes.js.map +1 -0
  505. package/dist/src/workspace/nas-volumes.test.d.ts +2 -0
  506. package/dist/src/workspace/nas-volumes.test.d.ts.map +1 -0
  507. package/dist/src/workspace/nas-volumes.test.js +386 -0
  508. package/dist/src/workspace/nas-volumes.test.js.map +1 -0
  509. package/dist/src/workspace/project-path-normalize.d.ts +30 -0
  510. package/dist/src/workspace/project-path-normalize.d.ts.map +1 -0
  511. package/dist/src/workspace/project-path-normalize.js +101 -0
  512. package/dist/src/workspace/project-path-normalize.js.map +1 -0
  513. package/dist/src/workspace/resource-file.d.ts +119 -0
  514. package/dist/src/workspace/resource-file.d.ts.map +1 -0
  515. package/dist/src/workspace/resource-file.js +533 -0
  516. package/dist/src/workspace/resource-file.js.map +1 -0
  517. package/dist/src/workspace/resource-file.test.d.ts +2 -0
  518. package/dist/src/workspace/resource-file.test.d.ts.map +1 -0
  519. package/dist/src/workspace/resource-file.test.js +64 -0
  520. package/dist/src/workspace/resource-file.test.js.map +1 -0
  521. package/dist/src/workspace/sync-mapping-types.d.ts +220 -0
  522. package/dist/src/workspace/sync-mapping-types.d.ts.map +1 -0
  523. package/dist/src/workspace/sync-mapping-types.js +55 -0
  524. package/dist/src/workspace/sync-mapping-types.js.map +1 -0
  525. package/dist/src/workspace/sync-service-client.d.ts +29 -0
  526. package/dist/src/workspace/sync-service-client.d.ts.map +1 -0
  527. package/dist/src/workspace/sync-service-client.js +72 -0
  528. package/dist/src/workspace/sync-service-client.js.map +1 -0
  529. package/dist/src/workspace/workspace-event-protocol.d.ts +3 -0
  530. package/dist/src/workspace/workspace-event-protocol.d.ts.map +1 -0
  531. package/dist/src/workspace/workspace-event-protocol.js +3 -0
  532. package/dist/src/workspace/workspace-event-protocol.js.map +1 -0
  533. package/dist/src/workspace/workspace-event-scheduler.d.ts +54 -0
  534. package/dist/src/workspace/workspace-event-scheduler.d.ts.map +1 -0
  535. package/dist/src/workspace/workspace-event-scheduler.js +131 -0
  536. package/dist/src/workspace/workspace-event-scheduler.js.map +1 -0
  537. package/dist/src/workspace/workspace-event-scheduler.test.d.ts +2 -0
  538. package/dist/src/workspace/workspace-event-scheduler.test.d.ts.map +1 -0
  539. package/dist/src/workspace/workspace-event-scheduler.test.js +157 -0
  540. package/dist/src/workspace/workspace-event-scheduler.test.js.map +1 -0
  541. package/dist/src/workspace/workspace-event.d.ts +28 -0
  542. package/dist/src/workspace/workspace-event.d.ts.map +1 -0
  543. package/dist/src/workspace/workspace-event.js +674 -0
  544. package/dist/src/workspace/workspace-event.js.map +1 -0
  545. package/dist/src/workspace/workspace-event.test.d.ts +2 -0
  546. package/dist/src/workspace/workspace-event.test.d.ts.map +1 -0
  547. package/dist/src/workspace/workspace-event.test.js +265 -0
  548. package/dist/src/workspace/workspace-event.test.js.map +1 -0
  549. package/package.json +2 -2
@@ -0,0 +1,119 @@
1
+ /**
2
+ * 资源中心整文件上传 + OpenClaw deliver 媒体 URL 拉取
3
+ *
4
+ * 上传地址固定为 `baseUrl + /file/upDownload/uploadWholeFile`,与 IM 同域,使用与发消息相同的 access-token。
5
+ */
6
+ import type { Log } from "../plugin/auth.js";
7
+ /** 沙箱/项目常见根段:`/project/...`、`/xg-cwork-im/...` 等伪绝对路径会按 workspace 相对段解析 */
8
+ export declare const WORKSPACE_MEDIA_ROOT_SEGMENTS: Set<string>;
9
+ /** IM 整文件上传超时(毫秒);超时后抛错,由 send-service 降级为纯文本并提示用户。 */
10
+ export declare const IM_FILE_UPLOAD_TIMEOUT_MS = 60000;
11
+ /** HTTP(S) 媒体下载超时(毫秒);超时后入站保留原始 URL 交给 OpenClaw,出站降级为带链接的文本。 */
12
+ export declare const IM_FILE_DOWNLOAD_TIMEOUT_MS = 90000;
13
+ /** 整文件上传接口路径(拼在 channels.xg_cwork_im.baseUrl 上) */
14
+ export declare const RESOURCE_UPLOAD_PATH = "/file/upDownload/uploadWholeFile";
15
+ export declare function resolveResourceUploadUrl(baseUrl: string): string;
16
+ /** 从上传接口 JSON 中解析 fileId(兼容常见嵌套 data) */
17
+ export declare function extractFileIdFromUploadResponse(data: unknown): string | undefined;
18
+ export declare function formatFromFilename(filename: string): string;
19
+ /** 仅当含 %XX 序列时 decodeURIComponent,避免对已解码的 Unicode 再 decode 抛错 */
20
+ export declare function safeDecodeUriFilenameSegment(segment: string): string;
21
+ /**
22
+ * 从 HTTP Content-Disposition 解析文件名(优先 RFC 5987 `filename*=` UTF-8,再普通 filename=)。
23
+ */
24
+ export declare function parseFilenameFromContentDisposition(header: string | undefined): string | undefined;
25
+ export declare function displayNameFromUrl(url: string): string;
26
+ /** 日志用:截断过长路径/URL */
27
+ export declare function summarizeMediaRef(ref: string, maxLen?: number): string;
28
+ /**
29
+ * 将字符串解析为可交给 readFile 的本机路径(兼容 Windows / macOS / Linux)。
30
+ * - 使用当前进程的 path.isAbsolute(各 OS 语义正确)。
31
+ * - Windows:Git Bash / MSYS 的 `/c/Users/...`、Cygwin `/cygdrive/c/...`。
32
+ * - 非 Windows:若传入 `D:\...` 形式仍做一次规范化(多用于日志/失败提示,读文件通常会失败)。
33
+ */
34
+ export declare function resolveLocalFsPath(ref: string): {
35
+ fsPath: string;
36
+ via: string;
37
+ } | null;
38
+ /**
39
+ * 将 Agent 常写的 workspace 相对媒体引用规范为「相对 workspace 根」的段(不含 `/workspace/` 前缀)。
40
+ *
41
+ * 支持:`project/...`、`./xg-cwork-im/...`、`/project/...`(沙箱内伪绝对,非本机根目录)。
42
+ * 不处理:`/workspace/...`(另见 resolveWorkspaceCandidatePaths)、`file://`、`http(s)://`、本机真实绝对路径。
43
+ */
44
+ export declare function parseWorkspaceRelativeMediaRef(raw: string): string | null;
45
+ /**
46
+ * 将 workspace 相对段解析为宿主机候选绝对路径(优先 agentWorkspaceDir,其次 cwd、容器 `/workspace`)。
47
+ */
48
+ export declare function resolveWorkspaceRelativeCandidatePaths(rel: string, agentWorkspaceDir?: string): string[];
49
+ /**
50
+ * 将 OpenClaw 约定的 `/workspace/<rel>` 路径解析为本机绝对路径列表(通常 1 条)。
51
+ *
52
+ * **已能定位 agent 时(传入非空的 agentWorkspaceDir)**:
53
+ * 只返回该 agent 在宿主机上的 workspace 根目录拼出的唯一路径,不再尝试 `cwd` 或字面量 `/workspace`,
54
+ * 避免多个 agent 存在相同相对路径(如都叫 `output/report.pdf`)时误读他人文件。
55
+ *
56
+ * **无法解析出 agentWorkspaceDir 时**(例如 SDK 解析失败、或未传入):
57
+ * 退化为依次尝试 `process.cwd()` 与 `/workspace`(容器挂载),由调用方 readFile 试错;
58
+ * 此模式下存在跨会话路径混淆的理论风险,应尽量保证上游传入 agentWorkspaceDir。
59
+ *
60
+ * 返回空数组表示路径不符合 /workspace/ 格式。
61
+ */
62
+ export declare function resolveWorkspaceCandidatePaths(raw: string, agentWorkspaceDir?: string): string[];
63
+ /**
64
+ * @deprecated 使用 resolveWorkspaceCandidatePaths 替代(支持多沙箱 agent)。
65
+ * 保留此函数避免外部直接引用时编译报错,内部逻辑已切换到多候选方式。
66
+ */
67
+ export declare function resolveWorkspacePrefixPath(raw: string): string | null;
68
+ export declare function downloadMediaBuffer(url: string, maxBytes: number, log?: Log,
69
+ /** Agent workspace 宿主机路径(由 resolveAgentWorkspaceDir 得到),用于多沙箱场景下准确解析 /workspace/ 路径 */
70
+ agentWorkspaceDir?: string, timeoutMs?: number): Promise<{
71
+ buffer: Buffer;
72
+ filename: string;
73
+ }>;
74
+ /**
75
+ * multipart 上传整文件,返回 fileId 与字节数。
76
+ */
77
+ export declare function uploadWholeResourceFile(args: {
78
+ fileUploadUrl: string;
79
+ token: string;
80
+ buffer: Buffer;
81
+ filename: string;
82
+ formField: string;
83
+ log?: Log;
84
+ /** 默认 {@link IM_FILE_UPLOAD_TIMEOUT_MS}(60s) */
85
+ timeoutMs?: number;
86
+ }): Promise<{
87
+ fileId: string;
88
+ size: number;
89
+ }>;
90
+ export declare function resolveMaxAttachmentBytes(config: {
91
+ maxAttachmentBytes?: number;
92
+ }): number;
93
+ /**
94
+ * 资源整文件上传错误:携带 HTTP 状态与是否可重试标记。
95
+ *
96
+ * 判定规则(与 send-service 的消息重试对齐):
97
+ * - 网络错误 / 超时 / 408 / 429 / 5xx → 可重试
98
+ * - 其它 4xx / 业务 resultCode 错误 / 缺少 fileId → 永久失败,不重试
99
+ */
100
+ export declare class ResourceUploadError extends Error {
101
+ readonly status?: number;
102
+ readonly retryable: boolean;
103
+ constructor(message: string, opts: {
104
+ status?: number;
105
+ retryable: boolean;
106
+ });
107
+ }
108
+ /**
109
+ * 带重试的整文件上传:默认最多 3 次(首次 + 2 次重试),间隔 1s、3s。
110
+ * 仅对 {@link ResourceUploadError.retryable} 为真的错误重试;业务错误、非可重试 4xx、缺少 fileId 立即抛出。
111
+ */
112
+ export declare function uploadWholeResourceFileWithRetry(args: Parameters<typeof uploadWholeResourceFile>[0], retry?: {
113
+ maxAttempts?: number;
114
+ delaysMs?: number[];
115
+ }): Promise<{
116
+ fileId: string;
117
+ size: number;
118
+ }>;
119
+ //# sourceMappingURL=resource-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-file.d.ts","sourceRoot":"","sources":["../../../src/workspace/resource-file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG7C,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,aAAuD,CAAC;AAOlG,uDAAuD;AACvD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAEvE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,yCAAyC;AACzC,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,iEAAiE;AACjE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASpE;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CA0BlG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED,qBAAqB;AACrB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,MAAM,CAInE;AAWD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiCtF;AAqDD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBzE;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CAClD,GAAG,EAAE,MAAM,EACX,iBAAiB,CAAC,EAAE,MAAM,GAC3B,MAAM,EAAE,CAsBV;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAehG;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED,wBAAsB,mBAAmB,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,GAAG;AACT,uFAAuF;AACvF,iBAAiB,CAAC,EAAE,MAAM,EAC1B,SAAS,GAAE,MAAoC,GAChD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF/C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwE5C;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzF;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAChB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;CAM7E;AAMD;;;GAGG;AACH,wBAAsB,gCAAgC,CAClD,IAAI,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,EACnD,KAAK,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACtD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B3C"}
@@ -0,0 +1,533 @@
1
+ /**
2
+ * 资源中心整文件上传 + OpenClaw deliver 媒体 URL 拉取
3
+ *
4
+ * 上传地址固定为 `baseUrl + /file/upDownload/uploadWholeFile`,与 IM 同域,使用与发消息相同的 access-token。
5
+ */
6
+ import axios from "axios";
7
+ import { readFile, stat } from "node:fs/promises";
8
+ import path from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { normalizeWorkspaceRelativeSegment } from "./project-path-normalize.js";
11
+ /** 沙箱/项目常见根段:`/project/...`、`/xg-cwork-im/...` 等伪绝对路径会按 workspace 相对段解析 */
12
+ export const WORKSPACE_MEDIA_ROOT_SEGMENTS = new Set(["project", "xg-cwork-im", "xg_im_inbound"]);
13
+ /** 容器内常见的 workspace 挂载点(无 agentWorkspaceDir 时的兜底) */
14
+ const CONTAINER_WORKSPACE_MOUNT = "/workspace";
15
+ const DEFAULT_MAX_BYTES = 50 * 1024 * 1024;
16
+ /** IM 整文件上传超时(毫秒);超时后抛错,由 send-service 降级为纯文本并提示用户。 */
17
+ export const IM_FILE_UPLOAD_TIMEOUT_MS = 60_000;
18
+ /** HTTP(S) 媒体下载超时(毫秒);超时后入站保留原始 URL 交给 OpenClaw,出站降级为带链接的文本。 */
19
+ export const IM_FILE_DOWNLOAD_TIMEOUT_MS = 90_000;
20
+ /** 整文件上传接口路径(拼在 channels.xg_cwork_im.baseUrl 上) */
21
+ export const RESOURCE_UPLOAD_PATH = "/file/upDownload/uploadWholeFile";
22
+ export function resolveResourceUploadUrl(baseUrl) {
23
+ const b = baseUrl.trim();
24
+ if (!b)
25
+ throw new Error("[cwork_im] baseUrl is required for resource upload");
26
+ return new URL(RESOURCE_UPLOAD_PATH, b.endsWith("/") ? b : `${b}/`).href;
27
+ }
28
+ /** 从上传接口 JSON 中解析 fileId(兼容常见嵌套 data) */
29
+ export function extractFileIdFromUploadResponse(data) {
30
+ if (data == null)
31
+ return undefined;
32
+ if (typeof data === "string" && data.trim().length > 0)
33
+ return data.trim();
34
+ if (typeof data !== "object")
35
+ return undefined;
36
+ const o = data;
37
+ for (const key of ["fileId", "id", "resourceId", "file_id"]) {
38
+ const v = o[key];
39
+ if (typeof v === "string" && v.length > 0)
40
+ return v;
41
+ }
42
+ if (o.data != null) {
43
+ const nested = extractFileIdFromUploadResponse(o.data);
44
+ if (nested)
45
+ return nested;
46
+ }
47
+ return undefined;
48
+ }
49
+ export function formatFromFilename(filename) {
50
+ const ext = path.extname(filename).replace(/^\./, "").toLowerCase();
51
+ if (ext && ext.length <= 16 && /^[a-z0-9]+$/i.test(ext))
52
+ return ext;
53
+ return "bin";
54
+ }
55
+ /** 仅当含 %XX 序列时 decodeURIComponent,避免对已解码的 Unicode 再 decode 抛错 */
56
+ export function safeDecodeUriFilenameSegment(segment) {
57
+ const s = segment.trim();
58
+ if (!s)
59
+ return s;
60
+ if (!/%[0-9A-Fa-f]{2}/.test(s))
61
+ return s;
62
+ try {
63
+ return decodeURIComponent(s.replace(/\+/g, " "));
64
+ }
65
+ catch {
66
+ return s;
67
+ }
68
+ }
69
+ /**
70
+ * 从 HTTP Content-Disposition 解析文件名(优先 RFC 5987 `filename*=` UTF-8,再普通 filename=)。
71
+ */
72
+ export function parseFilenameFromContentDisposition(header) {
73
+ if (header == null || typeof header !== "string")
74
+ return undefined;
75
+ const h = header.trim();
76
+ if (!h)
77
+ return undefined;
78
+ const star = /filename\*\s*=\s*(?:UTF-8|utf-8)''([^;\r\n]+)/i.exec(h);
79
+ if (star?.[1]) {
80
+ const v = star[1].trim();
81
+ const decoded = safeDecodeUriFilenameSegment(v);
82
+ if (decoded)
83
+ return decoded;
84
+ }
85
+ const quoted = /filename\s*=\s*"((?:[^"\\]|\\.)*)"/i.exec(h);
86
+ if (quoted?.[1]) {
87
+ const inner = quoted[1].replace(/\\(.)/g, "$1").trim();
88
+ if (inner)
89
+ return safeDecodeUriFilenameSegment(inner);
90
+ }
91
+ const unquoted = /filename\s*=\s*([^;\r\n]+)/i.exec(h);
92
+ if (unquoted?.[1]) {
93
+ let v = unquoted[1].trim().replace(/^["']|["']$/g, "");
94
+ if (v.toLowerCase().startsWith("utf-8''"))
95
+ v = v.slice(7);
96
+ if (v)
97
+ return safeDecodeUriFilenameSegment(v);
98
+ }
99
+ return undefined;
100
+ }
101
+ export function displayNameFromUrl(url) {
102
+ try {
103
+ if (url.startsWith("file://")) {
104
+ return path.basename(fileURLToPath(url)) || "file";
105
+ }
106
+ const u = new URL(url);
107
+ const qName = u.searchParams.get("filename") ?? u.searchParams.get("name");
108
+ if (qName?.trim()) {
109
+ return safeDecodeUriFilenameSegment(qName.trim()) || "attachment";
110
+ }
111
+ const pathname = u.pathname || "/";
112
+ const last = pathname.split("/").filter(Boolean).pop() ?? "";
113
+ const base = safeDecodeUriFilenameSegment(last.split("?")[0] || "");
114
+ return base || "attachment";
115
+ }
116
+ catch {
117
+ return "attachment";
118
+ }
119
+ }
120
+ /** 日志用:截断过长路径/URL */
121
+ export function summarizeMediaRef(ref, maxLen = 160) {
122
+ const t = ref.trim().replace(/\s+/g, " ");
123
+ if (t.length <= maxLen)
124
+ return t;
125
+ return `${t.slice(0, maxLen)}…(len=${t.length})`;
126
+ }
127
+ function isHttpOrHttps(ref) {
128
+ try {
129
+ const u = new URL(ref.trim());
130
+ return u.protocol === "http:" || u.protocol === "https:";
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ /**
137
+ * 将字符串解析为可交给 readFile 的本机路径(兼容 Windows / macOS / Linux)。
138
+ * - 使用当前进程的 path.isAbsolute(各 OS 语义正确)。
139
+ * - Windows:Git Bash / MSYS 的 `/c/Users/...`、Cygwin `/cygdrive/c/...`。
140
+ * - 非 Windows:若传入 `D:\...` 形式仍做一次规范化(多用于日志/失败提示,读文件通常会失败)。
141
+ */
142
+ export function resolveLocalFsPath(ref) {
143
+ const raw = ref.trim();
144
+ if (!raw)
145
+ return null;
146
+ if (process.platform === "win32") {
147
+ // MSYS/Git Bash: /c/Users/foo → C:\Users\foo(要求 /<盘符>/ 后仍有路径,避免误伤 /Users)
148
+ const msys = /^\/([a-zA-Z])\/(.+)$/.exec(raw.replace(/\\/g, "/"));
149
+ if (msys) {
150
+ const letter = msys[1].toUpperCase();
151
+ const rest = msys[2].split("/").join(path.win32.sep);
152
+ const fsPath = path.win32.normalize(`${letter}:${path.win32.sep}${rest}`);
153
+ return { fsPath, via: "git-bash-msys" };
154
+ }
155
+ const cyg = /^\/cygdrive\/([a-zA-Z])\/(.+)$/i.exec(raw.replace(/\\/g, "/"));
156
+ if (cyg) {
157
+ const letter = cyg[1].toUpperCase();
158
+ const rest = cyg[2].split("/").join(path.win32.sep);
159
+ const fsPath = path.win32.normalize(`${letter}:${path.win32.sep}${rest}`);
160
+ return { fsPath, via: "cygwin" };
161
+ }
162
+ }
163
+ if (path.isAbsolute(raw)) {
164
+ return { fsPath: path.normalize(raw), via: `native-${process.platform}` };
165
+ }
166
+ // Linux/macOS 上 WSL 互操作常见:/mnt/c/... 已是 posix 绝对路径,上面已命中
167
+ if (process.platform !== "win32" && /^[a-zA-Z]:[/\\]/.test(raw)) {
168
+ return { fsPath: path.win32.normalize(raw), via: "win-style-path" };
169
+ }
170
+ return null;
171
+ }
172
+ async function readLocalFsIntoBuffer(fsPath, maxBytes, log) {
173
+ const st = await stat(fsPath);
174
+ if (st.size > maxBytes) {
175
+ throw new Error(`local file size ${st.size} exceeds maxAttachmentBytes=${maxBytes}`);
176
+ }
177
+ const buffer = await readFile(fsPath);
178
+ const filename = path.basename(fsPath) || "file";
179
+ log?.info(`[cwork_im:media] local ok bytes=${buffer.length} name=${filename}`);
180
+ return { buffer, filename };
181
+ }
182
+ function formatHttpDownloadError(err, timeoutMs) {
183
+ if (axios.isAxiosError(err)) {
184
+ if (err.code === "ECONNABORTED" || err.message.toLowerCase().includes("timeout")) {
185
+ return `文件下载超时(${Math.round(timeoutMs / 1000)}秒)`;
186
+ }
187
+ const parts = [err.message];
188
+ if (err.code)
189
+ parts.push(`axiosCode=${err.code}`);
190
+ if (err.response?.status != null)
191
+ parts.push(`httpStatus=${err.response.status}`);
192
+ return parts.join(" ");
193
+ }
194
+ if (err instanceof Error)
195
+ return err.message;
196
+ return String(err);
197
+ }
198
+ function resolveUnderWorkspaceRoot(workspaceRoot, rel) {
199
+ const rootResolved = path.resolve(workspaceRoot);
200
+ const candidate = rel ? path.resolve(rootResolved, rel) : rootResolved;
201
+ const relToRoot = path.relative(rootResolved, candidate);
202
+ if (relToRoot.startsWith("..") || path.isAbsolute(relToRoot)) {
203
+ throw new Error(`[cwork_im:media] /workspace/ path escapes workspace root (${summarizeMediaRef(workspaceRoot)}): ${summarizeMediaRef(rel)}`);
204
+ }
205
+ return candidate;
206
+ }
207
+ function isNativeHostAbsoluteRef(ref) {
208
+ const t = ref.trim();
209
+ if (!t)
210
+ return false;
211
+ if (/^[a-zA-Z]:[/\\]/.test(t) || t.startsWith("\\\\"))
212
+ return true;
213
+ if (path.isAbsolute(t)) {
214
+ const posix = t.replace(/\\/g, "/");
215
+ const withoutLeading = posix.replace(/^\/+/, "");
216
+ const firstSeg = withoutLeading.split("/").filter(Boolean)[0] ?? "";
217
+ if (WORKSPACE_MEDIA_ROOT_SEGMENTS.has(firstSeg))
218
+ return false;
219
+ return true;
220
+ }
221
+ return false;
222
+ }
223
+ /**
224
+ * 将 Agent 常写的 workspace 相对媒体引用规范为「相对 workspace 根」的段(不含 `/workspace/` 前缀)。
225
+ *
226
+ * 支持:`project/...`、`./xg-cwork-im/...`、`/project/...`(沙箱内伪绝对,非本机根目录)。
227
+ * 不处理:`/workspace/...`(另见 resolveWorkspaceCandidatePaths)、`file://`、`http(s)://`、本机真实绝对路径。
228
+ */
229
+ export function parseWorkspaceRelativeMediaRef(raw) {
230
+ const trimmed = raw.trim();
231
+ if (!trimmed || isHttpOrHttps(trimmed) || trimmed.startsWith("file://"))
232
+ return null;
233
+ if (trimmed.startsWith("/workspace/") || trimmed === "/workspace")
234
+ return null;
235
+ if (/^[a-zA-Z]:[/\\]/.test(trimmed) || trimmed.startsWith("\\\\"))
236
+ return null;
237
+ let normalized;
238
+ try {
239
+ normalized = normalizeWorkspaceRelativeSegment(trimmed);
240
+ }
241
+ catch {
242
+ return null;
243
+ }
244
+ if (isNativeHostAbsoluteRef(trimmed)) {
245
+ const firstSeg = normalized.split("/").filter(Boolean)[0] ?? "";
246
+ return WORKSPACE_MEDIA_ROOT_SEGMENTS.has(firstSeg) ? normalized : null;
247
+ }
248
+ return normalized;
249
+ }
250
+ /**
251
+ * 将 workspace 相对段解析为宿主机候选绝对路径(优先 agentWorkspaceDir,其次 cwd、容器 `/workspace`)。
252
+ */
253
+ export function resolveWorkspaceRelativeCandidatePaths(rel, agentWorkspaceDir) {
254
+ const trimmed = agentWorkspaceDir?.trim();
255
+ const bases = [];
256
+ if (trimmed) {
257
+ bases.push(trimmed);
258
+ }
259
+ else {
260
+ bases.push(process.cwd());
261
+ if (!bases.includes(CONTAINER_WORKSPACE_MOUNT)) {
262
+ bases.push(CONTAINER_WORKSPACE_MOUNT);
263
+ }
264
+ }
265
+ const seen = new Set();
266
+ const out = [];
267
+ for (const base of bases) {
268
+ const candidate = resolveUnderWorkspaceRoot(base, rel);
269
+ const key = path.normalize(candidate);
270
+ if (seen.has(key))
271
+ continue;
272
+ seen.add(key);
273
+ out.push(candidate);
274
+ }
275
+ return out;
276
+ }
277
+ async function tryReadLocalCandidates(candidates, label, maxBytes, log) {
278
+ if (candidates.length === 0) {
279
+ throw new Error(`[cwork_im:media] ${label}: no candidates`);
280
+ }
281
+ log?.info(`[cwork_im:media] ${label} candidates(${candidates.length}): ${candidates.map((p) => summarizeMediaRef(p)).join(" | ")}`);
282
+ let lastErr;
283
+ for (const fsPath of candidates) {
284
+ try {
285
+ const result = await readLocalFsIntoBuffer(fsPath, maxBytes, log);
286
+ log?.info(`[cwork_im:media] ${label} resolved via ${summarizeMediaRef(fsPath)}`);
287
+ return result;
288
+ }
289
+ catch (err) {
290
+ lastErr = err;
291
+ log?.info(`[cwork_im:media] ${label} miss ${summarizeMediaRef(fsPath)}: ${String(err)}`);
292
+ }
293
+ }
294
+ log?.error(`[cwork_im:media] ${label} all ${candidates.length} candidates failed`);
295
+ throw lastErr;
296
+ }
297
+ /**
298
+ * 将 OpenClaw 约定的 `/workspace/<rel>` 路径解析为本机绝对路径列表(通常 1 条)。
299
+ *
300
+ * **已能定位 agent 时(传入非空的 agentWorkspaceDir)**:
301
+ * 只返回该 agent 在宿主机上的 workspace 根目录拼出的唯一路径,不再尝试 `cwd` 或字面量 `/workspace`,
302
+ * 避免多个 agent 存在相同相对路径(如都叫 `output/report.pdf`)时误读他人文件。
303
+ *
304
+ * **无法解析出 agentWorkspaceDir 时**(例如 SDK 解析失败、或未传入):
305
+ * 退化为依次尝试 `process.cwd()` 与 `/workspace`(容器挂载),由调用方 readFile 试错;
306
+ * 此模式下存在跨会话路径混淆的理论风险,应尽量保证上游传入 agentWorkspaceDir。
307
+ *
308
+ * 返回空数组表示路径不符合 /workspace/ 格式。
309
+ */
310
+ export function resolveWorkspaceCandidatePaths(raw, agentWorkspaceDir) {
311
+ if (!raw.startsWith("/workspace/") && raw !== "/workspace")
312
+ return [];
313
+ const rel = raw.startsWith("/workspace/") ? raw.slice("/workspace/".length) : "";
314
+ const trimmed = agentWorkspaceDir?.trim();
315
+ if (trimmed) {
316
+ return [resolveUnderWorkspaceRoot(trimmed, rel)];
317
+ }
318
+ const bases = [];
319
+ const cwd = process.cwd();
320
+ bases.push(cwd);
321
+ if (!bases.includes("/workspace"))
322
+ bases.push("/workspace");
323
+ return bases.map((base) => resolveUnderWorkspaceRoot(base, rel));
324
+ }
325
+ /**
326
+ * @deprecated 使用 resolveWorkspaceCandidatePaths 替代(支持多沙箱 agent)。
327
+ * 保留此函数避免外部直接引用时编译报错,内部逻辑已切换到多候选方式。
328
+ */
329
+ export function resolveWorkspacePrefixPath(raw) {
330
+ const candidates = resolveWorkspaceCandidatePaths(raw);
331
+ return candidates[0] ?? null;
332
+ }
333
+ export async function downloadMediaBuffer(url, maxBytes, log,
334
+ /** Agent workspace 宿主机路径(由 resolveAgentWorkspaceDir 得到),用于多沙箱场景下准确解析 /workspace/ 路径 */
335
+ agentWorkspaceDir, timeoutMs = IM_FILE_DOWNLOAD_TIMEOUT_MS) {
336
+ const raw = url.trim();
337
+ log?.info(`[cwork_im:media] resolve ref=${summarizeMediaRef(raw)}`);
338
+ // Handle OpenClaw /workspace/ convention: try multiple host-side candidates.
339
+ const workspaceCandidates = resolveWorkspaceCandidatePaths(raw, agentWorkspaceDir);
340
+ if (workspaceCandidates.length > 0) {
341
+ return tryReadLocalCandidates(workspaceCandidates, "/workspace/", maxBytes, log);
342
+ }
343
+ const wsRel = parseWorkspaceRelativeMediaRef(raw);
344
+ if (wsRel) {
345
+ if (!agentWorkspaceDir?.trim()) {
346
+ log?.warn?.(`[cwork_im:media] workspace-relative ref without agentWorkspaceDir; ` +
347
+ `trying cwd and ${CONTAINER_WORKSPACE_MOUNT} fallbacks ref=${summarizeMediaRef(raw)}`);
348
+ }
349
+ const relCandidates = resolveWorkspaceRelativeCandidatePaths(wsRel, agentWorkspaceDir);
350
+ return tryReadLocalCandidates(relCandidates, "workspace-relative", maxBytes, log);
351
+ }
352
+ if (raw.startsWith("file://")) {
353
+ let fsPath;
354
+ try {
355
+ fsPath = fileURLToPath(raw);
356
+ }
357
+ catch (e) {
358
+ log?.error(`[cwork_im:media] invalid file:// URL: ${summarizeMediaRef(raw)} ${String(e)}`);
359
+ throw e;
360
+ }
361
+ log?.info(`[cwork_im:media] read file:// -> ${summarizeMediaRef(fsPath)}`);
362
+ try {
363
+ return await readLocalFsIntoBuffer(fsPath, maxBytes, log);
364
+ }
365
+ catch (err) {
366
+ log?.error(`[cwork_im:media] readFile failed file:// ${summarizeMediaRef(fsPath)}: ${String(err)}`);
367
+ throw err;
368
+ }
369
+ }
370
+ if (isHttpOrHttps(raw)) {
371
+ log?.info(`[cwork_im:media] GET ${summarizeMediaRef(raw)} timeoutMs=${timeoutMs}`);
372
+ try {
373
+ const res = await axios.get(raw, {
374
+ responseType: "arraybuffer",
375
+ timeout: timeoutMs,
376
+ maxContentLength: maxBytes,
377
+ maxBodyLength: maxBytes,
378
+ validateStatus: (s) => s >= 200 && s < 300,
379
+ });
380
+ const buffer = Buffer.from(res.data);
381
+ let filename = displayNameFromUrl(raw);
382
+ const cdRaw = res.headers["content-disposition"];
383
+ const cd = Array.isArray(cdRaw) ? cdRaw[0] : cdRaw;
384
+ if (typeof cd === "string") {
385
+ const fromCd = parseFilenameFromContentDisposition(cd);
386
+ if (fromCd)
387
+ filename = fromCd;
388
+ }
389
+ log?.info(`[cwork_im:media] http ok bytes=${buffer.length} name=${filename}`);
390
+ return { buffer, filename };
391
+ }
392
+ catch (err) {
393
+ const detail = formatHttpDownloadError(err, timeoutMs);
394
+ log?.error(`[cwork_im:media] http failed ref=${summarizeMediaRef(raw)}: ${detail}`);
395
+ throw new Error(detail);
396
+ }
397
+ }
398
+ const resolved = resolveLocalFsPath(raw);
399
+ if (resolved) {
400
+ log?.info(`[cwork_im:media] local via=${resolved.via} -> ${summarizeMediaRef(resolved.fsPath)}`);
401
+ try {
402
+ return await readLocalFsIntoBuffer(resolved.fsPath, maxBytes, log);
403
+ }
404
+ catch (err) {
405
+ log?.error(`[cwork_im:media] readFile failed ${summarizeMediaRef(resolved.fsPath)}: ${String(err)}`);
406
+ throw err;
407
+ }
408
+ }
409
+ const hint = "请使用 http(s)、file://(三系统通用),或本机绝对路径:Windows C:\\\\... / UNC;macOS/Linux /Users、/home、/mnt/c/...(WSL);Windows 下 Git Bash 可用 /c/...";
410
+ log?.error(`[cwork_im:media] unsupported ref=${summarizeMediaRef(raw)} (${hint})`);
411
+ throw new Error(`[cwork_im] 无法读取媒体(${hint}): ${summarizeMediaRef(raw)}`);
412
+ }
413
+ /**
414
+ * multipart 上传整文件,返回 fileId 与字节数。
415
+ */
416
+ export async function uploadWholeResourceFile(args) {
417
+ const { fileUploadUrl, token, buffer, filename, formField, log } = args;
418
+ const timeoutMs = args.timeoutMs ?? IM_FILE_UPLOAD_TIMEOUT_MS;
419
+ const form = new FormData();
420
+ // multipart 第三参携带 UTF-8 文件名(与 Web File 等价;避免 TS 下 File 与 FormData Blob overload 不匹配)
421
+ const blob = new Blob([new Uint8Array(buffer)], { type: "application/octet-stream" });
422
+ form.append(formField, blob, filename);
423
+ log?.info(`[cwork_im:upload] POST ${fileUploadUrl} field=${formField} name=${filename} bytes=${buffer.length} timeoutMs=${timeoutMs}`);
424
+ const controller = new AbortController();
425
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
426
+ let res;
427
+ try {
428
+ res = await fetch(fileUploadUrl, {
429
+ method: "POST",
430
+ headers: {
431
+ "access-token": token,
432
+ },
433
+ body: form,
434
+ signal: controller.signal,
435
+ });
436
+ }
437
+ catch (err) {
438
+ if (err instanceof Error && err.name === "AbortError") {
439
+ const msg = `文件上传超时(${Math.round(timeoutMs / 1000)}秒),请稍后重试或缩小文件`;
440
+ log?.error(`[cwork_im:upload] ${msg} name=${filename} bytes=${buffer.length}`);
441
+ throw new ResourceUploadError(msg, { retryable: true });
442
+ }
443
+ // fetch 抛错通常是网络层瞬时问题(DNS/连接/断流)→ 可重试
444
+ throw new ResourceUploadError(err instanceof Error ? err.message : String(err), { retryable: true });
445
+ }
446
+ finally {
447
+ clearTimeout(timeoutId);
448
+ }
449
+ const rawText = await res.text();
450
+ let json;
451
+ try {
452
+ json = rawText ? JSON.parse(rawText) : undefined;
453
+ }
454
+ catch {
455
+ json = undefined;
456
+ }
457
+ if (!res.ok) {
458
+ log?.error(`[cwork_im:upload] HTTP ${res.status} body=${rawText.slice(0, 500)}`);
459
+ throw new ResourceUploadError(`upload HTTP ${res.status}: ${rawText.slice(0, 500)}`, {
460
+ status: res.status,
461
+ retryable: isRetryableHttpStatus(res.status),
462
+ });
463
+ }
464
+ // Unified IM API response: { data, resultCode: 1, resultMsg: "" } — resultCode=1 means success.
465
+ if (json && typeof json === "object") {
466
+ const j = json;
467
+ if (j.resultCode !== undefined && j.resultCode !== 1) {
468
+ const msg = `upload IM API error resultCode=${j.resultCode}${j.resultMsg ? ` resultMsg=${j.resultMsg}` : ""}`;
469
+ log?.error(`[cwork_im:upload] ${msg} body=${rawText.slice(0, 500)}`);
470
+ throw new ResourceUploadError(msg, { retryable: false });
471
+ }
472
+ }
473
+ const fileId = extractFileIdFromUploadResponse(json ?? rawText);
474
+ if (!fileId) {
475
+ log?.error(`[cwork_im:upload] missing fileId in body=${rawText.slice(0, 500)}`);
476
+ throw new ResourceUploadError(`upload response missing fileId: ${rawText.slice(0, 500)}`, {
477
+ retryable: false,
478
+ });
479
+ }
480
+ return { fileId, size: buffer.length };
481
+ }
482
+ export function resolveMaxAttachmentBytes(config) {
483
+ return config.maxAttachmentBytes ?? DEFAULT_MAX_BYTES;
484
+ }
485
+ /**
486
+ * 资源整文件上传错误:携带 HTTP 状态与是否可重试标记。
487
+ *
488
+ * 判定规则(与 send-service 的消息重试对齐):
489
+ * - 网络错误 / 超时 / 408 / 429 / 5xx → 可重试
490
+ * - 其它 4xx / 业务 resultCode 错误 / 缺少 fileId → 永久失败,不重试
491
+ */
492
+ export class ResourceUploadError extends Error {
493
+ status;
494
+ retryable;
495
+ constructor(message, opts) {
496
+ super(message);
497
+ this.name = "ResourceUploadError";
498
+ this.status = opts.status;
499
+ this.retryable = opts.retryable;
500
+ }
501
+ }
502
+ function isRetryableHttpStatus(status) {
503
+ return status >= 500 || status === 408 || status === 429;
504
+ }
505
+ /**
506
+ * 带重试的整文件上传:默认最多 3 次(首次 + 2 次重试),间隔 1s、3s。
507
+ * 仅对 {@link ResourceUploadError.retryable} 为真的错误重试;业务错误、非可重试 4xx、缺少 fileId 立即抛出。
508
+ */
509
+ export async function uploadWholeResourceFileWithRetry(args, retry) {
510
+ const maxAttempts = retry?.maxAttempts ?? 3;
511
+ const delaysMs = retry?.delaysMs ?? [1_000, 3_000];
512
+ const log = args.log;
513
+ let lastErr;
514
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
515
+ try {
516
+ return await uploadWholeResourceFile(args);
517
+ }
518
+ catch (err) {
519
+ lastErr = err;
520
+ const retryable = err instanceof ResourceUploadError ? err.retryable : false;
521
+ const isLast = attempt >= maxAttempts;
522
+ if (!retryable || isLast) {
523
+ log?.error(`[cwork_im:upload] give up (attempt=${attempt}/${maxAttempts}, retryable=${retryable}): ${String(err)}`);
524
+ throw err;
525
+ }
526
+ const waitMs = delaysMs[attempt - 1] ?? delaysMs[delaysMs.length - 1] ?? 1_000;
527
+ log?.warn?.(`[cwork_im:upload] retrying (attempt=${attempt}/${maxAttempts}) in ${waitMs}ms: ${String(err)}`);
528
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
529
+ }
530
+ }
531
+ throw lastErr ?? new Error("[cwork_im:upload] upload failed after retries");
532
+ }
533
+ //# sourceMappingURL=resource-file.js.map