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.
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/CLAUDE.md +108 -7
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/CONTRIBUTING.md +25 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/Makefile +4 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/PKG-INFO +1 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/pyproject.toml +5 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_sentinel_guards.py +39 -8
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/ai_client.py +7 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/auth_client.py +155 -9
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/models.py +51 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/token_provider.py +14 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/changelog.py +66 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/cli.py +6 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_helpers.py +32 -0
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_common.py +334 -0
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_render.py +454 -0
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/_merge_request_writes.py +657 -0
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/_project_create.py +75 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +10 -1
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/_url_copy.py +205 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/auth.py +73 -20
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/branch.py +21 -5
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/context.py +141 -27
- keboola_cli-0.95.0/src/keboola_agent_cli/commands/merge_request.py +333 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/project.py +70 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/sync.py +11 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/transformation.py +4 -23
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/constants.py +27 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/data_science_client.py +7 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/errors.py +8 -10
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/http_base.py +7 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/metastore_client.py +29 -11
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/permissions.py +37 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/scheduler_client.py +9 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/_serve_command_map.py +26 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/app.py +35 -11
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/dependencies.py +3 -0
- keboola_cli-0.95.0/src/keboola_agent_cli/server/routers/merge_requests.py +319 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/semantic_layer.py +2 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_auth_registration.py +7 -15
- keboola_cli-0.95.0/src/keboola_agent_cli/services/_semantic_layer_fqn.py +62 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_internals.py +36 -29
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_clone.py +31 -5
- keboola_cli-0.95.0/src/keboola_agent_cli/services/_sync_data_app.py +195 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_push_ops.py +45 -8
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_table_detail.py +47 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/auth_service.py +205 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/base.py +38 -16
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/component_service.py +4 -11
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/config_service.py +11 -12
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/data_app_git_service.py +4 -8
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/data_app_service.py +6 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/docs_service.py +6 -3
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/flow_service.py +11 -21
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/merge_request_service.py +231 -20
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/semantic_layer_service.py +27 -56
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/sharing_service.py +4 -3
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/stream_service.py +8 -11
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/sync_service.py +122 -4
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/stream_client.py +3 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/clone.py +43 -6
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/config_format.py +12 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_client.py +216 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_sentinel_guards.py +72 -95
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_service.py +258 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_sentinel_guards.py +34 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_cli_auth.py +64 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e.py +270 -2
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_auth.py +117 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_base_auth.py +88 -30
- keboola_cli-0.95.0/tests/test_merge_request_cli.py +1663 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_merge_request_service.py +337 -7
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_metastore_client.py +100 -0
- keboola_cli-0.95.0/tests/test_project_create_cli.py +394 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_cli.py +25 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_service.py +237 -41
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_router_calls.py +335 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_semantic_layer_routes_e2e.py +3 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_smoke.py +15 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_describe_service.py +72 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_cli.py +33 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_clone.py +325 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_config_format.py +40 -0
- keboola_cli-0.95.0/tests/test_sync_data_app_type.py +510 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_storage_jobs.py +224 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_provider.py +25 -0
- keboola_cli-0.95.0/tests/test_url_copy.py +126 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/package-lock.json +78 -75
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/package.json +1 -1
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/.gitignore +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/LICENSE +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/examples/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/pre-commit +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/sync_version.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/conftest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_base_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_state.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_config_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_errors.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_base.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_integration.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_job_options.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lib.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_member_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_org_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_output.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_pricing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_repl.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_result_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_search_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_services.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_token_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_version_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/index.html +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.95.0}/web/frontend/tsconfig.json +0 -0
- {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}`.
|
|
396
|
-
#
|
|
397
|
-
#
|
|
398
|
-
# (
|
|
399
|
-
#
|
|
400
|
-
#
|
|
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
|
[project]
|
|
2
2
|
name = "keboola-cli"
|
|
3
|
-
version = "0.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
|
22
|
-
|
|
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`,
|
|
574
|
-
|
|
575
|
-
reason (see their docstrings and the module
|
|
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
|
-
|
|
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
|
|