keboola-cli 0.93.2__tar.gz → 0.94.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 (580) hide show
  1. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/CLAUDE.md +69 -6
  2. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/PKG-INFO +1 -1
  3. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/pyproject.toml +1 -1
  4. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_sentinel_guards.py +39 -8
  5. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/ai_client.py +7 -6
  6. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/token_provider.py +14 -2
  7. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/changelog.py +30 -0
  8. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/cli.py +6 -0
  9. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_helpers.py +32 -0
  10. keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_common.py +334 -0
  11. keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_render.py +454 -0
  12. keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_writes.py +657 -0
  13. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/auth.py +3 -3
  14. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/branch.py +21 -5
  15. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/context.py +98 -24
  16. keboola_cli-0.94.0/src/keboola_agent_cli/commands/merge_request.py +333 -0
  17. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/sync.py +11 -2
  18. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/transformation.py +4 -23
  19. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/constants.py +5 -0
  20. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/data_science_client.py +7 -6
  21. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/errors.py +8 -10
  22. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/http_base.py +7 -0
  23. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/metastore_client.py +29 -11
  24. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/permissions.py +33 -1
  25. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/scheduler_client.py +9 -6
  26. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/_serve_command_map.py +26 -0
  27. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/app.py +35 -11
  28. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/dependencies.py +3 -0
  29. keboola_cli-0.94.0/src/keboola_agent_cli/server/routers/merge_requests.py +319 -0
  30. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_auth_registration.py +7 -15
  31. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_clone.py +31 -5
  32. keboola_cli-0.94.0/src/keboola_agent_cli/services/_sync_data_app.py +195 -0
  33. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_push_ops.py +45 -8
  34. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/base.py +38 -16
  35. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/component_service.py +4 -11
  36. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/config_service.py +11 -12
  37. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/data_app_git_service.py +4 -8
  38. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/data_app_service.py +6 -6
  39. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/docs_service.py +6 -3
  40. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/flow_service.py +11 -21
  41. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/merge_request_service.py +231 -20
  42. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/semantic_layer_service.py +3 -12
  43. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/sharing_service.py +4 -3
  44. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/stream_service.py +8 -11
  45. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/sync_service.py +122 -4
  46. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/stream_client.py +3 -6
  47. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/clone.py +43 -6
  48. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/config_format.py +12 -1
  49. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_sentinel_guards.py +72 -95
  50. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_sentinel_guards.py +34 -0
  51. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e.py +253 -0
  52. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_base_auth.py +88 -30
  53. keboola_cli-0.94.0/tests/test_merge_request_cli.py +1663 -0
  54. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_merge_request_service.py +337 -7
  55. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_metastore_client.py +100 -0
  56. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_router_calls.py +335 -0
  57. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_cli.py +33 -1
  58. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_clone.py +325 -0
  59. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_config_format.py +40 -0
  60. keboola_cli-0.94.0/tests/test_sync_data_app_type.py +510 -0
  61. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_storage_jobs.py +224 -1
  62. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_provider.py +25 -0
  63. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/package-lock.json +78 -75
  64. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/package.json +1 -1
  65. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/.gitignore +0 -0
  66. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/CONTRIBUTING.md +0 -0
  67. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/LICENSE +0 -0
  68. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/Makefile +0 -0
  69. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/README.md +0 -0
  70. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/examples/README.md +0 -0
  71. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/examples/storage_tui/README.md +0 -0
  72. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  73. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
  74. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
  75. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_command_sync.py +0 -0
  76. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_error_codes.py +0 -0
  77. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_file_size.py +0 -0
  78. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_release_scope.py +0 -0
  79. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_version_gates.py +0 -0
  80. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_wheel_ui.py +0 -0
  81. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/debug_linkedby_type.sh +0 -0
  82. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/file_size_baseline.json +0 -0
  83. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_command_reference.py +0 -0
  84. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_endpoint_reference.py +0 -0
  85. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_release_notes.py +0 -0
  86. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/generate_changelog.py +0 -0
  87. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/generate_skill.py +0 -0
  88. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/hatch_build.py +0 -0
  89. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/lineage_deep.py +0 -0
  90. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/post-edit-quality.sh +0 -0
  91. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/pre-commit +0 -0
  92. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/sync_version.py +0 -0
  93. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/web-dev.sh +0 -0
  94. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/__init__.py +0 -0
  95. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/__main__.py +0 -0
  96. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/__init__.py +0 -0
  97. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/auth_client.py +0 -0
  98. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/device.py +0 -0
  99. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/environment.py +0 -0
  100. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/models.py +0 -0
  101. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/pkce.py +0 -0
  102. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  103. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/state_store.py +0 -0
  104. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/totp.py +0 -0
  105. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auto_update.py +0 -0
  106. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/__init__.py +0 -0
  107. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_client.py +0 -0
  108. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_core.py +0 -0
  109. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_transfer.py +0 -0
  110. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/billing.py +0 -0
  111. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/branches.py +0 -0
  112. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/configs.py +0 -0
  113. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/merge_requests.py +0 -0
  114. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/misc.py +0 -0
  115. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/notifications.py +0 -0
  116. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/query.py +0 -0
  117. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/queue.py +0 -0
  118. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/storage_files.py +0 -0
  119. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  120. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/stream.py +0 -0
  121. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/tokens.py +0 -0
  122. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/triggers.py +0 -0
  123. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/workspaces.py +0 -0
  124. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/__init__.py +0 -0
  125. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  126. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  127. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
  128. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
  129. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
  130. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
  131. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
  132. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
  133. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  134. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
  135. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
  136. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
  137. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
  138. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
  139. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
  140. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
  141. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/agent.py +0 -0
  142. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/billing.py +0 -0
  143. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/changelog.py +0 -0
  144. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/component.py +0 -0
  145. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/config.py +0 -0
  146. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/config_state.py +0 -0
  147. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/data_app.py +0 -0
  148. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
  149. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/docs.py +0 -0
  150. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/doctor.py +0 -0
  151. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/encrypt.py +0 -0
  152. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/feature.py +0 -0
  153. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/flow.py +0 -0
  154. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/http_client.py +0 -0
  155. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/init.py +0 -0
  156. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/job.py +0 -0
  157. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/kai.py +0 -0
  158. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/lineage.py +0 -0
  159. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/notification.py +0 -0
  160. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/org.py +0 -0
  161. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/permissions.py +0 -0
  162. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/project.py +0 -0
  163. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/repl.py +0 -0
  164. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/schedule.py +0 -0
  165. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/search.py +0 -0
  166. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
  167. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/serve.py +0 -0
  168. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/sharing.py +0 -0
  169. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/storage.py +0 -0
  170. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/stream.py +0 -0
  171. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/token.py +0 -0
  172. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/version.py +0 -0
  173. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/workspace.py +0 -0
  174. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/config_store.py +0 -0
  175. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  176. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/frozen_dist.py +0 -0
  177. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/json_utils.py +0 -0
  178. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/lib.py +0 -0
  179. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/manage_client.py +0 -0
  180. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/models.py +0 -0
  181. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/output.py +0 -0
  182. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/py.typed +0 -0
  183. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/__init__.py +0 -0
  184. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  185. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  186. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  187. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  188. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  189. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/result_models.py +0 -0
  190. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/__init__.py +0 -0
  191. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/agent_runner.py +0 -0
  192. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/agents_store.py +0 -0
  193. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/auth.py +0 -0
  194. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/pricing.py +0 -0
  195. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  196. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  197. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  198. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/auth.py +0 -0
  199. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/billing.py +0 -0
  200. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  201. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/components.py +0 -0
  202. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/configs.py +0 -0
  203. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
  204. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  205. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  206. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  207. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  208. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  209. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/health.py +0 -0
  210. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
  211. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  212. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  213. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/members.py +0 -0
  214. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
  215. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/org.py +0 -0
  216. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  217. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
  218. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/search.py +0 -0
  219. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
  220. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  221. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  222. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  223. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/token.py +0 -0
  224. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  225. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
  226. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  227. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/sse.py +0 -0
  228. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/__init__.py +0 -0
  229. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
  230. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_clone.py +0 -0
  231. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
  232. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_trash.py +0 -0
  233. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
  234. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
  235. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_encryption.py +0 -0
  236. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  237. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
  238. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
  239. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  240. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  241. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
  242. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
  243. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  244. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  245. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  246. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  247. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  248. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  249. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_table_detail.py +0 -0
  250. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
  251. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  252. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
  253. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/agent_service.py +0 -0
  254. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/auth_service.py +0 -0
  255. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/billing_service.py +0 -0
  256. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/branch_service.py +0 -0
  257. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
  258. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  259. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  260. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  261. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/feature_service.py +0 -0
  262. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  263. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  264. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
  265. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/job_service.py +0 -0
  266. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/kai_service.py +0 -0
  267. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  268. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/member_service.py +0 -0
  269. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/notification_service.py +0 -0
  270. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/org_service.py +0 -0
  271. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/project_service.py +0 -0
  272. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  273. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  274. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/search_service.py +0 -0
  275. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  276. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/storage_service.py +0 -0
  277. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/table_usage.py +0 -0
  278. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/token_service.py +0 -0
  279. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  280. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/variables_service.py +0 -0
  281. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/version_service.py +0 -0
  282. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/workspace_service.py +0 -0
  283. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/__init__.py +0 -0
  284. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  285. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
  286. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
  287. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  288. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  289. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  290. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/manifest.py +0 -0
  291. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/naming.py +0 -0
  292. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/secrets.py +0 -0
  293. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  294. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/telemetry.py +0 -0
  295. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/update_runner.py +0 -0
  296. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/yaml_input.py +0 -0
  297. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/__init__.py +0 -0
  298. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/conftest.py +0 -0
  299. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/helpers.py +0 -0
  300. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_cli.py +0 -0
  301. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_prompt.py +0 -0
  302. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_prompt_helper.py +0 -0
  303. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_runner.py +0 -0
  304. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_service.py +0 -0
  305. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_tombstone.py +0 -0
  306. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agents_store_events.py +0 -0
  307. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_ai_client.py +0 -0
  308. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_client.py +0 -0
  309. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_device.py +0 -0
  310. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_environment.py +0 -0
  311. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_models.py +0 -0
  312. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_picker.py +0 -0
  313. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_pkce.py +0 -0
  314. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_register_projects.py +0 -0
  315. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_sentinel.py +0 -0
  316. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_service.py +0 -0
  317. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_state_store.py +0 -0
  318. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_totp.py +0 -0
  319. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auto_update.py +0 -0
  320. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_base_service.py +0 -0
  321. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_cli.py +0 -0
  322. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_client.py +0 -0
  323. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_service.py +0 -0
  324. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_metadata_cli.py +0 -0
  325. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_metadata_service.py +0 -0
  326. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_registry.py +0 -0
  327. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_service.py +0 -0
  328. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_build_hook.py +0 -0
  329. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_changelog_check.py +0 -0
  330. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_changelog_render.py +0 -0
  331. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_command_sync.py +0 -0
  332. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_file_size.py +0 -0
  333. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_release_scope.py +0 -0
  334. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_version_gates.py +0 -0
  335. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_checkbox_select.py +0 -0
  336. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_choice_enums.py +0 -0
  337. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_cli.py +0 -0
  338. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_cli_auth.py +0 -0
  339. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client.py +0 -0
  340. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client_device_enrollment.py +0 -0
  341. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client_token_events.py +0 -0
  342. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_cli.py +0 -0
  343. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_service.py +0 -0
  344. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_sync_action.py +0 -0
  345. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_clone_cli.py +0 -0
  346. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_clone_service.py +0 -0
  347. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_create_cli.py +0 -0
  348. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_create_service.py +0 -0
  349. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_encryption.py +0 -0
  350. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_examples.py +0 -0
  351. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_metadata.py +0 -0
  352. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_rename.py +0 -0
  353. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_rename_cli.py +0 -0
  354. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_resolution.py +0 -0
  355. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_row_cli.py +0 -0
  356. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_row_service.py +0 -0
  357. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_search.py +0 -0
  358. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_search_cli.py +0 -0
  359. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_set_default_bucket.py +0 -0
  360. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_set_guard.py +0 -0
  361. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_state.py +0 -0
  362. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_store.py +0 -0
  363. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_trash.py +0 -0
  364. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_update.py +0 -0
  365. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_cli.py +0 -0
  366. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_git_repo.py +0 -0
  367. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_plain_env_keys.py +0 -0
  368. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_secrets_cli.py +0 -0
  369. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_secrets_service.py +0 -0
  370. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_service.py +0 -0
  371. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_validate_repo_service.py +0 -0
  372. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_deep_lineage_service.py +0 -0
  373. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_cli.py +0 -0
  374. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_client.py +0 -0
  375. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_service.py +0 -0
  376. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_docs_cli.py +0 -0
  377. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_doctor_service.py +0 -0
  378. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_auth.py +0 -0
  379. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_config_dir_mode.py +0 -0
  380. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_lineage_deep.py +0 -0
  381. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encrypt_cli.py +0 -0
  382. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encrypt_service.py +0 -0
  383. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encryption.py +0 -0
  384. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_errors.py +0 -0
  385. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_feature_cli.py +0 -0
  386. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_feature_service.py +0 -0
  387. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_file_locking.py +0 -0
  388. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_cli.py +0 -0
  389. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_examples.py +0 -0
  390. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_service.py +0 -0
  391. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_validation.py +0 -0
  392. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_frozen_dist.py +0 -0
  393. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_command_reference.py +0 -0
  394. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_endpoint_reference.py +0 -0
  395. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_release_notes.py +0 -0
  396. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_generate_promotion_pipeline.py +0 -0
  397. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_helpers.py +0 -0
  398. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_base.py +0 -0
  399. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_client_cmd.py +0 -0
  400. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_forwarder_service.py +0 -0
  401. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_integration.py +0 -0
  402. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_job_idempotency_store.py +0 -0
  403. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_job_options.py +0 -0
  404. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_json_utils.py +0 -0
  405. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_kai_cli.py +0 -0
  406. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_kai_service.py +0 -0
  407. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lib.py +0 -0
  408. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lib_device_enrollment.py +0 -0
  409. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_license_consistency.py +0 -0
  410. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lineage_service.py +0 -0
  411. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_local_ai_chat.py +0 -0
  412. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_client.py +0 -0
  413. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_token_bulk.py +0 -0
  414. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_token_cli.py +0 -0
  415. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_mcp_migration_recipe.py +0 -0
  416. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_member_cli.py +0 -0
  417. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_member_service.py +0 -0
  418. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_merge_request_client.py +0 -0
  419. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_migrate_cicd.py +0 -0
  420. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_models.py +0 -0
  421. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_normalize_script.py +0 -0
  422. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_cli.py +0 -0
  423. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_client.py +0 -0
  424. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_service.py +0 -0
  425. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_org_service.py +0 -0
  426. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_output.py +0 -0
  427. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_permissions.py +0 -0
  428. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_permissions_cli.py +0 -0
  429. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_pricing.py +0 -0
  430. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_edit.py +0 -0
  431. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_edit_cli.py +0 -0
  432. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_info_cli.py +0 -0
  433. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_info_service.py +0 -0
  434. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
  435. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_repl.py +0 -0
  436. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_result_models.py +0 -0
  437. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_run_broadcaster.py +0 -0
  438. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_schedule_cli.py +0 -0
  439. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_schedule_service.py +0 -0
  440. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_scheduler_client.py +0 -0
  441. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_search_cli.py +0 -0
  442. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_search_service.py +0 -0
  443. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_cli.py +0 -0
  444. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_schema.py +0 -0
  445. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_service.py +0 -0
  446. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_banner_encoding.py +0 -0
  447. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_conversation_id.py +0 -0
  448. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_telemetry.py +0 -0
  449. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_ui.py +0 -0
  450. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_auth.py +0 -0
  451. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_permissions.py +0 -0
  452. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
  453. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_smoke.py +0 -0
  454. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_services.py +0 -0
  455. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sharing_cli.py +0 -0
  456. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sharing_service.py +0 -0
  457. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_skill_frontmatter.py +0 -0
  458. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sql_split.py +0 -0
  459. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_clone.py +0 -0
  460. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_create_table.py +0 -0
  461. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_delete.py +0 -0
  462. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_describe_cli.py +0 -0
  463. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_describe_service.py +0 -0
  464. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_empty_definition.py +0 -0
  465. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_export_filters.py +0 -0
  466. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_files.py +0 -0
  467. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_snapshots.py +0 -0
  468. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_swap.py +0 -0
  469. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_table_definition.py +0 -0
  470. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_tables.py +0 -0
  471. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_truncate.py +0 -0
  472. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_write.py +0 -0
  473. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_cli.py +0 -0
  474. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_client.py +0 -0
  475. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_service.py +0 -0
  476. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_baseline_stamping.py +0 -0
  477. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_branch_mapping.py +0 -0
  478. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_cli_behavior.py +0 -0
  479. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_code_extraction.py +0 -0
  480. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_diff_engine.py +0 -0
  481. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_e2e.py +0 -0
  482. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_encrypt.py +0 -0
  483. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_force_pull_baseline.py +0 -0
  484. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_manifest.py +0 -0
  485. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_naming.py +0 -0
  486. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_plaintext_audit.py +0 -0
  487. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_push_script_guard.py +0 -0
  488. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_reconcile.py +0 -0
  489. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_secrets.py +0 -0
  490. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_service.py +0 -0
  491. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_version_script.py +0 -0
  492. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_table_usage.py +0 -0
  493. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_telemetry.py +0 -0
  494. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_cli.py +0 -0
  495. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_service.py +0 -0
  496. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_transformation_cli.py +0 -0
  497. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_transformation_ops.py +0 -0
  498. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_triggers_client.py +0 -0
  499. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_update_runner.py +0 -0
  500. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_variables_cli.py +0 -0
  501. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_variables_service.py +0 -0
  502. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_version_service.py +0 -0
  503. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_cli.py +0 -0
  504. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_gc.py +0 -0
  505. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_service.py +0 -0
  506. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_sql_helper.py +0 -0
  507. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_yaml_input.py +0 -0
  508. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/README.md +0 -0
  509. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/index.html +0 -0
  510. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/postcss.config.js +0 -0
  511. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/App.tsx +0 -0
  512. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/api/client.test.ts +0 -0
  513. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/api/client.ts +0 -0
  514. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/changelogNotes.test.ts +0 -0
  515. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/changelogNotes.ts +0 -0
  516. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/AgentRunView.tsx +0 -0
  517. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/CommandPalette.tsx +0 -0
  518. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  519. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/DetailTabs.tsx +0 -0
  520. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Drawer.tsx +0 -0
  521. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Empty.tsx +0 -0
  522. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/JsonView.tsx +0 -0
  523. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
  524. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  525. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/PillList.tsx +0 -0
  526. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/RawDetail.tsx +0 -0
  527. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
  528. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Table.tsx +0 -0
  529. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/WhatsNew.tsx +0 -0
  530. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/config/credits.test.ts +0 -0
  531. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/config/credits.ts +0 -0
  532. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/index.css +0 -0
  533. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/Shell.tsx +0 -0
  534. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/Sidebar.tsx +0 -0
  535. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/StatusBar.tsx +0 -0
  536. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/TopBar.tsx +0 -0
  537. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/lib/time.test.ts +0 -0
  538. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/lib/time.ts +0 -0
  539. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/main.tsx +0 -0
  540. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Agents.tsx +0 -0
  541. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Branches.tsx +0 -0
  542. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Changelog.tsx +0 -0
  543. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Components.tsx +0 -0
  544. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Configs.tsx +0 -0
  545. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Dashboard.tsx +0 -0
  546. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/DataApps.tsx +0 -0
  547. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Doctor.tsx +0 -0
  548. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Encrypt.tsx +0 -0
  549. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Flows.tsx +0 -0
  550. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Jobs.tsx +0 -0
  551. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/JobsAll.tsx +0 -0
  552. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Lineage.tsx +0 -0
  553. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/LocalAi.tsx +0 -0
  554. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Members.tsx +0 -0
  555. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Org.tsx +0 -0
  556. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Projects.tsx +0 -0
  557. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Schedules.tsx +0 -0
  558. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Search.tsx +0 -0
  559. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  560. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  561. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Sharing.tsx +0 -0
  562. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Storage.tsx +0 -0
  563. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Streams.tsx +0 -0
  564. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Tokens.tsx +0 -0
  565. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/TokensAll.tsx +0 -0
  566. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Workspaces.tsx +0 -0
  567. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/jobsShared.tsx +0 -0
  568. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/storageSel.test.ts +0 -0
  569. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/tokensShared.test.ts +0 -0
  570. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/tokensShared.tsx +0 -0
  571. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/router.test.ts +0 -0
  572. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/router.ts +0 -0
  573. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/state.tsx +0 -0
  574. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/theme.tsx +0 -0
  575. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/types.ts +0 -0
  576. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/useHashSelection.ts +0 -0
  577. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/whatsnew.ts +0 -0
  578. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/tailwind.config.ts +0 -0
  579. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/tsconfig.json +0 -0
  580. {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/vite.config.ts +0 -0
@@ -392,12 +392,14 @@ kbagent auth register-projects [--stack URL|alias] [--all] [--project-id ID ...]
392
392
  # USER-scoped "programmatic session" (kbc_at_* access token + kbc_rt_* refresh token) stored in
393
393
  # auth.json (0600), a sibling of config.json -- config.json's schema and CURRENT_CONFIG_VERSION are
394
394
  # unchanged. --register-projects writes each accessible project into config.json with the sentinel
395
- # token `kbc-session://{project_id}`. v1 scope is the Storage + Manage paths: the CLI commands and
396
- # `serve` both reach them, because `serve` delegates to the same already-guarded services (see
397
- # server/dependencies.py). Everything outside those paths fails fast on a sentinel-token project
398
- # (AUTH_NOT_SUPPORTED_ON_STACK) naming the static-token fallback; the authoritative list is
399
- # SESSION_UNSUPPORTED_FEATURES in services/_auth_registration.py, shipped to callers as
400
- # `session_unsupported_features` in --json -- do not re-derive it by hand. `dev-portal` is NOT on it
395
+ # token `kbc-session://{project_id}`. A session now works with nearly every command -- the Storage
396
+ # and Manage client paths plus (added by CLI-13) the Scheduler (flow schedule / schedule-remove),
397
+ # Data Streams (stream), Data Science (data-app), the semantic-layer group, the AI Service, and
398
+ # Storage bucket sharing (sharing share / unshare). `serve` reaches them too, because it delegates to
399
+ # the same already-guarded services (see server/dependencies.py). Only three features still fail fast
400
+ # on a sentinel-token project (AUTH_NOT_SUPPORTED_ON_STACK) naming the static-token fallback: the
401
+ # authoritative list is SESSION_UNSUPPORTED_FEATURES in services/_auth_registration.py, shipped to
402
+ # callers as `session_unsupported_features` in --json -- do not re-derive it by hand. `dev-portal` is NOT on it
401
403
  # (it authenticates with its own identity, never a project token). Over `serve`, a session that
402
404
  # expires at runtime answers HTTP 401 with
403
405
  # error_code SESSION_EXPIRED -- a browser login only completes on the host. Serving session projects
@@ -737,6 +739,67 @@ kbagent branch metadata-list --project NAME [--branch ID|default]
737
739
  kbagent branch metadata-get --project NAME --key KEY [--branch ID|default]
738
740
  kbagent branch metadata-set --project NAME --key KEY [--text STR | --file PATH | --stdin] [--branch ID|default]
739
741
  kbagent branch metadata-delete --project NAME --metadata-id ID [--branch ID|default]
742
+ # branch merge is DEPRECATED (since 0.94.0): it only builds a UI URL and resets the active branch. On a
743
+ # project with `branches-merge-requests` use the merge-request group below; the command keeps working
744
+ # (it also serves projects without the feature) and now carries `deprecation` in --json.
745
+
746
+ # merge-request (since 0.94.0, DMD-1900): the non-SOX Branches 2.0 lifecycle. Hidden alias `mr`. Every
747
+ # command except list/create takes `[--merge-request-id N | --id N] [--branch B]`: omitted, the target is
748
+ # the merge request OF the active branch (`branch use`) -- a branch has at most one MR, ever. Both flags at
749
+ # once -> exit 2. `--project` is single-project (never fans out). Status is the DERIVED state the web UI
750
+ # shows (in_development|in_review|approved|in_merge|merged|closed|rejected), never the raw one.
751
+ kbagent merge-request list [--project A] [--state STATE] # derived (in_development|in_review|approved|in_merge|merged|closed|rejected) or raw (development|published|canceled) states; `--help` lists them
752
+ kbagent merge-request detail [--project A] [--merge-request-id N | --branch B] [--activity-log]
753
+ kbagent merge-request create --title T [--project A] [--branch B] [--description D] [--reviewer-id ID ...] [--external-id X]
754
+ kbagent merge-request update [--project A] [--merge-request-id N | --branch B] [--title T] [--description D] [--reviewer-id ID ...] [--external-id X]
755
+ kbagent merge-request request-review [--project A] [--merge-request-id N | --branch B]
756
+ kbagent merge-request approve [--project A] [--merge-request-id N | --branch B]
757
+ kbagent merge-request request-changes [--project A] [--merge-request-id N | --branch B] [--reason TEXT]
758
+ kbagent merge-request auto-merge --strategy immediately|scheduled|none [--at TS] [--project A] [--merge-request-id N | --branch B] [--yes]
759
+ kbagent merge-request merge [--project A] [--merge-request-id N | --branch B] [--yes]
760
+ kbagent merge-request conflicts [--project A] [--merge-request-id N | --branch B]
761
+ kbagent merge-request diff --component-id C --config-id I [--project A] [--merge-request-id N | --branch B] [--format short|full] [--output PATH]
762
+ kbagent merge-request resolve --component-id C --config-id I (--take ours|theirs|delete | --resolved JSON|@file|-) [--project A] [--merge-request-id N | --branch B] [--change-description TEXT]
763
+ # WHAT IS DESTRUCTIVE -- a property of the COMMAND, never of a flag or of the MR's state, so a policy is
764
+ # evaluated from the command name alone, before any network call. Destructive = anything that moves a
765
+ # merge request toward or into production: `merge` (deletes the source branch, rewrites production),
766
+ # `request-review` (on the non-SOX default of 0 approvals it lands the MR directly in `approved`),
767
+ # `approve` (the last approval is what a merge waits for), `resolve` (removes the blocker a merge waits
768
+ # on) and `auto-merge` (arms a backend scheduler that runs every `approved` MR whose strategy is
769
+ # immediately/scheduled through the same MergeProcessor, on its own, retrying every tick -- a DELAYED
770
+ # PRODUCTION MERGE with `merge` never called; `--strategy none` disarms and rides the same command, same
771
+ # class). Write = shapes the MR without moving it: `create`, `update` (title/description/reviewers/
772
+ # external id -- auto-merge is NOT a field here), `request-changes` (moves it AWAY from approved).
773
+ # So `--deny-destructive` yields an agent that can observe and shape merge requests but never move one.
774
+ # Under --json every destructive command REQUIRES an explicit target (--merge-request-id or --branch),
775
+ # checked before anything is resolved: every destructive kbagent command either prompts or is told its
776
+ # target, and --json has no prompt. In human mode the active-branch fallback stays; `merge` and arming
777
+ # `auto-merge` prompt (--yes skips), the other destructive commands do not. After request-review/
778
+ # approve/resolve on an MR that IS armed, human mode warns that the backend will now merge (read off the
779
+ # write's own result, no extra GET).
780
+ # On a non-SOX project with the default 0 required approvals: `merge` works straight from `development`;
781
+ # `request-review` lands directly in `approved` (in_review is unreachable); `approve` answers 422 in every
782
+ # state. There is NO `close`: `request-changes` by the creator is the UI's cancel and leaves the MR in
783
+ # `development` (the `closed`/`rejected` derivations depend on reviewer status a 0-approval project never
784
+ # populates -- same blind spot as the web UI, DMD-1988). Requesting review with no reviewers selected
785
+ # emails EVERY project member.
786
+ # Conflicts: `conflicts` lists what changed on both sides (isDeleted = the DEV side's flag); `diff`
787
+ # classifies per path (both / only you / only production) and, when a side deleted the config wholesale,
788
+ # recommends the --take; `diff --output FILE` writes `resolution_candidate` (your branch's content, all
789
+ # five keys: name/description/isDisabled/configuration/rows -- rebase REPLACES, a missing key wipes data,
790
+ # the service refuses a partial body) to edit and hand back via `resolve --resolved @FILE`. No `--all`.
791
+ # Errors: a project without the feature answers FEATURE_NOT_ENABLED (exit 5) from every command whose
792
+ # target was resolved implicitly, reads included -- two wordings, missing feature vs SOX project. A
793
+ # scoped Storage token 403s (ACCESS_DENIED) on everything but `list`. `MR_MERGE_CONFLICT` /
794
+ # `MR_NOT_READY_TO_MERGE` (exit 1; the latter retryable) come from the merge 409; a truncated conflict
795
+ # list in the error carries `details.api_error_params_truncated: true` -- run `conflicts` for the full set.
796
+ # `merge` blocks for up to 10 minutes (no --wait/--timeout). Every result may carry `warnings[]`
797
+ # (post-merge cleanup failures, a dropped --change-description on a delete resolution). A merge whose
798
+ # source branch id could not be read carries `cleanup_skipped: true` + `branch_from_id_raw` (the local
799
+ # active-branch reset / sync unlink did NOT run -- key on the flag, not on warning text). On a project
800
+ # where the feature was later switched OFF, `list` rows' `allowed_actions` still recommend writes that
801
+ # will fail FEATURE_NOT_ENABLED (state-derived, feature-blind); `detail` carries `feature_enabled` and
802
+ # its hint-next respects it.
740
803
 
741
804
  kbagent workspace create --project ALIAS [--name NAME] [--backend TYPE] [--ui] [--read-only/--no-read-only]
742
805
  kbagent workspace list [--project NAME ...] [--orphaned] [--branch ID] [--qs-compatible]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: keboola-cli
3
- Version: 0.93.2
3
+ Version: 0.94.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.93.2"
3
+ version = "0.94.0"
4
4
  description = "AI-friendly CLI for managing Keboola projects"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -113,7 +113,34 @@ CREDENTIAL_WRITE_ALLOWED = {
113
113
  # endpoint-family mixins -- every one of them a class that runs that same
114
114
  # `__init__` -- outside the check. `KeboolaClient` stays listed because it is the
115
115
  # name a reader looks for here; it is already covered as a descendant.
116
- PROJECT_CREDENTIAL_CLIENTS = {"_CoreClient", "KeboolaClient"}
116
+ #
117
+ # CLI-13: the five service clients below reach their backend over a bearer and
118
+ # dropped `SESSION_AUTH_FEATURE`, so the `http_base.py` runtime guard no longer
119
+ # stops a direct construction from a `kbc-session://` `project.token`. They are
120
+ # built only by `make_session_aware_client_factory` (sentinel-aware); listing
121
+ # them here makes Check 4 guard every OTHER construction site, restoring the net
122
+ # their dropped guard removed.
123
+ PROJECT_CREDENTIAL_CLIENTS = {
124
+ "_CoreClient",
125
+ "KeboolaClient",
126
+ "SchedulerClient",
127
+ "StreamClient",
128
+ "DataScienceClient",
129
+ "MetastoreClient",
130
+ "AiServiceClient",
131
+ }
132
+
133
+ # Check 4 exemptions keyed `<file>::<enclosing function>`, each with a reason --
134
+ # a construction that is provably safe even though its own scope is not
135
+ # sentinel-aware. Mirrors `CREDENTIAL_WRITE_ALLOWED` for Check 1.
136
+ PROJECT_CLIENT_CONSTRUCTION_ALLOWED = {
137
+ "client/stream.py::_get_stream_client": (
138
+ "built from the parent client's already-resolved (token, http_auth): a "
139
+ "session parent carries token='' + a BearerAuth hook, a static parent a "
140
+ "real token + no hook, so a raw sentinel can never reach it "
141
+ "(test_http_base_auth.py::test_stream_sub_client_inherits_the_bearer_hook)"
142
+ ),
143
+ }
117
144
 
118
145
  # Check 2: clients that reach Storage or Manage over bearer, or authenticate
119
146
  # with an identity of their own, and so must NOT be guarded. Anything else must
@@ -123,6 +150,13 @@ BEARER_CAPABLE_CLIENTS = {
123
150
  "ManageClient", # Manage: the supported bearer path
124
151
  "AuthClient", # talks to the auth service itself, token=""
125
152
  "DeveloperPortalClient", # own username/password identity, never a project token
153
+ # CLI-13: these reach their backend over a bearer via
154
+ # make_session_aware_client_factory; the backends accept OAuth tokens.
155
+ "SchedulerClient",
156
+ "StreamClient",
157
+ "DataScienceClient",
158
+ "MetastoreClient",
159
+ "AiServiceClient",
126
160
  }
127
161
 
128
162
  # Check 3: guards that describe no user-reachable command surface.
@@ -133,15 +167,9 @@ FEATURE_EXEMPT_GUARDS = {
133
167
  # Guard wording -> the substring of the user-facing entry that covers it, so
134
168
  # both can read naturally without being byte-identical.
135
169
  FEATURE_ALIASES = {
136
- "The Keboola AI Service": "AI Service",
137
- "The Scheduler Service": "Scheduler Service",
138
- "The Metastore Service (semantic layer)": "Metastore Service",
139
170
  "semantic-layer token --encrypt": "Metastore Service",
140
- "The Data Science Service (data apps)": "Data Science Service",
141
- "The Data Streams Service": "Data Streams Service",
142
171
  "The importable SDK Client": "importable SDK",
143
172
  "kbagent kai": "kbagent kai",
144
- "kbagent sharing (master-token path)": "kbagent sharing",
145
173
  }
146
174
 
147
175
 
@@ -390,6 +418,7 @@ def _unguarded_project_clients(root: Path = SRC_ROOT) -> list[str]:
390
418
  # same finding under a different name.
391
419
  credential_clients = _descendants_of(root, set(PROJECT_CREDENTIAL_CLIENTS))
392
420
  for path in _py_files(root):
421
+ rel = _rel(path, root)
393
422
  source = path.read_text(encoding="utf-8")
394
423
  tree = ast.parse(source)
395
424
  parents = _parent_map(tree)
@@ -408,7 +437,9 @@ def _unguarded_project_clients(root: Path = SRC_ROOT) -> list[str]:
408
437
  if _scope_is_sentinel_aware(node, parents, source):
409
438
  continue
410
439
  scope = _enclosing_function_name(node, parents)
411
- offenders.append(f"{_rel(path, root)}:{node.lineno} (in {scope})")
440
+ if f"{rel}::{scope}" in PROJECT_CLIENT_CONSTRUCTION_ALLOWED:
441
+ continue
442
+ offenders.append(f"{rel}:{node.lineno} (in {scope})")
412
443
  return offenders
413
444
 
414
445
 
@@ -12,6 +12,8 @@ import logging
12
12
  from typing import Any, Self
13
13
  from urllib.parse import quote
14
14
 
15
+ import httpx
16
+
15
17
  from .constants import AI_SERVICE_TIMEOUT
16
18
  from .http_base import BaseHttpClient
17
19
 
@@ -28,19 +30,18 @@ class AiServiceClient(BaseHttpClient):
28
30
  Inherits _do_request() and _raise_api_error() from BaseHttpClient.
29
31
  """
30
32
 
31
- SESSION_AUTH_FEATURE = "The Keboola AI Service"
32
-
33
- def __init__(self, stack_url: str, token: str) -> None:
33
+ def __init__(self, stack_url: str, token: str, *, http_auth: httpx.Auth | None = None) -> None:
34
34
  self._stack_url = stack_url.rstrip("/")
35
35
  ai_base_url = self._derive_service_url(self._stack_url, "ai")
36
- headers = {
37
- "X-StorageApi-Token": token,
38
- }
36
+ headers: dict[str, str] = {}
37
+ if http_auth is None:
38
+ headers["X-StorageApi-Token"] = token
39
39
  super().__init__(
40
40
  base_url=ai_base_url,
41
41
  token=token,
42
42
  headers=headers,
43
43
  timeout=AI_SERVICE_TIMEOUT,
44
+ http_auth=http_auth,
44
45
  )
45
46
 
46
47
  def __enter__(self) -> Self:
@@ -461,15 +461,27 @@ class BearerAuth(httpx.Auth):
461
461
  `(stack_url, token) -> KeboolaClient` factory call sites.
462
462
  """
463
463
 
464
- def __init__(self, provider: TokenProvider, project_id: int | None = None) -> None:
464
+ def __init__(
465
+ self,
466
+ provider: TokenProvider,
467
+ project_id: int | None = None,
468
+ *,
469
+ refresh_on_401: bool = True,
470
+ ) -> None:
465
471
  self._provider = provider
466
472
  self._project_id = project_id
473
+ self._refresh_on_401 = refresh_on_401
467
474
 
468
475
  def auth_flow(self, request: httpx.Request) -> Generator[httpx.Request, httpx.Response, None]:
469
476
  token = self._provider.get_access_token()
470
477
  self._stamp(request, token)
471
478
  response = yield request
472
- if response.status_code == 401:
479
+ # A 401 normally means the access token expired mid-flight, so refresh
480
+ # once and retry. `refresh_on_401=False` opts a client out: the metastore
481
+ # answers a VALID non-master token with 401 (its master-token gate), and a
482
+ # refresh cannot fix that -- retrying only burns a refresh-token rotation
483
+ # and can mask MISSING_MASTER_TOKEN behind a bogus SESSION_EXPIRED.
484
+ if response.status_code == 401 and self._refresh_on_401:
473
485
  token = self._provider.force_refresh(token)
474
486
  self._stamp(request, token)
475
487
  yield request
@@ -24,6 +24,36 @@ 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.94.0": [
28
+ "New (#759): a browser-login session (`auth login`) now works with nearly every command, "
29
+ "not just the Storage and Manage paths (CLI-13). It reaches the Scheduler (`flow schedule` / "
30
+ "`flow schedule-remove`), Data Streams (`stream`), Data Science (`data-app`), the full "
31
+ "`semantic-layer` group, the AI Service (`docs query`, `config new` / `examples`, "
32
+ "`component detail`, `flow new` / `update` / `validate`), and Storage bucket `sharing`. Only "
33
+ "three features still need a static Storage token and fail fast with "
34
+ "`AUTH_NOT_SUPPORTED_ON_STACK`: `kai`, `semantic-layer token --encrypt`, and the importable "
35
+ "SDK (`keboola_agent_cli.Client`). `auth login` and `auth register-projects` print the list "
36
+ "and ship it in `--json` as `session_unsupported_features`.",
37
+ "New (#736): a `merge-request` command group (hidden alias `mr`) drives the Branches 2.0 "
38
+ "merge lifecycle (DMD-1900). It covers create, request-review, approve, auto-merge, merge, "
39
+ "and conflict resolution (`diff` / `resolve`), on a project with the `branches-merge-requests` "
40
+ "feature. Each command targets the merge request of the active branch by default, or "
41
+ "`--merge-request-id N` / `--branch B` to pick one. Commands that move an MR toward production "
42
+ "(`merge`, `request-review`, `approve`, `resolve`, `auto-merge`) are destructive for "
43
+ "`--deny-destructive`. `create` / `update` / `request-changes` are writes. `branch merge` is "
44
+ "now deprecated -- it only built a UI URL and never merged through the API.",
45
+ "Fix (#752): `sync pull` and `sync clone` no longer strip a data app's runtime type when the "
46
+ "Data Science list omits it (CLI-8). The type (`python-js` / `streamlit` / ...) lives only on "
47
+ "the Data Science API, so a cloned or re-pulled app keeps the type it deploys with.",
48
+ "Fix (#753): `sync pull` and `sync clone` now keep each config's UI folder "
49
+ "(`KBC.configuration.folderName`) (CLI-9). Before, both silently dropped it and every config "
50
+ "landed in the tree root, with nothing warning about it.",
51
+ "Note (#764, #729, #730, #733, #734, #750, #751): housekeeping with no user-facing change. "
52
+ "#764 shares one session-aware default Data Science client factory between the sync and "
53
+ "data-app services. It corrects an import that the #752 and #759 combination broke on `main` "
54
+ "before any release. The rest are web UI and backend dependency bumps (fastify, fast-uri, "
55
+ "vitest, browserslist, postcss-selector-parser).",
56
+ ],
27
57
  "0.93.2": [
28
58
  "New (#757): each usage event now also carries the kbagent version and an agent-vs-human "
29
59
  "marker for the telemetry team (CLI-12). `params.cliContext` holds the User-Agent "
@@ -28,6 +28,7 @@ from .commands.init import init_command
28
28
  from .commands.job import job_app
29
29
  from .commands.kai import kai_app
30
30
  from .commands.lineage import lineage_app
31
+ from .commands.merge_request import merge_request_app
31
32
  from .commands.notification import notification_app
32
33
  from .commands.org import org_app
33
34
  from .commands.permissions import permissions_app
@@ -73,6 +74,7 @@ from .services.job_service import JobService
73
74
  from .services.kai_service import KaiService
74
75
  from .services.lineage_service import LineageService
75
76
  from .services.member_service import MemberService
77
+ from .services.merge_request_service import MergeRequestService
76
78
  from .services.notification_service import NotificationService
77
79
  from .services.org_service import OrgService
78
80
  from .services.project_service import ProjectService
@@ -150,6 +152,8 @@ app.add_typer(notification_app, name="notification", rich_help_panel=_FLOWS)
150
152
  # -- Development --
151
153
  _DEV = "Development"
152
154
  app.add_typer(branch_app, name="branch", rich_help_panel=_DEV)
155
+ app.add_typer(merge_request_app, name="merge-request", rich_help_panel=_DEV)
156
+ app.add_typer(merge_request_app, name="mr", rich_help_panel=_DEV, hidden=True)
153
157
  app.add_typer(workspace_app, name="workspace", rich_help_panel=_DEV)
154
158
  app.add_typer(sync_app, name="sync", rich_help_panel=_DEV)
155
159
  app.add_typer(encrypt_app, name="encrypt", rich_help_panel=_DEV)
@@ -310,6 +314,7 @@ def main(
310
314
  member_service = MemberService(config_store=config_store)
311
315
  feature_service = FeatureService(config_store=config_store)
312
316
  branch_service = BranchService(config_store=config_store)
317
+ merge_request_service = MergeRequestService(config_store=config_store)
313
318
  sharing_service = SharingService(config_store=config_store)
314
319
  search_service = SearchService(config_store=config_store)
315
320
  snapshot_service = SnapshotService(config_store=config_store)
@@ -370,6 +375,7 @@ def main(
370
375
  ctx.obj["member_service"] = member_service
371
376
  ctx.obj["feature_service"] = feature_service
372
377
  ctx.obj["branch_service"] = branch_service
378
+ ctx.obj["merge_request_service"] = merge_request_service
373
379
  ctx.obj["sharing_service"] = sharing_service
374
380
  ctx.obj["search_service"] = search_service
375
381
  ctx.obj["snapshot_service"] = snapshot_service
@@ -8,9 +8,11 @@ Provides common patterns used by all CLI commands:
8
8
  """
9
9
 
10
10
  import getpass
11
+ import json
11
12
  import os
12
13
  import secrets
13
14
  import sys
15
+ from pathlib import Path
14
16
  from typing import Any
15
17
 
16
18
  import typer
@@ -74,6 +76,36 @@ def resolve_manage_token(*, allow_env: bool = False) -> str:
74
76
  raise typer.Exit(code=2)
75
77
 
76
78
 
79
+ def parse_json_arg(raw: str, *, label: str) -> Any:
80
+ """Parse a ``JSON|@file|-`` argument: inline JSON, ``@path``, or ``-`` for stdin.
81
+
82
+ The house input contract for structured flags (``config update
83
+ --configuration``, ``transformation edit --op``, ``merge-request resolve
84
+ --resolved``). Hoisted from ``transformation.py``'s private copy so the
85
+ merge-request group did not add another; ``config.py`` still carries an
86
+ older dict-only variant (``_parse_json_input``) -- folding it in is a
87
+ follow-up, not this PR.
88
+
89
+ Raises:
90
+ ValueError: On a missing/unreadable file or malformed JSON -- the message
91
+ names ``label`` (the flag) so the caller can print it at exit 2 as-is.
92
+ """
93
+ try:
94
+ if raw == "-":
95
+ return json.loads(sys.stdin.read())
96
+ if raw.startswith("@"):
97
+ file_path = Path(raw[1:])
98
+ if not file_path.is_file():
99
+ raise ValueError(f"{label}: file not found: {file_path}")
100
+ return json.loads(file_path.read_text(encoding="utf-8"))
101
+ return json.loads(raw)
102
+ except json.JSONDecodeError as exc:
103
+ raise ValueError(f"{label}: invalid JSON: {exc}") from exc
104
+ except OSError as exc:
105
+ # a directory, a permission problem -- a usage error, not a crash
106
+ raise ValueError(f"{label}: cannot read file: {exc}") from exc
107
+
108
+
77
109
  def read_password_stdin() -> str:
78
110
  """Read a password from stdin.
79
111