zrb 1.5.3__tar.gz → 1.5.5__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.5.3 → zrb-1.5.5}/PKG-INFO +2 -2
  2. {zrb-1.5.3 → zrb-1.5.5}/pyproject.toml +2 -2
  3. zrb-1.5.5/src/zrb/builtin/llm/tool/file.py +374 -0
  4. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/base_task.py +6 -4
  5. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/llm_task.py +40 -26
  6. zrb-1.5.3/src/zrb/builtin/llm/tool/file.py +0 -510
  7. {zrb-1.5.3 → zrb-1.5.5}/README.md +0 -0
  8. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/__init__.py +0 -0
  9. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/__main__.py +0 -0
  10. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/attr/__init__.py +0 -0
  11. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/attr/type.py +0 -0
  12. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/__init__.py +0 -0
  13. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/base64.py +0 -0
  14. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/git.py +0 -0
  15. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/git_subtree.py +0 -0
  16. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/group.py +0 -0
  17. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/llm_chat.py +0 -0
  18. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/previous-session.js +0 -0
  19. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/tool/api.py +0 -0
  20. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/tool/cli.py +0 -0
  21. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/tool/rag.py +0 -0
  22. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/llm/tool/web.py +0 -0
  23. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/md5.py +0 -0
  24. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/__init__.py +0 -0
  25. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  26. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  27. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  28. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  29. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  30. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
  31. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  32. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  33. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  34. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  35. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  36. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  37. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  49. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  50. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  51. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  52. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  53. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  54. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  55. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  56. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  70. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  71. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  72. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  73. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  74. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  75. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  76. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  77. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  78. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  79. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  80. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  81. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  82. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  83. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  84. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  85. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  86. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  87. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  88. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  89. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  90. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  91. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  92. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  93. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  94. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  95. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  96. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  97. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  98. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  99. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  101. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  102. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  103. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  104. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  105. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  106. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  107. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  109. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  111. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  113. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  115. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  116. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  117. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  119. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  121. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  122. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  123. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  124. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  125. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  126. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  127. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  128. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  129. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  130. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  131. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  132. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  133. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  134. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  135. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  136. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  137. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  138. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  139. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  140. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  141. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  142. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  143. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  144. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  145. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  146. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  147. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  150. {zrb-1.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/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.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  171. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
  172. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  173. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  174. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  175. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  176. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  177. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  178. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  179. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  180. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  181. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  182. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  183. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  184. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
  185. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  186. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  187. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  188. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/create/__init__.py +0 -0
  189. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  190. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  191. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/project/create/project_task.py +0 -0
  192. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/python.py +0 -0
  193. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/random.py +0 -0
  194. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
  195. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  196. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/common_input.py +0 -0
  197. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  198. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
  199. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  200. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  201. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/ubuntu.py +0 -0
  202. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
  203. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  204. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  205. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/shell/__init__.py +0 -0
  206. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  207. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  208. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  209. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  210. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/builtin/todo.py +0 -0
  211. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/callback/__init__.py +0 -0
  212. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/callback/any_callback.py +0 -0
  213. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/callback/callback.py +0 -0
  214. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/cmd/__init__.py +0 -0
  215. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/cmd/cmd_result.py +0 -0
  216. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/cmd/cmd_val.py +0 -0
  217. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/config.py +0 -0
  218. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/content_transformer/__init__.py +0 -0
  219. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  220. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/content_transformer/content_transformer.py +0 -0
  221. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/context/__init__.py +0 -0
  222. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/context/any_context.py +0 -0
  223. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/context/any_shared_context.py +0 -0
  224. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/context/context.py +0 -0
  225. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/context/shared_context.py +0 -0
  226. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/dot_dict/__init__.py +0 -0
  227. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/dot_dict/dot_dict.py +0 -0
  228. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/env/__init__.py +0 -0
  229. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/env/any_env.py +0 -0
  230. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/env/env.py +0 -0
  231. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/env/env_file.py +0 -0
  232. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/env/env_map.py +0 -0
  233. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/group/__init__.py +0 -0
  234. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/group/any_group.py +0 -0
  235. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/group/group.py +0 -0
  236. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/__init__.py +0 -0
  237. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/any_input.py +0 -0
  238. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/base_input.py +0 -0
  239. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/bool_input.py +0 -0
  240. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/float_input.py +0 -0
  241. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/int_input.py +0 -0
  242. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/option_input.py +0 -0
  243. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/password_input.py +0 -0
  244. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/str_input.py +0 -0
  245. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/input/text_input.py +0 -0
  246. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/llm_config.py +0 -0
  247. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/__init__.py +0 -0
  248. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/cli.py +0 -0
  249. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/common_util.py +0 -0
  250. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_app.py +0 -0
  251. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_config/config.py +0 -0
  252. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_config/config_factory.py +0 -0
  253. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/__init__.py +0 -0
  254. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/docs_route.py +0 -0
  255. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  256. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  257. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/error_page/view.html +0 -0
  258. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  259. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  260. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/home_page/view.html +0 -0
  261. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/login_api_route.py +0 -0
  262. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  263. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/login_page/view.html +0 -0
  264. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  265. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  266. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  267. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  268. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  269. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  270. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  271. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  272. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  273. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  274. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  275. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  276. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  277. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  278. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  279. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
  280. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  281. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  282. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  283. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  284. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/static/static_route.py +0 -0
  285. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  286. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  287. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_schema/session.py +0 -0
  288. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_schema/token.py +0 -0
  289. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_schema/user.py +0 -0
  290. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_util/cookie.py +0 -0
  291. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_util/html.py +0 -0
  292. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_util/token.py +0 -0
  293. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/runner/web_util/user.py +0 -0
  294. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session/__init__.py +0 -0
  295. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session/any_session.py +0 -0
  296. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session/session.py +0 -0
  297. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_log/__init__.py +0 -0
  298. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_log/session_state_log.py +0 -0
  299. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_logger/__init__.py +0 -0
  300. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  301. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  302. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  303. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/__init__.py +0 -0
  304. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/any_task.py +0 -0
  305. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/base_trigger.py +0 -0
  306. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/cmd_task.py +0 -0
  307. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/http_check.py +0 -0
  308. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/make_task.py +0 -0
  309. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/rsync_task.py +0 -0
  310. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/scaffolder.py +0 -0
  311. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/scheduler.py +0 -0
  312. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/task.py +0 -0
  313. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task/tcp_check.py +0 -0
  314. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task_status/__init__.py +0 -0
  315. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/task_status/task_status.py +0 -0
  316. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/__init__.py +0 -0
  317. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/attr.py +0 -0
  318. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cli/__init__.py +0 -0
  319. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cli/style.py +0 -0
  320. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cli/subcommand.py +0 -0
  321. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cmd/__init__.py +0 -0
  322. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cmd/command.py +0 -0
  323. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cmd/remote.py +0 -0
  324. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/__init__.py +0 -0
  325. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modification_mode.py +0 -0
  326. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_class.py +0 -0
  327. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  328. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_class_property.py +0 -0
  329. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_dict.py +0 -0
  330. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_function.py +0 -0
  331. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_function_call.py +0 -0
  332. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_method.py +0 -0
  333. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/codemod/modify_module.py +0 -0
  334. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/cron.py +0 -0
  335. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/file.py +0 -0
  336. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/git.py +0 -0
  337. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/git_subtree.py +0 -0
  338. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/group.py +0 -0
  339. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/load.py +0 -0
  340. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/run.py +0 -0
  341. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/string/__init__.py +0 -0
  342. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/string/conversion.py +0 -0
  343. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/string/format.py +0 -0
  344. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/string/name.py +0 -0
  345. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/util/todo.py +0 -0
  346. {zrb-1.5.3 → zrb-1.5.5}/src/zrb/xcom/__init__.py +0 -0
  347. {zrb-1.5.3 → zrb-1.5.5}/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.3
3
+ Version: 1.5.5
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -26,7 +26,7 @@ Requires-Dist: openai (>=1.70.0,<2.0.0) ; extra == "rag" or extra == "all"
26
26
  Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
27
27
  Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
28
28
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
29
- Requires-Dist: pydantic-ai (>=0.0.49,<0.0.50)
29
+ Requires-Dist: pydantic-ai (>=0.0.52,<0.0.53)
30
30
  Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
31
31
  Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
32
32
  Requires-Dist: requests (>=2.32.3,<3.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.5.3"
3
+ version = "1.5.5"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -49,7 +49,7 @@ beautifulsoup4 = "^4.13.3"
49
49
  fastapi = {extras = ["standard"], version = "^0.115.12"}
50
50
  python-jose = {extras = ["cryptography"], version = "^3.4.0"}
51
51
  ulid-py = "^1.1.0"
52
- pydantic-ai = "^0.0.49"
52
+ pydantic-ai = "^0.0.52"
53
53
  openai = {version = "^1.70.0", optional = true}
54
54
  playwright = {version = "^1.51.0", optional = true}
55
55
  psutil = "^7.0.0"
@@ -0,0 +1,374 @@
1
+ import fnmatch
2
+ import json
3
+ import os
4
+ import re
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ from zrb.util.file import read_file as _read_file
8
+ from zrb.util.file import write_file as _write_file
9
+
10
+
11
+ def list_files(
12
+ path: str = ".", recursive: bool = True, include_hidden: bool = False
13
+ ) -> str:
14
+ """
15
+ Request to list files and directories within the specified directory.
16
+ If recursive is true, it will list all files and directories recursively.
17
+ If recursive is false or not provided, it will only list the top-level contents.
18
+ Args:
19
+ path: (required) The path of the directory to list contents for (relative to the CWD)
20
+ recursive: (optional) Whether to list files recursively.
21
+ Use true for recursive listing, false or omit for top-level only.
22
+ include_hidden: (optional) Whether to include hidden files/directories.
23
+ Defaults to False (exclude hidden files).
24
+ Returns:
25
+ A JSON string containing a list of file paths or an error message.
26
+ Example success: '{"files": ["file1.txt", "subdir/file2.py"]}'
27
+ Example error: '{"error": "Error listing files: [Errno 2] No such file..."}'
28
+ """
29
+ all_files: List[str] = []
30
+ abs_path = os.path.abspath(path)
31
+ try:
32
+ if recursive:
33
+ for root, dirs, files in os.walk(abs_path):
34
+ # Skip hidden directories (like .git) for performance and relevance
35
+ dirs[:] = [d for d in dirs if include_hidden or not _is_hidden(d)]
36
+ for filename in files:
37
+ # Skip hidden files
38
+ if include_hidden or not _is_hidden(filename):
39
+ all_files.append(os.path.join(root, filename))
40
+ else:
41
+ # Non-recursive listing (top-level only)
42
+ for item in os.listdir(abs_path):
43
+ full_path = os.path.join(abs_path, item)
44
+ # Include both files and directories if not recursive
45
+ if include_hidden or not _is_hidden(
46
+ item
47
+ ): # Skip hidden items unless included
48
+ all_files.append(full_path)
49
+
50
+ # Return paths relative to the original path requested
51
+ try:
52
+ rel_files = [
53
+ os.path.relpath(f, os.path.dirname(abs_path)) for f in all_files
54
+ ]
55
+ return json.dumps({"files": sorted(rel_files)})
56
+ except (
57
+ ValueError
58
+ ) as e: # Handle case where path is '.' and abs_path is CWD root
59
+ if "path is on mount '" in str(e) and "' which is not on mount '" in str(e):
60
+ # If paths are on different mounts, just use absolute paths
61
+ rel_files = all_files
62
+ return json.dumps({"files": sorted(rel_files)})
63
+ raise
64
+ except Exception as e:
65
+ raise Exception(f"Error listing files in {path}: {e}")
66
+
67
+
68
+ def _is_hidden(path: str) -> bool:
69
+ """Check if path is hidden (starts with '.')."""
70
+ return os.path.basename(path).startswith(".")
71
+
72
+
73
+ def read_from_file(
74
+ path: str,
75
+ start_line: Optional[int] = None,
76
+ end_line: Optional[int] = None,
77
+ ) -> str:
78
+ """
79
+ Request to read the contents of a file at the specified path. Use this when you need
80
+ to examine the contents of an existing file you do not know the contents of, for example
81
+ to analyze code, review text files, or extract information from configuration files.
82
+ The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"),
83
+ making it easier to reference specific lines when creating diffs or discussing code.
84
+ By specifying start_line and end_line parameters, you can efficiently read specific
85
+ portions of large files without loading the entire file into memory. Automatically
86
+ extracts raw text from PDF and DOCX files. May not be suitable for other types of
87
+ binary files, as it returns the raw content as a string.
88
+ Args:
89
+ path: (required) The path of the file to read (relative to the CWD)
90
+ start_line: (optional) The starting line number to read from (1-based).
91
+ If not provided, it starts from the beginning of the file.
92
+ end_line: (optional) The ending line number to read to (1-based, inclusive).
93
+ If not provided, it reads to the end of the file.
94
+ Returns:
95
+ A JSON string containing the file path, content, and line range, or an error.
96
+ Example success: '{"path": "f.py", "content": "...", "start_line": 1, "end_line": 2}'
97
+ Example error: '{"error": "File not found: data.txt"}'
98
+ """
99
+ try:
100
+ abs_path = os.path.abspath(path)
101
+ # Check if file exists
102
+ if not os.path.exists(abs_path):
103
+ return json.dumps({"error": f"File {path} does not exist"})
104
+ content = _read_file(abs_path)
105
+ lines = content.splitlines()
106
+ total_lines = len(lines)
107
+ # Adjust line indices (convert from 1-based to 0-based)
108
+ start_idx = (start_line - 1) if start_line is not None else 0
109
+ end_idx = end_line if end_line is not None else total_lines
110
+ # Validate indices
111
+ if start_idx < 0:
112
+ start_idx = 0
113
+ if end_idx > total_lines:
114
+ end_idx = total_lines
115
+ if start_idx > end_idx:
116
+ start_idx = end_idx
117
+ # Select the lines for the result
118
+ selected_lines = lines[start_idx:end_idx]
119
+ content_result = "\n".join(selected_lines)
120
+ return json.dumps(
121
+ {
122
+ "path": path,
123
+ "content": content_result,
124
+ "start_line": start_idx + 1, # Convert back to 1-based for output
125
+ "end_line": end_idx, # end_idx is already exclusive upper bound
126
+ "total_lines": total_lines,
127
+ }
128
+ )
129
+ except Exception as e:
130
+ raise Exception(f"Error reading file {path}: {e}")
131
+
132
+
133
+ def write_to_file(path: str, content: str, line_count: int) -> str:
134
+ """
135
+ Request to write full content to a file at the specified path. If the file exists,
136
+ it will be overwritten with the provided content. If the file doesn't exist,
137
+ it will be created. This tool will automatically create any directories needed
138
+ to write the file.
139
+ Args:
140
+ path: (required) The path of the file to write to (relative to the CWD)
141
+ content: (required) The content to write to the file. ALWAYS provide the COMPLETE
142
+ intended content of the file, without any truncation or omissions. You MUST
143
+ include ALL parts of the file, even if they haven't been modified. Do NOT
144
+ include the line numbers in the content though, just the actual content
145
+ of the file.
146
+ line_count: (required) The number of lines in the file. Make sure to compute
147
+ this based on the actual content of the file, not the number of lines
148
+ in the content you're providing.
149
+ Returns:
150
+ A JSON string indicating success or failure, including any warnings.
151
+ Example success: '{"success": true, "path": "new_config.json"}'
152
+ Example success with warning: '{"success": true, "path": "f.txt", "warning": "..."}'
153
+ Example error: '{"success": false, "error": "Permission denied: /etc/hosts"}'
154
+ """
155
+ actual_lines = len(content.splitlines())
156
+ warning = None
157
+ if actual_lines != line_count:
158
+ warning = (
159
+ f"Provided line_count ({line_count}) does not match actual "
160
+ f"content lines ({actual_lines}) for file {path}"
161
+ )
162
+ try:
163
+ abs_path = os.path.abspath(path)
164
+ # Ensure directory exists
165
+ directory = os.path.dirname(abs_path)
166
+ if directory and not os.path.exists(directory):
167
+ os.makedirs(directory, exist_ok=True)
168
+ _write_file(abs_path, content)
169
+ result_data = {"success": True, "path": path}
170
+ if warning:
171
+ result_data["warning"] = warning
172
+ return json.dumps(result_data)
173
+ except Exception as e:
174
+ raise Exception(f"Error writing file {e}")
175
+
176
+
177
+ def search_files(
178
+ path: str,
179
+ regex: str,
180
+ file_pattern: Optional[str] = None,
181
+ include_hidden: bool = False,
182
+ ) -> str:
183
+ """
184
+ Request to perform a regex search across files in a specified directory,
185
+ providing context-rich results. This tool searches for patterns or specific
186
+ content across multiple files, displaying each match with encapsulating context.
187
+ Args:
188
+ path: (required) The path of the directory to search in (relative to the CWD).
189
+ This directory will be recursively searched.
190
+ regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
191
+ (Note: Python's `re` module will be used here, which has similar syntax)
192
+ file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts').
193
+ If not provided, searches all files (*).
194
+ include_hidden: (optional) Whether to include hidden files.
195
+ Defaults to False (exclude hidden files).
196
+ Returns:
197
+ A JSON string containing the search results or an error message.
198
+ Example success: '{"summary": "Found 5 matches...", "results": [{"file":"f.py", ...}]}'
199
+ Example no match: '{"summary": "No matches found...", "results": []}'
200
+ Example error: '{"error": "Invalid regex: ..."}'
201
+ """
202
+ try:
203
+ pattern = re.compile(regex)
204
+ except re.error as e:
205
+ raise Exception(f"Invalid regex pattern: {e}")
206
+ search_results = {"summary": "", "results": []}
207
+ match_count = 0
208
+ searched_file_count = 0
209
+ file_match_count = 0
210
+ try:
211
+ abs_path = os.path.abspath(path)
212
+ for root, dirs, files in os.walk(abs_path):
213
+ # Skip hidden directories
214
+ dirs[:] = [d for d in dirs if include_hidden or not _is_hidden(d)]
215
+ for filename in files:
216
+ # Skip hidden files
217
+ if not include_hidden and _is_hidden(filename):
218
+ continue
219
+ # Apply file pattern filter if provided
220
+ if file_pattern and not fnmatch.fnmatch(filename, file_pattern):
221
+ continue
222
+ file_path = os.path.join(root, filename)
223
+ rel_file_path = os.path.relpath(file_path, os.getcwd())
224
+ searched_file_count += 1
225
+ try:
226
+ matches = _get_file_matches(file_path, pattern)
227
+ if matches:
228
+ file_match_count += 1
229
+ match_count += len(matches)
230
+ search_results["results"].append(
231
+ {"file": rel_file_path, "matches": matches}
232
+ )
233
+ except IOError as e:
234
+ search_results["results"].append(
235
+ {"file": rel_file_path, "error": str(e)}
236
+ )
237
+ if match_count == 0:
238
+ search_results["summary"] = (
239
+ f"No matches found for pattern '{regex}' in path '{path}' "
240
+ f"(searched {searched_file_count} files)."
241
+ )
242
+ else:
243
+ search_results["summary"] = (
244
+ f"Found {match_count} matches in {file_match_count} files "
245
+ f"(searched {searched_file_count} files)."
246
+ )
247
+ return json.dumps(search_results, indent=2) # Pretty print for readability
248
+ except Exception as e:
249
+ raise Exception(f"Error searching files: {e}")
250
+
251
+
252
+ def _get_file_matches(
253
+ file_path: str, pattern: re.Pattern, context_lines: int = 2
254
+ ) -> List[Dict[str, Any]]:
255
+ """Search for regex matches in a file with context."""
256
+ try:
257
+ with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
258
+ lines = f.readlines()
259
+ matches = []
260
+ for line_idx, line in enumerate(lines):
261
+ if pattern.search(line):
262
+ line_num = line_idx + 1
263
+ context_start = max(0, line_idx - context_lines)
264
+ context_end = min(len(lines), line_idx + context_lines + 1)
265
+ match_data = {
266
+ "line_number": line_num,
267
+ "line_content": line.rstrip(),
268
+ "context_before": [
269
+ lines[j].rstrip() for j in range(context_start, line_idx)
270
+ ],
271
+ "context_after": [
272
+ lines[j].rstrip() for j in range(line_idx + 1, context_end)
273
+ ],
274
+ }
275
+ matches.append(match_data)
276
+ return matches
277
+ except Exception as e:
278
+ raise IOError(f"Error reading {file_path}: {str(e)}")
279
+
280
+
281
+ def apply_diff(path: str, diff: str) -> str:
282
+ """
283
+ Request to replace existing code using a search and replace block.
284
+ This tool allows for precise, surgical replaces to files by specifying exactly
285
+ what content to search for and what to replace it with.
286
+ The tool will maintain proper indentation and formatting while making changes.
287
+ Only a single operation is allowed per tool use.
288
+ The SEARCH section must exactly match existing content including whitespace
289
+ and indentation.
290
+ If you're not confident in the exact content to search for, use the read_file tool
291
+ first to get the exact content.
292
+ Args:
293
+ path: (required) The path of the file to modify (relative to the CWD)
294
+ diff: (required) The search/replace block defining the changes.
295
+ Format:
296
+ <<<<<<< SEARCH
297
+ :start_line:START_LINE_NUMBER
298
+ :end_line:END_LINE_NUMBER
299
+ -------
300
+ [exact content to find including whitespace]
301
+ =======
302
+ [new content to replace with]
303
+ >>>>>>> REPLACE
304
+ Returns:
305
+ A JSON string indicating success or failure.
306
+ """
307
+ try:
308
+ start_line, end_line, search_content, replace_content = _parse_diff(diff)
309
+ abs_path = os.path.abspath(path)
310
+ if not os.path.exists(abs_path):
311
+ return json.dumps(
312
+ {"success": False, "path": path, "error": f"File not found at {path}"}
313
+ )
314
+ content = _read_file(abs_path)
315
+ lines = content.splitlines()
316
+ if start_line < 1 or end_line > len(lines) or start_line > end_line:
317
+ return json.dumps(
318
+ {
319
+ "success": False,
320
+ "path": path,
321
+ "error": (
322
+ f"Invalid line range {start_line}-{end_line} "
323
+ f"for file with {len(lines)} lines."
324
+ ),
325
+ }
326
+ )
327
+ original_content = "\n".join(lines[start_line - 1 : end_line])
328
+ if original_content != search_content:
329
+ error_message = (
330
+ f"Search content does not match file content at "
331
+ f"lines {start_line}-{end_line}.\n"
332
+ f"Expected ({len(search_content.splitlines())} lines):\n"
333
+ f"---\n{search_content}\n---\n"
334
+ f"Actual ({len(lines[start_line-1:end_line])} lines):\n"
335
+ f"---\n{original_content}\n---"
336
+ )
337
+ return json.dumps({"success": False, "path": path, "error": error_message})
338
+ new_lines = (
339
+ lines[: start_line - 1] + replace_content.splitlines() + lines[end_line:]
340
+ )
341
+ new_content = "\n".join(new_lines)
342
+ if content.endswith("\n"):
343
+ new_content += "\n"
344
+ _write_file(abs_path, new_content)
345
+ return json.dumps({"success": True, "path": path})
346
+ except Exception as e:
347
+ raise Exception(f"Error applying diff on {path}: {e}")
348
+
349
+
350
+ def _parse_diff(diff: str) -> tuple[int, int, str, str]:
351
+ """Parse diff content into components."""
352
+ search_marker = "<<<<<<< SEARCH"
353
+ meta_marker = "-------"
354
+ separator = "======="
355
+ replace_marker = ">>>>>>> REPLACE"
356
+ search_start_idx = diff.find(search_marker)
357
+ meta_start_idx = diff.find(meta_marker)
358
+ separator_idx = diff.find(separator)
359
+ replace_end_idx = diff.find(replace_marker)
360
+ if any(
361
+ idx == -1
362
+ for idx in [search_start_idx, meta_start_idx, separator_idx, replace_end_idx]
363
+ ):
364
+ raise ValueError("Invalid diff format - missing markers")
365
+ meta_content = diff[search_start_idx + len(search_marker) : meta_start_idx].strip()
366
+ start_line = int(re.search(r":start_line:(\d+)", meta_content).group(1))
367
+ end_line = int(re.search(r":end_line:(\d+)", meta_content).group(1))
368
+ search_content = diff[meta_start_idx + len(meta_marker) : separator_idx].strip(
369
+ "\r\n"
370
+ )
371
+ replace_content = diff[separator_idx + len(separator) : replace_end_idx].strip(
372
+ "\r\n"
373
+ )
374
+ return start_line, end_line, search_content, replace_content
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
- from collections.abc import Callable
3
+ from collections.abc import Callable, Coroutine
4
4
  from typing import Any
5
5
 
6
6
  from zrb.attr.type import BoolAttr, fstring
@@ -64,7 +64,7 @@ class BaseTask(AnyTask):
64
64
  def __repr__(self):
65
65
  return f"<{self.__class__.__name__} name={self._name}>"
66
66
 
67
- def __rshift__(self, other: AnyTask | list[AnyTask]) -> AnyTask:
67
+ def __rshift__(self, other: AnyTask | list[AnyTask]) -> AnyTask | list[AnyTask]:
68
68
  try:
69
69
  if isinstance(other, AnyTask):
70
70
  other.append_upstream(self)
@@ -123,7 +123,9 @@ class BaseTask(AnyTask):
123
123
  return [task_input for task_input in inputs if task_input is not None]
124
124
 
125
125
  def __combine_inputs(
126
- self, inputs: list[AnyInput], other_inputs: list[AnyInput] | AnyInput
126
+ self,
127
+ inputs: list[AnyInput],
128
+ other_inputs: list[AnyInput | None] | AnyInput | None,
127
129
  ):
128
130
  input_names = [task_input.name for task_input in inputs]
129
131
  if isinstance(other_inputs, AnyInput):
@@ -429,7 +431,7 @@ class BaseTask(AnyTask):
429
431
  session.get_task_status(self).reset()
430
432
  # defer this action
431
433
  ctx.log_info("Running")
432
- action_coro = asyncio.create_task(
434
+ action_coro: Coroutine = asyncio.create_task(
433
435
  run_async(self.__exec_action_and_retry(session))
434
436
  )
435
437
  session.defer_action(self, action_coro)
@@ -1,4 +1,3 @@
1
- import copy
2
1
  import functools
3
2
  import inspect
4
3
  import json
@@ -9,6 +8,7 @@ from typing import Any
9
8
 
10
9
  from openai import APIError
11
10
  from pydantic_ai import Agent, Tool
11
+ from pydantic_ai.mcp import MCPServer
12
12
  from pydantic_ai.messages import (
13
13
  FinalResultEvent,
14
14
  FunctionToolCallEvent,
@@ -54,9 +54,9 @@ class LLMTask(BaseTask):
54
54
  Callable[[AnySharedContext], Model | str | fstring] | Model | None
55
55
  ) = None,
56
56
  render_model: bool = True,
57
- model_base_url: StrAttr = None,
57
+ model_base_url: StrAttr | None = None,
58
58
  render_model_base_url: bool = True,
59
- model_api_key: StrAttr = None,
59
+ model_api_key: StrAttr | None = None,
60
60
  render_model_api_key: bool = True,
61
61
  model_settings: (
62
62
  ModelSettings | Callable[[AnySharedContext], ModelSettings] | None
@@ -68,6 +68,9 @@ class LLMTask(BaseTask):
68
68
  tools: (
69
69
  list[ToolOrCallable] | Callable[[AnySharedContext], list[ToolOrCallable]]
70
70
  ) = [],
71
+ mcp_servers: (
72
+ list[MCPServer] | Callable[[AnySharedContext], list[MCPServer]]
73
+ ) = [],
71
74
  conversation_history: (
72
75
  ListOfDict | Callable[[AnySharedContext], ListOfDict]
73
76
  ) = [],
@@ -127,6 +130,8 @@ class LLMTask(BaseTask):
127
130
  self._message = message
128
131
  self._tools = tools
129
132
  self._additional_tools: list[ToolOrCallable] = []
133
+ self._mcp_servers = mcp_servers
134
+ self._additional_mcp_servers: list[MCPServer] = []
130
135
  self._conversation_history = conversation_history
131
136
  self._conversation_history_reader = conversation_history_reader
132
137
  self._conversation_history_writer = conversation_history_writer
@@ -137,32 +142,36 @@ class LLMTask(BaseTask):
137
142
  def add_tool(self, tool: ToolOrCallable):
138
143
  self._additional_tools.append(tool)
139
144
 
145
+ def add_mcp_server(self, mcp_server: MCPServer):
146
+ self._additional_mcp_servers.append(mcp_server)
147
+
140
148
  async def _exec_action(self, ctx: AnyContext) -> Any:
141
149
  history = await self._read_conversation_history(ctx)
142
150
  user_prompt = self._get_message(ctx)
143
151
  agent = self._get_agent(ctx)
144
152
  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
153
+ async with agent.run_mcp_servers():
154
+ async with agent.iter(
155
+ user_prompt=user_prompt,
156
+ message_history=ModelMessagesTypeAdapter.validate_python(history),
157
+ ) as agent_run:
158
+ async for node in agent_run:
159
+ # Each node represents a step in the agent's execution
160
+ # Reference: https://ai.pydantic.dev/agents/#streaming
161
+ try:
162
+ await self._print_node(ctx, agent_run, node)
163
+ except APIError as e:
164
+ # Extract detailed error information from the response
165
+ error_details = _extract_api_error_details(e)
166
+ ctx.log_error(f"API Error: {error_details}")
167
+ raise
168
+ except Exception as e:
169
+ ctx.log_error(f"Error processing node: {str(e)}")
170
+ ctx.log_error(f"Error type: {type(e).__name__}")
171
+ raise
172
+ new_history = json.loads(agent_run.result.all_messages_json())
173
+ await self._write_conversation_history(ctx, new_history)
174
+ return agent_run.result.data
166
175
  except Exception as e:
167
176
  ctx.log_error(f"Error in agent execution: {str(e)}")
168
177
  raise
@@ -277,10 +286,15 @@ class LLMTask(BaseTask):
277
286
  tool if isinstance(tool, Tool) else Tool(_wrap_tool(tool), takes_ctx=False)
278
287
  for tool in tools_or_callables
279
288
  ]
289
+ mcp_servers = list(
290
+ self._mcp_servers(ctx) if callable(self._mcp_servers) else self._mcp_servers
291
+ )
292
+ mcp_servers.extend(self._additional_mcp_servers)
280
293
  return Agent(
281
294
  self._get_model(ctx),
282
295
  system_prompt=self._get_system_prompt(ctx),
283
296
  tools=tools,
297
+ mcp_servers=mcp_servers,
284
298
  model_settings=self._get_model_settings(ctx),
285
299
  retries=3,
286
300
  )
@@ -368,7 +382,7 @@ def _wrap_tool(func):
368
382
  except Exception as e:
369
383
  # Optionally, you can include more details from traceback if needed.
370
384
  error_details = traceback.format_exc()
371
- return f"Error: {e}\nDetails: {error_details}"
385
+ return json.dumps({"error": f"{e}", "details": f"{error_details}"})
372
386
 
373
387
  new_sig = inspect.Signature(
374
388
  parameters=[
@@ -389,7 +403,7 @@ def _wrap_tool(func):
389
403
  except Exception as e:
390
404
  # Optionally, you can include more details from traceback if needed.
391
405
  error_details = traceback.format_exc()
392
- return f"Error: {e}\nDetails: {error_details}"
406
+ return json.dumps({"error": f"{e}", "details": f"{error_details}"})
393
407
 
394
408
  return wrapper
395
409