zrb 1.5.8__tar.gz → 1.5.9__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.
- {zrb-1.5.8 → zrb-1.5.9}/PKG-INFO +2 -2
- {zrb-1.5.8 → zrb-1.5.9}/pyproject.toml +2 -2
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/llm_config.py +38 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/any_task.py +22 -6
- zrb-1.5.9/src/zrb/task/base/context.py +108 -0
- zrb-1.5.9/src/zrb/task/base/dependencies.py +57 -0
- zrb-1.5.9/src/zrb/task/base/execution.py +274 -0
- zrb-1.5.9/src/zrb/task/base/lifecycle.py +182 -0
- zrb-1.5.9/src/zrb/task/base/monitoring.py +134 -0
- zrb-1.5.9/src/zrb/task/base/operators.py +41 -0
- zrb-1.5.9/src/zrb/task/base_task.py +227 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/context_enrichment.py +6 -3
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/history_summarization.py +10 -7
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm_task.py +5 -3
- zrb-1.5.9/src/zrb/xcom/__init__.py +0 -0
- zrb-1.5.8/src/zrb/task/base_task.py +0 -533
- {zrb-1.5.8 → zrb-1.5.9}/README.md +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/__main__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/attr/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/attr/type.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/base64.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/git.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/git_subtree.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/group.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/history.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/llm_chat.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/previous-session.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/tool/api.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/tool/cli.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/tool/file.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/tool/rag.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/llm/tool/web.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/md5.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/gateway/view/content/my-module/my-entity.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_db_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_create_my_entity.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_delete_my_entity.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_read_my_entity.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/test/my_module/my_entity/test_update_my_entity.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_api_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_direct_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/script.py.mako +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/create/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/create/project-template/README.md +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/project/create/project_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/python.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/random.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/common_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/ubuntu.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/shell/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/builtin/todo.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/callback/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/callback/any_callback.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/callback/callback.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/cmd/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/cmd/cmd_result.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/cmd/cmd_val.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/config.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/content_transformer/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/content_transformer/any_content_transformer.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/content_transformer/content_transformer.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/context/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/context/any_context.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/context/any_shared_context.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/context/context.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/context/shared_context.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/dot_dict/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/dot_dict/dot_dict.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/env/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/env/any_env.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/env/env.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/env/env_file.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/env/env_map.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/group/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/group/any_group.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/group/group.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/any_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/base_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/bool_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/float_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/int_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/option_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/password_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/str_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/input/text_input.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/cli.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/common_util.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_app.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_config/config.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_config/config_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/docs_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/error_page/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/home_page/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/login_api_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/login_page/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/logout_api_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/logout_page/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/common.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/static/static_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_schema/session.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_schema/token.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_schema/user.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_util/cookie.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_util/html.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_util/token.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/runner/web_util/user.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session/any_session.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session/session.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_log/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_log/session_state_log.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_logger/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/__init__.py +0 -0
- {zrb-1.5.8/src/zrb/task/llm → zrb-1.5.9/src/zrb/task/base}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/base_trigger.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/cmd_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/http_check.py +0 -0
- {zrb-1.5.8/src/zrb/task_status → zrb-1.5.9/src/zrb/task/llm}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/agent.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/config.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/context.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/error.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/history.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/print_node.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/prompt.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/tool_wrapper.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/llm/typing.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/make_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/rsync_task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/scaffolder.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/scheduler.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/task.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task/tcp_check.py +0 -0
- {zrb-1.5.8/src/zrb/util → zrb-1.5.9/src/zrb/task_status}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/task_status/task_status.py +0 -0
- {zrb-1.5.8/src/zrb/util/cli → zrb-1.5.9/src/zrb/util}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/attr.py +0 -0
- {zrb-1.5.8/src/zrb/util/cmd → zrb-1.5.9/src/zrb/util/cli}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/cli/style.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/cli/subcommand.py +0 -0
- {zrb-1.5.8/src/zrb/util/codemod → zrb-1.5.9/src/zrb/util/cmd}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/cmd/command.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/cmd/remote.py +0 -0
- {zrb-1.5.8/src/zrb/util/string → zrb-1.5.9/src/zrb/util/codemod}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modification_mode.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_class.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_class_parent.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_class_property.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_dict.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_function.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_function_call.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_method.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/codemod/modify_module.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/cron.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/file.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/git.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/git_subtree.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/group.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/load.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/run.py +0 -0
- {zrb-1.5.8/src/zrb/xcom → zrb-1.5.9/src/zrb/util/string}/__init__.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/string/conversion.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/string/format.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/string/name.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/util/todo.py +0 -0
- {zrb-1.5.8 → zrb-1.5.9}/src/zrb/xcom/xcom.py +0 -0
{zrb-1.5.8 → zrb-1.5.9}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 1.5.
|
3
|
+
Version: 1.5.9
|
4
4
|
Summary: Your Automation Powerhouse
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
@@ -26,7 +26,7 @@ Requires-Dist: openai (>=1.70.0,<2.0.0) ; extra == "rag" or extra == "all"
|
|
26
26
|
Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
|
27
27
|
Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
|
28
28
|
Requires-Dist: psutil (>=7.0.0,<8.0.0)
|
29
|
-
Requires-Dist: pydantic-ai (>=0.
|
29
|
+
Requires-Dist: pydantic-ai (>=0.1.2,<0.2.0)
|
30
30
|
Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
|
31
31
|
Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
|
32
32
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "zrb"
|
3
|
-
version = "1.5.
|
3
|
+
version = "1.5.9"
|
4
4
|
description = "Your Automation Powerhouse"
|
5
5
|
authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
|
6
6
|
license = "AGPL-3.0-or-later"
|
@@ -49,7 +49,7 @@ beautifulsoup4 = "^4.13.3"
|
|
49
49
|
fastapi = {extras = ["standard"], version = "^0.115.12"}
|
50
50
|
python-jose = {extras = ["cryptography"], version = "^3.4.0"}
|
51
51
|
ulid-py = "^1.1.0"
|
52
|
-
pydantic-ai = "^0.
|
52
|
+
pydantic-ai = "^0.1.2"
|
53
53
|
openai = {version = "^1.70.0", optional = true}
|
54
54
|
playwright = {version = "^1.51.0", optional = true}
|
55
55
|
psutil = "^7.0.0"
|
@@ -73,6 +73,9 @@ class LLMConfig:
|
|
73
73
|
default_system_prompt: str | None = None,
|
74
74
|
default_summarization_prompt: str | None = None,
|
75
75
|
default_context_enrichment_prompt: str | None = None,
|
76
|
+
default_summarize_history: bool | None = None,
|
77
|
+
default_history_summarization_threshold: int | None = None,
|
78
|
+
default_enrich_context: bool | None = None,
|
76
79
|
):
|
77
80
|
self._default_model_name = (
|
78
81
|
default_model_name
|
@@ -109,6 +112,21 @@ class LLMConfig:
|
|
109
112
|
if default_context_enrichment_prompt is not None
|
110
113
|
else os.getenv("ZRB_LLM_CONTEXT_ENRICHMENT_PROMPT", None)
|
111
114
|
)
|
115
|
+
self._default_summarize_history = (
|
116
|
+
default_summarize_history
|
117
|
+
if default_summarize_history is not None
|
118
|
+
else os.getenv("ZRB_LLM_SUMMARIZE_HISTORY", "true").lower() == "true"
|
119
|
+
)
|
120
|
+
self._default_history_summarization_threshold = (
|
121
|
+
default_history_summarization_threshold
|
122
|
+
if default_history_summarization_threshold is not None
|
123
|
+
else int(os.getenv("ZRB_LLM_HISTORY_SUMMARIZATION_THRESHOLD", "5"))
|
124
|
+
)
|
125
|
+
self._default_enrich_context = (
|
126
|
+
default_enrich_context
|
127
|
+
if default_enrich_context is not None
|
128
|
+
else os.getenv("ZRB_LLM_ENRICH_CONTEXT", "false").lower() == "true"
|
129
|
+
)
|
112
130
|
self._default_provider = None
|
113
131
|
self._default_model = None
|
114
132
|
|
@@ -164,6 +182,15 @@ class LLMConfig:
|
|
164
182
|
provider=self.get_default_model_provider(),
|
165
183
|
)
|
166
184
|
|
185
|
+
def get_default_summarize_history(self) -> bool:
|
186
|
+
return self._default_summarize_history
|
187
|
+
|
188
|
+
def get_default_history_summarization_threshold(self) -> int:
|
189
|
+
return self._default_history_summarization_threshold
|
190
|
+
|
191
|
+
def get_default_enrich_context(self) -> bool:
|
192
|
+
return self._default_enrich_context
|
193
|
+
|
167
194
|
def set_default_persona(self, persona: str):
|
168
195
|
self._default_persona = persona
|
169
196
|
|
@@ -191,5 +218,16 @@ class LLMConfig:
|
|
191
218
|
def set_default_model(self, model: Model | str | None):
|
192
219
|
self._default_model = model
|
193
220
|
|
221
|
+
def set_default_summarize_history(self, summarize_history: bool):
|
222
|
+
self._default_summarize_history = summarize_history
|
223
|
+
|
224
|
+
def set_default_history_summarization_threshold(
|
225
|
+
self, history_summarization_threshold: int
|
226
|
+
):
|
227
|
+
self._default_history_summarization_threshold = history_summarization_threshold
|
228
|
+
|
229
|
+
def set_default_enrich_context(self, enrich_context: bool):
|
230
|
+
self._default_enrich_context = enrich_context
|
231
|
+
|
194
232
|
|
195
233
|
llm_config = LLMConfig()
|
@@ -12,12 +12,28 @@ if TYPE_CHECKING:
|
|
12
12
|
|
13
13
|
|
14
14
|
class AnyTask(ABC):
|
15
|
-
"""Abstract base class
|
16
|
-
|
17
|
-
This
|
18
|
-
task
|
19
|
-
|
20
|
-
|
15
|
+
"""Abstract base class defining the interface for all executable tasks within Zrb.
|
16
|
+
|
17
|
+
This interface specifies the essential properties and methods that any concrete
|
18
|
+
task implementation must provide. It covers:
|
19
|
+
|
20
|
+
- **Metadata:** Properties like `name`, `description`, `color`, and `icon` for
|
21
|
+
identification and UI representation.
|
22
|
+
- **Configuration:** Properties for defining `inputs` (user-provided parameters)
|
23
|
+
and `envs` (environment variables).
|
24
|
+
- **Execution Control:** Properties like `cli_only` to restrict execution context.
|
25
|
+
- **Dependency Management:** Properties for `upstreams` (prerequisites),
|
26
|
+
`fallbacks` (error handling), `successors` (post-completion tasks), and
|
27
|
+
`readiness_checks` (for long-running tasks). Methods like `append_*` allow
|
28
|
+
programmatic modification of these dependencies.
|
29
|
+
- **Context Management:** `get_ctx` method to retrieve the task's specific
|
30
|
+
execution context.
|
31
|
+
- **Execution Methods:** `run` (synchronous) and `async_run` (asynchronous)
|
32
|
+
entry points, along with internal execution helpers (`exec_root_tasks`,
|
33
|
+
`exec_chain`, `exec`) defining the execution lifecycle.
|
34
|
+
|
35
|
+
Concrete task classes (like `BaseTask`) inherit from `AnyTask` and provide
|
36
|
+
the actual implementation for these abstract members.
|
21
37
|
"""
|
22
38
|
|
23
39
|
@property
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import os
|
2
|
+
from typing import TYPE_CHECKING
|
3
|
+
|
4
|
+
from zrb.context.any_context import AnyContext
|
5
|
+
from zrb.context.any_shared_context import AnySharedContext
|
6
|
+
from zrb.env.any_env import AnyEnv
|
7
|
+
from zrb.input.any_input import AnyInput
|
8
|
+
from zrb.session.any_session import AnySession
|
9
|
+
from zrb.task.any_task import AnyTask
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
# Keep BaseTask under TYPE_CHECKING for functions that need it
|
13
|
+
from zrb.task.base_task import BaseTask
|
14
|
+
|
15
|
+
|
16
|
+
def build_task_context(task: AnyTask, session: AnySession) -> AnyContext:
|
17
|
+
"""
|
18
|
+
Retrieves the context for the task from the session and enhances it
|
19
|
+
with the task's specific environment variables.
|
20
|
+
"""
|
21
|
+
ctx = session.get_ctx(task)
|
22
|
+
# Enhance session ctx with current task env
|
23
|
+
for env in task.envs:
|
24
|
+
env.update_context(ctx)
|
25
|
+
return ctx
|
26
|
+
|
27
|
+
|
28
|
+
def fill_shared_context_inputs(
|
29
|
+
task: AnyTask, shared_context: AnySharedContext, str_kwargs: dict[str, str] = {}
|
30
|
+
):
|
31
|
+
"""
|
32
|
+
Populates the shared context with input values provided via kwargs.
|
33
|
+
"""
|
34
|
+
for task_input in task.inputs:
|
35
|
+
if task_input.name not in shared_context.input:
|
36
|
+
str_value = str_kwargs.get(task_input.name, None)
|
37
|
+
task_input.update_shared_context(shared_context, str_value)
|
38
|
+
|
39
|
+
|
40
|
+
def fill_shared_context_envs(shared_context: AnySharedContext):
|
41
|
+
"""
|
42
|
+
Injects OS environment variables into the shared context if they don't already exist.
|
43
|
+
"""
|
44
|
+
os_env_map = {
|
45
|
+
key: val for key, val in os.environ.items() if key not in shared_context.env
|
46
|
+
}
|
47
|
+
shared_context.env.update(os_env_map)
|
48
|
+
|
49
|
+
|
50
|
+
def combine_inputs(
|
51
|
+
existing_inputs: list[AnyInput],
|
52
|
+
new_inputs: list[AnyInput | None] | AnyInput | None,
|
53
|
+
):
|
54
|
+
"""
|
55
|
+
Combines new inputs into an existing list, avoiding duplicates by name.
|
56
|
+
Modifies the existing_inputs list in place.
|
57
|
+
"""
|
58
|
+
input_names = [task_input.name for task_input in existing_inputs]
|
59
|
+
if isinstance(new_inputs, AnyInput):
|
60
|
+
new_inputs_list = [new_inputs]
|
61
|
+
elif new_inputs is None:
|
62
|
+
new_inputs_list = []
|
63
|
+
else:
|
64
|
+
new_inputs_list = new_inputs
|
65
|
+
|
66
|
+
for task_input in new_inputs_list:
|
67
|
+
if task_input is None:
|
68
|
+
continue
|
69
|
+
if task_input.name not in input_names:
|
70
|
+
existing_inputs.append(task_input)
|
71
|
+
input_names.append(task_input.name) # Update names list
|
72
|
+
|
73
|
+
|
74
|
+
def get_combined_envs(task: "BaseTask") -> list[AnyEnv]:
|
75
|
+
"""
|
76
|
+
Aggregates environment variables from the task and its upstreams.
|
77
|
+
"""
|
78
|
+
envs = []
|
79
|
+
for upstream in task.upstreams:
|
80
|
+
envs.extend(upstream.envs) # Use extend for list concatenation
|
81
|
+
|
82
|
+
# Access _envs directly as task is BaseTask
|
83
|
+
task_envs: list[AnyEnv | None] | AnyEnv | None = task._envs
|
84
|
+
if isinstance(task_envs, AnyEnv):
|
85
|
+
envs.append(task_envs)
|
86
|
+
elif isinstance(task_envs, list):
|
87
|
+
# Filter out None while extending
|
88
|
+
envs.extend(env for env in task_envs if env is not None)
|
89
|
+
|
90
|
+
# Filter out None values efficiently from the combined list
|
91
|
+
return [env for env in envs if env is not None]
|
92
|
+
|
93
|
+
|
94
|
+
def get_combined_inputs(task: "BaseTask") -> list[AnyInput]:
|
95
|
+
"""
|
96
|
+
Aggregates inputs from the task and its upstreams, avoiding duplicates.
|
97
|
+
"""
|
98
|
+
inputs: list[AnyInput] = []
|
99
|
+
for upstream in task.upstreams:
|
100
|
+
combine_inputs(inputs, upstream.inputs)
|
101
|
+
|
102
|
+
# Access _inputs directly as task is BaseTask
|
103
|
+
task_inputs: list[AnyInput | None] | AnyInput | None = task._inputs
|
104
|
+
if task_inputs is not None:
|
105
|
+
combine_inputs(inputs, task_inputs)
|
106
|
+
|
107
|
+
# Filter out None values (although combine_inputs should handle this)
|
108
|
+
return [task_input for task_input in inputs if task_input is not None]
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from typing import TypeVar
|
2
|
+
|
3
|
+
from zrb.task.any_task import AnyTask
|
4
|
+
|
5
|
+
T = TypeVar("T", bound="AnyTask")
|
6
|
+
|
7
|
+
|
8
|
+
def get_dependency_list(task: AnyTask, attr_name: str) -> list[AnyTask]:
|
9
|
+
"""
|
10
|
+
Safely retrieves a list of dependencies (upstreams, fallbacks, etc.)
|
11
|
+
from a task attribute, handling None or single-task values.
|
12
|
+
"""
|
13
|
+
dependencies = getattr(task, attr_name, None)
|
14
|
+
if dependencies is None:
|
15
|
+
return []
|
16
|
+
elif isinstance(dependencies, list):
|
17
|
+
# Ensure all elements are AnyTask (or compatible) if needed,
|
18
|
+
# but for now, assume the list contains tasks.
|
19
|
+
return dependencies
|
20
|
+
# Assume it's a single AnyTask instance
|
21
|
+
return [dependencies]
|
22
|
+
|
23
|
+
|
24
|
+
def append_dependency(
|
25
|
+
task: T, attr_name: str, dependencies_to_add: AnyTask | list[AnyTask]
|
26
|
+
) -> None:
|
27
|
+
"""
|
28
|
+
Appends one or more dependencies to the specified attribute list of a task,
|
29
|
+
ensuring the attribute becomes a list and avoiding duplicates.
|
30
|
+
|
31
|
+
Modifies the attribute on the task object directly.
|
32
|
+
"""
|
33
|
+
# Retrieve the current list, handling None or single item cases
|
34
|
+
current_deps_list = getattr(task, attr_name, None)
|
35
|
+
if current_deps_list is None:
|
36
|
+
current_deps_list = []
|
37
|
+
elif not isinstance(current_deps_list, list):
|
38
|
+
current_deps_list = [current_deps_list]
|
39
|
+
else:
|
40
|
+
# Create a copy to avoid modifying the original list if no changes occur
|
41
|
+
current_deps_list = list(current_deps_list)
|
42
|
+
|
43
|
+
if isinstance(dependencies_to_add, list):
|
44
|
+
new_deps = dependencies_to_add
|
45
|
+
else:
|
46
|
+
new_deps = [dependencies_to_add] # Ensure it's always a list
|
47
|
+
|
48
|
+
added = False
|
49
|
+
for dep in new_deps:
|
50
|
+
# Check for existence before appending
|
51
|
+
if dep not in current_deps_list:
|
52
|
+
current_deps_list.append(dep)
|
53
|
+
added = True
|
54
|
+
|
55
|
+
# Update the attribute on the task object only if changes were made
|
56
|
+
if added:
|
57
|
+
setattr(task, attr_name, current_deps_list)
|
@@ -0,0 +1,274 @@
|
|
1
|
+
import asyncio
|
2
|
+
from typing import TYPE_CHECKING, Any
|
3
|
+
|
4
|
+
from zrb.context.any_context import AnyContext
|
5
|
+
from zrb.session.any_session import AnySession
|
6
|
+
from zrb.util.attr import get_bool_attr
|
7
|
+
from zrb.util.run import run_async
|
8
|
+
from zrb.xcom.xcom import Xcom
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from zrb.task.base_task import BaseTask
|
12
|
+
|
13
|
+
|
14
|
+
async def execute_task_chain(task: "BaseTask", session: AnySession):
|
15
|
+
"""
|
16
|
+
Executes the task and its downstream successors if conditions are met.
|
17
|
+
"""
|
18
|
+
if session.is_terminated or not session.is_allowed_to_run(task):
|
19
|
+
return
|
20
|
+
result = await execute_task_action(task, session)
|
21
|
+
# Get next tasks
|
22
|
+
nexts = session.get_next_tasks(task)
|
23
|
+
if session.is_terminated or len(nexts) == 0:
|
24
|
+
return result
|
25
|
+
# Run next tasks asynchronously
|
26
|
+
next_coros = [run_async(next_task.exec_chain(session)) for next_task in nexts]
|
27
|
+
# Wait for the next tasks to complete. The result of the current task is returned.
|
28
|
+
await asyncio.gather(*next_coros)
|
29
|
+
return result
|
30
|
+
|
31
|
+
|
32
|
+
async def execute_task_action(task: "BaseTask", session: AnySession):
|
33
|
+
"""
|
34
|
+
Executes a single task's action, handling conditions and readiness checks.
|
35
|
+
"""
|
36
|
+
ctx = task.get_ctx(session)
|
37
|
+
if not session.is_allowed_to_run(task):
|
38
|
+
# Task is not allowed to run, skip it for now.
|
39
|
+
# This will be triggered later if dependencies are met.
|
40
|
+
ctx.log_info("Not allowed to run")
|
41
|
+
return
|
42
|
+
if not check_execute_condition(task, session):
|
43
|
+
# Skip the task based on its execute_condition
|
44
|
+
ctx.log_info("Marked as skipped (condition false)")
|
45
|
+
session.get_task_status(task).mark_as_skipped()
|
46
|
+
return
|
47
|
+
# Wait for task to be ready (handles action execution, readiness checks)
|
48
|
+
return await run_async(execute_action_until_ready(task, session))
|
49
|
+
|
50
|
+
|
51
|
+
def check_execute_condition(task: "BaseTask", session: AnySession) -> bool:
|
52
|
+
"""
|
53
|
+
Evaluates the task's execute_condition attribute.
|
54
|
+
"""
|
55
|
+
ctx = task.get_ctx(session)
|
56
|
+
execute_condition_attr = getattr(task, "_execute_condition", True)
|
57
|
+
return get_bool_attr(ctx, execute_condition_attr, True, auto_render=True)
|
58
|
+
|
59
|
+
|
60
|
+
async def execute_action_until_ready(task: "BaseTask", session: AnySession):
|
61
|
+
"""
|
62
|
+
Manages the execution of the task's action, coordinating with readiness checks.
|
63
|
+
"""
|
64
|
+
ctx = task.get_ctx(session)
|
65
|
+
readiness_checks = task.readiness_checks
|
66
|
+
readiness_check_delay = getattr(task, "_readiness_check_delay", 0.5)
|
67
|
+
monitor_readiness = getattr(task, "_monitor_readiness", False)
|
68
|
+
|
69
|
+
if not readiness_checks: # Simplified check for empty list
|
70
|
+
ctx.log_info("No readiness checks")
|
71
|
+
# Task has no readiness check, execute action directly
|
72
|
+
result = await run_async(execute_action_with_retry(task, session))
|
73
|
+
# Mark ready only if the action completed successfully (not failed/cancelled)
|
74
|
+
if session.get_task_status(task).is_completed:
|
75
|
+
ctx.log_info("Marked as ready")
|
76
|
+
session.get_task_status(task).mark_as_ready()
|
77
|
+
return result
|
78
|
+
|
79
|
+
# Start the task action and readiness checks concurrently
|
80
|
+
ctx.log_info("Starting action and readiness checks")
|
81
|
+
action_coro = asyncio.create_task(
|
82
|
+
run_async(execute_action_with_retry(task, session))
|
83
|
+
)
|
84
|
+
|
85
|
+
await asyncio.sleep(readiness_check_delay)
|
86
|
+
|
87
|
+
readiness_check_coros = [
|
88
|
+
run_async(check.exec_chain(session)) for check in readiness_checks
|
89
|
+
]
|
90
|
+
|
91
|
+
# Wait primarily for readiness checks to complete
|
92
|
+
ctx.log_info("Waiting for readiness checks")
|
93
|
+
readiness_passed = False
|
94
|
+
try:
|
95
|
+
# Gather results, but primarily interested in completion/errors
|
96
|
+
await asyncio.gather(*readiness_check_coros)
|
97
|
+
# Check if all readiness tasks actually completed successfully
|
98
|
+
all_readiness_completed = all(
|
99
|
+
session.get_task_status(check).is_completed for check in readiness_checks
|
100
|
+
)
|
101
|
+
if all_readiness_completed:
|
102
|
+
ctx.log_info("Readiness checks completed successfully")
|
103
|
+
readiness_passed = True
|
104
|
+
# Mark task as ready only if checks passed and action didn't fail during checks
|
105
|
+
if not session.get_task_status(task).is_failed:
|
106
|
+
ctx.log_info("Marked as ready")
|
107
|
+
session.get_task_status(task).mark_as_ready()
|
108
|
+
else:
|
109
|
+
ctx.log_warning(
|
110
|
+
"One or more readiness checks did not complete successfully."
|
111
|
+
)
|
112
|
+
|
113
|
+
except Exception as e:
|
114
|
+
ctx.log_error(f"Readiness check failed with exception: {e}")
|
115
|
+
# If readiness checks fail with an exception, the task is not ready.
|
116
|
+
# The action_coro might still be running or have failed.
|
117
|
+
# execute_action_with_retry handles marking the main task status.
|
118
|
+
|
119
|
+
# Defer the main action coroutine; it will be awaited later if needed
|
120
|
+
session.defer_action(task, action_coro)
|
121
|
+
|
122
|
+
# Start monitoring only if readiness passed and monitoring is enabled
|
123
|
+
if readiness_passed and monitor_readiness:
|
124
|
+
# Import dynamically to avoid circular dependency if monitoring imports execution
|
125
|
+
from zrb.task.base.monitoring import monitor_task_readiness
|
126
|
+
|
127
|
+
monitor_coro = asyncio.create_task(
|
128
|
+
run_async(monitor_task_readiness(task, session, action_coro))
|
129
|
+
)
|
130
|
+
session.defer_monitoring(task, monitor_coro)
|
131
|
+
|
132
|
+
# The result here is primarily about readiness check completion.
|
133
|
+
# The actual task result is handled by the deferred action_coro.
|
134
|
+
return None
|
135
|
+
|
136
|
+
|
137
|
+
async def execute_action_with_retry(task: "BaseTask", session: AnySession) -> Any:
|
138
|
+
"""
|
139
|
+
Executes the task's core action (`_exec_action`) with retry logic,
|
140
|
+
handling success (triggering successors) and failure (triggering fallbacks).
|
141
|
+
"""
|
142
|
+
ctx = task.get_ctx(session)
|
143
|
+
retries = getattr(task, "_retries", 2)
|
144
|
+
retry_period = getattr(task, "_retry_period", 0)
|
145
|
+
max_attempt = retries + 1
|
146
|
+
ctx.set_max_attempt(max_attempt)
|
147
|
+
|
148
|
+
for attempt in range(max_attempt):
|
149
|
+
ctx.set_attempt(attempt + 1)
|
150
|
+
if attempt > 0:
|
151
|
+
ctx.log_info(f"Retrying in {retry_period}s...")
|
152
|
+
await asyncio.sleep(retry_period)
|
153
|
+
|
154
|
+
try:
|
155
|
+
ctx.log_info("Marked as started")
|
156
|
+
session.get_task_status(task).mark_as_started()
|
157
|
+
|
158
|
+
# Execute the underlying action (which might be overridden in subclasses)
|
159
|
+
# We call the task's _exec_action method directly here.
|
160
|
+
result = await run_async(task._exec_action(ctx))
|
161
|
+
|
162
|
+
ctx.log_info("Marked as completed")
|
163
|
+
session.get_task_status(task).mark_as_completed()
|
164
|
+
|
165
|
+
# Store result in XCom
|
166
|
+
task_xcom: Xcom = ctx.xcom.get(task.name)
|
167
|
+
task_xcom.push(result)
|
168
|
+
|
169
|
+
# Skip fallbacks and execute successors on success
|
170
|
+
skip_fallbacks(task, session)
|
171
|
+
await run_async(execute_successors(task, session))
|
172
|
+
return result
|
173
|
+
|
174
|
+
except (asyncio.CancelledError, KeyboardInterrupt):
|
175
|
+
ctx.log_warning("Task cancelled or interrupted")
|
176
|
+
session.get_task_status(task).mark_as_failed() # Mark as failed on cancel
|
177
|
+
# Do not trigger fallbacks/successors on cancellation
|
178
|
+
return # Or re-raise? Depends on desired cancellation behavior
|
179
|
+
|
180
|
+
except BaseException as e:
|
181
|
+
ctx.log_error(f"Attempt {attempt + 1}/{max_attempt} failed: {e}")
|
182
|
+
session.get_task_status(
|
183
|
+
task
|
184
|
+
).mark_as_failed() # Mark failed for this attempt
|
185
|
+
|
186
|
+
if attempt < max_attempt - 1:
|
187
|
+
# More retries available
|
188
|
+
continue
|
189
|
+
else:
|
190
|
+
# Final attempt failed
|
191
|
+
ctx.log_error("Marked as permanently failed")
|
192
|
+
session.get_task_status(task).mark_as_permanently_failed()
|
193
|
+
# Skip successors and execute fallbacks on permanent failure
|
194
|
+
skip_successors(task, session)
|
195
|
+
await run_async(execute_fallbacks(task, session))
|
196
|
+
raise e # Re-raise the exception after handling fallbacks
|
197
|
+
|
198
|
+
|
199
|
+
async def run_default_action(task: "BaseTask", ctx: AnyContext) -> Any:
|
200
|
+
"""
|
201
|
+
Executes the specific action defined by the '_action' attribute for BaseTask.
|
202
|
+
This is the default implementation called by BaseTask._exec_action.
|
203
|
+
Subclasses like LLMTask override _exec_action with their own logic.
|
204
|
+
"""
|
205
|
+
action = getattr(task, "_action", None)
|
206
|
+
if action is None:
|
207
|
+
ctx.log_debug("No action defined for this task.")
|
208
|
+
return None
|
209
|
+
if isinstance(action, str):
|
210
|
+
# Render f-string action
|
211
|
+
rendered_action = ctx.render(action)
|
212
|
+
ctx.log_debug(f"Rendered action string: {rendered_action}")
|
213
|
+
# Assuming string actions are meant to be returned as is.
|
214
|
+
# If they need execution (e.g., shell commands), that logic would go here.
|
215
|
+
return rendered_action
|
216
|
+
elif callable(action):
|
217
|
+
# Execute callable action
|
218
|
+
ctx.log_debug(f"Executing callable action: {action.__name__}")
|
219
|
+
return await run_async(action(ctx))
|
220
|
+
else:
|
221
|
+
ctx.log_warning(f"Unsupported action type: {type(action)}")
|
222
|
+
return None
|
223
|
+
|
224
|
+
|
225
|
+
async def execute_successors(task: "BaseTask", session: "AnySession"):
|
226
|
+
"""Executes all successor tasks."""
|
227
|
+
ctx = task.get_ctx(session)
|
228
|
+
successors = task.successors
|
229
|
+
if successors:
|
230
|
+
ctx.log_info(f"Executing {len(successors)} successor(s)")
|
231
|
+
successor_coros = [
|
232
|
+
run_async(successor.exec_chain(session)) for successor in successors
|
233
|
+
]
|
234
|
+
await asyncio.gather(*successor_coros)
|
235
|
+
else:
|
236
|
+
ctx.log_debug("No successors to execute.")
|
237
|
+
|
238
|
+
|
239
|
+
def skip_successors(task: "BaseTask", session: AnySession):
|
240
|
+
"""Marks all successor tasks as skipped."""
|
241
|
+
ctx = task.get_ctx(session)
|
242
|
+
successors = task.successors
|
243
|
+
if successors:
|
244
|
+
ctx.log_info(f"Skipping {len(successors)} successor(s)")
|
245
|
+
for successor in successors:
|
246
|
+
# Check if already skipped to avoid redundant logging/state changes
|
247
|
+
if not session.get_task_status(successor).is_skipped:
|
248
|
+
session.get_task_status(successor).mark_as_skipped()
|
249
|
+
|
250
|
+
|
251
|
+
async def execute_fallbacks(task: "BaseTask", session: AnySession):
|
252
|
+
"""Executes all fallback tasks."""
|
253
|
+
ctx = task.get_ctx(session)
|
254
|
+
fallbacks = task.fallbacks
|
255
|
+
if fallbacks:
|
256
|
+
ctx.log_info(f"Executing {len(fallbacks)} fallback(s)")
|
257
|
+
fallback_coros = [
|
258
|
+
run_async(fallback.exec_chain(session)) for fallback in fallbacks
|
259
|
+
]
|
260
|
+
await asyncio.gather(*fallback_coros)
|
261
|
+
else:
|
262
|
+
ctx.log_debug("No fallbacks to execute.")
|
263
|
+
|
264
|
+
|
265
|
+
def skip_fallbacks(task: "BaseTask", session: AnySession):
|
266
|
+
"""Marks all fallback tasks as skipped."""
|
267
|
+
ctx = task.get_ctx(session)
|
268
|
+
fallbacks = task.fallbacks
|
269
|
+
if fallbacks:
|
270
|
+
ctx.log_info(f"Skipping {len(fallbacks)} fallback(s)")
|
271
|
+
for fallback in fallbacks:
|
272
|
+
# Check if already skipped
|
273
|
+
if not session.get_task_status(fallback).is_skipped:
|
274
|
+
session.get_task_status(fallback).mark_as_skipped()
|