ErisPulse 2.5.1__tar.gz → 2.5.2.dev0__tar.gz

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 (178) hide show
  1. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/PKG-INFO +1 -1
  2. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/pyproject.toml +1 -1
  3. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/run.py +20 -0
  4. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/package_manager.py +45 -4
  5. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/package_manager.pyi +3 -0
  6. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/sdk.py +32 -1
  7. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/sdk.pyi +4 -0
  8. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/.gitignore +0 -0
  9. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/LICENSE +0 -0
  10. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/README.md +0 -0
  11. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/__init__.py +0 -0
  12. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/__init__.pyi +0 -0
  13. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/base.py +0 -0
  14. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/base.pyi +0 -0
  15. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/cli.py +0 -0
  16. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/cli.pyi +0 -0
  17. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/__init__.py +0 -0
  18. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
  19. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/create.py +0 -0
  20. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/create.pyi +0 -0
  21. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/init.py +0 -0
  22. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/init.pyi +0 -0
  23. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/install.py +0 -0
  24. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/install.pyi +0 -0
  25. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/language.py +0 -0
  26. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/language.pyi +0 -0
  27. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list.py +0 -0
  28. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list.pyi +0 -0
  29. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
  30. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
  31. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/run.pyi +0 -0
  32. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/self_update.py +0 -0
  33. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
  34. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
  35. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
  36. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
  37. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
  38. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/console.py +0 -0
  39. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/console.pyi +0 -0
  40. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/__init__.py +0 -0
  41. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/__init__.pyi +0 -0
  42. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.py +0 -0
  43. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.pyi +0 -0
  44. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/en.py +0 -0
  45. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/en.pyi +0 -0
  46. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ja.py +0 -0
  47. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ja.pyi +0 -0
  48. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ru.py +0 -0
  49. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ru.pyi +0 -0
  50. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.py +0 -0
  51. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +0 -0
  52. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.py +0 -0
  53. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +0 -0
  54. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/registry.py +0 -0
  55. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/registry.pyi +0 -0
  56. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/__init__.py +0 -0
  57. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
  58. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/display.py +0 -0
  59. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/display.pyi +0 -0
  60. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/file_watcher.py +0 -0
  61. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/file_watcher.pyi +0 -0
  62. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/__init__.py +0 -0
  63. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
  64. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/adapter.py +0 -0
  65. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/adapter.pyi +0 -0
  66. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/client.py +0 -0
  67. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/client.pyi +0 -0
  68. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/errors.py +0 -0
  69. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/errors.pyi +0 -0
  70. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/manager.py +0 -0
  71. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
  72. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/module.py +0 -0
  73. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/module.pyi +0 -0
  74. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/router.py +0 -0
  75. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/router.pyi +0 -0
  76. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/storage.py +0 -0
  77. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
  78. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/websocket.py +0 -0
  79. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/websocket.pyi +0 -0
  80. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/__init__.py +0 -0
  81. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
  82. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/base.py +0 -0
  83. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/base.pyi +0 -0
  84. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/command.py +0 -0
  85. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/command.pyi +0 -0
  86. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message.py +0 -0
  87. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message.pyi +0 -0
  88. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message_builder.py +0 -0
  89. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
  90. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/meta.py +0 -0
  91. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/meta.pyi +0 -0
  92. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/notice.py +0 -0
  93. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/notice.pyi +0 -0
  94. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/request.py +0 -0
  95. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/request.pyi +0 -0
  96. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/session_type.py +0 -0
  97. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
  98. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/wrapper.py +0 -0
  99. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/wrapper.pyi +0 -0
  100. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/__init__.py +0 -0
  101. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/__init__.pyi +0 -0
  102. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/adapter.py +0 -0
  103. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/adapter.pyi +0 -0
  104. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/client.py +0 -0
  105. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/client.pyi +0 -0
  106. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/config.py +0 -0
  107. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/config.pyi +0 -0
  108. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/constants.py +0 -0
  109. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/constants.pyi +0 -0
  110. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/__init__.py +0 -0
  111. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/__init__.pyi +0 -0
  112. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/constants.py +0 -0
  113. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/constants.pyi +0 -0
  114. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/__init__.py +0 -0
  115. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/__init__.pyi +0 -0
  116. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/en.py +0 -0
  117. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/en.pyi +0 -0
  118. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ja.py +0 -0
  119. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ja.pyi +0 -0
  120. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ru.py +0 -0
  121. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ru.pyi +0 -0
  122. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.py +0 -0
  123. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +0 -0
  124. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.py +0 -0
  125. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +0 -0
  126. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/lifecycle.py +0 -0
  127. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/lifecycle.pyi +0 -0
  128. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/logger.py +0 -0
  129. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/logger.pyi +0 -0
  130. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/module.py +0 -0
  131. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/module.pyi +0 -0
  132. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/router.py +0 -0
  133. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/router.pyi +0 -0
  134. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/storage.py +0 -0
  135. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/storage.pyi +0 -0
  136. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__init__.py +0 -0
  137. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__init__.pyi +0 -0
  138. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__main__.py +0 -0
  139. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__main__.pyi +0 -0
  140. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/__init__.py +0 -0
  141. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/__init__.pyi +0 -0
  142. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/adapter.py +0 -0
  143. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/adapter.pyi +0 -0
  144. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/__init__.py +0 -0
  145. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
  146. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/finder.py +0 -0
  147. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/finder.pyi +0 -0
  148. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/module.py +0 -0
  149. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/module.pyi +0 -0
  150. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/__init__.py +0 -0
  151. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/__init__.pyi +0 -0
  152. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/adapter.py +0 -0
  153. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/adapter.pyi +0 -0
  154. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/__init__.py +0 -0
  155. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
  156. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/loader.py +0 -0
  157. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
  158. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/module.py +0 -0
  159. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/module.pyi +0 -0
  160. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strategy.py +0 -0
  161. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strategy.pyi +0 -0
  162. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strict.py +0 -0
  163. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strict.pyi +0 -0
  164. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/__init__.py +0 -0
  165. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/__init__.pyi +0 -0
  166. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/config_schema.py +0 -0
  167. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/config_schema.pyi +0 -0
  168. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/context.py +0 -0
  169. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/context.pyi +0 -0
  170. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/exceptions.py +0 -0
  171. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/exceptions.pyi +0 -0
  172. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/frame_config.py +0 -0
  173. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/frame_config.pyi +0 -0
  174. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/4xx.png +0 -0
  175. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/5xx.png +0 -0
  176. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/__init__.py +0 -0
  177. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/__init__.pyi +0 -0
  178. {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/unknow.png +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.5.1
3
+ Version: 2.5.2.dev0
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
5
  Project-URL: Homepage, https://github.com/ErisPulse/ErisPulse
6
6
  Project-URL: Documentation, https://www.erisdev.com#docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ErisPulse"
7
- version = "2.5.1"
7
+ version = "2.5.2-dev.0"
8
8
  description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -168,11 +168,28 @@ class RunCommand(Command):
168
168
  "asyncio.run(sdk.run(keep_running=True))",
169
169
  ]
170
170
 
171
+ import signal
172
+
171
173
  try:
172
174
  while True:
173
175
  process = subprocess.Popen(cmd)
176
+
177
+ # 转发 SIGTERM/SIGINT 到子进程,使 SDK 能优雅关闭
178
+ def _forward_signal(signum, frame):
179
+ try:
180
+ process.send_signal(signum)
181
+ except Exception:
182
+ pass
183
+
184
+ old_term = signal.signal(signal.SIGTERM, _forward_signal)
185
+ old_int = signal.signal(signal.SIGINT, _forward_signal)
186
+
174
187
  process.wait()
175
188
 
189
+ # 恢复默认信号处理
190
+ signal.signal(signal.SIGTERM, old_term)
191
+ signal.signal(signal.SIGINT, old_int)
192
+
176
193
  if process.returncode == self._RESTART_EXIT_CODE:
177
194
  console.print(f"[info]{i18n.t('cli.run.restart_request')}[/]")
178
195
  time.sleep(0.5)
@@ -193,6 +210,9 @@ class RunCommand(Command):
193
210
  if reload_mode:
194
211
  self._run_script_with_reload(script_path_abs)
195
212
  else:
213
+ script_dir = os.path.dirname(script_path_abs)
214
+ if script_dir not in sys.path:
215
+ sys.path.insert(0, script_dir)
196
216
  try:
197
217
  runpy.run_path(script_path_abs, run_name="__main__")
198
218
  except SystemExit:
@@ -673,18 +673,59 @@ class PackageManager:
673
673
  并将目标 Python 解析为当前虚拟环境的解释器,
674
674
  避免安装到全局环境。
675
675
 
676
+ 操作成功后自动保存包快照到持久化目录,
677
+ 供 Docker 容器重建后恢复使用。
678
+
676
679
  :param args: [List[str]] pip 子命令与参数,如 ["install", "--upgrade", pkg]
677
680
  :param description: [str] 展示给用户的操作描述
678
681
  :return: [bool] 执行成功返回 True
679
682
  """
680
683
  uv_cmd = self._get_uv_command()
684
+ success = False
681
685
  if uv_cmd:
682
686
  if self._execute_backend(uv_cmd + ["pip"], args, description, "uv"):
683
- return True
684
- console.print(f"[warning]{i18n.t('cli.package.uv_fallback_to_pip')}[/]")
687
+ success = True
688
+ else:
689
+ console.print(f"[warning]{i18n.t('cli.package.uv_fallback_to_pip')}[/]")
690
+
691
+ if not success:
692
+ pip_cmd = [self._get_target_python(), "-m", "pip"]
693
+ success = self._execute_backend(pip_cmd, args, description, "pip")
694
+
695
+ # 操作成功后保存包快照(非关键,失败不影响主流程)
696
+ if success:
697
+ self._save_package_snapshot()
698
+
699
+ return success
700
+
701
+ def _save_package_snapshot(self) -> None:
702
+ """
703
+ {!--< internal-use >!--}
704
+ 将当前已安装的包列表保存到持久化目录。
705
+
706
+ 快照文件用于 Docker 容器重建后的包恢复:
707
+ entrypoint 创建新 venv 时会读取 .pip-snapshot.txt
708
+ 并尝试重新安装这些包。
685
709
 
686
- pip_cmd = [self._get_target_python(), "-m", "pip"]
687
- return self._execute_backend(pip_cmd, args, description, "pip")
710
+ 仅在 config/ 目录存在时保存(即项目环境或 Docker 环境)。
711
+ """
712
+ try:
713
+ config_dir = os.path.join(os.getcwd(), "config")
714
+ if not os.path.isdir(config_dir):
715
+ return
716
+
717
+ result = subprocess.run(
718
+ [sys.executable, "-m", "pip", "freeze"],
719
+ capture_output=True,
720
+ text=True,
721
+ timeout=30,
722
+ )
723
+ if result.returncode == 0:
724
+ snapshot_path = os.path.join(config_dir, ".pip-snapshot.txt")
725
+ with open(snapshot_path, "w", encoding="utf-8") as f:
726
+ f.write(result.stdout)
727
+ except Exception:
728
+ pass
688
729
 
689
730
  def _version_key(self, version: str) -> tuple:
690
731
  """
@@ -243,6 +243,9 @@ class PackageManager:
243
243
  并将目标 Python 解析为当前虚拟环境的解释器,
244
244
  避免安装到全局环境。
245
245
 
246
+ 操作成功后自动保存包快照到持久化目录,
247
+ 供 Docker 容器重建后恢复使用。
248
+
246
249
  :param args: [List[str]] pip 子命令与参数,如 ["install", "--upgrade", pkg]
247
250
  :param description: [str] 展示给用户的操作描述
248
251
  :return: [bool] 执行成功返回 True
@@ -898,12 +898,37 @@ class SDK:
898
898
  """
899
899
  无头模式运行 ErisPulse
900
900
 
901
+ 监听 SIGTERM/SIGINT 信号以实现优雅关闭:
902
+ 收到信号后触发 shutdown_event,使 finally 块中的 uninit() 正常执行,
903
+ 确保适配器断开、模块卸载、数据落盘等清理工作完成。
904
+
901
905
  :param keep_running: bool 是否保持运行
902
906
 
903
907
  :example:
904
908
  >>> await sdk.run(keep_running=True)
905
909
  """
910
+ import signal
911
+
912
+ shutdown_event = asyncio.Event()
913
+ loop = asyncio.get_running_loop()
914
+ _registered_signals: list[int] = []
915
+
916
+ def _request_shutdown() -> None:
917
+ """信号回调:设置关闭事件,使 run() 退出等待并进入清理流程"""
918
+ if not shutdown_event.is_set():
919
+ self.logger.info(i18n.t("core.sdk.run.shutdown_signal"))
920
+ shutdown_event.set()
921
+
906
922
  try:
923
+ # 注册信号处理器,使 Docker SIGTERM / Ctrl+C 能触发优雅关闭
924
+ for sig in (signal.SIGTERM, signal.SIGINT):
925
+ try:
926
+ loop.add_signal_handler(sig, _request_shutdown)
927
+ _registered_signals.append(sig)
928
+ except (NotImplementedError, RuntimeError):
929
+ # Windows 不支持 add_signal_handler,跳过
930
+ pass
931
+
907
932
  isInit = await self.init()
908
933
 
909
934
  if not isInit:
@@ -911,13 +936,19 @@ class SDK:
911
936
  return
912
937
 
913
938
  if keep_running:
914
- shutdown_event = asyncio.Event()
915
939
  await shutdown_event.wait()
916
940
  except asyncio.CancelledError:
917
941
  self.logger.info(i18n.t("core.sdk.run.shutdown_signal"))
918
942
  except Exception as e:
919
943
  self.logger.error(e)
920
944
  finally:
945
+ # 清理信号处理器,避免重复触发
946
+ for sig in _registered_signals:
947
+ try:
948
+ loop.remove_signal_handler(sig)
949
+ except Exception:
950
+ pass
951
+
921
952
  if keep_running:
922
953
  try:
923
954
  await self.uninit()
@@ -142,6 +142,10 @@ class SDK:
142
142
  """
143
143
  无头模式运行 ErisPulse
144
144
 
145
+ 监听 SIGTERM/SIGINT 信号以实现优雅关闭:
146
+ 收到信号后触发 shutdown_event,使 finally 块中的 uninit() 正常执行,
147
+ 确保适配器断开、模块卸载、数据落盘等清理工作完成。
148
+
145
149
  :param keep_running: bool 是否保持运行
146
150
 
147
151
  :example:
File without changes
File without changes
File without changes