asaihost-nodejs 0.0.1 → 0.0.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 (79) hide show
  1. package/README.md +76 -25
  2. package/dist/InterventionLog-CRP6YJVM.cjs +30 -0
  3. package/dist/{InterventionLog-25EHE4QR.cjs.map → InterventionLog-CRP6YJVM.cjs.map} +1 -1
  4. package/dist/{InterventionLog-R6CCPU2B.es.js → InterventionLog-PZT2CCN3.es.js} +5 -5
  5. package/dist/LogStore-7MTUQA4G.cjs +54 -0
  6. package/dist/{LogStore-M2AUBNGO.cjs.map → LogStore-7MTUQA4G.cjs.map} +1 -1
  7. package/dist/{LogStore-ECXX34WC.es.js → LogStore-Q35YFNAY.es.js} +3 -3
  8. package/dist/asaihost-nodejs.cjs +1296 -1410
  9. package/dist/asaihost-nodejs.cjs.map +1 -1
  10. package/dist/asaihost-nodejs.d.cts +154 -17
  11. package/dist/asaihost-nodejs.d.ts +154 -17
  12. package/dist/asaihost-nodejs.es.js +911 -1025
  13. package/dist/asaihost-nodejs.es.js.map +1 -1
  14. package/dist/{chunk-HHPGUJ75.cjs → chunk-2BCIIKRG.cjs} +13 -6
  15. package/dist/chunk-2BCIIKRG.cjs.map +1 -0
  16. package/dist/{chunk-G4WVDUBH.cjs → chunk-4E7Z5K5U.cjs} +7 -7
  17. package/dist/{chunk-G4WVDUBH.cjs.map → chunk-4E7Z5K5U.cjs.map} +1 -1
  18. package/dist/{chunk-DROOHKB3.es.js → chunk-57UQJKSL.es.js} +2 -2
  19. package/dist/{chunk-EOGZPRML.es.js → chunk-A5CDJGJI.es.js} +224 -39
  20. package/dist/chunk-A5CDJGJI.es.js.map +1 -0
  21. package/dist/{chunk-E7V3EBDB.es.js → chunk-A6VJPLDD.es.js} +5 -3
  22. package/dist/chunk-A6VJPLDD.es.js.map +1 -0
  23. package/dist/{chunk-X7VHW2TD.cjs → chunk-H3K33HBA.cjs} +249 -64
  24. package/dist/chunk-H3K33HBA.cjs.map +1 -0
  25. package/dist/{chunk-KOFCBB3N.cjs → chunk-K2QPSQEV.cjs} +9 -9
  26. package/dist/{chunk-KOFCBB3N.cjs.map → chunk-K2QPSQEV.cjs.map} +1 -1
  27. package/dist/{chunk-LOMSUPPU.es.js → chunk-LTEP4XB2.es.js} +6 -6
  28. package/dist/{chunk-QWVR2HNT.cjs → chunk-LXJMGLKW.cjs} +21 -19
  29. package/dist/chunk-LXJMGLKW.cjs.map +1 -0
  30. package/dist/{chunk-4WJDC4M4.es.js → chunk-NLZNIGNF.es.js} +2 -2
  31. package/dist/chunk-NLZNIGNF.es.js.map +1 -0
  32. package/dist/{chunk-W7DVKGX5.cjs → chunk-OCEBEEP5.cjs} +2 -2
  33. package/dist/{chunk-W7DVKGX5.cjs.map → chunk-OCEBEEP5.cjs.map} +1 -1
  34. package/dist/{chunk-NLBFIRDB.cjs → chunk-RIRKIYET.cjs} +12 -12
  35. package/dist/{chunk-NLBFIRDB.cjs.map → chunk-RIRKIYET.cjs.map} +1 -1
  36. package/dist/{chunk-XBIN4C2V.es.js → chunk-SB23ESX2.es.js} +2 -2
  37. package/dist/{chunk-VLMM735Q.cjs → chunk-TKJAHTPO.cjs} +26 -26
  38. package/dist/{chunk-VLMM735Q.cjs.map → chunk-TKJAHTPO.cjs.map} +1 -1
  39. package/dist/{chunk-MCMADJQR.es.js → chunk-VUZO7DCA.es.js} +4 -4
  40. package/dist/chunk-VUZO7DCA.es.js.map +1 -0
  41. package/dist/{chunk-KUZQ36IJ.es.js → chunk-ZQBHJRAO.es.js} +10 -3
  42. package/dist/chunk-ZQBHJRAO.es.js.map +1 -0
  43. package/dist/intervention-hooks-KF3SNB5Q.cjs +21 -0
  44. package/dist/{intervention-hooks-LE6X4C6N.cjs.map → intervention-hooks-KF3SNB5Q.cjs.map} +1 -1
  45. package/dist/{intervention-hooks-FI4EHOL5.es.js → intervention-hooks-TCGIC4IV.es.js} +6 -6
  46. package/dist/log-formats-TUXGMCCU.cjs +31 -0
  47. package/dist/{log-formats-FKFMQKNO.cjs.map → log-formats-TUXGMCCU.cjs.map} +1 -1
  48. package/dist/{log-formats-I5E32H5F.es.js → log-formats-WW3TDUAK.es.js} +2 -2
  49. package/dist/{password-63OY27RX.es.js → password-4BABWAG4.es.js} +4 -4
  50. package/dist/password-PJHJRGPE.cjs +20 -0
  51. package/dist/{password-NZ5EGDWG.cjs.map → password-PJHJRGPE.cjs.map} +1 -1
  52. package/dist/user-store-6J2PSEIN.cjs +12 -0
  53. package/dist/{user-store-SX4N6PQ4.cjs.map → user-store-6J2PSEIN.cjs.map} +1 -1
  54. package/dist/user-store-UC5URX3C.es.js +12 -0
  55. package/package.json +2 -13
  56. package/dist/InterventionLog-25EHE4QR.cjs +0 -30
  57. package/dist/LogStore-M2AUBNGO.cjs +0 -54
  58. package/dist/chunk-4WJDC4M4.es.js.map +0 -1
  59. package/dist/chunk-E7V3EBDB.es.js.map +0 -1
  60. package/dist/chunk-EOGZPRML.es.js.map +0 -1
  61. package/dist/chunk-HHPGUJ75.cjs.map +0 -1
  62. package/dist/chunk-KUZQ36IJ.es.js.map +0 -1
  63. package/dist/chunk-MCMADJQR.es.js.map +0 -1
  64. package/dist/chunk-QWVR2HNT.cjs.map +0 -1
  65. package/dist/chunk-X7VHW2TD.cjs.map +0 -1
  66. package/dist/intervention-hooks-LE6X4C6N.cjs +0 -21
  67. package/dist/log-formats-FKFMQKNO.cjs +0 -31
  68. package/dist/password-NZ5EGDWG.cjs +0 -20
  69. package/dist/user-store-J7LWEXSW.es.js +0 -12
  70. package/dist/user-store-SX4N6PQ4.cjs +0 -12
  71. /package/dist/{InterventionLog-R6CCPU2B.es.js.map → InterventionLog-PZT2CCN3.es.js.map} +0 -0
  72. /package/dist/{LogStore-ECXX34WC.es.js.map → LogStore-Q35YFNAY.es.js.map} +0 -0
  73. /package/dist/{chunk-DROOHKB3.es.js.map → chunk-57UQJKSL.es.js.map} +0 -0
  74. /package/dist/{chunk-LOMSUPPU.es.js.map → chunk-LTEP4XB2.es.js.map} +0 -0
  75. /package/dist/{chunk-XBIN4C2V.es.js.map → chunk-SB23ESX2.es.js.map} +0 -0
  76. /package/dist/{intervention-hooks-FI4EHOL5.es.js.map → intervention-hooks-TCGIC4IV.es.js.map} +0 -0
  77. /package/dist/{log-formats-I5E32H5F.es.js.map → log-formats-WW3TDUAK.es.js.map} +0 -0
  78. /package/dist/{password-63OY27RX.es.js.map → password-4BABWAG4.es.js.map} +0 -0
  79. /package/dist/{user-store-J7LWEXSW.es.js.map → user-store-UC5URX3C.es.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-VLMM735Q.cjs"],"names":[],"mappings":"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GAAG,CAAC,EAAG,UAAG,KAAG,CAAC;AAClC,EAAE,OAAO,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-VLMM735Q.cjs","sourcesContent":[null]}
1
+ {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-TKJAHTPO.cjs"],"names":[],"mappings":"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GAAG,CAAC,EAAG,UAAG,KAAG,CAAC;AAClC,EAAE,OAAO,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,oBAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-TKJAHTPO.cjs","sourcesContent":[null]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  mirrorInterventionLog,
3
3
  purgeSqliteEntriesForFile
4
- } from "./chunk-LOMSUPPU.es.js";
4
+ } from "./chunk-LTEP4XB2.es.js";
5
5
  import {
6
6
  getLogFormatTaxonomy
7
- } from "./chunk-4WJDC4M4.es.js";
7
+ } from "./chunk-NLZNIGNF.es.js";
8
8
  import {
9
9
  getNowTime
10
10
  } from "./chunk-UTKVJE7N.es.js";
@@ -177,7 +177,7 @@ async function doLogIntervention($asai, event, ns) {
177
177
  const header = [
178
178
  "CEF:0",
179
179
  escHeader($asai?.hostconfig?.website?.title || "AsaiCMS"),
180
- escHeader("AsaiHost"),
180
+ escHeader("AsaiHostNodejs"),
181
181
  escHeader($asai?.hostconfig?.website?.ver || "1.0.0.0"),
182
182
  escHeader(sigId),
183
183
  escHeader(event.name),
@@ -460,4 +460,4 @@ export {
460
460
  getInterventionTaxonomy,
461
461
  InterventionLog_exports
462
462
  };
463
- //# sourceMappingURL=chunk-MCMADJQR.es.js.map
463
+ //# sourceMappingURL=chunk-VUZO7DCA.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sysserver/lib/common/InterventionLog.ts"],"sourcesContent":["/**\r\n * IEC 62443-4-2 干预日志(Intervention Log)— CEF 格式安全事件记录引擎\r\n *\r\n * 依据标准要求实现:\r\n * - 留存 ≥5 年(retentionYears,默认 5),删除前校验留存期,删除动作本身必须被记录\r\n * - 自动记录:仅由服务端业务代码在真实干预发生时调用 logIntervention(),客户端无法直接写入任意日志内容\r\n * - 关联手段:绝对时间戳(rt) + 启动计数(cn1) + 运行计数(cn2) + 进程运行时长(cn3)\r\n * - 篡改证据:哈希链(每条记录携带对前一条记录的 sha256 摘要 cs4),任意历史记录被删改都会导致后续链路校验失败\r\n * - 日志格式:CEF:Version|DeviceVendor|DeviceProduct|DeviceVersion|SignatureID|Name|Severity|Extension\r\n *\r\n * 需要记录的干预类型(对应 IEC 62443-4-2 4-2 章节要求):\r\n * - SAFETY_PARAM 安全参数化/配置参数变更(使用 CRC 等标识手段)\r\n * - SRESW_UPDATE 嵌入式安全相关软件(SRESW)更新/修改\r\n * - SRASW_UPDATE 应用安全相关软件(SRASW)更新/修改\r\n * - HMI_PARAM 可能导致危险的人机界面参数化\r\n * - SAFETY_DISPLAY_SW 与安全相关指令显示相关的软件变更\r\n * - LOG_DELETE 日志文件删除(无论成功与否,均须记录)\r\n * - PROCESS_GUARD 进程守护/优雅退出/频繁崩溃重启(控制系统事件)\r\n *\r\n * 豁免(不应写入本日志):\r\n * - 未改变上述数据的干预(如成功/失败的常规鉴权动作)\r\n * - 触发机器安全状态的动作(如安全光幕开启)\r\n *\r\n * 测试/演示隔离(testPath):\r\n * - testkdd/testlog 等演示、自动化测试触发的干预动作一律写入独立的 'test' 命名空间目录\r\n * (logger.intervention.testPath),与承担 5 年合规留存义务的 'prod' 生产目录完全物理隔离。\r\n * - 两个命名空间各自拥有独立的哈希链状态、独立的删除审计文件,互不污染、互不计数,\r\n * 可反复清空 'test' 目录用于回归测试,不影响生产留存证据的完整性。\r\n */\r\nimport fsp from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { createHash } from 'node:crypto';\r\nimport { getNowTime } from '../../../core/time';\r\nimport { mirrorInterventionLog, purgeSqliteEntriesForFile } from './LogStore';\r\nimport { getLogFormatTaxonomy } from './log-formats';\r\n\r\n/** 'prod' = 受5年留存保护的生产干预日志;'test' = 演示/自动化测试专用,完全隔离、不计入合规留存 */\r\nexport type LogNamespace = 'prod' | 'test';\r\n\r\nexport type InterventionType =\r\n\t| 'SAFETY_PARAM'\r\n\t| 'SRESW_UPDATE'\r\n\t| 'SRASW_UPDATE'\r\n\t| 'HMI_PARAM'\r\n\t| 'SAFETY_DISPLAY_SW'\r\n\t| 'LOG_DELETE'\r\n\t| 'PROCESS_GUARD';\r\n\r\nexport type InterventionCategory =\r\n\t| 'AccessControl'\r\n\t| 'RequestErrors'\r\n\t| 'ControlSystemEvents'\r\n\t| 'BackupRestore'\r\n\t| 'ConfigurationChanges'\r\n\t| 'AuditLogEvents';\r\n\r\nexport interface InterventionEvent {\r\n\ttype: InterventionType;\r\n\tname: string;\r\n\tcategory?: InterventionCategory;\r\n\tseverity?: number;\r\n\tus?: string;\r\n\tsrc?: string;\r\n\tdst?: string;\r\n\tproto?: string;\r\n\t/** CRC/哈希/版本号等标识手段,不要求存放二进制文件的真实版本号 */\r\n\tidentification?: string;\r\n\toutcome?: 'Success' | 'Failure';\r\n\tdetail?: string;\r\n\tfname?: string;\r\n}\r\n\r\nconst FILE_NAME_RE = /^intervention-\\d{4}-\\d{2}-\\d{2}\\.cef\\.log$/;\r\n\r\n/**\r\n * 删除动作的审计证据必须独立于被删除的内容文件存放,否则\"删除今天的日志文件\"这一操作\r\n * 会把记录删除行为本身的那条 CEF 记录也一并删掉,违反\"删除日志文件必须被记录\"的强制要求。\r\n * 该文件名不匹配 FILE_NAME_RE,deleteInterventionFile 会天然拒绝对它的删除请求。\r\n */\r\nconst DELETION_AUDIT_FILE = 'intervention-deletion-audit.cef.log';\r\n\r\nconst SIGNATURE_ID: Record<InterventionType, string> = {\r\n\tSAFETY_PARAM: 'ASAI.SAFETY.PARAM.001',\r\n\tSRESW_UPDATE: 'ASAI.SRESW.UPDATE.001',\r\n\tSRASW_UPDATE: 'ASAI.SRASW.UPDATE.001',\r\n\tHMI_PARAM: 'ASAI.HMI.PARAM.001',\r\n\tSAFETY_DISPLAY_SW: 'ASAI.SAFETY.DISPLAY.001',\r\n\tLOG_DELETE: 'ASAI.AUDIT.LOGDELETE.001',\r\n\tPROCESS_GUARD: 'ASAI.PROCESS.GUARD.001',\r\n};\r\n\r\nconst DEFAULT_CATEGORY: Record<InterventionType, InterventionCategory> = {\r\n\tSAFETY_PARAM: 'ConfigurationChanges',\r\n\tSRESW_UPDATE: 'ConfigurationChanges',\r\n\tSRASW_UPDATE: 'ConfigurationChanges',\r\n\tHMI_PARAM: 'ConfigurationChanges',\r\n\tSAFETY_DISPLAY_SW: 'ConfigurationChanges',\r\n\tLOG_DELETE: 'AuditLogEvents',\r\n\tPROCESS_GUARD: 'ControlSystemEvents',\r\n};\r\n\r\nconst DEFAULT_SEVERITY: Record<InterventionType, number> = {\r\n\tSAFETY_PARAM: 8,\r\n\tSRESW_UPDATE: 9,\r\n\tSRASW_UPDATE: 8,\r\n\tHMI_PARAM: 7,\r\n\tSAFETY_DISPLAY_SW: 8,\r\n\tLOG_DELETE: 7,\r\n\tPROCESS_GUARD: 9,\r\n};\r\n\r\n/** 用户提供的 6 类 CEF Severity 分级指引(中英文说明保留原文,便于前端展示) */\r\nconst CATEGORY_GUIDE: Record<InterventionCategory, { min: number; max: number; en: string; zh: string; note: string }> = {\r\n\tAccessControl: { min: 7, max: 8, en: 'Access Control', zh: '访问控制', note: '登录失败、权限提升、未授权访问尝试' },\r\n\tRequestErrors: { min: 2, max: 4, en: 'Request Errors', zh: '请求错误', note: '协议格式错误、无效命令、通信异常' },\r\n\tControlSystemEvents: { min: 8, max: 10, en: 'Control System Events', zh: '控制系统事件', note: '安全功能触发、PLC 模式切换、I/O 强制值' },\r\n\tBackupRestore: { min: 6, max: 7, en: 'Backup and Restore Events', zh: '备份与恢复', note: '正常备份偏低,恢复操作风险很高' },\r\n\tConfigurationChanges: { min: 7, max: 9, en: 'Configuration Changes', zh: '配置更改', note: '安全参数、控制逻辑、网络设置变更' },\r\n\tAuditLogEvents: { min: 7, max: 8, en: 'Audit Log Events', zh: '审计日志事件', note: '日志清除、日志篡改、日志系统故障' },\r\n};\r\n\r\nfunction getInterventionDir($asai: any, ns: LogNamespace = 'prod'): string {\r\n\tconst cfg = $asai?.hostconfig?.logger?.intervention || {};\r\n\tif (ns === 'test') return cfg.testPath || './webdata/webdb/log/intervention-test/';\r\n\treturn cfg.path || './webdata/webdb/log/intervention/';\r\n}\r\n\r\nfunction getRetentionYears($asai: any): number {\r\n\tconst y = $asai?.hostconfig?.logger?.intervention?.retentionYears;\r\n\treturn typeof y === 'number' && y > 0 ? y : 5;\r\n}\r\n\r\nfunction escHeader(v: unknown): string {\r\n\treturn String(v ?? '')\r\n\t\t.replace(/\\\\/g, '\\\\\\\\')\r\n\t\t.replace(/\\|/g, '\\\\|')\r\n\t\t.replace(/[\\r\\n]+/g, ' ');\r\n}\r\n\r\nfunction escExt(v: unknown): string {\r\n\treturn String(v ?? '')\r\n\t\t.replace(/\\\\/g, '\\\\\\\\')\r\n\t\t.replace(/=/g, '\\\\=')\r\n\t\t.replace(/[\\r\\n]+/g, ' ');\r\n}\r\n\r\nexport function sha256Hex(input: string): string {\r\n\treturn createHash('sha256').update(input, 'utf8').digest('hex');\r\n}\r\n\r\nconst CRC_TABLE: Uint32Array = (() => {\r\n\tconst table = new Uint32Array(256);\r\n\tfor (let n = 0; n < 256; n++) {\r\n\t\tlet c = n;\r\n\t\tfor (let k = 0; k < 8; k++) {\r\n\t\t\tc = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n\t\t}\r\n\t\ttable[n] = c >>> 0;\r\n\t}\r\n\treturn table;\r\n})();\r\n\r\n/** CRC32 标识计算 — 用于安全参数/配置变更的\"标识手段\"(不存储真实版本号) */\r\nexport function crc32(input: string): string {\r\n\tlet crc = 0xffffffff;\r\n\tconst buf = Buffer.from(input, 'utf8');\r\n\tfor (let i = 0; i < buf.length; i++) {\r\n\t\tcrc = CRC_TABLE[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\r\n\t}\r\n\tcrc = (crc ^ 0xffffffff) >>> 0;\r\n\treturn crc.toString(16).padStart(8, '0');\r\n}\r\n\r\ninterface ChainState {\r\n\t/** 全局最新哈希 — 仅用于给\"新文件\"生成创建锚点,不直接参与任何单个文件的链式计算 */\r\n\tlastHash: string;\r\n\trunningCounter: number;\r\n\tbootCounter: number;\r\n\t/** 每个文件创建时刻的锚点(该文件第一条记录的 prevHash) */\r\n\tfileAnchors: Record<string, string>;\r\n\t/**\r\n\t * 每个文件\"当前链尾哈希\",按文件独立维护、独立递增。\r\n\t * 关键点:同一目录下可能存在多个文件交替写入(如内容文件与删除审计文件),\r\n\t * 若所有文件共用同一个全局 prevHash,其他文件的穿插写入会打断本文件的链式重放,\r\n\t * 导致 verifyChainForFile 对着一份完全没被篡改的文件也报\"校验失败\"(误报)。\r\n\t * 因此每个文件的下一条记录必须以\"这个文件自己上一条记录的哈希\"为 prevHash,\r\n\t * 不受目录内其他文件并发写入的影响,链条本身仍然对该文件内的任何删改保持完全敏感。\r\n\t */\r\n\tfileTip: Record<string, string>;\r\n}\r\n\r\n/** 状态/写队列按目录(即按命名空间)隔离缓存,确保 prod / test 互不干扰 */\r\nconst cachedStateByDir = new Map<string, ChainState>();\r\nconst bootHandledDirs = new Set<string>();\r\n\r\nfunction statePath($asai: any, ns: LogNamespace): string {\r\n\treturn path.join(getInterventionDir($asai, ns), '.chain-state.json');\r\n}\r\n\r\nasync function loadState($asai: any, ns: LogNamespace): Promise<ChainState> {\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tconst cached = cachedStateByDir.get(dir);\r\n\tif (cached) return cached;\r\n\tawait fsp.mkdir(dir, { recursive: true });\r\n\tlet state: ChainState = { lastHash: 'GENESIS', runningCounter: 0, bootCounter: 0, fileAnchors: {}, fileTip: {} };\r\n\ttry {\r\n\t\tconst raw = await fsp.readFile(statePath($asai, ns), 'utf8');\r\n\t\tconst loaded = JSON.parse(raw);\r\n\t\tstate = { ...state, ...loaded, fileAnchors: loaded.fileAnchors || {}, fileTip: loaded.fileTip || {} };\r\n\t} catch {\r\n\t\t/* 首次运行,使用初始状态 */\r\n\t}\r\n\tif (!bootHandledDirs.has(dir)) {\r\n\t\tstate.bootCounter += 1;\r\n\t\tbootHandledDirs.add(dir);\r\n\t\tawait fsp.writeFile(statePath($asai, ns), JSON.stringify(state), 'utf8');\r\n\t}\r\n\tcachedStateByDir.set(dir, state);\r\n\treturn state;\r\n}\r\n\r\nasync function saveState($asai: any, ns: LogNamespace, state: ChainState): Promise<void> {\r\n\tawait fsp.writeFile(statePath($asai, ns), JSON.stringify(state), 'utf8');\r\n\tcachedStateByDir.set(getInterventionDir($asai, ns), state);\r\n}\r\n\r\n/** 每个命名空间目录各自串行化写入,避免并发请求下运行计数/哈希链错序 */\r\nconst writeQueueByDir = new Map<string, Promise<void>>();\r\n\r\nasync function doLogIntervention(\r\n\t$asai: any,\r\n\tevent: InterventionEvent,\r\n\tns: LogNamespace,\r\n): Promise<{ line: string; file: string }> {\r\n\tconst state = await loadState($asai, ns);\r\n\tstate.runningCounter += 1;\r\n\r\n\tconst category = event.category || DEFAULT_CATEGORY[event.type];\r\n\tconst severity = event.severity ?? DEFAULT_SEVERITY[event.type] ?? 7;\r\n\tconst sigId = SIGNATURE_ID[event.type];\r\n\tconst nowIso = new Date().toISOString();\r\n\r\n\tconst ext: string[] = [];\r\n\text.push(`rt=${escExt(nowIso)}`);\r\n\tif (event.src) ext.push(`src=${escExt(event.src)}`);\r\n\tif (event.dst) ext.push(`dst=${escExt(event.dst)}`);\r\n\text.push(`proto=${escExt(event.proto || 'HTTPS')}`);\r\n\text.push(`cs1=${escExt(CATEGORY_GUIDE[category].en)}`);\r\n\text.push('cs1Label=EventCategory');\r\n\text.push(`cs2=${escExt(event.type)}`);\r\n\text.push('cs2Label=EventType');\r\n\tif (event.identification) {\r\n\t\text.push(`cs3=${escExt(event.identification)}`);\r\n\t\text.push('cs3Label=Identification');\r\n\t}\r\n\text.push(`cn1=${state.bootCounter}`);\r\n\text.push('cn1Label=BootCounter');\r\n\text.push(`cn2=${state.runningCounter}`);\r\n\text.push('cn2Label=RunningCounter');\r\n\text.push(`cn3=${Math.round(process.uptime() * 1000)}`);\r\n\text.push('cn3Label=UptimeMs');\r\n\tif (event.us) ext.push(`suser=${escExt(event.us)}`);\r\n\text.push(`outcome=${escExt(event.outcome || 'Success')}`);\r\n\tif (event.detail) ext.push(`msg=${escExt(event.detail)}`);\r\n\tif (event.fname) ext.push(`fname=${escExt(event.fname)}`);\r\n\r\n\tconst header = [\r\n\t\t'CEF:0',\r\n\t\tescHeader($asai?.hostconfig?.website?.title || 'AsaiCMS'),\r\n\t\tescHeader('AsaiHostNodejs'),\r\n\t\tescHeader($asai?.hostconfig?.website?.ver || '1.0.0.0'),\r\n\t\tescHeader(sigId),\r\n\t\tescHeader(event.name),\r\n\t\tString(severity),\r\n\t].join('|');\r\n\r\n\tconst bodyLine = `${header}|${ext.join(' ')}`;\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tconst fileName = event.type === 'LOG_DELETE' ? DELETION_AUDIT_FILE : `intervention-${getNowTime(2)}.cef.log`;\r\n\r\n\tif (!state.fileAnchors[fileName]) {\r\n\t\tstate.fileAnchors[fileName] = state.lastHash;\r\n\t}\r\n\tconst prevHashForFile = state.fileTip[fileName] ?? state.fileAnchors[fileName];\r\n\r\n\tconst chainHash = sha256Hex(`${prevHashForFile}|${bodyLine}`);\r\n\tconst fullLine = `${bodyLine} cs4=${chainHash} cs4Label=ChainHash\\n`;\r\n\r\n\tconst filePath = path.join(dir, fileName);\r\n\tawait fsp.mkdir(dir, { recursive: true });\r\n\tawait fsp.appendFile(filePath, fullLine, 'utf8');\r\n\r\n\tstate.fileTip[fileName] = chainHash;\r\n\tstate.lastHash = chainHash;\r\n\tawait saveState($asai, ns, state);\r\n\r\n\tvoid mirrorInterventionLog($asai, {\r\n\t\tns,\r\n\t\tfileName,\r\n\t\tevent,\r\n\t\trawLine: fullLine,\r\n\t\tchainHash,\r\n\t\tprevHash: prevHashForFile,\r\n\t\tcategory,\r\n\t\tseverity,\r\n\t}).catch(() => undefined);\r\n\r\n\t($asai?.$log || console.log)('INTERVENTION', `[${ns}]`, event.type, sigId, event.outcome || 'Success');\r\n\r\n\treturn { line: fullLine, file: fileName };\r\n}\r\n\r\n/**\r\n * 记录一条干预日志(IEC 62443-4-2 强制项)。\r\n * 仅应由服务端业务逻辑在真实干预发生时自动调用,禁止暴露\"任意写入\"接口给客户端。\r\n * ns 默认 'prod'(受5年留存保护的生产日志);演示/自动化测试触发的动作必须显式传入 'test',\r\n * 使其落入完全隔离、不计入合规留存的测试命名空间,避免测试足迹污染生产审计证据。\r\n */\r\nexport function logIntervention(\r\n\t$asai: any,\r\n\tevent: InterventionEvent,\r\n\tns: LogNamespace = 'prod',\r\n): Promise<{ line: string; file: string }> {\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tconst prevQueue = writeQueueByDir.get(dir) || Promise.resolve();\r\n\tconst task = prevQueue.then(() => doLogIntervention($asai, event, ns));\r\n\twriteQueueByDir.set(\r\n\t\tdir,\r\n\t\ttask.then(\r\n\t\t\t() => undefined,\r\n\t\t\t() => undefined,\r\n\t\t),\r\n\t);\r\n\treturn task;\r\n}\r\n\r\nfunction parseDateFromFileName(fileName: string): Date | null {\r\n\tconst m = fileName.match(/intervention-(\\d{4})-(\\d{2})-(\\d{2})\\.cef\\.log$/);\r\n\tif (!m) return null;\r\n\treturn new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\r\n}\r\n\r\nexport interface RetentionMeta {\r\n\tfilePath: string;\r\n\tageDays: number;\r\n\tretentionDays: number;\r\n\tretentionYears: number;\r\n\texpired: boolean;\r\n}\r\n\r\nexport function getRetentionMeta($asai: any, fileName: string, ns: LogNamespace = 'prod'): RetentionMeta {\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tconst filePath = path.join(dir, fileName);\r\n\tconst fileDate = parseDateFromFileName(fileName) || new Date(0);\r\n\tconst ageDays = Math.floor((Date.now() - fileDate.getTime()) / 86400000);\r\n\tconst retentionYears = getRetentionYears($asai);\r\n\tconst retentionDays = Math.round(retentionYears * 365.25);\r\n\treturn { filePath, ageDays, retentionDays, retentionYears, expired: ageDays >= retentionDays };\r\n}\r\n\r\nexport async function listInterventionFiles($asai: any, ns: LogNamespace = 'prod') {\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tawait fsp.mkdir(dir, { recursive: true });\r\n\tconst entries = await fsp.readdir(dir, { withFileTypes: true });\r\n\tconst files = entries.filter((e) => e.isFile() && (FILE_NAME_RE.test(e.name) || e.name === DELETION_AUDIT_FILE));\r\n\tconst list = await Promise.all(\r\n\t\tfiles.map(async (e) => {\r\n\t\t\tconst isAuditFile = e.name === DELETION_AUDIT_FILE;\r\n\t\t\tconst filePath = path.join(dir, e.name);\r\n\t\t\tconst stat = await fsp.stat(filePath);\r\n\t\t\tconst meta = isAuditFile\r\n\t\t\t\t? { ageDays: 0, retentionDays: 0, retentionYears: getRetentionYears($asai), expired: false }\r\n\t\t\t\t: getRetentionMeta($asai, e.name, ns);\r\n\t\t\tlet entryCount = 0;\r\n\t\t\ttry {\r\n\t\t\t\tconst content = await fsp.readFile(filePath, 'utf8');\r\n\t\t\t\tentryCount = content.split('\\n').filter((l) => l.trim().startsWith('CEF:')).length;\r\n\t\t\t} catch {\r\n\t\t\t\t/* 忽略读取失败,entryCount 保持 0 */\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tname: e.name,\r\n\t\t\t\tns,\r\n\t\t\t\tsize: stat.size,\r\n\t\t\t\tmtime: stat.mtime.toISOString(),\r\n\t\t\t\tentryCount,\r\n\t\t\t\tageDays: meta.ageDays,\r\n\t\t\t\tretentionDays: meta.retentionDays,\r\n\t\t\t\tretentionYears: meta.retentionYears,\r\n\t\t\t\texpired: meta.expired,\r\n\t\t\t\tprotectedAudit: isAuditFile,\r\n\t\t\t};\r\n\t\t}),\r\n\t);\r\n\tlist.sort((a, b) => (a.name < b.name ? 1 : -1));\r\n\treturn list;\r\n}\r\n\r\n/** 手动扫描 CEF 头部(Version|Vendor|Product|DeviceVersion|SignatureID|Name|Severity),避免转义竖线干扰扩展字段解析 */\r\nfunction splitCefHeader(line: string): { header: string[]; extensionStr: string } | null {\r\n\tif (!line.startsWith('CEF:')) return null;\r\n\tconst header: string[] = [];\r\n\tlet cur = '';\r\n\tlet i = 4;\r\n\tlet count = 0;\r\n\twhile (i < line.length && count < 7) {\r\n\t\tconst ch = line[i];\r\n\t\tif (ch === '\\\\' && i + 1 < line.length) {\r\n\t\t\tcur += line[i + 1];\r\n\t\t\ti += 2;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (ch === '|') {\r\n\t\t\theader.push(cur);\r\n\t\t\tcur = '';\r\n\t\t\tcount++;\r\n\t\t\ti++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tcur += ch;\r\n\t\ti++;\r\n\t}\r\n\tif (count < 7) return null;\r\n\treturn { header, extensionStr: line.slice(i) };\r\n}\r\n\r\nfunction parseExtension(extStr: string): Record<string, string> {\r\n\tconst extension: Record<string, string> = {};\r\n\tconst re = /([A-Za-z0-9]+)=((?:\\\\.|[^\\\\])*?)(?=\\s+[A-Za-z0-9]+=|$)/g;\r\n\tlet m: RegExpExecArray | null;\r\n\twhile ((m = re.exec(extStr))) {\r\n\t\textension[m[1]] = m[2].replace(/\\\\=/g, '=').replace(/\\\\\\\\/g, '\\\\').trim();\r\n\t}\r\n\treturn extension;\r\n}\r\n\r\nexport interface ParsedCefLine {\r\n\tlineNo: number;\r\n\tvalid: boolean;\r\n\traw: string;\r\n\tcefVersion?: string;\r\n\tvendor?: string;\r\n\tproduct?: string;\r\n\tversion?: string;\r\n\tsignatureId?: string;\r\n\tname?: string;\r\n\tseverity?: number;\r\n\tcategory?: string;\r\n\teventType?: string;\r\n\tidentification?: string;\r\n\tbootCounter?: string;\r\n\trunningCounter?: string;\r\n\tuptimeMs?: string;\r\n\toperator?: string;\r\n\toutcome?: string;\r\n\tdetail?: string;\r\n\ttimestamp?: string;\r\n\tchainHash?: string;\r\n}\r\n\r\nexport function parseCefLine(line: string, lineNo = 0): ParsedCefLine {\r\n\tconst split = splitCefHeader(line);\r\n\tif (!split) return { lineNo, valid: false, raw: line };\r\n\tconst [cefVersion, vendor, product, version, signatureId, name, severity] = split.header;\r\n\tconst ext = parseExtension(split.extensionStr);\r\n\treturn {\r\n\t\tlineNo,\r\n\t\tvalid: true,\r\n\t\traw: line,\r\n\t\tcefVersion,\r\n\t\tvendor,\r\n\t\tproduct,\r\n\t\tversion,\r\n\t\tsignatureId,\r\n\t\tname,\r\n\t\tseverity: Number(severity),\r\n\t\tcategory: ext.cs1,\r\n\t\teventType: ext.cs2,\r\n\t\tidentification: ext.cs3,\r\n\t\tbootCounter: ext.cn1,\r\n\t\trunningCounter: ext.cn2,\r\n\t\tuptimeMs: ext.cn3,\r\n\t\toperator: ext.suser,\r\n\t\toutcome: ext.outcome,\r\n\t\tdetail: ext.msg,\r\n\t\ttimestamp: ext.rt,\r\n\t\tchainHash: ext.cs4,\r\n\t};\r\n}\r\n\r\nexport interface ChainVerifyResult {\r\n\tok: boolean;\r\n\tresults: { line: number; ok: boolean; expected?: string; found?: string }[];\r\n}\r\n\r\n/** 依据文件锚点哈希重放整条链,任意历史记录被删改都会导致自该行起全部校验失败 */\r\nexport async function verifyChainForFile(\r\n\t$asai: any,\r\n\tfileName: string,\r\n\tlines: string[],\r\n\tns: LogNamespace = 'prod',\r\n): Promise<ChainVerifyResult> {\r\n\tconst state = await loadState($asai, ns);\r\n\tlet prevHash = state.fileAnchors?.[fileName] ?? 'GENESIS';\r\n\tconst results: ChainVerifyResult['results'] = [];\r\n\tlet lineNo = 0;\r\n\tfor (const raw of lines) {\r\n\t\tlineNo++;\r\n\t\tif (!raw.trim()) continue;\r\n\t\tconst m = raw.match(/\\bcs4=([0-9a-f]{64})\\b/);\r\n\t\tconst found = m ? m[1] : '';\r\n\t\tconst bodyLine = raw.replace(/\\s+cs4=[0-9a-f]{64}\\s+cs4Label=ChainHash\\s*$/, '');\r\n\t\tconst expected = sha256Hex(`${prevHash}|${bodyLine}`);\r\n\t\tconst ok = !!found && found === expected;\r\n\t\tresults.push({ line: lineNo, ok, expected, found });\r\n\t\tprevHash = found || expected;\r\n\t}\r\n\treturn { ok: results.every((r) => r.ok), results };\r\n}\r\n\r\nexport interface InterventionFileContent {\r\n\tfileName: string;\r\n\traw: string;\r\n\tparsed: ParsedCefLine[];\r\n\tchain: ChainVerifyResult;\r\n\tmeta: RetentionMeta;\r\n}\r\n\r\nexport async function readInterventionFile(\r\n\t$asai: any,\r\n\tfileName: string,\r\n\tns: LogNamespace = 'prod',\r\n): Promise<InterventionFileContent> {\r\n\tif (!FILE_NAME_RE.test(fileName) && fileName !== DELETION_AUDIT_FILE) throw new Error('Invalid file name');\r\n\tconst dir = getInterventionDir($asai, ns);\r\n\tconst filePath = path.join(dir, fileName);\r\n\tconst raw = await fsp.readFile(filePath, 'utf8');\r\n\tconst lines = raw.split('\\n').filter((l) => l.trim().length > 0);\r\n\tconst parsed = lines.map((l, idx) => parseCefLine(l, idx + 1));\r\n\tconst chain = await verifyChainForFile($asai, fileName, lines, ns);\r\n\tif (!chain.ok) {\r\n\t\tconst { maybeAlertChainBreak } = await import('../../../infra/log-alert');\r\n\t\tmaybeAlertChainBreak($asai, fileName, false, ns);\r\n\t}\r\n\tconst meta =\r\n\t\tfileName === DELETION_AUDIT_FILE\r\n\t\t\t? { filePath, ageDays: 0, retentionDays: 0, retentionYears: getRetentionYears($asai), expired: false }\r\n\t\t\t: getRetentionMeta($asai, fileName, ns);\r\n\treturn { fileName, raw, parsed, chain, meta };\r\n}\r\n\r\nexport interface DeleteOptions {\r\n\tus?: string;\r\n\tlv?: number;\r\n\treason?: string;\r\n\tforce?: boolean;\r\n}\r\n\r\n/**\r\n * 删除干预日志文件 — 留存期内(默认5年)仅允许 lv≥3 且提供 reason + force 的强制覆盖;\r\n * 无论是否放行,删除动作本身都会作为 LOG_DELETE 事件被记录(标准强制要求项)。\r\n */\r\nexport async function deleteInterventionFile(\r\n\t$asai: any,\r\n\tfileName: string,\r\n\topt: DeleteOptions = {},\r\n\tns: LogNamespace = 'prod',\r\n) {\r\n\tif (!FILE_NAME_RE.test(fileName)) throw new Error('Invalid file name');\r\n\tconst meta = getRetentionMeta($asai, fileName, ns);\r\n\tconst lv = opt.lv ?? -1;\r\n\r\n\tlet allowed = false;\r\n\tlet reasonCode = '';\r\n\tif (meta.expired) {\r\n\t\tallowed = lv >= 2;\r\n\t\treasonCode = allowed ? '' : 'INSUFFICIENT_LEVEL';\r\n\t} else if (!opt.force) {\r\n\t\treasonCode = 'RETENTION_NOT_EXPIRED';\r\n\t} else if (lv < 3) {\r\n\t\treasonCode = 'INSUFFICIENT_LEVEL';\r\n\t} else if (!opt.reason) {\r\n\t\treasonCode = 'REASON_REQUIRED';\r\n\t} else {\r\n\t\tallowed = true;\r\n\t}\r\n\r\n\tawait logIntervention(\r\n\t\t$asai,\r\n\t\t{\r\n\t\t\ttype: 'LOG_DELETE',\r\n\t\t\tname: `Delete intervention log file: ${fileName}`,\r\n\t\t\tus: opt.us || 'system',\r\n\t\t\toutcome: allowed ? 'Success' : 'Failure',\r\n\t\t\tidentification: fileName,\r\n\t\t\tseverity: allowed ? 7 : 8,\r\n\t\t\tdetail: `${allowed ? 'deleted' : 'denied'} reason=\"${opt.reason || ''}\" ageDays=${meta.ageDays} retentionDays=${meta.retentionDays} force=${!!opt.force} code=${reasonCode}`,\r\n\t\t},\r\n\t\tns,\r\n\t);\r\n\r\n\tif (!allowed) {\r\n\t\tconst err: any = new Error(reasonCode || 'DELETE_DENIED');\r\n\t\tthrow err;\r\n\t}\r\n\tawait fsp.unlink(meta.filePath);\r\n\tvoid purgeSqliteEntriesForFile($asai, fileName, ns).catch(() => undefined);\r\n\t/**\r\n\t * 物理内容已被删除(该删除动作已通过上面的 LOG_DELETE 写入不可删的审计文件),\r\n\t * 若同名文件之后被重新创建(如当日再次触发同类型事件),必须视为一份全新文件从头计链,\r\n\t * 而不是继续沿用已被删除内容的旧链尾/旧锚点——否则新文件的第一行会因为 prevHash\r\n\t * 对不上\"重新计算出的锚点\"而被误判为篡改。\r\n\t */\r\n\tconst state = await loadState($asai, ns);\r\n\tdelete state.fileAnchors[fileName];\r\n\tdelete state.fileTip[fileName];\r\n\tawait saveState($asai, ns, state);\r\n\treturn { deleted: true, fileName };\r\n}\r\n\r\nexport function getInterventionTaxonomy($asai?: any) {\r\n\treturn {\r\n\t\tformats: getLogFormatTaxonomy($asai).formats,\r\n\t\ttypes: (Object.keys(SIGNATURE_ID) as InterventionType[]).map((type) => ({\r\n\t\t\ttype,\r\n\t\t\tsignatureId: SIGNATURE_ID[type],\r\n\t\t\tcategory: DEFAULT_CATEGORY[type],\r\n\t\t\tdefaultSeverity: DEFAULT_SEVERITY[type],\r\n\t\t})),\r\n\t\tcategories: (Object.keys(CATEGORY_GUIDE) as InterventionCategory[]).map((key) => ({\r\n\t\t\tkey,\r\n\t\t\t...CATEGORY_GUIDE[key],\r\n\t\t})),\r\n\t\tretentionYears: 5,\r\n\t\texceptions: [\r\n\t\t\t'未改变安全参数/配置/软件/HMI 危险参数/安全指令显示软件的干预无需记录(如常规鉴权成功/失败)',\r\n\t\t\t'触发机器安全状态的动作(如安全光幕开启)不在记录范围内',\r\n\t\t\t'无需在日志中存储 SRASW/SRESW 二进制文件的真实版本号,使用 CRC/哈希等标识手段即可',\r\n\t\t],\r\n\t};\r\n}\r\n"],"mappings":"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","names":[]}
@@ -29,6 +29,9 @@ function resolveStoreConfig($asai, domain) {
29
29
  const u = host.userStore;
30
30
  return { type: u.type || "file", opt: u.opt || {} };
31
31
  }
32
+ if (domain === "user") {
33
+ return { type: "file", opt: { dir: "webdata/webdb/users/", ext: ".json", create: 1 } };
34
+ }
32
35
  if (domain === "log" && host.logger?.store) {
33
36
  const s = host.logger.store;
34
37
  return { type: s.type || "sqlite", opt: { database: s.database, create: s.create, dir: s.dir, ext: s.ext } };
@@ -82,7 +85,11 @@ function getDataServerBySpec($asai, spec) {
82
85
  const cache = cacheMap($asai);
83
86
  if (cache.has(key)) return cache.get(key);
84
87
  const factory = $asai.dataserver;
85
- const instance = factory(full.type, full.opt);
88
+ if (typeof factory !== "function") {
89
+ throw new Error("[data-store] $asai.dataserver \u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 sysserver($asai)");
90
+ }
91
+ const dbDrivers = $asai.$lib?.db ?? {};
92
+ const instance = factory(full.type, full.opt, dbDrivers);
86
93
  cache.set(key, instance);
87
94
  return instance;
88
95
  }
@@ -143,7 +150,7 @@ async function writeJsonBlob(db, filename, data) {
143
150
  type: "update",
144
151
  table: "",
145
152
  where: [["name", "=", filename]],
146
- set: [["name", content]]
153
+ set: [["content", content]]
147
154
  });
148
155
  }
149
156
  __name(writeJsonBlob, "writeJsonBlob");
@@ -159,4 +166,4 @@ export {
159
166
  readJsonBlob,
160
167
  writeJsonBlob
161
168
  };
162
- //# sourceMappingURL=chunk-KUZQ36IJ.es.js.map
169
+ //# sourceMappingURL=chunk-ZQBHJRAO.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sysserver/db/data-store.ts"],"sourcesContent":["/**\r\n * 统一数据存储注册表 — file / sqlite / mysql 自由切换,全库数据读写经此入口\r\n */\r\nimport type { DbType, DbDriversMap, InitDbFn } from '../db';\r\nimport type { DbInstance } from './src/common';\r\nimport type Idb from './src/type';\r\n\r\nexport type StoreDomain = 'user' | 'log' | (string & {});\r\n\r\nexport interface StoreSpec {\r\n domain: StoreDomain;\r\n type: DbType;\r\n opt: Record<string, unknown>;\r\n}\r\n\r\nexport interface ResolvedStoreConfig {\r\n type: DbType;\r\n opt: Record<string, unknown>;\r\n}\r\n\r\nconst CACHE_KEY = '_dataStoreRegistry';\r\n\r\nfunction cacheMap($asai: any): Map<string, DbInstance> {\r\n if (!$asai[CACHE_KEY]) $asai[CACHE_KEY] = new Map<string, DbInstance>();\r\n return $asai[CACHE_KEY];\r\n}\r\n\r\nfunction specCacheKey(spec: StoreSpec): string {\r\n const opt = { ...spec.opt };\r\n delete opt.$asai;\r\n return `${spec.domain}:${spec.type}:${JSON.stringify(opt)}`;\r\n}\r\n\r\n/** 从 asaihost 解析域配置(dataStores 优先,兼容 userStore / logger.store) */\r\nexport function resolveStoreConfig($asai: any, domain: StoreDomain): ResolvedStoreConfig {\r\n const host = $asai?.hostconfig || {};\r\n const stores = host.dataStores || {};\r\n\r\n if (stores[domain] && typeof stores[domain] === 'object') {\r\n const s = stores[domain] as Record<string, unknown>;\r\n return {\r\n type: (s.type as DbType) || 'file',\r\n opt: (s.opt as Record<string, unknown>) || {},\r\n };\r\n }\r\n\r\n\tif (domain === 'user' && host.userStore) {\r\n\t\tconst u = host.userStore;\r\n\t\treturn { type: (u.type as DbType) || 'file', opt: u.opt || {} };\r\n\t}\r\n\r\n\tif (domain === 'user') {\r\n\t\treturn { type: 'file', opt: { dir: 'webdata/webdb/users/', ext: '.json', create: 1 } };\r\n\t}\r\n\r\n if (domain === 'log' && host.logger?.store) {\r\n const s = host.logger.store;\r\n return { type: (s.type as DbType) || 'sqlite', opt: { database: s.database, create: s.create, dir: s.dir, ext: s.ext } };\r\n }\r\n\r\n if (domain === 'default' || domain === 'app') {\r\n return {\r\n type: 'sqlite',\r\n opt: { database: './webdata/webdb/sqlite/asaisqlite.db', create: 1 },\r\n };\r\n }\r\n\r\n return { type: 'file', opt: {} };\r\n}\r\n\r\n/** 归一化各驱动的 opt 默认值 */\r\nexport function normalizeStoreOpt(domain: StoreDomain, type: DbType, opt: Record<string, unknown>): Record<string, unknown> {\r\n const o = { ...opt };\r\n if (type === 'file') {\r\n if (domain === 'user') {\r\n if (!o.dir) o.dir = 'webdata/webdb/users/';\r\n if (!o.ext) o.ext = '.json';\r\n } else if (domain === 'log') {\r\n if (!o.dir) o.dir = 'webdata/webdb/log/store/';\r\n if (!o.ext) o.ext = '.json';\r\n }\r\n if (o.create == null) o.create = 1;\r\n } else if (type === 'sqlite') {\r\n if (domain === 'user' && !o.database) o.database = './webdata/webdb/users/users.db';\r\n if (domain === 'log' && !o.database) o.database = './webdata/webdb/log/asai-logs.db';\r\n if ((domain === 'default' || domain === 'app') && !o.database) o.database = './webdata/webdb/sqlite/asaisqlite.db';\r\n if (o.create == null) o.create = 1;\r\n } else if (type === 'mysql') {\r\n if (!o.host) o.host = '127.0.0.1';\r\n if (!o.user) o.user = 'root';\r\n if (!o.password) o.password = '';\r\n if (!o.database) o.database = domain === 'log' ? 'asai_logs' : 'asai';\r\n if (o.create == null) o.create = 1;\r\n }\r\n return o;\r\n}\r\n\r\n/**\r\n * 获取(并缓存)数据服务实例 — 全库统一入口\r\n * @param domain 预置域 user|log,或 AsDb 自定义域(建议含 database/dir 唯一标识)\r\n */\r\nexport function getDataServer($asai: any, domain: StoreDomain): DbInstance {\r\n const resolved = resolveStoreConfig($asai, domain);\r\n const opt = normalizeStoreOpt(domain, resolved.type, resolved.opt);\r\n const spec: StoreSpec = { domain, type: resolved.type, opt };\r\n return getDataServerBySpec($asai, spec);\r\n}\r\n\r\n/** 按显式 spec 获取实例(AsDb / 业务插件用) */\r\nexport function getDataServerBySpec($asai: any, spec: StoreSpec): DbInstance {\r\n const opt = normalizeStoreOpt(spec.domain, spec.type, { ...spec.opt, $asai });\r\n const full: StoreSpec = { ...spec, opt };\r\n const key = specCacheKey(full);\r\n const cache = cacheMap($asai);\r\n if (cache.has(key)) return cache.get(key)!;\r\n\r\n const factory = $asai.dataserver as InitDbFn | undefined;\r\n if (typeof factory !== 'function') {\r\n throw new Error('[data-store] $asai.dataserver 未初始化,请先调用 sysserver($asai)');\r\n }\r\n const dbDrivers = ($asai.$lib?.db ?? {}) as DbDriversMap;\r\n const instance = factory(full.type, full.opt, dbDrivers);\r\n cache.set(key, instance);\r\n return instance;\r\n}\r\n\r\n/** AsDb 路由:按 cfg 生成稳定域键并复用连接 */\r\nexport function getDataServerForAsDb($asai: any, cfg: { type?: string; opt?: Record<string, unknown>; storeKey?: string }): DbInstance {\r\n const type = (cfg?.type || 'sqlite') as DbType;\r\n const opt = cfg?.opt || {};\r\n const domain = cfg?.storeKey || `asdb:${type}:${opt.database || opt.dir || 'default'}`;\r\n return getDataServerBySpec($asai, { domain, type, opt });\r\n}\r\n\r\nexport function invalidateDataStore($asai: any, domain?: StoreDomain): void {\r\n const cache = cacheMap($asai);\r\n if (!domain) {\r\n cache.clear();\r\n return;\r\n }\r\n for (const key of [...cache.keys()]) {\r\n if (key.startsWith(`${domain}:`)) cache.delete(key);\r\n }\r\n}\r\n\r\nexport function isStoreSqlBackend($asai: any, domain: StoreDomain): boolean {\r\n const { type } = resolveStoreConfig($asai, domain);\r\n return type === 'sqlite' || type === 'mysql';\r\n}\r\n\r\nexport function isStoreFileBackend($asai: any, domain: StoreDomain): boolean {\r\n return resolveStoreConfig($asai, domain).type === 'file';\r\n}\r\n\r\n/** 共享 SQL 字面量转义(file 驱动不加引号) */\r\nexport function qStr(val: string | undefined | null, dbType: DbType): string {\r\n if (val == null || val === '') return \"''\";\r\n const s = String(val).replace(/'/g, \"''\");\r\n return dbType === 'file' ? s : `'${s}'`;\r\n}\r\n\r\nexport function qNum(val: number | undefined | null): string {\r\n return String(Number(val ?? 0));\r\n}\r\n\r\nexport function asRows(result: unknown): Record<string, unknown>[] {\r\n if (!result) return [];\r\n if (Array.isArray(result)) return result as Record<string, unknown>[];\r\n return [];\r\n}\r\n\r\nexport async function readJsonBlob(db: { sqlDb(sql: Idb): Promise<unknown> }, filename: string): Promise<Record<string, unknown>[]> {\r\n const res = await db.sqlDb({\r\n type: 'select',\r\n table: '',\r\n where: [['name', '=', filename]],\r\n field: ['name', 'content'],\r\n });\r\n const rows = asRows(res);\r\n if (!rows.length) return [];\r\n try {\r\n const parsed = JSON.parse(String(rows[0].content || '[]'));\r\n return Array.isArray(parsed) ? parsed : [];\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function writeJsonBlob(db: { sqlDb(sql: Idb): Promise<unknown> }, filename: string, data: Record<string, unknown>[]): Promise<void> {\r\n const content = JSON.stringify(data, null, 2);\r\n const probe = await db.sqlDb({\r\n type: 'select',\r\n table: '',\r\n where: [['name', '=', filename]],\r\n field: ['name', 'content'],\r\n });\r\n if (!asRows(probe).length) {\r\n await db.sqlDb({ type: 'insert', table: '', value: [[filename, content]] });\r\n return;\r\n }\r\n await db.sqlDb({\r\n type: 'update',\r\n table: '',\r\n where: [['name', '=', filename]],\r\n set: [['content', content]],\r\n });\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,21 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+ var _chunkRIRKIYETcjs = require('./chunk-RIRKIYET.cjs');
8
+ require('./chunk-4E7Z5K5U.cjs');
9
+ require('./chunk-TKJAHTPO.cjs');
10
+ require('./chunk-OCEBEEP5.cjs');
11
+ require('./chunk-O6LVLSNB.cjs');
12
+ require('./chunk-2BCIIKRG.cjs');
13
+ require('./chunk-SMVZ3ZDJ.cjs');
14
+
15
+
16
+
17
+
18
+
19
+
20
+ exports.logAccountPurge = _chunkRIRKIYETcjs.logAccountPurge; exports.logProcessGuardEvent = _chunkRIRKIYETcjs.logProcessGuardEvent; exports.logSecurityConfigIntervention = _chunkRIRKIYETcjs.logSecurityConfigIntervention; exports.logSessionTerminate = _chunkRIRKIYETcjs.logSessionTerminate; exports.logUserRbacChange = _chunkRIRKIYETcjs.logUserRbacChange;
21
+ //# sourceMappingURL=intervention-hooks-KF3SNB5Q.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\intervention-hooks-LE6X4C6N.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,kWAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\intervention-hooks-LE6X4C6N.cjs"}
1
+ {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\intervention-hooks-KF3SNB5Q.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,kWAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\intervention-hooks-KF3SNB5Q.cjs"}
@@ -4,12 +4,12 @@ import {
4
4
  logSecurityConfigIntervention,
5
5
  logSessionTerminate,
6
6
  logUserRbacChange
7
- } from "./chunk-XBIN4C2V.es.js";
8
- import "./chunk-MCMADJQR.es.js";
9
- import "./chunk-LOMSUPPU.es.js";
10
- import "./chunk-4WJDC4M4.es.js";
7
+ } from "./chunk-SB23ESX2.es.js";
8
+ import "./chunk-VUZO7DCA.es.js";
9
+ import "./chunk-LTEP4XB2.es.js";
10
+ import "./chunk-NLZNIGNF.es.js";
11
11
  import "./chunk-UTKVJE7N.es.js";
12
- import "./chunk-KUZQ36IJ.es.js";
12
+ import "./chunk-ZQBHJRAO.es.js";
13
13
  import "./chunk-6U2I5EON.es.js";
14
14
  export {
15
15
  logAccountPurge,
@@ -18,4 +18,4 @@ export {
18
18
  logSessionTerminate,
19
19
  logUserRbacChange
20
20
  };
21
- //# sourceMappingURL=intervention-hooks-FI4EHOL5.es.js.map
21
+ //# sourceMappingURL=intervention-hooks-TCGIC4IV.es.js.map
@@ -0,0 +1,31 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ var _chunkOCEBEEP5cjs = require('./chunk-OCEBEEP5.cjs');
15
+ require('./chunk-O6LVLSNB.cjs');
16
+ require('./chunk-SMVZ3ZDJ.cjs');
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ exports.W3C_ACCESS_FIELDS = _chunkOCEBEEP5cjs.W3C_ACCESS_FIELDS; exports.W3C_SERVER_FIELDS = _chunkOCEBEEP5cjs.W3C_SERVER_FIELDS; exports.buildAccessEntry = _chunkOCEBEEP5cjs.buildAccessEntry; exports.extractW3CFields = _chunkOCEBEEP5cjs.extractW3CFields; exports.formatCLF = _chunkOCEBEEP5cjs.formatCLF; exports.formatClfDate = _chunkOCEBEEP5cjs.formatClfDate; exports.formatW3CAccessRecord = _chunkOCEBEEP5cjs.formatW3CAccessRecord; exports.formatW3CHeader = _chunkOCEBEEP5cjs.formatW3CHeader; exports.formatW3CServerRecord = _chunkOCEBEEP5cjs.formatW3CServerRecord; exports.getLogFormatTaxonomy = _chunkOCEBEEP5cjs.getLogFormatTaxonomy; exports.parseCLF = _chunkOCEBEEP5cjs.parseCLF; exports.parseW3CRecord = _chunkOCEBEEP5cjs.parseW3CRecord;
31
+ //# sourceMappingURL=log-formats-TUXGMCCU.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\log-formats-FKFMQKNO.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yuBAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\log-formats-FKFMQKNO.cjs"}
1
+ {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\log-formats-TUXGMCCU.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yuBAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\log-formats-TUXGMCCU.cjs"}
@@ -11,7 +11,7 @@ import {
11
11
  getLogFormatTaxonomy,
12
12
  parseCLF,
13
13
  parseW3CRecord
14
- } from "./chunk-4WJDC4M4.es.js";
14
+ } from "./chunk-NLZNIGNF.es.js";
15
15
  import "./chunk-UTKVJE7N.es.js";
16
16
  import "./chunk-6U2I5EON.es.js";
17
17
  export {
@@ -28,4 +28,4 @@ export {
28
28
  parseCLF,
29
29
  parseW3CRecord
30
30
  };
31
- //# sourceMappingURL=log-formats-I5E32H5F.es.js.map
31
+ //# sourceMappingURL=log-formats-WW3TDUAK.es.js.map
@@ -5,9 +5,9 @@ import {
5
5
  validatePasswordPolicy,
6
6
  verifyHostPassword,
7
7
  verifyPassword
8
- } from "./chunk-DROOHKB3.es.js";
9
- import "./chunk-EOGZPRML.es.js";
10
- import "./chunk-KUZQ36IJ.es.js";
8
+ } from "./chunk-57UQJKSL.es.js";
9
+ import "./chunk-A5CDJGJI.es.js";
10
+ import "./chunk-ZQBHJRAO.es.js";
11
11
  import "./chunk-6U2I5EON.es.js";
12
12
  export {
13
13
  hashPassword,
@@ -17,4 +17,4 @@ export {
17
17
  verifyHostPassword,
18
18
  verifyPassword
19
19
  };
20
- //# sourceMappingURL=password-63OY27RX.es.js.map
20
+ //# sourceMappingURL=password-4BABWAG4.es.js.map
@@ -0,0 +1,20 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+ var _chunkK2QPSQEVcjs = require('./chunk-K2QPSQEV.cjs');
9
+ require('./chunk-H3K33HBA.cjs');
10
+ require('./chunk-2BCIIKRG.cjs');
11
+ require('./chunk-SMVZ3ZDJ.cjs');
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+ exports.hashPassword = _chunkK2QPSQEVcjs.hashPassword; exports.nextPassHistory = _chunkK2QPSQEVcjs.nextPassHistory; exports.validatePasswordChange = _chunkK2QPSQEVcjs.validatePasswordChange; exports.validatePasswordPolicy = _chunkK2QPSQEVcjs.validatePasswordPolicy; exports.verifyHostPassword = _chunkK2QPSQEVcjs.verifyHostPassword; exports.verifyPassword = _chunkK2QPSQEVcjs.verifyPassword;
20
+ //# sourceMappingURL=password-PJHJRGPE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\password-NZ5EGDWG.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,uYAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\password-NZ5EGDWG.cjs"}
1
+ {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\password-PJHJRGPE.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,uYAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\password-PJHJRGPE.cjs"}
@@ -0,0 +1,12 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkLXJMGLKWcjs = require('./chunk-LXJMGLKW.cjs');
5
+ require('./chunk-H3K33HBA.cjs');
6
+ require('./chunk-2BCIIKRG.cjs');
7
+ require('./chunk-SMVZ3ZDJ.cjs');
8
+
9
+
10
+
11
+ exports.createUserStore = _chunkLXJMGLKWcjs.createUserStore; exports.ensureBootstrapAdmin = _chunkLXJMGLKWcjs.ensureBootstrapAdmin;
12
+ //# sourceMappingURL=user-store-6J2PSEIN.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\user-store-SX4N6PQ4.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,mIAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\user-store-SX4N6PQ4.cjs"}
1
+ {"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\user-store-6J2PSEIN.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,mIAAC","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\user-store-6J2PSEIN.cjs"}
@@ -0,0 +1,12 @@
1
+ import {
2
+ createUserStore,
3
+ ensureBootstrapAdmin
4
+ } from "./chunk-A6VJPLDD.es.js";
5
+ import "./chunk-A5CDJGJI.es.js";
6
+ import "./chunk-ZQBHJRAO.es.js";
7
+ import "./chunk-6U2I5EON.es.js";
8
+ export {
9
+ createUserStore,
10
+ ensureBootstrapAdmin
11
+ };
12
+ //# sourceMappingURL=user-store-UC5URX3C.es.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asaihost-nodejs",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "AsaiWeb CMS Node.js host plugin — HTTP/WebSocket server, sysserver platform API, IEC 62443 security kernel",
5
5
  "type": "module",
6
6
  "author": "asai.cc",
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "https://github.com/asai-cc/asaicms-v1.git",
20
+ "url": "https://github.com/asai-cc/asaicms-v1/tree/main/webserver/src/plugs/asaihost-nodejs/",
21
21
  "directory": "webserver/src/plugs/asaihost-nodejs"
22
22
  },
23
23
  "bugs": {
@@ -51,17 +51,6 @@
51
51
  "dependencies": {
52
52
  "ws": "^8.18.1"
53
53
  },
54
- "optionalDependencies": {
55
- "mysql": "^2.18.1",
56
- "sqlite3": "^6.0.1"
57
- },
58
- "peerDependencies": {
59
- "ws": "^8.18.0"
60
- },
61
- "peerDependenciesMeta": {
62
- "mysql": { "optional": true },
63
- "sqlite3": { "optional": true }
64
- },
65
54
  "devDependencies": {
66
55
  "@types/node": "^22.15.0",
67
56
  "@types/ws": "^8.18.1",
@@ -1,30 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
- var _chunkG4WVDUBHcjs = require('./chunk-G4WVDUBH.cjs');
13
- require('./chunk-VLMM735Q.cjs');
14
- require('./chunk-W7DVKGX5.cjs');
15
- require('./chunk-O6LVLSNB.cjs');
16
- require('./chunk-HHPGUJ75.cjs');
17
- require('./chunk-SMVZ3ZDJ.cjs');
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
- exports.crc32 = _chunkG4WVDUBHcjs.crc32; exports.deleteInterventionFile = _chunkG4WVDUBHcjs.deleteInterventionFile; exports.getInterventionTaxonomy = _chunkG4WVDUBHcjs.getInterventionTaxonomy; exports.getRetentionMeta = _chunkG4WVDUBHcjs.getRetentionMeta; exports.listInterventionFiles = _chunkG4WVDUBHcjs.listInterventionFiles; exports.logIntervention = _chunkG4WVDUBHcjs.logIntervention; exports.parseCefLine = _chunkG4WVDUBHcjs.parseCefLine; exports.readInterventionFile = _chunkG4WVDUBHcjs.readInterventionFile; exports.sha256Hex = _chunkG4WVDUBHcjs.sha256Hex; exports.verifyChainForFile = _chunkG4WVDUBHcjs.verifyChainForFile;
30
- //# sourceMappingURL=InterventionLog-25EHE4QR.cjs.map
@@ -1,54 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
- var _chunkVLMM735Qcjs = require('./chunk-VLMM735Q.cjs');
26
- require('./chunk-O6LVLSNB.cjs');
27
- require('./chunk-HHPGUJ75.cjs');
28
- require('./chunk-SMVZ3ZDJ.cjs');
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
- exports.archiveInterventionYear = _chunkVLMM735Qcjs.archiveInterventionYear; exports.exportLogContent = _chunkVLMM735Qcjs.exportLogContent; exports.getComplianceReport = _chunkVLMM735Qcjs.getComplianceReport; exports.getEffectiveStoreType = _chunkVLMM735Qcjs.getEffectiveStoreType; exports.getLogStoreConfig = _chunkVLMM735Qcjs.getLogStoreConfig; exports.getLogStoreMeta = _chunkVLMM735Qcjs.getLogStoreMeta; exports.getUnifiedEntry = _chunkVLMM735Qcjs.getUnifiedEntry; exports.getUnifiedStats = _chunkVLMM735Qcjs.getUnifiedStats; exports.groupsToInterventionFiles = _chunkVLMM735Qcjs.groupsToInterventionFiles; exports.groupsToManageChildren = _chunkVLMM735Qcjs.groupsToManageChildren; exports.isLogStoreEnabled = _chunkVLMM735Qcjs.isLogStoreEnabled; exports.isLogStoreFileBackend = _chunkVLMM735Qcjs.isLogStoreFileBackend; exports.isLogStoreSqlite = _chunkVLMM735Qcjs.isLogStoreSqlite; exports.listUnifiedGroups = _chunkVLMM735Qcjs.listUnifiedGroups; exports.mirrorAccessLog = _chunkVLMM735Qcjs.mirrorAccessLog; exports.mirrorInterventionLog = _chunkVLMM735Qcjs.mirrorInterventionLog; exports.mirrorWebLog = _chunkVLMM735Qcjs.mirrorWebLog; exports.prefersDiskLogAccess = _chunkVLMM735Qcjs.prefersDiskLogAccess; exports.purgeSqliteEntriesForFile = _chunkVLMM735Qcjs.purgeSqliteEntriesForFile; exports.purgeStoreEntriesForFile = _chunkVLMM735Qcjs.purgeStoreEntriesForFile; exports.queryUnifiedLogs = _chunkVLMM735Qcjs.queryUnifiedLogs; exports.readWebLogFromStore = _chunkVLMM735Qcjs.readWebLogFromStore; exports.searchUnifiedLogs = _chunkVLMM735Qcjs.searchUnifiedLogs;
54
- //# sourceMappingURL=LogStore-M2AUBNGO.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sysserver/lib/common/log-formats.ts"],"sourcesContent":["/**\r\n * IEC 62443-4-2 CR2.8 日志格式规范 — CLF / W3C Extended / CEF\r\n *\r\n * 1) CLF — Common Log Format (RFC 6872)\r\n * 2) W3C Extended Log File Format\r\n * 3) CEF — Common Event Format (ArcSight / SIEM)\r\n */\r\nimport { getNowTime } from '../../../core/time';\r\n\r\n/** CLF 日期格式:[02/Jul/2026:15:42:10 +0800] */\r\nexport function formatClfDate(date: Date = new Date()): string {\r\n\tconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n\tconst day = String(date.getDate()).padStart(2, '0');\r\n\tconst mon = months[date.getMonth()];\r\n\tconst year = date.getFullYear();\r\n\tconst h = String(date.getHours()).padStart(2, '0');\r\n\tconst m = String(date.getMinutes()).padStart(2, '0');\r\n\tconst s = String(date.getSeconds()).padStart(2, '0');\r\n\tconst tzOffset = -date.getTimezoneOffset();\r\n\tconst tzSign = tzOffset >= 0 ? '+' : '-';\r\n\tconst tzH = String(Math.floor(Math.abs(tzOffset) / 60)).padStart(2, '0');\r\n\tconst tzM = String(Math.abs(tzOffset) % 60).padStart(2, '0');\r\n\treturn `[${day}/${mon}/${year}:${h}:${m}:${s} ${tzSign}${tzH}${tzM}]`;\r\n}\r\n\r\nexport interface AccessLogEntry {\r\n\thost: string;\r\n\tident?: string;\r\n\tauthuser?: string;\r\n\tmethod: string;\r\n\turl: string;\r\n\tprotocol?: string;\r\n\tstatus: number;\r\n\tbytes: number;\r\n\tuserAgent?: string;\r\n\treferer?: string;\r\n\tlogType?: string;\r\n\tdate?: Date;\r\n}\r\n\r\n/** CLF: host ident authuser [date] \"request\" status bytes */\r\nexport function formatCLF(entry: AccessLogEntry): string {\r\n\tconst ident = entry.ident ?? '-';\r\n\tconst authuser = entry.authuser ?? '-';\r\n\tconst proto = entry.protocol || 'HTTP/1.1';\r\n\tconst requestLine = `${entry.method} ${entry.url} ${proto}`;\r\n\tconst dateStr = formatClfDate(entry.date || new Date());\r\n\treturn `${entry.host} ${ident} ${authuser} ${dateStr} \"${requestLine}\" ${entry.status} ${entry.bytes}\\n`;\r\n}\r\n\r\nexport interface W3CHeaderOpts {\r\n\tsoftware: string;\r\n\tversion: string;\r\n\tfields: string[];\r\n\tdate?: Date;\r\n}\r\n\r\n/** W3C Extended Log 文件头(新文件首行写入) */\r\nexport function formatW3CHeader(opts: W3CHeaderOpts): string {\r\n\tconst date = opts.date || new Date();\r\n\tconst iso = date.toISOString();\r\n\treturn [\r\n\t\t'#Version: 1.0',\r\n\t\t`#Software: ${opts.software} v${opts.version}`,\r\n\t\t`#Date: ${iso}`,\r\n\t\t`#Fields: ${opts.fields.join(' ')}`,\r\n\t\t'',\r\n\t].join('\\n');\r\n}\r\n\r\n/** W3C Extended Log 默认访问日志字段(参照 W3C WD-logfile) */\r\nexport const W3C_ACCESS_FIELDS = [\r\n\t'date',\r\n\t'time',\r\n\t'c-ip',\r\n\t'cs-method',\r\n\t'cs-uri-stem',\r\n\t'sc-status',\r\n\t'sc-bytes',\r\n\t'cs(User-Agent)',\r\n\t'cs(Referer)',\r\n\t'x-log-type',\r\n] as const;\r\n\r\n/** W3C Extended Log 单行记录 */\r\nexport function formatW3CAccessRecord(entry: AccessLogEntry): string {\r\n\tconst date = entry.date || new Date();\r\n\tconst dateStr = getNowTime(2, date);\r\n\tconst timeStr = getNowTime(1, date);\r\n\tconst cols = [\r\n\t\tdateStr,\r\n\t\ttimeStr,\r\n\t\tentry.host,\r\n\t\tentry.method,\r\n\t\tentry.url,\r\n\t\tString(entry.status),\r\n\t\tString(entry.bytes),\r\n\t\tentry.userAgent || '-',\r\n\t\tentry.referer || '-',\r\n\t\tentry.logType || 'HTTP',\r\n\t];\r\n\treturn cols.map(escW3CField).join(' ') + '\\n';\r\n}\r\n\r\nfunction escW3CField(v: string): string {\r\n\tif (v.includes(' ') || v.includes('\\t')) return `\"${v.replace(/\"/g, '\"\"')}\"`;\r\n\treturn v;\r\n}\r\n\r\n/** W3C 运行日志字段(server/client 业务日志) */\r\nexport const W3C_SERVER_FIELDS = ['date', 'time', 'x-log-type', 'cs-method', 'cs-uri-stem', 'x-message'] as const;\r\n\r\nexport function formatW3CServerRecord(opts: {\r\n\tdate?: Date;\r\n\tlogType: string;\r\n\tmethod?: string;\r\n\turl?: string;\r\n\tmessage: string;\r\n}): string {\r\n\tconst date = opts.date || new Date();\r\n\tconst cols = [\r\n\t\tgetNowTime(2, date),\r\n\t\tgetNowTime(1, date),\r\n\t\topts.logType,\r\n\t\topts.method || '-',\r\n\t\topts.url || '-',\r\n\t\topts.message.replace(/[\\n\\r]/g, ' ').slice(0, 2000),\r\n\t];\r\n\treturn cols.map(escW3CField).join(' ') + '\\n';\r\n}\r\n\r\n/** 从 HTTP req/res 构建访问日志条目 */\r\nexport function buildAccessEntry(req: any, res: any, logType?: string): AccessLogEntry {\r\n\tconst forwarded = req.headers?.['x-forwarded-for'];\r\n\tconst host = (typeof forwarded === 'string' ? forwarded.split(',')[0].trim() : '') ||\r\n\t\treq.socket?.remoteAddress ||\r\n\t\treq.connection?.remoteAddress ||\r\n\t\t'-';\r\n\tconst url = (req.url || '/').split('?')[0];\r\n\treturn {\r\n\t\thost: host.replace(/^::ffff:/, ''),\r\n\t\tmethod: req.method || 'GET',\r\n\t\turl,\r\n\t\tstatus: res.statusCode || 0,\r\n\t\tbytes: Number(res.getHeader?.('content-length')) || 0,\r\n\t\tuserAgent: req.headers?.['user-agent'] || '-',\r\n\t\treferer: req.headers?.referer || req.headers?.referrer || '-',\r\n\t\tlogType: logType || 'HTTP',\r\n\t\tdate: new Date(),\r\n\t};\r\n}\r\n\r\n/** 解析 CLF 行 */\r\nexport function parseCLF(line: string): Record<string, string | number> | null {\r\n\tconst m = line.trim().match(\r\n\t\t/^(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+\\[([^\\]]+)\\]\\s+\"([^\"]+)\"\\s+(\\d+)\\s+(\\S+)/,\r\n\t);\r\n\tif (!m) return null;\r\n\tconst [, host, ident, authuser, date, request, status, bytes] = m;\r\n\tconst reqParts = request.split(' ');\r\n\treturn {\r\n\t\thost,\r\n\t\tident,\r\n\t\tauthuser,\r\n\t\tdate,\r\n\t\tmethod: reqParts[0] || '',\r\n\t\turl: reqParts[1] || '',\r\n\t\tprotocol: reqParts[2] || '',\r\n\t\tstatus: Number(status),\r\n\t\tbytes: bytes === '-' ? 0 : Number(bytes),\r\n\t};\r\n}\r\n\r\n/** 解析 W3C 数据行(跳过 # 开头注释行) */\r\nexport function parseW3CRecord(line: string, fields?: string[]): Record<string, string> | null {\r\n\tconst trimmed = line.trim();\r\n\tif (!trimmed || trimmed.startsWith('#')) return null;\r\n\tconst cols = splitW3CFields(trimmed);\r\n\tconst fieldNames = fields || [...W3C_ACCESS_FIELDS];\r\n\tconst out: Record<string, string> = {};\r\n\tfor (let i = 0; i < fieldNames.length && i < cols.length; i++) {\r\n\t\tout[fieldNames[i]] = cols[i];\r\n\t}\r\n\treturn out;\r\n}\r\n\r\nfunction splitW3CFields(line: string): string[] {\r\n\tconst cols: string[] = [];\r\n\tlet cur = '';\r\n\tlet inQuote = false;\r\n\tfor (let i = 0; i < line.length; i++) {\r\n\t\tconst ch = line[i];\r\n\t\tif (ch === '\"') {\r\n\t\t\tinQuote = !inQuote;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (!inQuote && (ch === ' ' || ch === '\\t')) {\r\n\t\t\tif (cur) cols.push(cur);\r\n\t\t\tcur = '';\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tcur += ch;\r\n\t}\r\n\tif (cur) cols.push(cur);\r\n\treturn cols;\r\n}\r\n\r\n/** 从 W3C 文件内容提取 #Fields 定义 */\r\nexport function extractW3CFields(content: string): string[] {\r\n\tfor (const line of content.split('\\n')) {\r\n\t\tconst m = line.match(/^#Fields:\\s*(.+)$/);\r\n\t\tif (m) return m[1].trim().split(/\\s+/);\r\n\t}\r\n\treturn [...W3C_ACCESS_FIELDS];\r\n}\r\n\r\n/** IEC 62443-4-2 CR2.8 三种日志格式完整规范(供前端展示与合规核查) */\r\nexport function getLogFormatTaxonomy($asai?: any) {\r\n\tconst vendor = $asai?.hostconfig?.website?.title || 'AsaiCMS';\r\n\tconst product = 'AsaiHost';\r\n\tconst version = $asai?.hostconfig?.website?.ver || '1.0.0.0';\r\n\r\n\treturn {\r\n\t\tstandards: ['IEC 62443-4-2 CR2.8', 'RFC 6872 (CLF)', 'W3C Extended Log File Format', 'CEF (ArcSight/OpenText)'],\r\n\t\tformats: [\r\n\t\t\t{\r\n\t\t\t\tkey: 'clf',\r\n\t\t\t\tname: 'CLF — Common Log Format',\r\n\t\t\t\tnameZh: '通用日志格式',\r\n\t\t\t\tref: 'RFC 6872',\r\n\t\t\t\trefUrl: 'https://www.rfc-editor.org/rfc/rfc6872',\r\n\t\t\t\tpattern: 'host ident authuser [date] \"request\" status bytes',\r\n\t\t\t\texample: `${vendor} - - ${formatClfDate()} \"GET /api/asailog/store/stats/ HTTP/1.1\" 200 512`,\r\n\t\t\t\tfields: [\r\n\t\t\t\t\t{ field: 'host', desc: '客户端 IP 或主机名', example: '192.168.1.10' },\r\n\t\t\t\t\t{ field: 'ident', desc: 'RFC 1413 身份标识(通常为 -)', example: '-' },\r\n\t\t\t\t\t{ field: 'authuser', desc: 'HTTP 认证用户名(未认证为 -)', example: '-' },\r\n\t\t\t\t\t{ field: 'date', desc: '请求时间戳', example: formatClfDate() },\r\n\t\t\t\t\t{ field: 'request', desc: '请求行(方法 URI 协议)', example: 'GET /api/ HTTP/1.1' },\r\n\t\t\t\t\t{ field: 'status', desc: 'HTTP 响应状态码', example: '200' },\r\n\t\t\t\t\t{ field: 'bytes', desc: '响应体字节数', example: '1234' },\r\n\t\t\t\t],\r\n\t\t\t\tusage: 'WEB 服务器 HTTP 访问日志,按日写入 access-clf-YYYY-MM-DD.log',\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tkey: 'w3c',\r\n\t\t\t\tname: 'W3C Extended Log File Format',\r\n\t\t\t\tnameZh: 'W3C 扩展日志文件格式',\r\n\t\t\t\tref: 'W3C WD-logfile',\r\n\t\t\t\trefUrl: 'https://www.w3.org/TR/WD-logfile',\r\n\t\t\t\tpattern: '#Version / #Software / #Date / #Fields + tab/space-separated records',\r\n\t\t\t\texample: [\r\n\t\t\t\t\t'#Version: 1.0',\r\n\t\t\t\t\t`#Software: ${product}`,\r\n\t\t\t\t\t`#Version: ${version}`,\r\n\t\t\t\t\t`#Date: ${new Date().toISOString()}`,\r\n\t\t\t\t\t`#Fields: ${W3C_ACCESS_FIELDS.join(' ')}`,\r\n\t\t\t\t\tformatW3CAccessRecord({\r\n\t\t\t\t\t\thost: '192.168.1.10',\r\n\t\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\t\turl: '/api/user/login/profile/',\r\n\t\t\t\t\t\tstatus: 200,\r\n\t\t\t\t\t\tbytes: 1234,\r\n\t\t\t\t\t\tuserAgent: 'Mozilla/5.0',\r\n\t\t\t\t\t\tlogType: 'API',\r\n\t\t\t\t\t}).trim(),\r\n\t\t\t\t].join('\\n'),\r\n\t\t\t\tfields: W3C_ACCESS_FIELDS.map((f) => ({\r\n\t\t\t\t\tfield: f,\r\n\t\t\t\t\tdesc: w3cFieldDesc(f),\r\n\t\t\t\t\texample: w3cFieldExample(f),\r\n\t\t\t\t})),\r\n\t\t\t\tusage: 'HTTP 访问日志(access-w3c-*.log)与服务端运行日志(log-*.txt 带 #Fields 头)',\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tkey: 'cef',\r\n\t\t\t\tname: 'CEF — Common Event Format',\r\n\t\t\t\tnameZh: '通用事件格式(SIEM)',\r\n\t\t\t\tref: 'ArcSight CEF',\r\n\t\t\t\trefUrl: 'https://www.microfocus.com/en-us/cyberres/secops/arcsight',\r\n\t\t\t\tpattern: 'CEF:Version|DeviceVendor|DeviceProduct|DeviceVersion|SignatureID|Name|Severity|Extension',\r\n\t\t\t\texample: `CEF:0|${vendor}|${product}|${version}|ASAI.SAFETY.PARAM.001|Safety parameter changed: torque_limit|8|rt=${new Date().toISOString()} src=192.168.1.10 dst=127.0.0.1 proto=HTTPS cs1=ConfigurationChanges cs1Label=EventCategory cs2=SAFETY_PARAM cs2Label=EventType cs3=a1b2c3d4 cs3Label=Identification cn1=1 cn1Label=BootCounter cn2=42 cn2Label=RunningCounter outcome=Success`,\r\n\t\t\t\tfields: [\r\n\t\t\t\t\t{ field: 'CEF:Version', desc: 'CEF 格式版本号', example: 'CEF:0' },\r\n\t\t\t\t\t{ field: 'DeviceVendor', desc: '生成事件的设备/系统厂商', example: vendor },\r\n\t\t\t\t\t{ field: 'DeviceProduct', desc: '产品名称', example: product },\r\n\t\t\t\t\t{ field: 'DeviceVersion', desc: '产品版本', example: version },\r\n\t\t\t\t\t{ field: 'SignatureID', desc: '事件唯一标识符(对应 CR2.8 事件 ID)', example: 'ASAI.SAFETY.PARAM.001' },\r\n\t\t\t\t\t{ field: 'Name', desc: '人类可读的事件名称', example: 'Safety parameter changed: torque_limit' },\r\n\t\t\t\t\t{ field: 'Severity', desc: '严重级别 0–10', example: '8' },\r\n\t\t\t\t\t{ field: 'Extension', desc: '键值对扩展:rt/src/dst/proto/cs1/cs2/cs3/cn1/cn2/outcome 等', example: 'rt=... outcome=Success' },\r\n\t\t\t\t],\r\n\t\t\t\tseverityGuide: [\r\n\t\t\t\t\t{ category: 'Access Control 访问控制', range: '7–8', note: '登录失败、权限提升、未授权访问' },\r\n\t\t\t\t\t{ category: 'Request Errors 请求错误', range: '2–4', note: '协议格式错误、无效命令、通信异常' },\r\n\t\t\t\t\t{ category: 'Control System Events 控制系统事件', range: '8–10', note: '安全功能触发、PLC 模式切换、I/O 强制值' },\r\n\t\t\t\t\t{ category: 'Backup and Restore 备份与恢复', range: '6–7', note: '备份/恢复操作,恢复风险更高' },\r\n\t\t\t\t\t{ category: 'Configuration Changes 配置更改', range: '7–9', note: '安全参数、控制逻辑、网络设置变更' },\r\n\t\t\t\t\t{ category: 'Audit Log Events 审计日志事件', range: '7–8', note: '日志清除、篡改、系统故障' },\r\n\t\t\t\t],\r\n\t\t\t\tusage: '干预日志(intervention-*.cef.log),哈希链防篡改,留存 ≥5 年',\r\n\t\t\t},\r\n\t\t],\r\n\t};\r\n}\r\n\r\nfunction w3cFieldDesc(field: string): string {\r\n\tconst map: Record<string, string> = {\r\n\t\tdate: '日期 YYYY-MM-DD',\r\n\t\ttime: '时间 HH:MM:SS',\r\n\t\t'c-ip': '客户端 IP',\r\n\t\t'cs-method': 'HTTP 方法',\r\n\t\t'cs-uri-stem': '请求 URI',\r\n\t\t'sc-status': '响应状态码',\r\n\t\t'sc-bytes': '响应字节数',\r\n\t\t'cs(User-Agent)': 'User-Agent 请求头',\r\n\t\t'cs(Referer)': 'Referer 请求头',\r\n\t\t'x-log-type': '日志类型(API/SYS/JSONP/HTTP 等)',\r\n\t\t'x-message': '日志消息内容',\r\n\t};\r\n\treturn map[field] || field;\r\n}\r\n\r\nfunction w3cFieldExample(field: string): string {\r\n\tconst map: Record<string, string> = {\r\n\t\tdate: '2026-07-02',\r\n\t\ttime: '15:42:10',\r\n\t\t'c-ip': '192.168.1.10',\r\n\t\t'cs-method': 'GET',\r\n\t\t'cs-uri-stem': '/api/asailog/store/stats/',\r\n\t\t'sc-status': '200',\r\n\t\t'sc-bytes': '1234',\r\n\t\t'cs(User-Agent)': 'Mozilla/5.0',\r\n\t\t'cs(Referer)': '-',\r\n\t\t'x-log-type': 'API',\r\n\t\t'x-message': 'profile updated',\r\n\t};\r\n\treturn map[field] || '-';\r\n}\r\n"],"mappings":"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","names":[]}