zrb 1.4.3__tar.gz → 1.5.0__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.4.3 → zrb-1.5.0}/PKG-INFO +4 -5
- {zrb-1.4.3 → zrb-1.5.0}/README.md +3 -4
- {zrb-1.4.3 → zrb-1.5.0}/pyproject.toml +1 -1
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/llm_chat.py +8 -6
- zrb-1.5.0/src/zrb/builtin/llm/tool/file.py +510 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/tool/web.py +2 -10
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/todo.py +37 -12
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/llm_config.py +31 -11
- zrb-1.4.3/src/zrb/builtin/llm/tool/file.py +0 -154
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/__main__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/attr/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/attr/type.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/base64.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/git.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/git_subtree.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/group.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/previous-session.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/tool/api.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/tool/cli.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/llm/tool/rag.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/md5.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/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.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/create/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/create/project-template/README.md +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/project/create/project_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/python.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/random.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/common_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/ubuntu.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/shell/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/callback/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/callback/any_callback.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/callback/callback.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/cmd/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/cmd/cmd_result.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/cmd/cmd_val.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/config.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/content_transformer/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/content_transformer/any_content_transformer.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/content_transformer/content_transformer.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/context/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/context/any_context.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/context/any_shared_context.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/context/context.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/context/shared_context.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/dot_dict/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/dot_dict/dot_dict.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/env/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/env/any_env.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/env/env.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/env/env_file.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/env/env_map.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/group/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/group/any_group.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/group/group.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/any_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/base_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/bool_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/float_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/int_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/option_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/password_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/str_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/input/text_input.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/cli.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/common_util.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_app.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_config/config.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_config/config_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/docs_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/error_page/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/home_page/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/login_api_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/login_page/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/logout_api_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/logout_page/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/common.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/static/static_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_schema/session.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_schema/token.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_schema/user.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_util/cookie.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_util/html.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_util/token.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/runner/web_util/user.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session/any_session.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session/session.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_log/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_log/session_state_log.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_logger/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/any_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/base_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/base_trigger.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/cmd_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/http_check.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/llm_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/make_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/rsync_task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/scaffolder.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/scheduler.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/task.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task/tcp_check.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task_status/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/task_status/task_status.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/attr.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cli/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cli/style.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cli/subcommand.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cmd/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cmd/command.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cmd/remote.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modification_mode.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_class.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_class_parent.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_class_property.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_dict.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_function.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_function_call.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_method.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/codemod/modify_module.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/cron.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/file.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/git.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/git_subtree.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/group.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/load.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/run.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/string/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/string/conversion.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/string/format.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/string/name.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/util/todo.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/xcom/__init__.py +0 -0
- {zrb-1.4.3 → zrb-1.5.0}/src/zrb/xcom/xcom.py +0 -0
{zrb-1.4.3 → zrb-1.5.0}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.5.0
|
4
4
|
Summary: Your Automation Powerhouse
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
@@ -97,9 +97,10 @@ Add the following content to your zrb_init.py:
|
|
97
97
|
import os
|
98
98
|
from zrb import cli, LLMTask, CmdTask, StrInput, Group
|
99
99
|
from zrb.builtin.llm.tool.file import (
|
100
|
-
|
100
|
+
list_files, read_from_file, search_files, write_to_file
|
101
101
|
)
|
102
102
|
|
103
|
+
|
103
104
|
CURRENT_DIR = os.getcwd()
|
104
105
|
|
105
106
|
# Create a group for UML-related tasks
|
@@ -117,9 +118,7 @@ make_uml_script = uml_group.add_task(
|
|
117
118
|
f"Write the script into {CURRENT_DIR}/{{ctx.input.diagram}}.uml"
|
118
119
|
),
|
119
120
|
tools=[
|
120
|
-
list_files,
|
121
|
-
read_text_file,
|
122
|
-
write_text_file,
|
121
|
+
list_files, read_from_file, search_files, write_to_file
|
123
122
|
],
|
124
123
|
)
|
125
124
|
)
|
@@ -58,9 +58,10 @@ Add the following content to your zrb_init.py:
|
|
58
58
|
import os
|
59
59
|
from zrb import cli, LLMTask, CmdTask, StrInput, Group
|
60
60
|
from zrb.builtin.llm.tool.file import (
|
61
|
-
|
61
|
+
list_files, read_from_file, search_files, write_to_file
|
62
62
|
)
|
63
63
|
|
64
|
+
|
64
65
|
CURRENT_DIR = os.getcwd()
|
65
66
|
|
66
67
|
# Create a group for UML-related tasks
|
@@ -78,9 +79,7 @@ make_uml_script = uml_group.add_task(
|
|
78
79
|
f"Write the script into {CURRENT_DIR}/{{ctx.input.diagram}}.uml"
|
79
80
|
),
|
80
81
|
tools=[
|
81
|
-
list_files,
|
82
|
-
read_text_file,
|
83
|
-
write_text_file,
|
82
|
+
list_files, read_from_file, search_files, write_to_file
|
84
83
|
],
|
85
84
|
)
|
86
85
|
)
|
@@ -6,10 +6,11 @@ from zrb.builtin.group import llm_group
|
|
6
6
|
from zrb.builtin.llm.tool.api import get_current_location, get_current_weather
|
7
7
|
from zrb.builtin.llm.tool.cli import run_shell_command
|
8
8
|
from zrb.builtin.llm.tool.file import (
|
9
|
+
apply_diff,
|
9
10
|
list_files,
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
read_from_file,
|
12
|
+
search_files,
|
13
|
+
write_to_file,
|
13
14
|
)
|
14
15
|
from zrb.builtin.llm.tool.web import (
|
15
16
|
create_search_internet_tool,
|
@@ -161,10 +162,11 @@ llm_chat: LLMTask = llm_group.add_task(
|
|
161
162
|
|
162
163
|
|
163
164
|
if LLM_ALLOW_ACCESS_LOCAL_FILE:
|
164
|
-
llm_chat.add_tool(read_all_files)
|
165
165
|
llm_chat.add_tool(list_files)
|
166
|
-
llm_chat.add_tool(
|
167
|
-
llm_chat.add_tool(
|
166
|
+
llm_chat.add_tool(read_from_file)
|
167
|
+
llm_chat.add_tool(write_to_file)
|
168
|
+
llm_chat.add_tool(search_files)
|
169
|
+
llm_chat.add_tool(apply_diff)
|
168
170
|
|
169
171
|
if LLM_ALLOW_ACCESS_SHELL:
|
170
172
|
llm_chat.add_tool(run_shell_command)
|
@@ -0,0 +1,510 @@
|
|
1
|
+
import fnmatch
|
2
|
+
import os
|
3
|
+
import re
|
4
|
+
from typing import Dict, List, Optional, Tuple, Union
|
5
|
+
|
6
|
+
from zrb.util.file import read_file as _read_file
|
7
|
+
from zrb.util.file import write_file as _write_file
|
8
|
+
|
9
|
+
# Common directories and files to exclude from file operations
|
10
|
+
_DEFAULT_EXCLUDES = [
|
11
|
+
# Version control
|
12
|
+
".git",
|
13
|
+
".svn",
|
14
|
+
".hg",
|
15
|
+
# Dependencies and packages
|
16
|
+
"node_modules",
|
17
|
+
"venv",
|
18
|
+
".venv",
|
19
|
+
"env",
|
20
|
+
".env",
|
21
|
+
# Build and cache
|
22
|
+
"__pycache__",
|
23
|
+
"*.pyc",
|
24
|
+
"build",
|
25
|
+
"dist",
|
26
|
+
"target",
|
27
|
+
# IDE and editor files
|
28
|
+
".idea",
|
29
|
+
".vscode",
|
30
|
+
"*.swp",
|
31
|
+
"*.swo",
|
32
|
+
# OS-specific
|
33
|
+
".DS_Store",
|
34
|
+
"Thumbs.db",
|
35
|
+
# Temporary and backup files
|
36
|
+
"*.tmp",
|
37
|
+
"*.bak",
|
38
|
+
"*.log",
|
39
|
+
]
|
40
|
+
|
41
|
+
# Maximum number of lines to read before truncating
|
42
|
+
_MAX_LINES_BEFORE_TRUNCATION = 1000
|
43
|
+
|
44
|
+
# Number of context lines to show around method definitions when truncating
|
45
|
+
_CONTEXT_LINES = 5
|
46
|
+
|
47
|
+
|
48
|
+
def list_files(
|
49
|
+
path: str = ".",
|
50
|
+
recursive: bool = True,
|
51
|
+
file_pattern: Optional[str] = None,
|
52
|
+
excluded_patterns: list[str] = _DEFAULT_EXCLUDES,
|
53
|
+
) -> list[str]:
|
54
|
+
"""
|
55
|
+
List files in a directory that match specified patterns.
|
56
|
+
|
57
|
+
Args:
|
58
|
+
path: The path of the directory to list contents for
|
59
|
+
(relative to the current working directory)
|
60
|
+
recursive: Whether to list files recursively.
|
61
|
+
Use True for recursive listing, False for top-level only.
|
62
|
+
file_pattern: Optional glob pattern to filter files.
|
63
|
+
None by default (all files will be included).
|
64
|
+
excluded_patterns: List of glob patterns to exclude. By default, contains sane values
|
65
|
+
to exclude common directories and files like version control, build artifacts,
|
66
|
+
and temporary files.
|
67
|
+
|
68
|
+
Returns:
|
69
|
+
A list of file paths matching the criteria
|
70
|
+
"""
|
71
|
+
all_files: list[str] = []
|
72
|
+
|
73
|
+
if recursive:
|
74
|
+
for root, dirs, files in os.walk(path):
|
75
|
+
# Filter out excluded directories to avoid descending into them
|
76
|
+
dirs[:] = [
|
77
|
+
d
|
78
|
+
for d in dirs
|
79
|
+
if not _should_exclude(os.path.join(root, d), excluded_patterns)
|
80
|
+
]
|
81
|
+
|
82
|
+
for filename in files:
|
83
|
+
full_path = os.path.join(root, filename)
|
84
|
+
# If file_pattern is None, include all files, otherwise match the pattern
|
85
|
+
if file_pattern is None or fnmatch.fnmatch(filename, file_pattern):
|
86
|
+
if not _should_exclude(full_path, excluded_patterns):
|
87
|
+
all_files.append(full_path)
|
88
|
+
else:
|
89
|
+
# Non-recursive listing (top-level only)
|
90
|
+
try:
|
91
|
+
for item in os.listdir(path):
|
92
|
+
full_path = os.path.join(path, item)
|
93
|
+
if os.path.isfile(full_path):
|
94
|
+
# If file_pattern is None, include all files, otherwise match the pattern
|
95
|
+
if file_pattern is None or fnmatch.fnmatch(item, file_pattern):
|
96
|
+
if not _should_exclude(full_path, excluded_patterns):
|
97
|
+
all_files.append(full_path)
|
98
|
+
except (FileNotFoundError, PermissionError) as e:
|
99
|
+
print(f"Error listing files in {path}: {e}")
|
100
|
+
|
101
|
+
return sorted(all_files)
|
102
|
+
|
103
|
+
|
104
|
+
def _should_exclude(
|
105
|
+
full_path: str, excluded_patterns: list[str] = _DEFAULT_EXCLUDES
|
106
|
+
) -> bool:
|
107
|
+
"""
|
108
|
+
Return True if the file at full_path should be excluded based on
|
109
|
+
the list of excluded_patterns. Patterns that include a path separator
|
110
|
+
are applied to the full normalized path; otherwise they are matched
|
111
|
+
against each individual component of the path.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
full_path: The full path to check
|
115
|
+
excluded_patterns: List of patterns to exclude
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
True if the path should be excluded, False otherwise
|
119
|
+
"""
|
120
|
+
norm_path = os.path.normpath(full_path)
|
121
|
+
path_parts = norm_path.split(os.sep)
|
122
|
+
|
123
|
+
for pat in excluded_patterns:
|
124
|
+
# If the pattern seems intended for full path matching (contains a separator)
|
125
|
+
if os.sep in pat or "/" in pat:
|
126
|
+
if fnmatch.fnmatch(norm_path, pat):
|
127
|
+
return True
|
128
|
+
else:
|
129
|
+
# Otherwise check each part of the path
|
130
|
+
if any(fnmatch.fnmatch(part, pat) for part in path_parts):
|
131
|
+
return True
|
132
|
+
# Also check the filename against the pattern
|
133
|
+
if os.path.isfile(full_path) and fnmatch.fnmatch(
|
134
|
+
os.path.basename(full_path), pat
|
135
|
+
):
|
136
|
+
return True
|
137
|
+
|
138
|
+
return False
|
139
|
+
|
140
|
+
|
141
|
+
def read_from_file(
|
142
|
+
path: str,
|
143
|
+
start_line: Optional[int] = None,
|
144
|
+
end_line: Optional[int] = None,
|
145
|
+
auto_truncate: bool = False,
|
146
|
+
) -> str:
|
147
|
+
"""
|
148
|
+
Read the contents of a file at the specified path.
|
149
|
+
|
150
|
+
Args:
|
151
|
+
path: The path of the file to read (relative to the current working directory)
|
152
|
+
start_line: The starting line number to read from (1-based).
|
153
|
+
If not provided, starts from the beginning.
|
154
|
+
end_line: The ending line number to read to (1-based, inclusive).
|
155
|
+
If not provided, reads to the end.
|
156
|
+
auto_truncate: Whether to automatically truncate large files when start_line
|
157
|
+
and end_line are not specified. If true and the file exceeds a certain
|
158
|
+
line threshold, it will return a subset of lines with information about
|
159
|
+
the total line count and method definitions. Default is False for backward
|
160
|
+
compatibility, but setting to True is recommended for large files.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
A string containing the file content, with line numbers prefixed to each line.
|
164
|
+
For truncated files, includes summary information.
|
165
|
+
"""
|
166
|
+
try:
|
167
|
+
abs_path = os.path.abspath(path)
|
168
|
+
|
169
|
+
# Read the entire file content
|
170
|
+
content = _read_file(abs_path)
|
171
|
+
lines = content.splitlines()
|
172
|
+
total_lines = len(lines)
|
173
|
+
|
174
|
+
# Determine if we should truncate
|
175
|
+
should_truncate = (
|
176
|
+
auto_truncate
|
177
|
+
and start_line is None
|
178
|
+
and end_line is None
|
179
|
+
and total_lines > _MAX_LINES_BEFORE_TRUNCATION
|
180
|
+
)
|
181
|
+
|
182
|
+
# Adjust line indices (convert from 1-based to 0-based)
|
183
|
+
start_idx = (start_line - 1) if start_line is not None else 0
|
184
|
+
end_idx = end_line if end_line is not None else total_lines
|
185
|
+
|
186
|
+
# Validate indices
|
187
|
+
if start_idx < 0:
|
188
|
+
start_idx = 0
|
189
|
+
if end_idx > total_lines:
|
190
|
+
end_idx = total_lines
|
191
|
+
|
192
|
+
if should_truncate:
|
193
|
+
# Find method definitions and their line ranges
|
194
|
+
method_info = _find_method_definitions(lines)
|
195
|
+
|
196
|
+
# Create a truncated view with method definitions
|
197
|
+
result_lines = []
|
198
|
+
|
199
|
+
# Add file info header
|
200
|
+
result_lines.append(f"File: {path} (truncated, {total_lines} lines total)")
|
201
|
+
result_lines.append("")
|
202
|
+
|
203
|
+
# Add beginning of file (first 100 lines)
|
204
|
+
first_chunk = min(100, total_lines // 3)
|
205
|
+
for i in range(first_chunk):
|
206
|
+
result_lines.append(f"{i+1} | {lines[i]}")
|
207
|
+
|
208
|
+
result_lines.append("...")
|
209
|
+
omitted_msg = (
|
210
|
+
f"[{first_chunk+1} - {total_lines-100}] Lines omitted for brevity"
|
211
|
+
)
|
212
|
+
result_lines.append(omitted_msg)
|
213
|
+
result_lines.append("...")
|
214
|
+
|
215
|
+
# Add end of file (last 100 lines)
|
216
|
+
for i in range(max(first_chunk, total_lines - 100), total_lines):
|
217
|
+
result_lines.append(f"{i+1} | {lines[i]}")
|
218
|
+
|
219
|
+
# Add method definitions summary
|
220
|
+
if method_info:
|
221
|
+
result_lines.append("")
|
222
|
+
result_lines.append("Method definitions found:")
|
223
|
+
for method in method_info:
|
224
|
+
method_line = (
|
225
|
+
f"- {method['name']} "
|
226
|
+
f"(lines {method['start_line']}-{method['end_line']})"
|
227
|
+
)
|
228
|
+
result_lines.append(method_line)
|
229
|
+
|
230
|
+
return "\n".join(result_lines)
|
231
|
+
else:
|
232
|
+
# Return the requested range with line numbers
|
233
|
+
result_lines = []
|
234
|
+
for i in range(start_idx, end_idx):
|
235
|
+
result_lines.append(f"{i+1} | {lines[i]}")
|
236
|
+
|
237
|
+
return "\n".join(result_lines)
|
238
|
+
|
239
|
+
except Exception as e:
|
240
|
+
return f"Error reading file {path}: {str(e)}"
|
241
|
+
|
242
|
+
|
243
|
+
def _find_method_definitions(lines: List[str]) -> List[Dict[str, Union[str, int]]]:
|
244
|
+
"""
|
245
|
+
Find method definitions in the given lines of code.
|
246
|
+
|
247
|
+
Args:
|
248
|
+
lines: List of code lines to analyze
|
249
|
+
|
250
|
+
Returns:
|
251
|
+
List of dictionaries containing method name, start line, and end line
|
252
|
+
"""
|
253
|
+
method_info = []
|
254
|
+
|
255
|
+
# Simple regex patterns for common method/function definitions
|
256
|
+
patterns = [
|
257
|
+
# Python
|
258
|
+
r"^\s*def\s+([a-zA-Z0-9_]+)\s*\(",
|
259
|
+
# JavaScript/TypeScript
|
260
|
+
r"^\s*(function\s+([a-zA-Z0-9_]+)|([a-zA-Z0-9_]+)\s*=\s*function|"
|
261
|
+
r"\s*([a-zA-Z0-9_]+)\s*\([^)]*\)\s*{)",
|
262
|
+
# Java/C#/C++
|
263
|
+
r"^\s*(?:public|private|protected|static|final|abstract|synchronized)?"
|
264
|
+
r"\s+(?:[a-zA-Z0-9_<>[\]]+\s+)+([a-zA-Z0-9_]+)\s*\(",
|
265
|
+
]
|
266
|
+
|
267
|
+
current_method = None
|
268
|
+
|
269
|
+
for i, line in enumerate(lines):
|
270
|
+
# Check if this line starts a method definition
|
271
|
+
for pattern in patterns:
|
272
|
+
match = re.search(pattern, line)
|
273
|
+
if match:
|
274
|
+
# If we were tracking a method, close it
|
275
|
+
if current_method:
|
276
|
+
current_method["end_line"] = i
|
277
|
+
method_info.append(current_method)
|
278
|
+
|
279
|
+
# Start tracking a new method
|
280
|
+
method_name = next(
|
281
|
+
group for group in match.groups() if group is not None
|
282
|
+
)
|
283
|
+
current_method = {
|
284
|
+
"name": method_name,
|
285
|
+
"start_line": i + 1, # 1-based line numbering
|
286
|
+
"end_line": None,
|
287
|
+
}
|
288
|
+
break
|
289
|
+
|
290
|
+
# Check for method end (simplistic approach)
|
291
|
+
if current_method and line.strip() == "}":
|
292
|
+
current_method["end_line"] = i + 1
|
293
|
+
method_info.append(current_method)
|
294
|
+
current_method = None
|
295
|
+
|
296
|
+
# Close any open method at the end of the file
|
297
|
+
if current_method:
|
298
|
+
current_method["end_line"] = len(lines)
|
299
|
+
method_info.append(current_method)
|
300
|
+
|
301
|
+
return method_info
|
302
|
+
|
303
|
+
|
304
|
+
def write_to_file(path: str, content: str) -> bool:
|
305
|
+
"""
|
306
|
+
Write content to a file at the specified path.
|
307
|
+
|
308
|
+
Args:
|
309
|
+
path: The path of the file to write to (relative to the current working directory)
|
310
|
+
content: The content to write to the file
|
311
|
+
|
312
|
+
Returns:
|
313
|
+
True if successful, False otherwise
|
314
|
+
"""
|
315
|
+
try:
|
316
|
+
# Ensure directory exists
|
317
|
+
directory = os.path.dirname(os.path.abspath(path))
|
318
|
+
if directory and not os.path.exists(directory):
|
319
|
+
os.makedirs(directory, exist_ok=True)
|
320
|
+
|
321
|
+
# Write the content
|
322
|
+
_write_file(os.path.abspath(path), content)
|
323
|
+
return True
|
324
|
+
except Exception as e:
|
325
|
+
print(f"Error writing to file {path}: {str(e)}")
|
326
|
+
return False
|
327
|
+
|
328
|
+
|
329
|
+
def search_files(
|
330
|
+
path: str, regex: str, file_pattern: Optional[str] = None, context_lines: int = 2
|
331
|
+
) -> str:
|
332
|
+
"""
|
333
|
+
Search for a regex pattern across files in a specified directory.
|
334
|
+
|
335
|
+
Args:
|
336
|
+
path: The path of the directory to search in
|
337
|
+
(relative to the current working directory)
|
338
|
+
regex: The regular expression pattern to search for
|
339
|
+
file_pattern: Optional glob pattern to filter files.
|
340
|
+
Default is None, which includes all files. Only specify this if you need to
|
341
|
+
filter to specific file types (but in most cases, leaving as None is better).
|
342
|
+
context_lines: Number of context lines to show before and after each match.
|
343
|
+
Default is 2, which provides good context without overwhelming output.
|
344
|
+
|
345
|
+
Returns:
|
346
|
+
A string containing the search results with context
|
347
|
+
"""
|
348
|
+
try:
|
349
|
+
# Compile the regex pattern
|
350
|
+
pattern = re.compile(regex)
|
351
|
+
|
352
|
+
# Get the list of files to search
|
353
|
+
files = list_files(path, recursive=True, file_pattern=file_pattern)
|
354
|
+
|
355
|
+
results = []
|
356
|
+
match_count = 0
|
357
|
+
|
358
|
+
for file_path in files:
|
359
|
+
try:
|
360
|
+
with open(file_path, "r", encoding="utf-8", errors="replace") as f:
|
361
|
+
lines = f.readlines()
|
362
|
+
|
363
|
+
file_matches = []
|
364
|
+
|
365
|
+
for i, line in enumerate(lines):
|
366
|
+
if pattern.search(line):
|
367
|
+
# Determine context range
|
368
|
+
start = max(0, i - context_lines)
|
369
|
+
end = min(len(lines), i + context_lines + 1)
|
370
|
+
|
371
|
+
# Add file header if this is the first match in the file
|
372
|
+
if not file_matches:
|
373
|
+
file_matches.append(
|
374
|
+
f"\n{'-' * 80}\n{file_path}\n{'-' * 80}"
|
375
|
+
)
|
376
|
+
|
377
|
+
# Add separator if this isn't the first match and isn't contiguous
|
378
|
+
# with previous
|
379
|
+
if (
|
380
|
+
file_matches
|
381
|
+
and file_matches[-1] != f"Line {start+1}-{end}:"
|
382
|
+
):
|
383
|
+
file_matches.append(f"\nLine {start+1}-{end}:")
|
384
|
+
|
385
|
+
# Add context lines
|
386
|
+
for j in range(start, end):
|
387
|
+
prefix = ">" if j == i else " "
|
388
|
+
file_matches.append(f"{prefix} {j+1}: {lines[j].rstrip()}")
|
389
|
+
|
390
|
+
match_count += 1
|
391
|
+
|
392
|
+
if file_matches:
|
393
|
+
results.extend(file_matches)
|
394
|
+
|
395
|
+
except Exception as e:
|
396
|
+
results.append(f"Error reading {file_path}: {str(e)}")
|
397
|
+
|
398
|
+
if not results:
|
399
|
+
return f"No matches found for pattern '{regex}' in {path}"
|
400
|
+
|
401
|
+
# Count unique files by counting headers
|
402
|
+
file_count = len([r for r in results if r.startswith("-" * 80)])
|
403
|
+
summary = f"Found {match_count} matches in {file_count} files:\n"
|
404
|
+
return summary + "\n".join(results)
|
405
|
+
|
406
|
+
except Exception as e:
|
407
|
+
return f"Error searching files: {str(e)}"
|
408
|
+
|
409
|
+
|
410
|
+
def apply_diff(path: str, diff: str, start_line: int, end_line: int) -> bool:
|
411
|
+
"""
|
412
|
+
Replace existing code using a search and replace block.
|
413
|
+
|
414
|
+
Args:
|
415
|
+
path: The path of the file to modify (relative to the current working directory)
|
416
|
+
diff: The search/replace block defining the changes
|
417
|
+
start_line: The line number where the search block starts (1-based)
|
418
|
+
end_line: The line number where the search block ends (1-based)
|
419
|
+
|
420
|
+
Returns:
|
421
|
+
True if successful, False otherwise
|
422
|
+
|
423
|
+
The diff format should be:
|
424
|
+
```
|
425
|
+
<<<<<<< SEARCH
|
426
|
+
[exact content to find including whitespace]
|
427
|
+
=======
|
428
|
+
[new content to replace with]
|
429
|
+
>>>>>>> REPLACE
|
430
|
+
```
|
431
|
+
"""
|
432
|
+
try:
|
433
|
+
# Read the file
|
434
|
+
abs_path = os.path.abspath(path)
|
435
|
+
content = _read_file(abs_path)
|
436
|
+
lines = content.splitlines()
|
437
|
+
|
438
|
+
# Validate line numbers
|
439
|
+
if start_line < 1 or end_line > len(lines) or start_line > end_line:
|
440
|
+
print(
|
441
|
+
f"Invalid line range: {start_line}-{end_line} (file has {len(lines)} lines)"
|
442
|
+
)
|
443
|
+
return False
|
444
|
+
|
445
|
+
# Parse the diff
|
446
|
+
search_content, replace_content = _parse_diff(diff)
|
447
|
+
if search_content is None or replace_content is None:
|
448
|
+
print("Invalid diff format")
|
449
|
+
return False
|
450
|
+
|
451
|
+
# Extract the content to be replaced
|
452
|
+
original_content = "\n".join(lines[start_line - 1 : end_line])
|
453
|
+
|
454
|
+
# Verify the search content matches
|
455
|
+
if original_content != search_content:
|
456
|
+
print("Search content does not match the specified lines in the file")
|
457
|
+
return False
|
458
|
+
|
459
|
+
# Replace the content
|
460
|
+
new_lines = (
|
461
|
+
lines[: start_line - 1] + replace_content.splitlines() + lines[end_line:]
|
462
|
+
)
|
463
|
+
new_content = "\n".join(new_lines)
|
464
|
+
|
465
|
+
# Write the modified content back to the file
|
466
|
+
_write_file(abs_path, new_content)
|
467
|
+
return True
|
468
|
+
|
469
|
+
except Exception as e:
|
470
|
+
print(f"Error applying diff to {path}: {str(e)}")
|
471
|
+
return False
|
472
|
+
|
473
|
+
|
474
|
+
def _parse_diff(diff: str) -> Tuple[Optional[str], Optional[str]]:
|
475
|
+
"""
|
476
|
+
Parse a diff string to extract search and replace content.
|
477
|
+
|
478
|
+
Args:
|
479
|
+
diff: The diff string to parse
|
480
|
+
|
481
|
+
Returns:
|
482
|
+
A tuple of (search_content, replace_content), or (None, None) if parsing fails
|
483
|
+
"""
|
484
|
+
try:
|
485
|
+
# Split the diff into sections
|
486
|
+
search_marker = "<<<<<<< SEARCH"
|
487
|
+
separator = "======="
|
488
|
+
replace_marker = ">>>>>>> REPLACE"
|
489
|
+
|
490
|
+
if (
|
491
|
+
search_marker not in diff
|
492
|
+
or separator not in diff
|
493
|
+
or replace_marker not in diff
|
494
|
+
):
|
495
|
+
return None, None
|
496
|
+
|
497
|
+
# Extract search content
|
498
|
+
search_start = diff.index(search_marker) + len(search_marker)
|
499
|
+
search_end = diff.index(separator)
|
500
|
+
search_content = diff[search_start:search_end].strip()
|
501
|
+
|
502
|
+
# Extract replace content
|
503
|
+
replace_start = diff.index(separator) + len(separator)
|
504
|
+
replace_end = diff.index(replace_marker)
|
505
|
+
replace_content = diff[replace_start:replace_end].strip()
|
506
|
+
|
507
|
+
return search_content, replace_content
|
508
|
+
|
509
|
+
except Exception:
|
510
|
+
return None, None
|
@@ -7,16 +7,13 @@ async def open_web_page(url: str) -> str:
|
|
7
7
|
"""Get content from a web page using a headless browser."""
|
8
8
|
|
9
9
|
async def get_page_content(page_url: str):
|
10
|
+
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" # noqa
|
10
11
|
try:
|
11
12
|
from playwright.async_api import async_playwright
|
12
13
|
|
13
14
|
async with async_playwright() as p:
|
14
15
|
browser = await p.chromium.launch(headless=True)
|
15
16
|
page = await browser.new_page()
|
16
|
-
# Set user agent to mimic a regular browser
|
17
|
-
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
18
|
-
user_agent += "AppleWebKit/537.36 (KHTML, like Gecko) "
|
19
|
-
user_agent += "Chrome/91.0.4472.124 Safari/537.36"
|
20
17
|
await page.set_extra_http_headers({"User-Agent": user_agent})
|
21
18
|
try:
|
22
19
|
# Navigate to the URL with a timeout of 30 seconds
|
@@ -44,12 +41,7 @@ async def open_web_page(url: str) -> str:
|
|
44
41
|
except ImportError:
|
45
42
|
import requests
|
46
43
|
|
47
|
-
response = requests.get(
|
48
|
-
url,
|
49
|
-
headers={
|
50
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" # noqa
|
51
|
-
},
|
52
|
-
)
|
44
|
+
response = requests.get(url, headers={"User-Agent": user_agent})
|
53
45
|
if response.status_code != 200:
|
54
46
|
msg = f"Unable to retrieve search results. Status code: {response.status_code}"
|
55
47
|
raise Exception(msg)
|