zrb 1.5.1__tar.gz → 1.5.3__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 (349) hide show
  1. {zrb-1.5.1 → zrb-1.5.3}/PKG-INFO +13 -14
  2. {zrb-1.5.1 → zrb-1.5.3}/pyproject.toml +20 -20
  3. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/__main__.py +1 -1
  4. zrb-1.5.3/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +129 -0
  5. zrb-1.5.3/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +12 -0
  6. zrb-1.5.3/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +16 -0
  7. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/llm_config.py +22 -15
  8. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/llm_task.py +136 -20
  9. zrb-1.5.1/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -7
  10. zrb-1.5.1/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -12
  11. zrb-1.5.1/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -15
  12. {zrb-1.5.1 → zrb-1.5.3}/README.md +0 -0
  13. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/__init__.py +0 -0
  14. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/attr/__init__.py +0 -0
  15. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/attr/type.py +0 -0
  16. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/__init__.py +0 -0
  17. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/base64.py +0 -0
  18. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/git.py +0 -0
  19. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/git_subtree.py +0 -0
  20. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/group.py +0 -0
  21. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/llm_chat.py +0 -0
  22. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/previous-session.js +0 -0
  23. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/tool/api.py +0 -0
  24. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/tool/cli.py +0 -0
  25. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/tool/file.py +0 -0
  26. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/tool/rag.py +0 -0
  27. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/llm/tool/web.py +0 -0
  28. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/md5.py +0 -0
  29. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/__init__.py +0 -0
  30. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  31. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  32. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  33. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  34. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  35. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  36. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  37. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  38. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  39. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  40. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  41. {zrb-1.5.1 → zrb-1.5.3}/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
  42. {zrb-1.5.1 → zrb-1.5.3}/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
  43. {zrb-1.5.1 → zrb-1.5.3}/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
  44. {zrb-1.5.1 → zrb-1.5.3}/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
  45. {zrb-1.5.1 → zrb-1.5.3}/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
  46. {zrb-1.5.1 → zrb-1.5.3}/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
  47. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
  48. {zrb-1.5.1 → zrb-1.5.3}/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
  49. {zrb-1.5.1 → zrb-1.5.3}/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
  50. {zrb-1.5.1 → zrb-1.5.3}/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
  51. {zrb-1.5.1 → zrb-1.5.3}/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
  52. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  53. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  54. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  55. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  56. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  57. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  58. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  59. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  60. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
  61. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
  62. {zrb-1.5.1 → zrb-1.5.3}/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
  63. {zrb-1.5.1 → zrb-1.5.3}/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
  64. {zrb-1.5.1 → zrb-1.5.3}/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
  65. {zrb-1.5.1 → zrb-1.5.3}/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
  66. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
  67. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
  68. {zrb-1.5.1 → zrb-1.5.3}/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
  69. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
  70. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
  71. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
  72. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
  73. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  74. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  75. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  76. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  77. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  78. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  79. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  80. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  81. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  82. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  83. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  84. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  85. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  86. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  87. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  88. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  89. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  90. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  91. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  92. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  93. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  94. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  95. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  96. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  97. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  98. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  99. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  100. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  101. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  102. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  103. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
  104. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  105. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  106. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  107. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  108. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  109. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  110. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  111. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
  112. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  113. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
  114. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  115. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
  116. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  117. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
  118. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  119. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  120. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  121. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
  122. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  123. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
  124. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  125. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  126. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  127. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  128. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  129. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  130. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  131. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  132. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  133. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  134. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  135. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  136. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  137. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  138. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  139. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  140. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  141. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  142. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  143. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  144. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  145. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  146. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  147. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  148. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  149. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  150. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  151. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  152. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  153. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  154. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
  155. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
  156. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
  157. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
  158. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
  159. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
  160. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
  161. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
  162. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
  163. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
  164. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
  165. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
  166. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
  167. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
  168. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
  169. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
  170. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
  171. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
  172. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
  173. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
  174. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  175. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  176. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  177. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  178. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  179. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  180. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  181. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  182. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  183. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  184. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  185. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  186. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  187. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  188. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  189. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  190. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/create/__init__.py +0 -0
  191. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  192. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  193. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/project/create/project_task.py +0 -0
  194. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/python.py +0 -0
  195. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/random.py +0 -0
  196. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
  197. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  198. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/common_input.py +0 -0
  199. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  200. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
  201. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  202. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  203. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/ubuntu.py +0 -0
  204. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
  205. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  206. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  207. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/shell/__init__.py +0 -0
  208. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  209. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  210. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  211. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  212. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/builtin/todo.py +0 -0
  213. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/callback/__init__.py +0 -0
  214. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/callback/any_callback.py +0 -0
  215. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/callback/callback.py +0 -0
  216. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/cmd/__init__.py +0 -0
  217. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/cmd/cmd_result.py +0 -0
  218. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/cmd/cmd_val.py +0 -0
  219. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/config.py +0 -0
  220. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/content_transformer/__init__.py +0 -0
  221. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  222. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/content_transformer/content_transformer.py +0 -0
  223. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/context/__init__.py +0 -0
  224. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/context/any_context.py +0 -0
  225. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/context/any_shared_context.py +0 -0
  226. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/context/context.py +0 -0
  227. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/context/shared_context.py +0 -0
  228. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/dot_dict/__init__.py +0 -0
  229. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/dot_dict/dot_dict.py +0 -0
  230. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/env/__init__.py +0 -0
  231. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/env/any_env.py +0 -0
  232. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/env/env.py +0 -0
  233. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/env/env_file.py +0 -0
  234. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/env/env_map.py +0 -0
  235. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/group/__init__.py +0 -0
  236. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/group/any_group.py +0 -0
  237. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/group/group.py +0 -0
  238. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/__init__.py +0 -0
  239. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/any_input.py +0 -0
  240. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/base_input.py +0 -0
  241. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/bool_input.py +0 -0
  242. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/float_input.py +0 -0
  243. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/int_input.py +0 -0
  244. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/option_input.py +0 -0
  245. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/password_input.py +0 -0
  246. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/str_input.py +0 -0
  247. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/input/text_input.py +0 -0
  248. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/__init__.py +0 -0
  249. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/cli.py +0 -0
  250. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/common_util.py +0 -0
  251. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_app.py +0 -0
  252. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_config/config.py +0 -0
  253. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_config/config_factory.py +0 -0
  254. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/__init__.py +0 -0
  255. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/docs_route.py +0 -0
  256. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  257. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  258. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/error_page/view.html +0 -0
  259. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  260. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  261. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/home_page/view.html +0 -0
  262. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/login_api_route.py +0 -0
  263. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  264. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/login_page/view.html +0 -0
  265. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  266. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  267. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  268. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  269. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  270. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  271. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  272. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  273. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  274. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  275. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  276. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  277. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  278. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  279. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  280. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
  281. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  282. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  283. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  284. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  285. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/static/static_route.py +0 -0
  286. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  287. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  288. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_schema/session.py +0 -0
  289. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_schema/token.py +0 -0
  290. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_schema/user.py +0 -0
  291. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_util/cookie.py +0 -0
  292. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_util/html.py +0 -0
  293. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_util/token.py +0 -0
  294. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/runner/web_util/user.py +0 -0
  295. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session/__init__.py +0 -0
  296. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session/any_session.py +0 -0
  297. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session/session.py +0 -0
  298. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_log/__init__.py +0 -0
  299. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_log/session_state_log.py +0 -0
  300. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_logger/__init__.py +0 -0
  301. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  302. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  303. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  304. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/__init__.py +0 -0
  305. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/any_task.py +0 -0
  306. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/base_task.py +0 -0
  307. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/base_trigger.py +0 -0
  308. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/cmd_task.py +0 -0
  309. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/http_check.py +0 -0
  310. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/make_task.py +0 -0
  311. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/rsync_task.py +0 -0
  312. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/scaffolder.py +0 -0
  313. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/scheduler.py +0 -0
  314. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/task.py +0 -0
  315. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task/tcp_check.py +0 -0
  316. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task_status/__init__.py +0 -0
  317. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/task_status/task_status.py +0 -0
  318. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/__init__.py +0 -0
  319. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/attr.py +0 -0
  320. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cli/__init__.py +0 -0
  321. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cli/style.py +0 -0
  322. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cli/subcommand.py +0 -0
  323. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cmd/__init__.py +0 -0
  324. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cmd/command.py +0 -0
  325. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cmd/remote.py +0 -0
  326. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/__init__.py +0 -0
  327. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modification_mode.py +0 -0
  328. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_class.py +0 -0
  329. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  330. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_class_property.py +0 -0
  331. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_dict.py +0 -0
  332. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_function.py +0 -0
  333. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_function_call.py +0 -0
  334. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_method.py +0 -0
  335. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/codemod/modify_module.py +0 -0
  336. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/cron.py +0 -0
  337. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/file.py +0 -0
  338. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/git.py +0 -0
  339. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/git_subtree.py +0 -0
  340. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/group.py +0 -0
  341. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/load.py +0 -0
  342. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/run.py +0 -0
  343. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/string/__init__.py +0 -0
  344. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/string/conversion.py +0 -0
  345. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/string/format.py +0 -0
  346. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/string/name.py +0 -0
  347. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/util/todo.py +0 -0
  348. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/xcom/__init__.py +0 -0
  349. {zrb-1.5.1 → zrb-1.5.3}/src/zrb/xcom/xcom.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.5.1
3
+ Version: 1.5.3
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -16,19 +16,18 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Provides-Extra: all
17
17
  Provides-Extra: playwright
18
18
  Provides-Extra: rag
19
- Requires-Dist: autopep8 (>=2.0.4,<3.0.0)
20
- Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
21
- Requires-Dist: black (>=24.10.0,<24.11.0)
22
- Requires-Dist: chromadb (>=0.5.20,<0.6.0) ; extra == "rag" or extra == "all"
23
- Requires-Dist: fastapi[standard] (>=0.115.6,<0.116.0)
24
- Requires-Dist: isort (>=5.13.2,<5.14.0)
25
- Requires-Dist: libcst (>=1.5.0,<2.0.0)
26
- Requires-Dist: openai (>=1.10.0,<2.0.0) ; extra == "rag" or extra == "all"
27
- Requires-Dist: pdfplumber (>=0.11.4,<0.12.0) ; extra == "rag" or extra == "all"
28
- Requires-Dist: playwright (>=1.43.0,<2.0.0) ; extra == "playwright" or extra == "all"
29
- Requires-Dist: psutil (>=6.1.1,<7.0.0)
30
- Requires-Dist: pydantic-ai (>=0.0.42,<0.0.43)
31
- Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
19
+ Requires-Dist: beautifulsoup4 (>=4.13.3,<5.0.0)
20
+ Requires-Dist: black (>=25.1.0,<25.2.0)
21
+ Requires-Dist: chromadb (>=0.6.3,<0.7.0) ; extra == "rag" or extra == "all"
22
+ Requires-Dist: fastapi[standard] (>=0.115.12,<0.116.0)
23
+ Requires-Dist: isort (>=6.0.1,<6.1.0)
24
+ Requires-Dist: libcst (>=1.7.0,<2.0.0)
25
+ Requires-Dist: openai (>=1.70.0,<2.0.0) ; extra == "rag" or extra == "all"
26
+ Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
27
+ Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
28
+ Requires-Dist: psutil (>=7.0.0,<8.0.0)
29
+ Requires-Dist: pydantic-ai (>=0.0.49,<0.0.50)
30
+ Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
32
31
  Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
33
32
  Requires-Dist: requests (>=2.32.3,<3.0.0)
34
33
  Requires-Dist: ulid-py (>=1.1.0,<2.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.5.1"
3
+ version = "1.5.3"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -38,22 +38,21 @@ exclude = [
38
38
 
39
39
  [tool.poetry.dependencies]
40
40
  python = ">=3.10.0,<4.0.0"
41
- python-dotenv = "^1.0.1"
42
- autopep8 = "^2.0.4"
43
- black = "~24.10.0"
44
- isort = "~5.13.2"
41
+ python-dotenv = "^1.1.0"
42
+ black = "~25.1.0"
43
+ isort = "~6.0.1"
45
44
  requests = "^2.32.3"
46
- libcst = "^1.5.0"
47
- chromadb = {version = "^0.5.20", optional = true}
48
- pdfplumber = {version = "^0.11.4", optional = true}
49
- beautifulsoup4 = "^4.12.3"
50
- fastapi = {extras = ["standard"], version = "^0.115.6"}
45
+ libcst = "^1.7.0"
46
+ chromadb = {version = "^0.6.3", optional = true}
47
+ pdfplumber = {version = "^0.11.6", optional = true}
48
+ beautifulsoup4 = "^4.13.3"
49
+ fastapi = {extras = ["standard"], version = "^0.115.12"}
51
50
  python-jose = {extras = ["cryptography"], version = "^3.4.0"}
52
51
  ulid-py = "^1.1.0"
53
- pydantic-ai = "^0.0.42"
54
- openai = {version = "^1.10.0", optional = true}
55
- playwright = {version = "^1.43.0", optional = true}
56
- psutil = "^6.1.1"
52
+ pydantic-ai = "^0.0.49"
53
+ openai = {version = "^1.70.0", optional = true}
54
+ playwright = {version = "^1.51.0", optional = true}
55
+ psutil = "^7.0.0"
57
56
 
58
57
  [tool.poetry.extras]
59
58
  # poetry install -E rag
@@ -62,12 +61,13 @@ playwright = ["playwright"]
62
61
  all = ["chromadb", "pdfplumber", "openai", "playwright"]
63
62
 
64
63
  [tool.poetry.group.dev.dependencies]
65
- alembic = "^1.14.0" # FastApp dependencies
66
- flake8 = "~7.1.1"
67
- pytest = "~8.3.3"
68
- pytest-cov = "~6.0.0"
69
- pytest-asyncio = "~0.24.0"
70
- sqlmodel = "^0.0.22" # FastApp dependencies
64
+ alembic = "^1.15.2" # FastApp dependencies
65
+ autopep8 = "^2.0.4"
66
+ flake8 = "~7.2.0"
67
+ pytest = "~8.3.5"
68
+ pytest-cov = "~6.1.0"
69
+ pytest-asyncio = "~0.26.0"
70
+ sqlmodel = "^0.0.24" # FastApp dependencies
71
71
  tomlkit = "^0.13.2"
72
72
 
73
73
  [tool.pytest.ini_options]
@@ -16,7 +16,7 @@ def serve_cli():
16
16
  zrb_init_path_list = _get_zrb_init_path_list()
17
17
  # load init scripts
18
18
  for init_script in INIT_SCRIPTS:
19
- abs_init_script = os.path.abspath(init_script)
19
+ abs_init_script = os.path.abspath(os.path.expanduser(init_script))
20
20
  if abs_init_script not in zrb_init_path_list:
21
21
  load_file(abs_init_script, -1)
22
22
  # load zrb init
@@ -0,0 +1,129 @@
1
+ # My App Name
2
+
3
+ Welcome to My App Name! This application is designed to help you start your project with a flexible architecture that can scale as your needs grow. My App Name supports both monolithic and microservices architectures, allowing you to start small and expand without rewriting your codebase.
4
+
5
+ ## Key Features
6
+
7
+ - **Modular-Monolith Architecture**: My App Name is built with a modular-monolith architecture, providing a clean interface for inter-module communication. This allows you to run My App Name as a monolith or as microservices without altering your code.
8
+
9
+ - **Low Coupling, High Cohesion**: The architecture ensures low coupling and high cohesion, making it easy to split your code into microservices when needed.
10
+
11
+ ## How It Works
12
+
13
+ ### Inter-Module Communication
14
+
15
+ Each module in My App Name is independent and communicates with others through a `Client` object. The `Client` is an interface with two implementations: `ApiClient` and `DirectClient`.
16
+
17
+ - **ApiClient**: Used when running My App Name as microservices. It communicates over HTTP using a base URL.
18
+ - **DirectClient**: Used when running My App Name as a monolith. It allows direct method calls between modules.
19
+
20
+ ### Code Examples
21
+
22
+ Here's how you can use the `as_api_client` and `as_direct_client` methods:
23
+
24
+ ```python
25
+ # Using as_api_client
26
+ from my_app_name.config import APP_AUTH_BASE_URL
27
+ from my_app_name.module.auth.service.permission.permission_service_factory import permission_service
28
+
29
+ # Create an API client for the permission service
30
+ permission_api_client = permission_service.as_api_client(base_url=APP_AUTH_BASE_URL)
31
+
32
+ # Using as_direct_client
33
+ from my_app_name.module.auth.service.role.role_service_factory import role_service
34
+
35
+ # Create a direct client for the role service
36
+ role_direct_client = role_service.as_direct_client()
37
+ ```
38
+ ## Application Architecture
39
+
40
+ My App Name follows a modular-monolith architecture. Each module (e.g., Auth, Library) encapsulates a specific business capability. The Gateway module acts as the entry point for user interactions (e.g., web UI).
41
+
42
+ **Communication Modes:**
43
+
44
+ 1. **Monolith (Direct Communication):**
45
+ ```
46
+ +---------+ +---------+
47
+ | Gateway | ----> | Auth | (e.g., for login, permission checks)
48
+ | (UI) | | Service |
49
+ +---------+ +---------+
50
+ | ^
51
+ | | (Library might call Auth for specific checks)
52
+ | |
53
+ v |
54
+ +---------+ -----------+
55
+ | Library |
56
+ | Service |
57
+ +---------+
58
+ (Gateway also calls Library directly)
59
+ (DirectClient calls between services if needed)
60
+ ```
61
+ Modules communicate directly via `DirectClient` implementations. The Gateway calls necessary services, and services can call each other directly if required.
62
+
63
+ 2. **Microservices (API Communication):**
64
+ ```
65
+ +---------+ +---------+
66
+ | Gateway | ----> | Auth | (e.g., via Auth API)
67
+ | (UI) | | Service |
68
+ | | | (API) |
69
+ +---------+ +---------+
70
+ | ^
71
+ | | (Library Service might call Auth API)
72
+ | |
73
+ v |
74
+ +---------+ -----------+
75
+ | Library |
76
+ | Service |
77
+ | (API) |
78
+ +---------+
79
+ (Gateway also calls Library API)
80
+ (ApiClient calls via HTTP between services if needed)
81
+ ```
82
+ Modules communicate via `ApiClient` implementations over HTTP/API calls. The Gateway calls necessary service APIs, and services can call each other's APIs if required.
83
+
84
+ ## Factory Pattern
85
+
86
+ The application utilizes the Factory pattern extensively, particularly for creating client, service, and repository instances. This allows the application to switch between different implementations based on configuration settings.
87
+
88
+ **Example (`my_app_name/module/auth/client/auth_client_factory.py`):**
89
+
90
+ ```python
91
+ from my_app_name.config import APP_COMMUNICATION
92
+ from my_app_name.module.auth.client.auth_api_client import AuthAPIClient
93
+ from my_app_name.module.auth.client.auth_client import AuthClient
94
+ from my_app_name.module.auth.client.auth_direct_client import AuthDirectClient
95
+
96
+ # Selects the client based on the configuration
97
+ if APP_COMMUNICATION == "direct":
98
+ auth_client: AuthClient = AuthDirectClient() # Used in Monolith mode
99
+ elif APP_COMMUNICATION == "api":
100
+ auth_client: AuthClient = AuthAPIClient() # Used in Microservices mode
101
+ ```
102
+
103
+ By changing the `APP_COMMUNICATION` variable in `my_app_name/config.py`, you can switch how modules communicate without changing the core module logic. Similar factories exist for services and repositories (e.g., switching between database and in-memory implementations based on `APP_REPOSITORY_TYPE`).
104
+
105
+ ## Key Folders and Files
106
+
107
+ - `my_app_name/config.py`: Central configuration file (database connections, communication mode, etc.).
108
+ - `my_app_name/main.py`: Main application entry point.
109
+ - `my_app_name/common/`: Shared utilities, base classes (e.g., `app_factory.py`, `base_service.py`).
110
+ - `my_app_name/module/`: Contains the application modules (e.g., `auth`, `library`, `gateway`).
111
+ - `my_app_name/module/<module_name>/`: Each module directory typically contains:
112
+ - `client/`: Client interfaces (`*_client.py`, `*_api_client.py`, `*_direct_client.py`) and factories (`*_client_factory.py`).
113
+ - `service/`: Business logic implementation (`*_service.py`) and factories (`*_service_factory.py`).
114
+ - `repository/`: Data access logic (`*_repository.py`, `*_db_repository.py`) and factories (`*_repository_factory.py`).
115
+ - `route.py`: API or UI routes for the module.
116
+ - `schema/`: Data transfer objects or database models (if applicable).
117
+ - `migration/`: Database migration scripts (if using Alembic).
118
+ - `my_app_name/schema/`: Shared data schemas used across modules.
119
+ - `my_app_name/test/`: Unit and integration tests.
120
+ - `my_app_name/_zrb/`: Tooling scripts (likely for code generation or automation).
121
+
122
+
123
+ ## Principles
124
+
125
+ - Developers should be able to override everything with a reasonable amount of code.
126
+ - Simple tasks should only require a small amount of code.
127
+ - A bit of magic is okay as long as it's transparent and documented.
128
+
129
+ For more details, refer to the client implementations in `module/auth/client/auth_api_client.py` and `module/auth/client/auth_direct_client.py`.
@@ -0,0 +1,12 @@
1
+ fastapi[standard]~=0.115.12
2
+ alembic~=1.15.2
3
+ sqlmodel~=0.0.24
4
+ ulid-py~=1.1.0
5
+ passlib~=1.7.4
6
+ Jinja2~=3.1.6
7
+ python-jose~=3.4.0
8
+ passlib~=1.7.4
9
+
10
+ pytest~=8.3.5
11
+ pytest-asyncio~=0.26.0
12
+ pytest-cov~=6.1.0
@@ -0,0 +1,16 @@
1
+ from fastapi.testclient import TestClient
2
+ from my_app_name.main import app
3
+ from my_app_name.module.auth.service.user.user_service_factory import user_service
4
+ from my_app_name.module.gateway.util.view import render_content
5
+
6
+
7
+ async def test_homepage():
8
+ current_user = await user_service.get_current_user(access_token=None)
9
+ client = TestClient(app, base_url="http://localhost")
10
+ response = client.get("/")
11
+ assert response.status_code == 200
12
+ assert response.text == render_content(
13
+ "homepage.html",
14
+ page_name="gateway.home",
15
+ current_user=current_user,
16
+ ).body.decode("utf-8")
@@ -38,27 +38,27 @@ class LLMConfig:
38
38
  default_persona: str | None = None,
39
39
  default_system_prompt: str | None = None,
40
40
  ):
41
- self._model_name = (
41
+ self._default_model_name = (
42
42
  default_model_name
43
43
  if default_model_name is not None
44
44
  else os.getenv("ZRB_LLM_MODEL", None)
45
45
  )
46
- self._model_base_url = (
46
+ self._default_model_base_url = (
47
47
  default_base_url
48
48
  if default_base_url is not None
49
49
  else os.getenv("ZRB_LLM_BASE_URL", None)
50
50
  )
51
- self._model_api_key = (
51
+ self._default_model_api_key = (
52
52
  default_api_key
53
53
  if default_api_key is not None
54
54
  else os.getenv("ZRB_LLM_API_KEY", None)
55
55
  )
56
- self._system_prompt = (
56
+ self._default_system_prompt = (
57
57
  default_system_prompt
58
58
  if default_system_prompt is not None
59
59
  else os.getenv("ZRB_LLM_SYSTEM_PROMPT", None)
60
60
  )
61
- self._persona = (
61
+ self._default_persona = (
62
62
  default_persona
63
63
  if default_persona is not None
64
64
  else os.getenv("ZRB_LLM_PERSONA", None)
@@ -67,24 +67,28 @@ class LLMConfig:
67
67
  self._default_model = None
68
68
 
69
69
  def _get_model_name(self) -> str | None:
70
- return self._model_name if self._model_name is not None else None
70
+ return (
71
+ self._default_model_name if self._default_model_name is not None else None
72
+ )
71
73
 
72
74
  def get_default_model_provider(self) -> Provider | str:
73
75
  if self._default_provider is not None:
74
76
  return self._default_provider
75
- if self._model_base_url is None and self._model_api_key is None:
77
+ if self._default_model_base_url is None and self._default_model_api_key is None:
76
78
  return "openai"
77
79
  return OpenAIProvider(
78
- base_url=self._model_base_url, api_key=self._model_api_key
80
+ base_url=self._default_model_base_url, api_key=self._default_model_api_key
79
81
  )
80
82
 
81
83
  def get_default_system_prompt(self) -> str:
82
84
  system_prompt = (
83
85
  DEFAULT_SYSTEM_PROMPT
84
- if self._system_prompt is None
85
- else self._system_prompt
86
+ if self._default_system_prompt is None
87
+ else self._default_system_prompt
88
+ )
89
+ persona = (
90
+ DEFAULT_PERSONA if self._default_persona is None else self._default_persona
86
91
  )
87
- persona = DEFAULT_PERSONA if self._persona is None else self._persona
88
92
  if persona is not None:
89
93
  return f"{persona}\n{system_prompt}"
90
94
  return system_prompt
@@ -100,17 +104,20 @@ class LLMConfig:
100
104
  provider=self.get_default_model_provider(),
101
105
  )
102
106
 
107
+ def set_default_persona(self, persona: str):
108
+ self._default_persona = persona
109
+
103
110
  def set_default_system_prompt(self, system_prompt: str):
104
- self._system_prompt = system_prompt
111
+ self._default_system_prompt = system_prompt
105
112
 
106
113
  def set_default_model_name(self, model_name: str):
107
- self._model_name = model_name
114
+ self._default_model_name = model_name
108
115
 
109
116
  def set_default_model_api_key(self, model_api_key: str):
110
- self._model_api_key = model_api_key
117
+ self._default_model_api_key = model_api_key
111
118
 
112
119
  def set_default_model_base_url(self, model_base_url: str):
113
- self._model_base_url = model_base_url
120
+ self._default_model_base_url = model_base_url
114
121
 
115
122
  def set_default_provider(self, provider: Provider | str):
116
123
  self._default_provider = provider
@@ -1,3 +1,4 @@
1
+ import copy
1
2
  import functools
2
3
  import inspect
3
4
  import json
@@ -6,6 +7,7 @@ import traceback
6
7
  from collections.abc import Callable
7
8
  from typing import Any
8
9
 
10
+ from openai import APIError
9
11
  from pydantic_ai import Agent, Tool
10
12
  from pydantic_ai.messages import (
11
13
  FinalResultEvent,
@@ -139,16 +141,31 @@ class LLMTask(BaseTask):
139
141
  history = await self._read_conversation_history(ctx)
140
142
  user_prompt = self._get_message(ctx)
141
143
  agent = self._get_agent(ctx)
142
- async with agent.iter(
143
- user_prompt=user_prompt,
144
- message_history=ModelMessagesTypeAdapter.validate_python(history),
145
- ) as agent_run:
146
- async for node in agent_run:
147
- # Each node represents a step in the agent's execution
148
- await self._print_node(ctx, agent_run, node)
149
- new_history = json.loads(agent_run.result.all_messages_json())
150
- await self._write_conversation_history(ctx, new_history)
151
- return agent_run.result.data
144
+ try:
145
+ async with agent.iter(
146
+ user_prompt=user_prompt,
147
+ message_history=ModelMessagesTypeAdapter.validate_python(history),
148
+ ) as agent_run:
149
+ async for node in agent_run:
150
+ # Each node represents a step in the agent's execution
151
+ # Reference: https://ai.pydantic.dev/agents/#streaming
152
+ try:
153
+ await self._print_node(ctx, agent_run, node)
154
+ except APIError as e:
155
+ # Extract detailed error information from the response
156
+ error_details = _extract_api_error_details(e)
157
+ ctx.log_error(f"API Error: {error_details}")
158
+ raise
159
+ except Exception as e:
160
+ ctx.log_error(f"Error processing node: {str(e)}")
161
+ ctx.log_error(f"Error type: {type(e).__name__}")
162
+ raise
163
+ new_history = json.loads(agent_run.result.all_messages_json())
164
+ await self._write_conversation_history(ctx, new_history)
165
+ return agent_run.result.data
166
+ except Exception as e:
167
+ ctx.log_error(f"Error in agent execution: {str(e)}")
168
+ raise
152
169
 
153
170
  async def _print_node(self, ctx: AnyContext, agent_run: Any, node: Any):
154
171
  if Agent.is_user_prompt_node(node):
@@ -204,9 +221,20 @@ class LLMTask(BaseTask):
204
221
  async with node.stream(agent_run.ctx) as handle_stream:
205
222
  async for event in handle_stream:
206
223
  if isinstance(event, FunctionToolCallEvent):
207
- # Fixing anthrophic claude when call function with empty parameter
208
- if event.part.args == "":
224
+ # Handle empty arguments across different providers
225
+ if event.part.args == "" or event.part.args is None:
226
+ event.part.args = {}
227
+ elif isinstance(
228
+ event.part.args, str
229
+ ) and event.part.args.strip() in ["null", "{}"]:
230
+ # Some providers might send "null" or "{}" as a string
209
231
  event.part.args = {}
232
+ # Handle dummy property if present (from our schema sanitization)
233
+ if (
234
+ isinstance(event.part.args, dict)
235
+ and "_dummy" in event.part.args
236
+ ):
237
+ del event.part.args["_dummy"]
210
238
  ctx.print(
211
239
  stylize_faint(
212
240
  f"[Tools] The LLM calls tool={event.part.tool_name!r} with args={event.part.args} (tool_call_id={event.part.tool_call_id!r})" # noqa
@@ -330,13 +358,101 @@ class LLMTask(BaseTask):
330
358
 
331
359
 
332
360
  def _wrap_tool(func):
333
- @functools.wraps(func)
334
- async def wrapper(*args, **kwargs):
361
+ sig = inspect.signature(func)
362
+ if len(sig.parameters) == 0:
363
+
364
+ @functools.wraps(func)
365
+ async def wrapper(_dummy=None):
366
+ try:
367
+ return await run_async(func())
368
+ except Exception as e:
369
+ # Optionally, you can include more details from traceback if needed.
370
+ error_details = traceback.format_exc()
371
+ return f"Error: {e}\nDetails: {error_details}"
372
+
373
+ new_sig = inspect.Signature(
374
+ parameters=[
375
+ inspect.Parameter(
376
+ "_dummy", inspect.Parameter.POSITIONAL_OR_KEYWORD, default=None
377
+ )
378
+ ]
379
+ )
380
+ # Override the wrapper's signature so introspection yields a non-empty schema.
381
+ wrapper.__signature__ = new_sig
382
+ return wrapper
383
+ else:
384
+
385
+ @functools.wraps(func)
386
+ async def wrapper(*args, **kwargs):
387
+ try:
388
+ return await run_async(func(*args, **kwargs))
389
+ except Exception as e:
390
+ # Optionally, you can include more details from traceback if needed.
391
+ error_details = traceback.format_exc()
392
+ return f"Error: {e}\nDetails: {error_details}"
393
+
394
+ return wrapper
395
+
396
+
397
+ def _extract_api_error_details(error: APIError) -> str:
398
+ """Extract detailed error information from an APIError."""
399
+ details = f"{error.message}"
400
+ # Try to parse the error body as JSON
401
+ if error.body:
335
402
  try:
336
- return await run_async(func(*args, **kwargs))
403
+ if isinstance(error.body, str):
404
+ body_json = json.loads(error.body)
405
+ elif isinstance(error.body, bytes):
406
+ body_json = json.loads(error.body.decode("utf-8"))
407
+ else:
408
+ body_json = error.body
409
+ # Extract error details from the JSON structure
410
+ if isinstance(body_json, dict):
411
+ if "error" in body_json:
412
+ error_obj = body_json["error"]
413
+ if isinstance(error_obj, dict):
414
+ if "message" in error_obj:
415
+ details += f"\nProvider message: {error_obj['message']}"
416
+ if "code" in error_obj:
417
+ details += f"\nError code: {error_obj['code']}"
418
+ if "status" in error_obj:
419
+ details += f"\nStatus: {error_obj['status']}"
420
+ # Check for metadata that might contain provider-specific information
421
+ if "metadata" in body_json and isinstance(body_json["metadata"], dict):
422
+ metadata = body_json["metadata"]
423
+ if "provider_name" in metadata:
424
+ details += f"\nProvider: {metadata['provider_name']}"
425
+ if "raw" in metadata:
426
+ try:
427
+ raw_json = json.loads(metadata["raw"])
428
+ if "error" in raw_json and isinstance(
429
+ raw_json["error"], dict
430
+ ):
431
+ raw_error = raw_json["error"]
432
+ if "message" in raw_error:
433
+ details += (
434
+ f"\nRaw error message: {raw_error['message']}"
435
+ )
436
+ except (KeyError, TypeError, ValueError):
437
+ # If we can't parse the raw JSON, just include it as is
438
+ details += f"\nRaw error data: {metadata['raw']}"
439
+ except json.JSONDecodeError:
440
+ # If we can't parse the JSON, include the raw body
441
+ details += f"\nRaw error body: {error.body}"
337
442
  except Exception as e:
338
- # Optionally, you can include more details from traceback if needed.
339
- error_details = traceback.format_exc()
340
- return f"Error: {e}\nDetails: {error_details}"
341
-
342
- return wrapper
443
+ # Catch any other exceptions during parsing
444
+ details += f"\nError parsing error body: {str(e)}"
445
+ # Include request information if available
446
+ if hasattr(error, "request") and error.request:
447
+ if hasattr(error.request, "method") and hasattr(error.request, "url"):
448
+ details += f"\nRequest: {error.request.method} {error.request.url}"
449
+ # Include a truncated version of the request content if available
450
+ if hasattr(error.request, "content") and error.request.content:
451
+ content = error.request.content
452
+ if isinstance(content, bytes):
453
+ try:
454
+ content = content.decode("utf-8")
455
+ except UnicodeDecodeError:
456
+ content = str(content)
457
+ details += f"\nRequest content: {content}"
458
+ return details
@@ -1,7 +0,0 @@
1
- # App Name
2
-
3
- # Principle
4
-
5
- - Developer should be able to override everything with sane amount of code.
6
- - Simple tasks should only require small amount of code.
7
- - A bit of magic is okay as long as transparent and documented.
@@ -1,12 +0,0 @@
1
- fastapi[standard]~=0.115.6
2
- alembic~=1.14.0
3
- sqlmodel~=0.0.22
4
- ulid-py~=1.1.0
5
- passlib~=1.7.4
6
- Jinja2~=3.1.5
7
- python-jose~=3.4.0
8
- passlib~=1.7.4
9
-
10
- pytest~=8.3.4
11
- pytest-asyncio~=0.24.0
12
- pytest-cov~=6.0.0
@@ -1,15 +0,0 @@
1
- import os
2
-
3
- from fastapi.testclient import TestClient
4
- from my_app_name.main import app
5
- from my_app_name.module.gateway.util.view import render_content
6
-
7
-
8
- def test_homepage():
9
- client = TestClient(app, base_url="http://localhost")
10
- response = client.get("/")
11
- assert response.status_code == 200
12
- view_path = os.path.join(
13
- os.path.dirname(os.path.dirname(__file__)), "module", "gateway", "view"
14
- )
15
- assert response.text == render_content("homepage.html").body.decode("utf-8")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes