keboola-cli 0.96.0__tar.gz → 0.96.2__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.0 → keboola_cli-0.96.2}/PKG-INFO +1 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +1 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/pyproject.toml +1 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/changelog.py +21 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_data_app_password.py +62 -18
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_url_copy.py +5 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/auth.py +3 -3
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/context.py +14 -14
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/data_app.py +13 -2
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/conftest.py +20 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_cli_auth.py +26 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_cli.py +80 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_password.py +141 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_url_copy.py +10 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/package-lock.json +3 -3
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/package.json +1 -1
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/.gitignore +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/CLAUDE.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/LICENSE +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/Makefile +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/README.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/examples/README.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/formal/sync/README.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/pre-commit +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/sync_version.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/editor.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_merge_request_common.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_project_create.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/merge_request.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/effective_branch.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/project_ref.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/app.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_workspace.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/sync_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/__init__.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/helpers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_api_call_counts.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_base_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_component_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_search.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_state.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_config_update.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_e2e.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_effective_branch.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_encryption.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_errors.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_helpers.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_http_base.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_integration.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_job_options.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_lib.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_member_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_merge_request_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_merge_request_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_org_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_output.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_permissions.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_pricing.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_create_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_project_ref.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_repl.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_result_models.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_search_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_project_ref.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_services.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_branch_scope.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_clone_links.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_data_app_type.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_formal_counterexamples.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_pull_companion_files.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_sync_workspaces.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_token_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_version_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/README.md +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/index.html +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.96.0 → keboola_cli-0.96.2}/web/frontend/vite.config.ts +0 -0
|
@@ -17,7 +17,7 @@ directory between a SOURCE Keboola project (e.g. dev) and a DESTINATION project
|
|
|
17
17
|
Pushes every pipeline's directory to its DESTINATION project once the PR
|
|
18
18
|
has merged, with `--force`: a config deleted in the SOURCE is deleted in
|
|
19
19
|
the DESTINATION too. Without `--force`, `sync push` deletes nothing
|
|
20
|
-
(since 0.96.
|
|
20
|
+
(since 0.96.1, #792), and the validate dry-run passes it for the same
|
|
21
21
|
reason, so it shows what the push does.
|
|
22
22
|
|
|
23
23
|
Each pipeline needs two Storage API token secrets (`KBC_TOKEN_<NAME>_SOURCE` /
|
|
@@ -26,7 +26,18 @@ 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.96.
|
|
29
|
+
"0.96.2": [
|
|
30
|
+
"Fix (#825): the `data-app` commands now label the app link `Open the app:` and the "
|
|
31
|
+
"Keboola UI link `Configuration:`, so it is clear which link opens what. Before, the "
|
|
32
|
+
"labels were `App URL:` and `UI URL:`, or only `URL:` in `data-app detail` and "
|
|
33
|
+
"`data-app create`. In a terminal, `data-app password`, `create --wait` and "
|
|
34
|
+
"`deploy --wait` show the links in a panel that looks like the `auth login` device-code "
|
|
35
|
+
"panel. Outside a terminal, the output stays plain lines without a panel. The `--json` "
|
|
36
|
+
"output does not change.",
|
|
37
|
+
"Note (#819, #820, #822, #823): housekeeping with no user-facing change. Dependency "
|
|
38
|
+
"updates in the web UI and its backend (fast-uri, brace-expansion, fastify, dompurify).",
|
|
39
|
+
],
|
|
40
|
+
"0.96.1": [
|
|
30
41
|
"BREAKING (#813): `kbagent data-app password` no longer prints the password unless "
|
|
31
42
|
"you pass `--reveal`. When an AI agent ran the command, the password went into the model "
|
|
32
43
|
"context and the chat history (CLI-23). The command now uses the project token (static or "
|
|
@@ -213,6 +224,12 @@ CHANGELOG: dict[str, list[str]] = {
|
|
|
213
224
|
"a version by default, not only of the first note. When a version has fewer than two "
|
|
214
225
|
"BREAKING notes, it adds the first other notes until two notes show. `--full`, `--json` "
|
|
215
226
|
"and the `What's new` notice after an update do not change.",
|
|
227
|
+
"Change (#821): the macOS binary is no longer signed with an Apple Developer ID or "
|
|
228
|
+
"notarized by Apple. A problem on the Apple side stopped the 0.96.0 release on every "
|
|
229
|
+
"platform. The binary now has only the ad-hoc signature that PyInstaller adds. Install "
|
|
230
|
+
"it with `brew install keboola-cli2`, or use `uv tool install keboola-cli`. macOS blocks "
|
|
231
|
+
"a `darwin_arm64` zip that a browser downloads: allow it in System Settings > Privacy & "
|
|
232
|
+
"Security, or run `xattr -d com.apple.quarantine kbagent`.",
|
|
216
233
|
"Note (#793, #797, #804, #806, #816): housekeeping with no user-facing change. #793 adds a "
|
|
217
234
|
"formal model of the sync engine (TLA+ and Lean 4, under `formal/sync/`) and one "
|
|
218
235
|
"regression test for each finding. The sync fixes #794, #795, #796 and #811 in this "
|
|
@@ -220,6 +237,9 @@ CHANGELOG: dict[str, list[str]] = {
|
|
|
220
237
|
"that they guard breaks, and add tests that count the API calls of frequent read "
|
|
221
238
|
"commands. #806 updates `undici` in the web backend from 6.28.0 to 6.28.1, for three "
|
|
222
239
|
"security advisories.",
|
|
240
|
+
"Note: this release replaces 0.96.0, because the 0.96.0 release run stopped at the Apple "
|
|
241
|
+
"notarization. 0.96.0 reached PyPI, but it got no GitHub release and no packages, and "
|
|
242
|
+
"`kbagent update` stayed on 0.95.0. This release has every change of 0.96.0 and #821.",
|
|
223
243
|
],
|
|
224
244
|
"0.95.0": [
|
|
225
245
|
"New (#775): `kbagent project create --url URL` creates a new Keboola project from a "
|
{keboola_cli-0.96.0 → keboola_cli-0.96.2}/src/keboola_agent_cli/commands/_data_app_password.py
RENAMED
|
@@ -33,6 +33,7 @@ from typing import Annotated, Any, NoReturn
|
|
|
33
33
|
import typer
|
|
34
34
|
from rich.console import Console
|
|
35
35
|
from rich.markup import escape
|
|
36
|
+
from rich.panel import Panel
|
|
36
37
|
from rich.text import Text
|
|
37
38
|
|
|
38
39
|
from ..auth import environment
|
|
@@ -51,11 +52,12 @@ DELIVERED_TO_STDOUT = "stdout"
|
|
|
51
52
|
_BROWSER_OPEN_WAIT_SECONDS = 2.0
|
|
52
53
|
|
|
53
54
|
_COPY_PROMPT_TIMEOUT_SECONDS = 120.0
|
|
55
|
+
_PANEL_TITLE = "Data app password"
|
|
54
56
|
_COPY_PROMPT_HINT = "Press c to copy the password, Enter to finish"
|
|
55
57
|
# Enter arrives as "\n" in cbreak mode on POSIX and as "\r" from msvcrt on Windows.
|
|
56
58
|
_COPY_PROMPT_FINISH_KEYS = frozenset({"\n", "\r", "\x1b", "q"})
|
|
57
|
-
# The terminal flow prints the
|
|
58
|
-
_UI_URL_SHOWS_IT = "The
|
|
59
|
+
# The terminal flow prints the Configuration link itself, so its lines only refer to it.
|
|
60
|
+
_UI_URL_SHOWS_IT = "The Configuration page shows it under Open App after login."
|
|
59
61
|
|
|
60
62
|
# -- Shared options: one definition for `password`, `create` and `deploy` -------
|
|
61
63
|
|
|
@@ -206,29 +208,67 @@ def _non_interactive_message(
|
|
|
206
208
|
)
|
|
207
209
|
|
|
208
210
|
|
|
209
|
-
def _print_line(console: Console, *parts: str | tuple[str, str]) -> None:
|
|
211
|
+
def _print_line(console: Console, *parts: str | Text | tuple[str, str]) -> None:
|
|
210
212
|
"""One line of plain text parts: no markup parsing, no highlighting, and a
|
|
211
213
|
URL in it is never folded (non-TTY consoles wrap at 80 columns)."""
|
|
212
214
|
console.print(Text.assemble(*parts), highlight=False, soft_wrap=True)
|
|
213
215
|
|
|
214
216
|
|
|
215
|
-
def
|
|
216
|
-
|
|
217
|
-
|
|
217
|
+
def _print_password_block(
|
|
218
|
+
console: Console,
|
|
219
|
+
status: Text,
|
|
220
|
+
*,
|
|
221
|
+
app_url: str,
|
|
222
|
+
ui_url: str | None,
|
|
223
|
+
app_opened: bool,
|
|
224
|
+
password: str | None = None,
|
|
225
|
+
) -> None:
|
|
226
|
+
"""The status line, the two links and (``--reveal``) the password.
|
|
227
|
+
|
|
228
|
+
In a terminal they go in a panel laid out like the device-login one: a
|
|
229
|
+
plain label, a blank line, the link. Anywhere else (a pipe, a CI log, an
|
|
230
|
+
agent) they stay plain lines, so a URL is never folded and never carries
|
|
231
|
+
a panel border.
|
|
232
|
+
"""
|
|
233
|
+
app_link = (app_url, _url_copy.LINK_STYLE) if app_url else "-"
|
|
234
|
+
# The app link is the one to open, so only it gets the link color.
|
|
235
|
+
ui_link = (ui_url, "bold") if ui_url else "-"
|
|
236
|
+
password_part = (password or "", "bold yellow")
|
|
237
|
+
if console.is_terminal:
|
|
238
|
+
parts: list[str | Text | tuple[str, str]] = [
|
|
239
|
+
status,
|
|
240
|
+
"\n\nOpen the app:\n\n",
|
|
241
|
+
app_link,
|
|
242
|
+
"\n\nConfiguration:\n\n",
|
|
243
|
+
ui_link,
|
|
244
|
+
]
|
|
245
|
+
if app_opened:
|
|
246
|
+
parts.append("\n\nOpened the app in the browser.")
|
|
247
|
+
if password is not None:
|
|
248
|
+
parts += ["\n\nPassword: ", password_part]
|
|
249
|
+
console.print(Panel(Text.assemble(*parts), title=_PANEL_TITLE, expand=False))
|
|
250
|
+
return
|
|
251
|
+
_print_line(console, status)
|
|
252
|
+
_print_line(console, (" Open the app:", "bold"), " ", app_link)
|
|
253
|
+
_print_line(console, (" Configuration:", "bold"), " ", ui_link)
|
|
218
254
|
if app_opened:
|
|
219
255
|
console.print(" Opened the app in the browser.")
|
|
256
|
+
if password is not None:
|
|
257
|
+
_print_line(console, "\nPassword: ", password_part)
|
|
220
258
|
|
|
221
259
|
|
|
222
260
|
def _print_result(console: Console, data: dict[str, Any]) -> None:
|
|
223
261
|
label = (
|
|
224
262
|
("Success:", "bold green") if data["password_delivered_to"] else ("Warning:", "bold yellow")
|
|
225
263
|
)
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
264
|
+
_print_password_block(
|
|
265
|
+
console,
|
|
266
|
+
Text.assemble(label, f" {data['message']}"),
|
|
267
|
+
app_url=data["app_url"],
|
|
268
|
+
ui_url=data["ui_url"],
|
|
269
|
+
app_opened=data["app_opened"],
|
|
270
|
+
password=data.get("password"),
|
|
229
271
|
)
|
|
230
|
-
if "password" in data:
|
|
231
|
-
_print_line(console, ("\nPassword:", "bold yellow"), f" {data['password']}")
|
|
232
272
|
|
|
233
273
|
|
|
234
274
|
def _copy_on_keypress(console: Console, lookup: DataAppPassword, *, app_opened: bool) -> bool:
|
|
@@ -239,15 +279,19 @@ def _copy_on_keypress(console: Console, lookup: DataAppPassword, *, app_opened:
|
|
|
239
279
|
hint=_COPY_PROMPT_HINT,
|
|
240
280
|
finish_keys=_COPY_PROMPT_FINISH_KEYS,
|
|
241
281
|
)
|
|
242
|
-
if
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
282
|
+
if wait.enabled:
|
|
283
|
+
status = Text(f"The password of data app {lookup.app_id} is ready to copy.")
|
|
284
|
+
else:
|
|
285
|
+
status = Text.assemble(
|
|
286
|
+
("Warning:", "bold yellow"),
|
|
287
|
+
f" No clipboard tool was found, so the password of data app {lookup.app_id} "
|
|
288
|
+
f"cannot be copied. {_UI_URL_SHOWS_IT}",
|
|
246
289
|
)
|
|
247
|
-
|
|
290
|
+
_print_password_block(
|
|
291
|
+
console, status, app_url=lookup.app_url, ui_url=lookup.ui_url, app_opened=app_opened
|
|
292
|
+
)
|
|
293
|
+
if not wait.enabled:
|
|
248
294
|
return False
|
|
249
|
-
console.print(f"The password of data app {escape(lookup.app_id)} is ready to copy.")
|
|
250
|
-
_print_links(console, app_url=lookup.app_url, ui_url=lookup.ui_url, app_opened=app_opened)
|
|
251
295
|
wait.prompt_and_wait(lookup.password, _COPY_PROMPT_TIMEOUT_SECONDS)
|
|
252
296
|
if wait.copied:
|
|
253
297
|
return True
|
|
@@ -28,6 +28,11 @@ from rich.console import Console
|
|
|
28
28
|
|
|
29
29
|
_POSIX = sys.platform != "win32"
|
|
30
30
|
|
|
31
|
+
# Rich style of the main link the user opens. The device-login panel
|
|
32
|
+
# (commands/auth.py) and the data-app app link (commands/data_app.py,
|
|
33
|
+
# commands/_data_app_password.py) share this one definition.
|
|
34
|
+
LINK_STYLE = "bold cyan"
|
|
35
|
+
|
|
31
36
|
# A clipboard command that hangs (e.g. xclip waiting on an unreachable X
|
|
32
37
|
# display) must not hang the command that called it.
|
|
33
38
|
_CLIPBOARD_TIMEOUT_SECONDS = 5.0
|
|
@@ -54,7 +54,7 @@ from ._helpers import (
|
|
|
54
54
|
map_error_to_exit_code,
|
|
55
55
|
read_password_stdin,
|
|
56
56
|
)
|
|
57
|
-
from ._url_copy import CopyableUrlWait
|
|
57
|
+
from ._url_copy import LINK_STYLE, CopyableUrlWait
|
|
58
58
|
|
|
59
59
|
auth_app = typer.Typer(
|
|
60
60
|
help="Programmatic browser login (PKCE / device code) -- user-scoped sessions"
|
|
@@ -311,7 +311,7 @@ def _device_login_panel(authorization: DeviceAuthorization) -> Panel:
|
|
|
311
311
|
lines = [
|
|
312
312
|
"Open this link to finish signing in (code already filled in):",
|
|
313
313
|
"",
|
|
314
|
-
f"[
|
|
314
|
+
f"[{LINK_STYLE}]{escape(complete)}[/{LINK_STYLE}]",
|
|
315
315
|
"",
|
|
316
316
|
"Or enter the code by hand at this URL:",
|
|
317
317
|
"",
|
|
@@ -323,7 +323,7 @@ def _device_login_panel(authorization: DeviceAuthorization) -> Panel:
|
|
|
323
323
|
lines = [
|
|
324
324
|
"Open this URL and enter the code to finish signing in:",
|
|
325
325
|
"",
|
|
326
|
-
f"[
|
|
326
|
+
f"[{LINK_STYLE}]{escape(authorization.verification_uri)}[/{LINK_STYLE}]",
|
|
327
327
|
"",
|
|
328
328
|
f"Code: [bold yellow]{escape(authorization.user_code)}[/bold yellow]",
|
|
329
329
|
]
|
|
@@ -163,7 +163,7 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
163
163
|
registered unless --register-projects was passed, and where the
|
|
164
164
|
suggested alias is slugified from the project NAME, never the numeric
|
|
165
165
|
project id (e.g. 9840). Once registered, `--project 9840` resolves to
|
|
166
|
-
that alias too (since 0.96.
|
|
166
|
+
that alias too (since 0.96.1; see Tips 3).
|
|
167
167
|
--all registers every accessible project. --project-id ID (repeatable)
|
|
168
168
|
registers specific ones (an id the session cannot access raises a
|
|
169
169
|
ConfigError naming it). Omitting both starts an interactive arrow-key +
|
|
@@ -344,7 +344,7 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
344
344
|
|
|
345
345
|
kbagent project use ALIAS
|
|
346
346
|
Pin ALIAS as the default project. Persists to config.json. A registered
|
|
347
|
-
project ID pins that project's alias (since 0.96.
|
|
347
|
+
project ID pins that project's alias (since 0.96.1; see Tips 3).
|
|
348
348
|
Env var KBAGENT_PROJECT=ALIAS overrides the pin for a single shell/session;
|
|
349
349
|
an explicit --project flag overrides both.
|
|
350
350
|
|
|
@@ -373,7 +373,7 @@ Use `kbagent <command> --help` for full flag details and examples.
|
|
|
373
373
|
|
|
374
374
|
kbagent project invite --from-csv FILE [--default-role ROLE] [--workers N] [--dry-run]
|
|
375
375
|
Bulk invite. CSV must have a header row with columns: email, project (alias or
|
|
376
|
-
numeric ID -- an alias wins, see Tips 3; since 0.96.
|
|
376
|
+
numeric ID -- an alias wins, see Tips 3; since 0.96.1) or project_id (ID only),
|
|
377
377
|
role (optional if --default-role is given), reason (optional).
|
|
378
378
|
Parallelised with ThreadPoolExecutor (default 8 workers). Per-row results in
|
|
379
379
|
`rows[]` with status=ok|noop|failed; `failed_rows` ordering is not deterministic.
|
|
@@ -1431,7 +1431,7 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1431
1431
|
|
|
1432
1432
|
kbagent data-app deploy --project NAME --app-id ID [--config-version N]
|
|
1433
1433
|
[--wait] [--timeout SECONDS] [--branch ID] [--copy] [--reveal]
|
|
1434
|
-
With --wait on a password app (0.96.
|
|
1434
|
+
With --wait on a password app (0.96.1+): the password is delivered like
|
|
1435
1435
|
`data-app password` (the c prompt in a terminal, which then waits for
|
|
1436
1436
|
Enter or 120 s; --copy / --reveal need --wait). Without a flag and
|
|
1437
1437
|
without the prompt (no terminal, --json) nothing is read: output as
|
|
@@ -1458,11 +1458,11 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1458
1458
|
kbagent data-app password --project NAME --app-id ID
|
|
1459
1459
|
[--copy] [--reveal] [--open]
|
|
1460
1460
|
Give the user the password of a password-protected app WITHOUT printing
|
|
1461
|
-
it (0.96.
|
|
1461
|
+
it (0.96.1+; older versions printed it and needed a Manage API token).
|
|
1462
1462
|
Project token only (static or session), no Manage token. In a terminal
|
|
1463
|
-
(human mode, stdin + stdout a TTY, not a background job) it
|
|
1464
|
-
|
|
1465
|
-
finishes, 120 s timeout.
|
|
1463
|
+
(human mode, stdin + stdout a TTY, not a background job) it prints the
|
|
1464
|
+
links `Open the app:` (`app_url`) and `Configuration:` (`ui_url`), then
|
|
1465
|
+
waits: `c` copies the password, Enter / Esc / q finishes, 120 s timeout.
|
|
1466
1466
|
Without a terminal or with --json there is no prompt: only --copy copies
|
|
1467
1467
|
it (the clipboard tool gets it on stdin). Nothing copied -> exit 0 with
|
|
1468
1468
|
`password_delivered_to: null`; `ui_url` is the Keboola UI page that shows
|
|
@@ -1592,7 +1592,7 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1592
1592
|
|
|
1593
1593
|
kbagent sync init --project ALIAS [--directory DIR] [--git-branching] [--adopt-existing] [--with-workspaces]
|
|
1594
1594
|
Initialize sync working directory. --git-branching enables git-to-Keboola branch mapping.
|
|
1595
|
-
--with-workspaces (since 0.96.
|
|
1595
|
+
--with-workspaces (since 0.96.1, CLI-25) sets "syncWorkspaces": true in the manifest
|
|
1596
1596
|
(with --adopt-existing: turns it on in an existing one). pull/diff/push/clone then also
|
|
1597
1597
|
sync shared SQL workspaces: keboola.sandboxes configs with no parameters.id and
|
|
1598
1598
|
runtime.shared true (Python/R and legacy SQL sandboxes carry parameters.id and stay
|
|
@@ -1627,7 +1627,7 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1627
1627
|
Auto-detects renamed configs and renames local directories to match (uses git mv in git repos).
|
|
1628
1628
|
--branch: per-invocation dev-branch override. Same semantics as sync push/diff.
|
|
1629
1629
|
Ignored components (since 0.91.0, #689): keboola.sandboxes + keboola.mcp-server-tool are
|
|
1630
|
-
always excluded (except shared SQL workspaces under syncWorkspaces, since 0.96.
|
|
1630
|
+
always excluded (except shared SQL workspaces under syncWorkspaces, since 0.96.1),
|
|
1631
1631
|
unioned with the manifest's ignoredComponents list
|
|
1632
1632
|
(.keboola/manifest.json) -- a per-tree exclusion knob honored by pull/diff/push. A
|
|
1633
1633
|
component newly ignored has its manifest entry dropped and local dir removed on the next
|
|
@@ -1667,7 +1667,7 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1667
1667
|
kbagent sync push --project ALIAS [--all-projects] [--dry-run] [--force] [--allow-plaintext-on-encrypt-failure] [--branch ID] [--no-name-drift-warnings]
|
|
1668
1668
|
Push local changes. Auto-encrypts secrets. Skips conflicts (pull first).
|
|
1669
1669
|
Fails if encryption fails (plaintext secrets never pushed). Use escape hatch flag only if you know what you are doing.
|
|
1670
|
-
Workspace delete (since 0.96.
|
|
1670
|
+
Workspace delete (since 0.96.1, syncWorkspaces trees): a --force push that deletes a shared
|
|
1671
1671
|
SQL workspace also deletes its SQL editor sessions (every user's, push branch) and their
|
|
1672
1672
|
backend workspaces, which config restore does not bring back; check
|
|
1673
1673
|
`sync push --dry-run --force` (warnings[] workspace_sessions) first. --force is destructive-class (a policy denying
|
|
@@ -1706,11 +1706,11 @@ git block, slug, runtime size, encrypted secrets) with the Data Science API
|
|
|
1706
1706
|
Clone a reference synced tree into a fresh target project + parameterize it
|
|
1707
1707
|
(bucket_map / variable_values / instance_rename overrides), then push so every
|
|
1708
1708
|
config CREATEs fresh. keboola.flow task configIds + variable links remap
|
|
1709
|
-
reference->ULID; since 0.96.
|
|
1709
|
+
reference->ULID; since 0.96.1 also shared-code links, legacy keboola.orchestrator
|
|
1710
1710
|
task configIds, task configRowIds and schedule targets (link_remaps counts each
|
|
1711
1711
|
kind; an unset link is an errors[] entry, a failed PUT is sent by the next push).
|
|
1712
1712
|
Idempotent (re-run -> no_changes); needs a fresh target.
|
|
1713
|
-
Read warnings[] after a clone (also --dry-run, 0.96.
|
|
1713
|
+
Read warnings[] after a clone (also --dry-run, 0.96.1+): missing_task_target (a
|
|
1714
1714
|
flow/orchestrator task runs a config not in the tree), encrypted_values_copied
|
|
1715
1715
|
(KBC:: paths the target cannot decrypt; secret_keys: plaintext in _config.yml +
|
|
1716
1716
|
sync push, unencryptable_keys: encrypt values, oauth_keys: authorize again),
|
|
@@ -2256,7 +2256,7 @@ MISSING_MASTER_TOKEN (exit 3) with the remedy (#711). Pre-flight:
|
|
|
2256
2256
|
|
|
2257
2257
|
3. Multi-project: most read commands accept repeatable --project flag.
|
|
2258
2258
|
Omit --project to query ALL connected projects in parallel.
|
|
2259
|
-
--project takes an alias or a registered project's numeric ID (since 0.96.
|
|
2259
|
+
--project takes an alias or a registered project's numeric ID (since 0.96.1).
|
|
2260
2260
|
An alias wins over an ID. An ID registered under several aliases fails with
|
|
2261
2261
|
CONFIG_ERROR (exit 5) and lists them -- unless all are on one stack and
|
|
2262
2262
|
exactly one is a session (browser-login) alias, which then wins. The same
|
|
@@ -41,6 +41,7 @@ from ._helpers import (
|
|
|
41
41
|
get_service,
|
|
42
42
|
map_error_to_exit_code,
|
|
43
43
|
)
|
|
44
|
+
from ._url_copy import LINK_STYLE
|
|
44
45
|
|
|
45
46
|
# Canonical Keboola help-doc references appended to each --help epilog so
|
|
46
47
|
# operators have a one-click path to the rule a flag enforces.
|
|
@@ -198,7 +199,12 @@ def data_app_detail(
|
|
|
198
199
|
),
|
|
199
200
|
c.print(f" [bold]Size:[/bold] {d.get('size', '')}"),
|
|
200
201
|
c.print(f" [bold]Auto-suspend:[/bold] {d.get('auto_suspend_after_seconds', '?')}s"),
|
|
201
|
-
c.print(
|
|
202
|
+
c.print(
|
|
203
|
+
f" [bold]Open the app:[/bold] "
|
|
204
|
+
f"[{LINK_STYLE}]{escape(d.get('url') or '')}[/{LINK_STYLE}]",
|
|
205
|
+
highlight=False,
|
|
206
|
+
soft_wrap=True,
|
|
207
|
+
),
|
|
202
208
|
c.print(f" [bold]Last started:[/bold] {d.get('last_start_timestamp', '')}"),
|
|
203
209
|
c.print(f" [bold]Git:[/bold] {d.get('git', {})}"),
|
|
204
210
|
),
|
|
@@ -238,7 +244,12 @@ def _print_create_result(console: Console, result: dict[str, Any]) -> None:
|
|
|
238
244
|
"not be injected; an app that reads Storage will serve no data"
|
|
239
245
|
)
|
|
240
246
|
if result.get("url"):
|
|
241
|
-
console.print(
|
|
247
|
+
console.print(
|
|
248
|
+
f" [bold]Open the app:[/bold] "
|
|
249
|
+
f"[{LINK_STYLE}]{escape(result['url'])}[/{LINK_STYLE}]",
|
|
250
|
+
highlight=False,
|
|
251
|
+
soft_wrap=True,
|
|
252
|
+
)
|
|
242
253
|
console.print(
|
|
243
254
|
f" [bold]State:[/bold] {result.get('state', '?')} "
|
|
244
255
|
f"(desired={result.get('desired_state', '?')})"
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"""Shared test fixtures for Keboola Agent CLI tests."""
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
+
from typing import Any
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
7
|
+
from rich.console import Console
|
|
6
8
|
|
|
9
|
+
from keboola_agent_cli import output
|
|
7
10
|
from keboola_agent_cli.config_store import ConfigStore
|
|
8
11
|
from keboola_agent_cli.output import OutputFormatter
|
|
9
12
|
|
|
@@ -21,6 +24,23 @@ def _deterministic_console_width(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
|
21
24
|
monkeypatch.setenv("COLUMNS", "200")
|
|
22
25
|
|
|
23
26
|
|
|
27
|
+
@pytest.fixture
|
|
28
|
+
def force_colour(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
29
|
+
"""Make the CLI print ANSI colour codes under ``CliRunner``.
|
|
30
|
+
|
|
31
|
+
``OutputFormatter`` turns the terminal off when stdout is not a TTY, and
|
|
32
|
+
``CliRunner`` is not one, so a test that pins a Rich style would otherwise
|
|
33
|
+
only see plain text.
|
|
34
|
+
"""
|
|
35
|
+
real_console = output.Console
|
|
36
|
+
|
|
37
|
+
def _colour_console(**kwargs: Any) -> Console:
|
|
38
|
+
kwargs.update(force_terminal=True, color_system="standard", no_color=False)
|
|
39
|
+
return real_console(**kwargs)
|
|
40
|
+
|
|
41
|
+
monkeypatch.setattr(output, "Console", _colour_console)
|
|
42
|
+
|
|
43
|
+
|
|
24
44
|
@pytest.fixture(autouse=True)
|
|
25
45
|
def _clear_updated_from(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
26
46
|
"""Prevent auto-update changelog leaking between tests."""
|
|
@@ -247,6 +247,32 @@ class TestLogin:
|
|
|
247
247
|
assert "Or enter the code by hand at this URL:" in result.output
|
|
248
248
|
assert "https://connection.keboola.com/device?user_code=ABCD-EFGH" in result.output
|
|
249
249
|
|
|
250
|
+
def test_device_login_panel_colours(self, tmp_path: Path, force_colour) -> None:
|
|
251
|
+
"""The link is bold cyan, the plain URL bold, the code bold yellow.
|
|
252
|
+
|
|
253
|
+
`data-app` prints its app link in the same bold cyan (`LINK_STYLE`).
|
|
254
|
+
"""
|
|
255
|
+
config_dir = tmp_path / "c"
|
|
256
|
+
config_dir.mkdir()
|
|
257
|
+
svc = MagicMock()
|
|
258
|
+
self._fire_device_prompt(
|
|
259
|
+
svc,
|
|
260
|
+
DeviceAuthorization(
|
|
261
|
+
deviceCode="device-code-1",
|
|
262
|
+
userCode="ABCD-EFGH",
|
|
263
|
+
verificationUri="https://connection.keboola.com/device",
|
|
264
|
+
verificationUriComplete=(
|
|
265
|
+
"https://connection.keboola.com/device?user_code=ABCD-EFGH"
|
|
266
|
+
),
|
|
267
|
+
),
|
|
268
|
+
)
|
|
269
|
+
result = _invoke(config_dir, svc, ["auth", "login", "--device-code"])
|
|
270
|
+
assert result.exit_code == 0, result.output
|
|
271
|
+
link = "https://connection.keboola.com/device?user_code=ABCD-EFGH"
|
|
272
|
+
assert f"\x1b[1;36m{link}\x1b[0m" in result.output
|
|
273
|
+
assert "\x1b[1mhttps://connection.keboola.com/device\x1b[0m" in result.output
|
|
274
|
+
assert "\x1b[1;33mABCD-EFGH\x1b[0m" in result.output
|
|
275
|
+
|
|
250
276
|
def test_device_login_panel_omits_one_click_link_when_absent(self, tmp_path: Path) -> None:
|
|
251
277
|
config_dir = tmp_path / "c"
|
|
252
278
|
config_dir.mkdir()
|
|
@@ -419,6 +419,86 @@ class TestDataAppCreateValidation:
|
|
|
419
419
|
assert "DRY RUN" in result.output
|
|
420
420
|
|
|
421
421
|
|
|
422
|
+
# ---------------------------------------------------------------------------
|
|
423
|
+
# data-app detail / create -- the link to the running app
|
|
424
|
+
# ---------------------------------------------------------------------------
|
|
425
|
+
|
|
426
|
+
APP_URL = "https://x.hub.example.com"
|
|
427
|
+
BOLD_CYAN = "\x1b[1;36m" # the style of the `auth login --device-code` link
|
|
428
|
+
RESET = "\x1b[0m"
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
class TestDataAppLinkOutput:
|
|
432
|
+
def _detail(self, tmp_path: Path) -> Any:
|
|
433
|
+
config_dir = tmp_path / "config"
|
|
434
|
+
config_dir.mkdir()
|
|
435
|
+
store = _setup_config(config_dir, {"prod": {"token": TEST_TOKEN}})
|
|
436
|
+
mock = MagicMock()
|
|
437
|
+
mock.get_data_app.return_value = {
|
|
438
|
+
"project_alias": "prod",
|
|
439
|
+
"app_id": "42",
|
|
440
|
+
"name": "App",
|
|
441
|
+
"url": APP_URL,
|
|
442
|
+
}
|
|
443
|
+
return _invoke(
|
|
444
|
+
["data-app", "detail", "--project", "prod", "--app-id", "42"],
|
|
445
|
+
store=store,
|
|
446
|
+
data_app_mock=mock,
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
def _create(self, tmp_path: Path) -> Any:
|
|
450
|
+
config_dir = tmp_path / "config"
|
|
451
|
+
config_dir.mkdir()
|
|
452
|
+
store = _setup_config(config_dir, {"prod": {"token": TEST_TOKEN}})
|
|
453
|
+
mock = MagicMock()
|
|
454
|
+
mock.create_data_app.return_value = {
|
|
455
|
+
"app_id": "42",
|
|
456
|
+
"config_id": "ulid",
|
|
457
|
+
"workspace": True,
|
|
458
|
+
"url": APP_URL,
|
|
459
|
+
"state": "created",
|
|
460
|
+
"desired_state": "stopped",
|
|
461
|
+
"message": "created",
|
|
462
|
+
}
|
|
463
|
+
return _invoke(
|
|
464
|
+
[
|
|
465
|
+
"data-app",
|
|
466
|
+
"create",
|
|
467
|
+
"--project",
|
|
468
|
+
"prod",
|
|
469
|
+
"--name",
|
|
470
|
+
"App",
|
|
471
|
+
"--slug",
|
|
472
|
+
"my-app",
|
|
473
|
+
"--git-repo",
|
|
474
|
+
"https://github.com/o/r",
|
|
475
|
+
"--git-public",
|
|
476
|
+
"--auth",
|
|
477
|
+
"public",
|
|
478
|
+
"--no-deploy",
|
|
479
|
+
],
|
|
480
|
+
store=store,
|
|
481
|
+
data_app_mock=mock,
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
@pytest.mark.parametrize("command", ["_detail", "_create"])
|
|
485
|
+
def test_app_link_is_labelled_by_what_it_opens(self, tmp_path: Path, command: str) -> None:
|
|
486
|
+
result = getattr(self, command)(tmp_path)
|
|
487
|
+
|
|
488
|
+
assert result.exit_code == 0, result.output
|
|
489
|
+
assert f"Open the app: {APP_URL}" in result.output
|
|
490
|
+
assert " URL:" not in result.output
|
|
491
|
+
|
|
492
|
+
@pytest.mark.parametrize("command", ["_detail", "_create"])
|
|
493
|
+
def test_app_link_is_bold_cyan_like_the_device_login_link(
|
|
494
|
+
self, tmp_path: Path, force_colour, command: str
|
|
495
|
+
) -> None:
|
|
496
|
+
result = getattr(self, command)(tmp_path)
|
|
497
|
+
|
|
498
|
+
assert result.exit_code == 0, result.output
|
|
499
|
+
assert f"{BOLD_CYAN}{APP_URL}{RESET}" in result.output
|
|
500
|
+
|
|
501
|
+
|
|
422
502
|
# ---------------------------------------------------------------------------
|
|
423
503
|
# data-app deploy
|
|
424
504
|
# ---------------------------------------------------------------------------
|