@zaofan/dsh-qqbot 1.8.6 → 1.9.2

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 (76) hide show
  1. package/README.md +114 -27
  2. package/README_EN.md +122 -8
  3. package/dist/features/ext-capabilities.d.ts +85 -0
  4. package/dist/features/ext-capabilities.d.ts.map +1 -1
  5. package/dist/features/ext-capabilities.js +4 -0
  6. package/dist/features/ext-capabilities.js.map +1 -1
  7. package/dist/features/ext-hooks.d.ts +84 -0
  8. package/dist/features/ext-hooks.d.ts.map +1 -0
  9. package/dist/features/ext-hooks.js +299 -0
  10. package/dist/features/ext-hooks.js.map +1 -0
  11. package/dist/features/ext-inbound-context.d.ts +202 -0
  12. package/dist/features/ext-inbound-context.d.ts.map +1 -0
  13. package/dist/features/ext-inbound-context.js +724 -0
  14. package/dist/features/ext-inbound-context.js.map +1 -0
  15. package/dist/features/ext-inbound-state.d.ts +153 -0
  16. package/dist/features/ext-inbound-state.d.ts.map +1 -0
  17. package/dist/features/ext-inbound-state.js +419 -0
  18. package/dist/features/ext-inbound-state.js.map +1 -0
  19. package/dist/features/ext-inbound.d.ts +117 -0
  20. package/dist/features/ext-inbound.d.ts.map +1 -0
  21. package/dist/features/ext-inbound.js +518 -0
  22. package/dist/features/ext-inbound.js.map +1 -0
  23. package/dist/features/ext-reload.d.ts +22 -0
  24. package/dist/features/ext-reload.d.ts.map +1 -1
  25. package/dist/features/ext-reload.js +32 -0
  26. package/dist/features/ext-reload.js.map +1 -1
  27. package/dist/features/extension-store.d.ts +13 -0
  28. package/dist/features/extension-store.d.ts.map +1 -1
  29. package/dist/features/extension-store.js +76 -18
  30. package/dist/features/extension-store.js.map +1 -1
  31. package/dist/gateway/bootstrap.d.ts +14 -1
  32. package/dist/gateway/bootstrap.d.ts.map +1 -1
  33. package/dist/gateway/bootstrap.js +61 -2
  34. package/dist/gateway/bootstrap.js.map +1 -1
  35. package/dist/gateway/debounce.d.ts +43 -1
  36. package/dist/gateway/debounce.d.ts.map +1 -1
  37. package/dist/gateway/debounce.js +71 -35
  38. package/dist/gateway/debounce.js.map +1 -1
  39. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  40. package/dist/gateway/middleware-setup.js +88 -1
  41. package/dist/gateway/middleware-setup.js.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +49 -9
  44. package/dist/index.js.map +1 -1
  45. package/dist/session/session-manager.d.ts.map +1 -1
  46. package/dist/session/session-manager.js +7 -3
  47. package/dist/session/session-manager.js.map +1 -1
  48. package/dist/session/surface-guard.d.ts +1 -1
  49. package/dist/shared/index.d.ts +1 -1
  50. package/dist/shared/index.d.ts.map +1 -1
  51. package/dist/shared/index.js +1 -1
  52. package/dist/shared/index.js.map +1 -1
  53. package/dist/shared/utils.d.ts +40 -0
  54. package/dist/shared/utils.d.ts.map +1 -1
  55. package/dist/shared/utils.js +59 -2
  56. package/dist/shared/utils.js.map +1 -1
  57. package/dist/transport/inbound.d.ts.map +1 -1
  58. package/dist/transport/inbound.js +23 -3
  59. package/dist/transport/inbound.js.map +1 -1
  60. package/docs/USER-GUIDE.md +93 -36
  61. package/docs/botplay-contract.md +2 -0
  62. package/examples/ext-hooks/README.md +95 -0
  63. package/examples/ext-hooks/hello-hook.mjs +54 -0
  64. package/examples/ext-hooks/session-watch-hook.mjs +119 -0
  65. package/examples/ext-inbound/README.md +230 -0
  66. package/examples/ext-inbound/class-advisor.mjs +306 -0
  67. package/examples/ext-inbound/no-wake-on-child-quote.mjs +192 -0
  68. package/examples/ext-tools/README.md +22 -0
  69. package/examples/ext-tools/lib/preset_resolve.mjs +85 -0
  70. package/examples/ext-tools/lib/session_watch_lib.mjs +350 -0
  71. package/examples/ext-tools/session_create.mjs +201 -0
  72. package/examples/ext-tools/session_send.mjs +141 -0
  73. package/examples/ext-tools/session_watch.mjs +93 -0
  74. package/examples/ext-tools/sessions_list.mjs +180 -0
  75. package/package.json +141 -141
  76. package/settings-host.js +22 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ext-inbound-context.js","sourceRoot":"","sources":["../../src/features/ext-inbound-context.ts"],"names":[],"mappings":"AAoEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,qDAAqD;AACrD,sDAAsD;AACtD,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAoB,MAAM,4BAA4B,CAAC;AACjF,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,OAAO,IAAI,YAAY,EACvB,UAAU,IAAI,eAAe,EAC7B,QAAQ,IAAI,aAAa,EACzB,eAAe,EACf,YAAY,EACZ,UAAU,IAAI,eAAe,EAC7B,aAAa,GAGd,MAAM,wBAAwB,CAAC;AAqGhC,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEtD,2CAA2C;AAC3C,MAAM,UAAU,gBAAgB,CAAC,GAAsB,EAAE,GAAc;IACrE,MAAM,GAAG,GAAG,GAAwB,CAAC;IACrC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG;YACF,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,KAAK,EAAE,IAAI,GAAG,EAAU;YACxB,MAAM,EAAE,IAAI,GAAG,EAAU;SAC1B,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,yDAAyD;QACzD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;YAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QACnE,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK;YAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM;YAAE,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzE,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY;YAAE,CAAC,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACrF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,SAAS,CAAC,GAAsB;IAC9C,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAwB,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAsB,EACtB,GAAc,EACd,GAAmC,EACnC,KAA2B;IAE3B,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,iEAAiE;AACjE,qBAAqB;AACrB,iEAAiE;AAEjE,uCAAuC;AACvC,SAAS,GAAG,CAAC,CAAgB;IAC3B,OAAO,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC;AACxD,CAAC;AAED,8BAA8B;AAC9B,SAAS,IAAI,CAAC,CAAgB,EAAE,GAAW;IACzC,IAAI,CAAC;QAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AACxF,CAAC;AAED,uCAAuC;AACvC,SAAS,QAAQ,CAAC,CAAgB,EAAE,GAAW,EAAE,GAAW;IAC1D,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC9B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,CAAgB;IAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,iDAAiD,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2BAA2B;AAC3B,SAAS,KAAK,CAAC,CAAgB,EAAE,KAAwC;IACvE,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO;QACvB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC;AAED,mBAAmB;AACnB,SAAS,QAAQ,CAAC,GAAsB;IACtC,IAAI,CAAC;QAAC,OAAO,MAAM,CAAE,GAAG,CAAC,OAA8C,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClH,CAAC;AAED,aAAa;AACb,SAAS,MAAM,CAAC,GAAsB;IACpC,IAAI,CAAC;QAAC,OAAO,MAAM,CAAE,GAAG,CAAC,OAA6C,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAChH,CAAC;AAED,mFAAmF;AACnF,SAAS,OAAO,CAAC,CAAgB,EAAE,EAAU;IAC3C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,uEAAuE;AACvE,SAAS,iBAAiB,CAAC,GAAsB,EAAE,KAAyB;IAC1E,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,GAAG,CAAC,OAIb,CAAC;QACF,IAAI,MAAM,CAAC,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC,KAAK,yBAAyB;YAAE,OAAO,IAAI,CAAC;QAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1F,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,sBAAsB,CAAC,OAAe,EAAE,KAAyB;IACxE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,8DAA8D;AAC9D,SAAS,YAAY,CAAmB,IAAa;IACnD,MAAM,CAAC,GAAG,CAAC,GAAM,EAAE,CAAC,IAAI,EAAE,CAAkB,CAAC;IAC7C,IAAI,CAAC;QAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,0DAA0D;AAC1D,SAAS,QAAQ,CAAC,GAAsB;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAI,GAAG,CAAC,KAAoF,EAAE,KAAK,CAAC;QAC3G,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,gEAAgE;QAChE,uCAAuC;QACvC,mDAAmD;QACnD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpD,+CAA+C;QAC/C,qEAAqE;QACrE,qCAAqC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;YACtC,CAAC,CAAC,MAAM,CAAE,GAAG,CAAC,OAAqC,CAAC,WAAW,IAAI,EAAE,CAAC;YACtE,CAAC,CAAC,MAAM,CAAE,GAAG,CAAC,OAAkC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,OAAO;AACP,iEAAiE;AAEjE,2DAA2D;AAC3D,SAAS,UAAU,CAAC,GAAsB,EAAE,CAAgB,EAAE,IAA0B;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,sCAAsC;QACtC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,EAAE,oEAAoE,CAAC,CAAC;YAC9E,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,iBAAiB,GAAG,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,qBAAqB;QACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,EAAE,YAAY,MAAM,4BAA4B,CAAC,CAAC;YACxD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YACpF,CAAC,CAAC,iBAAiB,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO;QACP,MAAM,IAAI,GAAG,uBAAuB,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,EAAE,qBAAqB,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;YACxD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACtF,CAAC,CAAC,iBAAiB,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACxB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,OAAO,CAAC,GAAsB,EAAE,CAAgB,EAAE,IAAyC;IAClG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC;YACrD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAgC,CAAC,OAAO,GAAG,GAAG,CAAC;QACpD,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,CAAC,EAAE;YACP,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;YACrB,MAAM,EAAE,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAClE,IAAI,EAAE,KAAK,GAAG,EAAE;YAChB,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;SAChE,CAAC,CAAC;QACH,iCAAiC;QACjC,IAAI,CAAC;YACH,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7G,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8DAA8D;AAE9D;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,GAAsB,EAAE,CAAgB;IACjE,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAoD,EAAE,QAAQ,CAAC;IACrF,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,IAAI,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,GAAsB,EACtB,CAAgB,EAChB,GAAY;IAEZ,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAClF,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,GAA2C,CAAC;QACtD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAG,qBAAqB;QAC5F,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,CAAU,YAAY;QACpF,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;YACrE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wCAAwC;AACxC,SAAS,cAAc,CAAC,GAAsB,EAAE,CAAgB;IAC9D,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;IACnC,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAS,UAAU,CAAC,GAAsB,EAAE,CAAgB,EAAE,GAAa;IACzE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,EAAE,2FAA2F;gBACjG,cAAc,CAAC,CAAC;YAClB,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACrF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAEvB,uBAAuB;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,CAAC,EAAE,uCAAuC,CAAC,CAAC;YACjD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC3F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;YAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;YACtG,OAAO,IAAI,CAAC,CAAG,iCAAiC;QAClD,CAAC;QAED,+DAA+D;QAC/D,MAAM,IAAI,GAAG,uBAAuB,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,EAAE,qBAAqB,IAAI,CAAC,MAAM,YAAY;gBAClD,oDAAoD,CAAC,CAAC;YACxD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAI,KAA0C,EAAE,MAAM,CAAC;QACnE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,QAAQ,CACN,CAAC,EAAE,iBAAiB,EACpB,0DAA0D;gBAC1D,gEAAgE,CACjE,CAAC;YACF,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uEAAuE;QACvE,4EAA4E;QAC5E,+CAA+C;QAC/C,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACpG,MAA+B,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAElD,CAAC,CAAC,UAAU,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAoB,qCAAqC;QACjF,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACzG,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,SAAS,SAAS,CAAC,GAAsB,EAAE,CAAgB,EAAE,IAA0B;IACrF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,MAAM,EAAE,GAAG,GAAG,CAAC,KAAgC,CAAC;QAChD,EAAE,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC7B,IAAI,MAAM;YAAE,EAAE,CAAC,wBAAwB,GAAG,MAAM,CAAC;QACjD,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,EAAE;YACP,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;YACrB,MAAM;YACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;YACjB,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B;SACpE,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,MAAM,CAAC,GAAsB,EAAE,CAAgB,EAAE,IAA4C;IACpG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACrG,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,CAAC,EAAE,sDAAsD,CAAC,CAAC;YAChE,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,EAAE,uEAAuE,CAAC,CAAC;YACjF,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,KAA6D,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC;QAC9B,IAAI,EAAE,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ;YAAE,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;;YAC5E,EAAE,CAAC,OAAO,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClE,KAAK,CAAC,CAAC,EAAE;YACP,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;YACrB,MAAM;YACN,IAAI,EAAE,WAAW,IAAI,EAAE;YACvB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,SAAS,QAAQ,CACf,GAAsB,EACtB,CAAgB,EAChB,IAAsE;IAEtE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,IAAI,CAAC,CAAC,EAAE,6CAA6C,CAAC,CAAC;YACvD,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YACzC,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,uBAAuB,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,EAAE,mBAAmB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE;YAC1E,EAAE;YACF,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SAC/D,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACxB,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,CAAC,EAAE;YACP,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,EAAE;YACV,MAAM;YACN,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE;YAC3E,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,SAAS,UAAU,CAAC,GAAsB,EAAE,CAAgB,EAAE,IAAsB;IAClF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/E,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,EAAE,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,SAAS,OAAO,CAAC,GAAsB,EAAE,CAAgB,EAAE,EAAW;IACpE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qBAAqB;AACrB,SAAS,UAAU,CAAC,IAAuB,EAAE,CAAgB;IAC3D,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1B,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,SAAS,KAAK,CAAC,IAAuB,EAAE,CAAgB,EAAE,GAAW;IACnE,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACjC,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,SAAS,KAAK,CAAC,IAAuB,EAAE,CAAgB,EAAE,GAAW,EAAE,KAAc;IACnF,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC;QAC5C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC3B,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,WAAW;AACX,iEAAiE;AAEjE,wCAAwC;AACxC,SAAS,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,IAAwB;IAChE,IAAI,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAsB,EAAE,CAAgB;IACpE,OAAO;QACL,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAClC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAChC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE;YACP,IAAI,IAAI,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,UAAU,KAAK,OAAO,MAAM,CAAE,GAAG,CAAC,OAAoC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/F,IAAI,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAoB,CAAC,CAAC,CAAC;YAC3F,IAAI,OAAO,KAAK,OAAO,MAAM,CAAE,GAAG,CAAC,OAAqC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9F,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,QAAQ,KAAK,OAAO,CAAE,GAAG,CAAC,OAAkC,CAAC,QAAQ,IAAI,EAAE,CAAc,CAAC,CAAC,CAAC;YAChG,IAAI,MAAM,KAAK,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9E;QACD,EAAE,EAAE;YACF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;YAChC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;SAC/C;KACF,CAAC;AACJ,CAAC;AACD,SAAS,QAAQ,CAAC,GAAsB,EAAE,CAAgB;IACxD,MAAM,CAAC,GAAG,GAAyC,CAAC;IAEpD,eAAe;IACf,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,IAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,IAAyC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,IAA0B,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,IAA4C,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpG,4FAA4F;IAC5F,4CAA4C;IAC5C,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9E,eAAe;IACf,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,IAAsE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAClI,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,IAAsB,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1D,0BAA0B;IAC1B,0EAA0E;IAC1E,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE;QACb,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;QACtB,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE,GAAI,GAAG,CAAC,OAAgC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KAC1F,CAAC,CAAC;IACH,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjF,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAE,GAAG,CAAC,OAAoC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACxG,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAE,GAAG,CAAC,OAAqC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACvG,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAE,GAAG,CAAC,OAAkC,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5F,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE;QACjB,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KACpF,CAAC,CAAC;IACH,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElD,6EAA6E;IAC7E,iCAAiC;IACjC,EAAE;IACF,kDAAkD;IAClD,kDAAkD;IAClD,uCAAuC;IACvC,qBAAqB;IACrB,EAAE;IACF,8BAA8B;IAC9B,sDAAsD;IACtD,yCAAyC;IACzC,wCAAwC;IACxC,oDAAoD;IACpD,+DAA+D;IAC/D,EAAE;IACF,yCAAyC;IACzC,mDAAmD;IACnD,oDAAoD;IACpD,iEAAiE;IACjE,kDAAkD;IAClD,8BAA8B;IAC9B,EAAE;IACF,uCAAuC;IACvC,8CAA8C;IAC9C,oDAAoD;IACpD,2CAA2C;IAC3C,8CAA8C;IAC9C,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,GAAG,CAAC,OAA0F,CAAC;QAC1G,MAAM,OAAO,GAAG,EAAE,EAAE,IAAI,KAAK,OAAO,CAAC;QACrC,MAAM,IAAI,GAAG,WAAW,CAAC;YACvB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ;YACxB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK;YAClB,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS;YAC1B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;YACpB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAe;YAC7B,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW;YAC9B,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAU;YAC1E,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAChC,MAAM,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChE,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAgB;YAC/B,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;YACpB,OAAO,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAI,eAAe;SAClD,CAAC,CAAC;QACH,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAG,4BAA4B;QAC/D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,uBAAuB,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,8BAA8B;IAC9B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QACX,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACV,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;YACxC,GAAG,EAAE,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;SAChE,CAAC;KACH,CAAC,CAAC;IAEH,8BAA8B;IAC9B,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE;QACjB,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACV,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE;YAChC,WAAW,EAAE,CAAC,CAAC,UAAU,KAAK,SAAS;YACvC,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS;YACpC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO;YAClC,QAAQ,EAAE,CAAC,CAAC,YAAY;YACxB,WAAW,EAAE,CAAC,CAAC,gBAAgB;SAChC,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,153 @@
1
+ /** 状态子目录名(挂在入站扩展目录下) */
2
+ export declare const EXT_INBOUND_STATE_SUBDIR = ".state";
3
+ /** 状态目录:`{dataRoot}/.qqbot-extensions/inbound/.state` */
4
+ export declare function inboundStateDir(dataRoot: string): string;
5
+ /** 单个扩展的状态文件:`{dataRoot}/.qqbot-extensions/inbound/.state/<扩展文件名>.json` */
6
+ export declare function extStatePath(dataRoot: string, file: string): string;
7
+ /** 审计账本(所有扩展共用一本):`{dataRoot}/.qqbot-extensions/inbound/.state/audit.jsonl` */
8
+ export declare function auditPath(dataRoot: string): string;
9
+ /** 一条禁言名单项 */
10
+ export interface ExtMute {
11
+ /** 被禁言的 openid */
12
+ id: string;
13
+ /** 到期时间戳(ms);**0 = 永久**(`minutes <= 0` 时写 0) */
14
+ until: number;
15
+ /** 为什么禁(写进审计,也方便主人回看) */
16
+ reason?: string;
17
+ /** 谁下的手:缺省 = 执行它的扩展名;也可以自己传(如触发人的昵称/命令) */
18
+ by?: string;
19
+ /** 写名单的时刻(展示用) */
20
+ at?: number;
21
+ }
22
+ /** 状态文件形状(`mutes` 与 `kv` 同住一个文件,免得两个文件两套坏法) */
23
+ export interface ExtStateFile {
24
+ mutes: ExtMute[];
25
+ kv: Record<string, unknown>;
26
+ }
27
+ /** 名单项的展示形态:多带一个剩余时间 */
28
+ export interface ExtMuteView extends ExtMute {
29
+ /** 是否永久(`until === 0`) */
30
+ permanent: boolean;
31
+ /** 剩余毫秒;永久时为 null */
32
+ remainingMs: number | null;
33
+ /** 剩余分钟(向上取整);永久时为 null */
34
+ remainingMinutes: number | null;
35
+ }
36
+ /**
37
+ * 读状态文件。**永不抛出**:
38
+ * · 目录/文件不存在 → 空状态;
39
+ * · JSON 坏了 / 形状不对 → 空状态(别让一个坏文件把插件搞崩);
40
+ * · 读的时候**惰性清理**过期名单项,并把清理结果写回(写不回去也不影响本次返回值)。
41
+ */
42
+ export declare function readExtState(dataRoot: string, file: string): ExtStateFile;
43
+ /** 写状态文件;返回是否写成功(**永不抛出**) */
44
+ export declare function writeExtState(dataRoot: string, file: string, st: ExtStateFile): boolean;
45
+ /** 名单项 → 展示形态(带剩余时间) */
46
+ export declare function muteView(m: ExtMute, now?: number): ExtMuteView;
47
+ /**
48
+ * 写一条禁言。`minutes <= 0`(含缺省之外的负数/0)= **永久**。
49
+ * 同一 id 重复禁言 → 覆盖(改期限/原因),不堆重复项。
50
+ * 返回写入的名单项(读回时已做过期清理);失败返回 false。
51
+ */
52
+ export declare function muteUser(dataRoot: string, file: string, input: {
53
+ id: string;
54
+ minutes?: number;
55
+ reason?: string;
56
+ by?: string;
57
+ }): ExtMute | false;
58
+ /** 解除禁言;返回是否真的解掉了一条 */
59
+ export declare function unmuteUser(dataRoot: string, file: string, id: string): boolean;
60
+ /** 查一条是否被禁言;命中返回展示形态(带剩余时间),否则 null */
61
+ export declare function isMuted(dataRoot: string, file: string, id: string): ExtMuteView | null;
62
+ /** 读整份名单(已做过期清理,带剩余时间),按到期时间升序(永久排最后) */
63
+ export declare function mutedUsers(dataRoot: string, file: string): ExtMuteView[];
64
+ /**
65
+ * 审计账本的单行上限:512KB。
66
+ * 超了就 `audit.jsonl` → `audit.jsonl.1`(旧的 `.1` 被覆盖,只留一代)。
67
+ * 为什么不按行数:行里带着截断后的文本摘要,字节数才是真正会撑爆磁盘的东西。
68
+ */
69
+ export declare const AUDIT_MAX_BYTES: number;
70
+ /** 摘要字段截断长度(**别把整条消息塞进审计**) */
71
+ export declare const AUDIT_TEXT_CHARS = 120;
72
+ export declare const AUDIT_REASON_CHARS = 200;
73
+ export declare const AUDIT_TARGET_CHARS = 64;
74
+ /** 一条审计记录 */
75
+ export interface ExtAuditEntry {
76
+ /** 扩展文件名(谁干的) */
77
+ file?: string;
78
+ /** 扩展展示名 */
79
+ name?: string;
80
+ /** 动作:annihilate / rewrite / forceWake / decide / muteUser / unmuteUser(+ 被拒时同名字段) */
81
+ action: string;
82
+ /** 目标(被禁言的 openid 等) */
83
+ target?: string;
84
+ /** 原因(用户传的 reason) */
85
+ reason?: string;
86
+ /** 文本摘要(**截断**) */
87
+ text?: string;
88
+ /** ok | refused-owner | refused-breaker | refused-invalid ... */
89
+ result?: string;
90
+ }
91
+ /**
92
+ * 追加一行审计。**永不抛出**、失败静默返回 false。
93
+ * 轮转:写之前先看大小,超过 {@link AUDIT_MAX_BYTES} 就改名成 `.1`。
94
+ */
95
+ export declare function appendAudit(dataRoot: string, entry: ExtAuditEntry): boolean;
96
+ /** 读审计(诊断 / 测试用):返回每行的**原始字符串**(含换行前的 JSON) */
97
+ export declare function readAudit(dataRoot: string, limit?: number): string[];
98
+ /** 参与窗口(最近多少条"该扩展参与的消息") */
99
+ export declare const BREAKER_WINDOW = 50;
100
+ /** 最小样本:参与不足这么多条不判比例(否则头两条全是消灭就熔断了,误伤太狠) */
101
+ export declare const BREAKER_MIN_SAMPLE = 10;
102
+ /** 比例阈值:破坏性动作占比 > 该值 ⇒ 熔断 */
103
+ export declare const BREAKER_RATIO = 0.5;
104
+ /** 突发窗口(ms)与窗口内允许的最大破坏性动作数 */
105
+ export declare const BURST_WINDOW_MS = 10000;
106
+ export declare const BURST_MAX = 20;
107
+ /** 当前熔断原因(没熔断返回 undefined) */
108
+ export declare function breakerTrippedReason(file: string): string | undefined;
109
+ /** 熔断:幂等(已熔断时保留最早那次的原因与时刻) */
110
+ export declare function tripBreaker(file: string, reason: string): string;
111
+ /**
112
+ * 执行破坏性动作**之前**问一句:现在允许吗?
113
+ * · 已熔断 → 拒绝;
114
+ * · 突发窗口里已经打满 {@link BURST_MAX} 次 → **当场熔断**并拒绝(第 21 次就被拦下)。
115
+ * 任何异常都当"允许"(宁可放行,也不能因为统计代码坏了把扩展全废掉)。
116
+ */
117
+ export declare function checkDestructiveAllowed(file: string): {
118
+ ok: true;
119
+ } | {
120
+ ok: false;
121
+ reason: string;
122
+ };
123
+ /** 记一次破坏性动作(突发窗口用) */
124
+ export declare function noteDestructive(file: string): void;
125
+ /**
126
+ * 记一次"该扩展参与了这条消息"(含这条做了什么)。
127
+ * 比例超阈值时熔断,返回熔断原因(调用方负责 logger.warn 出来,好让人一眼看出是哪个扩展、为什么)。
128
+ */
129
+ export declare function noteParticipation(file: string, destructive: boolean): string | undefined;
130
+ /**
131
+ * 把"最近一次参与记录"升级成破坏性(早+晚两个挂点共用一份参与记录时用)。
132
+ * 例:`onInbound` 什么都没干(记 false),`onDecide` 里禁言了某人 —— 那次参与应当算破坏性。
133
+ */
134
+ export declare function upgradeLastParticipation(file: string): void;
135
+ /** 诊断:某扩展的熔断状态快照 */
136
+ export declare function breakerStatus(file: string): {
137
+ tripped?: {
138
+ at: number;
139
+ reason: string;
140
+ };
141
+ participated: number;
142
+ destructive: number;
143
+ };
144
+ /**
145
+ * 复位熔断(**只**清熔断记录,不碰名单与 kv)。
146
+ * 调用点:每次装载该扩展文件时(= 热重载/重启即复位,这是文档写明的恢复通道)。
147
+ */
148
+ export declare function resetBreaker(file: string): void;
149
+ /** 重置全部熔断状态(仅供单元测试) */
150
+ export declare function __resetBreakersForTest(): void;
151
+ /** 状态目录自检(诊断用;返回是否存在) */
152
+ export declare function inboundStateDirExists(dataRoot: string): boolean;
153
+ //# sourceMappingURL=ext-inbound-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ext-inbound-state.d.ts","sourceRoot":"","sources":["../../src/features/ext-inbound-state.ts"],"names":[],"mappings":"AAgCA,wBAAwB;AACxB,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAMD,cAAc;AACd,MAAM,WAAW,OAAO;IACtB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kBAAkB;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,0BAA0B;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,2BAA2B;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AA8BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAqBzE;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAWvF;AAED,wBAAwB;AACxB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,WAAW,CASlE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,GAAG,KAAK,CAiBjB;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAY9E;AAED,uCAAuC;AACvC,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAWtF;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAUxE;AAMD;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAa,CAAC;AAE1C,+BAA+B;AAC/B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAwB3E;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,EAAE,CASjE;AAMD,4BAA4B;AAC5B,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,6BAA6B;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,8BAA8B;AAC9B,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,SAAS,KAAK,CAAC;AAyB5B,8BAA8B;AAC9B,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIhE;AAQD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAelG;AAED,sBAAsB;AACtB,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKlD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkBxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM3D;AAED,oBAAoB;AACpB,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAQnI;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,uBAAuB;AACvB,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,419 @@
1
+ /**
2
+ * ext-inbound-state.ts — 入站扩展的「持久状态 / 审计 / 熔断」三件套(2026-10-12)
3
+ *
4
+ * 入站扩展(`{dataRoot}/.qqbot-extensions/inbound/*.mjs`)能对**每条入站消息**做四件事:
5
+ * 消灭、改写、强制入站、禁言群友。前三件是"消息维"(过了就算),第四件是**用户维**——
6
+ * "某人接下来 30 分钟别说话"必须**跨重启仍然有效**,所以需要落盘。
7
+ *
8
+ * ── 落盘在哪 ────────────────────────────────────────────────────────────────
9
+ * `{dataRoot}/.qqbot-extensions/inbound/.state/<扩展文件名>.json`
10
+ * `{dataRoot}/.qqbot-extensions/inbound/.state/audit.jsonl`(所有扩展**共用**一本审计账)
11
+ * ⚠️ `.state/` 是**子目录**:入站扩展扫描只看 `inbound/` 根下的直接子文件,所以它不会被当扩展装载。
12
+ *
13
+ * ── 三条纪律(都是"绝不能因为状态文件坏了就搞崩插件"派生出来的)────────────────
14
+ * ① **任何读写都不抛出**:坏文件 / 无权限 / 目录不存在 → 一律当空(并在可能时告警),
15
+ * `mutes: []`、`kv: {}`,插件与消息链照常跑;
16
+ * ② **惰性清理**:读名单时顺手剔掉过期项(`until` 已过),清理结果写回文件;
17
+ * `until === 0` 表示**永久**(`minutes <= 0` 时写入),永远不会被清掉;
18
+ * ③ **审计有轮转上限**:超过 `AUDIT_MAX_BYTES` 就改名成 `audit.jsonl.1`(只留 1 份旧账),
19
+ * 绝不允许无限涨。
20
+ *
21
+ * ── 熔断(主人点名的保命件之一)─────────────────────────────────────────────
22
+ * 按**扩展**统计"消灭/静默"的密度,异常就停掉**该扩展的破坏性动作**(消息照常放行):
23
+ * · 比例:该扩展参与的最近 `BREAKER_WINDOW`(50) 条里,破坏性动作占比 > `BREAKER_RATIO`(50%) ⇒ 熔断;
24
+ * · 突发:同一扩展 `BURST_WINDOW_MS`(10s) 内破坏性动作 ≥ `BURST_MAX`(20) ⇒ 熔断。
25
+ * 两种都只影响**后续**的破坏性动作(触发它的那一条已经发生了,追不回来),
26
+ * 且**只放行不执行**:`annihilate`/`muteUser` 返回 false + warn,别的动作(rewrite/forceWake/decide)不受影响。
27
+ * 复位:热重载(`/tools-reload`)或重启插件 —— 每次装载都会清掉该扩展的熔断记录。
28
+ */
29
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
30
+ import { join } from 'node:path';
31
+ import { EXT_INBOUND_SUBDIR } from './extension-store.js';
32
+ /** 状态子目录名(挂在入站扩展目录下) */
33
+ export const EXT_INBOUND_STATE_SUBDIR = '.state';
34
+ /** 状态目录:`{dataRoot}/.qqbot-extensions/inbound/.state` */
35
+ export function inboundStateDir(dataRoot) {
36
+ return join(dataRoot, EXT_INBOUND_SUBDIR, EXT_INBOUND_STATE_SUBDIR);
37
+ }
38
+ /** 单个扩展的状态文件:`{dataRoot}/.qqbot-extensions/inbound/.state/<扩展文件名>.json` */
39
+ export function extStatePath(dataRoot, file) {
40
+ const safe = String(file || 'unknown').replace(/[\\/:*?"<>|]/g, '_') || 'unknown';
41
+ return join(inboundStateDir(dataRoot), `${safe}.json`);
42
+ }
43
+ /** 审计账本(所有扩展共用一本):`{dataRoot}/.qqbot-extensions/inbound/.state/audit.jsonl` */
44
+ export function auditPath(dataRoot) {
45
+ return join(inboundStateDir(dataRoot), 'audit.jsonl');
46
+ }
47
+ /** 空状态(每次新建,避免调用方互相污染) */
48
+ function emptyState() {
49
+ return { mutes: [], kv: {} };
50
+ }
51
+ /** 是否仍未过期(`until === 0` = 永久) */
52
+ function alive(m, now) {
53
+ return m.until === 0 || m.until > now;
54
+ }
55
+ /** 把文件里读到的一条(形状不可信)归一化成名单项;不合法返回 null */
56
+ function normalizeMute(raw) {
57
+ try {
58
+ const o = raw;
59
+ const id = String(o?.id ?? '').trim();
60
+ if (!id)
61
+ return null;
62
+ const until = Number(o?.until);
63
+ const out = { id, until: Number.isFinite(until) && until > 0 ? until : 0 };
64
+ if (typeof o?.reason === 'string' && o.reason)
65
+ out.reason = o.reason;
66
+ if (typeof o?.by === 'string' && o.by)
67
+ out.by = o.by;
68
+ const at = Number(o?.at);
69
+ if (Number.isFinite(at) && at > 0)
70
+ out.at = at;
71
+ return out;
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * 读状态文件。**永不抛出**:
79
+ * · 目录/文件不存在 → 空状态;
80
+ * · JSON 坏了 / 形状不对 → 空状态(别让一个坏文件把插件搞崩);
81
+ * · 读的时候**惰性清理**过期名单项,并把清理结果写回(写不回去也不影响本次返回值)。
82
+ */
83
+ export function readExtState(dataRoot, file) {
84
+ let raw;
85
+ try {
86
+ const p = extStatePath(dataRoot, file);
87
+ if (!existsSync(p))
88
+ return emptyState();
89
+ raw = JSON.parse(readFileSync(p, 'utf8'));
90
+ }
91
+ catch {
92
+ return emptyState();
93
+ }
94
+ const o = (raw ?? {});
95
+ const list = Array.isArray(o.mutes) ? o.mutes.map(normalizeMute).filter((m) => m !== null) : [];
96
+ const now = Date.now();
97
+ const kept = list.filter((m) => alive(m, now));
98
+ const kv = o.kv && typeof o.kv === 'object' && !Array.isArray(o.kv)
99
+ ? o.kv
100
+ : {};
101
+ if (kept.length !== list.length) {
102
+ // 惰性清理:过期项落盘时顺手删掉(失败就算了,下次读还会再清一遍)
103
+ try {
104
+ writeExtState(dataRoot, file, { mutes: kept, kv });
105
+ }
106
+ catch { /* ignore */ }
107
+ }
108
+ return { mutes: kept, kv };
109
+ }
110
+ /** 写状态文件;返回是否写成功(**永不抛出**) */
111
+ export function writeExtState(dataRoot, file, st) {
112
+ try {
113
+ // ⚠️ dataRoot 为空一律不写:否则会按相对路径在当前工作目录里造出 .qqbot-extensions/…
114
+ if (!dataRoot)
115
+ return false;
116
+ const p = extStatePath(dataRoot, file);
117
+ mkdirSync(inboundStateDir(dataRoot), { recursive: true });
118
+ writeFileSync(p, JSON.stringify({ mutes: st.mutes ?? [], kv: st.kv ?? {} }, null, 2), 'utf8');
119
+ return true;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ /** 名单项 → 展示形态(带剩余时间) */
126
+ export function muteView(m, now = Date.now()) {
127
+ const permanent = m.until === 0;
128
+ const remainingMs = permanent ? null : Math.max(0, m.until - now);
129
+ return {
130
+ ...m,
131
+ permanent,
132
+ remainingMs,
133
+ remainingMinutes: remainingMs === null ? null : Math.ceil(remainingMs / 60_000),
134
+ };
135
+ }
136
+ /**
137
+ * 写一条禁言。`minutes <= 0`(含缺省之外的负数/0)= **永久**。
138
+ * 同一 id 重复禁言 → 覆盖(改期限/原因),不堆重复项。
139
+ * 返回写入的名单项(读回时已做过期清理);失败返回 false。
140
+ */
141
+ export function muteUser(dataRoot, file, input) {
142
+ try {
143
+ const id = String(input?.id ?? '').trim();
144
+ if (!id)
145
+ return false;
146
+ const minutes = Number(input?.minutes);
147
+ const until = Number.isFinite(minutes) && minutes > 0 ? Date.now() + minutes * 60_000 : 0;
148
+ const st = readExtState(dataRoot, file);
149
+ const entry = { id, until };
150
+ if (typeof input?.reason === 'string' && input.reason)
151
+ entry.reason = input.reason;
152
+ if (typeof input?.by === 'string' && input.by)
153
+ entry.by = input.by;
154
+ entry.at = Date.now();
155
+ st.mutes = [...st.mutes.filter((m) => m.id !== id), entry];
156
+ if (!writeExtState(dataRoot, file, st))
157
+ return false;
158
+ return entry;
159
+ }
160
+ catch {
161
+ return false;
162
+ }
163
+ }
164
+ /** 解除禁言;返回是否真的解掉了一条 */
165
+ export function unmuteUser(dataRoot, file, id) {
166
+ try {
167
+ const key = String(id ?? '').trim();
168
+ if (!key)
169
+ return false;
170
+ const st = readExtState(dataRoot, file);
171
+ const next = st.mutes.filter((m) => m.id !== key);
172
+ if (next.length === st.mutes.length)
173
+ return false;
174
+ st.mutes = next;
175
+ return writeExtState(dataRoot, file, st);
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
181
+ /** 查一条是否被禁言;命中返回展示形态(带剩余时间),否则 null */
182
+ export function isMuted(dataRoot, file, id) {
183
+ try {
184
+ const key = String(id ?? '').trim();
185
+ if (!key)
186
+ return null;
187
+ const st = readExtState(dataRoot, file);
188
+ const now = Date.now();
189
+ const hit = st.mutes.find((m) => m.id === key && alive(m, now));
190
+ return hit ? muteView(hit, now) : null;
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ }
196
+ /** 读整份名单(已做过期清理,带剩余时间),按到期时间升序(永久排最后) */
197
+ export function mutedUsers(dataRoot, file) {
198
+ try {
199
+ const now = Date.now();
200
+ return readExtState(dataRoot, file)
201
+ .mutes.filter((m) => alive(m, now))
202
+ .map((m) => muteView(m, now))
203
+ .sort((a, b) => (a.until === 0 ? Number.MAX_SAFE_INTEGER : a.until) - (b.until === 0 ? Number.MAX_SAFE_INTEGER : b.until));
204
+ }
205
+ catch {
206
+ return [];
207
+ }
208
+ }
209
+ // ══════════════════════════════════════════════════════════════
210
+ // 二、审计(可撤销 + 可回看)
211
+ // ══════════════════════════════════════════════════════════════
212
+ /**
213
+ * 审计账本的单行上限:512KB。
214
+ * 超了就 `audit.jsonl` → `audit.jsonl.1`(旧的 `.1` 被覆盖,只留一代)。
215
+ * 为什么不按行数:行里带着截断后的文本摘要,字节数才是真正会撑爆磁盘的东西。
216
+ */
217
+ export const AUDIT_MAX_BYTES = 512 * 1024;
218
+ /** 摘要字段截断长度(**别把整条消息塞进审计**) */
219
+ export const AUDIT_TEXT_CHARS = 120;
220
+ export const AUDIT_REASON_CHARS = 200;
221
+ export const AUDIT_TARGET_CHARS = 64;
222
+ /** 安全截断:undefined 原样(JSON 里会消失),否则取字符串前 n 字符 */
223
+ function clip(v, n) {
224
+ if (v === undefined || v === null)
225
+ return undefined;
226
+ const s = String(v);
227
+ return s.length > n ? s.slice(0, n) : s;
228
+ }
229
+ /**
230
+ * 追加一行审计。**永不抛出**、失败静默返回 false。
231
+ * 轮转:写之前先看大小,超过 {@link AUDIT_MAX_BYTES} 就改名成 `.1`。
232
+ */
233
+ export function appendAudit(dataRoot, entry) {
234
+ try {
235
+ // ⚠️ dataRoot 为空一律不写:否则会按相对路径在当前工作目录里造出 .qqbot-extensions/…
236
+ if (!dataRoot)
237
+ return false;
238
+ mkdirSync(inboundStateDir(dataRoot), { recursive: true });
239
+ const p = auditPath(dataRoot);
240
+ try {
241
+ if (existsSync(p) && statSync(p).size > AUDIT_MAX_BYTES)
242
+ renameSync(p, `${p}.1`);
243
+ }
244
+ catch { /* 轮转失败不阻断本条审计 */ }
245
+ const line = JSON.stringify({
246
+ at: new Date().toISOString(),
247
+ file: entry.file,
248
+ name: entry.name,
249
+ action: String(entry.action ?? ''),
250
+ target: clip(entry.target, AUDIT_TARGET_CHARS),
251
+ reason: clip(entry.reason, AUDIT_REASON_CHARS),
252
+ text: clip(entry.text, AUDIT_TEXT_CHARS),
253
+ result: entry.result,
254
+ });
255
+ appendFileSync(p, `${line}\n`, 'utf8');
256
+ return true;
257
+ }
258
+ catch {
259
+ return false;
260
+ }
261
+ }
262
+ /** 读审计(诊断 / 测试用):返回每行的**原始字符串**(含换行前的 JSON) */
263
+ export function readAudit(dataRoot, limit = 200) {
264
+ try {
265
+ const p = auditPath(dataRoot);
266
+ if (!existsSync(p))
267
+ return [];
268
+ const lines = readFileSync(p, 'utf8').split('\n').filter((l) => l.trim() !== '');
269
+ return limit > 0 ? lines.slice(-limit) : lines;
270
+ }
271
+ catch {
272
+ return [];
273
+ }
274
+ }
275
+ // ══════════════════════════════════════════════════════════════
276
+ // 三、熔断(按扩展统计破坏性动作密度)
277
+ // ══════════════════════════════════════════════════════════════
278
+ /** 参与窗口(最近多少条"该扩展参与的消息") */
279
+ export const BREAKER_WINDOW = 50;
280
+ /** 最小样本:参与不足这么多条不判比例(否则头两条全是消灭就熔断了,误伤太狠) */
281
+ export const BREAKER_MIN_SAMPLE = 10;
282
+ /** 比例阈值:破坏性动作占比 > 该值 ⇒ 熔断 */
283
+ export const BREAKER_RATIO = 0.5;
284
+ /** 突发窗口(ms)与窗口内允许的最大破坏性动作数 */
285
+ export const BURST_WINDOW_MS = 10_000;
286
+ export const BURST_MAX = 20;
287
+ const breakers = new Map();
288
+ /** 取(必要时新建)某扩展的熔断状态 */
289
+ function breakerOf(file) {
290
+ const k = String(file || '(unknown)');
291
+ let s = breakers.get(k);
292
+ if (!s) {
293
+ s = { ring: [], burst: [] };
294
+ breakers.set(k, s);
295
+ }
296
+ return s;
297
+ }
298
+ /** 当前熔断原因(没熔断返回 undefined) */
299
+ export function breakerTrippedReason(file) {
300
+ return breakerOf(file).tripped?.reason;
301
+ }
302
+ /** 熔断:幂等(已熔断时保留最早那次的原因与时刻) */
303
+ export function tripBreaker(file, reason) {
304
+ const s = breakerOf(file);
305
+ if (!s.tripped)
306
+ s.tripped = { at: Date.now(), reason };
307
+ return s.tripped.reason;
308
+ }
309
+ /** 清理突发窗口里的陈旧时刻(返回窗口内的时刻表) */
310
+ function freshBurst(s, now = Date.now()) {
311
+ s.burst = s.burst.filter((t) => now - t < BURST_WINDOW_MS);
312
+ return s.burst;
313
+ }
314
+ /**
315
+ * 执行破坏性动作**之前**问一句:现在允许吗?
316
+ * · 已熔断 → 拒绝;
317
+ * · 突发窗口里已经打满 {@link BURST_MAX} 次 → **当场熔断**并拒绝(第 21 次就被拦下)。
318
+ * 任何异常都当"允许"(宁可放行,也不能因为统计代码坏了把扩展全废掉)。
319
+ */
320
+ export function checkDestructiveAllowed(file) {
321
+ try {
322
+ const s = breakerOf(file);
323
+ if (s.tripped)
324
+ return { ok: false, reason: s.tripped.reason };
325
+ const now = Date.now();
326
+ const burst = freshBurst(s, now);
327
+ if (burst.length >= BURST_MAX) {
328
+ const reason = `突发熔断:${BURST_WINDOW_MS / 1000}s 内破坏性动作已达 ${burst.length} 次(上限 ${BURST_MAX})`;
329
+ tripBreaker(file, reason);
330
+ return { ok: false, reason };
331
+ }
332
+ return { ok: true };
333
+ }
334
+ catch {
335
+ return { ok: true };
336
+ }
337
+ }
338
+ /** 记一次破坏性动作(突发窗口用) */
339
+ export function noteDestructive(file) {
340
+ try {
341
+ const s = breakerOf(file);
342
+ freshBurst(s).push(Date.now());
343
+ }
344
+ catch { /* ignore */ }
345
+ }
346
+ /**
347
+ * 记一次"该扩展参与了这条消息"(含这条做了什么)。
348
+ * 比例超阈值时熔断,返回熔断原因(调用方负责 logger.warn 出来,好让人一眼看出是哪个扩展、为什么)。
349
+ */
350
+ export function noteParticipation(file, destructive) {
351
+ try {
352
+ const s = breakerOf(file);
353
+ if (s.tripped)
354
+ return undefined;
355
+ s.ring.push(destructive === true);
356
+ if (s.ring.length > BREAKER_WINDOW)
357
+ s.ring.splice(0, s.ring.length - BREAKER_WINDOW);
358
+ if (s.ring.length < BREAKER_MIN_SAMPLE)
359
+ return undefined;
360
+ const bad = s.ring.filter(Boolean).length;
361
+ const ratio = bad / s.ring.length;
362
+ if (ratio > BREAKER_RATIO) {
363
+ const reason = `比例熔断:最近 ${s.ring.length} 条里消灭/静默 ${bad} 条(${Math.round(ratio * 100)}% > ${BREAKER_RATIO * 100}%)`;
364
+ return tripBreaker(file, reason);
365
+ }
366
+ return undefined;
367
+ }
368
+ catch {
369
+ return undefined;
370
+ }
371
+ }
372
+ /**
373
+ * 把"最近一次参与记录"升级成破坏性(早+晚两个挂点共用一份参与记录时用)。
374
+ * 例:`onInbound` 什么都没干(记 false),`onDecide` 里禁言了某人 —— 那次参与应当算破坏性。
375
+ */
376
+ export function upgradeLastParticipation(file) {
377
+ try {
378
+ const s = breakerOf(file);
379
+ const last = s.ring.length - 1;
380
+ if (last >= 0)
381
+ s.ring[last] = true;
382
+ }
383
+ catch { /* ignore */ }
384
+ }
385
+ /** 诊断:某扩展的熔断状态快照 */
386
+ export function breakerStatus(file) {
387
+ const s = breakerOf(file);
388
+ const out = {
389
+ participated: s.ring.length,
390
+ destructive: s.ring.filter(Boolean).length,
391
+ };
392
+ if (s.tripped)
393
+ out.tripped = { ...s.tripped };
394
+ return out;
395
+ }
396
+ /**
397
+ * 复位熔断(**只**清熔断记录,不碰名单与 kv)。
398
+ * 调用点:每次装载该扩展文件时(= 热重载/重启即复位,这是文档写明的恢复通道)。
399
+ */
400
+ export function resetBreaker(file) {
401
+ try {
402
+ breakers.delete(String(file || '(unknown)'));
403
+ }
404
+ catch { /* ignore */ }
405
+ }
406
+ /** 重置全部熔断状态(仅供单元测试) */
407
+ export function __resetBreakersForTest() {
408
+ breakers.clear();
409
+ }
410
+ /** 状态目录自检(诊断用;返回是否存在) */
411
+ export function inboundStateDirExists(dataRoot) {
412
+ try {
413
+ return existsSync(inboundStateDir(dataRoot));
414
+ }
415
+ catch {
416
+ return false;
417
+ }
418
+ }
419
+ //# sourceMappingURL=ext-inbound-state.js.map