zrb 1.4.3__tar.gz → 1.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. {zrb-1.4.3 → zrb-1.5.1}/PKG-INFO +4 -6
  2. {zrb-1.4.3 → zrb-1.5.1}/README.md +3 -4
  3. {zrb-1.4.3 → zrb-1.5.1}/pyproject.toml +1 -2
  4. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/llm_chat.py +8 -6
  5. zrb-1.5.1/src/zrb/builtin/llm/tool/file.py +510 -0
  6. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/tool/web.py +2 -10
  7. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/todo.py +37 -12
  8. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/llm_config.py +31 -11
  9. zrb-1.4.3/src/zrb/builtin/llm/tool/file.py +0 -154
  10. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/__init__.py +0 -0
  11. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/__main__.py +0 -0
  12. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/attr/__init__.py +0 -0
  13. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/attr/type.py +0 -0
  14. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/__init__.py +0 -0
  15. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/base64.py +0 -0
  16. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/git.py +0 -0
  17. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/git_subtree.py +0 -0
  18. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/group.py +0 -0
  19. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/previous-session.js +0 -0
  20. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/tool/api.py +0 -0
  21. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/tool/cli.py +0 -0
  22. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/llm/tool/rag.py +0 -0
  23. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/md5.py +0 -0
  24. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/__init__.py +0 -0
  25. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  26. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  27. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  28. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  29. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  30. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
  31. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  32. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  33. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  34. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  35. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  36. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  37. {zrb-1.4.3 → zrb-1.5.1}/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
  38. {zrb-1.4.3 → zrb-1.5.1}/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
  39. {zrb-1.4.3 → zrb-1.5.1}/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
  40. {zrb-1.4.3 → zrb-1.5.1}/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
  41. {zrb-1.4.3 → zrb-1.5.1}/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
  42. {zrb-1.4.3 → zrb-1.5.1}/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
  43. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
  44. {zrb-1.4.3 → zrb-1.5.1}/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
  45. {zrb-1.4.3 → zrb-1.5.1}/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
  46. {zrb-1.4.3 → zrb-1.5.1}/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
  47. {zrb-1.4.3 → zrb-1.5.1}/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
  48. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  49. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  50. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  51. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  52. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  53. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  54. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  55. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  56. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
  57. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
  58. {zrb-1.4.3 → zrb-1.5.1}/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
  59. {zrb-1.4.3 → zrb-1.5.1}/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
  60. {zrb-1.4.3 → zrb-1.5.1}/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
  61. {zrb-1.4.3 → zrb-1.5.1}/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
  62. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
  63. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
  64. {zrb-1.4.3 → zrb-1.5.1}/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
  65. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
  66. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
  67. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
  68. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
  69. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  70. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  71. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  72. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  73. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  74. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  75. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  76. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  77. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  78. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  79. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  80. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  81. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  82. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  83. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  84. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  85. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  86. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  87. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  88. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  89. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  90. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  91. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  92. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  93. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  94. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  95. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  96. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  97. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  98. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  99. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
  100. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  101. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  102. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  103. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  104. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  105. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  106. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  107. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
  108. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  109. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
  110. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  111. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
  112. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  113. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
  114. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  115. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  116. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  117. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
  118. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  119. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
  120. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  121. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  122. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  123. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  124. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  125. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  126. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  127. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  128. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  129. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  130. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  131. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  132. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  133. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  134. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  135. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  136. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  137. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  138. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  139. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  140. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  141. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  142. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  143. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  144. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  145. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  146. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  147. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  148. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  149. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  150. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
  151. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
  152. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
  153. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
  154. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
  155. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
  156. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
  157. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
  158. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
  159. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
  160. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
  161. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
  162. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
  163. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
  164. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
  165. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
  166. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
  167. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
  168. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
  169. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
  170. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  171. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
  172. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  173. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  174. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  175. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  176. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  177. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  178. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  179. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  180. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  181. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  182. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  183. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  184. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
  185. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  186. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  187. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  188. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/create/__init__.py +0 -0
  189. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  190. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  191. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/project/create/project_task.py +0 -0
  192. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/python.py +0 -0
  193. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/random.py +0 -0
  194. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
  195. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  196. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/common_input.py +0 -0
  197. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  198. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
  199. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  200. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  201. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/ubuntu.py +0 -0
  202. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
  203. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  204. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  205. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/shell/__init__.py +0 -0
  206. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  207. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  208. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  209. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  210. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/callback/__init__.py +0 -0
  211. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/callback/any_callback.py +0 -0
  212. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/callback/callback.py +0 -0
  213. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/cmd/__init__.py +0 -0
  214. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/cmd/cmd_result.py +0 -0
  215. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/cmd/cmd_val.py +0 -0
  216. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/config.py +0 -0
  217. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/content_transformer/__init__.py +0 -0
  218. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  219. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/content_transformer/content_transformer.py +0 -0
  220. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/context/__init__.py +0 -0
  221. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/context/any_context.py +0 -0
  222. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/context/any_shared_context.py +0 -0
  223. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/context/context.py +0 -0
  224. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/context/shared_context.py +0 -0
  225. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/dot_dict/__init__.py +0 -0
  226. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/dot_dict/dot_dict.py +0 -0
  227. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/env/__init__.py +0 -0
  228. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/env/any_env.py +0 -0
  229. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/env/env.py +0 -0
  230. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/env/env_file.py +0 -0
  231. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/env/env_map.py +0 -0
  232. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/group/__init__.py +0 -0
  233. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/group/any_group.py +0 -0
  234. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/group/group.py +0 -0
  235. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/__init__.py +0 -0
  236. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/any_input.py +0 -0
  237. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/base_input.py +0 -0
  238. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/bool_input.py +0 -0
  239. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/float_input.py +0 -0
  240. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/int_input.py +0 -0
  241. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/option_input.py +0 -0
  242. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/password_input.py +0 -0
  243. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/str_input.py +0 -0
  244. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/input/text_input.py +0 -0
  245. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/__init__.py +0 -0
  246. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/cli.py +0 -0
  247. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/common_util.py +0 -0
  248. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_app.py +0 -0
  249. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_config/config.py +0 -0
  250. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_config/config_factory.py +0 -0
  251. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/__init__.py +0 -0
  252. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/docs_route.py +0 -0
  253. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  254. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  255. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/error_page/view.html +0 -0
  256. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  257. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  258. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/home_page/view.html +0 -0
  259. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/login_api_route.py +0 -0
  260. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  261. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/login_page/view.html +0 -0
  262. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  263. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  264. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  265. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  266. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  267. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  268. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  269. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  270. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  271. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  272. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  273. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  274. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  275. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  276. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  277. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
  278. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  279. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  280. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  281. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  282. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/static/static_route.py +0 -0
  283. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  284. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  285. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_schema/session.py +0 -0
  286. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_schema/token.py +0 -0
  287. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_schema/user.py +0 -0
  288. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_util/cookie.py +0 -0
  289. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_util/html.py +0 -0
  290. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_util/token.py +0 -0
  291. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/runner/web_util/user.py +0 -0
  292. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session/__init__.py +0 -0
  293. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session/any_session.py +0 -0
  294. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session/session.py +0 -0
  295. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_log/__init__.py +0 -0
  296. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_log/session_state_log.py +0 -0
  297. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_logger/__init__.py +0 -0
  298. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  299. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  300. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  301. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/__init__.py +0 -0
  302. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/any_task.py +0 -0
  303. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/base_task.py +0 -0
  304. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/base_trigger.py +0 -0
  305. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/cmd_task.py +0 -0
  306. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/http_check.py +0 -0
  307. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/llm_task.py +0 -0
  308. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/make_task.py +0 -0
  309. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/rsync_task.py +0 -0
  310. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/scaffolder.py +0 -0
  311. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/scheduler.py +0 -0
  312. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/task.py +0 -0
  313. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task/tcp_check.py +0 -0
  314. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task_status/__init__.py +0 -0
  315. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/task_status/task_status.py +0 -0
  316. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/__init__.py +0 -0
  317. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/attr.py +0 -0
  318. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cli/__init__.py +0 -0
  319. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cli/style.py +0 -0
  320. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cli/subcommand.py +0 -0
  321. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cmd/__init__.py +0 -0
  322. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cmd/command.py +0 -0
  323. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cmd/remote.py +0 -0
  324. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/__init__.py +0 -0
  325. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modification_mode.py +0 -0
  326. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_class.py +0 -0
  327. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  328. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_class_property.py +0 -0
  329. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_dict.py +0 -0
  330. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_function.py +0 -0
  331. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_function_call.py +0 -0
  332. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_method.py +0 -0
  333. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/codemod/modify_module.py +0 -0
  334. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/cron.py +0 -0
  335. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/file.py +0 -0
  336. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/git.py +0 -0
  337. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/git_subtree.py +0 -0
  338. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/group.py +0 -0
  339. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/load.py +0 -0
  340. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/run.py +0 -0
  341. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/string/__init__.py +0 -0
  342. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/string/conversion.py +0 -0
  343. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/string/format.py +0 -0
  344. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/string/name.py +0 -0
  345. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/util/todo.py +0 -0
  346. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/xcom/__init__.py +0 -0
  347. {zrb-1.4.3 → zrb-1.5.1}/src/zrb/xcom/xcom.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.4.3
3
+ Version: 1.5.1
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -21,7 +21,6 @@ Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
21
21
  Requires-Dist: black (>=24.10.0,<24.11.0)
22
22
  Requires-Dist: chromadb (>=0.5.20,<0.6.0) ; extra == "rag" or extra == "all"
23
23
  Requires-Dist: fastapi[standard] (>=0.115.6,<0.116.0)
24
- Requires-Dist: fastembed (>=0.5.1,<0.6.0)
25
24
  Requires-Dist: isort (>=5.13.2,<5.14.0)
26
25
  Requires-Dist: libcst (>=1.5.0,<2.0.0)
27
26
  Requires-Dist: openai (>=1.10.0,<2.0.0) ; extra == "rag" or extra == "all"
@@ -97,9 +96,10 @@ Add the following content to your zrb_init.py:
97
96
  import os
98
97
  from zrb import cli, LLMTask, CmdTask, StrInput, Group
99
98
  from zrb.builtin.llm.tool.file import (
100
- read_text_file, list_files, write_text_file
99
+ list_files, read_from_file, search_files, write_to_file
101
100
  )
102
101
 
102
+
103
103
  CURRENT_DIR = os.getcwd()
104
104
 
105
105
  # Create a group for UML-related tasks
@@ -117,9 +117,7 @@ make_uml_script = uml_group.add_task(
117
117
  f"Write the script into {CURRENT_DIR}/{{ctx.input.diagram}}.uml"
118
118
  ),
119
119
  tools=[
120
- list_files,
121
- read_text_file,
122
- write_text_file,
120
+ list_files, read_from_file, search_files, write_to_file
123
121
  ],
124
122
  )
125
123
  )
@@ -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
- read_text_file, list_files, write_text_file
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
  )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.4.3"
3
+ version = "1.5.1"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -51,7 +51,6 @@ fastapi = {extras = ["standard"], version = "^0.115.6"}
51
51
  python-jose = {extras = ["cryptography"], version = "^3.4.0"}
52
52
  ulid-py = "^1.1.0"
53
53
  pydantic-ai = "^0.0.42"
54
- fastembed = "^0.5.1"
55
54
  openai = {version = "^1.10.0", optional = true}
56
55
  playwright = {version = "^1.43.0", optional = true}
57
56
  psutil = "^6.1.1"
@@ -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
- read_all_files,
11
- read_text_file,
12
- write_text_file,
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(read_text_file)
167
- llm_chat.add_tool(write_text_file)
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)