keboola-cli 0.93.2__tar.gz → 0.95.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 (585) hide show
  1. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/CLAUDE.md +108 -7
  2. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/CONTRIBUTING.md +25 -0
  3. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/Makefile +4 -1
  4. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/PKG-INFO +1 -1
  5. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/pyproject.toml +5 -2
  6. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_sentinel_guards.py +39 -8
  7. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/ai_client.py +7 -6
  8. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/auth_client.py +155 -9
  9. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/models.py +51 -0
  10. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/token_provider.py +14 -2
  11. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/changelog.py +66 -0
  12. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/cli.py +6 -0
  13. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_helpers.py +32 -0
  14. keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_common.py +334 -0
  15. keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_render.py +454 -0
  16. keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_writes.py +657 -0
  17. keboola_cli-0.95.0/src/keboola_agent_cli/commands/_project_create.py +75 -0
  18. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +10 -1
  19. keboola_cli-0.95.0/src/keboola_agent_cli/commands/_url_copy.py +205 -0
  20. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/auth.py +73 -20
  21. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/branch.py +21 -5
  22. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/context.py +141 -27
  23. keboola_cli-0.95.0/src/keboola_agent_cli/commands/merge_request.py +333 -0
  24. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/project.py +70 -0
  25. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/sync.py +11 -2
  26. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/transformation.py +4 -23
  27. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/constants.py +27 -0
  28. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/data_science_client.py +7 -6
  29. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/errors.py +8 -10
  30. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/http_base.py +7 -0
  31. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/metastore_client.py +29 -11
  32. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/permissions.py +37 -1
  33. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/scheduler_client.py +9 -6
  34. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/_serve_command_map.py +26 -0
  35. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/app.py +35 -11
  36. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/dependencies.py +3 -0
  37. keboola_cli-0.95.0/src/keboola_agent_cli/server/routers/merge_requests.py +319 -0
  38. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/semantic_layer.py +2 -0
  39. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_auth_registration.py +7 -15
  40. keboola_cli-0.95.0/src/keboola_agent_cli/services/_semantic_layer_fqn.py +62 -0
  41. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_internals.py +36 -29
  42. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_clone.py +31 -5
  43. keboola_cli-0.95.0/src/keboola_agent_cli/services/_sync_data_app.py +195 -0
  44. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_push_ops.py +45 -8
  45. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_table_detail.py +47 -2
  46. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/auth_service.py +205 -2
  47. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/base.py +38 -16
  48. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/component_service.py +4 -11
  49. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/config_service.py +11 -12
  50. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/data_app_git_service.py +4 -8
  51. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/data_app_service.py +6 -6
  52. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/docs_service.py +6 -3
  53. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/flow_service.py +11 -21
  54. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/merge_request_service.py +231 -20
  55. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/semantic_layer_service.py +27 -56
  56. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/sharing_service.py +4 -3
  57. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/stream_service.py +8 -11
  58. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/sync_service.py +122 -4
  59. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/stream_client.py +3 -6
  60. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/clone.py +43 -6
  61. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/config_format.py +12 -1
  62. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_client.py +216 -0
  63. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_sentinel_guards.py +72 -95
  64. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_service.py +258 -0
  65. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_sentinel_guards.py +34 -0
  66. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_cli_auth.py +64 -2
  67. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e.py +270 -2
  68. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_auth.py +117 -0
  69. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_base_auth.py +88 -30
  70. keboola_cli-0.95.0/tests/test_merge_request_cli.py +1663 -0
  71. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_merge_request_service.py +337 -7
  72. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_metastore_client.py +100 -0
  73. keboola_cli-0.95.0/tests/test_project_create_cli.py +394 -0
  74. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_cli.py +25 -0
  75. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_service.py +237 -41
  76. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_router_calls.py +335 -0
  77. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_semantic_layer_routes_e2e.py +3 -0
  78. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_smoke.py +15 -0
  79. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_describe_service.py +72 -0
  80. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_cli.py +33 -1
  81. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_clone.py +325 -0
  82. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_config_format.py +40 -0
  83. keboola_cli-0.95.0/tests/test_sync_data_app_type.py +510 -0
  84. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_storage_jobs.py +224 -1
  85. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_provider.py +25 -0
  86. keboola_cli-0.95.0/tests/test_url_copy.py +126 -0
  87. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/package-lock.json +78 -75
  88. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/package.json +1 -1
  89. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/.gitignore +0 -0
  90. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/LICENSE +0 -0
  91. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/README.md +0 -0
  92. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/examples/README.md +0 -0
  93. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/examples/storage_tui/README.md +0 -0
  94. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  95. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
  96. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
  97. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_command_sync.py +0 -0
  98. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_error_codes.py +0 -0
  99. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_file_size.py +0 -0
  100. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_release_scope.py +0 -0
  101. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_version_gates.py +0 -0
  102. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_wheel_ui.py +0 -0
  103. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/debug_linkedby_type.sh +0 -0
  104. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/file_size_baseline.json +0 -0
  105. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_command_reference.py +0 -0
  106. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_endpoint_reference.py +0 -0
  107. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_release_notes.py +0 -0
  108. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/generate_changelog.py +0 -0
  109. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/generate_skill.py +0 -0
  110. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/hatch_build.py +0 -0
  111. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/lineage_deep.py +0 -0
  112. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/post-edit-quality.sh +0 -0
  113. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/pre-commit +0 -0
  114. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/sync_version.py +0 -0
  115. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/web-dev.sh +0 -0
  116. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/__init__.py +0 -0
  117. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/__main__.py +0 -0
  118. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/__init__.py +0 -0
  119. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/device.py +0 -0
  120. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/environment.py +0 -0
  121. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/pkce.py +0 -0
  122. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  123. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/state_store.py +0 -0
  124. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/totp.py +0 -0
  125. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auto_update.py +0 -0
  126. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/__init__.py +0 -0
  127. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_client.py +0 -0
  128. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_core.py +0 -0
  129. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_transfer.py +0 -0
  130. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/billing.py +0 -0
  131. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/branches.py +0 -0
  132. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/configs.py +0 -0
  133. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/merge_requests.py +0 -0
  134. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/misc.py +0 -0
  135. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/notifications.py +0 -0
  136. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/query.py +0 -0
  137. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/queue.py +0 -0
  138. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/storage_files.py +0 -0
  139. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  140. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/stream.py +0 -0
  141. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/tokens.py +0 -0
  142. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/triggers.py +0 -0
  143. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/workspaces.py +0 -0
  144. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/__init__.py +0 -0
  145. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  146. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  147. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
  148. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
  149. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
  150. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
  151. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
  152. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
  153. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  154. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
  155. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
  156. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
  157. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
  158. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
  159. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
  160. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/agent.py +0 -0
  161. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/billing.py +0 -0
  162. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/changelog.py +0 -0
  163. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/component.py +0 -0
  164. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/config.py +0 -0
  165. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/config_state.py +0 -0
  166. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/data_app.py +0 -0
  167. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
  168. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/docs.py +0 -0
  169. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/doctor.py +0 -0
  170. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/encrypt.py +0 -0
  171. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/feature.py +0 -0
  172. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/flow.py +0 -0
  173. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/http_client.py +0 -0
  174. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/init.py +0 -0
  175. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/job.py +0 -0
  176. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/kai.py +0 -0
  177. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/lineage.py +0 -0
  178. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/notification.py +0 -0
  179. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/org.py +0 -0
  180. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/permissions.py +0 -0
  181. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/repl.py +0 -0
  182. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/schedule.py +0 -0
  183. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/search.py +0 -0
  184. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
  185. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/serve.py +0 -0
  186. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/sharing.py +0 -0
  187. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/storage.py +0 -0
  188. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/stream.py +0 -0
  189. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/token.py +0 -0
  190. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/version.py +0 -0
  191. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/workspace.py +0 -0
  192. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/config_store.py +0 -0
  193. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  194. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/frozen_dist.py +0 -0
  195. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/json_utils.py +0 -0
  196. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/lib.py +0 -0
  197. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/manage_client.py +0 -0
  198. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/models.py +0 -0
  199. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/output.py +0 -0
  200. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/py.typed +0 -0
  201. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/__init__.py +0 -0
  202. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  203. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  204. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  205. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  206. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  207. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/result_models.py +0 -0
  208. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/__init__.py +0 -0
  209. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/agent_runner.py +0 -0
  210. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/agents_store.py +0 -0
  211. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/auth.py +0 -0
  212. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/pricing.py +0 -0
  213. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  214. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  215. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  216. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/auth.py +0 -0
  217. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/billing.py +0 -0
  218. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  219. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/components.py +0 -0
  220. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/configs.py +0 -0
  221. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
  222. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  223. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  224. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  225. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  226. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  227. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/health.py +0 -0
  228. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
  229. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  230. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  231. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/members.py +0 -0
  232. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
  233. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/org.py +0 -0
  234. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  235. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
  236. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/search.py +0 -0
  237. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  238. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  239. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  240. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/token.py +0 -0
  241. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  242. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
  243. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  244. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/sse.py +0 -0
  245. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/__init__.py +0 -0
  246. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
  247. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_clone.py +0 -0
  248. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
  249. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_trash.py +0 -0
  250. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
  251. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
  252. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_encryption.py +0 -0
  253. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  254. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
  255. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  256. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  257. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
  258. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
  259. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  260. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  261. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  262. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  263. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  264. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  265. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
  266. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  267. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
  268. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/agent_service.py +0 -0
  269. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/billing_service.py +0 -0
  270. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/branch_service.py +0 -0
  271. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
  272. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  273. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  274. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  275. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/feature_service.py +0 -0
  276. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  277. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  278. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
  279. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/job_service.py +0 -0
  280. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/kai_service.py +0 -0
  281. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  282. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/member_service.py +0 -0
  283. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/notification_service.py +0 -0
  284. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/org_service.py +0 -0
  285. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/project_service.py +0 -0
  286. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  287. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  288. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/search_service.py +0 -0
  289. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  290. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/storage_service.py +0 -0
  291. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/table_usage.py +0 -0
  292. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/token_service.py +0 -0
  293. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  294. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/variables_service.py +0 -0
  295. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/version_service.py +0 -0
  296. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/workspace_service.py +0 -0
  297. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/__init__.py +0 -0
  298. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  299. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
  300. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
  301. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  302. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  303. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  304. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/manifest.py +0 -0
  305. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/naming.py +0 -0
  306. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/secrets.py +0 -0
  307. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  308. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/telemetry.py +0 -0
  309. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/update_runner.py +0 -0
  310. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/yaml_input.py +0 -0
  311. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/__init__.py +0 -0
  312. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/conftest.py +0 -0
  313. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/helpers.py +0 -0
  314. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_cli.py +0 -0
  315. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_prompt.py +0 -0
  316. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_prompt_helper.py +0 -0
  317. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_runner.py +0 -0
  318. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_service.py +0 -0
  319. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_tombstone.py +0 -0
  320. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agents_store_events.py +0 -0
  321. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_ai_client.py +0 -0
  322. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_device.py +0 -0
  323. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_environment.py +0 -0
  324. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_models.py +0 -0
  325. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_picker.py +0 -0
  326. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_pkce.py +0 -0
  327. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_register_projects.py +0 -0
  328. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_sentinel.py +0 -0
  329. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_state_store.py +0 -0
  330. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_totp.py +0 -0
  331. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auto_update.py +0 -0
  332. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_base_service.py +0 -0
  333. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_cli.py +0 -0
  334. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_client.py +0 -0
  335. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_service.py +0 -0
  336. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_metadata_cli.py +0 -0
  337. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_metadata_service.py +0 -0
  338. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_registry.py +0 -0
  339. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_service.py +0 -0
  340. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_build_hook.py +0 -0
  341. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_changelog_check.py +0 -0
  342. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_changelog_render.py +0 -0
  343. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_command_sync.py +0 -0
  344. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_file_size.py +0 -0
  345. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_release_scope.py +0 -0
  346. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_version_gates.py +0 -0
  347. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_checkbox_select.py +0 -0
  348. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_choice_enums.py +0 -0
  349. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_cli.py +0 -0
  350. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client.py +0 -0
  351. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client_device_enrollment.py +0 -0
  352. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client_token_events.py +0 -0
  353. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_cli.py +0 -0
  354. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_service.py +0 -0
  355. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_sync_action.py +0 -0
  356. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_clone_cli.py +0 -0
  357. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_clone_service.py +0 -0
  358. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_create_cli.py +0 -0
  359. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_create_service.py +0 -0
  360. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_encryption.py +0 -0
  361. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_examples.py +0 -0
  362. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_metadata.py +0 -0
  363. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_rename.py +0 -0
  364. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_rename_cli.py +0 -0
  365. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_resolution.py +0 -0
  366. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_row_cli.py +0 -0
  367. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_row_service.py +0 -0
  368. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_search.py +0 -0
  369. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_search_cli.py +0 -0
  370. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_set_default_bucket.py +0 -0
  371. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_set_guard.py +0 -0
  372. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_state.py +0 -0
  373. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_store.py +0 -0
  374. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_trash.py +0 -0
  375. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_update.py +0 -0
  376. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_cli.py +0 -0
  377. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_git_repo.py +0 -0
  378. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_plain_env_keys.py +0 -0
  379. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_secrets_cli.py +0 -0
  380. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_secrets_service.py +0 -0
  381. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_service.py +0 -0
  382. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_validate_repo_service.py +0 -0
  383. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_deep_lineage_service.py +0 -0
  384. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_cli.py +0 -0
  385. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_client.py +0 -0
  386. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_service.py +0 -0
  387. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_docs_cli.py +0 -0
  388. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_doctor_service.py +0 -0
  389. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_config_dir_mode.py +0 -0
  390. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_lineage_deep.py +0 -0
  391. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encrypt_cli.py +0 -0
  392. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encrypt_service.py +0 -0
  393. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encryption.py +0 -0
  394. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_errors.py +0 -0
  395. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_feature_cli.py +0 -0
  396. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_feature_service.py +0 -0
  397. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_file_locking.py +0 -0
  398. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_cli.py +0 -0
  399. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_examples.py +0 -0
  400. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_service.py +0 -0
  401. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_validation.py +0 -0
  402. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_frozen_dist.py +0 -0
  403. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_command_reference.py +0 -0
  404. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_endpoint_reference.py +0 -0
  405. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_release_notes.py +0 -0
  406. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_generate_promotion_pipeline.py +0 -0
  407. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_helpers.py +0 -0
  408. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_base.py +0 -0
  409. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_client_cmd.py +0 -0
  410. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_forwarder_service.py +0 -0
  411. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_integration.py +0 -0
  412. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_job_idempotency_store.py +0 -0
  413. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_job_options.py +0 -0
  414. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_json_utils.py +0 -0
  415. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_kai_cli.py +0 -0
  416. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_kai_service.py +0 -0
  417. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lib.py +0 -0
  418. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lib_device_enrollment.py +0 -0
  419. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_license_consistency.py +0 -0
  420. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lineage_service.py +0 -0
  421. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_local_ai_chat.py +0 -0
  422. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_client.py +0 -0
  423. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_token_bulk.py +0 -0
  424. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_token_cli.py +0 -0
  425. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_mcp_migration_recipe.py +0 -0
  426. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_member_cli.py +0 -0
  427. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_member_service.py +0 -0
  428. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_merge_request_client.py +0 -0
  429. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_migrate_cicd.py +0 -0
  430. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_models.py +0 -0
  431. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_normalize_script.py +0 -0
  432. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_cli.py +0 -0
  433. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_client.py +0 -0
  434. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_service.py +0 -0
  435. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_org_service.py +0 -0
  436. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_output.py +0 -0
  437. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_permissions.py +0 -0
  438. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_permissions_cli.py +0 -0
  439. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_pricing.py +0 -0
  440. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_edit.py +0 -0
  441. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_edit_cli.py +0 -0
  442. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_info_cli.py +0 -0
  443. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_info_service.py +0 -0
  444. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
  445. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_repl.py +0 -0
  446. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_result_models.py +0 -0
  447. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_run_broadcaster.py +0 -0
  448. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_schedule_cli.py +0 -0
  449. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_schedule_service.py +0 -0
  450. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_scheduler_client.py +0 -0
  451. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_search_cli.py +0 -0
  452. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_search_service.py +0 -0
  453. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_schema.py +0 -0
  454. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_banner_encoding.py +0 -0
  455. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_conversation_id.py +0 -0
  456. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_telemetry.py +0 -0
  457. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_ui.py +0 -0
  458. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_auth.py +0 -0
  459. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_permissions.py +0 -0
  460. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_services.py +0 -0
  461. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sharing_cli.py +0 -0
  462. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sharing_service.py +0 -0
  463. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_skill_frontmatter.py +0 -0
  464. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sql_split.py +0 -0
  465. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_clone.py +0 -0
  466. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_create_table.py +0 -0
  467. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_delete.py +0 -0
  468. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_describe_cli.py +0 -0
  469. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_empty_definition.py +0 -0
  470. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_export_filters.py +0 -0
  471. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_files.py +0 -0
  472. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_snapshots.py +0 -0
  473. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_swap.py +0 -0
  474. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_table_definition.py +0 -0
  475. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_tables.py +0 -0
  476. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_truncate.py +0 -0
  477. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_write.py +0 -0
  478. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_cli.py +0 -0
  479. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_client.py +0 -0
  480. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_service.py +0 -0
  481. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_baseline_stamping.py +0 -0
  482. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_branch_mapping.py +0 -0
  483. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_cli_behavior.py +0 -0
  484. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_code_extraction.py +0 -0
  485. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_diff_engine.py +0 -0
  486. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_e2e.py +0 -0
  487. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_encrypt.py +0 -0
  488. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_force_pull_baseline.py +0 -0
  489. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_manifest.py +0 -0
  490. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_naming.py +0 -0
  491. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_plaintext_audit.py +0 -0
  492. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_push_script_guard.py +0 -0
  493. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_reconcile.py +0 -0
  494. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_secrets.py +0 -0
  495. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_service.py +0 -0
  496. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_version_script.py +0 -0
  497. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_table_usage.py +0 -0
  498. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_telemetry.py +0 -0
  499. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_cli.py +0 -0
  500. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_service.py +0 -0
  501. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_transformation_cli.py +0 -0
  502. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_transformation_ops.py +0 -0
  503. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_triggers_client.py +0 -0
  504. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_update_runner.py +0 -0
  505. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_variables_cli.py +0 -0
  506. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_variables_service.py +0 -0
  507. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_version_service.py +0 -0
  508. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_cli.py +0 -0
  509. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_gc.py +0 -0
  510. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_service.py +0 -0
  511. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_sql_helper.py +0 -0
  512. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_yaml_input.py +0 -0
  513. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/README.md +0 -0
  514. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/index.html +0 -0
  515. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/postcss.config.js +0 -0
  516. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/App.tsx +0 -0
  517. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/api/client.test.ts +0 -0
  518. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/api/client.ts +0 -0
  519. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/changelogNotes.test.ts +0 -0
  520. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/changelogNotes.ts +0 -0
  521. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/AgentRunView.tsx +0 -0
  522. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/CommandPalette.tsx +0 -0
  523. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  524. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/DetailTabs.tsx +0 -0
  525. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Drawer.tsx +0 -0
  526. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Empty.tsx +0 -0
  527. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/JsonView.tsx +0 -0
  528. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
  529. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  530. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/PillList.tsx +0 -0
  531. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/RawDetail.tsx +0 -0
  532. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
  533. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Table.tsx +0 -0
  534. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/WhatsNew.tsx +0 -0
  535. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/config/credits.test.ts +0 -0
  536. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/config/credits.ts +0 -0
  537. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/index.css +0 -0
  538. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/Shell.tsx +0 -0
  539. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/Sidebar.tsx +0 -0
  540. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/StatusBar.tsx +0 -0
  541. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/TopBar.tsx +0 -0
  542. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/lib/time.test.ts +0 -0
  543. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/lib/time.ts +0 -0
  544. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/main.tsx +0 -0
  545. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Agents.tsx +0 -0
  546. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Branches.tsx +0 -0
  547. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Changelog.tsx +0 -0
  548. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Components.tsx +0 -0
  549. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Configs.tsx +0 -0
  550. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Dashboard.tsx +0 -0
  551. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/DataApps.tsx +0 -0
  552. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Doctor.tsx +0 -0
  553. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Encrypt.tsx +0 -0
  554. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Flows.tsx +0 -0
  555. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Jobs.tsx +0 -0
  556. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/JobsAll.tsx +0 -0
  557. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Lineage.tsx +0 -0
  558. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/LocalAi.tsx +0 -0
  559. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Members.tsx +0 -0
  560. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Org.tsx +0 -0
  561. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Projects.tsx +0 -0
  562. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Schedules.tsx +0 -0
  563. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Search.tsx +0 -0
  564. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  565. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  566. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Sharing.tsx +0 -0
  567. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Storage.tsx +0 -0
  568. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Streams.tsx +0 -0
  569. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Tokens.tsx +0 -0
  570. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/TokensAll.tsx +0 -0
  571. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Workspaces.tsx +0 -0
  572. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/jobsShared.tsx +0 -0
  573. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/storageSel.test.ts +0 -0
  574. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/tokensShared.test.ts +0 -0
  575. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/tokensShared.tsx +0 -0
  576. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/router.test.ts +0 -0
  577. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/router.ts +0 -0
  578. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/state.tsx +0 -0
  579. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/theme.tsx +0 -0
  580. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/types.ts +0 -0
  581. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/useHashSelection.ts +0 -0
  582. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/whatsnew.ts +0 -0
  583. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/tailwind.config.ts +0 -0
  584. {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/tsconfig.json +0 -0
  585. {keboola_cli-0.93.2 → keboola_cli-0.95.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
@@ -447,6 +449,31 @@ kbagent auth register-projects [--stack URL|alias] [--all] [--project-id ID ...]
447
449
  # starts the server but no `/auth/*` operation is destructive, so it affects nothing here.
448
450
  # See docs/web-server.md.
449
451
 
452
+ kbagent project create --url URL [--project ALIAS] [--name NAME] [--backend snowflake|bigquery] [--sync-backend-init]
453
+ # project create (since 0.95.0, DMD-1940): the ONLY kbagent command that works from nothing --
454
+ # no account, no token, no `auth login`. POSTs the unauthenticated provisioning endpoint
455
+ # (`/manage/programmatic-projects`, gated by the `agent-provisioning` stack feature
456
+ # / `STACK_FEATURES__AGENT_PROVISIONING`, off on most stacks -- the COMMAND is always
457
+ # registered, so `--help` proves nothing about the stack; without the feature the stack 404s
458
+ # and this exits 1 with AUTH_NOT_SUPPORTED_ON_STACK, naming the flag and the browser path),
459
+ # stores the returned project-pinned session in auth.json, and registers the project in
460
+ # config.json under the `kbc-session://` sentinel -- becoming the default project when nothing
461
+ # else was registered. THE PROJECT IT CREATES IS OWNED BY NOBODY: the result's `confirm_url` is a
462
+ # single-use, days-limited link a human must open and sign in at to take ownership; relay it
463
+ # verbatim. `auth status` re-prints it as `agent_confirm_url` while it is pending, so losing the
464
+ # terminal is recoverable -- losing the claim window is not. Confirming REVOKES this session, so
465
+ # the documented next step is `kbagent auth login --stack URL`; the alias survives it (the
466
+ # sentinel keys on project id + stack, never on the session). Refuses with exit 5 when a session
467
+ # for that stack already exists -- auth.json holds one session per stack, and whoever has one has
468
+ # an account and should create the project in the UI. `--backend` omitted keeps the stack
469
+ # maintainer's own default; `--sync-backend-init` waits for backend init instead of the async
470
+ # default (which warns that the first Storage command may fail until it lands). The provisioning
471
+ # POST is never auto-retried on 5xx/429 -- it is not idempotent, and each success creates an
472
+ # organization, a billable project and a credit grant. A timeout is classified rather than
473
+ # lumped together: a connect timeout never reached the stack (retryable), a READ timeout was
474
+ # delivered and may have succeeded (retryable:false, message says not to repeat -- check
475
+ # `auth status`, whose stored session + claim link is the evidence). `--sync-backend-init`
476
+ # raises that call's read timeout to 300s, which can outlast an agent's foreground shell.
450
477
  kbagent project add --project NAME --url URL --token TOKEN
451
478
  kbagent project list
452
479
  kbagent project remove --project NAME
@@ -561,6 +588,9 @@ kbagent storage table-detail --project NAME --table-id ID [--branch ID]
561
588
  # partition from INFORMATION_SCHEMA.PARTITIONS). `definition` is present on EVERY response
562
589
  # -- untyped tables get one too -- so null means the stack omitted the key, NOT "untyped".
563
590
  # `storage tables` (the LIST endpoint) is unaffected: the API has no `definition` include.
591
+ # table-detail also returns `backend_path` (the owning bucket's Storage backendPath, verbatim)
592
+ # and `sql_path` (quoted, directly queryable path; null when Storage reports no location) --
593
+ # see the semantic-layer dataset fqn note (#761); version gate in gotchas.md.
564
594
  kbagent storage create-bucket --project NAME --stage STAGE --name NAME [--description D] [--backend B] [--branch ID]
565
595
  kbagent storage create-table --project NAME --bucket-id ID --name NAME [--column COL:TYPE[(length)] ...] [--primary-key COL] [--not-null COL ...] [--default NAME=VALUE ...] [--source-table-id ID] [--source-branch-id N] [--time-partitioning-type DAY|HOUR|MONTH|YEAR] [--time-partitioning-field COL] [--time-partitioning-expiration-ms MS] [--range-partitioning-field COL --range-partitioning-start S --range-partitioning-end E --range-partitioning-interval I] [--clustering-field COL ...] [--branch ID] [--if-not-exists]
566
596
  # --column XOR --source-table-id (0.66.0+, BigQuery only): --source-table-id copies an existing table's data into the requested partition/clustering layout (schema derived from source) -> swap into place with swap-tables. Partition/clustering flags work in both modes (BigQuery only); time vs range partitioning are mutually exclusive. A non-BigQuery project fails fast (pre-flight backend check).
@@ -737,6 +767,67 @@ kbagent branch metadata-list --project NAME [--branch ID|default]
737
767
  kbagent branch metadata-get --project NAME --key KEY [--branch ID|default]
738
768
  kbagent branch metadata-set --project NAME --key KEY [--text STR | --file PATH | --stdin] [--branch ID|default]
739
769
  kbagent branch metadata-delete --project NAME --metadata-id ID [--branch ID|default]
770
+ # branch merge is DEPRECATED (since 0.94.0): it only builds a UI URL and resets the active branch. On a
771
+ # project with `branches-merge-requests` use the merge-request group below; the command keeps working
772
+ # (it also serves projects without the feature) and now carries `deprecation` in --json.
773
+
774
+ # merge-request (since 0.94.0, DMD-1900): the non-SOX Branches 2.0 lifecycle. Hidden alias `mr`. Every
775
+ # command except list/create takes `[--merge-request-id N | --id N] [--branch B]`: omitted, the target is
776
+ # the merge request OF the active branch (`branch use`) -- a branch has at most one MR, ever. Both flags at
777
+ # once -> exit 2. `--project` is single-project (never fans out). Status is the DERIVED state the web UI
778
+ # shows (in_development|in_review|approved|in_merge|merged|closed|rejected), never the raw one.
779
+ 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
780
+ kbagent merge-request detail [--project A] [--merge-request-id N | --branch B] [--activity-log]
781
+ kbagent merge-request create --title T [--project A] [--branch B] [--description D] [--reviewer-id ID ...] [--external-id X]
782
+ kbagent merge-request update [--project A] [--merge-request-id N | --branch B] [--title T] [--description D] [--reviewer-id ID ...] [--external-id X]
783
+ kbagent merge-request request-review [--project A] [--merge-request-id N | --branch B]
784
+ kbagent merge-request approve [--project A] [--merge-request-id N | --branch B]
785
+ kbagent merge-request request-changes [--project A] [--merge-request-id N | --branch B] [--reason TEXT]
786
+ kbagent merge-request auto-merge --strategy immediately|scheduled|none [--at TS] [--project A] [--merge-request-id N | --branch B] [--yes]
787
+ kbagent merge-request merge [--project A] [--merge-request-id N | --branch B] [--yes]
788
+ kbagent merge-request conflicts [--project A] [--merge-request-id N | --branch B]
789
+ kbagent merge-request diff --component-id C --config-id I [--project A] [--merge-request-id N | --branch B] [--format short|full] [--output PATH]
790
+ 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]
791
+ # WHAT IS DESTRUCTIVE -- a property of the COMMAND, never of a flag or of the MR's state, so a policy is
792
+ # evaluated from the command name alone, before any network call. Destructive = anything that moves a
793
+ # merge request toward or into production: `merge` (deletes the source branch, rewrites production),
794
+ # `request-review` (on the non-SOX default of 0 approvals it lands the MR directly in `approved`),
795
+ # `approve` (the last approval is what a merge waits for), `resolve` (removes the blocker a merge waits
796
+ # on) and `auto-merge` (arms a backend scheduler that runs every `approved` MR whose strategy is
797
+ # immediately/scheduled through the same MergeProcessor, on its own, retrying every tick -- a DELAYED
798
+ # PRODUCTION MERGE with `merge` never called; `--strategy none` disarms and rides the same command, same
799
+ # class). Write = shapes the MR without moving it: `create`, `update` (title/description/reviewers/
800
+ # external id -- auto-merge is NOT a field here), `request-changes` (moves it AWAY from approved).
801
+ # So `--deny-destructive` yields an agent that can observe and shape merge requests but never move one.
802
+ # Under --json every destructive command REQUIRES an explicit target (--merge-request-id or --branch),
803
+ # checked before anything is resolved: every destructive kbagent command either prompts or is told its
804
+ # target, and --json has no prompt. In human mode the active-branch fallback stays; `merge` and arming
805
+ # `auto-merge` prompt (--yes skips), the other destructive commands do not. After request-review/
806
+ # approve/resolve on an MR that IS armed, human mode warns that the backend will now merge (read off the
807
+ # write's own result, no extra GET).
808
+ # On a non-SOX project with the default 0 required approvals: `merge` works straight from `development`;
809
+ # `request-review` lands directly in `approved` (in_review is unreachable); `approve` answers 422 in every
810
+ # state. There is NO `close`: `request-changes` by the creator is the UI's cancel and leaves the MR in
811
+ # `development` (the `closed`/`rejected` derivations depend on reviewer status a 0-approval project never
812
+ # populates -- same blind spot as the web UI, DMD-1988). Requesting review with no reviewers selected
813
+ # emails EVERY project member.
814
+ # Conflicts: `conflicts` lists what changed on both sides (isDeleted = the DEV side's flag); `diff`
815
+ # classifies per path (both / only you / only production) and, when a side deleted the config wholesale,
816
+ # recommends the --take; `diff --output FILE` writes `resolution_candidate` (your branch's content, all
817
+ # five keys: name/description/isDisabled/configuration/rows -- rebase REPLACES, a missing key wipes data,
818
+ # the service refuses a partial body) to edit and hand back via `resolve --resolved @FILE`. No `--all`.
819
+ # Errors: a project without the feature answers FEATURE_NOT_ENABLED (exit 5) from every command whose
820
+ # target was resolved implicitly, reads included -- two wordings, missing feature vs SOX project. A
821
+ # scoped Storage token 403s (ACCESS_DENIED) on everything but `list`. `MR_MERGE_CONFLICT` /
822
+ # `MR_NOT_READY_TO_MERGE` (exit 1; the latter retryable) come from the merge 409; a truncated conflict
823
+ # list in the error carries `details.api_error_params_truncated: true` -- run `conflicts` for the full set.
824
+ # `merge` blocks for up to 10 minutes (no --wait/--timeout). Every result may carry `warnings[]`
825
+ # (post-merge cleanup failures, a dropped --change-description on a delete resolution). A merge whose
826
+ # source branch id could not be read carries `cleanup_skipped: true` + `branch_from_id_raw` (the local
827
+ # active-branch reset / sync unlink did NOT run -- key on the flag, not on warning text). On a project
828
+ # where the feature was later switched OFF, `list` rows' `allowed_actions` still recommend writes that
829
+ # will fail FEATURE_NOT_ENABLED (state-derived, feature-blind); `detail` carries `feature_enabled` and
830
+ # its hint-next respects it.
740
831
 
741
832
  kbagent workspace create --project ALIAS [--name NAME] [--backend TYPE] [--ui] [--read-only/--no-read-only]
742
833
  kbagent workspace list [--project NAME ...] [--orphaned] [--branch ID] [--qs-compatible]
@@ -916,7 +1007,17 @@ kbagent semantic-layer validate --project P [--model M] [--deep]
916
1007
  kbagent semantic-layer export --project P [--model M] [--output PATH]
917
1008
  kbagent semantic-layer diff (--project-a A | --file-a PATH) (--project-b B | --file-b PATH) [--model-a M] [--model-b M]
918
1009
  kbagent semantic-layer add metric --project P [--model M] --name N --sql SQL --dataset TABLE_ID [--description D] [--yes]
919
- kbagent semantic-layer add dataset --project P [--model M] --name N --table-id TABLE_ID [--description D] [--grain G] [--primary-key COL ...] [--deep-fields]
1010
+ kbagent semantic-layer add dataset --project P [--model M] --name N --table-id TABLE_ID [--description D] [--grain G] [--primary-key COL ...] [--deep-fields] [--fqn FQN]
1011
+ # dataset fqn (#761): `add dataset` and `build` read the fqn from the table's Storage location --
1012
+ # the owning bucket's backendPath, surfaced as `sql_path` / `backend_path` on `storage table-detail`.
1013
+ # They used to hardcode a "KEBOOLA" database that exists in no project, so every consumer pasting
1014
+ # the fqn into SQL failed. A LINKED bucket's path names the SOURCE project's database + schema;
1015
+ # swapping in the consuming project's database does not resolve either. `add dataset` now needs
1016
+ # the table to exist (one table-detail call) unless `--fqn` supplies the value verbatim; a table
1017
+ # whose location Storage does not report fails with VALIDATION_ERROR. `build --types-workspace`
1018
+ # queries INFORMATION_SCHEMA in that same database/schema. `validate --deep` warns FQN_MISMATCH
1019
+ # on stored fqns that differ (pre-fix models); repair via export -> fix fqn + metric sql -> import
1020
+ # --overwrite. Version gate lives in gotchas.md (no `(since vNEXT)` on `# ` lines).
920
1021
  kbagent semantic-layer add relationship --project P [--model M] --name N --from TABLE_ID --to TABLE_ID --on EXPR [--type left|inner]
921
1022
  kbagent semantic-layer add constraint --project P [--model M] --name N --constraint-type inequality|equality|range|composition|exclusion|temporal|conditional --rule "EXPR" --metrics M1,M2 [--severity error|warning|info]
922
1023
  kbagent semantic-layer add glossary --project P [--model M] --term TERM [--definition D]
@@ -856,6 +856,7 @@ make check # CI parity: lint + format + typecheck + skill + version
856
856
  make lint # Just the ruff linter
857
857
  make format # Auto-format code
858
858
  make typecheck # Static type check (Astral `ty`)
859
+ make audit # Audit locked dependencies for known vulnerabilities (uv audit, OSV)
859
860
  make test # Just the test suite (no coverage)
860
861
  make test-cov # Test suite + informational coverage report (term-missing)
861
862
  make command-sync-check # Verify every CLI command is registered + documented
@@ -889,8 +890,32 @@ Two GitHub Actions workflows guard the repo:
889
890
  (`-m "not integration"`; `e2e` self-skips without credentials). Coverage is
890
891
  printed (`--cov ... --cov-report=term-missing`) but **informational** --
891
892
  there is no `--cov-fail-under` threshold, so coverage never blocks a merge.
893
+ - **`audit` job** (one run, Python 3.12): `uv audit --frozen` against the OSV
894
+ advisory database. Deliberately separate and **not** a required check -- its
895
+ result depends on advisories published over time, not on the diff, so a
896
+ finding shows red here for visibility but never blocks a merge. Run it locally
897
+ with `make audit`. See **Fixing an audit finding** below.
892
898
  - **`build-windows` job**: real `uv build` wheel checks (issue #320).
893
899
 
900
+ **Fixing an audit finding.** Dependabot is the named fix channel, but it
901
+ cannot run here. Its bundled uv is 0.12.7, and that uv must satisfy
902
+ `[tool.uv] required-version`. A bound above 0.12.7 makes every Dependabot
903
+ dependency PR fail with `tool_version_not_supported`. Until Dependabot
904
+ bundles a newer uv, fix each finding by hand:
905
+
906
+ - **Transitive dependency** (not in `[project.dependencies]` or a dependency
907
+ group): update it in the lockfile only. Run
908
+ `uv lock --upgrade-package NAME==FIXED_VERSION`. Do not add it to
909
+ `pyproject.toml` as a direct dependency. We do not own it, and a pin there
910
+ is debt that someone must maintain. A transitive dependency has no upper
911
+ bound, so the resolver keeps the new minimum version on its own. A later
912
+ `uv lock` keeps it.
913
+ - **Direct dependency**: raise the constraint in `pyproject.toml` instead.
914
+
915
+ Then verify two things. `uv audit --frozen` reports no vulnerabilities, and
916
+ `uv lock --check` passes. Commit only `uv.lock`. For a direct dependency,
917
+ also commit `pyproject.toml`.
918
+
894
919
  `make check` runs the same gates as the `check` + `test` CI jobs locally and is
895
920
  slightly *stricter*: its `test` target uses `-m "not e2e"`, so it also runs the
896
921
  `integration` tests that CI's `test` job deselects (`-m "not integration"`).
@@ -1,6 +1,6 @@
1
1
  .DEFAULT_GOAL := help
2
2
 
3
- .PHONY: help install install-server sync test test-unit test-integration test-e2e test-e2e-local test-e2e-invite test-e2e-feature test-e2e-stream test-e2e-auth test-file test-cov lint lint-fix format format-check typecheck typecheck-warn skill-check skill-gen version-sync version-check version-gate-check vnext-check vnext-resolve gate-floor-report release-scope-check changelog changelog-check check-error-codes check-sentinel-guards loc-check loc-report loc-baseline command-sync-check gen-command-reference endpoints-gen endpoints-check check clean hooks web-install web-dev-backend web-dev-frontend web-build web-clean
3
+ .PHONY: help install install-server sync test test-unit test-integration test-e2e test-e2e-local test-e2e-invite test-e2e-feature test-e2e-stream test-e2e-auth test-file test-cov lint lint-fix format format-check typecheck typecheck-warn audit skill-check skill-gen version-sync version-check version-gate-check vnext-check vnext-resolve gate-floor-report release-scope-check changelog changelog-check check-error-codes check-sentinel-guards loc-check loc-report loc-baseline command-sync-check gen-command-reference endpoints-gen endpoints-check check clean hooks web-install web-dev-backend web-dev-frontend web-build web-clean
4
4
 
5
5
  help: ## Show this help message
6
6
  @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}'
@@ -68,6 +68,9 @@ format-check: ## Check code formatting (no changes)
68
68
  typecheck: ## Run ty type-checker (Astral). Fails on any error.
69
69
  uv run ty check
70
70
 
71
+ audit: ## Audit locked dependencies (all groups + extras) for known vulnerabilities via OSV
72
+ uv audit --frozen
73
+
71
74
  typecheck-warn: ## Run ty in warning-only mode (always exits 0; used by hooks)
72
75
  @uv run ty check || true
73
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: keboola-cli
3
- Version: 0.93.2
3
+ Version: 0.95.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.95.0"
4
4
  description = "AI-friendly CLI for managing Keboola projects"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -171,9 +171,12 @@ dev = [
171
171
  "ruff>=0.16",
172
172
  "ty>=0.0.33",
173
173
  "bandit>=1.9.4",
174
- "pip-audit>=2.10.0",
175
174
  ]
176
175
 
176
+ [tool.uv]
177
+ # a higher bound breaks current Dependabot's uv lock
178
+ required-version = ">=0.12.7"
179
+
177
180
  [tool.ty.src]
178
181
  include = ["src", "tests", "scripts"]
179
182
 
@@ -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:
@@ -10,16 +10,18 @@ rather than on the client, and `revoke` is a public endpoint that takes the
10
10
  token to revoke in its request body.
11
11
 
12
12
  Inherits shared retry/backoff (429/5xx) and error-mapping infrastructure from
13
- :class:`BaseHttpClient`, with four deliberate exceptions that keep the mapping
13
+ :class:`BaseHttpClient`, with five deliberate exceptions that keep the mapping
14
14
  but skip the retry loop: `poll_device_token` (a polling 400 is a protocol
15
15
  state, not a failure), `refresh` (a blind retry would re-present the refresh
16
16
  token, and it runs under a wall-clock ceiling the retry loop would outlast),
17
- and `login_password`/`verify_mfa_totp` (a blind retry against `/v1/auth/login`
17
+ `login_password`/`verify_mfa_totp` (a blind retry against `/v1/auth/login`
18
18
  burns extra requests against the account's rate-limit bucket before the
19
19
  server's own `X-RateLimit-Reset` guidance is even read, and against
20
20
  `/v1/auth/mfa` would replay a TOTP code the server already marked consumed --
21
- burning one of the account's limited MFA attempts for nothing). The last
22
- three share `_request_bypassing_retry`, which maps transport failures
21
+ burning one of the account's limited MFA attempts for nothing), and
22
+ `provision_project` (not idempotent: every success creates an organization, a
23
+ billable project and a credit grant, so a retried 5xx mints a second one). The
24
+ last four share `_request_bypassing_retry`, which maps transport failures
23
25
  (`httpx.TimeoutException`/`httpx.TransportError`) the way `_do_request` would
24
26
  have, since bypassing the retry loop must not also mean losing that mapping.
25
27
  `refresh` makes one further narrow exception of its own for a rotation
@@ -39,6 +41,8 @@ from urllib.parse import urlencode
39
41
  import httpx
40
42
 
41
43
  from ..constants import (
44
+ AGENT_PROVISIONING_PATH,
45
+ AGENT_PROVISIONING_SYNC_TIMEOUT,
42
46
  AUTH_CLIENT_ID,
43
47
  AUTH_DEVICE_PATH,
44
48
  AUTH_DEVICE_TOKEN_PATH,
@@ -60,6 +64,7 @@ from ..constants import (
60
64
  from ..errors import ErrorCode, KeboolaApiError
61
65
  from ..http_base import BaseHttpClient
62
66
  from .models import (
67
+ AgentProvisioningResponse,
63
68
  CliTokenResponse,
64
69
  DeviceAuthorization,
65
70
  DevicePollResult,
@@ -566,20 +571,33 @@ class AuthClient(BaseHttpClient):
566
571
  json: dict[str, Any],
567
572
  timeout: httpx.Timeout | float | None = None,
568
573
  action: str,
574
+ repeat_unsafe: str = "",
569
575
  ) -> httpx.Response:
570
576
  """Issue one request outside the shared retry loop, still mapping
571
577
  transport failures the way `_do_request` would have.
572
578
 
573
- Shared by `login_password`, `verify_mfa_totp`, and `refresh`
574
- (via `_post_refresh`) -- each bypasses the retry loop for its own
575
- reason (see their docstrings and the module docstring), but
576
- bypassing retry must not also mean losing the
579
+ Shared by `login_password`, `verify_mfa_totp`, `refresh` (via
580
+ `_post_refresh`) and `provision_project` -- each bypasses the retry
581
+ loop for its own reason (see their docstrings and the module
582
+ docstring), but bypassing retry must not also mean losing the
577
583
  `TimeoutException`/`TransportError` -> structured-error mapping
578
584
  `_do_request` gives every other call; without it, a network blip
579
585
  would escape as a raw traceback instead of a `--json` error
580
586
  envelope. `action` names what the caller was doing
581
587
  ("Signing in", "Refreshing your Keboola login", ...), reused in
582
- both message templates below.
588
+ every message template below.
589
+
590
+ `repeat_unsafe`, when non-empty, says the call MUST NOT simply be
591
+ repeated and carries the remedy to print instead. It only changes
592
+ what happens on a timeout that was already delivered, and it exists
593
+ because "timed out" is two different events: a connect/pool timeout
594
+ never reached the server and is always safe to repeat, while a
595
+ read/write timeout means the request WAS sent and its outcome is
596
+ unknown. `BaseHttpClient._do_request` already draws exactly that
597
+ line (and `_non_idempotent_note` says so in prose); flattening it
598
+ here would tell the caller of a non-idempotent write to run it
599
+ again, which for `provision_project` means a second organization, a
600
+ second billable project and a second credit grant.
583
601
  """
584
602
  kwargs: dict[str, Any] = {"json": json}
585
603
  if timeout is not None:
@@ -587,6 +605,17 @@ class AuthClient(BaseHttpClient):
587
605
  try:
588
606
  return self._client.request(method, path, **kwargs)
589
607
  except httpx.TimeoutException as exc:
608
+ delivered = not isinstance(exc, httpx.ConnectTimeout | httpx.PoolTimeout)
609
+ if repeat_unsafe and delivered:
610
+ raise KeboolaApiError(
611
+ message=(
612
+ f"{action} at {self._base_url} timed out after the request had "
613
+ f"been sent, so it may have succeeded anyway. {repeat_unsafe}"
614
+ ),
615
+ status_code=0,
616
+ error_code=ErrorCode.TIMEOUT,
617
+ retryable=False,
618
+ ) from exc
590
619
  raise KeboolaApiError(
591
620
  message=f"{action} at {self._base_url} timed out. Run the command again.",
592
621
  status_code=0,
@@ -655,6 +684,123 @@ class AuthClient(BaseHttpClient):
655
684
  raise
656
685
  raise AssertionError("unreachable: _map_auth_error always raises")
657
686
 
687
+ # ------------------------------------------------------------------
688
+ # Agent provisioning
689
+ # ------------------------------------------------------------------
690
+
691
+ def provision_project(
692
+ self,
693
+ *,
694
+ project_name: str = "",
695
+ backend: str | None = None,
696
+ sync_backend_init: bool = False,
697
+ ) -> AgentProvisioningResponse:
698
+ """Provision a brand-new Keboola project (``POST /manage/programmatic-projects``).
699
+
700
+ Unauthenticated by design -- this is the one endpoint reachable from a
701
+ machine with no Keboola identity at all. Answers a project-pinned,
702
+ Manage-less programmatic session plus a single-use ``confirmUrl`` for
703
+ the human who will take ownership.
704
+
705
+ Bypasses `_do_request`/the shared retry loop -- the same deliberate
706
+ exception `login_password`, `verify_mfa_totp` and `refresh` already
707
+ make (see the module docstring), and here for the strongest reason of
708
+ the four: the call is **not idempotent**. Every success creates an
709
+ organization, a billable project and a free-credit grant, so a blind
710
+ retry of a 5xx (or of a read timeout on a response that was already in
711
+ flight) mints a second project nobody asked for, holding a second slot
712
+ against the stack's unconfirmed-project cap, with a confirm link the
713
+ caller never sees. A 503 here is contention on the stack-wide
714
+ provisioning lock and means nothing was created; it comes back as a
715
+ retryable error for the *user* to repeat, deliberately not for this
716
+ client to repeat on its own.
717
+
718
+ A timeout is classified, not lumped together: a connect/pool timeout
719
+ never reached the stack and is reported retryable, while a read
720
+ timeout means the POST was delivered and may well have succeeded --
721
+ that one is reported NON-retryable and points at `auth status`, whose
722
+ stored session (and claim link) is the evidence of whether a project
723
+ exists. Telling the caller to "run the command again" there is how a
724
+ second organization, project and credit grant get created over a lost
725
+ response.
726
+
727
+ ``sync_backend_init`` also buys a much longer read budget
728
+ (`AGENT_PROVISIONING_SYNC_TIMEOUT`): that flag exists to hold the
729
+ request open until the backend is ready, so the default 30 s would
730
+ make the timeout above the EXPECTED outcome rather than the rare one.
731
+ Note it can outlast an agent's foreground tool-shell timeout -- the
732
+ async default (no flag) is the one to use there.
733
+
734
+ ``backend`` of None keeps the stack maintainer's own default. The
735
+ ``clientId`` is sent for audit attribution: every org/project event of
736
+ this flow carries the stack's shared agent admin as actor, so without
737
+ it the audit log says only "the shared admin did it".
738
+ """
739
+ body: dict[str, Any] = {"clientId": AUTH_CLIENT_ID}
740
+ if project_name:
741
+ body["projectName"] = project_name
742
+ if backend:
743
+ body["backend"] = backend
744
+ if sync_backend_init:
745
+ body["syncBackendInit"] = True
746
+
747
+ response = self._request_bypassing_retry(
748
+ "POST",
749
+ AGENT_PROVISIONING_PATH,
750
+ json=body,
751
+ # `--sync-backend-init` keeps the response open until the backend
752
+ # is ready, well past the 30 s client default.
753
+ timeout=AGENT_PROVISIONING_SYNC_TIMEOUT if sync_backend_init else None,
754
+ action="Creating a Keboola project",
755
+ repeat_unsafe=(
756
+ "Do NOT just run it again -- that would create a second project. "
757
+ "Check with `kbagent auth status --stack "
758
+ f"{self._base_url}`: if a session is reported, the project was "
759
+ "created and the claim link is printed there."
760
+ ),
761
+ )
762
+ if response.status_code >= 400:
763
+ self._raise_provisioning_error(response)
764
+ return AgentProvisioningResponse.model_validate(response.json())
765
+
766
+ def _raise_provisioning_error(self, response: httpx.Response) -> NoReturn:
767
+ """Map a failed provisioning response, naming the right remedy on 404.
768
+
769
+ A 404 means the `agent-provisioning` stack feature
770
+ (STACK_FEATURES__AGENT_PROVISIONING) is off -- the endpoint is
771
+ fail-closed exactly like the rest of this client's surface, and the
772
+ command itself is always registered, so this response is the ONLY
773
+ place a caller learns the capability is missing here. The message
774
+ therefore has to carry the whole answer: what is missing, who can
775
+ turn it on, and what to do instead meanwhile.
776
+
777
+ It cannot go through `_map_auth_error`, whose 404 message is about
778
+ *browser login*: that one tells the caller to paste a token, which
779
+ is exactly what a caller of THIS command does not have.
780
+
781
+ The body is never parsed here. A stack without the route can answer
782
+ 404 as HTML from a legacy dispatcher, and reading a server message
783
+ out of that would replace a useful sentence with markup.
784
+ """
785
+ if response.status_code == 404:
786
+ raise KeboolaApiError(
787
+ message=(
788
+ f"Creating a Keboola project from the CLI is not available on "
789
+ f"{self._base_url}. It needs the `agent-provisioning` stack feature "
790
+ "(STACK_FEATURES__AGENT_PROVISIONING), which is off on this stack -- "
791
+ "ask the stack operator to enable it, or use another stack. To use a "
792
+ f"project that already exists: create one at {self._base_url} in a "
793
+ f"browser, then connect it with `kbagent auth login --stack "
794
+ f"{self._base_url}` or `kbagent project add --project <alias> --url "
795
+ f"{self._base_url} --token <token>`."
796
+ ),
797
+ status_code=404,
798
+ error_code=ErrorCode.AUTH_NOT_SUPPORTED_ON_STACK,
799
+ retryable=False,
800
+ )
801
+ super()._raise_api_error(response, self._base_url)
802
+ raise AssertionError("unreachable: BaseHttpClient._raise_api_error always raises")
803
+
658
804
  def introspect(self, access_token: str) -> IntrospectResponse:
659
805
  """Fetch session metadata + accessible projects for a live access token.
660
806