zrb 1.15.2__tar.gz → 1.15.4__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 (413) hide show
  1. {zrb-1.15.2 → zrb-1.15.4}/PKG-INFO +3 -4
  2. {zrb-1.15.2 → zrb-1.15.4}/pyproject.toml +1 -1
  3. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/chat_session.py +8 -18
  4. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/code.py +4 -3
  5. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/sub_agent.py +2 -0
  6. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/agent.py +6 -1
  7. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/history_summarization.py +5 -2
  8. zrb-1.15.4/src/zrb/task/llm/print_node.py +175 -0
  9. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/prompt.py +36 -10
  10. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/tool_wrapper.py +44 -14
  11. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm_task.py +1 -1
  12. zrb-1.15.4/src/zrb/util/cli/markdown.py +12 -0
  13. zrb-1.15.2/src/zrb/task/llm/print_node.py +0 -94
  14. {zrb-1.15.2 → zrb-1.15.4}/README.md +0 -0
  15. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/__init__.py +0 -0
  16. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/__main__.py +0 -0
  17. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/attr/__init__.py +0 -0
  18. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/attr/type.py +0 -0
  19. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/__init__.py +0 -0
  20. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/base64.py +0 -0
  21. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/git.py +0 -0
  22. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/git_subtree.py +0 -0
  23. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/group.py +0 -0
  24. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/http.py +0 -0
  25. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/jwt.py +0 -0
  26. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/history.py +0 -0
  27. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/input.py +0 -0
  28. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/llm_ask.py +0 -0
  29. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/previous-session.js +0 -0
  30. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/__init__.py +0 -0
  31. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/api.py +0 -0
  32. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/cli.py +0 -0
  33. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/file.py +0 -0
  34. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/rag.py +0 -0
  35. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/llm/tool/web.py +0 -0
  36. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/md5.py +0 -0
  37. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/__init__.py +0 -0
  38. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  39. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  40. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  41. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  42. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  43. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
  44. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  45. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  46. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  47. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  48. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  49. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  50. {zrb-1.15.2 → zrb-1.15.4}/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
  51. {zrb-1.15.2 → zrb-1.15.4}/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
  52. {zrb-1.15.2 → zrb-1.15.4}/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
  53. {zrb-1.15.2 → zrb-1.15.4}/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
  54. {zrb-1.15.2 → zrb-1.15.4}/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
  55. {zrb-1.15.2 → zrb-1.15.4}/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
  56. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
  57. {zrb-1.15.2 → zrb-1.15.4}/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
  58. {zrb-1.15.2 → zrb-1.15.4}/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
  59. {zrb-1.15.2 → zrb-1.15.4}/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
  60. {zrb-1.15.2 → zrb-1.15.4}/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
  61. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  62. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  63. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  64. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  65. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  66. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  67. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  68. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  69. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
  70. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
  71. {zrb-1.15.2 → zrb-1.15.4}/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
  72. {zrb-1.15.2 → zrb-1.15.4}/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
  73. {zrb-1.15.2 → zrb-1.15.4}/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
  74. {zrb-1.15.2 → zrb-1.15.4}/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
  75. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
  76. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
  77. {zrb-1.15.2 → zrb-1.15.4}/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
  78. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
  79. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
  80. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
  81. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
  82. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  83. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  84. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  85. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  86. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  87. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  88. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  89. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  90. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  91. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  92. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  93. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  94. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  95. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  96. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  97. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  98. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  99. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  100. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  101. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  102. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  103. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  104. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  105. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  106. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  107. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  108. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  109. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  110. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  111. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  112. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
  113. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  114. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  115. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  116. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  117. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  118. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  119. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  120. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
  121. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  122. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
  123. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  124. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
  125. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  126. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
  127. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  128. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  129. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  130. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
  131. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  132. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
  133. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  134. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  135. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  136. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  137. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  138. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  139. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  140. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  141. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  142. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  143. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  144. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  145. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  146. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  147. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  148. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  149. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  150. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  151. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  152. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  153. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  154. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  155. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  156. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  157. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  158. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  159. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  160. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  161. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  162. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  163. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
  164. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
  165. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
  166. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
  167. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
  168. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
  169. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
  170. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
  171. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
  172. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
  173. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
  174. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
  175. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
  176. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
  177. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
  178. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
  179. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
  180. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
  181. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
  182. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
  183. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  184. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
  185. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  186. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  187. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  188. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  189. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  190. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  191. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  192. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  193. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  194. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  195. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  196. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  197. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
  198. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  199. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  200. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  201. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/create/__init__.py +0 -0
  202. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  203. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  204. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/project/create/project_task.py +0 -0
  205. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/python.py +0 -0
  206. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/random.py +0 -0
  207. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
  208. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  209. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/common_input.py +0 -0
  210. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  211. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
  212. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  213. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  214. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/ubuntu.py +0 -0
  215. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
  216. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  217. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  218. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/shell/__init__.py +0 -0
  219. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  220. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  221. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  222. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  223. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/todo.py +0 -0
  224. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/builtin/uuid.py +0 -0
  225. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/callback/__init__.py +0 -0
  226. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/callback/any_callback.py +0 -0
  227. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/callback/callback.py +0 -0
  228. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/cmd/__init__.py +0 -0
  229. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/cmd/cmd_result.py +0 -0
  230. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/cmd/cmd_val.py +0 -0
  231. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/config.py +0 -0
  232. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/file_extractor_system_prompt.md +0 -0
  233. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/interactive_system_prompt.md +0 -0
  234. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/persona.md +0 -0
  235. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/repo_extractor_system_prompt.md +0 -0
  236. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/repo_summarizer_system_prompt.md +0 -0
  237. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/summarization_prompt.md +0 -0
  238. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/default_prompt/system_prompt.md +0 -0
  239. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/llm_config.py +0 -0
  240. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/llm_context/config.py +0 -0
  241. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/llm_context/config_parser.py +0 -0
  242. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/llm_rate_limitter.py +0 -0
  243. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/config/web_auth_config.py +0 -0
  244. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/content_transformer/__init__.py +0 -0
  245. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  246. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/content_transformer/content_transformer.py +0 -0
  247. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/context/__init__.py +0 -0
  248. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/context/any_context.py +0 -0
  249. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/context/any_shared_context.py +0 -0
  250. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/context/context.py +0 -0
  251. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/context/shared_context.py +0 -0
  252. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/dot_dict/__init__.py +0 -0
  253. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/dot_dict/dot_dict.py +0 -0
  254. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/env/__init__.py +0 -0
  255. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/env/any_env.py +0 -0
  256. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/env/env.py +0 -0
  257. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/env/env_file.py +0 -0
  258. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/env/env_map.py +0 -0
  259. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/group/__init__.py +0 -0
  260. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/group/any_group.py +0 -0
  261. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/group/group.py +0 -0
  262. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/__init__.py +0 -0
  263. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/any_input.py +0 -0
  264. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/base_input.py +0 -0
  265. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/bool_input.py +0 -0
  266. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/float_input.py +0 -0
  267. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/int_input.py +0 -0
  268. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/option_input.py +0 -0
  269. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/password_input.py +0 -0
  270. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/str_input.py +0 -0
  271. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/input/text_input.py +0 -0
  272. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/__init__.py +0 -0
  273. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/cli.py +0 -0
  274. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/common_util.py +0 -0
  275. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_app.py +0 -0
  276. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/__init__.py +0 -0
  277. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/docs_route.py +0 -0
  278. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  279. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  280. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/error_page/view.html +0 -0
  281. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  282. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  283. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/home_page/view.html +0 -0
  284. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/login_api_route.py +0 -0
  285. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  286. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/login_page/view.html +0 -0
  287. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  288. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  289. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  290. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  291. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  292. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  293. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  294. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  295. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  296. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  297. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/global_template.html +0 -0
  298. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  299. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  300. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/common.js +0 -0
  301. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  302. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  303. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  304. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.amber.min.css +0 -0
  305. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.blue.min.css +0 -0
  306. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.cyan.min.css +0 -0
  307. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.fuchsia.min.css +0 -0
  308. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.green.min.css +0 -0
  309. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.grey.min.css +0 -0
  310. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.indigo.min.css +0 -0
  311. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.jade.min.css +0 -0
  312. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.lime.min.css +0 -0
  313. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.min.css +0 -0
  314. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.orange.min.css +0 -0
  315. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.pink.min.css +0 -0
  316. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.pumpkin.min.css +0 -0
  317. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.purple.min.css +0 -0
  318. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.red.min.css +0 -0
  319. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.sand.min.css +0 -0
  320. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.slate.min.css +0 -0
  321. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.violet.min.css +0 -0
  322. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.yellow.min.css +0 -0
  323. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/pico-css/pico.zinc.min.css +0 -0
  324. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  325. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  326. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  327. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  328. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/static/static_route.py +0 -0
  329. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  330. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  331. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_schema/session.py +0 -0
  332. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_schema/token.py +0 -0
  333. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_schema/user.py +0 -0
  334. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_util/cookie.py +0 -0
  335. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_util/html.py +0 -0
  336. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_util/token.py +0 -0
  337. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/runner/web_util/user.py +0 -0
  338. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session/__init__.py +0 -0
  339. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session/any_session.py +0 -0
  340. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session/session.py +0 -0
  341. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_log/__init__.py +0 -0
  342. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_log/session_state_log.py +0 -0
  343. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_logger/__init__.py +0 -0
  344. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  345. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  346. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  347. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/__init__.py +0 -0
  348. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/any_task.py +0 -0
  349. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/__init__.py +0 -0
  350. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/context.py +0 -0
  351. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/execution.py +0 -0
  352. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/lifecycle.py +0 -0
  353. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/monitoring.py +0 -0
  354. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base/operators.py +0 -0
  355. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base_task.py +0 -0
  356. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/base_trigger.py +0 -0
  357. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/cmd_task.py +0 -0
  358. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/http_check.py +0 -0
  359. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/__init__.py +0 -0
  360. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/config.py +0 -0
  361. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/conversation_history.py +0 -0
  362. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/conversation_history_model.py +0 -0
  363. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/default_workflow/coding.md +0 -0
  364. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/default_workflow/copywriting.md +0 -0
  365. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/default_workflow/researching.md +0 -0
  366. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/error.py +0 -0
  367. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/llm/typing.py +0 -0
  368. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/make_task.py +0 -0
  369. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/rsync_task.py +0 -0
  370. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/scaffolder.py +0 -0
  371. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/scheduler.py +0 -0
  372. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/task.py +0 -0
  373. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task/tcp_check.py +0 -0
  374. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task_status/__init__.py +0 -0
  375. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/task_status/task_status.py +0 -0
  376. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/__init__.py +0 -0
  377. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/attr.py +0 -0
  378. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/callable.py +0 -0
  379. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cli/__init__.py +0 -0
  380. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cli/style.py +0 -0
  381. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cli/subcommand.py +0 -0
  382. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cmd/__init__.py +0 -0
  383. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cmd/command.py +0 -0
  384. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cmd/remote.py +0 -0
  385. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/__init__.py +0 -0
  386. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modification_mode.py +0 -0
  387. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_class.py +0 -0
  388. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  389. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_class_property.py +0 -0
  390. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_dict.py +0 -0
  391. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_function.py +0 -0
  392. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_function_call.py +0 -0
  393. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_method.py +0 -0
  394. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/codemod/modify_module.py +0 -0
  395. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/cron.py +0 -0
  396. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/file.py +0 -0
  397. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/git.py +0 -0
  398. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/git_diff_model.py +0 -0
  399. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/git_subtree.py +0 -0
  400. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/git_subtree_model.py +0 -0
  401. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/group.py +0 -0
  402. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/init_path.py +0 -0
  403. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/llm/prompt.py +0 -0
  404. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/load.py +0 -0
  405. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/run.py +0 -0
  406. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/string/__init__.py +0 -0
  407. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/string/conversion.py +0 -0
  408. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/string/format.py +0 -0
  409. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/string/name.py +0 -0
  410. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/todo.py +0 -0
  411. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/util/todo_model.py +0 -0
  412. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/xcom/__init__.py +0 -0
  413. {zrb-1.15.2 → zrb-1.15.4}/src/zrb/xcom/xcom.py +0 -0
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.15.2
3
+ Version: 1.15.4
4
4
  Summary: Your Automation Powerhouse
5
+ Home-page: https://github.com/state-alchemists/zrb
5
6
  License: AGPL-3.0-or-later
6
7
  Keywords: Automation,Task Runner,Code Generator,Monorepo,Low Code
7
8
  Author: Go Frendi Gunawan
@@ -12,7 +13,6 @@ Classifier: Programming Language :: Python :: 3
12
13
  Classifier: Programming Language :: Python :: 3.10
13
14
  Classifier: Programming Language :: Python :: 3.11
14
15
  Classifier: Programming Language :: Python :: 3.12
15
- Classifier: Programming Language :: Python :: 3.13
16
16
  Provides-Extra: all
17
17
  Provides-Extra: playwright
18
18
  Provides-Extra: rag
@@ -35,7 +35,6 @@ Requires-Dist: requests (>=2.32.4,<3.0.0)
35
35
  Requires-Dist: tiktoken (>=0.8.0,<0.9.0)
36
36
  Requires-Dist: ulid-py (>=1.1.0,<2.0.0)
37
37
  Project-URL: Documentation, https://github.com/state-alchemists/zrb
38
- Project-URL: Homepage, https://github.com/state-alchemists/zrb
39
38
  Project-URL: Repository, https://github.com/state-alchemists/zrb
40
39
  Description-Content-Type: text/markdown
41
40
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.15.2"
3
+ version = "1.15.4"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -10,6 +10,7 @@ import sys
10
10
 
11
11
  from zrb.config.llm_config import llm_config
12
12
  from zrb.context.any_context import AnyContext
13
+ from zrb.util.cli.markdown import render_markdown
13
14
  from zrb.util.cli.style import stylize_blue, stylize_bold_yellow, stylize_faint
14
15
  from zrb.util.string.conversion import to_boolean
15
16
 
@@ -34,7 +35,7 @@ async def read_user_prompt(ctx: AnyContext) -> str:
34
35
  # Get user input based on mode
35
36
  if not multiline_mode:
36
37
  ctx.print("💬 >>", plain=True)
37
- user_input = await _read_next_line(is_tty, reader, ctx)
38
+ user_input = await _read_next_line(reader, ctx)
38
39
  if not multiline_mode:
39
40
  ctx.print("", plain=True)
40
41
  # Handle user input
@@ -111,6 +112,7 @@ def _show_info(ctx: AnyContext):
111
112
  ),
112
113
  plain=True,
113
114
  )
115
+ ctx.print("", plain=True)
114
116
 
115
117
 
116
118
  def _show_command(command: str, description: str) -> str:
@@ -157,9 +159,11 @@ async def _setup_input_reader(is_interactive: bool):
157
159
  return reader
158
160
 
159
161
 
160
- async def _read_next_line(is_interactive: bool, reader, ctx: AnyContext) -> str:
162
+ async def _read_next_line(reader, ctx: AnyContext) -> str:
161
163
  """Reads one line of input using the provided reader."""
162
- if is_interactive:
164
+ from prompt_toolkit import PromptSession
165
+
166
+ if isinstance(reader, PromptSession):
163
167
  return await reader.prompt_async()
164
168
 
165
169
  line_bytes = await reader.readline()
@@ -197,27 +201,13 @@ async def _trigger_ask_and_wait_for_result(
197
201
  ctx, user_prompt, modes, yolo_mode, previous_session_name, start_new
198
202
  )
199
203
  result = await _wait_ask_result(ctx)
200
- md_result = _render_markdown(result) if result is not None else ""
204
+ md_result = render_markdown(result) if result is not None else ""
201
205
  ctx.print("\n🤖 >>", plain=True)
202
206
  ctx.print(md_result, plain=True)
203
207
  ctx.print("", plain=True)
204
208
  return result
205
209
 
206
210
 
207
- def _render_markdown(markdown_text: str) -> str:
208
- """
209
- Renders Markdown to a string, ensuring link URLs are visible.
210
- """
211
- from rich.console import Console
212
- from rich.markdown import Markdown
213
-
214
- console = Console()
215
- markdown = Markdown(markdown_text, hyperlinks=False)
216
- with console.capture() as capture:
217
- console.print(markdown)
218
- return capture.get()
219
-
220
-
221
211
  def get_llm_ask_input_mapping(callback_ctx: AnyContext):
222
212
  """
223
213
  Generates the input mapping for the LLM ask task from the callback context.
@@ -6,6 +6,7 @@ from zrb.builtin.llm.tool.sub_agent import create_sub_agent_tool
6
6
  from zrb.config.config import CFG
7
7
  from zrb.config.llm_rate_limitter import llm_rate_limitter
8
8
  from zrb.context.any_context import AnyContext
9
+ from zrb.util.cli.style import stylize_faint
9
10
 
10
11
  _DEFAULT_EXTENSIONS = [
11
12
  "py",
@@ -112,7 +113,7 @@ async def analyze_repo(
112
113
  )
113
114
  abs_path = os.path.abspath(os.path.expanduser(path))
114
115
  file_metadatas = _get_file_metadatas(abs_path, extensions, exclude_patterns)
115
- ctx.print("Extraction")
116
+ ctx.print(stylize_faint(" 📝 Extraction"), plain=True)
116
117
  extracted_infos = await _extract_info(
117
118
  ctx,
118
119
  file_metadatas=file_metadatas,
@@ -121,10 +122,10 @@ async def analyze_repo(
121
122
  )
122
123
  if len(extracted_infos) == 1:
123
124
  return extracted_infos[0]
124
- ctx.print("Summarization")
125
+ ctx.print(stylize_faint(" 📝 Summarization"), plain=True)
125
126
  summarized_infos = extracted_infos
126
127
  while len(summarized_infos) > 1:
127
- ctx.print("Summarization")
128
+ ctx.print(stylize_faint(" 📝 Summarization"), plain=True)
128
129
  summarized_infos = await _summarize_info(
129
130
  ctx,
130
131
  extracted_infos=summarized_infos,
@@ -26,6 +26,7 @@ def create_sub_agent_tool(
26
26
  tools: "list[ToolOrCallable]" = [],
27
27
  toolsets: list["AbstractToolset[Agent]"] = [],
28
28
  is_yolo_mode: bool | None = None,
29
+ log_indent_level: int = 2,
29
30
  ) -> Callable[[AnyContext, str], Coroutine[Any, Any, str]]:
30
31
  """
31
32
  Creates a "tool that is another AI agent," capable of handling complex,
@@ -110,6 +111,7 @@ def create_sub_agent_tool(
110
111
  user_prompt=query,
111
112
  attachments=[],
112
113
  history_list=[],
114
+ log_indent_level=log_indent_level,
113
115
  )
114
116
 
115
117
  # Return the sub-agent's final message content
@@ -129,6 +129,7 @@ async def run_agent_iteration(
129
129
  history_list: ListOfDict | None = None,
130
130
  rate_limitter: LLMRateLimiter | None = None,
131
131
  max_retry: int = 2,
132
+ log_indent_level: int = 0,
132
133
  ) -> "AgentRun":
133
134
  """
134
135
  Runs a single iteration of the agent execution loop.
@@ -159,6 +160,7 @@ async def run_agent_iteration(
159
160
  rate_limitter=(
160
161
  llm_rate_limitter if rate_limitter is None else rate_limitter
161
162
  ),
163
+ log_indent_level=log_indent_level,
162
164
  )
163
165
  except BaseException:
164
166
  attempt += 1
@@ -174,6 +176,7 @@ async def _run_single_agent_iteration(
174
176
  attachments: "list[UserContent]",
175
177
  history_list: ListOfDict,
176
178
  rate_limitter: LLMRateLimiter,
179
+ log_indent_level: int,
177
180
  ) -> "AgentRun":
178
181
  from openai import APIError
179
182
  from pydantic_ai.messages import ModelMessagesTypeAdapter
@@ -196,7 +199,9 @@ async def _run_single_agent_iteration(
196
199
  # Each node represents a step in the agent's execution
197
200
  # Reference: https://ai.pydantic.dev/agents/#streaming
198
201
  try:
199
- await print_node(_get_plain_printer(ctx), agent_run, node)
202
+ await print_node(
203
+ _get_plain_printer(ctx), agent_run, node, log_indent_level
204
+ )
200
205
  except APIError as e:
201
206
  # Extract detailed error information from the response
202
207
  error_details = extract_api_error_details(e)
@@ -152,7 +152,7 @@ async def summarize_history(
152
152
  ],
153
153
  )
154
154
  try:
155
- ctx.print(stylize_faint("📝 Summarize Conversation >>>"), plain=True)
155
+ ctx.print(stylize_faint(" 📝 Rollup Conversation"), plain=True)
156
156
  summary_run = await run_agent_iteration(
157
157
  ctx=ctx,
158
158
  agent=summarization_agent,
@@ -160,10 +160,13 @@ async def summarize_history(
160
160
  attachments=[],
161
161
  history_list=[],
162
162
  rate_limitter=rate_limitter,
163
+ log_indent_level=2,
163
164
  )
164
165
  if summary_run and summary_run.result and summary_run.result.output:
165
166
  usage = summary_run.result.usage()
166
- ctx.print(stylize_faint(f"📝 Summarization Token: {usage}"), plain=True)
167
+ ctx.print(
168
+ stylize_faint(f" 📝 Rollup Conversation Token: {usage}"), plain=True
169
+ )
167
170
  ctx.print(plain=True)
168
171
  ctx.log_info("History summarized and updated.")
169
172
  else:
@@ -0,0 +1,175 @@
1
+ import json
2
+ from collections.abc import Callable
3
+ from typing import Any
4
+
5
+ from zrb.util.cli.style import stylize_faint
6
+
7
+
8
+ async def print_node(
9
+ print_func: Callable, agent_run: Any, node: Any, log_indent_level: int = 0
10
+ ):
11
+ """Prints the details of an agent execution node using a provided print function."""
12
+ from pydantic_ai import Agent
13
+ from pydantic_ai.messages import (
14
+ FinalResultEvent,
15
+ FunctionToolCallEvent,
16
+ FunctionToolResultEvent,
17
+ PartDeltaEvent,
18
+ PartStartEvent,
19
+ TextPartDelta,
20
+ ThinkingPartDelta,
21
+ ToolCallPartDelta,
22
+ )
23
+
24
+ if Agent.is_user_prompt_node(node):
25
+ print_func(_format_header("🔠 Receiving input...", log_indent_level))
26
+ elif Agent.is_model_request_node(node):
27
+ # A model request node => We can stream tokens from the model's request
28
+ print_func(_format_header("🧠 Processing...", log_indent_level))
29
+ # Reference: https://ai.pydantic.dev/agents/#streaming
30
+ async with node.stream(agent_run.ctx) as request_stream:
31
+ is_streaming = False
32
+ async for event in request_stream:
33
+ if isinstance(event, PartStartEvent) and event.part:
34
+ if is_streaming:
35
+ print_func("")
36
+ content = _get_event_part_content(event)
37
+ print_func(_format_content(content, log_indent_level), end="")
38
+ is_streaming = True
39
+ elif isinstance(event, PartDeltaEvent):
40
+ if isinstance(event.delta, TextPartDelta) or isinstance(
41
+ event.delta, ThinkingPartDelta
42
+ ):
43
+ content_delta = event.delta.content_delta
44
+ print_func(
45
+ _format_stream_content(content_delta, log_indent_level),
46
+ end="",
47
+ )
48
+ elif isinstance(event.delta, ToolCallPartDelta):
49
+ args_delta = event.delta.args_delta
50
+ print_func(
51
+ _format_stream_content(args_delta, log_indent_level), end=""
52
+ )
53
+ is_streaming = True
54
+ elif isinstance(event, FinalResultEvent) and event.tool_name:
55
+ if is_streaming:
56
+ print_func("")
57
+ tool_name = event.tool_name
58
+ print_func(
59
+ _format_content(
60
+ f"Result: tool_name={tool_name}", log_indent_level
61
+ )
62
+ )
63
+ is_streaming = False
64
+ if is_streaming:
65
+ print_func("")
66
+ elif Agent.is_call_tools_node(node):
67
+ # A handle-response node => The model returned some data, potentially calls a tool
68
+ print_func(_format_header("🧰 Calling Tool...", log_indent_level))
69
+ async with node.stream(agent_run.ctx) as handle_stream:
70
+ async for event in handle_stream:
71
+ if isinstance(event, FunctionToolCallEvent):
72
+ args = _get_event_part_args(event)
73
+ call_id = event.part.tool_call_id
74
+ tool_name = event.part.tool_name
75
+ print_func(
76
+ _format_content(
77
+ f"{call_id} | Call {tool_name} {args}", log_indent_level
78
+ )
79
+ )
80
+ elif isinstance(event, FunctionToolResultEvent):
81
+ call_id = event.tool_call_id
82
+ result_content = event.result.content
83
+ print_func(
84
+ _format_content(
85
+ f"{call_id} | {result_content}", log_indent_level
86
+ )
87
+ )
88
+ elif Agent.is_end_node(node):
89
+ # Once an End node is reached, the agent run is complete
90
+ print_func(_format_header("✅ Completed...", log_indent_level))
91
+
92
+
93
+ def _format_header(text: str, log_indent_level: int = 0) -> str:
94
+ return _format(
95
+ text,
96
+ base_indent=2,
97
+ first_indent=0,
98
+ indent=0,
99
+ log_indent_level=log_indent_level,
100
+ )
101
+
102
+
103
+ def _format_content(text: str, log_indent_level: int = 0) -> str:
104
+ return _format(
105
+ text,
106
+ base_indent=2,
107
+ first_indent=3,
108
+ indent=3,
109
+ log_indent_level=log_indent_level,
110
+ )
111
+
112
+
113
+ def _format_stream_content(text: str, log_indent_level: int = 0) -> str:
114
+ return _format(
115
+ text,
116
+ base_indent=2,
117
+ indent=3,
118
+ log_indent_level=log_indent_level,
119
+ is_stream=True,
120
+ )
121
+
122
+
123
+ def _format(
124
+ text: str,
125
+ base_indent: int = 0,
126
+ first_indent: int = 0,
127
+ indent: int = 0,
128
+ log_indent_level: int = 0,
129
+ is_stream: bool = False,
130
+ ) -> str:
131
+ line_prefix = (base_indent * (log_indent_level + 1) + indent) * " "
132
+ processed_text = text.replace("\n", f"\n{line_prefix}")
133
+ if is_stream:
134
+ return stylize_faint(processed_text)
135
+ first_line_prefix = (base_indent * (log_indent_level + 1) + first_indent) * " "
136
+ return stylize_faint(f"{first_line_prefix}{processed_text}")
137
+
138
+
139
+ def _get_event_part_args(event: Any) -> Any:
140
+ # Handle empty arguments across different providers
141
+ if event.part.args == "" or event.part.args is None:
142
+ return {}
143
+ if isinstance(event.part.args, str):
144
+ # Some providers might send "null" or "{}" as a string
145
+ if event.part.args.strip() in ["null", "{}"]:
146
+ return {}
147
+ try:
148
+ obj = json.loads(event.part.args)
149
+ if isinstance(obj, dict):
150
+ return _truncate_kwargs(obj)
151
+ except json.JSONDecodeError:
152
+ pass
153
+ # Handle dummy property if present (from our schema sanitization)
154
+ if isinstance(event.part.args, dict):
155
+ return _truncate_kwargs(event.part.args)
156
+ print(type(event.part.args))
157
+ return event.part.args
158
+
159
+
160
+ def _truncate_kwargs(kwargs: dict[str, Any]) -> dict[str, Any]:
161
+ return {key: _truncate_arg(val) for key, val in kwargs.items() if key != "_dummy"}
162
+
163
+
164
+ def _truncate_arg(arg: str, length: int = 19) -> str:
165
+ if isinstance(arg, str) and len(arg) > length:
166
+ return f"{arg[:length-4]} ..."
167
+ return arg
168
+
169
+
170
+ def _get_event_part_content(event: Any) -> str:
171
+ if not hasattr(event, "part"):
172
+ return f"{event}"
173
+ if not hasattr(event.part, "content"):
174
+ return f"{event.part}"
175
+ return getattr(event.part, "content")
@@ -93,28 +93,54 @@ def get_workflow_prompt(
93
93
  modes_attr: StrListAttr | None,
94
94
  render_modes: bool,
95
95
  ) -> str:
96
- modes = get_modes(ctx, modes_attr, render_modes)
96
+ builtin_workflow_dir = os.path.join(os.path.dirname(__file__), "default_workflow")
97
+ modes = set(get_modes(ctx, modes_attr, render_modes))
98
+
97
99
  # Get user-defined workflows
98
100
  workflows = {
99
101
  workflow_name.strip().lower(): content
100
102
  for workflow_name, content in llm_context_config.get_workflows().items()
101
103
  if workflow_name.strip().lower() in modes
102
104
  }
103
- # Get requested builtin-workflow names
105
+
106
+ # Get available builtin workflow names from the file system
107
+ available_builtin_workflow_names = set()
108
+ try:
109
+ for filename in os.listdir(builtin_workflow_dir):
110
+ if filename.endswith(".md"):
111
+ available_builtin_workflow_names.add(filename[:-3].lower())
112
+ except FileNotFoundError:
113
+ # Handle case where the directory might not exist
114
+ ctx.log_error(
115
+ f"Warning: Default workflow directory not found at {builtin_workflow_dir}"
116
+ )
117
+ except Exception as e:
118
+ # Catch other potential errors during directory listing
119
+ ctx.log_error(f"Error listing default workflows: {e}")
120
+
121
+ # Determine which builtin workflows are requested and not already loaded
104
122
  requested_builtin_workflow_names = [
105
- workflow_name.lower()
106
- for workflow_name in ("coding", "copywriting", "researching")
107
- if workflow_name.lower() in modes and workflow_name.lower() not in workflows
123
+ workflow_name
124
+ for workflow_name in available_builtin_workflow_names
125
+ if workflow_name in modes and workflow_name not in workflows
108
126
  ]
109
- # add builtin-workflows if requested
127
+
128
+ # Add builtin-workflows if requested
110
129
  if len(requested_builtin_workflow_names) > 0:
111
- dir_path = os.path.dirname(__file__)
112
130
  for workflow_name in requested_builtin_workflow_names:
113
131
  workflow_file_path = os.path.join(
114
- dir_path, "default_workflow", f"{workflow_name}.md"
132
+ builtin_workflow_dir, f"{workflow_name}.md"
115
133
  )
116
- with open(workflow_file_path, "r") as f:
117
- workflows[workflow_name] = f.read()
134
+ try:
135
+ with open(workflow_file_path, "r") as f:
136
+ workflows[workflow_name] = f.read()
137
+ except FileNotFoundError:
138
+ ctx.log_error(
139
+ f"Warning: Builtin workflow file not found: {workflow_file_path}"
140
+ )
141
+ except Exception as e:
142
+ ctx.log_error(f"Error reading builtin workflow {workflow_name}: {e}")
143
+
118
144
  return "\n".join(
119
145
  [
120
146
  make_prompt_section(header.capitalize(), content)
@@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any
8
8
  from zrb.context.any_context import AnyContext
9
9
  from zrb.task.llm.error import ToolExecutionError
10
10
  from zrb.util.callable import get_callable_name
11
+ from zrb.util.cli.markdown import render_markdown
11
12
  from zrb.util.cli.style import (
12
13
  stylize_blue,
13
14
  stylize_error,
@@ -123,25 +124,21 @@ def _create_wrapper(
123
124
 
124
125
 
125
126
  async def _ask_for_approval(
126
- ctx: AnyContext, func: Callable, args: list[Any], kwargs: dict[Any]
127
+ ctx: AnyContext, func: Callable, args: list[Any], kwargs: dict[str, Any]
127
128
  ) -> tuple[bool, str]:
128
129
  func_name = get_callable_name(func)
129
- normalized_args = [stylize_green(_truncate_arg(arg)) for arg in args]
130
- normalized_kwargs = []
131
- for key, val in kwargs.items():
132
- truncated_val = _truncate_arg(f"{val}")
133
- normalized_kwargs.append(
134
- f"{stylize_yellow(key)}={stylize_green(truncated_val)}"
135
- )
136
- func_param_str = ",".join(normalized_args + normalized_kwargs)
137
- func_call_str = (
138
- f"{stylize_blue(func_name + '(')}{func_param_str}{stylize_blue(')')}"
130
+ func_call_str = _get_func_call_str(func, args, kwargs)
131
+ func_detail_param = _get_detail_func_param(args, kwargs)
132
+ confirmation_message = render_markdown(
133
+ f"Allow to run `{func_name}`? (`Yes` | `No, <reason>`)"
134
+ )
135
+ complete_confirmation_message = (
136
+ f"\n✅ >> {func_call_str}" f"\n{func_detail_param}" f"\n{confirmation_message}"
139
137
  )
140
138
  while True:
141
- ctx.print(
142
- f"✅ >> Allow to run tool: {func_call_str} (Yes | No, <reason>)", plain=True
143
- )
139
+ ctx.print(complete_confirmation_message, plain=True)
144
140
  user_input = await _read_line()
141
+ ctx.print("", plain=True)
145
142
  user_responses = [val.strip() for val in user_input.split(",", maxsplit=1)]
146
143
  while len(user_responses) < 2:
147
144
  user_responses.append("")
@@ -167,6 +164,39 @@ async def _ask_for_approval(
167
164
  continue
168
165
 
169
166
 
167
+ def _get_detail_func_param(args: list[Any], kwargs: dict[str, Any]) -> str:
168
+ markdown = "\n".join(
169
+ [_get_func_param_item(key, val) for key, val in kwargs.items()]
170
+ )
171
+ return render_markdown(markdown)
172
+
173
+
174
+ def _get_func_param_item(key: str, val: Any) -> str:
175
+ upper_key = key.upper()
176
+ val_str = f"{val}"
177
+ val_parts = val_str.split("\n")
178
+ if len(val_parts) == 1:
179
+ return f"- {upper_key} `{val}`"
180
+ lines = [f"- {upper_key}", " ```"]
181
+ for val_part in val_parts:
182
+ lines.append(f" {val_part}")
183
+ lines.append(" ```")
184
+ return "\n".join(lines)
185
+
186
+
187
+ def _get_func_call_str(func: Callable, args: list[Any], kwargs: dict[str, Any]) -> str:
188
+ func_name = get_callable_name(func)
189
+ normalized_args = [stylize_green(_truncate_arg(arg)) for arg in args]
190
+ normalized_kwargs = []
191
+ for key, val in kwargs.items():
192
+ truncated_val = _truncate_arg(f"{val}")
193
+ normalized_kwargs.append(
194
+ f"{stylize_yellow(key)}={stylize_green(truncated_val)}"
195
+ )
196
+ func_param_str = ", ".join(normalized_args + normalized_kwargs)
197
+ return f"{stylize_blue(func_name + '(')}{func_param_str}{stylize_blue(')')}"
198
+
199
+
170
200
  def _truncate_arg(arg: str, length: int = 19) -> str:
171
201
  if len(arg) > length:
172
202
  return f"{arg[:length-4]} ..."
@@ -331,7 +331,7 @@ class LLMTask(BaseTask):
331
331
  ctx.xcom[xcom_usage_key] = Xcom([])
332
332
  usage = agent_run.result.usage()
333
333
  ctx.xcom[xcom_usage_key].push(usage)
334
- ctx.print(stylize_faint(f"💸 Token: {usage}"), plain=True)
334
+ ctx.print(stylize_faint(f" 💸 Token: {usage}"), plain=True)
335
335
  return agent_run.result.output
336
336
  else:
337
337
  ctx.log_warning("Agent run did not produce a result.")
@@ -0,0 +1,12 @@
1
+ def render_markdown(markdown_text: str) -> str:
2
+ """
3
+ Renders Markdown to a string, ensuring link URLs are visible.
4
+ """
5
+ from rich.console import Console
6
+ from rich.markdown import Markdown
7
+
8
+ console = Console()
9
+ markdown = Markdown(markdown_text, hyperlinks=False)
10
+ with console.capture() as capture:
11
+ console.print(markdown)
12
+ return capture.get()
@@ -1,94 +0,0 @@
1
- from collections.abc import Callable
2
- from typing import Any
3
-
4
- from zrb.util.cli.style import stylize_faint
5
-
6
-
7
- async def print_node(print_func: Callable, agent_run: Any, node: Any):
8
- """Prints the details of an agent execution node using a provided print function."""
9
- from pydantic_ai import Agent
10
- from pydantic_ai.messages import (
11
- FinalResultEvent,
12
- FunctionToolCallEvent,
13
- FunctionToolResultEvent,
14
- PartDeltaEvent,
15
- PartStartEvent,
16
- TextPartDelta,
17
- ThinkingPartDelta,
18
- ToolCallPartDelta,
19
- )
20
-
21
- if Agent.is_user_prompt_node(node):
22
- print_func(stylize_faint("🔠 Receiving input..."))
23
- elif Agent.is_model_request_node(node):
24
- # A model request node => We can stream tokens from the model's request
25
- print_func(stylize_faint("🧠 Processing..."))
26
- # Reference: https://ai.pydantic.dev/agents/#streaming
27
- async with node.stream(agent_run.ctx) as request_stream:
28
- is_streaming = False
29
- async for event in request_stream:
30
- if isinstance(event, PartStartEvent) and event.part:
31
- if is_streaming:
32
- print_func("")
33
- print_func(
34
- stylize_faint(f" Starting part {event.index}: {event.part}"),
35
- )
36
- is_streaming = False
37
- elif isinstance(event, PartDeltaEvent):
38
- if isinstance(event.delta, TextPartDelta) or isinstance(
39
- event.delta, ThinkingPartDelta
40
- ):
41
- print_func(
42
- stylize_faint(f"{event.delta.content_delta}"),
43
- end="",
44
- )
45
- elif isinstance(event.delta, ToolCallPartDelta):
46
- print_func(
47
- stylize_faint(f"{event.delta.args_delta}"),
48
- end="",
49
- )
50
- is_streaming = True
51
- elif isinstance(event, FinalResultEvent) and event.tool_name:
52
- if is_streaming:
53
- print_func("")
54
- print_func(
55
- stylize_faint(f" Result: tool_name={event.tool_name}"),
56
- )
57
- is_streaming = False
58
- if is_streaming:
59
- print_func("")
60
- elif Agent.is_call_tools_node(node):
61
- # A handle-response node => The model returned some data, potentially calls a tool
62
- print_func(stylize_faint("🧰 Calling Tool..."))
63
- async with node.stream(agent_run.ctx) as handle_stream:
64
- async for event in handle_stream:
65
- if isinstance(event, FunctionToolCallEvent):
66
- # Handle empty arguments across different providers
67
- if event.part.args == "" or event.part.args is None:
68
- event.part.args = {}
69
- elif isinstance(
70
- event.part.args, str
71
- ) and event.part.args.strip() in ["null", "{}"]:
72
- # Some providers might send "null" or "{}" as a string
73
- event.part.args = {}
74
- # Handle dummy property if present (from our schema sanitization)
75
- if (
76
- isinstance(event.part.args, dict)
77
- and "_dummy" in event.part.args
78
- ):
79
- del event.part.args["_dummy"]
80
- print_func(
81
- stylize_faint(
82
- f" {event.part.tool_call_id} | "
83
- f"Call {event.part.tool_name} {event.part.args}"
84
- )
85
- )
86
- elif isinstance(event, FunctionToolResultEvent):
87
- print_func(
88
- stylize_faint(
89
- f" {event.tool_call_id} | {event.result.content}"
90
- )
91
- )
92
- elif Agent.is_end_node(node):
93
- # Once an End node is reached, the agent run is complete
94
- print_func(stylize_faint("✅ Completed..."))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes