ErisPulse 2.6.2.dev1__tar.gz → 2.6.3.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.
- erispulse-2.6.3.dev0/PKG-INFO +290 -0
- erispulse-2.6.3.dev0/README.pypi.md +219 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/pyproject.toml +2 -2
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/cli.py +55 -10
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/cli.pyi +8 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/run.py +7 -1
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/console.py +24 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/console.pyi +12 -0
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/hints.py +135 -0
- erispulse-2.6.3.dev0/src/ErisPulse/CLI/hints.pyi +71 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/en.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/ja.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/ru.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/__init__.py +2 -1
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/__init__.pyi +1 -1
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/client.py +7 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/errors.py +11 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/kv_builder.py +5 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/router.py +7 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/send_builder.py +6 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/send_rules.py +6 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/websocket.py +6 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/adapter.py +94 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/client.py +7 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/config.py +7 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/constants.py +103 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/en.py +3 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/ja.py +3 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/ru.py +3 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.py +3 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.py +3 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/master.py +5 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/module.py +96 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/__init__.py +15 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/sdk.py +43 -2
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/sdk.pyi +24 -1
- erispulse-2.6.2.dev1/PKG-INFO +0 -714
- erispulse-2.6.2.dev1/README.md +0 -643
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/.gitignore +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/LICENSE +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/base.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/base.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/create.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/create.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/init.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/init.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/install.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/install.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/language.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/language.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/list.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/list.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/run.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/self_update.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/types.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/types.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/en.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/ja.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/ru.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/registry.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/registry.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/display.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/display.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/file_watcher.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/file_watcher.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/package_manager.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/CLI/utils/package_manager.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/adapter.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/adapter.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/client.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/errors.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/kv_builder.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/module.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/module.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/router.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/send_builder.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/send_rules.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/storage.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Bases/websocket.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/base.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/command.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/command.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/message.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/meta.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/notice.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/request.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/session_type.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/wrapper.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/Event/wrapper.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/adapter.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/error.css +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/error.html +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/root.css +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/assets/root.html +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/client.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/config.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/constants.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/constants.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/constants.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/en.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/ja.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/ru.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/lifecycle.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/lifecycle.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/logger.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/logger.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/master.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/module.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/router.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/router.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/storage.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/Core/storage.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/__main__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/adapter.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/adapter.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/bases/finder.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/bases/finder.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/module.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/finders/module.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/adapter.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/adapter.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/module.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/module.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/strategy.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/strategy.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/strict.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/loaders/strict.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/py.typed +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/__init__.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/__init__.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/config_schema.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/config_schema.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/context.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/context.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/exceptions.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/exceptions.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/frame_config.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/frame_config.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/hints.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/hints.pyi +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/tasks.py +0 -0
- {erispulse-2.6.2.dev1 → erispulse-2.6.3.dev0}/src/ErisPulse/runtime/tasks.pyi +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ErisPulse
|
|
3
|
+
Version: 2.6.3.dev0
|
|
4
|
+
Summary: Event-driven modular async bot framework — write once, deploy to any platform | 事件驱动的模块化异步机器人框架,一次编写,多平台部署
|
|
5
|
+
Project-URL: Homepage, https://github.com/ErisPulse/ErisPulse
|
|
6
|
+
Project-URL: Documentation, https://www.erisdev.com#docs
|
|
7
|
+
Project-URL: Repository, https://github.com/ErisPulse/ErisPulse
|
|
8
|
+
Project-URL: Issues, https://github.com/ErisPulse/ErisPulse/issues
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/ErisPulse/ErisPulse/blob/main/docs/en/bug-tracker.md
|
|
10
|
+
Project-URL: Changelog, https://github.com/ErisPulse/ErisPulse/blob/main/CHANGELOG.md
|
|
11
|
+
Author: ErisDev
|
|
12
|
+
Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
|
|
13
|
+
License: MIT License
|
|
14
|
+
|
|
15
|
+
Copyright (c) 2025-2026 ErisPulse
|
|
16
|
+
|
|
17
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
18
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
19
|
+
in the Software without restriction, including without limitation the rights
|
|
20
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
21
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
22
|
+
furnished to do so, subject to the following conditions:
|
|
23
|
+
|
|
24
|
+
The above copyright notice and this permission notice shall be included in all
|
|
25
|
+
copies or substantial portions of the Software.
|
|
26
|
+
|
|
27
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
28
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
29
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
30
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
31
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
32
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
33
|
+
SOFTWARE.
|
|
34
|
+
License-File: LICENSE
|
|
35
|
+
Keywords: async,asyncio,bot,bot-framework,chatbot,email,extensible,framework,instant-messaging,kook,matrix,modular,multi-platform,onebot,onebot12,qq,robot,sdk,telegram,yunhu
|
|
36
|
+
Classifier: Development Status :: 4 - Beta
|
|
37
|
+
Classifier: Framework :: AsyncIO
|
|
38
|
+
Classifier: Intended Audience :: Developers
|
|
39
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
40
|
+
Classifier: Operating System :: OS Independent
|
|
41
|
+
Classifier: Programming Language :: Python :: 3
|
|
42
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
43
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
44
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
45
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
46
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
47
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
48
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
49
|
+
Classifier: Typing :: Typed
|
|
50
|
+
Requires-Python: >=3.10
|
|
51
|
+
Requires-Dist: aiohttp>=3.9.0
|
|
52
|
+
Requires-Dist: fastapi>=0.116.1
|
|
53
|
+
Requires-Dist: rich>=13.0.0
|
|
54
|
+
Requires-Dist: toml>=0.10.2
|
|
55
|
+
Requires-Dist: uvicorn>=0.30.0
|
|
56
|
+
Requires-Dist: websockets>=12.0
|
|
57
|
+
Provides-Extra: dev
|
|
58
|
+
Requires-Dist: basedpyright>=1.20.0; extra == 'dev'
|
|
59
|
+
Requires-Dist: pyclean>=3.6.0; extra == 'dev'
|
|
60
|
+
Requires-Dist: ruff>=0.1.7; extra == 'dev'
|
|
61
|
+
Requires-Dist: typing-extensions>=4.7.0; (python_version < '3.11') and extra == 'dev'
|
|
62
|
+
Provides-Extra: test
|
|
63
|
+
Requires-Dist: httpx>=0.24.0; extra == 'test'
|
|
64
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
|
|
65
|
+
Requires-Dist: pytest-benchmark>=4.0.0; extra == 'test'
|
|
66
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
|
|
67
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
|
|
68
|
+
Requires-Dist: pytest-xdist>=3.0.0; extra == 'test'
|
|
69
|
+
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
70
|
+
Description-Content-Type: text/markdown
|
|
71
|
+
|
|
72
|
+

|
|
73
|
+
|
|
74
|
+
# ErisPulse
|
|
75
|
+
|
|
76
|
+
**Write once, deploy on multiple platforms.**
|
|
77
|
+
|
|
78
|
+
An event-driven, multi-platform chatbot development framework based on the OneBot12 standard.
|
|
79
|
+
|
|
80
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
81
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
82
|
+
[](https://github.com/ErisPulse/ErisPulse/blob/main/LICENSE)
|
|
83
|
+
[](https://www.erisdev.com)
|
|
84
|
+
[](https://github.com/ErisPulse/ErisPulse)
|
|
85
|
+
[](https://pepy.tech/project/ErisPulse)
|
|
86
|
+
[](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
87
|
+
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Overview
|
|
92
|
+
|
|
93
|
+
ErisPulse is an event-driven, modular async framework for building chatbots that run on **multiple platforms from a single codebase**. It implements the [OneBot12](https://12.onebot.dev/) standard event model, so you write command handlers, conversation flows and message senders once — then deploy them to QQ, Telegram, Discord, Kook, Yunhu, Matrix, Email, WeChat and more without touching business logic.
|
|
94
|
+
|
|
95
|
+
It ships with a flexible plugin system, hot reload, a visual Dashboard, an AI Builder that turns natural-language prompts into modules, and the `epsdk` CLI scaffolding tool — suitable for everything from a simple chatbot to a complex automation pipeline.
|
|
96
|
+
|
|
97
|
+
## Key Features
|
|
98
|
+
|
|
99
|
+
- **Event-driven architecture** — Clear event model based on OneBot12, making message handling intuitive and consistent across platforms.
|
|
100
|
+
- **Cross-platform compatibility** — Write handlers once, deploy to 15+ platforms without rewriting business logic.
|
|
101
|
+
- **Modular design** — Flexible plugin system with hot-plug module management and per-module configuration.
|
|
102
|
+
- **Hot reload** — Iterate on code during development without restarting the bot process.
|
|
103
|
+
- **Chainable SendDSL** — Express `@mention`, reply, retry, timeout, progress hook and bulk send as a single fluent chain.
|
|
104
|
+
- **Complete toolchain** — `epsdk` CLI, visual Dashboard, AI Builder and Module Market included out of the box.
|
|
105
|
+
|
|
106
|
+
## Installation
|
|
107
|
+
|
|
108
|
+
### Option 1 — pip (for library / module developers)
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
pip install ErisPulse
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Option 2 — Docker (recommended for production)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
docker pull erispulse/erispulse:latest
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Quick start with `docker-compose.yml`:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml
|
|
124
|
+
ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The image bundles the ErisPulse framework **and** the Dashboard management panel, supporting `linux/amd64` and `linux/arm64`. After startup, visit `http://<host>:<port>/Dashboard` and log in with the token you set.
|
|
128
|
+
|
|
129
|
+
<details>
|
|
130
|
+
<summary>Docker Hub unavailable? Use GitHub Container Registry</summary>
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
docker pull ghcr.io/erispulse/erispulse:latest
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
And update the image in your `docker-compose.yml`:
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
image: ghcr.io/erispulse/erispulse:latest
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
</details>
|
|
143
|
+
|
|
144
|
+
<details>
|
|
145
|
+
<summary>Docker environment variables</summary>
|
|
146
|
+
|
|
147
|
+
| Variable | Default | Description |
|
|
148
|
+
|------|--------|------|
|
|
149
|
+
| `ERISPULSE_CHANNEL` | `stable` | Version channel: `stable` or `dev` (pre-release) |
|
|
150
|
+
| `ERISPULSE_UPDATE_ON_START` | `false` | Auto-update to the latest version on container start |
|
|
151
|
+
| `ERISPULSE_DASHBOARD_TOKEN` | empty | Dashboard login token |
|
|
152
|
+
| `ERISPULSE_PORT` | `8000` | Dashboard port mapping |
|
|
153
|
+
| `TZ` | `Asia/Shanghai` | Container timezone |
|
|
154
|
+
|
|
155
|
+
</details>
|
|
156
|
+
|
|
157
|
+
### Option 3 — One-click install script (auto-detects environment)
|
|
158
|
+
|
|
159
|
+
The installer detects Docker / Python / uv and guides you through the most suitable setup. Supports Chinese, English, Japanese, Russian and Traditional Chinese.
|
|
160
|
+
|
|
161
|
+
Windows (PowerShell):
|
|
162
|
+
|
|
163
|
+
```powershell
|
|
164
|
+
irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -ExecutionPolicy Bypass -File install.ps1
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
macOS / Linux:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
curl -fsSL https://get.erisdev.com/install.sh -o install.sh && chmod +x install.sh && ./install.sh
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Quick Start
|
|
174
|
+
|
|
175
|
+
Initialize a new project:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Interactive initialization
|
|
179
|
+
epsdk init
|
|
180
|
+
|
|
181
|
+
# Quick initialization with a project name
|
|
182
|
+
epsdk init -q -n my_bot
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Create a `main.py` file:
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
from ErisPulse import sdk
|
|
189
|
+
from ErisPulse.Core.Event import command
|
|
190
|
+
|
|
191
|
+
@command("hello", help="Send greeting message")
|
|
192
|
+
async def hello_handler(event):
|
|
193
|
+
user_name = event.get_user_nickname() or "friend"
|
|
194
|
+
await event.reply(f"Hello, {user_name}!")
|
|
195
|
+
|
|
196
|
+
@command("ping", help="Test if the bot is online")
|
|
197
|
+
async def ping_handler(event):
|
|
198
|
+
await event.reply("Pong! The bot is running normally.")
|
|
199
|
+
|
|
200
|
+
if __name__ == "__main__":
|
|
201
|
+
import asyncio
|
|
202
|
+
asyncio.run(sdk.run(keep_running=True))
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Run it:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
epsdk run main.py
|
|
209
|
+
# Or in development mode with hot reload
|
|
210
|
+
epsdk run main.py --reload
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Now send `/hello` or `/ping` to the bot on any connected platform — the same handlers work everywhere.
|
|
214
|
+
|
|
215
|
+
For the full walkthrough (multi-turn conversations, request handlers, adapter configuration), see the [Quick Start guide](https://www.erisdev.com#docs).
|
|
216
|
+
|
|
217
|
+
## The SendDSL — fluent message sending
|
|
218
|
+
|
|
219
|
+
Compose the entire send flow — `@mention`, reply, retry, timeout, progress hook and bulk dispatch — as one readable chain:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
yunhu = sdk.adapter.get("yunhu")
|
|
223
|
+
|
|
224
|
+
# Single send: @user + reply + retry + timeout + success callback
|
|
225
|
+
await (yunhu.Send.To("group", "123")
|
|
226
|
+
.At("456").Reply("msg_789")
|
|
227
|
+
.Retry(3).Timeout(10)
|
|
228
|
+
.Hook(lambda r: print("Send successful!"))
|
|
229
|
+
.Text("Hello"))
|
|
230
|
+
|
|
231
|
+
# Bulk send: build multiple messages, then dispatch in one chain
|
|
232
|
+
results = await (yunhu.Send.To("user", "123")
|
|
233
|
+
.Build()
|
|
234
|
+
.Text("Notification 1")
|
|
235
|
+
.Image("pic.jpg")
|
|
236
|
+
.Retry(2)
|
|
237
|
+
.send_all())
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Supported chainable methods include `Hook` (success callback), `Retry` (failure retry), `Timeout` (timeout cancellation), `OnProgress` (progress monitoring), `Defer` (delayed send) and `Build` (batch construction).
|
|
241
|
+
|
|
242
|
+
> Full reference: [SendDSL documentation](https://www.erisdev.com#docs)
|
|
243
|
+
|
|
244
|
+
## Supported Platforms
|
|
245
|
+
|
|
246
|
+
Officially maintained adapters (community contributions welcome):
|
|
247
|
+
|
|
248
|
+
- [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) — instant messaging platform
|
|
249
|
+
- [Matrix](https://github.com/ErisPulse/ErisPulse-MatrixAdapter) — decentralized communication protocol
|
|
250
|
+
- [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) — universal OneBot v11 protocol
|
|
251
|
+
- [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) — OneBot v12 standard protocol
|
|
252
|
+
- [QQ Bot](https://github.com/ErisPulse/ErisPulse-QQBotAdapter) — official QQ bot platform
|
|
253
|
+
- [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) — global instant messaging
|
|
254
|
+
- [Discord](https://github.com/ErisPulse/ErisPulse-DiscordAdapter) — community communication platform
|
|
255
|
+
- [Yunhu](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) / [Yunhu User](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) — enterprise IM
|
|
256
|
+
- [Email](https://github.com/ErisPulse/ErisPulse-EmailAdapter) — email protocol adapter
|
|
257
|
+
- [WeChat Official Account](https://github.com/ErisPulse/ErisPulse-WechatMpAdapter)
|
|
258
|
+
- [Webhook](https://github.com/ErisPulse/ErisPulse-WebhookAdapter) — HTTP bridge to any system
|
|
259
|
+
- [Sandbox](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) — in-browser debugging, no real platform needed
|
|
260
|
+
- [HuaFeng Coffee House](https://github.com/ErisPulse/ErisPulse-Ideaura/)
|
|
261
|
+
|
|
262
|
+
See the [adapter guide](https://www.erisdev.com#docs) for configuration details.
|
|
263
|
+
|
|
264
|
+
## Ecosystem
|
|
265
|
+
|
|
266
|
+
- **Framework** — core runtime with a unified event & message model.
|
|
267
|
+
- **Dashboard** — visual management for plugins, logs and configuration. ([live demo](https://dashdemo.erisdev.com/))
|
|
268
|
+
- **AI Builder** — natural-language prompts → ready-to-use modules. ([try it](https://www.erisdev.com/#builder))
|
|
269
|
+
- **Module Market** — plug-and-play community plugins. ([browse](https://www.erisdev.com/#market))
|
|
270
|
+
- **CLI** — `epsdk` scaffolding, project init, run and reload.
|
|
271
|
+
- **Docker** — multi-architecture images at `erispulse/erispulse`.
|
|
272
|
+
|
|
273
|
+
## Documentation & Community
|
|
274
|
+
|
|
275
|
+
- 📖 **Documentation & API reference:** [erisdev.com](https://www.erisdev.com)
|
|
276
|
+
- 💬 **GitHub Discussions:** [ErisPulse/ErisPulse/discussions](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
277
|
+
- 📋 **Changelog:** [CHANGELOG.md](https://github.com/ErisPulse/ErisPulse/blob/main/CHANGELOG.md)
|
|
278
|
+
- 🤝 **Contributing:** [CONTRIBUTING.md](https://github.com/ErisPulse/ErisPulse/blob/main/CONTRIBUTING.md)
|
|
279
|
+
- 🐛 **Bug reports:** [GitHub Issues](https://github.com/ErisPulse/ErisPulse/issues)
|
|
280
|
+
- 🧠 **DeepWiki:** [deepwiki.com/ErisPulse/ErisPulse](https://deepwiki.com/ErisPulse/ErisPulse)
|
|
281
|
+
|
|
282
|
+
Chat with us on:
|
|
283
|
+
|
|
284
|
+
- Telegram: <https://t.me/ErisPulse>
|
|
285
|
+
- QQ Group: <https://qm.qq.com/q/TOwnCmypcy>
|
|
286
|
+
- Yunhu Group: <https://yhfx.jwznb.com/share?key=VWJL4fTWXepa&ts=1781889199>
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
**Why ErisPulse?** Because platform differences should never be your bottleneck — focus on business logic, and let the framework handle the rest. Write once, deploy everywhere.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# ErisPulse
|
|
4
|
+
|
|
5
|
+
**Write once, deploy on multiple platforms.**
|
|
6
|
+
|
|
7
|
+
An event-driven, multi-platform chatbot development framework based on the OneBot12 standard.
|
|
8
|
+
|
|
9
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
10
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
11
|
+
[](https://github.com/ErisPulse/ErisPulse/blob/main/LICENSE)
|
|
12
|
+
[](https://www.erisdev.com)
|
|
13
|
+
[](https://github.com/ErisPulse/ErisPulse)
|
|
14
|
+
[](https://pepy.tech/project/ErisPulse)
|
|
15
|
+
[](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
16
|
+
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
ErisPulse is an event-driven, modular async framework for building chatbots that run on **multiple platforms from a single codebase**. It implements the [OneBot12](https://12.onebot.dev/) standard event model, so you write command handlers, conversation flows and message senders once — then deploy them to QQ, Telegram, Discord, Kook, Yunhu, Matrix, Email, WeChat and more without touching business logic.
|
|
23
|
+
|
|
24
|
+
It ships with a flexible plugin system, hot reload, a visual Dashboard, an AI Builder that turns natural-language prompts into modules, and the `epsdk` CLI scaffolding tool — suitable for everything from a simple chatbot to a complex automation pipeline.
|
|
25
|
+
|
|
26
|
+
## Key Features
|
|
27
|
+
|
|
28
|
+
- **Event-driven architecture** — Clear event model based on OneBot12, making message handling intuitive and consistent across platforms.
|
|
29
|
+
- **Cross-platform compatibility** — Write handlers once, deploy to 15+ platforms without rewriting business logic.
|
|
30
|
+
- **Modular design** — Flexible plugin system with hot-plug module management and per-module configuration.
|
|
31
|
+
- **Hot reload** — Iterate on code during development without restarting the bot process.
|
|
32
|
+
- **Chainable SendDSL** — Express `@mention`, reply, retry, timeout, progress hook and bulk send as a single fluent chain.
|
|
33
|
+
- **Complete toolchain** — `epsdk` CLI, visual Dashboard, AI Builder and Module Market included out of the box.
|
|
34
|
+
|
|
35
|
+
## Installation
|
|
36
|
+
|
|
37
|
+
### Option 1 — pip (for library / module developers)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install ErisPulse
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Option 2 — Docker (recommended for production)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
docker pull erispulse/erispulse:latest
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Quick start with `docker-compose.yml`:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml
|
|
53
|
+
ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The image bundles the ErisPulse framework **and** the Dashboard management panel, supporting `linux/amd64` and `linux/arm64`. After startup, visit `http://<host>:<port>/Dashboard` and log in with the token you set.
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>Docker Hub unavailable? Use GitHub Container Registry</summary>
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
docker pull ghcr.io/erispulse/erispulse:latest
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
And update the image in your `docker-compose.yml`:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
image: ghcr.io/erispulse/erispulse:latest
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
</details>
|
|
72
|
+
|
|
73
|
+
<details>
|
|
74
|
+
<summary>Docker environment variables</summary>
|
|
75
|
+
|
|
76
|
+
| Variable | Default | Description |
|
|
77
|
+
|------|--------|------|
|
|
78
|
+
| `ERISPULSE_CHANNEL` | `stable` | Version channel: `stable` or `dev` (pre-release) |
|
|
79
|
+
| `ERISPULSE_UPDATE_ON_START` | `false` | Auto-update to the latest version on container start |
|
|
80
|
+
| `ERISPULSE_DASHBOARD_TOKEN` | empty | Dashboard login token |
|
|
81
|
+
| `ERISPULSE_PORT` | `8000` | Dashboard port mapping |
|
|
82
|
+
| `TZ` | `Asia/Shanghai` | Container timezone |
|
|
83
|
+
|
|
84
|
+
</details>
|
|
85
|
+
|
|
86
|
+
### Option 3 — One-click install script (auto-detects environment)
|
|
87
|
+
|
|
88
|
+
The installer detects Docker / Python / uv and guides you through the most suitable setup. Supports Chinese, English, Japanese, Russian and Traditional Chinese.
|
|
89
|
+
|
|
90
|
+
Windows (PowerShell):
|
|
91
|
+
|
|
92
|
+
```powershell
|
|
93
|
+
irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -ExecutionPolicy Bypass -File install.ps1
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
macOS / Linux:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
curl -fsSL https://get.erisdev.com/install.sh -o install.sh && chmod +x install.sh && ./install.sh
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Quick Start
|
|
103
|
+
|
|
104
|
+
Initialize a new project:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Interactive initialization
|
|
108
|
+
epsdk init
|
|
109
|
+
|
|
110
|
+
# Quick initialization with a project name
|
|
111
|
+
epsdk init -q -n my_bot
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Create a `main.py` file:
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
from ErisPulse import sdk
|
|
118
|
+
from ErisPulse.Core.Event import command
|
|
119
|
+
|
|
120
|
+
@command("hello", help="Send greeting message")
|
|
121
|
+
async def hello_handler(event):
|
|
122
|
+
user_name = event.get_user_nickname() or "friend"
|
|
123
|
+
await event.reply(f"Hello, {user_name}!")
|
|
124
|
+
|
|
125
|
+
@command("ping", help="Test if the bot is online")
|
|
126
|
+
async def ping_handler(event):
|
|
127
|
+
await event.reply("Pong! The bot is running normally.")
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
import asyncio
|
|
131
|
+
asyncio.run(sdk.run(keep_running=True))
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Run it:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
epsdk run main.py
|
|
138
|
+
# Or in development mode with hot reload
|
|
139
|
+
epsdk run main.py --reload
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Now send `/hello` or `/ping` to the bot on any connected platform — the same handlers work everywhere.
|
|
143
|
+
|
|
144
|
+
For the full walkthrough (multi-turn conversations, request handlers, adapter configuration), see the [Quick Start guide](https://www.erisdev.com#docs).
|
|
145
|
+
|
|
146
|
+
## The SendDSL — fluent message sending
|
|
147
|
+
|
|
148
|
+
Compose the entire send flow — `@mention`, reply, retry, timeout, progress hook and bulk dispatch — as one readable chain:
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
yunhu = sdk.adapter.get("yunhu")
|
|
152
|
+
|
|
153
|
+
# Single send: @user + reply + retry + timeout + success callback
|
|
154
|
+
await (yunhu.Send.To("group", "123")
|
|
155
|
+
.At("456").Reply("msg_789")
|
|
156
|
+
.Retry(3).Timeout(10)
|
|
157
|
+
.Hook(lambda r: print("Send successful!"))
|
|
158
|
+
.Text("Hello"))
|
|
159
|
+
|
|
160
|
+
# Bulk send: build multiple messages, then dispatch in one chain
|
|
161
|
+
results = await (yunhu.Send.To("user", "123")
|
|
162
|
+
.Build()
|
|
163
|
+
.Text("Notification 1")
|
|
164
|
+
.Image("pic.jpg")
|
|
165
|
+
.Retry(2)
|
|
166
|
+
.send_all())
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Supported chainable methods include `Hook` (success callback), `Retry` (failure retry), `Timeout` (timeout cancellation), `OnProgress` (progress monitoring), `Defer` (delayed send) and `Build` (batch construction).
|
|
170
|
+
|
|
171
|
+
> Full reference: [SendDSL documentation](https://www.erisdev.com#docs)
|
|
172
|
+
|
|
173
|
+
## Supported Platforms
|
|
174
|
+
|
|
175
|
+
Officially maintained adapters (community contributions welcome):
|
|
176
|
+
|
|
177
|
+
- [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) — instant messaging platform
|
|
178
|
+
- [Matrix](https://github.com/ErisPulse/ErisPulse-MatrixAdapter) — decentralized communication protocol
|
|
179
|
+
- [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) — universal OneBot v11 protocol
|
|
180
|
+
- [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) — OneBot v12 standard protocol
|
|
181
|
+
- [QQ Bot](https://github.com/ErisPulse/ErisPulse-QQBotAdapter) — official QQ bot platform
|
|
182
|
+
- [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) — global instant messaging
|
|
183
|
+
- [Discord](https://github.com/ErisPulse/ErisPulse-DiscordAdapter) — community communication platform
|
|
184
|
+
- [Yunhu](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) / [Yunhu User](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) — enterprise IM
|
|
185
|
+
- [Email](https://github.com/ErisPulse/ErisPulse-EmailAdapter) — email protocol adapter
|
|
186
|
+
- [WeChat Official Account](https://github.com/ErisPulse/ErisPulse-WechatMpAdapter)
|
|
187
|
+
- [Webhook](https://github.com/ErisPulse/ErisPulse-WebhookAdapter) — HTTP bridge to any system
|
|
188
|
+
- [Sandbox](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) — in-browser debugging, no real platform needed
|
|
189
|
+
- [HuaFeng Coffee House](https://github.com/ErisPulse/ErisPulse-Ideaura/)
|
|
190
|
+
|
|
191
|
+
See the [adapter guide](https://www.erisdev.com#docs) for configuration details.
|
|
192
|
+
|
|
193
|
+
## Ecosystem
|
|
194
|
+
|
|
195
|
+
- **Framework** — core runtime with a unified event & message model.
|
|
196
|
+
- **Dashboard** — visual management for plugins, logs and configuration. ([live demo](https://dashdemo.erisdev.com/))
|
|
197
|
+
- **AI Builder** — natural-language prompts → ready-to-use modules. ([try it](https://www.erisdev.com/#builder))
|
|
198
|
+
- **Module Market** — plug-and-play community plugins. ([browse](https://www.erisdev.com/#market))
|
|
199
|
+
- **CLI** — `epsdk` scaffolding, project init, run and reload.
|
|
200
|
+
- **Docker** — multi-architecture images at `erispulse/erispulse`.
|
|
201
|
+
|
|
202
|
+
## Documentation & Community
|
|
203
|
+
|
|
204
|
+
- 📖 **Documentation & API reference:** [erisdev.com](https://www.erisdev.com)
|
|
205
|
+
- 💬 **GitHub Discussions:** [ErisPulse/ErisPulse/discussions](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
206
|
+
- 📋 **Changelog:** [CHANGELOG.md](https://github.com/ErisPulse/ErisPulse/blob/main/CHANGELOG.md)
|
|
207
|
+
- 🤝 **Contributing:** [CONTRIBUTING.md](https://github.com/ErisPulse/ErisPulse/blob/main/CONTRIBUTING.md)
|
|
208
|
+
- 🐛 **Bug reports:** [GitHub Issues](https://github.com/ErisPulse/ErisPulse/issues)
|
|
209
|
+
- 🧠 **DeepWiki:** [deepwiki.com/ErisPulse/ErisPulse](https://deepwiki.com/ErisPulse/ErisPulse)
|
|
210
|
+
|
|
211
|
+
Chat with us on:
|
|
212
|
+
|
|
213
|
+
- Telegram: <https://t.me/ErisPulse>
|
|
214
|
+
- QQ Group: <https://qm.qq.com/q/TOwnCmypcy>
|
|
215
|
+
- Yunhu Group: <https://yhfx.jwznb.com/share?key=VWJL4fTWXepa&ts=1781889199>
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
**Why ErisPulse?** Because platform differences should never be your bottleneck — focus on business logic, and let the framework handle the rest. Write once, deploy everywhere.
|
|
@@ -4,9 +4,9 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ErisPulse"
|
|
7
|
-
version = "2.6.
|
|
7
|
+
version = "2.6.3-dev.0"
|
|
8
8
|
description = "Event-driven modular async bot framework — write once, deploy to any platform | 事件驱动的模块化异步机器人框架,一次编写,多平台部署"
|
|
9
|
-
readme = "README.md"
|
|
9
|
+
readme = "README.pypi.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
license = { file = "LICENSE" }
|
|
12
12
|
|
|
@@ -149,6 +149,43 @@ class CLI:
|
|
|
149
149
|
)
|
|
150
150
|
)
|
|
151
151
|
|
|
152
|
+
def _print_quickstart(self) -> None:
|
|
153
|
+
"""
|
|
154
|
+
打印 Quick Start 面板
|
|
155
|
+
|
|
156
|
+
在 ``epsdk`` 不带任何子命令时输出,帮助新用户在 30 秒内看到
|
|
157
|
+
三步走路径(安装 / 创建项目 / 运行),降低首次使用门槛。
|
|
158
|
+
"""
|
|
159
|
+
steps = [
|
|
160
|
+
(
|
|
161
|
+
i18n.t("cli.run.quickstart.step1_label"),
|
|
162
|
+
i18n.t("cli.run.quickstart.step1_cmd"),
|
|
163
|
+
),
|
|
164
|
+
(
|
|
165
|
+
i18n.t("cli.run.quickstart.step2_label"),
|
|
166
|
+
i18n.t("cli.run.quickstart.step2_cmd"),
|
|
167
|
+
),
|
|
168
|
+
(
|
|
169
|
+
i18n.t("cli.run.quickstart.step3_label"),
|
|
170
|
+
i18n.t("cli.run.quickstart.step3_cmd"),
|
|
171
|
+
),
|
|
172
|
+
]
|
|
173
|
+
lines: list[str] = []
|
|
174
|
+
for idx, (label, cmd) in enumerate(steps, start=1):
|
|
175
|
+
lines.append(f"[bold]{idx}. {label}[/] [cmd]{cmd}[/]")
|
|
176
|
+
lines.append("")
|
|
177
|
+
lines.append(f"[dim]{i18n.t('cli.run.quickstart.docs_hint')}[/]")
|
|
178
|
+
lines.append(f"[dim]{i18n.t('cli.run.quickstart.run_help_hint')}[/]")
|
|
179
|
+
|
|
180
|
+
console.print(
|
|
181
|
+
Panel(
|
|
182
|
+
"\n".join(lines),
|
|
183
|
+
title=f"[title]{i18n.t('cli.run.quickstart.title')}[/]",
|
|
184
|
+
subtitle=i18n.t("cli.run.quickstart.subtitle"),
|
|
185
|
+
border_style="info",
|
|
186
|
+
)
|
|
187
|
+
)
|
|
188
|
+
|
|
152
189
|
def _check_command_typo(self) -> None:
|
|
153
190
|
"""
|
|
154
191
|
在 argparse 解析之前检查命令拼写
|
|
@@ -174,23 +211,24 @@ class CLI:
|
|
|
174
211
|
return
|
|
175
212
|
|
|
176
213
|
# 命令无效,给出拼写建议(前缀加成确保 ins → install 而非 list)
|
|
177
|
-
from
|
|
214
|
+
from .hints import best_match_with_prefix
|
|
178
215
|
|
|
179
216
|
print_banner()
|
|
180
217
|
suggestion = best_match_with_prefix(
|
|
181
218
|
cmd, canonical_names, cutoff=0.5
|
|
182
219
|
)
|
|
183
220
|
|
|
184
|
-
console.print(
|
|
185
|
-
f"[error]{i18n.t('cli.run.unknown_command', command=cmd)}[/]"
|
|
186
|
-
)
|
|
187
221
|
if suggestion:
|
|
188
|
-
console
|
|
189
|
-
|
|
222
|
+
from .console import print_suggestion
|
|
223
|
+
|
|
224
|
+
print_suggestion(
|
|
225
|
+
title=i18n.t("cli.run.unknown_command", command=cmd),
|
|
226
|
+
suggestions=[f"epsdk {suggestion} --help"],
|
|
190
227
|
)
|
|
191
|
-
console.print()
|
|
192
|
-
console.print(f" [dim]epsdk {suggestion} --help[/]")
|
|
193
228
|
else:
|
|
229
|
+
console.print(
|
|
230
|
+
f"[error]{i18n.t('cli.run.unknown_command', command=cmd)}[/]"
|
|
231
|
+
)
|
|
194
232
|
self.parser.print_help()
|
|
195
233
|
sys.exit(1)
|
|
196
234
|
|
|
@@ -258,12 +296,13 @@ class CLI:
|
|
|
258
296
|
self._print_version()
|
|
259
297
|
return
|
|
260
298
|
|
|
261
|
-
#
|
|
299
|
+
# 没有指定命令时显示 Quick Start + 帮助
|
|
262
300
|
if not args.command:
|
|
263
301
|
if unknown:
|
|
264
302
|
console.print(
|
|
265
303
|
f"[warning]{i18n.t('cli.run.unknown_args', args=' '.join(unknown))}[/]"
|
|
266
304
|
)
|
|
305
|
+
self._print_quickstart()
|
|
267
306
|
self.parser.print_help()
|
|
268
307
|
return
|
|
269
308
|
|
|
@@ -289,7 +328,7 @@ class CLI:
|
|
|
289
328
|
command.execute(args)
|
|
290
329
|
else:
|
|
291
330
|
# 拼写建议:检查是否输入了与已知命令相似的名称
|
|
292
|
-
from
|
|
331
|
+
from .hints import best_match_with_prefix
|
|
293
332
|
|
|
294
333
|
suggestion = best_match_with_prefix(
|
|
295
334
|
args.command, self.registry.list_all(), cutoff=0.5
|
|
@@ -309,6 +348,12 @@ class CLI:
|
|
|
309
348
|
sys.exit(1)
|
|
310
349
|
except Exception as e:
|
|
311
350
|
console.print(f"[error]{i18n.t('cli.run.exec_error', error=e)}[/]")
|
|
351
|
+
# 场景化友好提示:根据异常类型给出下一步建议
|
|
352
|
+
from .hints import suggest_for_exception
|
|
353
|
+
|
|
354
|
+
hint_key = suggest_for_exception(e)
|
|
355
|
+
if hint_key:
|
|
356
|
+
console.print(f"[hint]{i18n.t(hint_key)}[/]")
|
|
312
357
|
if args.verbose >= 1:
|
|
313
358
|
console.print(traceback.format_exc())
|
|
314
359
|
sys.exit(1)
|
|
@@ -55,6 +55,14 @@ class CLI:
|
|
|
55
55
|
打印版本信息
|
|
56
56
|
"""
|
|
57
57
|
...
|
|
58
|
+
def _print_quickstart(self) -> None:
|
|
59
|
+
"""
|
|
60
|
+
打印 Quick Start 面板
|
|
61
|
+
|
|
62
|
+
在 ``epsdk`` 不带任何子命令时输出,帮助新用户在 30 秒内看到
|
|
63
|
+
三步走路径(安装 / 创建项目 / 运行),降低首次使用门槛。
|
|
64
|
+
"""
|
|
65
|
+
...
|
|
58
66
|
def _check_command_typo(self) -> None:
|
|
59
67
|
"""
|
|
60
68
|
在 argparse 解析之前检查命令拼写
|
|
@@ -110,10 +110,16 @@ class RunCommand(Command):
|
|
|
110
110
|
|
|
111
111
|
if script:
|
|
112
112
|
if not Path(script).exists():
|
|
113
|
+
# 列出当前目录的 .py 文件作为上下文参考
|
|
114
|
+
py_files = sorted(Path().glob("*.py"))
|
|
115
|
+
file_list = ", ".join(f.name for f in py_files[:5]) if py_files else None
|
|
116
|
+
hint_text = i18n.t("cli.run.use_init")
|
|
117
|
+
if file_list:
|
|
118
|
+
hint_text += " " + i18n.t("cli.run.available_scripts", files=file_list)
|
|
113
119
|
console.print(
|
|
114
120
|
f"[error]{i18n.t('cli.run.script_not_found', script=script)}[/]"
|
|
115
121
|
)
|
|
116
|
-
console.print(f"[info]{
|
|
122
|
+
console.print(f"[info]{hint_text}[/]")
|
|
117
123
|
return
|
|
118
124
|
if Path(script).is_dir():
|
|
119
125
|
console.print(
|