keboola-cli 0.96.2__tar.gz → 0.97.0__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 (613) hide show
  1. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/CLAUDE.md +45 -9
  2. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/PKG-INFO +1 -1
  3. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/pyproject.toml +1 -1
  4. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/changelog.py +16 -0
  5. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +79 -5
  6. keboola_cli-0.97.0/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +181 -0
  7. keboola_cli-0.97.0/src/keboola_agent_cli/commands/_semantic_layer_scope.py +252 -0
  8. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/context.py +91 -12
  9. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/semantic_layer.py +31 -3
  10. keboola_cli-0.97.0/src/keboola_agent_cli/metastore_client.py +493 -0
  11. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/permissions.py +23 -0
  12. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/_serve_command_map.py +13 -0
  13. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/semantic_layer.py +153 -7
  14. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_crud.py +11 -76
  15. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_internals.py +3 -5
  16. keboola_cli-0.97.0/src/keboola_agent_cli/services/_semantic_layer_scope.py +221 -0
  17. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/semantic_layer_service.py +238 -15
  18. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_e2e.py +41 -5
  19. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_metastore_client.py +214 -9
  20. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_ref.py +5 -1
  21. keboola_cli-0.97.0/tests/test_semantic_layer_scope.py +458 -0
  22. keboola_cli-0.97.0/tests/test_semantic_layer_scope_cli.py +440 -0
  23. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_semantic_layer_service.py +61 -44
  24. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_router_calls.py +146 -0
  25. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_semantic_layer_routes_e2e.py +3 -3
  26. keboola_cli-0.96.2/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -44
  27. keboola_cli-0.96.2/src/keboola_agent_cli/metastore_client.py +0 -315
  28. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/.gitignore +0 -0
  29. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/CONTRIBUTING.md +0 -0
  30. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/LICENSE +0 -0
  31. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/Makefile +0 -0
  32. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/README.md +0 -0
  33. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/examples/README.md +0 -0
  34. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/examples/storage_tui/README.md +0 -0
  35. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/formal/sync/README.md +0 -0
  36. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  37. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
  38. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
  39. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_command_sync.py +0 -0
  40. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_error_codes.py +0 -0
  41. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_file_size.py +0 -0
  42. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_release_scope.py +0 -0
  43. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_sentinel_guards.py +0 -0
  44. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_version_gates.py +0 -0
  45. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/check_wheel_ui.py +0 -0
  46. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/debug_linkedby_type.sh +0 -0
  47. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/file_size_baseline.json +0 -0
  48. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/gen_command_reference.py +0 -0
  49. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/gen_endpoint_reference.py +0 -0
  50. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/gen_release_notes.py +0 -0
  51. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/generate_changelog.py +0 -0
  52. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/generate_skill.py +0 -0
  53. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/hatch_build.py +0 -0
  54. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/lineage_deep.py +0 -0
  55. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/post-edit-quality.sh +0 -0
  56. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/pre-commit +0 -0
  57. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/sync_version.py +0 -0
  58. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/scripts/web-dev.sh +0 -0
  59. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/__init__.py +0 -0
  60. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/__main__.py +0 -0
  61. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/ai_client.py +0 -0
  62. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/__init__.py +0 -0
  63. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/auth_client.py +0 -0
  64. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/device.py +0 -0
  65. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/environment.py +0 -0
  66. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/models.py +0 -0
  67. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/pkce.py +0 -0
  68. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  69. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/state_store.py +0 -0
  70. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/token_provider.py +0 -0
  71. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auth/totp.py +0 -0
  72. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/auto_update.py +0 -0
  73. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/cli.py +0 -0
  74. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/__init__.py +0 -0
  75. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/_client.py +0 -0
  76. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/_core.py +0 -0
  77. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/_transfer.py +0 -0
  78. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/billing.py +0 -0
  79. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/branches.py +0 -0
  80. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/configs.py +0 -0
  81. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/editor.py +0 -0
  82. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/merge_requests.py +0 -0
  83. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/misc.py +0 -0
  84. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/notifications.py +0 -0
  85. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/query.py +0 -0
  86. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/queue.py +0 -0
  87. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/storage_files.py +0 -0
  88. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  89. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/stream.py +0 -0
  90. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/tokens.py +0 -0
  91. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/triggers.py +0 -0
  92. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/client/workspaces.py +0 -0
  93. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/__init__.py +0 -0
  94. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  95. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  96. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
  97. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
  98. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
  99. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
  100. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_data_app_password.py +0 -0
  101. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
  102. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
  103. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_helpers.py +0 -0
  104. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_merge_request_common.py +0 -0
  105. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
  106. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
  107. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  108. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_project_create.py +0 -0
  109. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
  110. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
  111. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
  112. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
  113. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
  114. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
  115. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
  116. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
  117. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/_url_copy.py +0 -0
  118. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/agent.py +0 -0
  119. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/auth.py +0 -0
  120. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/billing.py +0 -0
  121. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/branch.py +0 -0
  122. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/changelog.py +0 -0
  123. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/component.py +0 -0
  124. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/config.py +0 -0
  125. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/config_state.py +0 -0
  126. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/data_app.py +0 -0
  127. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
  128. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/docs.py +0 -0
  129. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/doctor.py +0 -0
  130. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/encrypt.py +0 -0
  131. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/feature.py +0 -0
  132. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/flow.py +0 -0
  133. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/http_client.py +0 -0
  134. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/init.py +0 -0
  135. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/job.py +0 -0
  136. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/kai.py +0 -0
  137. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/lineage.py +0 -0
  138. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/merge_request.py +0 -0
  139. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/notification.py +0 -0
  140. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/org.py +0 -0
  141. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/permissions.py +0 -0
  142. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/project.py +0 -0
  143. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/repl.py +0 -0
  144. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/schedule.py +0 -0
  145. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/search.py +0 -0
  146. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/serve.py +0 -0
  147. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/sharing.py +0 -0
  148. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/storage.py +0 -0
  149. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/stream.py +0 -0
  150. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/sync.py +0 -0
  151. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/token.py +0 -0
  152. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/transformation.py +0 -0
  153. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/version.py +0 -0
  154. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/commands/workspace.py +0 -0
  155. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/config_store.py +0 -0
  156. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/constants.py +0 -0
  157. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/data_science_client.py +0 -0
  158. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  159. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/effective_branch.py +0 -0
  160. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/errors.py +0 -0
  161. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/frozen_dist.py +0 -0
  162. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/http_base.py +0 -0
  163. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/json_utils.py +0 -0
  164. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/lib.py +0 -0
  165. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/manage_client.py +0 -0
  166. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/models.py +0 -0
  167. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/output.py +0 -0
  168. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/project_ref.py +0 -0
  169. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/py.typed +0 -0
  170. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/__init__.py +0 -0
  171. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  172. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  173. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  174. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  175. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  176. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/result_models.py +0 -0
  177. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/scheduler_client.py +0 -0
  178. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/__init__.py +0 -0
  179. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/agent_runner.py +0 -0
  180. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/agents_store.py +0 -0
  181. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/app.py +0 -0
  182. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/auth.py +0 -0
  183. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/dependencies.py +0 -0
  184. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/pricing.py +0 -0
  185. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  186. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  187. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  188. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/auth.py +0 -0
  189. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/billing.py +0 -0
  190. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  191. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/components.py +0 -0
  192. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/configs.py +0 -0
  193. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
  194. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  195. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  196. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  197. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  198. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  199. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/health.py +0 -0
  200. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
  201. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  202. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  203. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/members.py +0 -0
  204. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
  205. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
  206. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/org.py +0 -0
  207. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  208. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
  209. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/search.py +0 -0
  210. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  211. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  212. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  213. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/token.py +0 -0
  214. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  215. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
  216. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  217. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/server/sse.py +0 -0
  218. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/__init__.py +0 -0
  219. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
  220. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
  221. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_config_clone.py +0 -0
  222. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
  223. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_config_trash.py +0 -0
  224. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
  225. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
  226. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
  227. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_encryption.py +0 -0
  228. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  229. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
  230. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  231. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  232. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
  233. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
  234. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  235. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  236. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  237. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
  238. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
  239. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
  240. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  241. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
  242. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
  243. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  244. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_workspace.py +0 -0
  245. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  246. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_table_detail.py +0 -0
  247. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
  248. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  249. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
  250. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/agent_service.py +0 -0
  251. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/auth_service.py +0 -0
  252. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/base.py +0 -0
  253. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/billing_service.py +0 -0
  254. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/branch_service.py +0 -0
  255. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/component_service.py +0 -0
  256. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/config_service.py +0 -0
  257. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
  258. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/data_app_service.py +0 -0
  259. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
  260. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  261. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/docs_service.py +0 -0
  262. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  263. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  264. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/feature_service.py +0 -0
  265. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/flow_service.py +0 -0
  266. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  267. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  268. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
  269. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/job_service.py +0 -0
  270. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/kai_service.py +0 -0
  271. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  272. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/member_service.py +0 -0
  273. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
  274. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/notification_service.py +0 -0
  275. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/org_service.py +0 -0
  276. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/project_service.py +0 -0
  277. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  278. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  279. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/search_service.py +0 -0
  280. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/sharing_service.py +0 -0
  281. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  282. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/storage_service.py +0 -0
  283. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/stream_service.py +0 -0
  284. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/sync_service.py +0 -0
  285. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/table_usage.py +0 -0
  286. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/token_service.py +0 -0
  287. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  288. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/variables_service.py +0 -0
  289. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/version_service.py +0 -0
  290. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/services/workspace_service.py +0 -0
  291. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/stream_client.py +0 -0
  292. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/__init__.py +0 -0
  293. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  294. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
  295. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
  296. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/clone.py +0 -0
  297. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  298. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/config_format.py +0 -0
  299. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  300. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  301. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/manifest.py +0 -0
  302. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/naming.py +0 -0
  303. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/secrets.py +0 -0
  304. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  305. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/telemetry.py +0 -0
  306. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/update_runner.py +0 -0
  307. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/src/keboola_agent_cli/yaml_input.py +0 -0
  308. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/__init__.py +0 -0
  309. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/conftest.py +0 -0
  310. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/helpers.py +0 -0
  311. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_cli.py +0 -0
  312. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_prompt.py +0 -0
  313. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_prompt_helper.py +0 -0
  314. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_runner.py +0 -0
  315. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_service.py +0 -0
  316. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agent_tombstone.py +0 -0
  317. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_agents_store_events.py +0 -0
  318. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_ai_client.py +0 -0
  319. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_api_call_counts.py +0 -0
  320. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_client.py +0 -0
  321. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_device.py +0 -0
  322. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_environment.py +0 -0
  323. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_models.py +0 -0
  324. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_picker.py +0 -0
  325. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_pkce.py +0 -0
  326. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_register_projects.py +0 -0
  327. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_sentinel.py +0 -0
  328. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_sentinel_guards.py +0 -0
  329. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_service.py +0 -0
  330. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_state_store.py +0 -0
  331. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auth_totp.py +0 -0
  332. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_auto_update.py +0 -0
  333. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_base_service.py +0 -0
  334. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_billing_cli.py +0 -0
  335. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_billing_client.py +0 -0
  336. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_billing_service.py +0 -0
  337. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_branch_metadata_cli.py +0 -0
  338. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_branch_metadata_service.py +0 -0
  339. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_branch_registry.py +0 -0
  340. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_branch_service.py +0 -0
  341. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_build_hook.py +0 -0
  342. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_changelog_check.py +0 -0
  343. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_changelog_render.py +0 -0
  344. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_check_command_sync.py +0 -0
  345. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_check_file_size.py +0 -0
  346. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_check_release_scope.py +0 -0
  347. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_check_sentinel_guards.py +0 -0
  348. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_check_version_gates.py +0 -0
  349. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_checkbox_select.py +0 -0
  350. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_choice_enums.py +0 -0
  351. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_cli.py +0 -0
  352. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_cli_auth.py +0 -0
  353. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_client.py +0 -0
  354. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_client_device_enrollment.py +0 -0
  355. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_client_token_events.py +0 -0
  356. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_component_cli.py +0 -0
  357. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_component_service.py +0 -0
  358. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_component_sync_action.py +0 -0
  359. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_clone_cli.py +0 -0
  360. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_clone_service.py +0 -0
  361. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_create_cli.py +0 -0
  362. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_create_service.py +0 -0
  363. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_encryption.py +0 -0
  364. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_examples.py +0 -0
  365. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_metadata.py +0 -0
  366. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_rename.py +0 -0
  367. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_rename_cli.py +0 -0
  368. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_resolution.py +0 -0
  369. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_row_cli.py +0 -0
  370. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_row_service.py +0 -0
  371. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_search.py +0 -0
  372. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_search_cli.py +0 -0
  373. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_set_default_bucket.py +0 -0
  374. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_set_guard.py +0 -0
  375. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_state.py +0 -0
  376. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_store.py +0 -0
  377. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_trash.py +0 -0
  378. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_config_update.py +0 -0
  379. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_cli.py +0 -0
  380. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_git_repo.py +0 -0
  381. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_password.py +0 -0
  382. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_plain_env_keys.py +0 -0
  383. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_secrets_cli.py +0 -0
  384. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_secrets_service.py +0 -0
  385. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_service.py +0 -0
  386. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_data_app_validate_repo_service.py +0 -0
  387. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_deep_lineage_service.py +0 -0
  388. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_dev_portal_cli.py +0 -0
  389. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_dev_portal_client.py +0 -0
  390. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_dev_portal_service.py +0 -0
  391. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_docs_cli.py +0 -0
  392. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_doctor_service.py +0 -0
  393. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_e2e_auth.py +0 -0
  394. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_e2e_config_dir_mode.py +0 -0
  395. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_e2e_lineage_deep.py +0 -0
  396. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_effective_branch.py +0 -0
  397. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_encrypt_cli.py +0 -0
  398. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_encrypt_service.py +0 -0
  399. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_encryption.py +0 -0
  400. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_errors.py +0 -0
  401. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_feature_cli.py +0 -0
  402. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_feature_service.py +0 -0
  403. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_file_locking.py +0 -0
  404. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_flow_cli.py +0 -0
  405. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_flow_examples.py +0 -0
  406. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_flow_service.py +0 -0
  407. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_flow_validation.py +0 -0
  408. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_frozen_dist.py +0 -0
  409. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_gen_command_reference.py +0 -0
  410. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_gen_endpoint_reference.py +0 -0
  411. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_gen_release_notes.py +0 -0
  412. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_generate_promotion_pipeline.py +0 -0
  413. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_helpers.py +0 -0
  414. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_http_base.py +0 -0
  415. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_http_base_auth.py +0 -0
  416. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_http_client_cmd.py +0 -0
  417. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_http_forwarder_service.py +0 -0
  418. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_integration.py +0 -0
  419. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_job_idempotency_store.py +0 -0
  420. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_job_options.py +0 -0
  421. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_json_utils.py +0 -0
  422. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_kai_cli.py +0 -0
  423. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_kai_service.py +0 -0
  424. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_lib.py +0 -0
  425. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_lib_device_enrollment.py +0 -0
  426. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_license_consistency.py +0 -0
  427. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_lineage_service.py +0 -0
  428. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_local_ai_chat.py +0 -0
  429. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_manage_client.py +0 -0
  430. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_manage_token_bulk.py +0 -0
  431. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_manage_token_cli.py +0 -0
  432. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_mcp_migration_recipe.py +0 -0
  433. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_member_cli.py +0 -0
  434. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_member_service.py +0 -0
  435. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_merge_request_cli.py +0 -0
  436. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_merge_request_client.py +0 -0
  437. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_merge_request_service.py +0 -0
  438. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_migrate_cicd.py +0 -0
  439. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_models.py +0 -0
  440. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_normalize_script.py +0 -0
  441. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_notification_cli.py +0 -0
  442. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_notification_client.py +0 -0
  443. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_notification_service.py +0 -0
  444. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_org_service.py +0 -0
  445. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_output.py +0 -0
  446. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_permissions.py +0 -0
  447. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_permissions_cli.py +0 -0
  448. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_pricing.py +0 -0
  449. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_create_cli.py +0 -0
  450. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_edit.py +0 -0
  451. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_edit_cli.py +0 -0
  452. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_info_cli.py +0 -0
  453. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_project_info_service.py +0 -0
  454. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
  455. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_repl.py +0 -0
  456. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_result_models.py +0 -0
  457. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_run_broadcaster.py +0 -0
  458. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_schedule_cli.py +0 -0
  459. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_schedule_service.py +0 -0
  460. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_scheduler_client.py +0 -0
  461. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_search_cli.py +0 -0
  462. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_search_service.py +0 -0
  463. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_semantic_layer_cli.py +0 -0
  464. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_semantic_layer_schema.py +0 -0
  465. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_serve_banner_encoding.py +0 -0
  466. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_serve_conversation_id.py +0 -0
  467. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_serve_telemetry.py +0 -0
  468. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_serve_ui.py +0 -0
  469. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_auth.py +0 -0
  470. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_permissions.py +0 -0
  471. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_project_ref.py +0 -0
  472. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_server_smoke.py +0 -0
  473. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_services.py +0 -0
  474. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sharing_cli.py +0 -0
  475. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sharing_service.py +0 -0
  476. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_skill_frontmatter.py +0 -0
  477. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sql_split.py +0 -0
  478. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_clone.py +0 -0
  479. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_create_table.py +0 -0
  480. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_delete.py +0 -0
  481. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_describe_cli.py +0 -0
  482. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_describe_service.py +0 -0
  483. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_empty_definition.py +0 -0
  484. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_export_filters.py +0 -0
  485. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_files.py +0 -0
  486. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_snapshots.py +0 -0
  487. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_swap.py +0 -0
  488. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_table_definition.py +0 -0
  489. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_tables.py +0 -0
  490. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_truncate.py +0 -0
  491. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_storage_write.py +0 -0
  492. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_stream_cli.py +0 -0
  493. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_stream_client.py +0 -0
  494. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_stream_service.py +0 -0
  495. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_baseline_stamping.py +0 -0
  496. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_branch_mapping.py +0 -0
  497. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_branch_scope.py +0 -0
  498. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_cli.py +0 -0
  499. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_cli_behavior.py +0 -0
  500. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_clone.py +0 -0
  501. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_clone_links.py +0 -0
  502. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_code_extraction.py +0 -0
  503. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_config_format.py +0 -0
  504. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_data_app_type.py +0 -0
  505. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_diff_engine.py +0 -0
  506. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_e2e.py +0 -0
  507. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_encrypt.py +0 -0
  508. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_force_pull_baseline.py +0 -0
  509. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_formal_counterexamples.py +0 -0
  510. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_manifest.py +0 -0
  511. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_naming.py +0 -0
  512. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_plaintext_audit.py +0 -0
  513. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_pull_companion_files.py +0 -0
  514. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_push_script_guard.py +0 -0
  515. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_reconcile.py +0 -0
  516. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_secrets.py +0 -0
  517. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_service.py +0 -0
  518. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_storage_jobs.py +0 -0
  519. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_version_script.py +0 -0
  520. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_sync_workspaces.py +0 -0
  521. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_table_usage.py +0 -0
  522. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_telemetry.py +0 -0
  523. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_token_cli.py +0 -0
  524. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_token_provider.py +0 -0
  525. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_token_service.py +0 -0
  526. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_transformation_cli.py +0 -0
  527. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_transformation_ops.py +0 -0
  528. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_triggers_client.py +0 -0
  529. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_update_runner.py +0 -0
  530. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_url_copy.py +0 -0
  531. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_variables_cli.py +0 -0
  532. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_variables_service.py +0 -0
  533. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_version_service.py +0 -0
  534. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_workspace_cli.py +0 -0
  535. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_workspace_gc.py +0 -0
  536. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_workspace_service.py +0 -0
  537. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_workspace_sql_helper.py +0 -0
  538. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/tests/test_yaml_input.py +0 -0
  539. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/README.md +0 -0
  540. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/index.html +0 -0
  541. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/package-lock.json +0 -0
  542. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/package.json +0 -0
  543. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/postcss.config.js +0 -0
  544. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/App.tsx +0 -0
  545. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/api/client.test.ts +0 -0
  546. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/api/client.ts +0 -0
  547. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/changelogNotes.test.ts +0 -0
  548. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/changelogNotes.ts +0 -0
  549. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/AgentRunView.tsx +0 -0
  550. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/CommandPalette.tsx +0 -0
  551. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  552. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/DetailTabs.tsx +0 -0
  553. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/Drawer.tsx +0 -0
  554. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/Empty.tsx +0 -0
  555. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/JsonView.tsx +0 -0
  556. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
  557. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  558. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/PillList.tsx +0 -0
  559. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/RawDetail.tsx +0 -0
  560. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
  561. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/Table.tsx +0 -0
  562. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/components/WhatsNew.tsx +0 -0
  563. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/config/credits.test.ts +0 -0
  564. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/config/credits.ts +0 -0
  565. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/index.css +0 -0
  566. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/layout/Shell.tsx +0 -0
  567. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/layout/Sidebar.tsx +0 -0
  568. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/layout/StatusBar.tsx +0 -0
  569. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/layout/TopBar.tsx +0 -0
  570. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/lib/time.test.ts +0 -0
  571. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/lib/time.ts +0 -0
  572. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/main.tsx +0 -0
  573. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Agents.tsx +0 -0
  574. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Branches.tsx +0 -0
  575. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Changelog.tsx +0 -0
  576. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Components.tsx +0 -0
  577. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Configs.tsx +0 -0
  578. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Dashboard.tsx +0 -0
  579. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/DataApps.tsx +0 -0
  580. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Doctor.tsx +0 -0
  581. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Encrypt.tsx +0 -0
  582. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Flows.tsx +0 -0
  583. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Jobs.tsx +0 -0
  584. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/JobsAll.tsx +0 -0
  585. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Lineage.tsx +0 -0
  586. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/LocalAi.tsx +0 -0
  587. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Members.tsx +0 -0
  588. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Org.tsx +0 -0
  589. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Projects.tsx +0 -0
  590. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Schedules.tsx +0 -0
  591. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Search.tsx +0 -0
  592. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  593. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  594. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Sharing.tsx +0 -0
  595. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Storage.tsx +0 -0
  596. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Streams.tsx +0 -0
  597. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Tokens.tsx +0 -0
  598. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/TokensAll.tsx +0 -0
  599. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/Workspaces.tsx +0 -0
  600. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/jobsShared.tsx +0 -0
  601. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/storageSel.test.ts +0 -0
  602. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/tokensShared.test.ts +0 -0
  603. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/pages/tokensShared.tsx +0 -0
  604. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/router.test.ts +0 -0
  605. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/router.ts +0 -0
  606. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/state.tsx +0 -0
  607. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/theme.tsx +0 -0
  608. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/types.ts +0 -0
  609. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/useHashSelection.ts +0 -0
  610. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/src/whatsnew.ts +0 -0
  611. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/tailwind.config.ts +0 -0
  612. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/tsconfig.json +0 -0
  613. {keboola_cli-0.96.2 → keboola_cli-0.97.0}/web/frontend/vite.config.ts +0 -0
@@ -1054,7 +1054,7 @@ kbagent dev-portal deprecate --app VENDOR.APP_ID [--identity A] [--dry-run]
1054
1054
  kbagent encrypt values --project ALIAS --component-id ID --input JSON|@file|- [--output-file PATH]
1055
1055
 
1056
1056
  kbagent semantic-layer model list --project P
1057
- kbagent semantic-layer model create --project P --name N [--description D] [--sql-dialect Snowflake]
1057
+ kbagent semantic-layer model create --project P --name N [--description D] [--sql-dialect Snowflake] [--scope project|organization|targeted] [--target-project ALIAS|ID ...]
1058
1058
  kbagent semantic-layer model delete --project P --model M [--yes]
1059
1059
  kbagent semantic-layer show --project P [--model M] [--type dataset|metric|relationship|constraint|glossary]
1060
1060
  kbagent semantic-layer search-context --project P [--pattern G ...] [--type model|dataset|metric|relationship|constraint|glossary|all] [--limit N]
@@ -1092,19 +1092,55 @@ kbagent semantic-layer import --project P --file PATH [--model M] [--types T,T,.
1092
1092
  kbagent semantic-layer promote --from-project A --to-project B [--from-model M] [--to-model M] [--types T,T,...] [--dry-run] [--yes]
1093
1093
  kbagent semantic-layer build --project P [--model M] --tables T,T,... [--name N] [--dry-run] [--keep-on-failure] [--output PATH]
1094
1094
  kbagent semantic-layer token --encrypt --project P --component-id C
1095
+ # scope (PSGO-140, new): visibility scope for a semantic-layer item -- "project"
1096
+ # (owner only), "organization" (every project in the org), or "targeted" (owner +
1097
+ # explicit --target-project grants). --scope/--target-project are also accepted by `model
1098
+ # create` and every `add <kind>` above. --scope omitted: `model create` makes a "project"
1099
+ # item, `add <kind>` INHERITS its model's scope (an org-level model gets org-level children;
1100
+ # a targeted model, its target projects); an inherited organization scope is permission-gated
1101
+ # like a typed one, and a non-org-admin gets a 403 on it (pass --scope project). --target-project takes a registered alias OR a
1102
+ # numeric project ID (repeatable or comma-separated; an alias must be on the owner's stack);
1103
+ # without --scope targeted it exits 2. With --scope targeted and no --target-project: a real
1104
+ # terminal launches an interactive picker over the other projects on the stack; --json fails
1105
+ # fast (exit 2). A bad alias/ID/--scope/--type is a usage error (exit 2), never a traceback.
1106
+ # Creating directly at --scope organization requires the organization-admin ROLE (403
1107
+ # otherwise) -- an ordinary token instead uses `scope request-create` + an org-admin's
1108
+ # `scope set --scope organization`. Elevation is ONE-WAY (no downgrade endpoint), which is why
1109
+ # every `--scope organization` (here and on `model create` / `add <kind>`) is destructive-class
1110
+ # (FLAG_ESCALATIONS). `edit`, `import --overwrite` and `promote` update in place (PUT): an item
1111
+ # keeps its id, scope, grants and pending elevation request. `scope add|remove` merge into the
1112
+ # grants client-side (not atomic; refused from a project that does not own the item, because
1113
+ # the server hides the grants from a non-owner -- use `scope set --target-project` there).
1114
+ # Verbs follow the CLI spec (#791): get / add / remove / set / request-create / request-delete /
1115
+ # request-list; `scope set` takes exactly ONE of --scope organization, --target-project (replace
1116
+ # the whole list) or --clear.
1117
+ kbagent semantic-layer scope get --project P --type model|dataset|metric|relationship|constraint|glossary --context-id ID
1118
+ kbagent semantic-layer scope add --project P --type T --context-id ID --target-project ALIAS|ID [--target-project ...]
1119
+ kbagent semantic-layer scope remove --project P --type T --context-id ID --target-project ALIAS|ID [--target-project ...]
1120
+ kbagent semantic-layer scope set --project P --type T --context-id ID (--scope organization | --target-project ALIAS|ID [...] | --clear) [--dry-run] [--yes]
1121
+ kbagent semantic-layer scope request-create --project P --type T --context-id ID
1122
+ kbagent semantic-layer scope request-delete --project P --type T --context-id ID
1123
+ kbagent semantic-layer scope request-list --project P --type T [--limit N] [--offset N]
1124
+ # scope over `kbagent serve`: GET/PUT /semantic-layer/scope/{context_id}, POST/DELETE
1125
+ # .../target-projects, PUT/DELETE .../elevation-request, GET /semantic-layer/scope/elevation-requests;
1126
+ # POST /semantic-layer/models and /items/{kind} take `scope` + `target_projects`.
1095
1127
  kbagent semantic-layer reference-data list --project P [--model M]
1096
1128
  kbagent semantic-layer reference-data get --project P (--id ID | --dimension D)
1097
1129
  kbagent semantic-layer reference-data set --project P [--model M] --dimension D --members-file PATH [--dataset-id T] [--description X]
1098
1130
  kbagent semantic-layer reference-data delete --project P --id ID [--yes]
1099
1131
  # Alias: `kbagent sl ...` (hidden) is equivalent to `kbagent semantic-layer ...`.
1100
- # semantic-layer REQUIRES A MASTER (project admin) Storage token (#711): the Metastore's
1101
- # auth gate -- unlike the Storage API -- rejects every valid non-master token with an opaque
1102
- # 401 "Failed to create project scope" (the underlying MasterTokenRequiredError is swallowed
1103
- # server-side). kbagent reclassifies exactly that 401 to MISSING_MASTER_TOKEN (exit 3) with
1104
- # the remedy; other unexplained 401s anywhere map to AUTH_REJECTED instead of the false
1105
- # "Invalid or expired token" (INVALID_TOKEN stays for 401s that DO blame the credential).
1106
- # Version gate for this entry lives in gotchas.md -- `(since vNEXT)` cannot be written on
1107
- # these `# ` comment lines (check_version_gates.py parses them as ATX headings).
1132
+ # semantic-layer READS work with any valid, non-disabled, non-expired Storage token
1133
+ # (0.97.0, PSGO-282): the Metastore no longer requires a master token for GET/List. WRITES
1134
+ # (add/edit/remove/import/promote/build/scope add|remove|set) still need a project-admin token
1135
+ # (master token or any admin-role user token) -- a non-admin token 403s on the write. Before
1136
+ # PSGO-282 the Metastore's auth gate rejected EVERY valid non-master token, including reads,
1137
+ # with an opaque 401 "Failed to create project scope" (#711, MasterTokenRequiredError swallowed
1138
+ # server-side); kbagent still reclassifies exactly that 401 to MISSING_MASTER_TOKEN (exit 3) as
1139
+ # a safety net for a deployment that predates the fix. Other unexplained 401s anywhere map to
1140
+ # AUTH_REJECTED instead of the false "Invalid or expired token" (INVALID_TOKEN stays for 401s
1141
+ # that DO blame the credential). Version gate for this entry lives in gotchas.md -- `(since
1142
+ # 0.97.0)` cannot be written on these `# ` comment lines (check_version_gates.py parses them as
1143
+ # ATX headings).
1108
1144
 
1109
1145
  kbagent http get PATH [--timeout SECONDS]
1110
1146
  kbagent http post PATH [--body JSON|@file|-] [--timeout SECONDS]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: keboola-cli
3
- Version: 0.96.2
3
+ Version: 0.97.0
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.96.2"
3
+ version = "0.97.0"
4
4
  description = "AI-friendly CLI for managing Keboola projects"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -26,6 +26,22 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
26
26
 
27
27
  # Ordered newest-first. Each value is a list of brief one-line descriptions.
28
28
  CHANGELOG: dict[str, list[str]] = {
29
+ "0.97.0": [
30
+ "New (#715): semantic-layer items can now be shared with chosen projects or with the "
31
+ "whole organization, not only kept in the owning project (AI-3790). `model create` and "
32
+ "every `add <kind>` take `--scope project|targeted|organization` and `--target-project` "
33
+ "(a registered alias or a project ID). The new `semantic-layer scope` command group "
34
+ "shows and changes who sees an existing item: `get`, `add`, `remove` and `set`, plus "
35
+ "`request-create`, `request-delete` and `request-list` for requests to make an item "
36
+ "organization-wide. Without `--scope`, `model create` keeps the model in its project, "
37
+ "and `add <kind>` uses the scope of its model. Making an item organization-wide needs "
38
+ "the organization-admin role and cannot be reverted, so `--deny-destructive` blocks it. "
39
+ "`kbagent serve` has the same functions under `/semantic-layer/scope`.",
40
+ "Fix (#715): `semantic-layer edit`, `import --overwrite` and `promote` now update an item "
41
+ "in place, so it keeps its ID, its visibility and its history. Before, they deleted the "
42
+ "item and created it again with a new ID. A failed update changes nothing, so the "
43
+ "`rollback` field in the result is now always `null`.",
44
+ ],
29
45
  "0.96.2": [
30
46
  "Fix (#825): the `data-app` commands now label the app link `Open the app:` and the "
31
47
  "Keboola UI link `Configuration:`, so it is clear which link opens what. Before, the "
@@ -18,7 +18,21 @@ from ._helpers import (
18
18
  get_formatter,
19
19
  get_service,
20
20
  )
21
- from ._semantic_layer_helpers import _handle_service_call, _is_stdin_tty
21
+ from ._semantic_layer_helpers import (
22
+ ScopeChoice,
23
+ _handle_service_call,
24
+ _is_stdin_tty,
25
+ resolve_scope_targets,
26
+ )
27
+
28
+ _SCOPE_HELP = (
29
+ "Visibility: 'project' (owner only), 'organization' (every project in the org), or "
30
+ "'targeted' (owner + --target-project grants). Default: the model's own scope."
31
+ )
32
+ _TARGET_PROJECT_HELP = (
33
+ "Project alias or ID to grant visibility to (repeatable or comma-separated; "
34
+ "--scope targeted only)."
35
+ )
22
36
 
23
37
  # ---------------------------------------------------------------------------
24
38
  # semantic-layer add -- one sub-subcommand per entity type
@@ -68,10 +82,20 @@ def add_metric(
68
82
  dataset: str = typer.Option(..., "--dataset", help="Dataset tableId this metric belongs to"),
69
83
  description: str = typer.Option("", "--description", help="Optional description"),
70
84
  yes: bool = typer.Option(False, "--yes", "-y", help="Skip the dataset-mismatch warning"),
85
+ scope: ScopeChoice | None = typer.Option(None, "--scope", help=_SCOPE_HELP),
86
+ target_project: list[str] = typer.Option([], "--target-project", help=_TARGET_PROJECT_HELP),
71
87
  ) -> None:
72
88
  """Add a metric to a semantic-layer model."""
73
89
  formatter = get_formatter(ctx)
74
90
  service = get_service(ctx, "semantic_layer_service")
91
+ target_projects = resolve_scope_targets(
92
+ ctx,
93
+ operation="semantic-layer.add.metric",
94
+ scope=scope,
95
+ target_project=target_project,
96
+ owner_alias=project,
97
+ inherit_from_model=(model,),
98
+ )
75
99
  result = _handle_service_call(
76
100
  ctx,
77
101
  service.add_metric,
@@ -84,6 +108,8 @@ def add_metric(
84
108
  assume_yes=yes,
85
109
  is_tty=_is_stdin_tty(),
86
110
  confirm_cb=typer.confirm,
111
+ scope=scope,
112
+ target_projects=target_projects,
87
113
  )
88
114
  formatter.output(result, _print_item_added("metric"))
89
115
 
@@ -115,10 +141,20 @@ def add_dataset(
115
141
  'location from Storage, e.g. \'"DB"."out.c-bucket"."table"\'.'
116
142
  ),
117
143
  ),
144
+ scope: ScopeChoice | None = typer.Option(None, "--scope", help=_SCOPE_HELP),
145
+ target_project: list[str] = typer.Option([], "--target-project", help=_TARGET_PROJECT_HELP),
118
146
  ) -> None:
119
147
  """Add a dataset (FQN read from the table's Storage location)."""
120
148
  formatter = get_formatter(ctx)
121
149
  service = get_service(ctx, "semantic_layer_service")
150
+ target_projects = resolve_scope_targets(
151
+ ctx,
152
+ operation="semantic-layer.add.dataset",
153
+ scope=scope,
154
+ target_project=target_project,
155
+ owner_alias=project,
156
+ inherit_from_model=(model,),
157
+ )
122
158
  result = _handle_service_call(
123
159
  ctx,
124
160
  service.add_dataset,
@@ -131,6 +167,8 @@ def add_dataset(
131
167
  primary_key=primary_key,
132
168
  deep_fields=deep_fields,
133
169
  fqn=fqn,
170
+ scope=scope,
171
+ target_projects=target_projects,
134
172
  )
135
173
  formatter.output(result, _print_item_added("dataset"))
136
174
 
@@ -145,10 +183,20 @@ def add_relationship(
145
183
  to: str = typer.Option(..., "--to", help="Target dataset tableId"),
146
184
  on: str = typer.Option(..., "--on", help="Join condition"),
147
185
  type_: str = typer.Option("left", "--type", help="Join type: 'left' or 'inner'."),
186
+ scope: ScopeChoice | None = typer.Option(None, "--scope", help=_SCOPE_HELP),
187
+ target_project: list[str] = typer.Option([], "--target-project", help=_TARGET_PROJECT_HELP),
148
188
  ) -> None:
149
189
  """Add a relationship between two datasets."""
150
190
  formatter = get_formatter(ctx)
151
191
  service = get_service(ctx, "semantic_layer_service")
192
+ target_projects = resolve_scope_targets(
193
+ ctx,
194
+ operation="semantic-layer.add.relationship",
195
+ scope=scope,
196
+ target_project=target_project,
197
+ owner_alias=project,
198
+ inherit_from_model=(model,),
199
+ )
152
200
  result = _handle_service_call(
153
201
  ctx,
154
202
  service.add_relationship,
@@ -159,6 +207,8 @@ def add_relationship(
159
207
  to=to,
160
208
  on=on,
161
209
  type_=type_,
210
+ scope=scope,
211
+ target_projects=target_projects,
162
212
  )
163
213
  formatter.output(result, _print_item_added("relationship"))
164
214
 
@@ -194,6 +244,8 @@ def add_constraint(
194
244
  severity: str = typer.Option(
195
245
  "warning", "--severity", help="One of: error|warning|info (the 3-level API enum)."
196
246
  ),
247
+ scope: ScopeChoice | None = typer.Option(None, "--scope", help=_SCOPE_HELP),
248
+ target_project: list[str] = typer.Option([], "--target-project", help=_TARGET_PROJECT_HELP),
197
249
  ) -> None:
198
250
  """Add a constraint."""
199
251
  formatter = get_formatter(ctx)
@@ -205,6 +257,14 @@ def add_constraint(
205
257
  error_code=ErrorCode.VALIDATION_ERROR,
206
258
  )
207
259
  raise typer.Exit(code=2)
260
+ target_projects = resolve_scope_targets(
261
+ ctx,
262
+ operation="semantic-layer.add.constraint",
263
+ scope=scope,
264
+ target_project=target_project,
265
+ owner_alias=project,
266
+ inherit_from_model=(model,),
267
+ )
208
268
  result = _handle_service_call(
209
269
  ctx,
210
270
  service.add_constraint,
@@ -215,6 +275,8 @@ def add_constraint(
215
275
  rule=rule,
216
276
  metrics=metrics_list,
217
277
  severity=severity,
278
+ scope=scope,
279
+ target_projects=target_projects,
218
280
  )
219
281
  formatter.output(result, _print_item_added("constraint"))
220
282
 
@@ -226,10 +288,20 @@ def add_glossary(
226
288
  model: str | None = typer.Option(None, "--model", help="Model name or UUID"),
227
289
  term: str = typer.Option(..., "--term", help="Glossary term"),
228
290
  definition: str = typer.Option("", "--definition", help="Optional definition"),
291
+ scope: ScopeChoice | None = typer.Option(None, "--scope", help=_SCOPE_HELP),
292
+ target_project: list[str] = typer.Option([], "--target-project", help=_TARGET_PROJECT_HELP),
229
293
  ) -> None:
230
294
  """Add a glossary term."""
231
295
  formatter = get_formatter(ctx)
232
296
  service = get_service(ctx, "semantic_layer_service")
297
+ target_projects = resolve_scope_targets(
298
+ ctx,
299
+ operation="semantic-layer.add.glossary",
300
+ scope=scope,
301
+ target_project=target_project,
302
+ owner_alias=project,
303
+ inherit_from_model=(model,),
304
+ )
233
305
  result = _handle_service_call(
234
306
  ctx,
235
307
  service.add_glossary,
@@ -237,12 +309,14 @@ def add_glossary(
237
309
  model_name_or_uuid=model,
238
310
  term=term,
239
311
  definition=definition,
312
+ scope=scope,
313
+ target_projects=target_projects,
240
314
  )
241
315
  formatter.output(result, _print_item_added("glossary"))
242
316
 
243
317
 
244
318
  # ---------------------------------------------------------------------------
245
- # semantic-layer edit -- DELETE+POST with rollback + rename cascade
319
+ # semantic-layer edit -- in-place PUT + rename cascade
246
320
  # ---------------------------------------------------------------------------
247
321
 
248
322
 
@@ -250,7 +324,7 @@ edit_app = typer.Typer(
250
324
  name="edit",
251
325
  help=(
252
326
  "Edit a metric, dataset, constraint, relationship, or glossary term "
253
- "(DELETE+POST with rollback)."
327
+ "(in-place update; keeps scope and id)."
254
328
  ),
255
329
  no_args_is_help=True,
256
330
  )
@@ -383,7 +457,7 @@ def edit_constraint(
383
457
  None, "--new-metrics", help="Comma-separated list of metric names"
384
458
  ),
385
459
  ) -> None:
386
- """Edit a constraint (DELETE+POST, with local validators)."""
460
+ """Edit a constraint (in-place update, with local validators)."""
387
461
  formatter = get_formatter(ctx)
388
462
  service = get_service(ctx, "semantic_layer_service")
389
463
  metrics_list = (
@@ -420,7 +494,7 @@ def edit_relationship(
420
494
  None, "--new-type", help="Replace join type (left | inner)"
421
495
  ),
422
496
  ) -> None:
423
- """Edit a relationship (DELETE+POST). Validates ``--new-type`` locally."""
497
+ """Edit a relationship (in-place update). Validates ``--new-type`` locally."""
424
498
  formatter = get_formatter(ctx)
425
499
  service = get_service(ctx, "semantic_layer_service")
426
500
  result = _handle_service_call(
@@ -0,0 +1,181 @@
1
+ """Shared helpers for the ``semantic-layer`` command group.
2
+
3
+ Split out of :mod:`commands.semantic_layer` so that the ``add`` / ``edit`` /
4
+ ``remove`` sub-apps -- which live in :mod:`commands._semantic_layer_crud` --
5
+ can reuse the same error-handling and stdin-TTY probe without forcing a
6
+ circular import between the two command modules.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import sys
12
+ from enum import StrEnum
13
+
14
+ import typer
15
+
16
+ from ..errors import ConfigError, ErrorCode, KeboolaApiError
17
+ from ._checkbox_select import CheckboxItem, CheckboxUnavailable, checkbox_select
18
+ from ._helpers import check_cli_operation, get_formatter, get_service, map_error_to_exit_code
19
+
20
+
21
+ class ScopeChoice(StrEnum):
22
+ """Fixed values of ``--scope`` on the create commands (rendered as a click Choice)."""
23
+
24
+ PROJECT = "project"
25
+ ORGANIZATION = "organization"
26
+ TARGETED = "targeted"
27
+
28
+
29
+ class ElevationScope(StrEnum):
30
+ """``scope set --scope`` accepts only ``organization`` (scope changes are one-way)."""
31
+
32
+ ORGANIZATION = "organization"
33
+
34
+
35
+ class ItemType(StrEnum):
36
+ """Semantic item kinds addressable by ``scope`` commands (``--type``)."""
37
+
38
+ MODEL = "model"
39
+ DATASET = "dataset"
40
+ METRIC = "metric"
41
+ RELATIONSHIP = "relationship"
42
+ CONSTRAINT = "constraint"
43
+ GLOSSARY = "glossary"
44
+
45
+
46
+ def _handle_service_call(ctx: typer.Context, func, *args, **kwargs): # type: ignore[no-untyped-def]
47
+ """Run a service call, mapping ``ConfigError`` / ``KeboolaApiError`` to exit codes.
48
+
49
+ Returns the service result on success; on failure, prints the structured
50
+ error envelope (JSON mode) or a red error line (human mode) and raises
51
+ ``typer.Exit`` with the appropriate code.
52
+ """
53
+ formatter = get_formatter(ctx)
54
+ try:
55
+ return func(*args, **kwargs)
56
+ except ConfigError as exc:
57
+ formatter.error(message=exc.message, error_code=ErrorCode.CONFIG_ERROR)
58
+ raise typer.Exit(code=5) from None
59
+ except KeboolaApiError as exc:
60
+ formatter.error(
61
+ message=exc.message,
62
+ error_code=exc.error_code,
63
+ retryable=exc.retryable,
64
+ details=exc.details,
65
+ )
66
+ # A bad option value is a usage error (exit 2), not a general failure.
67
+ is_usage_error = exc.error_code == ErrorCode.INVALID_ARGUMENT
68
+ raise typer.Exit(code=2 if is_usage_error else map_error_to_exit_code(exc)) from None
69
+
70
+
71
+ def _is_stdin_tty() -> bool:
72
+ """Return ``True`` when stdin is attached to a TTY (interactive shell)."""
73
+ return hasattr(sys.stdin, "isatty") and sys.stdin.isatty()
74
+
75
+
76
+ def resolve_scope_targets(
77
+ ctx: typer.Context,
78
+ *,
79
+ operation: str,
80
+ scope: str | None,
81
+ target_project: list[str] | None,
82
+ owner_alias: str,
83
+ inherit_from_model: tuple[str | None] | None = None,
84
+ ) -> list[str] | None:
85
+ """Validate ``--scope`` / ``--target-project`` of a create command.
86
+
87
+ Returns the ``--target-project`` values (aliases or IDs; the service
88
+ resolves them) for ``--scope targeted``, else ``None``. ``--scope
89
+ organization`` is gated here as destructive (``operation`` is the command's
90
+ permission key, e.g. ``semantic-layer.add.dataset``); so is an omitted
91
+ ``--scope`` that would inherit ``organization`` from the model
92
+ (``inherit_from_model=(model,)`` on the ``add`` commands). ``--target-project``
93
+ without ``--scope targeted`` is a usage error, never silently ignored.
94
+
95
+ With ``--scope targeted`` and no target, this is the "ask when uncertain"
96
+ mechanism: on a real terminal it launches the checkbox picker over every
97
+ OTHER registered project on the owner's stack; in a non-TTY or ``--json``
98
+ context it hard-fails instead of silently defaulting -- widening an
99
+ object's visibility across projects is not a guess this CLI makes.
100
+ """
101
+ engine = ctx.obj.get("permission_engine")
102
+ if scope is None and inherit_from_model is not None and engine is not None and engine.active:
103
+ # `add <kind>` without --scope takes its model's scope: an inherited
104
+ # organization scope widens visibility just like a typed one, so it goes
105
+ # through the same permission gate.
106
+ service = get_service(ctx, "semantic_layer_service")
107
+ inherited = _handle_service_call(
108
+ ctx, service.child_scope, alias=owner_alias, model_name_or_uuid=inherit_from_model[0]
109
+ )
110
+ if inherited == "organization":
111
+ check_cli_operation(ctx, f"{operation} --scope organization")
112
+ if scope == "organization":
113
+ check_cli_operation(ctx, f"{operation} --scope organization")
114
+ if scope != "targeted":
115
+ if target_project:
116
+ get_formatter(ctx).error(
117
+ message="--target-project requires --scope targeted.",
118
+ error_code=ErrorCode.INVALID_ARGUMENT,
119
+ )
120
+ raise typer.Exit(code=2)
121
+ return None
122
+ if target_project:
123
+ return list(target_project)
124
+
125
+ formatter = get_formatter(ctx)
126
+ project_service = get_service(ctx, "project_service")
127
+ projects = project_service.list_projects()
128
+ owner_stack = next((p["stack_url"] for p in projects if p["alias"] == owner_alias), None)
129
+ candidates = [
130
+ p
131
+ for p in projects
132
+ if p["alias"] != owner_alias and (owner_stack is None or p["stack_url"] == owner_stack)
133
+ ]
134
+ if not candidates:
135
+ formatter.error(
136
+ message=(
137
+ "--scope targeted needs at least one other registered project to "
138
+ "target. Register one with `kbagent project add`, pass "
139
+ "--target-project, or use --scope project."
140
+ ),
141
+ error_code=ErrorCode.INVALID_ARGUMENT,
142
+ )
143
+ raise typer.Exit(code=2)
144
+
145
+ if formatter.json_mode:
146
+ formatter.error(
147
+ message=(
148
+ "--scope targeted requires --target-project (repeatable) in "
149
+ "--json mode -- there is no terminal to pick from."
150
+ ),
151
+ error_code=ErrorCode.INVALID_ARGUMENT,
152
+ )
153
+ raise typer.Exit(code=2)
154
+
155
+ items = [
156
+ CheckboxItem(
157
+ label=p["alias"],
158
+ hint=f"{p.get('project_name', '')} ({p.get('project_id', '?')})",
159
+ )
160
+ for p in candidates
161
+ ]
162
+ try:
163
+ selected = checkbox_select(
164
+ items, title="Select project(s) to grant visibility to (targeted scope):"
165
+ )
166
+ except CheckboxUnavailable:
167
+ formatter.error(
168
+ message=(
169
+ "--scope targeted requires --target-project (repeatable) -- no "
170
+ "interactive terminal available to pick from."
171
+ ),
172
+ error_code=ErrorCode.INVALID_ARGUMENT,
173
+ )
174
+ raise typer.Exit(code=2) from None
175
+ if not selected:
176
+ formatter.error(
177
+ message="No target project selected. Pass --target-project or use --scope project.",
178
+ error_code=ErrorCode.INVALID_ARGUMENT,
179
+ )
180
+ raise typer.Exit(code=2)
181
+ return [candidates[i]["alias"] for i in selected]