@teammy/server 0.1.4 → 0.1.5

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 (444) hide show
  1. package/dist/main.js +682 -24
  2. package/dist/web/assets/Assistant-Dm_p8EZl.js +1 -0
  3. package/dist/web/assets/{Dashboard-dCu2Cdxd.js → Dashboard-fwW9NxcC.js} +1 -1
  4. package/dist/web/assets/{Files-cRhoWviM.js → Files-D-KCDWmO.js} +1 -1
  5. package/dist/web/assets/{Markdown-Bq8P_NBV.js → Markdown-oZagG-wy.js} +1 -1
  6. package/dist/web/assets/{Sessions-BxHsX1C5.js → Sessions-BQhGiLvz.js} +1 -1
  7. package/dist/web/assets/{WorkspaceTree-CD94JsaJ.js → WorkspaceTree-B9733pV3.js} +1 -1
  8. package/dist/web/assets/{file-links-CFCIacLV.js → file-links-CD346_jf.js} +1 -1
  9. package/dist/web/assets/{index-B-MqU_88.css → index-Be5hGscJ.css} +1 -1
  10. package/dist/web/assets/index-BiiPuwDi.js +66 -0
  11. package/dist/web/index.html +2 -2
  12. package/node_modules/@wecom/aibot-node-sdk/README.md +786 -0
  13. package/node_modules/@wecom/aibot-node-sdk/dist/api.d.ts +17 -0
  14. package/node_modules/@wecom/aibot-node-sdk/dist/client.d.ts +217 -0
  15. package/node_modules/@wecom/aibot-node-sdk/dist/crypto.d.ts +12 -0
  16. package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js +1563 -0
  17. package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js.map +1 -0
  18. package/node_modules/@wecom/aibot-node-sdk/dist/index.d.ts +1324 -0
  19. package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js +1544 -0
  20. package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js.map +1 -0
  21. package/node_modules/@wecom/aibot-node-sdk/dist/logger.d.ts +14 -0
  22. package/node_modules/@wecom/aibot-node-sdk/dist/message-handler.d.ts +29 -0
  23. package/node_modules/@wecom/aibot-node-sdk/dist/types/api.d.ts +466 -0
  24. package/node_modules/@wecom/aibot-node-sdk/dist/types/common.d.ts +30 -0
  25. package/node_modules/@wecom/aibot-node-sdk/dist/types/config.d.ts +34 -0
  26. package/node_modules/@wecom/aibot-node-sdk/dist/types/event.d.ts +109 -0
  27. package/node_modules/@wecom/aibot-node-sdk/dist/types/index.d.ts +10 -0
  28. package/node_modules/@wecom/aibot-node-sdk/dist/types/message.d.ts +158 -0
  29. package/node_modules/@wecom/aibot-node-sdk/dist/utils.d.ts +19 -0
  30. package/node_modules/@wecom/aibot-node-sdk/dist/wecom-crypto/index.d.ts +46 -0
  31. package/node_modules/@wecom/aibot-node-sdk/dist/ws.d.ts +161 -0
  32. package/node_modules/@wecom/aibot-node-sdk/package.json +43 -0
  33. package/node_modules/asynckit/LICENSE +21 -0
  34. package/node_modules/asynckit/README.md +233 -0
  35. package/node_modules/asynckit/bench.js +76 -0
  36. package/node_modules/asynckit/index.js +6 -0
  37. package/node_modules/asynckit/lib/abort.js +29 -0
  38. package/node_modules/asynckit/lib/async.js +34 -0
  39. package/node_modules/asynckit/lib/defer.js +26 -0
  40. package/node_modules/asynckit/lib/iterate.js +75 -0
  41. package/node_modules/asynckit/lib/readable_asynckit.js +91 -0
  42. package/node_modules/asynckit/lib/readable_parallel.js +25 -0
  43. package/node_modules/asynckit/lib/readable_serial.js +25 -0
  44. package/node_modules/asynckit/lib/readable_serial_ordered.js +29 -0
  45. package/node_modules/asynckit/lib/state.js +37 -0
  46. package/node_modules/asynckit/lib/streamify.js +141 -0
  47. package/node_modules/asynckit/lib/terminator.js +29 -0
  48. package/node_modules/asynckit/package.json +63 -0
  49. package/node_modules/asynckit/parallel.js +43 -0
  50. package/node_modules/asynckit/serial.js +17 -0
  51. package/node_modules/asynckit/serialOrdered.js +75 -0
  52. package/node_modules/asynckit/stream.js +21 -0
  53. package/node_modules/axios/CHANGELOG.md +1934 -0
  54. package/node_modules/axios/LICENSE +7 -0
  55. package/node_modules/axios/MIGRATION_GUIDE.md +877 -0
  56. package/node_modules/axios/README.md +2786 -0
  57. package/node_modules/axios/dist/axios.js +6460 -0
  58. package/node_modules/axios/dist/axios.min.js +5 -0
  59. package/node_modules/axios/dist/axios.min.js.map +1 -0
  60. package/node_modules/axios/dist/browser/axios.cjs +6509 -0
  61. package/node_modules/axios/dist/esm/axios.js +6530 -0
  62. package/node_modules/axios/dist/esm/axios.min.js +3 -0
  63. package/node_modules/axios/dist/esm/axios.min.js.map +1 -0
  64. package/node_modules/axios/dist/node/axios.cjs +7491 -0
  65. package/node_modules/axios/index.d.cts +785 -0
  66. package/node_modules/axios/index.d.ts +804 -0
  67. package/node_modules/axios/index.js +45 -0
  68. package/node_modules/axios/lib/adapters/README.md +36 -0
  69. package/node_modules/axios/lib/adapters/adapters.js +132 -0
  70. package/node_modules/axios/lib/adapters/fetch.js +749 -0
  71. package/node_modules/axios/lib/adapters/http.js +1609 -0
  72. package/node_modules/axios/lib/adapters/xhr.js +384 -0
  73. package/node_modules/axios/lib/axios.js +89 -0
  74. package/node_modules/axios/lib/cancel/CancelToken.js +135 -0
  75. package/node_modules/axios/lib/cancel/CanceledError.js +22 -0
  76. package/node_modules/axios/lib/cancel/isCancel.js +5 -0
  77. package/node_modules/axios/lib/core/Axios.js +361 -0
  78. package/node_modules/axios/lib/core/AxiosError.js +278 -0
  79. package/node_modules/axios/lib/core/AxiosHeaders.js +487 -0
  80. package/node_modules/axios/lib/core/InterceptorManager.js +182 -0
  81. package/node_modules/axios/lib/core/README.md +8 -0
  82. package/node_modules/axios/lib/core/assertParamsAcyclic.js +49 -0
  83. package/node_modules/axios/lib/core/buildFullPath.js +76 -0
  84. package/node_modules/axios/lib/core/createMultipartBody.js +37 -0
  85. package/node_modules/axios/lib/core/dispatchRequest.js +115 -0
  86. package/node_modules/axios/lib/core/mergeConfig.js +237 -0
  87. package/node_modules/axios/lib/core/methodList.js +17 -0
  88. package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
  89. package/node_modules/axios/lib/core/settle.js +27 -0
  90. package/node_modules/axios/lib/core/transformData.js +28 -0
  91. package/node_modules/axios/lib/defaults/index.js +178 -0
  92. package/node_modules/axios/lib/defaults/transitional.js +11 -0
  93. package/node_modules/axios/lib/env/README.md +3 -0
  94. package/node_modules/axios/lib/env/classes/FormData.js +2 -0
  95. package/node_modules/axios/lib/env/data.js +1 -0
  96. package/node_modules/axios/lib/helpers/AxiosTransformStream.js +165 -0
  97. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
  98. package/node_modules/axios/lib/helpers/Http2Sessions.js +122 -0
  99. package/node_modules/axios/lib/helpers/HttpStatusCode.js +88 -0
  100. package/node_modules/axios/lib/helpers/README.md +7 -0
  101. package/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
  102. package/node_modules/axios/lib/helpers/bind.js +14 -0
  103. package/node_modules/axios/lib/helpers/buildURL.js +69 -0
  104. package/node_modules/axios/lib/helpers/callbackify.js +18 -0
  105. package/node_modules/axios/lib/helpers/combineURLs.js +23 -0
  106. package/node_modules/axios/lib/helpers/composeSignals.js +71 -0
  107. package/node_modules/axios/lib/helpers/cookies.js +88 -0
  108. package/node_modules/axios/lib/helpers/deprecatedMethod.js +31 -0
  109. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +193 -0
  110. package/node_modules/axios/lib/helpers/formDataToBlob.js +113 -0
  111. package/node_modules/axios/lib/helpers/formDataToJSON.js +149 -0
  112. package/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
  113. package/node_modules/axios/lib/helpers/fromDataURI.js +75 -0
  114. package/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
  115. package/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
  116. package/node_modules/axios/lib/helpers/isURLSameOrigin.js +11 -0
  117. package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
  118. package/node_modules/axios/lib/helpers/null.js +2 -0
  119. package/node_modules/axios/lib/helpers/parseHeaders.js +72 -0
  120. package/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
  121. package/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
  122. package/node_modules/axios/lib/helpers/readBlob.js +15 -0
  123. package/node_modules/axios/lib/helpers/resolveConfig.js +120 -0
  124. package/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
  125. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +520 -0
  126. package/node_modules/axios/lib/helpers/speedometer.js +55 -0
  127. package/node_modules/axios/lib/helpers/spread.js +28 -0
  128. package/node_modules/axios/lib/helpers/throttle.js +45 -0
  129. package/node_modules/axios/lib/helpers/toFormData.js +279 -0
  130. package/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
  131. package/node_modules/axios/lib/helpers/trackStream.js +89 -0
  132. package/node_modules/axios/lib/helpers/validator.js +112 -0
  133. package/node_modules/axios/lib/platform/browser/classes/Blob.js +3 -0
  134. package/node_modules/axios/lib/platform/browser/classes/FormData.js +3 -0
  135. package/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +4 -0
  136. package/node_modules/axios/lib/platform/browser/index.js +13 -0
  137. package/node_modules/axios/lib/platform/common/utils.js +52 -0
  138. package/node_modules/axios/lib/platform/index.js +7 -0
  139. package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
  140. package/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
  141. package/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
  142. package/node_modules/axios/lib/platform/node/index.js +37 -0
  143. package/node_modules/axios/lib/utils.js +1201 -0
  144. package/node_modules/axios/node_modules/agent-base/README.md +145 -0
  145. package/node_modules/axios/node_modules/agent-base/dist/src/index.d.ts +78 -0
  146. package/node_modules/axios/node_modules/agent-base/dist/src/index.js +203 -0
  147. package/node_modules/axios/node_modules/agent-base/dist/src/index.js.map +1 -0
  148. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.d.ts +4 -0
  149. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js +18 -0
  150. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js.map +1 -0
  151. package/node_modules/axios/node_modules/agent-base/package.json +64 -0
  152. package/node_modules/axios/node_modules/agent-base/src/index.ts +345 -0
  153. package/node_modules/axios/node_modules/agent-base/src/promisify.ts +33 -0
  154. package/node_modules/axios/node_modules/https-proxy-agent/README.md +137 -0
  155. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.d.ts +30 -0
  156. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js +177 -0
  157. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js.map +1 -0
  158. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.d.ts +23 -0
  159. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js +14 -0
  160. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js.map +1 -0
  161. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -0
  162. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
  163. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
  164. package/node_modules/axios/node_modules/https-proxy-agent/package.json +56 -0
  165. package/node_modules/axios/package.json +202 -0
  166. package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  167. package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  168. package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  169. package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  170. package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  171. package/node_modules/call-bind-apply-helpers/README.md +62 -0
  172. package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  173. package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  174. package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  175. package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  176. package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  177. package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  178. package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  179. package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  180. package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  181. package/node_modules/call-bind-apply-helpers/index.js +15 -0
  182. package/node_modules/call-bind-apply-helpers/package.json +85 -0
  183. package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  184. package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  185. package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  186. package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  187. package/node_modules/combined-stream/License +19 -0
  188. package/node_modules/combined-stream/Readme.md +138 -0
  189. package/node_modules/combined-stream/lib/combined_stream.js +208 -0
  190. package/node_modules/combined-stream/package.json +25 -0
  191. package/node_modules/delayed-stream/.npmignore +1 -0
  192. package/node_modules/delayed-stream/License +19 -0
  193. package/node_modules/delayed-stream/Makefile +7 -0
  194. package/node_modules/delayed-stream/Readme.md +141 -0
  195. package/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
  196. package/node_modules/delayed-stream/package.json +27 -0
  197. package/node_modules/dunder-proto/.eslintrc +5 -0
  198. package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  199. package/node_modules/dunder-proto/.nycrc +13 -0
  200. package/node_modules/dunder-proto/CHANGELOG.md +24 -0
  201. package/node_modules/dunder-proto/LICENSE +21 -0
  202. package/node_modules/dunder-proto/README.md +54 -0
  203. package/node_modules/dunder-proto/get.d.ts +5 -0
  204. package/node_modules/dunder-proto/get.js +30 -0
  205. package/node_modules/dunder-proto/package.json +76 -0
  206. package/node_modules/dunder-proto/set.d.ts +5 -0
  207. package/node_modules/dunder-proto/set.js +35 -0
  208. package/node_modules/dunder-proto/test/get.js +34 -0
  209. package/node_modules/dunder-proto/test/index.js +4 -0
  210. package/node_modules/dunder-proto/test/set.js +50 -0
  211. package/node_modules/dunder-proto/tsconfig.json +9 -0
  212. package/node_modules/es-define-property/.eslintrc +13 -0
  213. package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  214. package/node_modules/es-define-property/.nycrc +9 -0
  215. package/node_modules/es-define-property/CHANGELOG.md +29 -0
  216. package/node_modules/es-define-property/LICENSE +21 -0
  217. package/node_modules/es-define-property/README.md +49 -0
  218. package/node_modules/es-define-property/index.d.ts +3 -0
  219. package/node_modules/es-define-property/index.js +14 -0
  220. package/node_modules/es-define-property/package.json +81 -0
  221. package/node_modules/es-define-property/test/index.js +56 -0
  222. package/node_modules/es-define-property/tsconfig.json +10 -0
  223. package/node_modules/es-errors/.eslintrc +5 -0
  224. package/node_modules/es-errors/.github/FUNDING.yml +12 -0
  225. package/node_modules/es-errors/CHANGELOG.md +40 -0
  226. package/node_modules/es-errors/LICENSE +21 -0
  227. package/node_modules/es-errors/README.md +55 -0
  228. package/node_modules/es-errors/eval.d.ts +3 -0
  229. package/node_modules/es-errors/eval.js +4 -0
  230. package/node_modules/es-errors/index.d.ts +3 -0
  231. package/node_modules/es-errors/index.js +4 -0
  232. package/node_modules/es-errors/package.json +80 -0
  233. package/node_modules/es-errors/range.d.ts +3 -0
  234. package/node_modules/es-errors/range.js +4 -0
  235. package/node_modules/es-errors/ref.d.ts +3 -0
  236. package/node_modules/es-errors/ref.js +4 -0
  237. package/node_modules/es-errors/syntax.d.ts +3 -0
  238. package/node_modules/es-errors/syntax.js +4 -0
  239. package/node_modules/es-errors/test/index.js +19 -0
  240. package/node_modules/es-errors/tsconfig.json +49 -0
  241. package/node_modules/es-errors/type.d.ts +3 -0
  242. package/node_modules/es-errors/type.js +4 -0
  243. package/node_modules/es-errors/uri.d.ts +3 -0
  244. package/node_modules/es-errors/uri.js +4 -0
  245. package/node_modules/es-object-atoms/.eslintrc +16 -0
  246. package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  247. package/node_modules/es-object-atoms/CHANGELOG.md +44 -0
  248. package/node_modules/es-object-atoms/LICENSE +21 -0
  249. package/node_modules/es-object-atoms/README.md +63 -0
  250. package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  251. package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  252. package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  253. package/node_modules/es-object-atoms/ToObject.js +10 -0
  254. package/node_modules/es-object-atoms/index.d.ts +3 -0
  255. package/node_modules/es-object-atoms/index.js +4 -0
  256. package/node_modules/es-object-atoms/isObject.d.ts +3 -0
  257. package/node_modules/es-object-atoms/isObject.js +6 -0
  258. package/node_modules/es-object-atoms/package.json +79 -0
  259. package/node_modules/es-object-atoms/test/index.js +38 -0
  260. package/node_modules/es-object-atoms/tsconfig.json +7 -0
  261. package/node_modules/es-set-tostringtag/.eslintrc +13 -0
  262. package/node_modules/es-set-tostringtag/.nycrc +9 -0
  263. package/node_modules/es-set-tostringtag/CHANGELOG.md +67 -0
  264. package/node_modules/es-set-tostringtag/LICENSE +21 -0
  265. package/node_modules/es-set-tostringtag/README.md +53 -0
  266. package/node_modules/es-set-tostringtag/index.d.ts +10 -0
  267. package/node_modules/es-set-tostringtag/index.js +35 -0
  268. package/node_modules/es-set-tostringtag/package.json +78 -0
  269. package/node_modules/es-set-tostringtag/test/index.js +85 -0
  270. package/node_modules/es-set-tostringtag/tsconfig.json +9 -0
  271. package/node_modules/eventemitter3/LICENSE +21 -0
  272. package/node_modules/eventemitter3/README.md +85 -0
  273. package/node_modules/eventemitter3/dist/eventemitter3.esm.js +355 -0
  274. package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js +1 -0
  275. package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js.map +1 -0
  276. package/node_modules/eventemitter3/dist/eventemitter3.umd.js +363 -0
  277. package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js +1 -0
  278. package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js.map +1 -0
  279. package/node_modules/eventemitter3/index.d.ts +135 -0
  280. package/node_modules/eventemitter3/index.js +336 -0
  281. package/node_modules/eventemitter3/index.mjs +4 -0
  282. package/node_modules/eventemitter3/package.json +62 -0
  283. package/node_modules/follow-redirects/LICENSE +18 -0
  284. package/node_modules/follow-redirects/README.md +183 -0
  285. package/node_modules/follow-redirects/debug.js +15 -0
  286. package/node_modules/follow-redirects/http.js +1 -0
  287. package/node_modules/follow-redirects/https.js +1 -0
  288. package/node_modules/follow-redirects/index.js +714 -0
  289. package/node_modules/follow-redirects/package.json +58 -0
  290. package/node_modules/form-data/CHANGELOG.md +686 -0
  291. package/node_modules/form-data/License +19 -0
  292. package/node_modules/form-data/README.md +355 -0
  293. package/node_modules/form-data/index.d.ts +62 -0
  294. package/node_modules/form-data/lib/browser.js +4 -0
  295. package/node_modules/form-data/lib/form_data.js +506 -0
  296. package/node_modules/form-data/lib/populate.js +10 -0
  297. package/node_modules/form-data/package.json +82 -0
  298. package/node_modules/function-bind/.eslintrc +21 -0
  299. package/node_modules/function-bind/.github/FUNDING.yml +12 -0
  300. package/node_modules/function-bind/.github/SECURITY.md +3 -0
  301. package/node_modules/function-bind/.nycrc +13 -0
  302. package/node_modules/function-bind/CHANGELOG.md +136 -0
  303. package/node_modules/function-bind/LICENSE +20 -0
  304. package/node_modules/function-bind/README.md +46 -0
  305. package/node_modules/function-bind/implementation.js +84 -0
  306. package/node_modules/function-bind/index.js +5 -0
  307. package/node_modules/function-bind/package.json +87 -0
  308. package/node_modules/function-bind/test/.eslintrc +9 -0
  309. package/node_modules/function-bind/test/index.js +252 -0
  310. package/node_modules/get-intrinsic/.eslintrc +42 -0
  311. package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  312. package/node_modules/get-intrinsic/.nycrc +9 -0
  313. package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  314. package/node_modules/get-intrinsic/LICENSE +21 -0
  315. package/node_modules/get-intrinsic/README.md +71 -0
  316. package/node_modules/get-intrinsic/index.js +378 -0
  317. package/node_modules/get-intrinsic/package.json +97 -0
  318. package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  319. package/node_modules/get-proto/.eslintrc +10 -0
  320. package/node_modules/get-proto/.github/FUNDING.yml +12 -0
  321. package/node_modules/get-proto/.nycrc +9 -0
  322. package/node_modules/get-proto/CHANGELOG.md +21 -0
  323. package/node_modules/get-proto/LICENSE +21 -0
  324. package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  325. package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  326. package/node_modules/get-proto/README.md +50 -0
  327. package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  328. package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  329. package/node_modules/get-proto/index.d.ts +5 -0
  330. package/node_modules/get-proto/index.js +27 -0
  331. package/node_modules/get-proto/package.json +81 -0
  332. package/node_modules/get-proto/test/index.js +68 -0
  333. package/node_modules/get-proto/tsconfig.json +9 -0
  334. package/node_modules/gopd/.eslintrc +16 -0
  335. package/node_modules/gopd/.github/FUNDING.yml +12 -0
  336. package/node_modules/gopd/CHANGELOG.md +45 -0
  337. package/node_modules/gopd/LICENSE +21 -0
  338. package/node_modules/gopd/README.md +40 -0
  339. package/node_modules/gopd/gOPD.d.ts +1 -0
  340. package/node_modules/gopd/gOPD.js +4 -0
  341. package/node_modules/gopd/index.d.ts +5 -0
  342. package/node_modules/gopd/index.js +15 -0
  343. package/node_modules/gopd/package.json +77 -0
  344. package/node_modules/gopd/test/index.js +36 -0
  345. package/node_modules/gopd/tsconfig.json +9 -0
  346. package/node_modules/has-symbols/.eslintrc +11 -0
  347. package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  348. package/node_modules/has-symbols/.nycrc +9 -0
  349. package/node_modules/has-symbols/CHANGELOG.md +91 -0
  350. package/node_modules/has-symbols/LICENSE +21 -0
  351. package/node_modules/has-symbols/README.md +46 -0
  352. package/node_modules/has-symbols/index.d.ts +3 -0
  353. package/node_modules/has-symbols/index.js +14 -0
  354. package/node_modules/has-symbols/package.json +111 -0
  355. package/node_modules/has-symbols/shams.d.ts +3 -0
  356. package/node_modules/has-symbols/shams.js +45 -0
  357. package/node_modules/has-symbols/test/index.js +22 -0
  358. package/node_modules/has-symbols/test/shams/core-js.js +29 -0
  359. package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  360. package/node_modules/has-symbols/test/tests.js +58 -0
  361. package/node_modules/has-symbols/tsconfig.json +10 -0
  362. package/node_modules/has-tostringtag/.eslintrc +5 -0
  363. package/node_modules/has-tostringtag/.github/FUNDING.yml +12 -0
  364. package/node_modules/has-tostringtag/.nycrc +13 -0
  365. package/node_modules/has-tostringtag/CHANGELOG.md +42 -0
  366. package/node_modules/has-tostringtag/LICENSE +21 -0
  367. package/node_modules/has-tostringtag/README.md +46 -0
  368. package/node_modules/has-tostringtag/index.d.ts +3 -0
  369. package/node_modules/has-tostringtag/index.js +8 -0
  370. package/node_modules/has-tostringtag/package.json +108 -0
  371. package/node_modules/has-tostringtag/shams.d.ts +3 -0
  372. package/node_modules/has-tostringtag/shams.js +8 -0
  373. package/node_modules/has-tostringtag/test/index.js +21 -0
  374. package/node_modules/has-tostringtag/test/shams/core-js.js +31 -0
  375. package/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +30 -0
  376. package/node_modules/has-tostringtag/test/tests.js +15 -0
  377. package/node_modules/has-tostringtag/tsconfig.json +49 -0
  378. package/node_modules/hasown/.github/FUNDING.yml +12 -0
  379. package/node_modules/hasown/.nycrc +13 -0
  380. package/node_modules/hasown/CHANGELOG.md +58 -0
  381. package/node_modules/hasown/LICENSE +21 -0
  382. package/node_modules/hasown/README.md +40 -0
  383. package/node_modules/hasown/eslint.config.mjs +6 -0
  384. package/node_modules/hasown/index.d.ts +3 -0
  385. package/node_modules/hasown/index.js +8 -0
  386. package/node_modules/hasown/package.json +91 -0
  387. package/node_modules/hasown/tsconfig.json +6 -0
  388. package/node_modules/math-intrinsics/.eslintrc +16 -0
  389. package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  390. package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  391. package/node_modules/math-intrinsics/LICENSE +21 -0
  392. package/node_modules/math-intrinsics/README.md +50 -0
  393. package/node_modules/math-intrinsics/abs.d.ts +1 -0
  394. package/node_modules/math-intrinsics/abs.js +4 -0
  395. package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  396. package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  397. package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  398. package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  399. package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  400. package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  401. package/node_modules/math-intrinsics/floor.d.ts +1 -0
  402. package/node_modules/math-intrinsics/floor.js +4 -0
  403. package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  404. package/node_modules/math-intrinsics/isFinite.js +12 -0
  405. package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  406. package/node_modules/math-intrinsics/isInteger.js +16 -0
  407. package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  408. package/node_modules/math-intrinsics/isNaN.js +6 -0
  409. package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  410. package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  411. package/node_modules/math-intrinsics/max.d.ts +1 -0
  412. package/node_modules/math-intrinsics/max.js +4 -0
  413. package/node_modules/math-intrinsics/min.d.ts +1 -0
  414. package/node_modules/math-intrinsics/min.js +4 -0
  415. package/node_modules/math-intrinsics/mod.d.ts +3 -0
  416. package/node_modules/math-intrinsics/mod.js +9 -0
  417. package/node_modules/math-intrinsics/package.json +86 -0
  418. package/node_modules/math-intrinsics/pow.d.ts +1 -0
  419. package/node_modules/math-intrinsics/pow.js +4 -0
  420. package/node_modules/math-intrinsics/round.d.ts +1 -0
  421. package/node_modules/math-intrinsics/round.js +4 -0
  422. package/node_modules/math-intrinsics/sign.d.ts +3 -0
  423. package/node_modules/math-intrinsics/sign.js +11 -0
  424. package/node_modules/math-intrinsics/test/index.js +192 -0
  425. package/node_modules/math-intrinsics/tsconfig.json +3 -0
  426. package/node_modules/mime-db/HISTORY.md +507 -0
  427. package/node_modules/mime-db/LICENSE +23 -0
  428. package/node_modules/mime-db/README.md +100 -0
  429. package/node_modules/mime-db/db.json +8519 -0
  430. package/node_modules/mime-db/index.js +12 -0
  431. package/node_modules/mime-db/package.json +60 -0
  432. package/node_modules/mime-types/HISTORY.md +397 -0
  433. package/node_modules/mime-types/LICENSE +23 -0
  434. package/node_modules/mime-types/README.md +113 -0
  435. package/node_modules/mime-types/index.js +188 -0
  436. package/node_modules/mime-types/package.json +44 -0
  437. package/node_modules/proxy-from-env/LICENSE +20 -0
  438. package/node_modules/proxy-from-env/README.md +163 -0
  439. package/node_modules/proxy-from-env/index.cjs +105 -0
  440. package/node_modules/proxy-from-env/index.js +103 -0
  441. package/node_modules/proxy-from-env/package.json +43 -0
  442. package/package.json +2 -1
  443. package/dist/web/assets/Assistant-DSQAdSiW.js +0 -1
  444. package/dist/web/assets/index-BXpTaAUz.js +0 -66
package/dist/main.js CHANGED
@@ -1440,7 +1440,7 @@ var AgentConfig = class {
1440
1440
  if (url.password || ["http:", "https:"].includes(url.protocol) && url.username)
1441
1441
  throw new HubError(400, "AGENT_CONFIG_INVALID", "\u8BF7\u5728\u51ED\u8BC1\u5B57\u6BB5\u914D\u7F6E\u5BC6\u94A5\uFF0C\u4E0D\u8981\u5199\u5165\u4ED3\u5E93\u5730\u5740\u3002");
1442
1442
  }
1443
- return transaction(this.hub.db, () => {
1443
+ return diagnosticTransaction(this.hub, () => {
1444
1444
  const secrets = this.secrets(project);
1445
1445
  if (input.sshPrivateKey !== void 0) delete secrets.sshPublicKey;
1446
1446
  if (generatedPublicKey) secrets.sshPublicKey = generatedPublicKey;
@@ -1670,7 +1670,7 @@ var AgentStore = class {
1670
1670
  };
1671
1671
  }
1672
1672
  createChat(identity) {
1673
- return transaction(this.hub.db, () => {
1673
+ return diagnosticTransaction(this.hub, () => {
1674
1674
  const id = randomUUID3();
1675
1675
  this.hub.db.prepare(
1676
1676
  `INSERT INTO project_agent_conversations(id,project_id,role,owner,created_at)
@@ -1705,7 +1705,7 @@ var AgentStore = class {
1705
1705
  ).all(conversation, after);
1706
1706
  }
1707
1707
  ask(identity, text, chatId) {
1708
- return transaction(this.hub.db, () => {
1708
+ return diagnosticTransaction(this.hub, () => {
1709
1709
  const conversation = chatId ? this.ownedChat(identity, chatId) : this.conversation(identity.workspaceId, "instant", identity.memberId);
1710
1710
  const id = randomUUID3(), date = now();
1711
1711
  this.hub.db.prepare(
@@ -1925,7 +1925,7 @@ var AgentStore = class {
1925
1925
  return this.message(identity, id);
1926
1926
  }
1927
1927
  reply(identity, id, body) {
1928
- return transaction(this.hub.db, () => {
1928
+ return diagnosticTransaction(this.hub, () => {
1929
1929
  const message = this.message(identity, id);
1930
1930
  const recipient = this.hub.db.prepare("SELECT * FROM project_agent_recipients WHERE message_id=? AND user_id=?").get(id, identity.memberId);
1931
1931
  if (recipient.reply_body === body) return { taskId: Number(recipient.reply_task_id) };
@@ -2322,12 +2322,12 @@ var ProjectWorkspace = class {
2322
2322
  }
2323
2323
  }
2324
2324
  const files = new FileRepository(this.hub);
2325
- for (const [path, hash2] of Object.entries(next)) {
2325
+ for (const [path, hash3] of Object.entries(next)) {
2326
2326
  signal.throwIfAborted();
2327
- if (this.current[path] === hash2) continue;
2327
+ if (this.current[path] === hash3) continue;
2328
2328
  const target = join6(this.workspaces, path);
2329
2329
  await mkdir3(dirname4(target), { recursive: true });
2330
- const bytes = await files.download({ workspaceId: this.project, memberId: "" }, hash2);
2330
+ const bytes = await files.download({ workspaceId: this.project, memberId: "" }, hash3);
2331
2331
  const temporary = `${target}.${randomUUID5()}.tmp`;
2332
2332
  try {
2333
2333
  await writeFile2(temporary, bytes, { mode: 292 });
@@ -2960,11 +2960,11 @@ var FileRepository = class {
2960
2960
  const query = this.hub.db.prepare(
2961
2961
  "SELECT 1 FROM workspace_blobs WHERE workspace_id=? AND hash=?"
2962
2962
  );
2963
- return hashes.filter((hash2) => !query.get(identity.workspaceId, hash2));
2963
+ return hashes.filter((hash3) => !query.get(identity.workspaceId, hash3));
2964
2964
  }
2965
- async upload(authorization, device, hash2, bytes) {
2965
+ async upload(authorization, device, hash3, bytes) {
2966
2966
  this.hub.authorize(authorization, device);
2967
- if (createHash5("sha256").update(bytes).digest("hex") !== HashSchema.parse(hash2))
2967
+ if (createHash5("sha256").update(bytes).digest("hex") !== HashSchema.parse(hash3))
2968
2968
  throw new HubError(400, "HASH_MISMATCH", "Content does not match its SHA-256.");
2969
2969
  const ref = await this.blobs.put(bytes);
2970
2970
  transaction(this.hub.db, () => {
@@ -2973,10 +2973,10 @@ var FileRepository = class {
2973
2973
  });
2974
2974
  return ref;
2975
2975
  }
2976
- async download(identity, hash2) {
2977
- if (this.missing(identity, [hash2]).length)
2976
+ async download(identity, hash3) {
2977
+ if (this.missing(identity, [hash3]).length)
2978
2978
  throw new HubError(404, "BLOB_NOT_FOUND", "Content is not available in this workspace.");
2979
- const bytes = await this.blobs.get(hash2);
2979
+ const bytes = await this.blobs.get(hash3);
2980
2980
  if (!bytes) throw new HubError(500, "BLOB_MISSING", "Stored content is unavailable.");
2981
2981
  return bytes;
2982
2982
  }
@@ -3754,6 +3754,33 @@ CREATE TABLE device_connect_requests (
3754
3754
  CREATE INDEX device_connect_expiry ON device_connect_requests(expires_at);
3755
3755
  `;
3756
3756
 
3757
+ // apps/server/wecom/schema.ts
3758
+ var wecomMigration = `
3759
+ CREATE TABLE wecom_config(id INTEGER PRIMARY KEY CHECK(id=1),bot_id TEXT NOT NULL,secret TEXT NOT NULL,enabled INTEGER NOT NULL,revision INTEGER NOT NULL);
3760
+ CREATE TABLE wecom_bindings(
3761
+ bot_id TEXT NOT NULL,external_id TEXT NOT NULL,user_id TEXT NOT NULL,
3762
+ active_project TEXT NOT NULL,PRIMARY KEY(bot_id,external_id),UNIQUE(bot_id,user_id)
3763
+ );
3764
+ CREATE TABLE wecom_codes(code_hash TEXT PRIMARY KEY,bot_id TEXT NOT NULL,user_id TEXT NOT NULL,project_id TEXT NOT NULL,expires_at INTEGER NOT NULL);
3765
+ CREATE TABLE wecom_subscriptions(
3766
+ bot_id TEXT NOT NULL,user_id TEXT NOT NULL,project_id TEXT NOT NULL,outbox_after INTEGER NOT NULL,
3767
+ chat_id TEXT,PRIMARY KEY(bot_id,user_id,project_id)
3768
+ );
3769
+ CREATE TABLE wecom_incoming(bot_id TEXT NOT NULL,msg_id TEXT NOT NULL,created_at INTEGER NOT NULL,PRIMARY KEY(bot_id,msg_id));
3770
+ CREATE TABLE wecom_requests(
3771
+ run_id TEXT PRIMARY KEY,bot_id TEXT NOT NULL,external_id TEXT NOT NULL,user_id TEXT NOT NULL,project_id TEXT NOT NULL
3772
+ );
3773
+ CREATE TABLE wecom_deliveries(
3774
+ id TEXT PRIMARY KEY,bot_id TEXT NOT NULL,external_id TEXT NOT NULL,user_id TEXT,
3775
+ project_id TEXT,kind TEXT NOT NULL,source_id TEXT NOT NULL,reference TEXT UNIQUE,body TEXT NOT NULL,
3776
+ state TEXT NOT NULL DEFAULT 'pending',attempts INTEGER NOT NULL DEFAULT 0,due_at INTEGER NOT NULL DEFAULT 0,
3777
+ error TEXT,created_at INTEGER NOT NULL,sent_at INTEGER,
3778
+ UNIQUE(bot_id,external_id,kind,source_id)
3779
+ );
3780
+ CREATE INDEX wecom_pending ON wecom_deliveries(bot_id,state,due_at);
3781
+ CREATE TABLE wecom_runtime(id INTEGER PRIMARY KEY CHECK(id=1),owner TEXT NOT NULL,expires_at INTEGER NOT NULL,state TEXT NOT NULL,error TEXT);
3782
+ `;
3783
+
3757
3784
  // apps/server/ai/schema.ts
3758
3785
  var aiConfigMigration = `
3759
3786
  CREATE TABLE ai_profiles (
@@ -3827,7 +3854,8 @@ var migrations = [
3827
3854
  instantAgentMigration,
3828
3855
  sandboxStatusMigration,
3829
3856
  agentChatsMigration,
3830
- clientAccessMigration
3857
+ clientAccessMigration,
3858
+ wecomMigration
3831
3859
  ];
3832
3860
  var HubStore = class {
3833
3861
  constructor(directory) {
@@ -8492,7 +8520,7 @@ function registerWeb(server, root) {
8492
8520
  }
8493
8521
 
8494
8522
  // apps/server/server.ts
8495
- import { randomUUID as randomUUID12 } from "node:crypto";
8523
+ import { randomUUID as randomUUID14 } from "node:crypto";
8496
8524
  import Fastify from "fastify";
8497
8525
 
8498
8526
  // packages/protocol/index.ts
@@ -9004,14 +9032,14 @@ function registerFileRoutes(server, store) {
9004
9032
  missing: files.missing(authorize(request), BlobCheckSchema.parse(request.body).hashes)
9005
9033
  }));
9006
9034
  server.put("/blobs/:hash", { ...guard, bodyLimit: MAX_BLOB_BYTES }, async (request) => {
9007
- const { hash: hash2 } = z33.object({ hash: HashSchema }).parse(request.params);
9035
+ const { hash: hash3 } = z33.object({ hash: HashSchema }).parse(request.params);
9008
9036
  if (!Buffer.isBuffer(request.body))
9009
9037
  throw Object.assign(new Error("Expected binary content"), { statusCode: 400 });
9010
- return files.upload(request.headers.authorization, device(request), hash2, request.body);
9038
+ return files.upload(request.headers.authorization, device(request), hash3, request.body);
9011
9039
  });
9012
9040
  server.get("/blobs/:hash", async (request, reply) => {
9013
- const { hash: hash2 } = z33.object({ hash: HashSchema }).parse(request.params);
9014
- const bytes = await files.download(authorizeRead(store, request), hash2);
9041
+ const { hash: hash3 } = z33.object({ hash: HashSchema }).parse(request.params);
9042
+ const bytes = await files.download(authorizeRead(store, request), hash3);
9015
9043
  return reply.type("application/octet-stream").send(Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength));
9016
9044
  });
9017
9045
  const upgradeRequired = () => {
@@ -9503,6 +9531,634 @@ function registerClientAccess(server, store) {
9503
9531
  );
9504
9532
  }
9505
9533
 
9534
+ // packages/protocol/wecom.ts
9535
+ import { z as z37 } from "zod";
9536
+ var WecomConfigInputSchema = z37.object({
9537
+ enabled: z37.boolean(),
9538
+ botId: z37.string().trim().min(1),
9539
+ secret: z37.string().trim().min(1).optional()
9540
+ }).strict();
9541
+ var WecomStatusSchema = z37.object({
9542
+ enabled: z37.boolean(),
9543
+ botId: z37.string(),
9544
+ secretConfigured: z37.boolean(),
9545
+ state: z37.enum(["disabled", "connecting", "connected", "disconnected", "error"]),
9546
+ error: z37.string().nullable(),
9547
+ pending: z37.number()
9548
+ });
9549
+ var WecomBindingSchema = z37.object({
9550
+ available: z37.boolean(),
9551
+ bound: z37.boolean(),
9552
+ subscribed: z37.boolean(),
9553
+ activeProject: z37.string().nullable(),
9554
+ pending: z37.number(),
9555
+ error: z37.string().nullable()
9556
+ });
9557
+ var WecomCodeSchema = z37.object({ code: z37.string(), expiresAt: z37.number() });
9558
+
9559
+ // apps/server/wecom/config.ts
9560
+ import { createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3, randomBytes as randomBytes6 } from "node:crypto";
9561
+ import { readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "node:fs";
9562
+ import { join as join18 } from "node:path";
9563
+ var WecomConfig = class {
9564
+ constructor(hub) {
9565
+ this.hub = hub;
9566
+ }
9567
+ hub;
9568
+ key() {
9569
+ const path = join18(this.hub.directory, "wecom-secret.key");
9570
+ try {
9571
+ writeFileSync4(path, randomBytes6(32), { flag: "wx", mode: 384 });
9572
+ } catch (error) {
9573
+ if (error.code !== "EEXIST") throw error;
9574
+ }
9575
+ return readFileSync6(path);
9576
+ }
9577
+ row() {
9578
+ return this.hub.db.prepare("SELECT * FROM wecom_config WHERE id=1").get();
9579
+ }
9580
+ credentials() {
9581
+ const row = this.row();
9582
+ if (!row?.enabled) return null;
9583
+ const [iv, tag, body] = String(row.secret).split(".").map((v) => Buffer.from(v, "base64"));
9584
+ const decipher = createDecipheriv3("aes-256-gcm", this.key(), iv);
9585
+ decipher.setAAD(Buffer.from(String(row.bot_id)));
9586
+ decipher.setAuthTag(tag);
9587
+ return {
9588
+ botId: String(row.bot_id),
9589
+ secret: Buffer.concat([decipher.update(body), decipher.final()]).toString("utf8"),
9590
+ revision: Number(row.revision)
9591
+ };
9592
+ }
9593
+ save(value) {
9594
+ const input = WecomConfigInputSchema.parse(value), old = this.row();
9595
+ if (!input.secret && (!old || old.bot_id !== input.botId))
9596
+ throw new HubError(400, "WECOM_SECRET_REQUIRED", "\u8BF7\u586B\u5199\u8FD9\u4E2A\u673A\u5668\u4EBA\u7684 Secret\u3002");
9597
+ let secret = String(old?.secret ?? "");
9598
+ if (input.secret) {
9599
+ const iv = randomBytes6(12), cipher = createCipheriv3("aes-256-gcm", this.key(), iv);
9600
+ cipher.setAAD(Buffer.from(input.botId));
9601
+ const body = Buffer.concat([cipher.update(input.secret, "utf8"), cipher.final()]);
9602
+ secret = [iv, cipher.getAuthTag(), body].map((v) => v.toString("base64")).join(".");
9603
+ }
9604
+ this.hub.db.prepare(
9605
+ `INSERT INTO wecom_config VALUES(1,?,?,?,1)
9606
+ ON CONFLICT(id) DO UPDATE SET bot_id=excluded.bot_id,secret=excluded.secret,enabled=excluded.enabled,revision=revision+1`
9607
+ ).run(input.botId, secret, Number(input.enabled));
9608
+ return this.status();
9609
+ }
9610
+ seed(env) {
9611
+ if (!this.row() && env.WECOM_BOT_BOT_ID && env.WECOM_BOT_SECRET)
9612
+ this.save({ enabled: true, botId: env.WECOM_BOT_BOT_ID, secret: env.WECOM_BOT_SECRET });
9613
+ }
9614
+ status() {
9615
+ const row = this.row(), runtime = this.hub.db.prepare("SELECT * FROM wecom_runtime WHERE id=1").get();
9616
+ return {
9617
+ enabled: !!row?.enabled,
9618
+ botId: String(row?.bot_id ?? ""),
9619
+ secretConfigured: !!row?.secret,
9620
+ state: !row?.enabled ? "disabled" : runtime && Number(runtime.expires_at) > Date.now() ? String(runtime.state) : "disconnected",
9621
+ error: runtime?.error ? String(runtime.error) : null,
9622
+ pending: Number(
9623
+ this.hub.db.prepare("SELECT COUNT(*) n FROM wecom_deliveries WHERE bot_id=? AND state='pending'").get(String(row?.bot_id ?? "")).n
9624
+ )
9625
+ };
9626
+ }
9627
+ };
9628
+
9629
+ // apps/server/wecom/runtime.ts
9630
+ import { randomUUID as randomUUID13 } from "node:crypto";
9631
+ import {
9632
+ WSClient
9633
+ } from "@wecom/aibot-node-sdk";
9634
+
9635
+ // apps/server/wecom/store.ts
9636
+ import { createHash as createHash14, randomBytes as randomBytes7, randomUUID as randomUUID12 } from "node:crypto";
9637
+ import { z as z38 } from "zod";
9638
+ var hash2 = (text) => createHash14("sha256").update(text).digest("hex");
9639
+ var referencePattern = /\bTM-([A-F0-9]{12})\b/i;
9640
+ var incomingSchema = z38.object({
9641
+ msgid: z38.string().min(1),
9642
+ aibotid: z38.string(),
9643
+ chattype: z38.string(),
9644
+ from: z38.object({ userid: z38.string().min(1) }),
9645
+ msgtype: z38.string(),
9646
+ text: z38.object({ content: z38.string() }).optional(),
9647
+ quote: z38.object({ text: z38.object({ content: z38.string() }).optional() }).passthrough().optional(),
9648
+ compat_info: z38.unknown().optional()
9649
+ }).passthrough();
9650
+ var replyHint = "\u56DE\u5E94\u300C\u63D0\u767E\u4E8B\u300D\u7684\u95EE\u9898\u3002\u6CE8\u610F\uFF1A\u53EA\u80FD\u53D1\u9001\u4E00\u6761\u6D88\u606F\uFF0C\u300C\u63D0\u767E\u4E8B\u300D\u6536\u5230\u540E\u4F1A\u7EE7\u7EED\u5DE5\u4F5C\u3002\u5982\u679C\u6709\u65B0\u7684\u95EE\u9898\uFF0C\u300C\u63D0\u767E\u4E8B\u300D\u4F1A\u7EE7\u7EED\u53D1\u6D88\u606F\u6765\u95EE\u4F60\u3002";
9651
+ var WecomStore = class {
9652
+ constructor(hub) {
9653
+ this.hub = hub;
9654
+ this.agents = new AgentStore(hub);
9655
+ }
9656
+ hub;
9657
+ agents;
9658
+ bot() {
9659
+ const config = new WecomConfig(this.hub).row();
9660
+ if (!config?.enabled) throw new HubError(400, "WECOM_DISABLED", "\u4F01\u4E1A\u5FAE\u4FE1\u63A5\u5165\u5C1A\u672A\u542F\u7528\u3002");
9661
+ return String(config.bot_id);
9662
+ }
9663
+ requireMember(identity) {
9664
+ if (!this.hub.db.prepare(
9665
+ `SELECT 1 FROM members m JOIN users u ON u.id=m.member_id
9666
+ WHERE m.workspace_id=? AND m.member_id=? AND m.enabled=1 AND u.enabled=1`
9667
+ ).get(identity.workspaceId, identity.memberId))
9668
+ throw new HubError(
9669
+ 403,
9670
+ "WECOM_MEMBER_REQUIRED",
9671
+ "\u5F53\u524D\u8D26\u53F7\u5DF2\u505C\u7528\u6216\u5DF2\u79BB\u5F00\u9879\u76EE\uFF0C\u8BF7\u5728\u7F51\u9875\u68C0\u67E5\u3002"
9672
+ );
9673
+ }
9674
+ binding(identity) {
9675
+ this.requireMember(identity);
9676
+ const config = new WecomConfig(this.hub).row(), bot = String(config?.bot_id ?? "");
9677
+ const bound = this.hub.db.prepare("SELECT * FROM wecom_bindings WHERE bot_id=? AND user_id=?").get(bot, identity.memberId);
9678
+ const subscribed = this.hub.db.prepare("SELECT 1 FROM wecom_subscriptions WHERE bot_id=? AND user_id=? AND project_id=?").get(bot, identity.memberId, identity.workspaceId);
9679
+ const pending = Number(
9680
+ this.hub.db.prepare(
9681
+ "SELECT COUNT(*) n FROM wecom_deliveries WHERE bot_id=? AND user_id=? AND project_id=? AND state='pending'"
9682
+ ).get(bot, identity.memberId, identity.workspaceId).n
9683
+ );
9684
+ const error = this.hub.db.prepare(
9685
+ "SELECT error FROM wecom_deliveries WHERE bot_id=? AND user_id=? AND project_id=? AND state='pending' AND error IS NOT NULL ORDER BY rowid DESC LIMIT 1"
9686
+ ).get(bot, identity.memberId, identity.workspaceId)?.error;
9687
+ return {
9688
+ available: !!config?.enabled,
9689
+ bound: !!bound,
9690
+ subscribed: !!subscribed,
9691
+ activeProject: bound ? String(bound.active_project) : null,
9692
+ pending,
9693
+ error: error ? String(error) : null
9694
+ };
9695
+ }
9696
+ code(identity) {
9697
+ this.requireMember(identity);
9698
+ const bot = this.bot(), code = randomBytes7(6).toString("hex").toUpperCase(), expiresAt = Date.now() + 10 * 6e4;
9699
+ transaction(this.hub.db, () => {
9700
+ this.hub.db.prepare(
9701
+ "DELETE FROM wecom_codes WHERE expires_at<? OR (bot_id=? AND user_id=? AND project_id=?)"
9702
+ ).run(Date.now(), bot, identity.memberId, identity.workspaceId);
9703
+ this.hub.db.prepare("INSERT INTO wecom_codes VALUES(?,?,?,?,?)").run(hash2(code), bot, identity.memberId, identity.workspaceId, expiresAt);
9704
+ });
9705
+ return { code, expiresAt };
9706
+ }
9707
+ unsubscribe(identity) {
9708
+ const bot = this.bot();
9709
+ this.requireMember(identity);
9710
+ transaction(this.hub.db, () => {
9711
+ this.hub.db.prepare("DELETE FROM wecom_subscriptions WHERE bot_id=? AND user_id=? AND project_id=?").run(bot, identity.memberId, identity.workspaceId);
9712
+ this.hub.db.prepare("DELETE FROM wecom_codes WHERE bot_id=? AND user_id=? AND project_id=?").run(bot, identity.memberId, identity.workspaceId);
9713
+ this.hub.db.prepare(
9714
+ "UPDATE wecom_deliveries SET state='cancelled' WHERE bot_id=? AND user_id=? AND project_id=? AND state='pending'"
9715
+ ).run(bot, identity.memberId, identity.workspaceId);
9716
+ if (!this.hub.db.prepare("SELECT 1 FROM wecom_subscriptions WHERE bot_id=? AND user_id=?").get(bot, identity.memberId))
9717
+ this.hub.db.prepare("DELETE FROM wecom_bindings WHERE bot_id=? AND user_id=?").run(bot, identity.memberId);
9718
+ });
9719
+ return this.binding(identity);
9720
+ }
9721
+ projectName(id) {
9722
+ const row = this.hub.db.prepare("SELECT config_json FROM projects WHERE id=?").get(id);
9723
+ return row ? String(JSON.parse(String(row.config_json)).projectName) : id;
9724
+ }
9725
+ queue(bot, external, kind, source, body, identity, reference) {
9726
+ this.hub.db.prepare(
9727
+ `INSERT OR IGNORE INTO wecom_deliveries
9728
+ (id,bot_id,external_id,user_id,project_id,kind,source_id,reference,body,created_at) VALUES(?,?,?,?,?,?,?,?,?,?)`
9729
+ ).run(
9730
+ randomUUID12(),
9731
+ bot,
9732
+ external,
9733
+ identity?.memberId ?? null,
9734
+ identity?.workspaceId ?? null,
9735
+ kind,
9736
+ source,
9737
+ reference ?? null,
9738
+ body,
9739
+ Date.now()
9740
+ );
9741
+ }
9742
+ subscribe(bot, external, code) {
9743
+ const row = this.hub.db.prepare("SELECT * FROM wecom_codes WHERE code_hash=? AND bot_id=? AND expires_at>?").get(hash2(code.toUpperCase()), bot, Date.now());
9744
+ if (!row)
9745
+ throw new HubError(400, "WECOM_CODE_INVALID", "\u7ED1\u5B9A\u7801\u65E0\u6548\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u5728\u9879\u76EE\u8BBE\u7F6E\u4E2D\u91CD\u65B0\u751F\u6210\u3002");
9746
+ const identity = { memberId: String(row.user_id), workspaceId: String(row.project_id) };
9747
+ this.requireMember(identity);
9748
+ const other = this.hub.db.prepare("SELECT * FROM wecom_bindings WHERE bot_id=? AND (external_id=? OR user_id=?)").all(bot, external, identity.memberId);
9749
+ if (other.some((r) => r.external_id !== external || r.user_id !== identity.memberId))
9750
+ throw new HubError(
9751
+ 409,
9752
+ "WECOM_ALREADY_BOUND",
9753
+ "\u8D26\u53F7\u5DF2\u7ED1\u5B9A\u5176\u4ED6\u8EAB\u4EFD\uFF0C\u8BF7\u5148\u5728\u539F\u8D26\u53F7\u7684\u9879\u76EE\u8BBE\u7F6E\u4E2D\u89E3\u9664\u7ED1\u5B9A\u3002"
9754
+ );
9755
+ this.hub.db.prepare(
9756
+ `INSERT INTO wecom_bindings VALUES(?,?,?,?) ON CONFLICT(bot_id,external_id) DO UPDATE SET active_project=excluded.active_project`
9757
+ ).run(bot, external, identity.memberId, identity.workspaceId);
9758
+ const after = Number(
9759
+ this.hub.db.prepare("SELECT COALESCE(MAX(rowid),0) n FROM project_agent_outbox").get().n
9760
+ );
9761
+ this.hub.db.prepare("INSERT OR IGNORE INTO wecom_subscriptions VALUES(?,?,?,?,NULL)").run(bot, identity.memberId, identity.workspaceId, after);
9762
+ this.hub.db.prepare("DELETE FROM wecom_codes WHERE code_hash=?").run(hash2(code.toUpperCase()));
9763
+ return identity;
9764
+ }
9765
+ /** Deduplication, business writes and acknowledgement queue commit together. */
9766
+ receive(value) {
9767
+ const parsed = incomingSchema.safeParse(value);
9768
+ if (!parsed.success) return;
9769
+ const msg = parsed.data, bot = this.bot();
9770
+ if (msg.aibotid !== bot || msg.chattype !== "single" || msg.compat_info) return;
9771
+ return transaction(this.hub.db, () => {
9772
+ const inserted = this.hub.db.prepare("INSERT OR IGNORE INTO wecom_incoming VALUES(?,?,?)").run(bot, msg.msgid, Date.now());
9773
+ if (!inserted.changes) return;
9774
+ const notice = (body) => this.queue(bot, msg.from.userid, "notice", msg.msgid, body);
9775
+ try {
9776
+ if (msg.msgtype !== "text" || !msg.text?.content.trim()) {
9777
+ notice("\u76EE\u524D\u652F\u6301\u6587\u5B57\u6D88\u606F\uFF0C\u8BF7\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3002");
9778
+ return;
9779
+ }
9780
+ const text = msg.text.content.trim();
9781
+ const bind = text.match(/^绑定\s+([a-f0-9]{12})$/i);
9782
+ if (bind) {
9783
+ const identity2 = this.subscribe(bot, msg.from.userid, bind[1]);
9784
+ notice(
9785
+ `\u5DF2\u7ED1\u5B9A ${identity2.memberId}\uFF0C\u5F53\u524D\u9879\u76EE\uFF1A${this.projectName(identity2.workspaceId)}\u3002
9786
+
9787
+ \u53EF\u4EE5\u76F4\u63A5\u63D0\u95EE\uFF0C\u6216\u53D1\u9001\u201C\u65B0\u5EFA\u5BF9\u8BDD\u201D\u3002\u6536\u5230\u901A\u77E5\u540E\uFF0C\u8BF7\u5F15\u7528\u5BF9\u5E94\u6D88\u606F\u56DE\u590D\u3002`
9788
+ );
9789
+ return;
9790
+ }
9791
+ const binding = this.hub.db.prepare("SELECT * FROM wecom_bindings WHERE bot_id=? AND external_id=?").get(bot, msg.from.userid);
9792
+ if (!binding) {
9793
+ notice("\u8BF7\u5148\u767B\u5F55 Teammy\uFF0C\u5728\u9879\u76EE\u8BBE\u7F6E \u2192 \u4F01\u4E1A\u5FAE\u4FE1\u4E2D\u83B7\u53D6\u7ED1\u5B9A\u7801\uFF0C\u53D1\u9001\u201C\u7ED1\u5B9A \u7ED1\u5B9A\u7801\u201D\u3002");
9794
+ return;
9795
+ }
9796
+ const user = String(binding.user_id);
9797
+ if (text === "\u5E2E\u52A9" || text === "\u9879\u76EE") {
9798
+ const projects = this.hub.db.prepare(
9799
+ `SELECT s.project_id FROM wecom_subscriptions s JOIN members m ON m.workspace_id=s.project_id AND m.member_id=s.user_id JOIN users u ON u.id=s.user_id WHERE s.bot_id=? AND s.user_id=? AND m.enabled=1 AND u.enabled=1`
9800
+ ).all(bot, user);
9801
+ notice(
9802
+ `\u5DF2\u8FDE\u63A5\u9879\u76EE\uFF1A
9803
+ ${projects.map((p) => `${this.projectName(String(p.project_id))}\uFF08${p.project_id}\uFF09`).join("\n")}
9804
+
9805
+ \u76F4\u63A5\u53D1\u9001\u6587\u5B57\u63D0\u95EE\uFF1B\u53D1\u9001\u201C\u65B0\u5EFA\u5BF9\u8BDD\u201D\u5F00\u59CB\u65B0\u8BDD\u9898\uFF1B\u53D1\u9001\u201C\u5207\u6362\u9879\u76EE \u9879\u76EE\u540D\u79F0\u201D\u5207\u6362\uFF1B\u5F15\u7528\u901A\u77E5\u56DE\u590D\u8BE5\u6761\u6D88\u606F\u3002`
9806
+ );
9807
+ return;
9808
+ }
9809
+ const change = text.match(/^切换项目\s+(.+)$/);
9810
+ if (change) {
9811
+ const projects = this.hub.db.prepare("SELECT project_id FROM wecom_subscriptions WHERE bot_id=? AND user_id=?").all(bot, user).map((r) => String(r.project_id)).filter((id) => id === change[1] || this.projectName(id) === change[1]);
9812
+ if (projects.length !== 1) {
9813
+ notice("\u9879\u76EE\u4E0D\u5B58\u5728\u6216\u540D\u79F0\u91CD\u590D\uFF0C\u8BF7\u53D1\u9001\u201C\u9879\u76EE\u201D\u67E5\u770B\u5DF2\u8FDE\u63A5\u9879\u76EE\uFF0C\u5E76\u4F7F\u7528\u5B8C\u6574\u9879\u76EE ID \u5207\u6362\u3002");
9814
+ return;
9815
+ }
9816
+ this.requireMember({ memberId: user, workspaceId: projects[0] });
9817
+ this.hub.db.prepare("UPDATE wecom_bindings SET active_project=? WHERE bot_id=? AND external_id=?").run(projects[0], bot, msg.from.userid);
9818
+ notice(`\u5DF2\u5207\u6362\u5230 ${this.projectName(projects[0])}\u3002`);
9819
+ return;
9820
+ }
9821
+ const explicit = text.match(/^回复\s+(TM-[A-F0-9]{12})\s+([\s\S]+)$/i);
9822
+ const ref = explicit?.[1] ?? msg.quote?.text?.content.match(referencePattern)?.[0];
9823
+ if (ref) {
9824
+ const delivery = this.hub.db.prepare(
9825
+ "SELECT * FROM wecom_deliveries WHERE bot_id=? AND external_id=? AND user_id=? AND reference=? AND kind='outbox'"
9826
+ ).get(bot, msg.from.userid, user, ref.toUpperCase());
9827
+ if (!delivery) {
9828
+ notice("\u6CA1\u6709\u627E\u5230\u4F60\u53EF\u56DE\u590D\u7684\u8FD9\u6761\u901A\u77E5\uFF0C\u8BF7\u5728\u7F51\u9875\u6253\u5F00\u539F\u6D88\u606F\u3002");
9829
+ return;
9830
+ }
9831
+ const identity2 = { memberId: user, workspaceId: String(delivery.project_id) };
9832
+ this.requireMember(identity2);
9833
+ if (!this.hub.db.prepare(
9834
+ "SELECT 1 FROM wecom_subscriptions WHERE bot_id=? AND user_id=? AND project_id=?"
9835
+ ).get(bot, user, identity2.workspaceId)) {
9836
+ notice("\u6B64\u9879\u76EE\u5DF2\u89E3\u9664\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\uFF0C\u8BF7\u5728\u7F51\u9875\u56DE\u590D\u539F\u6D88\u606F\u3002");
9837
+ return;
9838
+ }
9839
+ this.agents.reply(identity2, String(delivery.source_id), explicit?.[2] ?? text);
9840
+ notice("\u56DE\u590D\u5DF2\u4FDD\u5B58\uFF0C\u7F51\u9875\u6D88\u606F\u5DF2\u540C\u6B65\u3002\u300C\u63D0\u767E\u4E8B\u300D\u4F1A\u7EE7\u7EED\u5904\u7406\u3002");
9841
+ return;
9842
+ }
9843
+ const identity = { memberId: user, workspaceId: String(binding.active_project) };
9844
+ this.requireMember(identity);
9845
+ const subscription = this.hub.db.prepare(
9846
+ "SELECT * FROM wecom_subscriptions WHERE bot_id=? AND user_id=? AND project_id=?"
9847
+ ).get(bot, user, identity.workspaceId);
9848
+ if (!subscription) {
9849
+ notice("\u8BF7\u5148\u5728\u9879\u76EE\u8BBE\u7F6E\u4E2D\u8FDE\u63A5\u4F01\u4E1A\u5FAE\u4FE1\uFF0C\u6216\u53D1\u9001\u201C\u9879\u76EE\u201D\u9009\u62E9\u5176\u4ED6\u5DF2\u8FDE\u63A5\u9879\u76EE\u3002");
9850
+ return;
9851
+ }
9852
+ let chat = subscription.chat_id ? String(subscription.chat_id) : null;
9853
+ if (text === "\u65B0\u5EFA\u5BF9\u8BDD" || !chat) {
9854
+ chat = this.agents.createChat(identity).id;
9855
+ this.hub.db.prepare(
9856
+ "UPDATE wecom_subscriptions SET chat_id=? WHERE bot_id=? AND user_id=? AND project_id=?"
9857
+ ).run(chat, bot, user, identity.workspaceId);
9858
+ if (text === "\u65B0\u5EFA\u5BF9\u8BDD") {
9859
+ notice(`\u5DF2\u5728 ${this.projectName(identity.workspaceId)} \u65B0\u5EFA\u5BF9\u8BDD\uFF0C\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002`);
9860
+ return;
9861
+ }
9862
+ }
9863
+ new AiDefaults(this.hub).resolve(identity.workspaceId);
9864
+ new AgentConfig(this.hub).initialize(identity.workspaceId);
9865
+ const question = msg.quote?.text?.content ? `\u5F15\u7528\u5185\u5BB9\uFF1A
9866
+ ${msg.quote.text.content}
9867
+
9868
+ ${text}` : text;
9869
+ const run = this.agents.ask(identity, question, chat);
9870
+ this.hub.db.prepare("INSERT INTO wecom_requests VALUES(?,?,?,?,?)").run(run.id, bot, msg.from.userid, user, identity.workspaceId);
9871
+ notice("\u5DF2\u6536\u5230\uFF0C\u6B63\u5728\u67E5\u770B\u3002\u56DE\u7B54\u4E5F\u4F1A\u4FDD\u5B58\u5728\u7F51\u9875\u5BF9\u8BDD\u4E2D\u3002");
9872
+ } catch (error) {
9873
+ if (!(error instanceof HubError)) throw error;
9874
+ notice(
9875
+ error.code === "OUTBOX_ARCHIVED" ? "\u8FD9\u6761\u6D88\u606F\u5DF2\u7ECF\u56DE\u590D\u6216\u5F52\u6863\uFF0C\u65E0\u9700\u518D\u6B21\u63D0\u4EA4\u3002" : error.message
9876
+ );
9877
+ }
9878
+ });
9879
+ }
9880
+ url(project, query) {
9881
+ return new SiteRepository(this.hub).config().publicServerUrl.replace(/\/+$/, "") + `/projects/${encodeURIComponent(project)}/assistant?${query}`;
9882
+ }
9883
+ render(project, body, query, reference) {
9884
+ const base = new SiteRepository(this.hub).config().publicServerUrl.replace(/\/+$/, "");
9885
+ body = body.replace(/\]\((\/(?!\/)[^\s)]*)\)/g, (_all, path) => `](${base}${path})`);
9886
+ let shortened = "";
9887
+ let bytes = 0;
9888
+ for (const char of body) {
9889
+ bytes += Buffer.byteLength(char);
9890
+ if (bytes > 17e3) break;
9891
+ shortened += char;
9892
+ }
9893
+ if (shortened !== body) shortened += "\n\n\u2026\u2026\u5B8C\u6574\u5185\u5BB9\u8BF7\u5728\u7F51\u9875\u67E5\u770B\u3002";
9894
+ return `**${this.projectName(project)} \xB7 \u63D0\u767E\u4E8B${reference ? " \xB7 " + reference : ""}**
9895
+
9896
+ ${shortened}
9897
+
9898
+ [\u5728\u7F51\u9875\u67E5\u770B](${this.url(project, query)})${reference ? "\n\n\u8BF7\u5F15\u7528\u672C\u6761\u6D88\u606F\u56DE\u590D\u3002\n" + replyHint : ""}`;
9899
+ }
9900
+ collect() {
9901
+ const bot = this.bot();
9902
+ transaction(this.hub.db, () => {
9903
+ const rows = this.hub.db.prepare(
9904
+ `SELECT o.*,b.external_id,s.user_id FROM project_agent_outbox o
9905
+ JOIN wecom_subscriptions s ON s.project_id=o.project_id AND o.rowid>s.outbox_after
9906
+ JOIN wecom_bindings b ON b.bot_id=s.bot_id AND b.user_id=s.user_id
9907
+ JOIN project_agent_recipients r ON r.message_id=o.id AND r.user_id=s.user_id
9908
+ WHERE s.bot_id=? AND r.archived_at IS NULL AND NOT EXISTS(SELECT 1 FROM wecom_deliveries d WHERE d.bot_id=s.bot_id AND d.external_id=b.external_id AND d.kind='outbox' AND d.source_id=o.id)`
9909
+ ).all(bot);
9910
+ for (const row of rows) {
9911
+ const identity = { memberId: String(row.user_id), workspaceId: String(row.project_id) };
9912
+ try {
9913
+ this.requireMember(identity);
9914
+ } catch {
9915
+ continue;
9916
+ }
9917
+ const ref = "TM-" + randomBytes7(6).toString("hex").toUpperCase();
9918
+ this.queue(
9919
+ bot,
9920
+ String(row.external_id),
9921
+ "outbox",
9922
+ String(row.id),
9923
+ this.render(identity.workspaceId, String(row.body), `message=${row.id}`, ref),
9924
+ identity,
9925
+ ref
9926
+ );
9927
+ }
9928
+ const answers = this.hub.db.prepare(
9929
+ `SELECT r.*,w.external_id,w.user_id,w.project_id FROM wecom_requests w
9930
+ JOIN project_agent_runs r ON r.id=w.run_id WHERE w.bot_id=? AND r.state IN ('succeeded','failed')
9931
+ AND NOT EXISTS(SELECT 1 FROM wecom_deliveries d WHERE d.bot_id=w.bot_id AND d.external_id=w.external_id AND d.kind='answer' AND d.source_id=r.id)`
9932
+ ).all(bot);
9933
+ for (const row of answers) {
9934
+ const body = String(
9935
+ row.answer || (row.state === "failed" ? "\u672C\u6B21\u5904\u7406\u672A\u5B8C\u6210\uFF0C\u8BF7\u5728\u7F51\u9875\u67E5\u770B\u8FD0\u884C\u60C5\u51B5\u3002" : "\u672C\u8F6E\u5904\u7406\u5DF2\u5B8C\u6210\u3002")
9936
+ );
9937
+ this.queue(
9938
+ bot,
9939
+ String(row.external_id),
9940
+ "answer",
9941
+ String(row.id),
9942
+ this.render(String(row.project_id), body, `chat=${row.conversation_id}`),
9943
+ { memberId: String(row.user_id), workspaceId: String(row.project_id) }
9944
+ );
9945
+ }
9946
+ });
9947
+ }
9948
+ valid(delivery) {
9949
+ if (!delivery.user_id) return true;
9950
+ const bound = this.hub.db.prepare("SELECT 1 FROM wecom_bindings WHERE bot_id=? AND external_id=? AND user_id=?").get(delivery.bot_id, delivery.external_id, delivery.user_id);
9951
+ const subscribed = this.hub.db.prepare("SELECT 1 FROM wecom_subscriptions WHERE bot_id=? AND user_id=? AND project_id=?").get(delivery.bot_id, delivery.user_id, delivery.project_id);
9952
+ if (!bound || !subscribed) return false;
9953
+ try {
9954
+ this.requireMember({ memberId: delivery.user_id, workspaceId: delivery.project_id });
9955
+ } catch {
9956
+ return false;
9957
+ }
9958
+ if (delivery.kind === "outbox")
9959
+ return !!this.hub.db.prepare(
9960
+ "SELECT 1 FROM project_agent_recipients WHERE message_id=? AND user_id=? AND archived_at IS NULL"
9961
+ ).get(delivery.source_id, delivery.user_id);
9962
+ return true;
9963
+ }
9964
+ };
9965
+
9966
+ // apps/server/wecom/runtime.ts
9967
+ var quiet = { debug() {
9968
+ }, info() {
9969
+ }, warn() {
9970
+ }, error() {
9971
+ } };
9972
+ var WecomRuntime = class {
9973
+ constructor(hub, factory = (options) => new WSClient(options)) {
9974
+ this.hub = hub;
9975
+ this.factory = factory;
9976
+ this.store = new WecomStore(hub);
9977
+ }
9978
+ hub;
9979
+ factory;
9980
+ owner = randomUUID13();
9981
+ store;
9982
+ client;
9983
+ revision = 0;
9984
+ connected = false;
9985
+ stopped = false;
9986
+ timer;
9987
+ running;
9988
+ start() {
9989
+ this.timer = setInterval(() => void this.tick(), 1e3);
9990
+ this.timer.unref();
9991
+ void this.tick();
9992
+ }
9993
+ status(state, error = null) {
9994
+ if (this.stopped) return;
9995
+ this.hub.db.prepare("UPDATE wecom_runtime SET state=?,error=? WHERE id=1 AND owner=?").run(state, error, this.owner);
9996
+ }
9997
+ own() {
9998
+ return !!this.hub.db.prepare(
9999
+ `INSERT INTO wecom_runtime VALUES(1,?,?,'connecting',NULL)
10000
+ ON CONFLICT(id) DO UPDATE SET owner=excluded.owner,expires_at=excluded.expires_at
10001
+ WHERE owner=excluded.owner OR expires_at<? RETURNING owner`
10002
+ ).get(this.owner, Date.now() + 3e4, Date.now());
10003
+ }
10004
+ tick() {
10005
+ if (this.stopped) return Promise.resolve();
10006
+ if (this.running) return this.running;
10007
+ this.running = this.work().catch(() => this.status("error", "\u4F01\u4E1A\u5FAE\u4FE1\u63A5\u5165\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E\u548C\u670D\u52A1\u72B6\u6001\u3002")).finally(() => {
10008
+ this.running = void 0;
10009
+ });
10010
+ return this.running;
10011
+ }
10012
+ async work() {
10013
+ const config = new WecomConfig(this.hub), row = config.row();
10014
+ if (!row?.enabled) {
10015
+ this.client?.disconnect();
10016
+ this.client = void 0;
10017
+ this.connected = false;
10018
+ this.revision = 0;
10019
+ this.hub.db.prepare("DELETE FROM wecom_runtime WHERE owner=?").run(this.owner);
10020
+ return;
10021
+ }
10022
+ if (!this.own()) {
10023
+ this.client?.disconnect();
10024
+ this.client = void 0;
10025
+ this.connected = false;
10026
+ this.revision = 0;
10027
+ return;
10028
+ }
10029
+ if (!this.client || Number(row.revision) !== this.revision) {
10030
+ this.client?.disconnect();
10031
+ this.connected = false;
10032
+ this.revision = Number(row.revision);
10033
+ const credentials = config.credentials();
10034
+ const client = this.factory({
10035
+ botId: credentials.botId,
10036
+ secret: credentials.secret,
10037
+ logger: quiet,
10038
+ maxReconnectAttempts: -1
10039
+ });
10040
+ this.client = client;
10041
+ this.status("connecting");
10042
+ let displaced = false;
10043
+ client.on("authenticated", () => {
10044
+ if (this.client === client && !this.stopped) {
10045
+ displaced = false;
10046
+ this.connected = true;
10047
+ this.status("connected");
10048
+ }
10049
+ });
10050
+ client.on("disconnected", () => {
10051
+ if (this.client === client && !this.stopped) {
10052
+ this.connected = false;
10053
+ if (!displaced) this.status("disconnected", "\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u7B49\u5F85\u91CD\u65B0\u8FDE\u63A5\u3002");
10054
+ }
10055
+ });
10056
+ client.on("event.disconnected_event", () => {
10057
+ if (this.client === client) {
10058
+ displaced = true;
10059
+ this.connected = false;
10060
+ this.status("error", "\u673A\u5668\u4EBA\u5DF2\u88AB\u5176\u4ED6\u670D\u52A1\u8FDE\u63A5\uFF0C\u8BF7\u505C\u7528\u91CD\u590D\u8FDE\u63A5\u540E\u91CD\u65B0\u4FDD\u5B58\u914D\u7F6E\u3002");
10061
+ }
10062
+ });
10063
+ client.on("error", () => {
10064
+ if (this.client === client)
10065
+ this.status("error", "\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Bot ID\u3001Secret \u548C\u7F51\u7EDC\u3002");
10066
+ });
10067
+ client.on("message", (frame) => {
10068
+ if (this.stopped || this.client !== client) return;
10069
+ try {
10070
+ this.store.receive(frame.body);
10071
+ } catch {
10072
+ this.status("error", "\u6536\u5230\u7684\u6D88\u606F\u6682\u672A\u5904\u7406\uFF0C\u8BF7\u68C0\u67E5\u670D\u52A1\u72B6\u6001\u540E\u91CD\u53D1\u3002");
10073
+ }
10074
+ });
10075
+ client.connect();
10076
+ }
10077
+ if (!this.connected) return;
10078
+ this.store.collect();
10079
+ const deliveries = this.hub.db.prepare(
10080
+ `SELECT * FROM wecom_deliveries WHERE bot_id=? AND state='pending' AND due_at<=? ORDER BY rowid`
10081
+ ).all(String(row.bot_id), Date.now());
10082
+ const targets = /* @__PURE__ */ new Set(), jobs = [];
10083
+ for (const delivery of deliveries) {
10084
+ if (!this.store.valid(delivery)) {
10085
+ this.hub.db.prepare("UPDATE wecom_deliveries SET state='cancelled' WHERE id=?").run(delivery.id);
10086
+ continue;
10087
+ }
10088
+ if (targets.has(delivery.external_id)) continue;
10089
+ targets.add(delivery.external_id);
10090
+ const recent = this.hub.db.prepare(
10091
+ `SELECT COUNT(*) n,MAX(sent_at) last FROM wecom_deliveries
10092
+ WHERE bot_id=? AND external_id=? AND sent_at>?`
10093
+ ).get(delivery.bot_id, delivery.external_id, Date.now() - 36e5);
10094
+ if (Number(recent.n) >= 1e3 || Number(recent.last) > Date.now() - 2100) continue;
10095
+ jobs.push(this.send(delivery));
10096
+ }
10097
+ await Promise.all(jobs);
10098
+ }
10099
+ async send(delivery) {
10100
+ const client = this.client;
10101
+ try {
10102
+ const result = await client.reply(
10103
+ { headers: { req_id: delivery.id } },
10104
+ {
10105
+ chatid: delivery.external_id,
10106
+ chat_type: 1,
10107
+ msgtype: "markdown",
10108
+ markdown: { content: delivery.body }
10109
+ },
10110
+ "aibot_send_msg"
10111
+ );
10112
+ if (result.errcode !== 0) throw new Error("Delivery rejected");
10113
+ this.hub.db.prepare(
10114
+ "UPDATE wecom_deliveries SET state='sent',sent_at=?,error=NULL WHERE id=? AND state='pending'"
10115
+ ).run(Date.now(), delivery.id);
10116
+ } catch {
10117
+ if (this.stopped || this.client !== client) return;
10118
+ const delay4 = Math.min(30 * 6e4, 5e3 * 2 ** Math.min(delivery.attempts, 9)) * (0.75 + Math.random() * 0.5);
10119
+ this.hub.db.prepare(
10120
+ `UPDATE wecom_deliveries SET attempts=attempts+1,due_at=?,error=? WHERE id=? AND state='pending'`
10121
+ ).run(Date.now() + Math.round(delay4), "\u4F01\u4E1A\u5FAE\u4FE1\u6295\u9012\u6682\u672A\u6210\u529F\uFF0C\u5C06\u81EA\u52A8\u91CD\u8BD5\u3002", delivery.id);
10122
+ }
10123
+ }
10124
+ async stop() {
10125
+ this.stopped = true;
10126
+ if (this.timer) clearInterval(this.timer);
10127
+ this.client?.disconnect();
10128
+ await this.running;
10129
+ this.hub.db.prepare("DELETE FROM wecom_runtime WHERE owner=?").run(this.owner);
10130
+ }
10131
+ };
10132
+
10133
+ // apps/server/wecom/routes.ts
10134
+ function registerWecom(server, hub, env, factory) {
10135
+ const config = new WecomConfig(hub), store = new WecomStore(hub), runtime = new WecomRuntime(hub, factory);
10136
+ config.seed(env);
10137
+ server.addHook("onReady", async () => runtime.start());
10138
+ server.addHook("preClose", async () => runtime.stop());
10139
+ server.get("/api/v1/site/wecom", async (req) => {
10140
+ requireSiteAdmin(new SiteRepository(hub).identity(cookieToken(req)));
10141
+ return config.status();
10142
+ });
10143
+ server.put("/api/v1/site/wecom", async (req) => {
10144
+ webMutation(req);
10145
+ requireSiteAdmin(new SiteRepository(hub).identity(cookieToken(req)));
10146
+ config.save(WecomConfigInputSchema.parse(req.body));
10147
+ void runtime.tick();
10148
+ return config.status();
10149
+ });
10150
+ const base = "/api/v1/projects/:projectId/wecom";
10151
+ server.get(base, async (req) => store.binding(authorizeWeb(hub, req)));
10152
+ server.post(`${base}/code`, async (req) => {
10153
+ webMutation(req);
10154
+ return store.code(authorizeWeb(hub, req));
10155
+ });
10156
+ server.delete(base, async (req) => {
10157
+ webMutation(req);
10158
+ return store.unsubscribe(authorizeWeb(hub, req));
10159
+ });
10160
+ }
10161
+
9506
10162
  // apps/server/server.ts
9507
10163
  function buildServer(options) {
9508
10164
  const store = options.dataDir ? new HubStore(options.dataDir) : void 0;
@@ -9524,7 +10180,7 @@ function buildServer(options) {
9524
10180
  ]
9525
10181
  } : false,
9526
10182
  requestIdHeader: false,
9527
- genReqId: () => randomUUID12(),
10183
+ genReqId: () => randomUUID14(),
9528
10184
  bodyLimit: 1024 * 1024,
9529
10185
  requestTimeout: BLOB_TRANSFER_TIMEOUT_MS
9530
10186
  });
@@ -9615,6 +10271,7 @@ function buildServer(options) {
9615
10271
  if (store) {
9616
10272
  registerSiteRoutes(server, store);
9617
10273
  registerClientAccess(server, store);
10274
+ registerWecom(server, store, options.wecomEnv ?? {}, options.wecomFactory);
9618
10275
  registerBootstrapRoutes(server, store);
9619
10276
  registerProjectRoutes(server, store);
9620
10277
  registerAiRoutes(server, store);
@@ -9644,7 +10301,7 @@ function buildServer(options) {
9644
10301
 
9645
10302
  // apps/server/main.ts
9646
10303
  import { homedir } from "node:os";
9647
- import { join as join18, resolve as resolve4 } from "node:path";
10304
+ import { join as join19, resolve as resolve4 } from "node:path";
9648
10305
  import { spawn as spawn4 } from "node:child_process";
9649
10306
  var help = `teammy-server \u2014 the Teammy collaboration hub
9650
10307
 
@@ -9682,7 +10339,7 @@ async function runServerCli(args, version2) {
9682
10339
  options: {
9683
10340
  "data-dir": {
9684
10341
  type: "string",
9685
- default: process.env.TEAMMY_DATA_DIR ?? join18(homedir(), ".teammy", "server")
10342
+ default: process.env.TEAMMY_DATA_DIR ?? join19(homedir(), ".teammy", "server")
9686
10343
  },
9687
10344
  once: { type: "boolean" }
9688
10345
  }
@@ -9701,7 +10358,7 @@ async function runServerCli(args, version2) {
9701
10358
  member: { type: "string" },
9702
10359
  "data-dir": {
9703
10360
  type: "string",
9704
- default: process.env.TEAMMY_DATA_DIR ?? join18(homedir(), ".teammy", "server")
10361
+ default: process.env.TEAMMY_DATA_DIR ?? join19(homedir(), ".teammy", "server")
9705
10362
  }
9706
10363
  }
9707
10364
  });
@@ -9729,7 +10386,7 @@ async function runServerCli(args, version2) {
9729
10386
  port: { type: "string", default: process.env.TEAMMY_PORT ?? "4317" },
9730
10387
  "data-dir": {
9731
10388
  type: "string",
9732
- default: process.env.TEAMMY_DATA_DIR ?? join18(homedir(), ".teammy", "server")
10389
+ default: process.env.TEAMMY_DATA_DIR ?? join19(homedir(), ".teammy", "server")
9733
10390
  },
9734
10391
  "with-worker": { type: "boolean", default: false }
9735
10392
  }
@@ -9751,6 +10408,7 @@ async function runServerCli(args, version2) {
9751
10408
  const server = buildServer({
9752
10409
  version: version2,
9753
10410
  logger: true,
10411
+ wecomEnv: process.env,
9754
10412
  dataDir: resolve4(values["data-dir"]),
9755
10413
  webDir: fileURLToPath5(new URL("./web/", import.meta.url))
9756
10414
  });