zrb 1.5.7__tar.gz → 1.5.8__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 (365) hide show
  1. {zrb-1.5.7 → zrb-1.5.8}/PKG-INFO +1 -1
  2. {zrb-1.5.7 → zrb-1.5.8}/pyproject.toml +1 -1
  3. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/tool/rag.py +4 -3
  4. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/cmd_task.py +2 -1
  5. zrb-1.5.8/src/zrb/task/llm/agent.py +141 -0
  6. zrb-1.5.8/src/zrb/task/llm/config.py +83 -0
  7. zrb-1.5.8/src/zrb/task/llm/context.py +95 -0
  8. zrb-1.5.7/src/zrb/task/llm/context_enricher.py → zrb-1.5.8/src/zrb/task/llm/context_enrichment.py +52 -6
  9. zrb-1.5.8/src/zrb/task/llm/history.py +242 -0
  10. zrb-1.5.8/src/zrb/task/llm/history_summarization.py +170 -0
  11. zrb-1.5.8/src/zrb/task/llm/prompt.py +87 -0
  12. zrb-1.5.8/src/zrb/task/llm/typing.py +3 -0
  13. zrb-1.5.8/src/zrb/task/llm_task.py +320 -0
  14. zrb-1.5.7/src/zrb/task/llm/agent_runner.py +0 -53
  15. zrb-1.5.7/src/zrb/task/llm/default_context.py +0 -45
  16. zrb-1.5.7/src/zrb/task/llm/history.py +0 -92
  17. zrb-1.5.7/src/zrb/task/llm/history_summarizer.py +0 -71
  18. zrb-1.5.7/src/zrb/task/llm_task.py +0 -505
  19. {zrb-1.5.7 → zrb-1.5.8}/README.md +0 -0
  20. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/__init__.py +0 -0
  21. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/__main__.py +0 -0
  22. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/attr/__init__.py +0 -0
  23. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/attr/type.py +0 -0
  24. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/__init__.py +0 -0
  25. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/base64.py +0 -0
  26. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/git.py +0 -0
  27. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/git_subtree.py +0 -0
  28. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/group.py +0 -0
  29. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/history.py +0 -0
  30. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/input.py +0 -0
  31. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/llm_chat.py +0 -0
  32. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/previous-session.js +0 -0
  33. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/tool/api.py +0 -0
  34. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/tool/cli.py +0 -0
  35. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/tool/file.py +0 -0
  36. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/llm/tool/web.py +0 -0
  37. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/md5.py +0 -0
  38. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/__init__.py +0 -0
  39. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
  40. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +0 -0
  41. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.coveragerc +0 -0
  42. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
  43. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
  44. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
  45. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
  46. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
  47. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_util.py +0 -0
  48. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
  49. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +0 -0
  50. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
  51. {zrb-1.5.7 → zrb-1.5.8}/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
  52. {zrb-1.5.7 → zrb-1.5.8}/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
  53. {zrb-1.5.7 → zrb-1.5.8}/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
  54. {zrb-1.5.7 → zrb-1.5.8}/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
  55. {zrb-1.5.7 → zrb-1.5.8}/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
  56. {zrb-1.5.7 → zrb-1.5.8}/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
  57. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +0 -0
  58. {zrb-1.5.7 → zrb-1.5.8}/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
  59. {zrb-1.5.7 → zrb-1.5.8}/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
  60. {zrb-1.5.7 → zrb-1.5.8}/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
  61. {zrb-1.5.7 → zrb-1.5.8}/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
  62. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
  63. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
  64. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/navigation_config_file.py +0 -0
  65. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
  66. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
  67. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +0 -0
  68. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
  69. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
  70. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
  71. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
  72. {zrb-1.5.7 → zrb-1.5.8}/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
  73. {zrb-1.5.7 → zrb-1.5.8}/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
  74. {zrb-1.5.7 → zrb-1.5.8}/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
  75. {zrb-1.5.7 → zrb-1.5.8}/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
  76. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
  77. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
  78. {zrb-1.5.7 → zrb-1.5.8}/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
  79. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
  80. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
  81. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
  82. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
  83. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
  84. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/navigation_config_file.py +0 -0
  85. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +0 -0
  86. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +0 -0
  87. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +0 -0
  88. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
  89. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
  90. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
  91. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +0 -0
  92. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +0 -0
  93. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
  94. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +0 -0
  95. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
  96. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
  97. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
  98. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
  99. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
  100. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
  101. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
  102. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +0 -0
  103. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
  104. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
  105. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
  106. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
  107. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +0 -0
  108. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
  109. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
  110. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
  111. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
  112. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
  113. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -0
  114. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/8ed025bcc845_create_permissions.py +0 -0
  115. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +0 -0
  116. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +0 -0
  117. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
  118. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
  119. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +0 -0
  120. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
  121. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
  122. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
  123. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
  124. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
  125. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +0 -0
  126. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
  127. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
  128. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +0 -0
  129. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
  130. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
  131. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -0
  132. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +0 -0
  133. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
  134. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -0
  135. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -0
  136. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
  137. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/config/navigation.py +0 -0
  138. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
  139. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
  140. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
  141. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
  142. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
  143. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
  144. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/schema/navigation.py +0 -0
  145. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +0 -0
  146. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/auth.py +0 -0
  147. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
  148. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/permission.html +0 -0
  149. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/role.html +0 -0
  150. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/auth/user.html +0 -0
  151. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
  152. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
  153. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/login.html +0 -0
  154. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/logout.html +0 -0
  155. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/common/util.js +0 -0
  156. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/style.css +0 -0
  157. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/crud/util.js +0 -0
  158. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/pico-style.css +0 -0
  159. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/script.js +0 -0
  160. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/default/style.css +0 -0
  161. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  162. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  163. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  164. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
  165. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
  166. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
  167. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
  168. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
  169. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
  170. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
  171. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
  172. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
  173. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
  174. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
  175. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
  176. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
  177. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
  178. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
  179. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
  180. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
  181. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
  182. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
  183. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
  184. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
  185. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +0 -0
  186. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
  187. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +0 -0
  188. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +0 -0
  189. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +0 -0
  190. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
  191. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/_util/access_token.py +0 -0
  192. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_create_permission.py +0 -0
  193. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_delete_permission.py +0 -0
  194. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_read_permission.py +0 -0
  195. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/permission/test_update_permission.py +0 -0
  196. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/auth/test_user_session.py +0 -0
  197. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_health_and_readiness.py +0 -0
  198. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_homepage.py +0 -0
  199. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test/test_not_found_error.py +0 -0
  200. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/test.sh +0 -0
  201. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
  202. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/create/__init__.py +0 -0
  203. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/create/project-template/README.md +0 -0
  204. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
  205. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/project/create/project_task.py +0 -0
  206. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/python.py +0 -0
  207. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/random.py +0 -0
  208. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
  209. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
  210. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/common_input.py +0 -0
  211. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
  212. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
  213. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
  214. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
  215. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/ubuntu.py +0 -0
  216. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
  217. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
  218. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
  219. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/shell/__init__.py +0 -0
  220. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
  221. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
  222. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
  223. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
  224. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/builtin/todo.py +0 -0
  225. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/callback/__init__.py +0 -0
  226. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/callback/any_callback.py +0 -0
  227. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/callback/callback.py +0 -0
  228. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/cmd/__init__.py +0 -0
  229. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/cmd/cmd_result.py +0 -0
  230. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/cmd/cmd_val.py +0 -0
  231. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/config.py +0 -0
  232. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/content_transformer/__init__.py +0 -0
  233. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/content_transformer/any_content_transformer.py +0 -0
  234. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/content_transformer/content_transformer.py +0 -0
  235. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/context/__init__.py +0 -0
  236. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/context/any_context.py +0 -0
  237. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/context/any_shared_context.py +0 -0
  238. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/context/context.py +0 -0
  239. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/context/shared_context.py +0 -0
  240. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/dot_dict/__init__.py +0 -0
  241. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/dot_dict/dot_dict.py +0 -0
  242. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/env/__init__.py +0 -0
  243. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/env/any_env.py +0 -0
  244. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/env/env.py +0 -0
  245. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/env/env_file.py +0 -0
  246. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/env/env_map.py +0 -0
  247. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/group/__init__.py +0 -0
  248. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/group/any_group.py +0 -0
  249. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/group/group.py +0 -0
  250. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/__init__.py +0 -0
  251. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/any_input.py +0 -0
  252. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/base_input.py +0 -0
  253. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/bool_input.py +0 -0
  254. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/float_input.py +0 -0
  255. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/int_input.py +0 -0
  256. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/option_input.py +0 -0
  257. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/password_input.py +0 -0
  258. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/str_input.py +0 -0
  259. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/input/text_input.py +0 -0
  260. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/llm_config.py +0 -0
  261. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/__init__.py +0 -0
  262. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/cli.py +0 -0
  263. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/common_util.py +0 -0
  264. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_app.py +0 -0
  265. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_config/config.py +0 -0
  266. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_config/config_factory.py +0 -0
  267. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/__init__.py +0 -0
  268. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/docs_route.py +0 -0
  269. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
  270. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
  271. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/error_page/view.html +0 -0
  272. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
  273. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
  274. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/home_page/view.html +0 -0
  275. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/login_api_route.py +0 -0
  276. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
  277. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/login_page/view.html +0 -0
  278. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/logout_api_route.py +0 -0
  279. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
  280. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/logout_page/view.html +0 -0
  281. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
  282. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
  283. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
  284. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
  285. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
  286. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
  287. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
  288. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
  289. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/common.css +0 -0
  290. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
  291. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
  292. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
  293. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
  294. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
  295. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
  296. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
  297. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
  298. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/static/static_route.py +0 -0
  299. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
  300. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
  301. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_schema/session.py +0 -0
  302. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_schema/token.py +0 -0
  303. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_schema/user.py +0 -0
  304. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_util/cookie.py +0 -0
  305. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_util/html.py +0 -0
  306. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_util/token.py +0 -0
  307. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/runner/web_util/user.py +0 -0
  308. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session/__init__.py +0 -0
  309. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session/any_session.py +0 -0
  310. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session/session.py +0 -0
  311. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_log/__init__.py +0 -0
  312. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_log/session_state_log.py +0 -0
  313. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_logger/__init__.py +0 -0
  314. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
  315. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
  316. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
  317. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/__init__.py +0 -0
  318. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/any_task.py +0 -0
  319. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/base_task.py +0 -0
  320. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/base_trigger.py +0 -0
  321. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/http_check.py +0 -0
  322. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/llm/__init__.py +0 -0
  323. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/llm/error.py +0 -0
  324. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/llm/print_node.py +0 -0
  325. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/llm/tool_wrapper.py +0 -0
  326. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/make_task.py +0 -0
  327. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/rsync_task.py +0 -0
  328. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/scaffolder.py +0 -0
  329. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/scheduler.py +0 -0
  330. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/task.py +0 -0
  331. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task/tcp_check.py +0 -0
  332. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task_status/__init__.py +0 -0
  333. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/task_status/task_status.py +0 -0
  334. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/__init__.py +0 -0
  335. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/attr.py +0 -0
  336. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cli/__init__.py +0 -0
  337. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cli/style.py +0 -0
  338. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cli/subcommand.py +0 -0
  339. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cmd/__init__.py +0 -0
  340. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cmd/command.py +0 -0
  341. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cmd/remote.py +0 -0
  342. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/__init__.py +0 -0
  343. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modification_mode.py +0 -0
  344. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_class.py +0 -0
  345. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_class_parent.py +0 -0
  346. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_class_property.py +0 -0
  347. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_dict.py +0 -0
  348. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_function.py +0 -0
  349. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_function_call.py +0 -0
  350. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_method.py +0 -0
  351. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/codemod/modify_module.py +0 -0
  352. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/cron.py +0 -0
  353. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/file.py +0 -0
  354. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/git.py +0 -0
  355. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/git_subtree.py +0 -0
  356. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/group.py +0 -0
  357. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/load.py +0 -0
  358. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/run.py +0 -0
  359. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/string/__init__.py +0 -0
  360. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/string/conversion.py +0 -0
  361. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/string/format.py +0 -0
  362. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/string/name.py +0 -0
  363. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/util/todo.py +0 -0
  364. {zrb-1.5.7 → zrb-1.5.8}/src/zrb/xcom/__init__.py +0 -0
  365. {zrb-1.5.7 → zrb-1.5.8}/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.7
3
+ Version: 1.5.8
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "zrb"
3
- version = "1.5.7"
3
+ version = "1.5.8"
4
4
  description = "Your Automation Powerhouse"
5
5
  authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
6
6
  license = "AGPL-3.0-or-later"
@@ -152,13 +152,14 @@ def create_rag_from_directory(
152
152
 
153
153
  retrieve.__name__ = tool_name
154
154
  retrieve.__doc__ = dedent(
155
- f"""{tool_description}
155
+ f"""
156
+ {tool_description}
156
157
  Args:
157
158
  query (str): The user query to search for in documents.
158
159
  Returns:
159
160
  str: JSON string with search results: {{"ids": [...], "documents": [...], ...}}
160
- """
161
- )
161
+ """
162
+ ).strip()
162
163
  return retrieve
163
164
 
164
165
 
@@ -130,7 +130,8 @@ class CmdTask(BaseTask):
130
130
  partial(ctx.print, plain=True) if self._should_plain_print else ctx.print
131
131
  )
132
132
  xcom_pid_key = f"{self.name}-pid"
133
- ctx.xcom[xcom_pid_key] = Xcom([])
133
+ if xcom_pid_key not in ctx.xcom:
134
+ ctx.xcom[xcom_pid_key] = Xcom([])
134
135
  cmd_result, return_code = await run_command(
135
136
  cmd=[shell, shell_flag, cmd_script],
136
137
  cwd=cwd,
@@ -0,0 +1,141 @@
1
+ import inspect
2
+ from collections.abc import Callable
3
+
4
+ from openai import APIError
5
+ from pydantic_ai import Agent, Tool
6
+ from pydantic_ai.agent import AgentRun
7
+ from pydantic_ai.mcp import MCPServer
8
+ from pydantic_ai.messages import ModelMessagesTypeAdapter
9
+ from pydantic_ai.models import Model
10
+ from pydantic_ai.settings import ModelSettings
11
+
12
+ from zrb.context.any_context import AnyContext
13
+ from zrb.context.any_shared_context import AnySharedContext
14
+ from zrb.task.llm.error import extract_api_error_details
15
+ from zrb.task.llm.print_node import print_node
16
+ from zrb.task.llm.tool_wrapper import wrap_tool
17
+ from zrb.task.llm.typing import ListOfDict
18
+
19
+ ToolOrCallable = Tool | Callable
20
+
21
+
22
+ def create_agent_instance(
23
+ ctx: AnyContext,
24
+ model: str | Model | None,
25
+ system_prompt: str,
26
+ model_settings: ModelSettings | None,
27
+ tools_attr: (
28
+ list[ToolOrCallable] | Callable[[AnySharedContext], list[ToolOrCallable]]
29
+ ),
30
+ additional_tools: list[ToolOrCallable],
31
+ mcp_servers_attr: list[MCPServer] | Callable[[AnySharedContext], list[MCPServer]],
32
+ additional_mcp_servers: list[MCPServer],
33
+ ) -> Agent:
34
+ """Creates a new Agent instance with configured tools and servers."""
35
+ tools_or_callables = list(tools_attr(ctx) if callable(tools_attr) else tools_attr)
36
+ tools_or_callables.extend(additional_tools)
37
+ tools = []
38
+ for tool_or_callable in tools_or_callables:
39
+ if isinstance(tool_or_callable, Tool):
40
+ tools.append(tool_or_callable)
41
+ else:
42
+ # Inspect original callable for 'ctx' parameter (pydantic-ai context)
43
+ original_sig = inspect.signature(tool_or_callable)
44
+ takes_ctx = "ctx" in original_sig.parameters
45
+ wrapped_tool = wrap_tool(tool_or_callable)
46
+ tools.append(Tool(wrapped_tool, takes_ctx=takes_ctx))
47
+
48
+ mcp_servers = list(
49
+ mcp_servers_attr(ctx) if callable(mcp_servers_attr) else mcp_servers_attr
50
+ )
51
+ mcp_servers.extend(additional_mcp_servers)
52
+
53
+ return Agent(
54
+ model=model,
55
+ system_prompt=system_prompt,
56
+ tools=tools,
57
+ mcp_servers=mcp_servers,
58
+ model_settings=model_settings,
59
+ retries=3, # Consider making retries configurable?
60
+ )
61
+
62
+
63
+ def get_agent(
64
+ ctx: AnyContext,
65
+ agent_attr: Agent | Callable[[AnySharedContext], Agent] | None,
66
+ model: str | Model | None,
67
+ system_prompt: str,
68
+ model_settings: ModelSettings | None,
69
+ tools_attr: (
70
+ list[ToolOrCallable] | Callable[[AnySharedContext], list[ToolOrCallable]]
71
+ ),
72
+ additional_tools: list[ToolOrCallable],
73
+ mcp_servers_attr: list[MCPServer] | Callable[[AnySharedContext], list[MCPServer]],
74
+ additional_mcp_servers: list[MCPServer],
75
+ ) -> Agent:
76
+ """Retrieves the configured Agent instance or creates one if necessary."""
77
+ if isinstance(agent_attr, Agent):
78
+ return agent_attr
79
+ if callable(agent_attr):
80
+ agent_instance = agent_attr(ctx)
81
+ if not isinstance(agent_instance, Agent):
82
+ err_msg = (
83
+ "Callable agent factory did not return an Agent instance, "
84
+ f"got: {type(agent_instance)}"
85
+ )
86
+ raise TypeError(err_msg)
87
+ return agent_instance
88
+ # If no agent provided, create one using the configuration
89
+ return create_agent_instance(
90
+ ctx=ctx,
91
+ model=model,
92
+ system_prompt=system_prompt,
93
+ model_settings=model_settings,
94
+ tools_attr=tools_attr,
95
+ additional_tools=additional_tools,
96
+ mcp_servers_attr=mcp_servers_attr,
97
+ additional_mcp_servers=additional_mcp_servers,
98
+ )
99
+
100
+
101
+ async def run_agent_iteration(
102
+ ctx: AnyContext,
103
+ agent: Agent,
104
+ user_prompt: str,
105
+ history_list: ListOfDict,
106
+ ) -> AgentRun:
107
+ """
108
+ Runs a single iteration of the agent execution loop.
109
+
110
+ Args:
111
+ ctx: The task context.
112
+ agent: The Pydantic AI agent instance.
113
+ user_prompt: The user's input prompt.
114
+ history_list: The current conversation history.
115
+
116
+ Returns:
117
+ The agent run result object.
118
+
119
+ Raises:
120
+ Exception: If any error occurs during agent execution.
121
+ """
122
+ async with agent.run_mcp_servers():
123
+ async with agent.iter(
124
+ user_prompt=user_prompt,
125
+ message_history=ModelMessagesTypeAdapter.validate_python(history_list),
126
+ ) as agent_run:
127
+ async for node in agent_run:
128
+ # Each node represents a step in the agent's execution
129
+ # Reference: https://ai.pydantic.dev/agents/#streaming
130
+ try:
131
+ await print_node(ctx.print, agent_run, node)
132
+ except APIError as e:
133
+ # Extract detailed error information from the response
134
+ error_details = extract_api_error_details(e)
135
+ ctx.log_error(f"API Error: {error_details}")
136
+ raise
137
+ except Exception as e:
138
+ ctx.log_error(f"Error processing node: {str(e)}")
139
+ ctx.log_error(f"Error type: {type(e).__name__}")
140
+ raise
141
+ return agent_run
@@ -0,0 +1,83 @@
1
+ from typing import Callable
2
+
3
+ from pydantic_ai.models import Model
4
+ from pydantic_ai.settings import ModelSettings
5
+
6
+ from zrb.attr.type import StrAttr, fstring
7
+ from zrb.context.any_context import AnyContext
8
+ from zrb.context.any_shared_context import AnySharedContext
9
+ from zrb.llm_config import LLMConfig
10
+ from zrb.llm_config import llm_config as default_llm_config
11
+ from zrb.util.attr import get_attr
12
+
13
+
14
+ def get_model_settings(
15
+ ctx: AnyContext,
16
+ model_settings_attr: (
17
+ ModelSettings | Callable[[AnySharedContext], ModelSettings] | None
18
+ ),
19
+ ) -> ModelSettings | None:
20
+ """Gets the model settings, resolving callables if necessary."""
21
+ if callable(model_settings_attr):
22
+ return model_settings_attr(ctx)
23
+ return model_settings_attr
24
+
25
+
26
+ def get_model_base_url(
27
+ ctx: AnyContext,
28
+ model_base_url_attr: StrAttr | None,
29
+ render_model_base_url: bool,
30
+ ) -> str | None:
31
+ """Gets the model base URL, rendering if configured."""
32
+ base_url = get_attr(
33
+ ctx, model_base_url_attr, None, auto_render=render_model_base_url
34
+ )
35
+ if isinstance(base_url, str) or base_url is None:
36
+ return base_url
37
+ raise ValueError(f"Invalid model base URL: {base_url}")
38
+
39
+
40
+ def get_model_api_key(
41
+ ctx: AnyContext,
42
+ model_api_key_attr: StrAttr | None,
43
+ render_model_api_key: bool,
44
+ ) -> str | None:
45
+ """Gets the model API key, rendering if configured."""
46
+ api_key = get_attr(ctx, model_api_key_attr, None, auto_render=render_model_api_key)
47
+ if isinstance(api_key, str) or api_key is None:
48
+ return api_key
49
+ raise ValueError(f"Invalid model API key: {api_key}")
50
+
51
+
52
+ def get_model(
53
+ ctx: AnyContext,
54
+ model_attr: Callable[[AnySharedContext], Model | str | fstring] | Model | None,
55
+ render_model: bool,
56
+ model_base_url_attr: StrAttr | None,
57
+ render_model_base_url: bool,
58
+ model_api_key_attr: StrAttr | None,
59
+ render_model_api_key: bool,
60
+ ) -> str | Model | None:
61
+ """Gets the model instance or name, handling defaults and configuration."""
62
+ model = get_attr(ctx, model_attr, None, auto_render=render_model)
63
+ if model is None:
64
+ return default_llm_config.get_default_model()
65
+ if isinstance(model, str):
66
+ model_base_url = get_model_base_url(
67
+ ctx, model_base_url_attr, render_model_base_url
68
+ )
69
+ model_api_key = get_model_api_key(ctx, model_api_key_attr, render_model_api_key)
70
+ llm_config = LLMConfig(
71
+ default_model_name=model,
72
+ default_base_url=model_base_url,
73
+ default_api_key=model_api_key,
74
+ )
75
+ if model_base_url is None and model_api_key is None:
76
+ default_model_provider = default_llm_config.get_default_model_provider()
77
+ if default_model_provider is not None:
78
+ llm_config.set_default_provider(default_model_provider)
79
+ return llm_config.get_default_model()
80
+ # If it's already a Model instance, return it directly
81
+ if isinstance(model, Model):
82
+ return model
83
+ raise ValueError(f"Invalid model type resolved: {type(model)}, value: {model}")
@@ -0,0 +1,95 @@
1
+ import datetime
2
+ import inspect
3
+ import os
4
+ import platform
5
+ import re
6
+ from collections.abc import Callable
7
+ from typing import Any
8
+
9
+ from zrb.context.any_context import AnyContext
10
+ from zrb.context.any_shared_context import AnySharedContext
11
+ from zrb.util.attr import get_attr
12
+ from zrb.util.file import read_dir, read_file_with_line_numbers
13
+
14
+
15
+ def get_default_context(user_message: str) -> dict[str, Any]:
16
+ """Generates default context including time, OS, and file references."""
17
+ references = re.findall(r"@(\S+)", user_message)
18
+ current_references = []
19
+
20
+ for ref in references:
21
+ resource_path = os.path.abspath(os.path.expanduser(ref))
22
+ if os.path.isfile(resource_path):
23
+ content = read_file_with_line_numbers(resource_path)
24
+ current_references.append(
25
+ {
26
+ "reference": ref,
27
+ "name": resource_path,
28
+ "type": "file",
29
+ "note": "line numbers are included in the content",
30
+ "content": content,
31
+ }
32
+ )
33
+ elif os.path.isdir(resource_path):
34
+ content = read_dir(resource_path)
35
+ current_references.append(
36
+ {
37
+ "reference": ref,
38
+ "name": resource_path,
39
+ "type": "directory",
40
+ "content": content,
41
+ }
42
+ )
43
+
44
+ return {
45
+ "current_time": datetime.datetime.now().isoformat(),
46
+ "current_working_directory": os.getcwd(),
47
+ "current_os": platform.system(),
48
+ "os_version": platform.version(),
49
+ "python_version": platform.python_version(),
50
+ "current_references": current_references,
51
+ }
52
+
53
+
54
+ def get_conversation_context(
55
+ ctx: AnyContext,
56
+ conversation_context_attr: (
57
+ dict[str, Any] | Callable[[AnySharedContext], dict[str, Any]] | None
58
+ ),
59
+ ) -> dict[str, Any]:
60
+ """
61
+ Retrieves the conversation context.
62
+ If a value in the context dict is callable, it executes it with ctx.
63
+ """
64
+ raw_context = get_attr(
65
+ ctx, conversation_context_attr, {}, auto_render=False
66
+ ) # Context usually shouldn't be rendered
67
+ if not isinstance(raw_context, dict):
68
+ ctx.log_warning(
69
+ f"Conversation context resolved to type {type(raw_context)}, "
70
+ "expected dict. Returning empty context."
71
+ )
72
+ return {}
73
+ # If conversation_context contains callable value, execute them.
74
+ processed_context: dict[str, Any] = {}
75
+ for key, value in raw_context.items():
76
+ if callable(value):
77
+ try:
78
+ # Check if the callable expects 'ctx'
79
+ sig = inspect.signature(value)
80
+ if "ctx" in sig.parameters:
81
+ processed_context[key] = value(ctx)
82
+ else:
83
+ processed_context[key] = value()
84
+ except Exception as e:
85
+ ctx.log_warning(
86
+ f"Error executing callable for context key '{key}': {e}. "
87
+ "Skipping."
88
+ )
89
+ processed_context[key] = None
90
+ else:
91
+ processed_context[key] = value
92
+ return processed_context
93
+
94
+
95
+ # Context enrichment functions moved to context_enrichment.py
@@ -8,12 +8,13 @@ from pydantic_ai import Agent
8
8
  from pydantic_ai.models import Model
9
9
  from pydantic_ai.settings import ModelSettings
10
10
 
11
+ from zrb.attr.type import BoolAttr
11
12
  from zrb.context.any_context import AnyContext
12
- from zrb.task.llm.agent_runner import run_agent_iteration
13
- from zrb.task.llm.history import ListOfDict
13
+ from zrb.task.llm.agent import run_agent_iteration
14
+ from zrb.task.llm.typing import ListOfDict
15
+ from zrb.util.attr import get_bool_attr
14
16
 
15
17
 
16
- # Configuration model for context enrichment
17
18
  class EnrichmentConfig(BaseModel):
18
19
  model_config = {"arbitrary_types_allowed": True}
19
20
  model: Model | str | None = None
@@ -74,13 +75,58 @@ async def enrich_context(
74
75
  response = enrichment_run.result.data.response
75
76
  if response:
76
77
  conversation_context.update(response)
77
- ctx.log_info("History summarized and added/updated in context.")
78
+ ctx.log_info("Context enriched based on history.")
78
79
  ctx.log_info(
79
- f"New conversation context: {json.dumps(conversation_context)}"
80
+ f"Updated conversation context: {json.dumps(conversation_context)}"
80
81
  )
81
82
  else:
82
- ctx.log_warning("Context enrichment return no data")
83
+ ctx.log_warning("Context enrichment returned no data")
83
84
  except Exception as e:
84
85
  ctx.log_warning(f"Error during context enrichment LLM call: {e}")
85
86
  traceback.print_exc()
86
87
  return conversation_context
88
+
89
+
90
+ def should_enrich_context(
91
+ ctx: AnyContext,
92
+ history_list: ListOfDict,
93
+ should_enrich_context_attr: BoolAttr,
94
+ render_enrich_context: bool,
95
+ ) -> bool:
96
+ """Determines if context enrichment should occur based on history and config."""
97
+ if len(history_list) == 0:
98
+ return False
99
+ return get_bool_attr(
100
+ ctx,
101
+ should_enrich_context_attr,
102
+ True, # Default to True if not specified
103
+ auto_render=render_enrich_context,
104
+ )
105
+
106
+
107
+ async def maybe_enrich_context(
108
+ ctx: AnyContext,
109
+ history_list: ListOfDict,
110
+ conversation_context: dict[str, Any],
111
+ should_enrich_context_attr: BoolAttr,
112
+ render_enrich_context: bool,
113
+ model: str | Model | None,
114
+ model_settings: ModelSettings | None,
115
+ context_enrichment_prompt: str,
116
+ ) -> dict[str, Any]:
117
+ """Enriches context based on history if enabled."""
118
+ if should_enrich_context(
119
+ ctx, history_list, should_enrich_context_attr, render_enrich_context
120
+ ):
121
+ # Use the enrich_context function now defined in this file
122
+ return await enrich_context(
123
+ ctx=ctx,
124
+ config=EnrichmentConfig(
125
+ model=model,
126
+ settings=model_settings,
127
+ prompt=context_enrichment_prompt,
128
+ ),
129
+ conversation_context=conversation_context,
130
+ history_list=history_list,
131
+ )
132
+ return conversation_context
@@ -0,0 +1,242 @@
1
+ import json
2
+ import os
3
+ from collections.abc import Callable
4
+ from typing import Any, Optional
5
+
6
+ from pydantic import BaseModel
7
+
8
+ from zrb.attr.type import StrAttr
9
+ from zrb.context.any_context import AnyContext
10
+ from zrb.context.any_shared_context import AnySharedContext
11
+ from zrb.task.llm.typing import ListOfDict
12
+ from zrb.util.attr import get_str_attr
13
+ from zrb.util.file import read_file, write_file
14
+ from zrb.util.run import run_async
15
+
16
+
17
+ # Define the new ConversationHistoryData model
18
+ class ConversationHistoryData(BaseModel):
19
+ context: dict[str, Any] = {}
20
+ history: ListOfDict = []
21
+
22
+ @classmethod
23
+ async def read_from_sources(
24
+ cls,
25
+ ctx: AnyContext,
26
+ reader: Callable[[AnyContext], dict[str, Any] | list | None] | None,
27
+ file_path: str | None,
28
+ ) -> Optional["ConversationHistoryData"]:
29
+ """Reads conversation history from various sources with priority."""
30
+ # Priority 1: Reader function
31
+ if reader:
32
+ try:
33
+ raw_data = await run_async(reader(ctx))
34
+ if raw_data:
35
+ instance = cls.parse_and_validate(ctx, raw_data, "reader")
36
+ if instance:
37
+ return instance
38
+ except Exception as e:
39
+ ctx.log_warning(
40
+ f"Error executing conversation history reader: {e}. Ignoring."
41
+ )
42
+ # Priority 2: History file
43
+ if file_path and os.path.isfile(file_path):
44
+ try:
45
+ content = read_file(file_path)
46
+ raw_data = json.loads(content)
47
+ instance = cls.parse_and_validate(ctx, raw_data, f"file '{file_path}'")
48
+ if instance:
49
+ return instance
50
+ except json.JSONDecodeError:
51
+ ctx.log_warning(
52
+ f"Could not decode JSON from history file '{file_path}'. "
53
+ "Ignoring file content."
54
+ )
55
+ except Exception as e:
56
+ ctx.log_warning(
57
+ f"Error reading history file '{file_path}': {e}. "
58
+ "Ignoring file content."
59
+ )
60
+ # If neither reader nor file provided valid data
61
+ return None
62
+
63
+ @classmethod
64
+ def parse_and_validate(
65
+ cls, ctx: AnyContext, data: Any, source: str
66
+ ) -> Optional["ConversationHistoryData"]:
67
+ """Parses raw data into ConversationHistoryData, handling validation & old formats."""
68
+ try:
69
+ if isinstance(data, cls):
70
+ return data # Already a valid instance
71
+ if isinstance(data, dict) and "history" in data:
72
+ # Standard format {'context': ..., 'history': ...}
73
+ # Ensure context exists, even if empty
74
+ data.setdefault("context", {})
75
+ return cls.model_validate(data)
76
+ elif isinstance(data, list):
77
+ # Handle old format (just a list) - wrap it
78
+ ctx.log_warning(
79
+ f"History from {source} contains old list format. "
80
+ "Wrapping it into the new structure {'context': {}, 'history': [...]}. "
81
+ "Consider updating the source format."
82
+ )
83
+ return cls(history=data, context={})
84
+ else:
85
+ ctx.log_warning(
86
+ f"History data from {source} has unexpected format "
87
+ f"(type: {type(data)}). Ignoring."
88
+ )
89
+ return None
90
+ except Exception as e: # Catch validation errors too
91
+ ctx.log_warning(
92
+ f"Error validating/parsing history data from {source}: {e}. Ignoring."
93
+ )
94
+ return None
95
+
96
+
97
+ def get_history_file(
98
+ ctx: AnyContext,
99
+ conversation_history_file_attr: StrAttr | None,
100
+ render_history_file: bool,
101
+ ) -> str:
102
+ """Gets the path to the conversation history file, rendering if configured."""
103
+ return get_str_attr(
104
+ ctx,
105
+ conversation_history_file_attr,
106
+ "",
107
+ auto_render=render_history_file,
108
+ )
109
+
110
+
111
+ async def read_conversation_history(
112
+ ctx: AnyContext,
113
+ conversation_history_reader: (
114
+ Callable[[AnySharedContext], ConversationHistoryData | dict | list | None]
115
+ | None
116
+ ),
117
+ conversation_history_file_attr: StrAttr | None,
118
+ render_history_file: bool,
119
+ conversation_history_attr: (
120
+ ConversationHistoryData
121
+ | Callable[[AnySharedContext], ConversationHistoryData | dict | list]
122
+ | dict
123
+ | list
124
+ ),
125
+ ) -> ConversationHistoryData:
126
+ """Reads conversation history from reader, file, or attribute, with validation."""
127
+ history_file = get_history_file(
128
+ ctx, conversation_history_file_attr, render_history_file
129
+ )
130
+ # Use the class method defined above
131
+ history_data = await ConversationHistoryData.read_from_sources(
132
+ ctx=ctx,
133
+ reader=conversation_history_reader,
134
+ file_path=history_file,
135
+ )
136
+ if history_data:
137
+ return history_data
138
+ # Priority 3: Callable or direct conversation_history attribute
139
+ raw_data_attr: Any = None
140
+ if callable(conversation_history_attr):
141
+ try:
142
+ raw_data_attr = await run_async(conversation_history_attr(ctx))
143
+ except Exception as e:
144
+ ctx.log_warning(
145
+ f"Error executing callable conversation_history attribute: {e}. "
146
+ "Ignoring."
147
+ )
148
+ if raw_data_attr is None:
149
+ raw_data_attr = conversation_history_attr
150
+ if raw_data_attr:
151
+ # Use the class method defined above
152
+ history_data = ConversationHistoryData.parse_and_validate(
153
+ ctx, raw_data_attr, "attribute"
154
+ )
155
+ if history_data:
156
+ return history_data
157
+ # Fallback: Return default value
158
+ return ConversationHistoryData()
159
+
160
+
161
+ async def write_conversation_history(
162
+ ctx: AnyContext,
163
+ history_data: ConversationHistoryData,
164
+ conversation_history_writer: (
165
+ Callable[[AnySharedContext, ConversationHistoryData], None] | None
166
+ ),
167
+ conversation_history_file_attr: StrAttr | None,
168
+ render_history_file: bool,
169
+ ):
170
+ """Writes conversation history using the writer or to a file."""
171
+ if conversation_history_writer is not None:
172
+ await run_async(conversation_history_writer(ctx, history_data))
173
+ history_file = get_history_file(
174
+ ctx, conversation_history_file_attr, render_history_file
175
+ )
176
+ if history_file != "":
177
+ write_file(history_file, history_data.model_dump_json(indent=2))
178
+
179
+
180
+ async def prepare_initial_state(
181
+ ctx: AnyContext,
182
+ conversation_history_reader: (
183
+ Callable[[AnySharedContext], ConversationHistoryData | dict | list | None]
184
+ | None
185
+ ),
186
+ conversation_history_file_attr: StrAttr | None,
187
+ render_history_file: bool,
188
+ conversation_history_attr: (
189
+ ConversationHistoryData
190
+ | Callable[[AnySharedContext], ConversationHistoryData | dict | list]
191
+ | dict
192
+ | list
193
+ ),
194
+ conversation_context_getter: Callable[[AnyContext], dict[str, Any]],
195
+ ) -> tuple[ListOfDict, dict[str, Any]]:
196
+ """Reads history and prepares the initial conversation context."""
197
+ history_data: ConversationHistoryData = await read_conversation_history(
198
+ ctx,
199
+ conversation_history_reader,
200
+ conversation_history_file_attr,
201
+ render_history_file,
202
+ conversation_history_attr,
203
+ )
204
+ # Clean the history list to remove context from historical user prompts
205
+ cleaned_history_list = []
206
+ for interaction in history_data.history:
207
+ cleaned_history_list.append(
208
+ remove_context_from_interaction_history(interaction)
209
+ )
210
+ conversation_context = conversation_context_getter(ctx)
211
+ # Merge history context from loaded data without overwriting existing keys
212
+ for key, value in history_data.context.items():
213
+ if key not in conversation_context:
214
+ conversation_context[key] = value
215
+ # Return the CLEANED history list
216
+ return cleaned_history_list, conversation_context
217
+
218
+
219
+ def remove_context_from_interaction_history(
220
+ interaction: dict[str, Any],
221
+ ) -> dict[str, Any]:
222
+ try:
223
+ cleaned_interaction = json.loads(json.dumps(interaction))
224
+ except Exception:
225
+ # Fallback to shallow copy if not JSON serializable (less safe)
226
+ cleaned_interaction = interaction.copy()
227
+ if "parts" in cleaned_interaction and isinstance(
228
+ cleaned_interaction["parts"], list
229
+ ):
230
+ for part in cleaned_interaction["parts"]:
231
+ is_user_prompt = part.get("part_kind") == "user-prompt"
232
+ has_str_content = isinstance(part.get("content"), str)
233
+ if is_user_prompt and has_str_content:
234
+ content = part["content"]
235
+ user_message_marker = "# User Message\n"
236
+ marker_index = content.find(user_message_marker)
237
+ if marker_index != -1:
238
+ # Extract message after the marker and strip whitespace
239
+ start_index = marker_index + len(user_message_marker)
240
+ part["content"] = content[start_index:].strip()
241
+ # else: If marker not found, leave content as is (old format/error)
242
+ return cleaned_interaction