keboola-cli 0.93.0__tar.gz → 0.93.2__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 (572) hide show
  1. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/CLAUDE.md +2 -1
  2. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/PKG-INFO +1 -1
  3. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/pyproject.toml +1 -1
  4. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/changelog.py +24 -0
  5. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/app.py +10 -0
  6. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_clone.py +20 -0
  7. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/clone.py +19 -2
  8. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/telemetry.py +40 -1
  9. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_telemetry.py +88 -5
  10. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_clone.py +85 -0
  11. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_telemetry.py +67 -2
  12. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/.gitignore +0 -0
  13. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/CONTRIBUTING.md +0 -0
  14. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/LICENSE +0 -0
  15. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/Makefile +0 -0
  16. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/README.md +0 -0
  17. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/examples/README.md +0 -0
  18. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/examples/storage_tui/README.md +0 -0
  19. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  20. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
  21. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
  22. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_command_sync.py +0 -0
  23. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_error_codes.py +0 -0
  24. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_file_size.py +0 -0
  25. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_release_scope.py +0 -0
  26. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_sentinel_guards.py +0 -0
  27. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_version_gates.py +0 -0
  28. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_wheel_ui.py +0 -0
  29. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/debug_linkedby_type.sh +0 -0
  30. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/file_size_baseline.json +0 -0
  31. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_command_reference.py +0 -0
  32. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_endpoint_reference.py +0 -0
  33. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_release_notes.py +0 -0
  34. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/generate_changelog.py +0 -0
  35. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/generate_skill.py +0 -0
  36. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/hatch_build.py +0 -0
  37. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/lineage_deep.py +0 -0
  38. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/post-edit-quality.sh +0 -0
  39. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/pre-commit +0 -0
  40. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/sync_version.py +0 -0
  41. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/web-dev.sh +0 -0
  42. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/__init__.py +0 -0
  43. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/__main__.py +0 -0
  44. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/ai_client.py +0 -0
  45. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/__init__.py +0 -0
  46. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/auth_client.py +0 -0
  47. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/device.py +0 -0
  48. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/environment.py +0 -0
  49. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/models.py +0 -0
  50. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/pkce.py +0 -0
  51. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  52. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/state_store.py +0 -0
  53. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/token_provider.py +0 -0
  54. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/totp.py +0 -0
  55. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auto_update.py +0 -0
  56. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/cli.py +0 -0
  57. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/__init__.py +0 -0
  58. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_client.py +0 -0
  59. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_core.py +0 -0
  60. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_transfer.py +0 -0
  61. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/billing.py +0 -0
  62. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/branches.py +0 -0
  63. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/configs.py +0 -0
  64. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/merge_requests.py +0 -0
  65. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/misc.py +0 -0
  66. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/notifications.py +0 -0
  67. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/query.py +0 -0
  68. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/queue.py +0 -0
  69. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/storage_files.py +0 -0
  70. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  71. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/stream.py +0 -0
  72. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/tokens.py +0 -0
  73. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/triggers.py +0 -0
  74. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/workspaces.py +0 -0
  75. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/__init__.py +0 -0
  76. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  77. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  78. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
  79. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
  80. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
  81. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
  82. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
  83. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
  84. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_helpers.py +0 -0
  85. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  86. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
  87. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
  88. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
  89. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
  90. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
  91. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
  92. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
  93. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/agent.py +0 -0
  94. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/auth.py +0 -0
  95. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/billing.py +0 -0
  96. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/branch.py +0 -0
  97. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/changelog.py +0 -0
  98. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/component.py +0 -0
  99. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/config.py +0 -0
  100. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/config_state.py +0 -0
  101. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/context.py +0 -0
  102. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/data_app.py +0 -0
  103. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
  104. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/docs.py +0 -0
  105. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/doctor.py +0 -0
  106. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/encrypt.py +0 -0
  107. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/feature.py +0 -0
  108. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/flow.py +0 -0
  109. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/http_client.py +0 -0
  110. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/init.py +0 -0
  111. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/job.py +0 -0
  112. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/kai.py +0 -0
  113. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/lineage.py +0 -0
  114. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/notification.py +0 -0
  115. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/org.py +0 -0
  116. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/permissions.py +0 -0
  117. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/project.py +0 -0
  118. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/repl.py +0 -0
  119. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/schedule.py +0 -0
  120. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/search.py +0 -0
  121. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
  122. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/serve.py +0 -0
  123. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/sharing.py +0 -0
  124. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/storage.py +0 -0
  125. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/stream.py +0 -0
  126. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/sync.py +0 -0
  127. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/token.py +0 -0
  128. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/transformation.py +0 -0
  129. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/version.py +0 -0
  130. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/workspace.py +0 -0
  131. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/config_store.py +0 -0
  132. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/constants.py +0 -0
  133. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/data_science_client.py +0 -0
  134. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  135. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/errors.py +0 -0
  136. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/frozen_dist.py +0 -0
  137. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/http_base.py +0 -0
  138. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/json_utils.py +0 -0
  139. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/lib.py +0 -0
  140. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/manage_client.py +0 -0
  141. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/metastore_client.py +0 -0
  142. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/models.py +0 -0
  143. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/output.py +0 -0
  144. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/permissions.py +0 -0
  145. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/py.typed +0 -0
  146. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/__init__.py +0 -0
  147. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  148. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  149. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  150. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  151. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  152. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/result_models.py +0 -0
  153. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/scheduler_client.py +0 -0
  154. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/__init__.py +0 -0
  155. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
  156. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/agent_runner.py +0 -0
  157. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/agents_store.py +0 -0
  158. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/auth.py +0 -0
  159. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/dependencies.py +0 -0
  160. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/pricing.py +0 -0
  161. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  162. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  163. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  164. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/auth.py +0 -0
  165. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/billing.py +0 -0
  166. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  167. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/components.py +0 -0
  168. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/configs.py +0 -0
  169. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
  170. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  171. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  172. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  173. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  174. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  175. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/health.py +0 -0
  176. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
  177. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  178. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  179. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/members.py +0 -0
  180. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
  181. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/org.py +0 -0
  182. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  183. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
  184. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/search.py +0 -0
  185. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
  186. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  187. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  188. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  189. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/token.py +0 -0
  190. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  191. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
  192. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  193. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/sse.py +0 -0
  194. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/__init__.py +0 -0
  195. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
  196. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
  197. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_clone.py +0 -0
  198. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
  199. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_trash.py +0 -0
  200. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
  201. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
  202. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_encryption.py +0 -0
  203. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  204. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
  205. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
  206. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  207. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  208. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
  209. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
  210. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  211. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  212. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  213. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  214. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
  215. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  216. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  217. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_table_detail.py +0 -0
  218. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
  219. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  220. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
  221. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/agent_service.py +0 -0
  222. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/auth_service.py +0 -0
  223. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/base.py +0 -0
  224. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/billing_service.py +0 -0
  225. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/branch_service.py +0 -0
  226. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/component_service.py +0 -0
  227. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/config_service.py +0 -0
  228. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
  229. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/data_app_service.py +0 -0
  230. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
  231. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  232. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/docs_service.py +0 -0
  233. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  234. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  235. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/feature_service.py +0 -0
  236. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/flow_service.py +0 -0
  237. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  238. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  239. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
  240. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/job_service.py +0 -0
  241. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/kai_service.py +0 -0
  242. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  243. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/member_service.py +0 -0
  244. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
  245. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/notification_service.py +0 -0
  246. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/org_service.py +0 -0
  247. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/project_service.py +0 -0
  248. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  249. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  250. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/search_service.py +0 -0
  251. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
  252. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/sharing_service.py +0 -0
  253. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  254. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/storage_service.py +0 -0
  255. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/stream_service.py +0 -0
  256. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/sync_service.py +0 -0
  257. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/table_usage.py +0 -0
  258. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/token_service.py +0 -0
  259. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  260. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/variables_service.py +0 -0
  261. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/version_service.py +0 -0
  262. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/workspace_service.py +0 -0
  263. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/stream_client.py +0 -0
  264. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/__init__.py +0 -0
  265. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  266. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
  267. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
  268. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  269. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/config_format.py +0 -0
  270. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  271. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  272. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/manifest.py +0 -0
  273. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/naming.py +0 -0
  274. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/secrets.py +0 -0
  275. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  276. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/update_runner.py +0 -0
  277. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/yaml_input.py +0 -0
  278. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/__init__.py +0 -0
  279. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/conftest.py +0 -0
  280. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/helpers.py +0 -0
  281. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_cli.py +0 -0
  282. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_prompt.py +0 -0
  283. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_prompt_helper.py +0 -0
  284. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_runner.py +0 -0
  285. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_service.py +0 -0
  286. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_tombstone.py +0 -0
  287. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agents_store_events.py +0 -0
  288. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_ai_client.py +0 -0
  289. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_client.py +0 -0
  290. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_device.py +0 -0
  291. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_environment.py +0 -0
  292. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_models.py +0 -0
  293. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_picker.py +0 -0
  294. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_pkce.py +0 -0
  295. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_register_projects.py +0 -0
  296. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_sentinel.py +0 -0
  297. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_sentinel_guards.py +0 -0
  298. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_service.py +0 -0
  299. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_state_store.py +0 -0
  300. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_totp.py +0 -0
  301. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auto_update.py +0 -0
  302. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_base_service.py +0 -0
  303. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_cli.py +0 -0
  304. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_client.py +0 -0
  305. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_service.py +0 -0
  306. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_metadata_cli.py +0 -0
  307. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_metadata_service.py +0 -0
  308. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_registry.py +0 -0
  309. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_service.py +0 -0
  310. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_build_hook.py +0 -0
  311. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_changelog_check.py +0 -0
  312. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_changelog_render.py +0 -0
  313. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_command_sync.py +0 -0
  314. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_file_size.py +0 -0
  315. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_release_scope.py +0 -0
  316. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_sentinel_guards.py +0 -0
  317. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_version_gates.py +0 -0
  318. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_checkbox_select.py +0 -0
  319. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_choice_enums.py +0 -0
  320. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_cli.py +0 -0
  321. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_cli_auth.py +0 -0
  322. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client.py +0 -0
  323. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client_device_enrollment.py +0 -0
  324. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client_token_events.py +0 -0
  325. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_cli.py +0 -0
  326. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_service.py +0 -0
  327. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_sync_action.py +0 -0
  328. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_clone_cli.py +0 -0
  329. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_clone_service.py +0 -0
  330. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_create_cli.py +0 -0
  331. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_create_service.py +0 -0
  332. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_encryption.py +0 -0
  333. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_examples.py +0 -0
  334. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_metadata.py +0 -0
  335. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_rename.py +0 -0
  336. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_rename_cli.py +0 -0
  337. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_resolution.py +0 -0
  338. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_row_cli.py +0 -0
  339. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_row_service.py +0 -0
  340. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_search.py +0 -0
  341. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_search_cli.py +0 -0
  342. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_set_default_bucket.py +0 -0
  343. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_set_guard.py +0 -0
  344. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_state.py +0 -0
  345. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_store.py +0 -0
  346. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_trash.py +0 -0
  347. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_update.py +0 -0
  348. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_cli.py +0 -0
  349. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_git_repo.py +0 -0
  350. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_plain_env_keys.py +0 -0
  351. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_secrets_cli.py +0 -0
  352. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_secrets_service.py +0 -0
  353. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_service.py +0 -0
  354. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_validate_repo_service.py +0 -0
  355. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_deep_lineage_service.py +0 -0
  356. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_cli.py +0 -0
  357. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_client.py +0 -0
  358. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_service.py +0 -0
  359. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_docs_cli.py +0 -0
  360. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_doctor_service.py +0 -0
  361. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e.py +0 -0
  362. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_auth.py +0 -0
  363. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_config_dir_mode.py +0 -0
  364. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_lineage_deep.py +0 -0
  365. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encrypt_cli.py +0 -0
  366. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encrypt_service.py +0 -0
  367. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encryption.py +0 -0
  368. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_errors.py +0 -0
  369. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_feature_cli.py +0 -0
  370. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_feature_service.py +0 -0
  371. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_file_locking.py +0 -0
  372. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_cli.py +0 -0
  373. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_examples.py +0 -0
  374. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_service.py +0 -0
  375. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_validation.py +0 -0
  376. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_frozen_dist.py +0 -0
  377. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_command_reference.py +0 -0
  378. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_endpoint_reference.py +0 -0
  379. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_release_notes.py +0 -0
  380. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_generate_promotion_pipeline.py +0 -0
  381. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_helpers.py +0 -0
  382. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_base.py +0 -0
  383. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_base_auth.py +0 -0
  384. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_client_cmd.py +0 -0
  385. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_forwarder_service.py +0 -0
  386. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_integration.py +0 -0
  387. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_job_idempotency_store.py +0 -0
  388. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_job_options.py +0 -0
  389. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_json_utils.py +0 -0
  390. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_kai_cli.py +0 -0
  391. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_kai_service.py +0 -0
  392. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lib.py +0 -0
  393. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lib_device_enrollment.py +0 -0
  394. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_license_consistency.py +0 -0
  395. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lineage_service.py +0 -0
  396. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_local_ai_chat.py +0 -0
  397. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_client.py +0 -0
  398. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_token_bulk.py +0 -0
  399. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_token_cli.py +0 -0
  400. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_mcp_migration_recipe.py +0 -0
  401. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_member_cli.py +0 -0
  402. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_member_service.py +0 -0
  403. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_merge_request_client.py +0 -0
  404. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_merge_request_service.py +0 -0
  405. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_metastore_client.py +0 -0
  406. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_migrate_cicd.py +0 -0
  407. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_models.py +0 -0
  408. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_normalize_script.py +0 -0
  409. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_cli.py +0 -0
  410. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_client.py +0 -0
  411. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_service.py +0 -0
  412. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_org_service.py +0 -0
  413. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_output.py +0 -0
  414. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_permissions.py +0 -0
  415. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_permissions_cli.py +0 -0
  416. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_pricing.py +0 -0
  417. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_edit.py +0 -0
  418. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_edit_cli.py +0 -0
  419. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_info_cli.py +0 -0
  420. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_info_service.py +0 -0
  421. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
  422. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_repl.py +0 -0
  423. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_result_models.py +0 -0
  424. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_run_broadcaster.py +0 -0
  425. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_schedule_cli.py +0 -0
  426. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_schedule_service.py +0 -0
  427. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_scheduler_client.py +0 -0
  428. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_search_cli.py +0 -0
  429. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_search_service.py +0 -0
  430. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_cli.py +0 -0
  431. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_schema.py +0 -0
  432. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_service.py +0 -0
  433. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_banner_encoding.py +0 -0
  434. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_conversation_id.py +0 -0
  435. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_ui.py +0 -0
  436. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_auth.py +0 -0
  437. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_permissions.py +0 -0
  438. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_router_calls.py +0 -0
  439. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
  440. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_smoke.py +0 -0
  441. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_services.py +0 -0
  442. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sharing_cli.py +0 -0
  443. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sharing_service.py +0 -0
  444. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_skill_frontmatter.py +0 -0
  445. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sql_split.py +0 -0
  446. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_clone.py +0 -0
  447. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_create_table.py +0 -0
  448. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_delete.py +0 -0
  449. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_describe_cli.py +0 -0
  450. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_describe_service.py +0 -0
  451. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_empty_definition.py +0 -0
  452. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_export_filters.py +0 -0
  453. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_files.py +0 -0
  454. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_snapshots.py +0 -0
  455. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_swap.py +0 -0
  456. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_table_definition.py +0 -0
  457. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_tables.py +0 -0
  458. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_truncate.py +0 -0
  459. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_write.py +0 -0
  460. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_cli.py +0 -0
  461. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_client.py +0 -0
  462. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_service.py +0 -0
  463. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_baseline_stamping.py +0 -0
  464. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_branch_mapping.py +0 -0
  465. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_cli.py +0 -0
  466. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_cli_behavior.py +0 -0
  467. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_code_extraction.py +0 -0
  468. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_config_format.py +0 -0
  469. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_diff_engine.py +0 -0
  470. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_e2e.py +0 -0
  471. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_encrypt.py +0 -0
  472. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_force_pull_baseline.py +0 -0
  473. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_manifest.py +0 -0
  474. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_naming.py +0 -0
  475. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_plaintext_audit.py +0 -0
  476. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_push_script_guard.py +0 -0
  477. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_reconcile.py +0 -0
  478. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_secrets.py +0 -0
  479. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_service.py +0 -0
  480. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_storage_jobs.py +0 -0
  481. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_version_script.py +0 -0
  482. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_table_usage.py +0 -0
  483. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_cli.py +0 -0
  484. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_provider.py +0 -0
  485. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_service.py +0 -0
  486. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_transformation_cli.py +0 -0
  487. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_transformation_ops.py +0 -0
  488. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_triggers_client.py +0 -0
  489. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_update_runner.py +0 -0
  490. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_variables_cli.py +0 -0
  491. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_variables_service.py +0 -0
  492. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_version_service.py +0 -0
  493. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_cli.py +0 -0
  494. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_gc.py +0 -0
  495. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_service.py +0 -0
  496. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_sql_helper.py +0 -0
  497. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_yaml_input.py +0 -0
  498. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/README.md +0 -0
  499. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/index.html +0 -0
  500. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/package-lock.json +0 -0
  501. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/package.json +0 -0
  502. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/postcss.config.js +0 -0
  503. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/App.tsx +0 -0
  504. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/api/client.test.ts +0 -0
  505. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/api/client.ts +0 -0
  506. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/changelogNotes.test.ts +0 -0
  507. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/changelogNotes.ts +0 -0
  508. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/AgentRunView.tsx +0 -0
  509. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/CommandPalette.tsx +0 -0
  510. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  511. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/DetailTabs.tsx +0 -0
  512. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Drawer.tsx +0 -0
  513. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Empty.tsx +0 -0
  514. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/JsonView.tsx +0 -0
  515. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
  516. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  517. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/PillList.tsx +0 -0
  518. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/RawDetail.tsx +0 -0
  519. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
  520. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Table.tsx +0 -0
  521. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/WhatsNew.tsx +0 -0
  522. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/config/credits.test.ts +0 -0
  523. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/config/credits.ts +0 -0
  524. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/index.css +0 -0
  525. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/Shell.tsx +0 -0
  526. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/Sidebar.tsx +0 -0
  527. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/StatusBar.tsx +0 -0
  528. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/TopBar.tsx +0 -0
  529. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/lib/time.test.ts +0 -0
  530. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/lib/time.ts +0 -0
  531. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/main.tsx +0 -0
  532. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Agents.tsx +0 -0
  533. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Branches.tsx +0 -0
  534. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Changelog.tsx +0 -0
  535. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Components.tsx +0 -0
  536. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Configs.tsx +0 -0
  537. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Dashboard.tsx +0 -0
  538. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/DataApps.tsx +0 -0
  539. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Doctor.tsx +0 -0
  540. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Encrypt.tsx +0 -0
  541. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Flows.tsx +0 -0
  542. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Jobs.tsx +0 -0
  543. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/JobsAll.tsx +0 -0
  544. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Lineage.tsx +0 -0
  545. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/LocalAi.tsx +0 -0
  546. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Members.tsx +0 -0
  547. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Org.tsx +0 -0
  548. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Projects.tsx +0 -0
  549. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Schedules.tsx +0 -0
  550. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Search.tsx +0 -0
  551. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  552. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  553. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Sharing.tsx +0 -0
  554. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Storage.tsx +0 -0
  555. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Streams.tsx +0 -0
  556. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Tokens.tsx +0 -0
  557. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/TokensAll.tsx +0 -0
  558. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Workspaces.tsx +0 -0
  559. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/jobsShared.tsx +0 -0
  560. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/storageSel.test.ts +0 -0
  561. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/tokensShared.test.ts +0 -0
  562. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/tokensShared.tsx +0 -0
  563. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/router.test.ts +0 -0
  564. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/router.ts +0 -0
  565. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/state.tsx +0 -0
  566. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/theme.tsx +0 -0
  567. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/types.ts +0 -0
  568. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/useHashSelection.ts +0 -0
  569. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/whatsnew.ts +0 -0
  570. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/tailwind.config.ts +0 -0
  571. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/tsconfig.json +0 -0
  572. {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/vite.config.ts +0 -0
@@ -853,6 +853,7 @@ kbagent config new --component-id ID [--name NAME] [--project NAME] [--output-di
853
853
  # sync: GitOps -- configs as local files. init/pull/push/diff are filesystem-local (no serve REST surface).
854
854
  kbagent sync init --project ALIAS [--directory DIR] [--git-branching] [--adopt-existing]
855
855
  kbagent sync pull --project ALIAS [--all-projects] [--force] [--theirs] [--dry-run] [--with-samples] [--no-storage] [--no-jobs] [--job-limit N] [--branch ID]
856
+ # `sync pull` auto-inits: if the target directory has no `.keboola/manifest.json`, pull runs `init` first, so a separate `sync init` is NOT needed for a first checkout. `sync pull --project X -d ./dir` on an empty dir writes the manifest and fetches the configs in one step.
856
857
  # `sync pull --force` is conflict-aware (since 0.53.0): locally-modified config whose remote is UNCHANGED is preserved (delta stays pushable, never silently re-stamped); a true merge conflict (local AND remote both changed since last pull) aborts (exit 1, SYNC_CONFLICT, --json lists details.conflicts); local-untouched + remote-changed takes remote.
857
858
  # `sync pull --theirs` (0.72.0+) is the supported reconcile path for a drifted tree: remote wins everywhere -- overwrites locally-modified configs/rows, restores deleted/missing files, resolves conflicts by taking remote (no abort). Since 0.72.0 plain pull also re-materializes a tracked config whose local dir was deleted (manifest<->disk invariant), so delete-dir-then-pull refetches; config-level isDisabled round-trips as sparse `is_disabled: true` in _config.yml (pull/diff/push).
858
859
  kbagent sync status [--directory DIR]
@@ -873,7 +874,7 @@ kbagent sync push --project ALIAS [--all-projects] [--dry-run] [--force] [--allo
873
874
  # sync diff/push (0.89.0+, #649): local side read from exactly ONE tree (target branch subtree, else main/); entries tracked on another branch's tree are excluded from the changeset and reported under orphaned[] + summary.orphaned (reasons + reconcile hints); fix with sync pull. Adopt-by-id is branch-aware.
874
875
  # Ignored components (since 0.91.0, #689): keboola.mcp-server-tool joins keboola.sandboxes on ALWAYS_IGNORED_COMPONENTS (the MCP server's auto-created empty mcp-workspace-<hex> configs); the manifest field ignoredComponents (.keboola/manifest.json) is now LIVE and unions with the hardcoded set, honored by pull/diff/push. pull drops manifest entries + local dirs for a newly-ignored component, reported with action "ignored" (distinct from "removed" = deleted on remote); diff filters the local side too, so a stale dir for an ignored component can never classify as DELETED -- closes the delete-dir-then-push trap that used to destroy production keboola.mcp-server-tool configs.
875
876
  kbagent sync clone --source DIR --target ALIAS --target-dir DIR [--bucket-map FILE] [--variable-values FILE] [--instance-rename FILE] [--dry-run] [--branch ID]
876
- # `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow task configIds and transformation variable links are remapped reference->ULID by push Phase C/D. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID.
877
+ # `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow task configIds and transformation variable links are remapped reference->ULID by push Phase C/D. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID. `--branch` is optional on a fresh clone. It defaults to the target's production branch, resolved from the API like `sync init`. Pass it only to target a dev branch of the target.
877
878
  kbagent sync branch-link --project ALIAS (--branch-id ID | --branch-name NAME) [--directory DIR]
878
879
  kbagent sync branch-unlink [--directory DIR]
879
880
  kbagent sync branch-status [--directory DIR]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: keboola-cli
3
- Version: 0.93.0
3
+ Version: 0.93.2
4
4
  Summary: AI-friendly CLI for managing Keboola projects
5
5
  Author-email: Keboola <dev@keboola.com>
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "keboola-cli"
3
- version = "0.93.0"
3
+ version = "0.93.2"
4
4
  description = "AI-friendly CLI for managing Keboola projects"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -24,6 +24,30 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
24
24
 
25
25
  # Ordered newest-first. Each value is a list of brief one-line descriptions.
26
26
  CHANGELOG: dict[str, list[str]] = {
27
+ "0.93.2": [
28
+ "New (#757): each usage event now also carries the kbagent version and an agent-vs-human "
29
+ "marker for the telemetry team (CLI-12). `params.cliContext` holds the User-Agent "
30
+ "(version + OS/arch/Python) and, when set, the conversation id -- from "
31
+ "`KBAGENT_CONVERSATION_ID` / `--conversation-id` on the CLI, or the `X-Conversation-ID` "
32
+ "header over serve. The id is bounded and cleaned (200 chars, printable only), like "
33
+ "`results.error`, so an oversized value never reaches the project's event log. A "
34
+ "`serve-` prefixed id marks a serve session, not an external agent, so a report reads "
35
+ "the id's shape, not its mere presence.",
36
+ "Note (#748, #749): housekeeping with no user-facing change. A CODEOWNERS file that "
37
+ "auto-requests PR review, and a docs note that `sync pull` auto-inits the manifest (CLI-7).",
38
+ ],
39
+ "0.93.1": [
40
+ "Fix (#744): `sync clone` into a fresh (empty) target project now defaults to the "
41
+ "target's production branch, so `--branch` is optional (CLI-5). Before, "
42
+ "`repoint_manifest_project` re-pointed only the project id and left the copied manifest "
43
+ "on the SOURCE project's branch id. `_resolve_branch_id` then used that id, so a clone "
44
+ 'with no `--branch` failed with `Branch id "..." does not exists`. The clone path now '
45
+ "resolves the target's default branch from the API (`list_dev_branches` + "
46
+ "`find_default_branch_id`, the same way `sync init` does) and re-points the production "
47
+ "branch onto it. It resolves the branch only when the caller passes no explicit "
48
+ "`--branch`, so an explicit-branch clone makes no extra `list_dev_branches` call. "
49
+ "`--branch` stays an override for a dev branch.",
50
+ ],
27
51
  "0.93.0": [
28
52
  "New (#731): kbagent now posts a best-effort usage event per command, so its usage is "
29
53
  "visible in Keboola telemetry like the original Go CLI. Connection stores it as "
@@ -708,6 +708,15 @@ class _UsageTelemetryMiddleware:
708
708
  values = parse_qs(scope.get("query_string", b"").decode("latin-1")).get("project")
709
709
  project_alias = values[0] if values else None
710
710
 
711
+ # The caller's X-Conversation-ID (set by kbagent's own clients) rides into
712
+ # params.cliContext so the telemetry reader tells an agent request from a
713
+ # human one; a web-UI request sends no such header and stays unmarked (CLI-12).
714
+ conversation_id: str | None = None
715
+ for key, value in scope.get("headers") or []:
716
+ if key == b"x-conversation-id":
717
+ conversation_id = value.decode("latin-1") or None
718
+ break
719
+
711
720
  await asyncio.to_thread(
712
721
  telemetry.send_serve_event,
713
722
  self._config_store,
@@ -717,6 +726,7 @@ class _UsageTelemetryMiddleware:
717
726
  status_code=status_code,
718
727
  duration_s=duration_s,
719
728
  project_alias=project_alias,
729
+ conversation_id=conversation_id,
720
730
  )
721
731
 
722
732
 
@@ -22,11 +22,24 @@ from ..sync.clone import (
22
22
  repoint_manifest_project,
23
23
  )
24
24
  from ..sync.manifest import load_manifest, save_manifest
25
+ from .base import find_default_branch_id
25
26
 
26
27
  if TYPE_CHECKING:
27
28
  from .sync_service import SyncService
28
29
 
29
30
 
31
+ def _target_default_branch_id(service: SyncService, target_project: Any) -> int | None:
32
+ """Return the target project's default branch id from the API.
33
+
34
+ Mirrors ``sync init`` so a fresh clone re-points the manifest onto the
35
+ target's own production branch instead of reusing the source's (CLI-5).
36
+ """
37
+ client = service._client_factory(target_project.stack_url, target_project.token)
38
+ with client:
39
+ branches = client.list_dev_branches()
40
+ return find_default_branch_id(branches)
41
+
42
+
30
43
  def clone_project(
31
44
  service: SyncService,
32
45
  source: str | Path,
@@ -106,10 +119,17 @@ def clone_project(
106
119
  if not already_cloned:
107
120
  copy_reference_tree(source_dir, target_path)
108
121
  manifest = load_manifest(target_path)
122
+ # _resolve_branch_id prefers an explicit --branch, so resolve the
123
+ # target's default branch only when branch_override is None (#744).
109
124
  repoint_manifest_project(
110
125
  manifest,
111
126
  project_id=target_project.project_id or 0,
112
127
  api_host=urlparse(target_project.stack_url).netloc,
128
+ default_branch_id=(
129
+ _target_default_branch_id(service, target_project)
130
+ if branch_override is None
131
+ else None
132
+ ),
113
133
  )
114
134
  bucket_rewrites = apply_bucket_map(target_path, manifest, bucket_map)
115
135
  variable_overrides = apply_variable_values(target_path, manifest, variable_values)
@@ -63,10 +63,27 @@ def copy_reference_tree(source_dir: Path, target_dir: Path) -> None:
63
63
  shutil.copytree(source_dir, target_dir)
64
64
 
65
65
 
66
- def repoint_manifest_project(manifest: Any, *, project_id: int, api_host: str) -> None:
67
- """Re-point the manifest's project block at the clone's target project."""
66
+ def repoint_manifest_project(
67
+ manifest: Any,
68
+ *,
69
+ project_id: int,
70
+ api_host: str,
71
+ default_branch_id: int | None = None,
72
+ ) -> None:
73
+ """Re-point the manifest's project block at the clone's target project.
74
+
75
+ When ``default_branch_id`` is given, the production branch id (the first
76
+ manifest branch, which ``_resolve_branch_id`` uses as its fallback) is
77
+ re-pointed onto the target project's default branch too. The copied
78
+ manifest otherwise keeps the SOURCE project's branch id, which does not
79
+ exist in the target; a fresh clone with no explicit ``--branch`` then
80
+ resolves that stale id and diff/push fail with
81
+ ``Branch id "..." does not exists`` (CLI-5).
82
+ """
68
83
  manifest.project.id = project_id
69
84
  manifest.project.api_host = api_host
85
+ if default_branch_id is not None and manifest.branches:
86
+ manifest.branches[0].id = default_branch_id
70
87
 
71
88
 
72
89
  def _config_dir(target_dir: Path, branch_map: dict[int, str], branch_id: int, path: str) -> Path:
@@ -5,6 +5,11 @@ events (``POST /v2/storage/events``), the same mechanism the kbc CLI uses. The
5
5
  event is stored as ``ext.keboola.cli.`` (CLI) or ``ext.keboola.cli.serve``
6
6
  (serve REST API) and stamped server-side with the caller's token + user agent.
7
7
 
8
+ The event body also carries ``params.cliContext``: the kbagent User-Agent
9
+ (version + OS/arch/Python) and, when set, the conversation id. The events store
10
+ keeps the request body, not the server-stamped envelope, so a downstream reader
11
+ reads the version and an agent-vs-human marker off the event itself (CLI-12).
12
+
8
13
  This is telemetry, NOT an audit trail: it is voluntary (the two env vars below
9
14
  disable it) and best-effort (a failed or blocked events endpoint never affects
10
15
  the command). Mutating operations are recorded server-side by Connection as
@@ -27,12 +32,14 @@ import typer
27
32
  from .auth.sentinel import is_session_token
28
33
  from .config_store import ConfigStore, resolve_config_dir
29
34
  from .constants import (
35
+ ENV_CONVERSATION_ID,
30
36
  ENV_DISABLE_TELEMETRY,
31
37
  ENV_DO_NOT_TRACK,
32
38
  TELEMETRY_COMPONENT_ID,
33
39
  TELEMETRY_SERVE_CONFIG_ID,
34
40
  TELEMETRY_TIMEOUT,
35
41
  )
42
+ from .http_base import build_user_agent
36
43
  from .services.base import make_telemetry_client
37
44
  from .services.project_service import ProjectService
38
45
 
@@ -46,6 +53,13 @@ logger = logging.getLogger(__name__)
46
53
  # events API's 200 KB cap and avoids dumping large response/state buffers.
47
54
  _MAX_ERROR_LEN = 1000
48
55
 
56
+ # Longest conversation id carried in ``params.cliContext.conversationId``. The id
57
+ # is caller-supplied -- the ``KBAGENT_CONVERSATION_ID`` env var, or (over serve) the
58
+ # request's ``X-Conversation-ID`` header -- so it is bounded and cleaned like
59
+ # ``results.error``: an oversized or control-character value would otherwise bloat the
60
+ # project's event log or push the POST past the events API cap.
61
+ _MAX_CONVERSATION_ID_LEN = 200
62
+
49
63
  # Command wrappers that are not a unit of work themselves. ``serve`` posts a
50
64
  # per-request event from its middleware; ``repl`` posts a per-line event from its
51
65
  # own loop. The outer invocation of each is excluded so it does not add a second,
@@ -217,6 +231,7 @@ def emit_cli_invocation(
217
231
  duration_s=duration_s,
218
232
  configuration_id=None,
219
233
  extra_params=None,
234
+ conversation_id=os.environ.get(ENV_CONVERSATION_ID) or None,
220
235
  )
221
236
  except Exception as exc:
222
237
  logger.debug("usage event failed: %s", exc)
@@ -232,11 +247,14 @@ def send_serve_event(
232
247
  status_code: int,
233
248
  duration_s: float,
234
249
  project_alias: str | None,
250
+ conversation_id: str | None = None,
235
251
  ) -> None:
236
252
  """Post a usage event for one serve REST request. Never raises.
237
253
 
238
254
  Blocking (builds a sync client + posts), so serve calls this off the event
239
- loop via a worker thread.
255
+ loop via a worker thread. ``conversation_id`` is the request's own
256
+ ``X-Conversation-ID`` (read by the middleware), so an agent-driven request is
257
+ marked and a human web-UI request -- which sends no such header -- is not.
240
258
  """
241
259
  try:
242
260
  if telemetry_disabled():
@@ -264,6 +282,7 @@ def send_serve_event(
264
282
  duration_s=duration_s,
265
283
  configuration_id=TELEMETRY_SERVE_CONFIG_ID,
266
284
  extra_params={"path": f"{method} {path}"},
285
+ conversation_id=conversation_id,
267
286
  )
268
287
  except Exception as exc:
269
288
  logger.debug("serve usage event failed: %s", exc)
@@ -289,6 +308,18 @@ def _telemetry_client(config_store: ConfigStore, stack_url: str, token: str) ->
289
308
  return client, True
290
309
 
291
310
 
311
+ def _clean_conversation_id(value: str | None) -> str | None:
312
+ """Strip control characters and cap the length; None if nothing usable.
313
+
314
+ The id is a caller-supplied token, so it gets the same bound as ``results.error``
315
+ before it enters the event body (see ``_MAX_CONVERSATION_ID_LEN``).
316
+ """
317
+ if not value:
318
+ return None
319
+ cleaned = "".join(ch for ch in value if ch.isprintable()).strip()
320
+ return cleaned[:_MAX_CONVERSATION_ID_LEN] or None
321
+
322
+
292
323
  def _send_event(
293
324
  config_store: ConfigStore,
294
325
  *,
@@ -301,10 +332,18 @@ def _send_event(
301
332
  duration_s: float,
302
333
  configuration_id: str | None,
303
334
  extra_params: dict[str, Any] | None,
335
+ conversation_id: str | None,
304
336
  ) -> None:
305
337
  params: dict[str, Any] = {"command": command}
306
338
  if extra_params:
307
339
  params.update(extra_params)
340
+ # KIDS reads the CLI version (auto-update adoption) and an agent-vs-human
341
+ # marker off the stored event body, so both ride in params.cliContext (CLI-12).
342
+ cli_context: dict[str, Any] = {"userAgent": build_user_agent()}
343
+ clean_conversation_id = _clean_conversation_id(conversation_id)
344
+ if clean_conversation_id:
345
+ cli_context["conversationId"] = clean_conversation_id
346
+ params["cliContext"] = cli_context
308
347
  results: dict[str, Any] = {}
309
348
  if project_id is not None:
310
349
  results["projectId"] = project_id
@@ -45,7 +45,17 @@ def test_serve_logs_a_mutation_with_the_mapped_command(
45
45
  """
46
46
  captured: list[tuple[str, str | None]] = []
47
47
 
48
- def fake_send(config_store, *, method, path, operation, status_code, duration_s, project_alias):
48
+ def fake_send(
49
+ config_store,
50
+ *,
51
+ method,
52
+ path,
53
+ operation,
54
+ status_code,
55
+ duration_s,
56
+ project_alias,
57
+ conversation_id=None,
58
+ ):
49
59
  captured.append((operation, project_alias))
50
60
 
51
61
  monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
@@ -68,7 +78,17 @@ def test_unhandled_route_error_is_logged_as_a_failure(
68
78
  """
69
79
  captured: list[int] = []
70
80
 
71
- def fake_send(config_store, *, method, path, operation, status_code, duration_s, project_alias):
81
+ def fake_send(
82
+ config_store,
83
+ *,
84
+ method,
85
+ path,
86
+ operation,
87
+ status_code,
88
+ duration_s,
89
+ project_alias,
90
+ conversation_id=None,
91
+ ):
72
92
  captured.append(status_code)
73
93
 
74
94
  monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
@@ -100,7 +120,17 @@ def test_serve_maps_a_path_converter_route(
100
120
  """
101
121
  captured: list[str] = []
102
122
 
103
- def fake_send(config_store, *, method, path, operation, status_code, duration_s, project_alias):
123
+ def fake_send(
124
+ config_store,
125
+ *,
126
+ method,
127
+ path,
128
+ operation,
129
+ status_code,
130
+ duration_s,
131
+ project_alias,
132
+ conversation_id=None,
133
+ ):
104
134
  captured.append(operation)
105
135
 
106
136
  monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
@@ -125,7 +155,17 @@ def test_serve_skips_read_requests(tmp_config_dir: Path, monkeypatch: pytest.Mon
125
155
  """
126
156
  captured: list[tuple[str, str]] = []
127
157
 
128
- def fake_send(config_store, *, method, path, operation, status_code, duration_s, project_alias):
158
+ def fake_send(
159
+ config_store,
160
+ *,
161
+ method,
162
+ path,
163
+ operation,
164
+ status_code,
165
+ duration_s,
166
+ project_alias,
167
+ conversation_id=None,
168
+ ):
129
169
  captured.append((method, operation))
130
170
 
131
171
  monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
@@ -152,7 +192,17 @@ def test_serve_does_not_wait_for_the_telemetry_post(
152
192
  """
153
193
  posted = threading.Event()
154
194
 
155
- def slow_send(config_store, *, method, path, operation, status_code, duration_s, project_alias):
195
+ def slow_send(
196
+ config_store,
197
+ *,
198
+ method,
199
+ path,
200
+ operation,
201
+ status_code,
202
+ duration_s,
203
+ project_alias,
204
+ conversation_id=None,
205
+ ):
156
206
  time.sleep(0.3)
157
207
  posted.set()
158
208
 
@@ -164,3 +214,36 @@ def test_serve_does_not_wait_for_the_telemetry_post(
164
214
  assert not posted.is_set()
165
215
  # ...but the event still fires, off the request path.
166
216
  assert posted.wait(2.0)
217
+
218
+
219
+ def test_serve_passes_the_request_conversation_id(
220
+ tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
221
+ ) -> None:
222
+ """The request's X-Conversation-ID reaches send_serve_event; its absence sends None.
223
+
224
+ That header is the agent-vs-human marker for serve (CLI-12): an agent-driven
225
+ request carries it, a human web-UI request does not.
226
+ """
227
+ captured: list[str | None] = []
228
+
229
+ def fake_send(
230
+ config_store,
231
+ *,
232
+ method,
233
+ path,
234
+ operation,
235
+ status_code,
236
+ duration_s,
237
+ project_alias,
238
+ conversation_id=None,
239
+ ):
240
+ captured.append(conversation_id)
241
+
242
+ monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
243
+ app = create_app(config_dir=str(tmp_config_dir), auth_token="tok")
244
+ with TestClient(app, raise_server_exceptions=False) as client:
245
+ headers = {"Authorization": "Bearer tok"}
246
+ client.post("/jobs/prod/run", headers={**headers, "X-Conversation-ID": "conv-xyz"}, json={})
247
+ client.post("/jobs/prod/run", headers=headers, json={})
248
+
249
+ assert captured == ["conv-xyz", None]
@@ -85,6 +85,19 @@ class TestCopyAndRepoint:
85
85
  repoint_manifest_project(m, project_id=999, api_host="other.keboola.com")
86
86
  assert m.project.id == 999
87
87
  assert m.project.api_host == "other.keboola.com"
88
+ # without a target default branch id the branch id is left as-is
89
+ assert [b.id for b in m.branches] == [0]
90
+
91
+ def test_repoint_manifest_project_remaps_default_branch(self) -> None:
92
+ # CLI-5: given the target's default branch id, the production branch
93
+ # (the fallback branch _resolve_branch_id uses) is re-pointed too, not
94
+ # left on the source project's id.
95
+ m = _manifest([]) # branches = [ManifestBranch(id=0, path="main")]
96
+ repoint_manifest_project(
97
+ m, project_id=999, api_host="other.keboola.com", default_branch_id=52099
98
+ )
99
+ assert m.project.id == 999
100
+ assert [b.id for b in m.branches] == [52099]
88
101
 
89
102
 
90
103
  class TestBucketMap:
@@ -448,6 +461,78 @@ class TestCloneProjectOrchestration:
448
461
  assert load_manifest(target_dir).project.id == 4242
449
462
  push_mock.assert_called_once()
450
463
 
464
+ def test_clone_repoints_branch_to_target_default(
465
+ self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
466
+ ) -> None:
467
+ # CLI-5: a fresh clone re-points the manifest branch onto the target's
468
+ # own default branch (from list_dev_branches), so a later diff/push with
469
+ # no --branch does not resolve the source project's branch id -- which
470
+ # does not exist in the target.
471
+ source = tmp_path / "golden"
472
+ _golden_source(source) # source manifest branch id = 0
473
+ target_dir = tmp_path / "clone"
474
+
475
+ client = MagicMock()
476
+ client.list_dev_branches.return_value = [{"id": 52099, "isDefault": True}]
477
+ svc = _service(tmp_config_dir, client)
478
+ monkeypatch.setattr(
479
+ svc,
480
+ "diff",
481
+ MagicMock(
482
+ return_value={
483
+ "changes": [{"change_type": "added", "component_id": "keboola.ex-db"}]
484
+ }
485
+ ),
486
+ )
487
+ monkeypatch.setattr(
488
+ svc,
489
+ "push",
490
+ MagicMock(
491
+ return_value={"status": "pushed", "created": 1, "flow_task_remaps": 0, "errors": []}
492
+ ),
493
+ )
494
+
495
+ svc.clone_project(source=source, target_alias="target", target_dir=target_dir)
496
+
497
+ from keboola_agent_cli.sync.manifest import load_manifest
498
+
499
+ assert [b.id for b in load_manifest(target_dir).branches] == [52099]
500
+
501
+ def test_clone_with_explicit_branch_skips_default_branch_fetch(
502
+ self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
503
+ ) -> None:
504
+ # #744: an explicit --branch wins in _resolve_branch_id, so clone must
505
+ # not spend a list_dev_branches call resolving the target's default.
506
+ source = tmp_path / "golden"
507
+ _golden_source(source)
508
+ client = MagicMock()
509
+ svc = _service(tmp_config_dir, client)
510
+ monkeypatch.setattr(
511
+ svc,
512
+ "diff",
513
+ MagicMock(
514
+ return_value={
515
+ "changes": [{"change_type": "added", "component_id": "keboola.ex-db"}]
516
+ }
517
+ ),
518
+ )
519
+ monkeypatch.setattr(
520
+ svc,
521
+ "push",
522
+ MagicMock(
523
+ return_value={"status": "pushed", "created": 1, "flow_task_remaps": 0, "errors": []}
524
+ ),
525
+ )
526
+
527
+ svc.clone_project(
528
+ source=source,
529
+ target_alias="target",
530
+ target_dir=tmp_path / "clone",
531
+ branch_override=52099,
532
+ )
533
+
534
+ client.list_dev_branches.assert_not_called()
535
+
451
536
  def test_fresh_target_guard_rejects_collision(
452
537
  self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
453
538
  ) -> None:
@@ -23,9 +23,15 @@ from keboola_agent_cli.auth.token_provider import reset_provider_registry
23
23
  _EVENTS_URL = "https://connection.keboola.com/v2/storage/events"
24
24
 
25
25
 
26
- def test_success_posts_expected_cli_event(tmp_config_dir: Path, httpx_mock) -> None:
26
+ def test_success_posts_expected_cli_event(
27
+ tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
28
+ ) -> None:
27
29
  """A successful command posts one ``ext.keboola.cli.`` event with the command path."""
28
30
  telemetry.reset()
31
+ # This test asserts the no-conversation-id branch, so it must own that env var:
32
+ # cli.py sets KBAGENT_CONVERSATION_ID directly on os.environ for --conversation-id,
33
+ # which can leak across tests in one xdist worker.
34
+ monkeypatch.delenv("KBAGENT_CONVERSATION_ID", raising=False)
29
35
  setup_single_project(tmp_config_dir) # sole project -> resolves without --project
30
36
  httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
31
37
 
@@ -42,7 +48,14 @@ def test_success_posts_expected_cli_event(tmp_config_dir: Path, httpx_mock) -> N
42
48
  assert body["component"] == "keboola.cli"
43
49
  assert "configurationId" not in body # CLI -> ext.keboola.cli. (serve adds "serve")
44
50
  assert body["type"] == "info"
45
- assert body["params"] == {"command": "config list"}
51
+ assert body["params"]["command"] == "config list"
52
+ # cliContext carries the version (via the User-Agent) into the event body,
53
+ # since the events store keeps the body, not the server-stamped envelope (CLI-12).
54
+ assert body["params"]["cliContext"]["userAgent"].startswith(
55
+ ("keboola-cli/", "keboola-agent-cli/")
56
+ )
57
+ # No KBAGENT_CONVERSATION_ID set -> no agent marker (a human invocation).
58
+ assert "conversationId" not in body["params"]["cliContext"]
46
59
  assert body["results"]["projectId"] == 258
47
60
  assert body["duration"] == 1 # ceil(0.4s)
48
61
  # The acting client identifies kbagent to Connection by its User-Agent, which
@@ -50,6 +63,58 @@ def test_success_posts_expected_cli_event(tmp_config_dir: Path, httpx_mock) -> N
50
63
  assert requests[0].headers["User-Agent"].startswith(("keboola-cli/", "keboola-agent-cli/"))
51
64
 
52
65
 
66
+ def test_conversation_id_marks_an_agent_run(
67
+ tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
68
+ ) -> None:
69
+ """A set KBAGENT_CONVERSATION_ID lands in params.cliContext.conversationId.
70
+
71
+ Presence of the id is the agent-vs-human marker KIDS reads off the event (CLI-12).
72
+ """
73
+ telemetry.reset()
74
+ setup_single_project(tmp_config_dir)
75
+ monkeypatch.setenv("KBAGENT_CONVERSATION_ID", "conv-abc123")
76
+ httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
77
+
78
+ telemetry.emit_cli_invocation(
79
+ ["kbagent", "config", "list", "--config-dir", str(tmp_config_dir)],
80
+ exit_code=0,
81
+ error=None,
82
+ duration_s=0.4,
83
+ )
84
+
85
+ body = json.loads(httpx_mock.get_requests()[0].content)
86
+ assert body["params"]["cliContext"]["conversationId"] == "conv-abc123"
87
+
88
+
89
+ def test_conversation_id_is_bounded_and_stripped(
90
+ tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
91
+ ) -> None:
92
+ """An oversized / control-character conversation id is capped and cleaned (CLI-12).
93
+
94
+ conversationId is copied into the event body like results.error, so it gets the same
95
+ bound: a caller-supplied X-Conversation-ID / env var cannot bloat the project's event
96
+ log or push the POST past the events API size cap.
97
+ """
98
+ telemetry.reset()
99
+ setup_single_project(tmp_config_dir)
100
+ monkeypatch.setenv("KBAGENT_CONVERSATION_ID", "conv\x07\x1f\x7f-" + "x" * 500)
101
+ httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
102
+
103
+ telemetry.emit_cli_invocation(
104
+ ["kbagent", "config", "list", "--config-dir", str(tmp_config_dir)],
105
+ exit_code=0,
106
+ error=None,
107
+ duration_s=0.4,
108
+ )
109
+
110
+ conv = json.loads(httpx_mock.get_requests()[0].content)["params"]["cliContext"][
111
+ "conversationId"
112
+ ]
113
+ assert all(ch.isprintable() for ch in conv) # control chars stripped
114
+ assert conv == "conv-" + "x" * (telemetry._MAX_CONVERSATION_ID_LEN - len("conv-"))
115
+ assert len(conv) == telemetry._MAX_CONVERSATION_ID_LEN
116
+
117
+
53
118
  def test_failed_command_reports_error_and_is_best_effort(tmp_config_dir: Path, httpx_mock) -> None:
54
119
  """A failed command posts ``type=error`` + message; a failing endpoint never raises."""
55
120
  telemetry.reset()
File without changes
File without changes
File without changes
File without changes