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