keboola-cli 0.93.0__tar.gz → 0.93.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.93.0 → keboola_cli-0.93.2}/CLAUDE.md +2 -1
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/PKG-INFO +1 -1
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/pyproject.toml +1 -1
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/changelog.py +24 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/app.py +10 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_clone.py +20 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/clone.py +19 -2
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/telemetry.py +40 -1
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_telemetry.py +88 -5
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_clone.py +85 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_telemetry.py +67 -2
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/.gitignore +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/LICENSE +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/Makefile +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/README.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/examples/README.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/pre-commit +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/sync_version.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/context.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/sync_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/__init__.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/conftest.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/helpers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_base_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_search.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_state.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_config_update.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_encryption.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_errors.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_helpers.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_base.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_integration.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_job_options.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lib.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_member_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_merge_request_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_org_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_output.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_permissions.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_pricing.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_repl.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_result_models.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_search_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_services.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_token_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_version_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/README.md +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/index.html +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/package.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.93.0 → keboola_cli-0.93.2}/web/frontend/vite.config.ts +0 -0
|
@@ -853,6 +853,7 @@ kbagent config new --component-id ID [--name NAME] [--project NAME] [--output-di
|
|
|
853
853
|
# sync: GitOps -- configs as local files. init/pull/push/diff are filesystem-local (no serve REST surface).
|
|
854
854
|
kbagent sync init --project ALIAS [--directory DIR] [--git-branching] [--adopt-existing]
|
|
855
855
|
kbagent sync pull --project ALIAS [--all-projects] [--force] [--theirs] [--dry-run] [--with-samples] [--no-storage] [--no-jobs] [--job-limit N] [--branch ID]
|
|
856
|
+
# `sync pull` auto-inits: if the target directory has no `.keboola/manifest.json`, pull runs `init` first, so a separate `sync init` is NOT needed for a first checkout. `sync pull --project X -d ./dir` on an empty dir writes the manifest and fetches the configs in one step.
|
|
856
857
|
# `sync pull --force` is conflict-aware (since 0.53.0): locally-modified config whose remote is UNCHANGED is preserved (delta stays pushable, never silently re-stamped); a true merge conflict (local AND remote both changed since last pull) aborts (exit 1, SYNC_CONFLICT, --json lists details.conflicts); local-untouched + remote-changed takes remote.
|
|
857
858
|
# `sync pull --theirs` (0.72.0+) is the supported reconcile path for a drifted tree: remote wins everywhere -- overwrites locally-modified configs/rows, restores deleted/missing files, resolves conflicts by taking remote (no abort). Since 0.72.0 plain pull also re-materializes a tracked config whose local dir was deleted (manifest<->disk invariant), so delete-dir-then-pull refetches; config-level isDisabled round-trips as sparse `is_disabled: true` in _config.yml (pull/diff/push).
|
|
858
859
|
kbagent sync status [--directory DIR]
|
|
@@ -873,7 +874,7 @@ kbagent sync push --project ALIAS [--all-projects] [--dry-run] [--force] [--allo
|
|
|
873
874
|
# sync diff/push (0.89.0+, #649): local side read from exactly ONE tree (target branch subtree, else main/); entries tracked on another branch's tree are excluded from the changeset and reported under orphaned[] + summary.orphaned (reasons + reconcile hints); fix with sync pull. Adopt-by-id is branch-aware.
|
|
874
875
|
# Ignored components (since 0.91.0, #689): keboola.mcp-server-tool joins keboola.sandboxes on ALWAYS_IGNORED_COMPONENTS (the MCP server's auto-created empty mcp-workspace-<hex> configs); the manifest field ignoredComponents (.keboola/manifest.json) is now LIVE and unions with the hardcoded set, honored by pull/diff/push. pull drops manifest entries + local dirs for a newly-ignored component, reported with action "ignored" (distinct from "removed" = deleted on remote); diff filters the local side too, so a stale dir for an ignored component can never classify as DELETED -- closes the delete-dir-then-push trap that used to destroy production keboola.mcp-server-tool configs.
|
|
875
876
|
kbagent sync clone --source DIR --target ALIAS --target-dir DIR [--bucket-map FILE] [--variable-values FILE] [--instance-rename FILE] [--dry-run] [--branch ID]
|
|
876
|
-
# `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow task configIds and transformation variable links are remapped reference->ULID by push Phase C/D. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID.
|
|
877
|
+
# `sync clone` (0.63.0+) copies a reference synced tree into a fresh target project + parameterizes it: applies bucket_map / variable_values / instance_rename overrides (JSON/YAML files), then pushes so every config CREATEs fresh -- keboola.flow task configIds and transformation variable links are remapped reference->ULID by push Phase C/D. Idempotent: re-run with an existing --target-dir reports no_changes. Fails fast if the target already contains the reference's configs (clone needs a fresh target). Override files must be flat {id: scalar} mappings (0.89.0+): a nested mapping/list/null value is rejected with CONFIG_ERROR naming the key + actual type, instead of being silently stringified into a bogus ID. `--branch` is optional on a fresh clone. It defaults to the target's production branch, resolved from the API like `sync init`. Pass it only to target a dev branch of the target.
|
|
877
878
|
kbagent sync branch-link --project ALIAS (--branch-id ID | --branch-name NAME) [--directory DIR]
|
|
878
879
|
kbagent sync branch-unlink [--directory DIR]
|
|
879
880
|
kbagent sync branch-status [--directory DIR]
|
|
@@ -24,6 +24,30 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
|
|
|
24
24
|
|
|
25
25
|
# Ordered newest-first. Each value is a list of brief one-line descriptions.
|
|
26
26
|
CHANGELOG: dict[str, list[str]] = {
|
|
27
|
+
"0.93.2": [
|
|
28
|
+
"New (#757): each usage event now also carries the kbagent version and an agent-vs-human "
|
|
29
|
+
"marker for the telemetry team (CLI-12). `params.cliContext` holds the User-Agent "
|
|
30
|
+
"(version + OS/arch/Python) and, when set, the conversation id -- from "
|
|
31
|
+
"`KBAGENT_CONVERSATION_ID` / `--conversation-id` on the CLI, or the `X-Conversation-ID` "
|
|
32
|
+
"header over serve. The id is bounded and cleaned (200 chars, printable only), like "
|
|
33
|
+
"`results.error`, so an oversized value never reaches the project's event log. A "
|
|
34
|
+
"`serve-` prefixed id marks a serve session, not an external agent, so a report reads "
|
|
35
|
+
"the id's shape, not its mere presence.",
|
|
36
|
+
"Note (#748, #749): housekeeping with no user-facing change. A CODEOWNERS file that "
|
|
37
|
+
"auto-requests PR review, and a docs note that `sync pull` auto-inits the manifest (CLI-7).",
|
|
38
|
+
],
|
|
39
|
+
"0.93.1": [
|
|
40
|
+
"Fix (#744): `sync clone` into a fresh (empty) target project now defaults to the "
|
|
41
|
+
"target's production branch, so `--branch` is optional (CLI-5). Before, "
|
|
42
|
+
"`repoint_manifest_project` re-pointed only the project id and left the copied manifest "
|
|
43
|
+
"on the SOURCE project's branch id. `_resolve_branch_id` then used that id, so a clone "
|
|
44
|
+
'with no `--branch` failed with `Branch id "..." does not exists`. The clone path now '
|
|
45
|
+
"resolves the target's default branch from the API (`list_dev_branches` + "
|
|
46
|
+
"`find_default_branch_id`, the same way `sync init` does) and re-points the production "
|
|
47
|
+
"branch onto it. It resolves the branch only when the caller passes no explicit "
|
|
48
|
+
"`--branch`, so an explicit-branch clone makes no extra `list_dev_branches` call. "
|
|
49
|
+
"`--branch` stays an override for a dev branch.",
|
|
50
|
+
],
|
|
27
51
|
"0.93.0": [
|
|
28
52
|
"New (#731): kbagent now posts a best-effort usage event per command, so its usage is "
|
|
29
53
|
"visible in Keboola telemetry like the original Go CLI. Connection stores it as "
|
|
@@ -708,6 +708,15 @@ class _UsageTelemetryMiddleware:
|
|
|
708
708
|
values = parse_qs(scope.get("query_string", b"").decode("latin-1")).get("project")
|
|
709
709
|
project_alias = values[0] if values else None
|
|
710
710
|
|
|
711
|
+
# The caller's X-Conversation-ID (set by kbagent's own clients) rides into
|
|
712
|
+
# params.cliContext so the telemetry reader tells an agent request from a
|
|
713
|
+
# human one; a web-UI request sends no such header and stays unmarked (CLI-12).
|
|
714
|
+
conversation_id: str | None = None
|
|
715
|
+
for key, value in scope.get("headers") or []:
|
|
716
|
+
if key == b"x-conversation-id":
|
|
717
|
+
conversation_id = value.decode("latin-1") or None
|
|
718
|
+
break
|
|
719
|
+
|
|
711
720
|
await asyncio.to_thread(
|
|
712
721
|
telemetry.send_serve_event,
|
|
713
722
|
self._config_store,
|
|
@@ -717,6 +726,7 @@ class _UsageTelemetryMiddleware:
|
|
|
717
726
|
status_code=status_code,
|
|
718
727
|
duration_s=duration_s,
|
|
719
728
|
project_alias=project_alias,
|
|
729
|
+
conversation_id=conversation_id,
|
|
720
730
|
)
|
|
721
731
|
|
|
722
732
|
|
|
@@ -22,11 +22,24 @@ from ..sync.clone import (
|
|
|
22
22
|
repoint_manifest_project,
|
|
23
23
|
)
|
|
24
24
|
from ..sync.manifest import load_manifest, save_manifest
|
|
25
|
+
from .base import find_default_branch_id
|
|
25
26
|
|
|
26
27
|
if TYPE_CHECKING:
|
|
27
28
|
from .sync_service import SyncService
|
|
28
29
|
|
|
29
30
|
|
|
31
|
+
def _target_default_branch_id(service: SyncService, target_project: Any) -> int | None:
|
|
32
|
+
"""Return the target project's default branch id from the API.
|
|
33
|
+
|
|
34
|
+
Mirrors ``sync init`` so a fresh clone re-points the manifest onto the
|
|
35
|
+
target's own production branch instead of reusing the source's (CLI-5).
|
|
36
|
+
"""
|
|
37
|
+
client = service._client_factory(target_project.stack_url, target_project.token)
|
|
38
|
+
with client:
|
|
39
|
+
branches = client.list_dev_branches()
|
|
40
|
+
return find_default_branch_id(branches)
|
|
41
|
+
|
|
42
|
+
|
|
30
43
|
def clone_project(
|
|
31
44
|
service: SyncService,
|
|
32
45
|
source: str | Path,
|
|
@@ -106,10 +119,17 @@ def clone_project(
|
|
|
106
119
|
if not already_cloned:
|
|
107
120
|
copy_reference_tree(source_dir, target_path)
|
|
108
121
|
manifest = load_manifest(target_path)
|
|
122
|
+
# _resolve_branch_id prefers an explicit --branch, so resolve the
|
|
123
|
+
# target's default branch only when branch_override is None (#744).
|
|
109
124
|
repoint_manifest_project(
|
|
110
125
|
manifest,
|
|
111
126
|
project_id=target_project.project_id or 0,
|
|
112
127
|
api_host=urlparse(target_project.stack_url).netloc,
|
|
128
|
+
default_branch_id=(
|
|
129
|
+
_target_default_branch_id(service, target_project)
|
|
130
|
+
if branch_override is None
|
|
131
|
+
else None
|
|
132
|
+
),
|
|
113
133
|
)
|
|
114
134
|
bucket_rewrites = apply_bucket_map(target_path, manifest, bucket_map)
|
|
115
135
|
variable_overrides = apply_variable_values(target_path, manifest, variable_values)
|
|
@@ -63,10 +63,27 @@ def copy_reference_tree(source_dir: Path, target_dir: Path) -> None:
|
|
|
63
63
|
shutil.copytree(source_dir, target_dir)
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def repoint_manifest_project(
|
|
67
|
-
|
|
66
|
+
def repoint_manifest_project(
|
|
67
|
+
manifest: Any,
|
|
68
|
+
*,
|
|
69
|
+
project_id: int,
|
|
70
|
+
api_host: str,
|
|
71
|
+
default_branch_id: int | None = None,
|
|
72
|
+
) -> None:
|
|
73
|
+
"""Re-point the manifest's project block at the clone's target project.
|
|
74
|
+
|
|
75
|
+
When ``default_branch_id`` is given, the production branch id (the first
|
|
76
|
+
manifest branch, which ``_resolve_branch_id`` uses as its fallback) is
|
|
77
|
+
re-pointed onto the target project's default branch too. The copied
|
|
78
|
+
manifest otherwise keeps the SOURCE project's branch id, which does not
|
|
79
|
+
exist in the target; a fresh clone with no explicit ``--branch`` then
|
|
80
|
+
resolves that stale id and diff/push fail with
|
|
81
|
+
``Branch id "..." does not exists`` (CLI-5).
|
|
82
|
+
"""
|
|
68
83
|
manifest.project.id = project_id
|
|
69
84
|
manifest.project.api_host = api_host
|
|
85
|
+
if default_branch_id is not None and manifest.branches:
|
|
86
|
+
manifest.branches[0].id = default_branch_id
|
|
70
87
|
|
|
71
88
|
|
|
72
89
|
def _config_dir(target_dir: Path, branch_map: dict[int, str], branch_id: int, path: str) -> Path:
|
|
@@ -5,6 +5,11 @@ events (``POST /v2/storage/events``), the same mechanism the kbc CLI uses. The
|
|
|
5
5
|
event is stored as ``ext.keboola.cli.`` (CLI) or ``ext.keboola.cli.serve``
|
|
6
6
|
(serve REST API) and stamped server-side with the caller's token + user agent.
|
|
7
7
|
|
|
8
|
+
The event body also carries ``params.cliContext``: the kbagent User-Agent
|
|
9
|
+
(version + OS/arch/Python) and, when set, the conversation id. The events store
|
|
10
|
+
keeps the request body, not the server-stamped envelope, so a downstream reader
|
|
11
|
+
reads the version and an agent-vs-human marker off the event itself (CLI-12).
|
|
12
|
+
|
|
8
13
|
This is telemetry, NOT an audit trail: it is voluntary (the two env vars below
|
|
9
14
|
disable it) and best-effort (a failed or blocked events endpoint never affects
|
|
10
15
|
the command). Mutating operations are recorded server-side by Connection as
|
|
@@ -27,12 +32,14 @@ import typer
|
|
|
27
32
|
from .auth.sentinel import is_session_token
|
|
28
33
|
from .config_store import ConfigStore, resolve_config_dir
|
|
29
34
|
from .constants import (
|
|
35
|
+
ENV_CONVERSATION_ID,
|
|
30
36
|
ENV_DISABLE_TELEMETRY,
|
|
31
37
|
ENV_DO_NOT_TRACK,
|
|
32
38
|
TELEMETRY_COMPONENT_ID,
|
|
33
39
|
TELEMETRY_SERVE_CONFIG_ID,
|
|
34
40
|
TELEMETRY_TIMEOUT,
|
|
35
41
|
)
|
|
42
|
+
from .http_base import build_user_agent
|
|
36
43
|
from .services.base import make_telemetry_client
|
|
37
44
|
from .services.project_service import ProjectService
|
|
38
45
|
|
|
@@ -46,6 +53,13 @@ logger = logging.getLogger(__name__)
|
|
|
46
53
|
# events API's 200 KB cap and avoids dumping large response/state buffers.
|
|
47
54
|
_MAX_ERROR_LEN = 1000
|
|
48
55
|
|
|
56
|
+
# Longest conversation id carried in ``params.cliContext.conversationId``. The id
|
|
57
|
+
# is caller-supplied -- the ``KBAGENT_CONVERSATION_ID`` env var, or (over serve) the
|
|
58
|
+
# request's ``X-Conversation-ID`` header -- so it is bounded and cleaned like
|
|
59
|
+
# ``results.error``: an oversized or control-character value would otherwise bloat the
|
|
60
|
+
# project's event log or push the POST past the events API cap.
|
|
61
|
+
_MAX_CONVERSATION_ID_LEN = 200
|
|
62
|
+
|
|
49
63
|
# Command wrappers that are not a unit of work themselves. ``serve`` posts a
|
|
50
64
|
# per-request event from its middleware; ``repl`` posts a per-line event from its
|
|
51
65
|
# own loop. The outer invocation of each is excluded so it does not add a second,
|
|
@@ -217,6 +231,7 @@ def emit_cli_invocation(
|
|
|
217
231
|
duration_s=duration_s,
|
|
218
232
|
configuration_id=None,
|
|
219
233
|
extra_params=None,
|
|
234
|
+
conversation_id=os.environ.get(ENV_CONVERSATION_ID) or None,
|
|
220
235
|
)
|
|
221
236
|
except Exception as exc:
|
|
222
237
|
logger.debug("usage event failed: %s", exc)
|
|
@@ -232,11 +247,14 @@ def send_serve_event(
|
|
|
232
247
|
status_code: int,
|
|
233
248
|
duration_s: float,
|
|
234
249
|
project_alias: str | None,
|
|
250
|
+
conversation_id: str | None = None,
|
|
235
251
|
) -> None:
|
|
236
252
|
"""Post a usage event for one serve REST request. Never raises.
|
|
237
253
|
|
|
238
254
|
Blocking (builds a sync client + posts), so serve calls this off the event
|
|
239
|
-
loop via a worker thread.
|
|
255
|
+
loop via a worker thread. ``conversation_id`` is the request's own
|
|
256
|
+
``X-Conversation-ID`` (read by the middleware), so an agent-driven request is
|
|
257
|
+
marked and a human web-UI request -- which sends no such header -- is not.
|
|
240
258
|
"""
|
|
241
259
|
try:
|
|
242
260
|
if telemetry_disabled():
|
|
@@ -264,6 +282,7 @@ def send_serve_event(
|
|
|
264
282
|
duration_s=duration_s,
|
|
265
283
|
configuration_id=TELEMETRY_SERVE_CONFIG_ID,
|
|
266
284
|
extra_params={"path": f"{method} {path}"},
|
|
285
|
+
conversation_id=conversation_id,
|
|
267
286
|
)
|
|
268
287
|
except Exception as exc:
|
|
269
288
|
logger.debug("serve usage event failed: %s", exc)
|
|
@@ -289,6 +308,18 @@ def _telemetry_client(config_store: ConfigStore, stack_url: str, token: str) ->
|
|
|
289
308
|
return client, True
|
|
290
309
|
|
|
291
310
|
|
|
311
|
+
def _clean_conversation_id(value: str | None) -> str | None:
|
|
312
|
+
"""Strip control characters and cap the length; None if nothing usable.
|
|
313
|
+
|
|
314
|
+
The id is a caller-supplied token, so it gets the same bound as ``results.error``
|
|
315
|
+
before it enters the event body (see ``_MAX_CONVERSATION_ID_LEN``).
|
|
316
|
+
"""
|
|
317
|
+
if not value:
|
|
318
|
+
return None
|
|
319
|
+
cleaned = "".join(ch for ch in value if ch.isprintable()).strip()
|
|
320
|
+
return cleaned[:_MAX_CONVERSATION_ID_LEN] or None
|
|
321
|
+
|
|
322
|
+
|
|
292
323
|
def _send_event(
|
|
293
324
|
config_store: ConfigStore,
|
|
294
325
|
*,
|
|
@@ -301,10 +332,18 @@ def _send_event(
|
|
|
301
332
|
duration_s: float,
|
|
302
333
|
configuration_id: str | None,
|
|
303
334
|
extra_params: dict[str, Any] | None,
|
|
335
|
+
conversation_id: str | None,
|
|
304
336
|
) -> None:
|
|
305
337
|
params: dict[str, Any] = {"command": command}
|
|
306
338
|
if extra_params:
|
|
307
339
|
params.update(extra_params)
|
|
340
|
+
# KIDS reads the CLI version (auto-update adoption) and an agent-vs-human
|
|
341
|
+
# marker off the stored event body, so both ride in params.cliContext (CLI-12).
|
|
342
|
+
cli_context: dict[str, Any] = {"userAgent": build_user_agent()}
|
|
343
|
+
clean_conversation_id = _clean_conversation_id(conversation_id)
|
|
344
|
+
if clean_conversation_id:
|
|
345
|
+
cli_context["conversationId"] = clean_conversation_id
|
|
346
|
+
params["cliContext"] = cli_context
|
|
308
347
|
results: dict[str, Any] = {}
|
|
309
348
|
if project_id is not None:
|
|
310
349
|
results["projectId"] = project_id
|
|
@@ -45,7 +45,17 @@ def test_serve_logs_a_mutation_with_the_mapped_command(
|
|
|
45
45
|
"""
|
|
46
46
|
captured: list[tuple[str, str | None]] = []
|
|
47
47
|
|
|
48
|
-
def fake_send(
|
|
48
|
+
def fake_send(
|
|
49
|
+
config_store,
|
|
50
|
+
*,
|
|
51
|
+
method,
|
|
52
|
+
path,
|
|
53
|
+
operation,
|
|
54
|
+
status_code,
|
|
55
|
+
duration_s,
|
|
56
|
+
project_alias,
|
|
57
|
+
conversation_id=None,
|
|
58
|
+
):
|
|
49
59
|
captured.append((operation, project_alias))
|
|
50
60
|
|
|
51
61
|
monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
|
|
@@ -68,7 +78,17 @@ def test_unhandled_route_error_is_logged_as_a_failure(
|
|
|
68
78
|
"""
|
|
69
79
|
captured: list[int] = []
|
|
70
80
|
|
|
71
|
-
def fake_send(
|
|
81
|
+
def fake_send(
|
|
82
|
+
config_store,
|
|
83
|
+
*,
|
|
84
|
+
method,
|
|
85
|
+
path,
|
|
86
|
+
operation,
|
|
87
|
+
status_code,
|
|
88
|
+
duration_s,
|
|
89
|
+
project_alias,
|
|
90
|
+
conversation_id=None,
|
|
91
|
+
):
|
|
72
92
|
captured.append(status_code)
|
|
73
93
|
|
|
74
94
|
monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
|
|
@@ -100,7 +120,17 @@ def test_serve_maps_a_path_converter_route(
|
|
|
100
120
|
"""
|
|
101
121
|
captured: list[str] = []
|
|
102
122
|
|
|
103
|
-
def fake_send(
|
|
123
|
+
def fake_send(
|
|
124
|
+
config_store,
|
|
125
|
+
*,
|
|
126
|
+
method,
|
|
127
|
+
path,
|
|
128
|
+
operation,
|
|
129
|
+
status_code,
|
|
130
|
+
duration_s,
|
|
131
|
+
project_alias,
|
|
132
|
+
conversation_id=None,
|
|
133
|
+
):
|
|
104
134
|
captured.append(operation)
|
|
105
135
|
|
|
106
136
|
monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
|
|
@@ -125,7 +155,17 @@ def test_serve_skips_read_requests(tmp_config_dir: Path, monkeypatch: pytest.Mon
|
|
|
125
155
|
"""
|
|
126
156
|
captured: list[tuple[str, str]] = []
|
|
127
157
|
|
|
128
|
-
def fake_send(
|
|
158
|
+
def fake_send(
|
|
159
|
+
config_store,
|
|
160
|
+
*,
|
|
161
|
+
method,
|
|
162
|
+
path,
|
|
163
|
+
operation,
|
|
164
|
+
status_code,
|
|
165
|
+
duration_s,
|
|
166
|
+
project_alias,
|
|
167
|
+
conversation_id=None,
|
|
168
|
+
):
|
|
129
169
|
captured.append((method, operation))
|
|
130
170
|
|
|
131
171
|
monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
|
|
@@ -152,7 +192,17 @@ def test_serve_does_not_wait_for_the_telemetry_post(
|
|
|
152
192
|
"""
|
|
153
193
|
posted = threading.Event()
|
|
154
194
|
|
|
155
|
-
def slow_send(
|
|
195
|
+
def slow_send(
|
|
196
|
+
config_store,
|
|
197
|
+
*,
|
|
198
|
+
method,
|
|
199
|
+
path,
|
|
200
|
+
operation,
|
|
201
|
+
status_code,
|
|
202
|
+
duration_s,
|
|
203
|
+
project_alias,
|
|
204
|
+
conversation_id=None,
|
|
205
|
+
):
|
|
156
206
|
time.sleep(0.3)
|
|
157
207
|
posted.set()
|
|
158
208
|
|
|
@@ -164,3 +214,36 @@ def test_serve_does_not_wait_for_the_telemetry_post(
|
|
|
164
214
|
assert not posted.is_set()
|
|
165
215
|
# ...but the event still fires, off the request path.
|
|
166
216
|
assert posted.wait(2.0)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_serve_passes_the_request_conversation_id(
|
|
220
|
+
tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
|
|
221
|
+
) -> None:
|
|
222
|
+
"""The request's X-Conversation-ID reaches send_serve_event; its absence sends None.
|
|
223
|
+
|
|
224
|
+
That header is the agent-vs-human marker for serve (CLI-12): an agent-driven
|
|
225
|
+
request carries it, a human web-UI request does not.
|
|
226
|
+
"""
|
|
227
|
+
captured: list[str | None] = []
|
|
228
|
+
|
|
229
|
+
def fake_send(
|
|
230
|
+
config_store,
|
|
231
|
+
*,
|
|
232
|
+
method,
|
|
233
|
+
path,
|
|
234
|
+
operation,
|
|
235
|
+
status_code,
|
|
236
|
+
duration_s,
|
|
237
|
+
project_alias,
|
|
238
|
+
conversation_id=None,
|
|
239
|
+
):
|
|
240
|
+
captured.append(conversation_id)
|
|
241
|
+
|
|
242
|
+
monkeypatch.setattr(telemetry, "send_serve_event", fake_send)
|
|
243
|
+
app = create_app(config_dir=str(tmp_config_dir), auth_token="tok")
|
|
244
|
+
with TestClient(app, raise_server_exceptions=False) as client:
|
|
245
|
+
headers = {"Authorization": "Bearer tok"}
|
|
246
|
+
client.post("/jobs/prod/run", headers={**headers, "X-Conversation-ID": "conv-xyz"}, json={})
|
|
247
|
+
client.post("/jobs/prod/run", headers=headers, json={})
|
|
248
|
+
|
|
249
|
+
assert captured == ["conv-xyz", None]
|
|
@@ -85,6 +85,19 @@ class TestCopyAndRepoint:
|
|
|
85
85
|
repoint_manifest_project(m, project_id=999, api_host="other.keboola.com")
|
|
86
86
|
assert m.project.id == 999
|
|
87
87
|
assert m.project.api_host == "other.keboola.com"
|
|
88
|
+
# without a target default branch id the branch id is left as-is
|
|
89
|
+
assert [b.id for b in m.branches] == [0]
|
|
90
|
+
|
|
91
|
+
def test_repoint_manifest_project_remaps_default_branch(self) -> None:
|
|
92
|
+
# CLI-5: given the target's default branch id, the production branch
|
|
93
|
+
# (the fallback branch _resolve_branch_id uses) is re-pointed too, not
|
|
94
|
+
# left on the source project's id.
|
|
95
|
+
m = _manifest([]) # branches = [ManifestBranch(id=0, path="main")]
|
|
96
|
+
repoint_manifest_project(
|
|
97
|
+
m, project_id=999, api_host="other.keboola.com", default_branch_id=52099
|
|
98
|
+
)
|
|
99
|
+
assert m.project.id == 999
|
|
100
|
+
assert [b.id for b in m.branches] == [52099]
|
|
88
101
|
|
|
89
102
|
|
|
90
103
|
class TestBucketMap:
|
|
@@ -448,6 +461,78 @@ class TestCloneProjectOrchestration:
|
|
|
448
461
|
assert load_manifest(target_dir).project.id == 4242
|
|
449
462
|
push_mock.assert_called_once()
|
|
450
463
|
|
|
464
|
+
def test_clone_repoints_branch_to_target_default(
|
|
465
|
+
self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
|
|
466
|
+
) -> None:
|
|
467
|
+
# CLI-5: a fresh clone re-points the manifest branch onto the target's
|
|
468
|
+
# own default branch (from list_dev_branches), so a later diff/push with
|
|
469
|
+
# no --branch does not resolve the source project's branch id -- which
|
|
470
|
+
# does not exist in the target.
|
|
471
|
+
source = tmp_path / "golden"
|
|
472
|
+
_golden_source(source) # source manifest branch id = 0
|
|
473
|
+
target_dir = tmp_path / "clone"
|
|
474
|
+
|
|
475
|
+
client = MagicMock()
|
|
476
|
+
client.list_dev_branches.return_value = [{"id": 52099, "isDefault": True}]
|
|
477
|
+
svc = _service(tmp_config_dir, client)
|
|
478
|
+
monkeypatch.setattr(
|
|
479
|
+
svc,
|
|
480
|
+
"diff",
|
|
481
|
+
MagicMock(
|
|
482
|
+
return_value={
|
|
483
|
+
"changes": [{"change_type": "added", "component_id": "keboola.ex-db"}]
|
|
484
|
+
}
|
|
485
|
+
),
|
|
486
|
+
)
|
|
487
|
+
monkeypatch.setattr(
|
|
488
|
+
svc,
|
|
489
|
+
"push",
|
|
490
|
+
MagicMock(
|
|
491
|
+
return_value={"status": "pushed", "created": 1, "flow_task_remaps": 0, "errors": []}
|
|
492
|
+
),
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
svc.clone_project(source=source, target_alias="target", target_dir=target_dir)
|
|
496
|
+
|
|
497
|
+
from keboola_agent_cli.sync.manifest import load_manifest
|
|
498
|
+
|
|
499
|
+
assert [b.id for b in load_manifest(target_dir).branches] == [52099]
|
|
500
|
+
|
|
501
|
+
def test_clone_with_explicit_branch_skips_default_branch_fetch(
|
|
502
|
+
self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
|
|
503
|
+
) -> None:
|
|
504
|
+
# #744: an explicit --branch wins in _resolve_branch_id, so clone must
|
|
505
|
+
# not spend a list_dev_branches call resolving the target's default.
|
|
506
|
+
source = tmp_path / "golden"
|
|
507
|
+
_golden_source(source)
|
|
508
|
+
client = MagicMock()
|
|
509
|
+
svc = _service(tmp_config_dir, client)
|
|
510
|
+
monkeypatch.setattr(
|
|
511
|
+
svc,
|
|
512
|
+
"diff",
|
|
513
|
+
MagicMock(
|
|
514
|
+
return_value={
|
|
515
|
+
"changes": [{"change_type": "added", "component_id": "keboola.ex-db"}]
|
|
516
|
+
}
|
|
517
|
+
),
|
|
518
|
+
)
|
|
519
|
+
monkeypatch.setattr(
|
|
520
|
+
svc,
|
|
521
|
+
"push",
|
|
522
|
+
MagicMock(
|
|
523
|
+
return_value={"status": "pushed", "created": 1, "flow_task_remaps": 0, "errors": []}
|
|
524
|
+
),
|
|
525
|
+
)
|
|
526
|
+
|
|
527
|
+
svc.clone_project(
|
|
528
|
+
source=source,
|
|
529
|
+
target_alias="target",
|
|
530
|
+
target_dir=tmp_path / "clone",
|
|
531
|
+
branch_override=52099,
|
|
532
|
+
)
|
|
533
|
+
|
|
534
|
+
client.list_dev_branches.assert_not_called()
|
|
535
|
+
|
|
451
536
|
def test_fresh_target_guard_rejects_collision(
|
|
452
537
|
self, tmp_path: Path, tmp_config_dir: Path, monkeypatch: pytest.MonkeyPatch
|
|
453
538
|
) -> None:
|
|
@@ -23,9 +23,15 @@ from keboola_agent_cli.auth.token_provider import reset_provider_registry
|
|
|
23
23
|
_EVENTS_URL = "https://connection.keboola.com/v2/storage/events"
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def test_success_posts_expected_cli_event(
|
|
26
|
+
def test_success_posts_expected_cli_event(
|
|
27
|
+
tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
|
|
28
|
+
) -> None:
|
|
27
29
|
"""A successful command posts one ``ext.keboola.cli.`` event with the command path."""
|
|
28
30
|
telemetry.reset()
|
|
31
|
+
# This test asserts the no-conversation-id branch, so it must own that env var:
|
|
32
|
+
# cli.py sets KBAGENT_CONVERSATION_ID directly on os.environ for --conversation-id,
|
|
33
|
+
# which can leak across tests in one xdist worker.
|
|
34
|
+
monkeypatch.delenv("KBAGENT_CONVERSATION_ID", raising=False)
|
|
29
35
|
setup_single_project(tmp_config_dir) # sole project -> resolves without --project
|
|
30
36
|
httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
|
|
31
37
|
|
|
@@ -42,7 +48,14 @@ def test_success_posts_expected_cli_event(tmp_config_dir: Path, httpx_mock) -> N
|
|
|
42
48
|
assert body["component"] == "keboola.cli"
|
|
43
49
|
assert "configurationId" not in body # CLI -> ext.keboola.cli. (serve adds "serve")
|
|
44
50
|
assert body["type"] == "info"
|
|
45
|
-
assert body["params"]
|
|
51
|
+
assert body["params"]["command"] == "config list"
|
|
52
|
+
# cliContext carries the version (via the User-Agent) into the event body,
|
|
53
|
+
# since the events store keeps the body, not the server-stamped envelope (CLI-12).
|
|
54
|
+
assert body["params"]["cliContext"]["userAgent"].startswith(
|
|
55
|
+
("keboola-cli/", "keboola-agent-cli/")
|
|
56
|
+
)
|
|
57
|
+
# No KBAGENT_CONVERSATION_ID set -> no agent marker (a human invocation).
|
|
58
|
+
assert "conversationId" not in body["params"]["cliContext"]
|
|
46
59
|
assert body["results"]["projectId"] == 258
|
|
47
60
|
assert body["duration"] == 1 # ceil(0.4s)
|
|
48
61
|
# The acting client identifies kbagent to Connection by its User-Agent, which
|
|
@@ -50,6 +63,58 @@ def test_success_posts_expected_cli_event(tmp_config_dir: Path, httpx_mock) -> N
|
|
|
50
63
|
assert requests[0].headers["User-Agent"].startswith(("keboola-cli/", "keboola-agent-cli/"))
|
|
51
64
|
|
|
52
65
|
|
|
66
|
+
def test_conversation_id_marks_an_agent_run(
|
|
67
|
+
tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
|
|
68
|
+
) -> None:
|
|
69
|
+
"""A set KBAGENT_CONVERSATION_ID lands in params.cliContext.conversationId.
|
|
70
|
+
|
|
71
|
+
Presence of the id is the agent-vs-human marker KIDS reads off the event (CLI-12).
|
|
72
|
+
"""
|
|
73
|
+
telemetry.reset()
|
|
74
|
+
setup_single_project(tmp_config_dir)
|
|
75
|
+
monkeypatch.setenv("KBAGENT_CONVERSATION_ID", "conv-abc123")
|
|
76
|
+
httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
|
|
77
|
+
|
|
78
|
+
telemetry.emit_cli_invocation(
|
|
79
|
+
["kbagent", "config", "list", "--config-dir", str(tmp_config_dir)],
|
|
80
|
+
exit_code=0,
|
|
81
|
+
error=None,
|
|
82
|
+
duration_s=0.4,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
body = json.loads(httpx_mock.get_requests()[0].content)
|
|
86
|
+
assert body["params"]["cliContext"]["conversationId"] == "conv-abc123"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_conversation_id_is_bounded_and_stripped(
|
|
90
|
+
tmp_config_dir: Path, httpx_mock, monkeypatch: pytest.MonkeyPatch
|
|
91
|
+
) -> None:
|
|
92
|
+
"""An oversized / control-character conversation id is capped and cleaned (CLI-12).
|
|
93
|
+
|
|
94
|
+
conversationId is copied into the event body like results.error, so it gets the same
|
|
95
|
+
bound: a caller-supplied X-Conversation-ID / env var cannot bloat the project's event
|
|
96
|
+
log or push the POST past the events API size cap.
|
|
97
|
+
"""
|
|
98
|
+
telemetry.reset()
|
|
99
|
+
setup_single_project(tmp_config_dir)
|
|
100
|
+
monkeypatch.setenv("KBAGENT_CONVERSATION_ID", "conv\x07\x1f\x7f-" + "x" * 500)
|
|
101
|
+
httpx_mock.add_response(url=_EVENTS_URL, method="POST", json={"id": "evt-1"})
|
|
102
|
+
|
|
103
|
+
telemetry.emit_cli_invocation(
|
|
104
|
+
["kbagent", "config", "list", "--config-dir", str(tmp_config_dir)],
|
|
105
|
+
exit_code=0,
|
|
106
|
+
error=None,
|
|
107
|
+
duration_s=0.4,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
conv = json.loads(httpx_mock.get_requests()[0].content)["params"]["cliContext"][
|
|
111
|
+
"conversationId"
|
|
112
|
+
]
|
|
113
|
+
assert all(ch.isprintable() for ch in conv) # control chars stripped
|
|
114
|
+
assert conv == "conv-" + "x" * (telemetry._MAX_CONVERSATION_ID_LEN - len("conv-"))
|
|
115
|
+
assert len(conv) == telemetry._MAX_CONVERSATION_ID_LEN
|
|
116
|
+
|
|
117
|
+
|
|
53
118
|
def test_failed_command_reports_error_and_is_best_effort(tmp_config_dir: Path, httpx_mock) -> None:
|
|
54
119
|
"""A failed command posts ``type=error`` + message; a failing endpoint never raises."""
|
|
55
120
|
telemetry.reset()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|