@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.
- package/dist/main.js +682 -24
- package/dist/web/assets/Assistant-Dm_p8EZl.js +1 -0
- package/dist/web/assets/{Dashboard-dCu2Cdxd.js → Dashboard-fwW9NxcC.js} +1 -1
- package/dist/web/assets/{Files-cRhoWviM.js → Files-D-KCDWmO.js} +1 -1
- package/dist/web/assets/{Markdown-Bq8P_NBV.js → Markdown-oZagG-wy.js} +1 -1
- package/dist/web/assets/{Sessions-BxHsX1C5.js → Sessions-BQhGiLvz.js} +1 -1
- package/dist/web/assets/{WorkspaceTree-CD94JsaJ.js → WorkspaceTree-B9733pV3.js} +1 -1
- package/dist/web/assets/{file-links-CFCIacLV.js → file-links-CD346_jf.js} +1 -1
- package/dist/web/assets/{index-B-MqU_88.css → index-Be5hGscJ.css} +1 -1
- package/dist/web/assets/index-BiiPuwDi.js +66 -0
- package/dist/web/index.html +2 -2
- package/node_modules/@wecom/aibot-node-sdk/README.md +786 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/api.d.ts +17 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/client.d.ts +217 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/crypto.d.ts +12 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js +1563 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js.map +1 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/index.d.ts +1324 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js +1544 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js.map +1 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/logger.d.ts +14 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/message-handler.d.ts +29 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/api.d.ts +466 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/common.d.ts +30 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/config.d.ts +34 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/event.d.ts +109 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/index.d.ts +10 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/types/message.d.ts +158 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/utils.d.ts +19 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/wecom-crypto/index.d.ts +46 -0
- package/node_modules/@wecom/aibot-node-sdk/dist/ws.d.ts +161 -0
- package/node_modules/@wecom/aibot-node-sdk/package.json +43 -0
- package/node_modules/asynckit/LICENSE +21 -0
- package/node_modules/asynckit/README.md +233 -0
- package/node_modules/asynckit/bench.js +76 -0
- package/node_modules/asynckit/index.js +6 -0
- package/node_modules/asynckit/lib/abort.js +29 -0
- package/node_modules/asynckit/lib/async.js +34 -0
- package/node_modules/asynckit/lib/defer.js +26 -0
- package/node_modules/asynckit/lib/iterate.js +75 -0
- package/node_modules/asynckit/lib/readable_asynckit.js +91 -0
- package/node_modules/asynckit/lib/readable_parallel.js +25 -0
- package/node_modules/asynckit/lib/readable_serial.js +25 -0
- package/node_modules/asynckit/lib/readable_serial_ordered.js +29 -0
- package/node_modules/asynckit/lib/state.js +37 -0
- package/node_modules/asynckit/lib/streamify.js +141 -0
- package/node_modules/asynckit/lib/terminator.js +29 -0
- package/node_modules/asynckit/package.json +63 -0
- package/node_modules/asynckit/parallel.js +43 -0
- package/node_modules/asynckit/serial.js +17 -0
- package/node_modules/asynckit/serialOrdered.js +75 -0
- package/node_modules/asynckit/stream.js +21 -0
- package/node_modules/axios/CHANGELOG.md +1934 -0
- package/node_modules/axios/LICENSE +7 -0
- package/node_modules/axios/MIGRATION_GUIDE.md +877 -0
- package/node_modules/axios/README.md +2786 -0
- package/node_modules/axios/dist/axios.js +6460 -0
- package/node_modules/axios/dist/axios.min.js +5 -0
- package/node_modules/axios/dist/axios.min.js.map +1 -0
- package/node_modules/axios/dist/browser/axios.cjs +6509 -0
- package/node_modules/axios/dist/esm/axios.js +6530 -0
- package/node_modules/axios/dist/esm/axios.min.js +3 -0
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -0
- package/node_modules/axios/dist/node/axios.cjs +7491 -0
- package/node_modules/axios/index.d.cts +785 -0
- package/node_modules/axios/index.d.ts +804 -0
- package/node_modules/axios/index.js +45 -0
- package/node_modules/axios/lib/adapters/README.md +36 -0
- package/node_modules/axios/lib/adapters/adapters.js +132 -0
- package/node_modules/axios/lib/adapters/fetch.js +749 -0
- package/node_modules/axios/lib/adapters/http.js +1609 -0
- package/node_modules/axios/lib/adapters/xhr.js +384 -0
- package/node_modules/axios/lib/axios.js +89 -0
- package/node_modules/axios/lib/cancel/CancelToken.js +135 -0
- package/node_modules/axios/lib/cancel/CanceledError.js +22 -0
- package/node_modules/axios/lib/cancel/isCancel.js +5 -0
- package/node_modules/axios/lib/core/Axios.js +361 -0
- package/node_modules/axios/lib/core/AxiosError.js +278 -0
- package/node_modules/axios/lib/core/AxiosHeaders.js +487 -0
- package/node_modules/axios/lib/core/InterceptorManager.js +182 -0
- package/node_modules/axios/lib/core/README.md +8 -0
- package/node_modules/axios/lib/core/assertParamsAcyclic.js +49 -0
- package/node_modules/axios/lib/core/buildFullPath.js +76 -0
- package/node_modules/axios/lib/core/createMultipartBody.js +37 -0
- package/node_modules/axios/lib/core/dispatchRequest.js +115 -0
- package/node_modules/axios/lib/core/mergeConfig.js +237 -0
- package/node_modules/axios/lib/core/methodList.js +17 -0
- package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
- package/node_modules/axios/lib/core/settle.js +27 -0
- package/node_modules/axios/lib/core/transformData.js +28 -0
- package/node_modules/axios/lib/defaults/index.js +178 -0
- package/node_modules/axios/lib/defaults/transitional.js +11 -0
- package/node_modules/axios/lib/env/README.md +3 -0
- package/node_modules/axios/lib/env/classes/FormData.js +2 -0
- package/node_modules/axios/lib/env/data.js +1 -0
- package/node_modules/axios/lib/helpers/AxiosTransformStream.js +165 -0
- package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
- package/node_modules/axios/lib/helpers/Http2Sessions.js +122 -0
- package/node_modules/axios/lib/helpers/HttpStatusCode.js +88 -0
- package/node_modules/axios/lib/helpers/README.md +7 -0
- package/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
- package/node_modules/axios/lib/helpers/bind.js +14 -0
- package/node_modules/axios/lib/helpers/buildURL.js +69 -0
- package/node_modules/axios/lib/helpers/callbackify.js +18 -0
- package/node_modules/axios/lib/helpers/combineURLs.js +23 -0
- package/node_modules/axios/lib/helpers/composeSignals.js +71 -0
- package/node_modules/axios/lib/helpers/cookies.js +88 -0
- package/node_modules/axios/lib/helpers/deprecatedMethod.js +31 -0
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +193 -0
- package/node_modules/axios/lib/helpers/formDataToBlob.js +113 -0
- package/node_modules/axios/lib/helpers/formDataToJSON.js +149 -0
- package/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
- package/node_modules/axios/lib/helpers/fromDataURI.js +75 -0
- package/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
- package/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
- package/node_modules/axios/lib/helpers/isURLSameOrigin.js +11 -0
- package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
- package/node_modules/axios/lib/helpers/null.js +2 -0
- package/node_modules/axios/lib/helpers/parseHeaders.js +72 -0
- package/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
- package/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
- package/node_modules/axios/lib/helpers/readBlob.js +15 -0
- package/node_modules/axios/lib/helpers/resolveConfig.js +120 -0
- package/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
- package/node_modules/axios/lib/helpers/shouldBypassProxy.js +520 -0
- package/node_modules/axios/lib/helpers/speedometer.js +55 -0
- package/node_modules/axios/lib/helpers/spread.js +28 -0
- package/node_modules/axios/lib/helpers/throttle.js +45 -0
- package/node_modules/axios/lib/helpers/toFormData.js +279 -0
- package/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
- package/node_modules/axios/lib/helpers/trackStream.js +89 -0
- package/node_modules/axios/lib/helpers/validator.js +112 -0
- package/node_modules/axios/lib/platform/browser/classes/Blob.js +3 -0
- package/node_modules/axios/lib/platform/browser/classes/FormData.js +3 -0
- package/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +4 -0
- package/node_modules/axios/lib/platform/browser/index.js +13 -0
- package/node_modules/axios/lib/platform/common/utils.js +52 -0
- package/node_modules/axios/lib/platform/index.js +7 -0
- package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
- package/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
- package/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
- package/node_modules/axios/lib/platform/node/index.js +37 -0
- package/node_modules/axios/lib/utils.js +1201 -0
- package/node_modules/axios/node_modules/agent-base/README.md +145 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.d.ts +78 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.js +203 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.js.map +1 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.d.ts +4 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js +18 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js.map +1 -0
- package/node_modules/axios/node_modules/agent-base/package.json +64 -0
- package/node_modules/axios/node_modules/agent-base/src/index.ts +345 -0
- package/node_modules/axios/node_modules/agent-base/src/promisify.ts +33 -0
- package/node_modules/axios/node_modules/https-proxy-agent/README.md +137 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.d.ts +30 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js +177 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.d.ts +23 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js +14 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/package.json +56 -0
- package/node_modules/axios/package.json +202 -0
- package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- package/node_modules/call-bind-apply-helpers/README.md +62 -0
- package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- package/node_modules/call-bind-apply-helpers/index.js +15 -0
- package/node_modules/call-bind-apply-helpers/package.json +85 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- package/node_modules/combined-stream/License +19 -0
- package/node_modules/combined-stream/Readme.md +138 -0
- package/node_modules/combined-stream/lib/combined_stream.js +208 -0
- package/node_modules/combined-stream/package.json +25 -0
- package/node_modules/delayed-stream/.npmignore +1 -0
- package/node_modules/delayed-stream/License +19 -0
- package/node_modules/delayed-stream/Makefile +7 -0
- package/node_modules/delayed-stream/Readme.md +141 -0
- package/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
- package/node_modules/delayed-stream/package.json +27 -0
- package/node_modules/dunder-proto/.eslintrc +5 -0
- package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- package/node_modules/dunder-proto/.nycrc +13 -0
- package/node_modules/dunder-proto/CHANGELOG.md +24 -0
- package/node_modules/dunder-proto/LICENSE +21 -0
- package/node_modules/dunder-proto/README.md +54 -0
- package/node_modules/dunder-proto/get.d.ts +5 -0
- package/node_modules/dunder-proto/get.js +30 -0
- package/node_modules/dunder-proto/package.json +76 -0
- package/node_modules/dunder-proto/set.d.ts +5 -0
- package/node_modules/dunder-proto/set.js +35 -0
- package/node_modules/dunder-proto/test/get.js +34 -0
- package/node_modules/dunder-proto/test/index.js +4 -0
- package/node_modules/dunder-proto/test/set.js +50 -0
- package/node_modules/dunder-proto/tsconfig.json +9 -0
- package/node_modules/es-define-property/.eslintrc +13 -0
- package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- package/node_modules/es-define-property/.nycrc +9 -0
- package/node_modules/es-define-property/CHANGELOG.md +29 -0
- package/node_modules/es-define-property/LICENSE +21 -0
- package/node_modules/es-define-property/README.md +49 -0
- package/node_modules/es-define-property/index.d.ts +3 -0
- package/node_modules/es-define-property/index.js +14 -0
- package/node_modules/es-define-property/package.json +81 -0
- package/node_modules/es-define-property/test/index.js +56 -0
- package/node_modules/es-define-property/tsconfig.json +10 -0
- package/node_modules/es-errors/.eslintrc +5 -0
- package/node_modules/es-errors/.github/FUNDING.yml +12 -0
- package/node_modules/es-errors/CHANGELOG.md +40 -0
- package/node_modules/es-errors/LICENSE +21 -0
- package/node_modules/es-errors/README.md +55 -0
- package/node_modules/es-errors/eval.d.ts +3 -0
- package/node_modules/es-errors/eval.js +4 -0
- package/node_modules/es-errors/index.d.ts +3 -0
- package/node_modules/es-errors/index.js +4 -0
- package/node_modules/es-errors/package.json +80 -0
- package/node_modules/es-errors/range.d.ts +3 -0
- package/node_modules/es-errors/range.js +4 -0
- package/node_modules/es-errors/ref.d.ts +3 -0
- package/node_modules/es-errors/ref.js +4 -0
- package/node_modules/es-errors/syntax.d.ts +3 -0
- package/node_modules/es-errors/syntax.js +4 -0
- package/node_modules/es-errors/test/index.js +19 -0
- package/node_modules/es-errors/tsconfig.json +49 -0
- package/node_modules/es-errors/type.d.ts +3 -0
- package/node_modules/es-errors/type.js +4 -0
- package/node_modules/es-errors/uri.d.ts +3 -0
- package/node_modules/es-errors/uri.js +4 -0
- package/node_modules/es-object-atoms/.eslintrc +16 -0
- package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- package/node_modules/es-object-atoms/CHANGELOG.md +44 -0
- package/node_modules/es-object-atoms/LICENSE +21 -0
- package/node_modules/es-object-atoms/README.md +63 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- package/node_modules/es-object-atoms/ToObject.js +10 -0
- package/node_modules/es-object-atoms/index.d.ts +3 -0
- package/node_modules/es-object-atoms/index.js +4 -0
- package/node_modules/es-object-atoms/isObject.d.ts +3 -0
- package/node_modules/es-object-atoms/isObject.js +6 -0
- package/node_modules/es-object-atoms/package.json +79 -0
- package/node_modules/es-object-atoms/test/index.js +38 -0
- package/node_modules/es-object-atoms/tsconfig.json +7 -0
- package/node_modules/es-set-tostringtag/.eslintrc +13 -0
- package/node_modules/es-set-tostringtag/.nycrc +9 -0
- package/node_modules/es-set-tostringtag/CHANGELOG.md +67 -0
- package/node_modules/es-set-tostringtag/LICENSE +21 -0
- package/node_modules/es-set-tostringtag/README.md +53 -0
- package/node_modules/es-set-tostringtag/index.d.ts +10 -0
- package/node_modules/es-set-tostringtag/index.js +35 -0
- package/node_modules/es-set-tostringtag/package.json +78 -0
- package/node_modules/es-set-tostringtag/test/index.js +85 -0
- package/node_modules/es-set-tostringtag/tsconfig.json +9 -0
- package/node_modules/eventemitter3/LICENSE +21 -0
- package/node_modules/eventemitter3/README.md +85 -0
- package/node_modules/eventemitter3/dist/eventemitter3.esm.js +355 -0
- package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js +1 -0
- package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js.map +1 -0
- package/node_modules/eventemitter3/dist/eventemitter3.umd.js +363 -0
- package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js +1 -0
- package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js.map +1 -0
- package/node_modules/eventemitter3/index.d.ts +135 -0
- package/node_modules/eventemitter3/index.js +336 -0
- package/node_modules/eventemitter3/index.mjs +4 -0
- package/node_modules/eventemitter3/package.json +62 -0
- package/node_modules/follow-redirects/LICENSE +18 -0
- package/node_modules/follow-redirects/README.md +183 -0
- package/node_modules/follow-redirects/debug.js +15 -0
- package/node_modules/follow-redirects/http.js +1 -0
- package/node_modules/follow-redirects/https.js +1 -0
- package/node_modules/follow-redirects/index.js +714 -0
- package/node_modules/follow-redirects/package.json +58 -0
- package/node_modules/form-data/CHANGELOG.md +686 -0
- package/node_modules/form-data/License +19 -0
- package/node_modules/form-data/README.md +355 -0
- package/node_modules/form-data/index.d.ts +62 -0
- package/node_modules/form-data/lib/browser.js +4 -0
- package/node_modules/form-data/lib/form_data.js +506 -0
- package/node_modules/form-data/lib/populate.js +10 -0
- package/node_modules/form-data/package.json +82 -0
- package/node_modules/function-bind/.eslintrc +21 -0
- package/node_modules/function-bind/.github/FUNDING.yml +12 -0
- package/node_modules/function-bind/.github/SECURITY.md +3 -0
- package/node_modules/function-bind/.nycrc +13 -0
- package/node_modules/function-bind/CHANGELOG.md +136 -0
- package/node_modules/function-bind/LICENSE +20 -0
- package/node_modules/function-bind/README.md +46 -0
- package/node_modules/function-bind/implementation.js +84 -0
- package/node_modules/function-bind/index.js +5 -0
- package/node_modules/function-bind/package.json +87 -0
- package/node_modules/function-bind/test/.eslintrc +9 -0
- package/node_modules/function-bind/test/index.js +252 -0
- package/node_modules/get-intrinsic/.eslintrc +42 -0
- package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/node_modules/get-intrinsic/.nycrc +9 -0
- package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- package/node_modules/get-intrinsic/LICENSE +21 -0
- package/node_modules/get-intrinsic/README.md +71 -0
- package/node_modules/get-intrinsic/index.js +378 -0
- package/node_modules/get-intrinsic/package.json +97 -0
- package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- package/node_modules/get-proto/.eslintrc +10 -0
- package/node_modules/get-proto/.github/FUNDING.yml +12 -0
- package/node_modules/get-proto/.nycrc +9 -0
- package/node_modules/get-proto/CHANGELOG.md +21 -0
- package/node_modules/get-proto/LICENSE +21 -0
- package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- package/node_modules/get-proto/README.md +50 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- package/node_modules/get-proto/index.d.ts +5 -0
- package/node_modules/get-proto/index.js +27 -0
- package/node_modules/get-proto/package.json +81 -0
- package/node_modules/get-proto/test/index.js +68 -0
- package/node_modules/get-proto/tsconfig.json +9 -0
- package/node_modules/gopd/.eslintrc +16 -0
- package/node_modules/gopd/.github/FUNDING.yml +12 -0
- package/node_modules/gopd/CHANGELOG.md +45 -0
- package/node_modules/gopd/LICENSE +21 -0
- package/node_modules/gopd/README.md +40 -0
- package/node_modules/gopd/gOPD.d.ts +1 -0
- package/node_modules/gopd/gOPD.js +4 -0
- package/node_modules/gopd/index.d.ts +5 -0
- package/node_modules/gopd/index.js +15 -0
- package/node_modules/gopd/package.json +77 -0
- package/node_modules/gopd/test/index.js +36 -0
- package/node_modules/gopd/tsconfig.json +9 -0
- package/node_modules/has-symbols/.eslintrc +11 -0
- package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/node_modules/has-symbols/.nycrc +9 -0
- package/node_modules/has-symbols/CHANGELOG.md +91 -0
- package/node_modules/has-symbols/LICENSE +21 -0
- package/node_modules/has-symbols/README.md +46 -0
- package/node_modules/has-symbols/index.d.ts +3 -0
- package/node_modules/has-symbols/index.js +14 -0
- package/node_modules/has-symbols/package.json +111 -0
- package/node_modules/has-symbols/shams.d.ts +3 -0
- package/node_modules/has-symbols/shams.js +45 -0
- package/node_modules/has-symbols/test/index.js +22 -0
- package/node_modules/has-symbols/test/shams/core-js.js +29 -0
- package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- package/node_modules/has-symbols/test/tests.js +58 -0
- package/node_modules/has-symbols/tsconfig.json +10 -0
- package/node_modules/has-tostringtag/.eslintrc +5 -0
- package/node_modules/has-tostringtag/.github/FUNDING.yml +12 -0
- package/node_modules/has-tostringtag/.nycrc +13 -0
- package/node_modules/has-tostringtag/CHANGELOG.md +42 -0
- package/node_modules/has-tostringtag/LICENSE +21 -0
- package/node_modules/has-tostringtag/README.md +46 -0
- package/node_modules/has-tostringtag/index.d.ts +3 -0
- package/node_modules/has-tostringtag/index.js +8 -0
- package/node_modules/has-tostringtag/package.json +108 -0
- package/node_modules/has-tostringtag/shams.d.ts +3 -0
- package/node_modules/has-tostringtag/shams.js +8 -0
- package/node_modules/has-tostringtag/test/index.js +21 -0
- package/node_modules/has-tostringtag/test/shams/core-js.js +31 -0
- package/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +30 -0
- package/node_modules/has-tostringtag/test/tests.js +15 -0
- package/node_modules/has-tostringtag/tsconfig.json +49 -0
- package/node_modules/hasown/.github/FUNDING.yml +12 -0
- package/node_modules/hasown/.nycrc +13 -0
- package/node_modules/hasown/CHANGELOG.md +58 -0
- package/node_modules/hasown/LICENSE +21 -0
- package/node_modules/hasown/README.md +40 -0
- package/node_modules/hasown/eslint.config.mjs +6 -0
- package/node_modules/hasown/index.d.ts +3 -0
- package/node_modules/hasown/index.js +8 -0
- package/node_modules/hasown/package.json +91 -0
- package/node_modules/hasown/tsconfig.json +6 -0
- package/node_modules/math-intrinsics/.eslintrc +16 -0
- package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- package/node_modules/math-intrinsics/LICENSE +21 -0
- package/node_modules/math-intrinsics/README.md +50 -0
- package/node_modules/math-intrinsics/abs.d.ts +1 -0
- package/node_modules/math-intrinsics/abs.js +4 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- package/node_modules/math-intrinsics/floor.d.ts +1 -0
- package/node_modules/math-intrinsics/floor.js +4 -0
- package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- package/node_modules/math-intrinsics/isFinite.js +12 -0
- package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/isInteger.js +16 -0
- package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- package/node_modules/math-intrinsics/isNaN.js +6 -0
- package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- package/node_modules/math-intrinsics/max.d.ts +1 -0
- package/node_modules/math-intrinsics/max.js +4 -0
- package/node_modules/math-intrinsics/min.d.ts +1 -0
- package/node_modules/math-intrinsics/min.js +4 -0
- package/node_modules/math-intrinsics/mod.d.ts +3 -0
- package/node_modules/math-intrinsics/mod.js +9 -0
- package/node_modules/math-intrinsics/package.json +86 -0
- package/node_modules/math-intrinsics/pow.d.ts +1 -0
- package/node_modules/math-intrinsics/pow.js +4 -0
- package/node_modules/math-intrinsics/round.d.ts +1 -0
- package/node_modules/math-intrinsics/round.js +4 -0
- package/node_modules/math-intrinsics/sign.d.ts +3 -0
- package/node_modules/math-intrinsics/sign.js +11 -0
- package/node_modules/math-intrinsics/test/index.js +192 -0
- package/node_modules/math-intrinsics/tsconfig.json +3 -0
- package/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-db/package.json +60 -0
- package/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/mime-types/README.md +113 -0
- package/node_modules/mime-types/index.js +188 -0
- package/node_modules/mime-types/package.json +44 -0
- package/node_modules/proxy-from-env/LICENSE +20 -0
- package/node_modules/proxy-from-env/README.md +163 -0
- package/node_modules/proxy-from-env/index.cjs +105 -0
- package/node_modules/proxy-from-env/index.js +103 -0
- package/node_modules/proxy-from-env/package.json +43 -0
- package/package.json +2 -1
- package/dist/web/assets/Assistant-DSQAdSiW.js +0 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
2325
|
+
for (const [path, hash3] of Object.entries(next)) {
|
|
2326
2326
|
signal.throwIfAborted();
|
|
2327
|
-
if (this.current[path] ===
|
|
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: "" },
|
|
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((
|
|
2963
|
+
return hashes.filter((hash3) => !query.get(identity.workspaceId, hash3));
|
|
2964
2964
|
}
|
|
2965
|
-
async upload(authorization, device,
|
|
2965
|
+
async upload(authorization, device, hash3, bytes) {
|
|
2966
2966
|
this.hub.authorize(authorization, device);
|
|
2967
|
-
if (createHash5("sha256").update(bytes).digest("hex") !== HashSchema.parse(
|
|
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,
|
|
2977
|
-
if (this.missing(identity, [
|
|
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(
|
|
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
|
|
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:
|
|
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),
|
|
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:
|
|
9014
|
-
const bytes = await files.download(authorizeRead(store, request),
|
|
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: () =>
|
|
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
|
|
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 ??
|
|
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 ??
|
|
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 ??
|
|
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
|
});
|