keboola-cli 0.93.2__tar.gz → 0.94.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/CLAUDE.md +69 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/PKG-INFO +1 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/pyproject.toml +1 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_sentinel_guards.py +39 -8
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/ai_client.py +7 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/token_provider.py +14 -2
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/changelog.py +30 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/cli.py +6 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_helpers.py +32 -0
- keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_common.py +334 -0
- keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_render.py +454 -0
- keboola_cli-0.94.0/src/keboola_agent_cli/commands/_merge_request_writes.py +657 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/auth.py +3 -3
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/branch.py +21 -5
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/context.py +98 -24
- keboola_cli-0.94.0/src/keboola_agent_cli/commands/merge_request.py +333 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/sync.py +11 -2
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/transformation.py +4 -23
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/constants.py +5 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/data_science_client.py +7 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/errors.py +8 -10
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/http_base.py +7 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/metastore_client.py +29 -11
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/permissions.py +33 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/scheduler_client.py +9 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/_serve_command_map.py +26 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/app.py +35 -11
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/dependencies.py +3 -0
- keboola_cli-0.94.0/src/keboola_agent_cli/server/routers/merge_requests.py +319 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_auth_registration.py +7 -15
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_clone.py +31 -5
- keboola_cli-0.94.0/src/keboola_agent_cli/services/_sync_data_app.py +195 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_push_ops.py +45 -8
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/base.py +38 -16
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/component_service.py +4 -11
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/config_service.py +11 -12
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/data_app_git_service.py +4 -8
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/data_app_service.py +6 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/docs_service.py +6 -3
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/flow_service.py +11 -21
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/merge_request_service.py +231 -20
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/semantic_layer_service.py +3 -12
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/sharing_service.py +4 -3
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/stream_service.py +8 -11
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/sync_service.py +122 -4
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/stream_client.py +3 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/clone.py +43 -6
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/config_format.py +12 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_sentinel_guards.py +72 -95
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_sentinel_guards.py +34 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e.py +253 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_base_auth.py +88 -30
- keboola_cli-0.94.0/tests/test_merge_request_cli.py +1663 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_merge_request_service.py +337 -7
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_metastore_client.py +100 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_router_calls.py +335 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_cli.py +33 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_clone.py +325 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_config_format.py +40 -0
- keboola_cli-0.94.0/tests/test_sync_data_app_type.py +510 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_storage_jobs.py +224 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_provider.py +25 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/package-lock.json +78 -75
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/package.json +1 -1
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/.gitignore +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/LICENSE +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/Makefile +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/examples/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/file_size_baseline.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/pre-commit +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/sync_version.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/__init__.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/conftest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_base_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_search.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_state.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_config_update.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_encryption.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_errors.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_helpers.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_base.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_integration.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_job_options.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lib.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_member_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_org_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_output.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_pricing.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_repl.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_result_models.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_search_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_services.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_token_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_version_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/README.md +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/index.html +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.93.2 → keboola_cli-0.94.0}/web/frontend/vite.config.ts +0 -0
|
@@ -392,12 +392,14 @@ kbagent auth register-projects [--stack URL|alias] [--all] [--project-id ID ...]
|
|
|
392
392
|
# USER-scoped "programmatic session" (kbc_at_* access token + kbc_rt_* refresh token) stored in
|
|
393
393
|
# auth.json (0600), a sibling of config.json -- config.json's schema and CURRENT_CONFIG_VERSION are
|
|
394
394
|
# unchanged. --register-projects writes each accessible project into config.json with the sentinel
|
|
395
|
-
# token `kbc-session://{project_id}`.
|
|
396
|
-
#
|
|
397
|
-
#
|
|
398
|
-
# (
|
|
399
|
-
#
|
|
400
|
-
#
|
|
395
|
+
# token `kbc-session://{project_id}`. A session now works with nearly every command -- the Storage
|
|
396
|
+
# and Manage client paths plus (added by CLI-13) the Scheduler (flow schedule / schedule-remove),
|
|
397
|
+
# Data Streams (stream), Data Science (data-app), the semantic-layer group, the AI Service, and
|
|
398
|
+
# Storage bucket sharing (sharing share / unshare). `serve` reaches them too, because it delegates to
|
|
399
|
+
# the same already-guarded services (see server/dependencies.py). Only three features still fail fast
|
|
400
|
+
# on a sentinel-token project (AUTH_NOT_SUPPORTED_ON_STACK) naming the static-token fallback: the
|
|
401
|
+
# authoritative list is SESSION_UNSUPPORTED_FEATURES in services/_auth_registration.py, shipped to
|
|
402
|
+
# callers as `session_unsupported_features` in --json -- do not re-derive it by hand. `dev-portal` is NOT on it
|
|
401
403
|
# (it authenticates with its own identity, never a project token). Over `serve`, a session that
|
|
402
404
|
# expires at runtime answers HTTP 401 with
|
|
403
405
|
# error_code SESSION_EXPIRED -- a browser login only completes on the host. Serving session projects
|
|
@@ -737,6 +739,67 @@ kbagent branch metadata-list --project NAME [--branch ID|default]
|
|
|
737
739
|
kbagent branch metadata-get --project NAME --key KEY [--branch ID|default]
|
|
738
740
|
kbagent branch metadata-set --project NAME --key KEY [--text STR | --file PATH | --stdin] [--branch ID|default]
|
|
739
741
|
kbagent branch metadata-delete --project NAME --metadata-id ID [--branch ID|default]
|
|
742
|
+
# branch merge is DEPRECATED (since 0.94.0): it only builds a UI URL and resets the active branch. On a
|
|
743
|
+
# project with `branches-merge-requests` use the merge-request group below; the command keeps working
|
|
744
|
+
# (it also serves projects without the feature) and now carries `deprecation` in --json.
|
|
745
|
+
|
|
746
|
+
# merge-request (since 0.94.0, DMD-1900): the non-SOX Branches 2.0 lifecycle. Hidden alias `mr`. Every
|
|
747
|
+
# command except list/create takes `[--merge-request-id N | --id N] [--branch B]`: omitted, the target is
|
|
748
|
+
# the merge request OF the active branch (`branch use`) -- a branch has at most one MR, ever. Both flags at
|
|
749
|
+
# once -> exit 2. `--project` is single-project (never fans out). Status is the DERIVED state the web UI
|
|
750
|
+
# shows (in_development|in_review|approved|in_merge|merged|closed|rejected), never the raw one.
|
|
751
|
+
kbagent merge-request list [--project A] [--state STATE] # derived (in_development|in_review|approved|in_merge|merged|closed|rejected) or raw (development|published|canceled) states; `--help` lists them
|
|
752
|
+
kbagent merge-request detail [--project A] [--merge-request-id N | --branch B] [--activity-log]
|
|
753
|
+
kbagent merge-request create --title T [--project A] [--branch B] [--description D] [--reviewer-id ID ...] [--external-id X]
|
|
754
|
+
kbagent merge-request update [--project A] [--merge-request-id N | --branch B] [--title T] [--description D] [--reviewer-id ID ...] [--external-id X]
|
|
755
|
+
kbagent merge-request request-review [--project A] [--merge-request-id N | --branch B]
|
|
756
|
+
kbagent merge-request approve [--project A] [--merge-request-id N | --branch B]
|
|
757
|
+
kbagent merge-request request-changes [--project A] [--merge-request-id N | --branch B] [--reason TEXT]
|
|
758
|
+
kbagent merge-request auto-merge --strategy immediately|scheduled|none [--at TS] [--project A] [--merge-request-id N | --branch B] [--yes]
|
|
759
|
+
kbagent merge-request merge [--project A] [--merge-request-id N | --branch B] [--yes]
|
|
760
|
+
kbagent merge-request conflicts [--project A] [--merge-request-id N | --branch B]
|
|
761
|
+
kbagent merge-request diff --component-id C --config-id I [--project A] [--merge-request-id N | --branch B] [--format short|full] [--output PATH]
|
|
762
|
+
kbagent merge-request resolve --component-id C --config-id I (--take ours|theirs|delete | --resolved JSON|@file|-) [--project A] [--merge-request-id N | --branch B] [--change-description TEXT]
|
|
763
|
+
# WHAT IS DESTRUCTIVE -- a property of the COMMAND, never of a flag or of the MR's state, so a policy is
|
|
764
|
+
# evaluated from the command name alone, before any network call. Destructive = anything that moves a
|
|
765
|
+
# merge request toward or into production: `merge` (deletes the source branch, rewrites production),
|
|
766
|
+
# `request-review` (on the non-SOX default of 0 approvals it lands the MR directly in `approved`),
|
|
767
|
+
# `approve` (the last approval is what a merge waits for), `resolve` (removes the blocker a merge waits
|
|
768
|
+
# on) and `auto-merge` (arms a backend scheduler that runs every `approved` MR whose strategy is
|
|
769
|
+
# immediately/scheduled through the same MergeProcessor, on its own, retrying every tick -- a DELAYED
|
|
770
|
+
# PRODUCTION MERGE with `merge` never called; `--strategy none` disarms and rides the same command, same
|
|
771
|
+
# class). Write = shapes the MR without moving it: `create`, `update` (title/description/reviewers/
|
|
772
|
+
# external id -- auto-merge is NOT a field here), `request-changes` (moves it AWAY from approved).
|
|
773
|
+
# So `--deny-destructive` yields an agent that can observe and shape merge requests but never move one.
|
|
774
|
+
# Under --json every destructive command REQUIRES an explicit target (--merge-request-id or --branch),
|
|
775
|
+
# checked before anything is resolved: every destructive kbagent command either prompts or is told its
|
|
776
|
+
# target, and --json has no prompt. In human mode the active-branch fallback stays; `merge` and arming
|
|
777
|
+
# `auto-merge` prompt (--yes skips), the other destructive commands do not. After request-review/
|
|
778
|
+
# approve/resolve on an MR that IS armed, human mode warns that the backend will now merge (read off the
|
|
779
|
+
# write's own result, no extra GET).
|
|
780
|
+
# On a non-SOX project with the default 0 required approvals: `merge` works straight from `development`;
|
|
781
|
+
# `request-review` lands directly in `approved` (in_review is unreachable); `approve` answers 422 in every
|
|
782
|
+
# state. There is NO `close`: `request-changes` by the creator is the UI's cancel and leaves the MR in
|
|
783
|
+
# `development` (the `closed`/`rejected` derivations depend on reviewer status a 0-approval project never
|
|
784
|
+
# populates -- same blind spot as the web UI, DMD-1988). Requesting review with no reviewers selected
|
|
785
|
+
# emails EVERY project member.
|
|
786
|
+
# Conflicts: `conflicts` lists what changed on both sides (isDeleted = the DEV side's flag); `diff`
|
|
787
|
+
# classifies per path (both / only you / only production) and, when a side deleted the config wholesale,
|
|
788
|
+
# recommends the --take; `diff --output FILE` writes `resolution_candidate` (your branch's content, all
|
|
789
|
+
# five keys: name/description/isDisabled/configuration/rows -- rebase REPLACES, a missing key wipes data,
|
|
790
|
+
# the service refuses a partial body) to edit and hand back via `resolve --resolved @FILE`. No `--all`.
|
|
791
|
+
# Errors: a project without the feature answers FEATURE_NOT_ENABLED (exit 5) from every command whose
|
|
792
|
+
# target was resolved implicitly, reads included -- two wordings, missing feature vs SOX project. A
|
|
793
|
+
# scoped Storage token 403s (ACCESS_DENIED) on everything but `list`. `MR_MERGE_CONFLICT` /
|
|
794
|
+
# `MR_NOT_READY_TO_MERGE` (exit 1; the latter retryable) come from the merge 409; a truncated conflict
|
|
795
|
+
# list in the error carries `details.api_error_params_truncated: true` -- run `conflicts` for the full set.
|
|
796
|
+
# `merge` blocks for up to 10 minutes (no --wait/--timeout). Every result may carry `warnings[]`
|
|
797
|
+
# (post-merge cleanup failures, a dropped --change-description on a delete resolution). A merge whose
|
|
798
|
+
# source branch id could not be read carries `cleanup_skipped: true` + `branch_from_id_raw` (the local
|
|
799
|
+
# active-branch reset / sync unlink did NOT run -- key on the flag, not on warning text). On a project
|
|
800
|
+
# where the feature was later switched OFF, `list` rows' `allowed_actions` still recommend writes that
|
|
801
|
+
# will fail FEATURE_NOT_ENABLED (state-derived, feature-blind); `detail` carries `feature_enabled` and
|
|
802
|
+
# its hint-next respects it.
|
|
740
803
|
|
|
741
804
|
kbagent workspace create --project ALIAS [--name NAME] [--backend TYPE] [--ui] [--read-only/--no-read-only]
|
|
742
805
|
kbagent workspace list [--project NAME ...] [--orphaned] [--branch ID] [--qs-compatible]
|
|
@@ -113,7 +113,34 @@ CREDENTIAL_WRITE_ALLOWED = {
|
|
|
113
113
|
# endpoint-family mixins -- every one of them a class that runs that same
|
|
114
114
|
# `__init__` -- outside the check. `KeboolaClient` stays listed because it is the
|
|
115
115
|
# name a reader looks for here; it is already covered as a descendant.
|
|
116
|
-
|
|
116
|
+
#
|
|
117
|
+
# CLI-13: the five service clients below reach their backend over a bearer and
|
|
118
|
+
# dropped `SESSION_AUTH_FEATURE`, so the `http_base.py` runtime guard no longer
|
|
119
|
+
# stops a direct construction from a `kbc-session://` `project.token`. They are
|
|
120
|
+
# built only by `make_session_aware_client_factory` (sentinel-aware); listing
|
|
121
|
+
# them here makes Check 4 guard every OTHER construction site, restoring the net
|
|
122
|
+
# their dropped guard removed.
|
|
123
|
+
PROJECT_CREDENTIAL_CLIENTS = {
|
|
124
|
+
"_CoreClient",
|
|
125
|
+
"KeboolaClient",
|
|
126
|
+
"SchedulerClient",
|
|
127
|
+
"StreamClient",
|
|
128
|
+
"DataScienceClient",
|
|
129
|
+
"MetastoreClient",
|
|
130
|
+
"AiServiceClient",
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# Check 4 exemptions keyed `<file>::<enclosing function>`, each with a reason --
|
|
134
|
+
# a construction that is provably safe even though its own scope is not
|
|
135
|
+
# sentinel-aware. Mirrors `CREDENTIAL_WRITE_ALLOWED` for Check 1.
|
|
136
|
+
PROJECT_CLIENT_CONSTRUCTION_ALLOWED = {
|
|
137
|
+
"client/stream.py::_get_stream_client": (
|
|
138
|
+
"built from the parent client's already-resolved (token, http_auth): a "
|
|
139
|
+
"session parent carries token='' + a BearerAuth hook, a static parent a "
|
|
140
|
+
"real token + no hook, so a raw sentinel can never reach it "
|
|
141
|
+
"(test_http_base_auth.py::test_stream_sub_client_inherits_the_bearer_hook)"
|
|
142
|
+
),
|
|
143
|
+
}
|
|
117
144
|
|
|
118
145
|
# Check 2: clients that reach Storage or Manage over bearer, or authenticate
|
|
119
146
|
# with an identity of their own, and so must NOT be guarded. Anything else must
|
|
@@ -123,6 +150,13 @@ BEARER_CAPABLE_CLIENTS = {
|
|
|
123
150
|
"ManageClient", # Manage: the supported bearer path
|
|
124
151
|
"AuthClient", # talks to the auth service itself, token=""
|
|
125
152
|
"DeveloperPortalClient", # own username/password identity, never a project token
|
|
153
|
+
# CLI-13: these reach their backend over a bearer via
|
|
154
|
+
# make_session_aware_client_factory; the backends accept OAuth tokens.
|
|
155
|
+
"SchedulerClient",
|
|
156
|
+
"StreamClient",
|
|
157
|
+
"DataScienceClient",
|
|
158
|
+
"MetastoreClient",
|
|
159
|
+
"AiServiceClient",
|
|
126
160
|
}
|
|
127
161
|
|
|
128
162
|
# Check 3: guards that describe no user-reachable command surface.
|
|
@@ -133,15 +167,9 @@ FEATURE_EXEMPT_GUARDS = {
|
|
|
133
167
|
# Guard wording -> the substring of the user-facing entry that covers it, so
|
|
134
168
|
# both can read naturally without being byte-identical.
|
|
135
169
|
FEATURE_ALIASES = {
|
|
136
|
-
"The Keboola AI Service": "AI Service",
|
|
137
|
-
"The Scheduler Service": "Scheduler Service",
|
|
138
|
-
"The Metastore Service (semantic layer)": "Metastore Service",
|
|
139
170
|
"semantic-layer token --encrypt": "Metastore Service",
|
|
140
|
-
"The Data Science Service (data apps)": "Data Science Service",
|
|
141
|
-
"The Data Streams Service": "Data Streams Service",
|
|
142
171
|
"The importable SDK Client": "importable SDK",
|
|
143
172
|
"kbagent kai": "kbagent kai",
|
|
144
|
-
"kbagent sharing (master-token path)": "kbagent sharing",
|
|
145
173
|
}
|
|
146
174
|
|
|
147
175
|
|
|
@@ -390,6 +418,7 @@ def _unguarded_project_clients(root: Path = SRC_ROOT) -> list[str]:
|
|
|
390
418
|
# same finding under a different name.
|
|
391
419
|
credential_clients = _descendants_of(root, set(PROJECT_CREDENTIAL_CLIENTS))
|
|
392
420
|
for path in _py_files(root):
|
|
421
|
+
rel = _rel(path, root)
|
|
393
422
|
source = path.read_text(encoding="utf-8")
|
|
394
423
|
tree = ast.parse(source)
|
|
395
424
|
parents = _parent_map(tree)
|
|
@@ -408,7 +437,9 @@ def _unguarded_project_clients(root: Path = SRC_ROOT) -> list[str]:
|
|
|
408
437
|
if _scope_is_sentinel_aware(node, parents, source):
|
|
409
438
|
continue
|
|
410
439
|
scope = _enclosing_function_name(node, parents)
|
|
411
|
-
|
|
440
|
+
if f"{rel}::{scope}" in PROJECT_CLIENT_CONSTRUCTION_ALLOWED:
|
|
441
|
+
continue
|
|
442
|
+
offenders.append(f"{rel}:{node.lineno} (in {scope})")
|
|
412
443
|
return offenders
|
|
413
444
|
|
|
414
445
|
|
|
@@ -12,6 +12,8 @@ import logging
|
|
|
12
12
|
from typing import Any, Self
|
|
13
13
|
from urllib.parse import quote
|
|
14
14
|
|
|
15
|
+
import httpx
|
|
16
|
+
|
|
15
17
|
from .constants import AI_SERVICE_TIMEOUT
|
|
16
18
|
from .http_base import BaseHttpClient
|
|
17
19
|
|
|
@@ -28,19 +30,18 @@ class AiServiceClient(BaseHttpClient):
|
|
|
28
30
|
Inherits _do_request() and _raise_api_error() from BaseHttpClient.
|
|
29
31
|
"""
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def __init__(self, stack_url: str, token: str) -> None:
|
|
33
|
+
def __init__(self, stack_url: str, token: str, *, http_auth: httpx.Auth | None = None) -> None:
|
|
34
34
|
self._stack_url = stack_url.rstrip("/")
|
|
35
35
|
ai_base_url = self._derive_service_url(self._stack_url, "ai")
|
|
36
|
-
headers = {
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
headers: dict[str, str] = {}
|
|
37
|
+
if http_auth is None:
|
|
38
|
+
headers["X-StorageApi-Token"] = token
|
|
39
39
|
super().__init__(
|
|
40
40
|
base_url=ai_base_url,
|
|
41
41
|
token=token,
|
|
42
42
|
headers=headers,
|
|
43
43
|
timeout=AI_SERVICE_TIMEOUT,
|
|
44
|
+
http_auth=http_auth,
|
|
44
45
|
)
|
|
45
46
|
|
|
46
47
|
def __enter__(self) -> Self:
|
|
@@ -461,15 +461,27 @@ class BearerAuth(httpx.Auth):
|
|
|
461
461
|
`(stack_url, token) -> KeboolaClient` factory call sites.
|
|
462
462
|
"""
|
|
463
463
|
|
|
464
|
-
def __init__(
|
|
464
|
+
def __init__(
|
|
465
|
+
self,
|
|
466
|
+
provider: TokenProvider,
|
|
467
|
+
project_id: int | None = None,
|
|
468
|
+
*,
|
|
469
|
+
refresh_on_401: bool = True,
|
|
470
|
+
) -> None:
|
|
465
471
|
self._provider = provider
|
|
466
472
|
self._project_id = project_id
|
|
473
|
+
self._refresh_on_401 = refresh_on_401
|
|
467
474
|
|
|
468
475
|
def auth_flow(self, request: httpx.Request) -> Generator[httpx.Request, httpx.Response, None]:
|
|
469
476
|
token = self._provider.get_access_token()
|
|
470
477
|
self._stamp(request, token)
|
|
471
478
|
response = yield request
|
|
472
|
-
|
|
479
|
+
# A 401 normally means the access token expired mid-flight, so refresh
|
|
480
|
+
# once and retry. `refresh_on_401=False` opts a client out: the metastore
|
|
481
|
+
# answers a VALID non-master token with 401 (its master-token gate), and a
|
|
482
|
+
# refresh cannot fix that -- retrying only burns a refresh-token rotation
|
|
483
|
+
# and can mask MISSING_MASTER_TOKEN behind a bogus SESSION_EXPIRED.
|
|
484
|
+
if response.status_code == 401 and self._refresh_on_401:
|
|
473
485
|
token = self._provider.force_refresh(token)
|
|
474
486
|
self._stamp(request, token)
|
|
475
487
|
yield request
|
|
@@ -24,6 +24,36 @@ 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.94.0": [
|
|
28
|
+
"New (#759): a browser-login session (`auth login`) now works with nearly every command, "
|
|
29
|
+
"not just the Storage and Manage paths (CLI-13). It reaches the Scheduler (`flow schedule` / "
|
|
30
|
+
"`flow schedule-remove`), Data Streams (`stream`), Data Science (`data-app`), the full "
|
|
31
|
+
"`semantic-layer` group, the AI Service (`docs query`, `config new` / `examples`, "
|
|
32
|
+
"`component detail`, `flow new` / `update` / `validate`), and Storage bucket `sharing`. Only "
|
|
33
|
+
"three features still need a static Storage token and fail fast with "
|
|
34
|
+
"`AUTH_NOT_SUPPORTED_ON_STACK`: `kai`, `semantic-layer token --encrypt`, and the importable "
|
|
35
|
+
"SDK (`keboola_agent_cli.Client`). `auth login` and `auth register-projects` print the list "
|
|
36
|
+
"and ship it in `--json` as `session_unsupported_features`.",
|
|
37
|
+
"New (#736): a `merge-request` command group (hidden alias `mr`) drives the Branches 2.0 "
|
|
38
|
+
"merge lifecycle (DMD-1900). It covers create, request-review, approve, auto-merge, merge, "
|
|
39
|
+
"and conflict resolution (`diff` / `resolve`), on a project with the `branches-merge-requests` "
|
|
40
|
+
"feature. Each command targets the merge request of the active branch by default, or "
|
|
41
|
+
"`--merge-request-id N` / `--branch B` to pick one. Commands that move an MR toward production "
|
|
42
|
+
"(`merge`, `request-review`, `approve`, `resolve`, `auto-merge`) are destructive for "
|
|
43
|
+
"`--deny-destructive`. `create` / `update` / `request-changes` are writes. `branch merge` is "
|
|
44
|
+
"now deprecated -- it only built a UI URL and never merged through the API.",
|
|
45
|
+
"Fix (#752): `sync pull` and `sync clone` no longer strip a data app's runtime type when the "
|
|
46
|
+
"Data Science list omits it (CLI-8). The type (`python-js` / `streamlit` / ...) lives only on "
|
|
47
|
+
"the Data Science API, so a cloned or re-pulled app keeps the type it deploys with.",
|
|
48
|
+
"Fix (#753): `sync pull` and `sync clone` now keep each config's UI folder "
|
|
49
|
+
"(`KBC.configuration.folderName`) (CLI-9). Before, both silently dropped it and every config "
|
|
50
|
+
"landed in the tree root, with nothing warning about it.",
|
|
51
|
+
"Note (#764, #729, #730, #733, #734, #750, #751): housekeeping with no user-facing change. "
|
|
52
|
+
"#764 shares one session-aware default Data Science client factory between the sync and "
|
|
53
|
+
"data-app services. It corrects an import that the #752 and #759 combination broke on `main` "
|
|
54
|
+
"before any release. The rest are web UI and backend dependency bumps (fastify, fast-uri, "
|
|
55
|
+
"vitest, browserslist, postcss-selector-parser).",
|
|
56
|
+
],
|
|
27
57
|
"0.93.2": [
|
|
28
58
|
"New (#757): each usage event now also carries the kbagent version and an agent-vs-human "
|
|
29
59
|
"marker for the telemetry team (CLI-12). `params.cliContext` holds the User-Agent "
|
|
@@ -28,6 +28,7 @@ from .commands.init import init_command
|
|
|
28
28
|
from .commands.job import job_app
|
|
29
29
|
from .commands.kai import kai_app
|
|
30
30
|
from .commands.lineage import lineage_app
|
|
31
|
+
from .commands.merge_request import merge_request_app
|
|
31
32
|
from .commands.notification import notification_app
|
|
32
33
|
from .commands.org import org_app
|
|
33
34
|
from .commands.permissions import permissions_app
|
|
@@ -73,6 +74,7 @@ from .services.job_service import JobService
|
|
|
73
74
|
from .services.kai_service import KaiService
|
|
74
75
|
from .services.lineage_service import LineageService
|
|
75
76
|
from .services.member_service import MemberService
|
|
77
|
+
from .services.merge_request_service import MergeRequestService
|
|
76
78
|
from .services.notification_service import NotificationService
|
|
77
79
|
from .services.org_service import OrgService
|
|
78
80
|
from .services.project_service import ProjectService
|
|
@@ -150,6 +152,8 @@ app.add_typer(notification_app, name="notification", rich_help_panel=_FLOWS)
|
|
|
150
152
|
# -- Development --
|
|
151
153
|
_DEV = "Development"
|
|
152
154
|
app.add_typer(branch_app, name="branch", rich_help_panel=_DEV)
|
|
155
|
+
app.add_typer(merge_request_app, name="merge-request", rich_help_panel=_DEV)
|
|
156
|
+
app.add_typer(merge_request_app, name="mr", rich_help_panel=_DEV, hidden=True)
|
|
153
157
|
app.add_typer(workspace_app, name="workspace", rich_help_panel=_DEV)
|
|
154
158
|
app.add_typer(sync_app, name="sync", rich_help_panel=_DEV)
|
|
155
159
|
app.add_typer(encrypt_app, name="encrypt", rich_help_panel=_DEV)
|
|
@@ -310,6 +314,7 @@ def main(
|
|
|
310
314
|
member_service = MemberService(config_store=config_store)
|
|
311
315
|
feature_service = FeatureService(config_store=config_store)
|
|
312
316
|
branch_service = BranchService(config_store=config_store)
|
|
317
|
+
merge_request_service = MergeRequestService(config_store=config_store)
|
|
313
318
|
sharing_service = SharingService(config_store=config_store)
|
|
314
319
|
search_service = SearchService(config_store=config_store)
|
|
315
320
|
snapshot_service = SnapshotService(config_store=config_store)
|
|
@@ -370,6 +375,7 @@ def main(
|
|
|
370
375
|
ctx.obj["member_service"] = member_service
|
|
371
376
|
ctx.obj["feature_service"] = feature_service
|
|
372
377
|
ctx.obj["branch_service"] = branch_service
|
|
378
|
+
ctx.obj["merge_request_service"] = merge_request_service
|
|
373
379
|
ctx.obj["sharing_service"] = sharing_service
|
|
374
380
|
ctx.obj["search_service"] = search_service
|
|
375
381
|
ctx.obj["snapshot_service"] = snapshot_service
|
|
@@ -8,9 +8,11 @@ Provides common patterns used by all CLI commands:
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import getpass
|
|
11
|
+
import json
|
|
11
12
|
import os
|
|
12
13
|
import secrets
|
|
13
14
|
import sys
|
|
15
|
+
from pathlib import Path
|
|
14
16
|
from typing import Any
|
|
15
17
|
|
|
16
18
|
import typer
|
|
@@ -74,6 +76,36 @@ def resolve_manage_token(*, allow_env: bool = False) -> str:
|
|
|
74
76
|
raise typer.Exit(code=2)
|
|
75
77
|
|
|
76
78
|
|
|
79
|
+
def parse_json_arg(raw: str, *, label: str) -> Any:
|
|
80
|
+
"""Parse a ``JSON|@file|-`` argument: inline JSON, ``@path``, or ``-`` for stdin.
|
|
81
|
+
|
|
82
|
+
The house input contract for structured flags (``config update
|
|
83
|
+
--configuration``, ``transformation edit --op``, ``merge-request resolve
|
|
84
|
+
--resolved``). Hoisted from ``transformation.py``'s private copy so the
|
|
85
|
+
merge-request group did not add another; ``config.py`` still carries an
|
|
86
|
+
older dict-only variant (``_parse_json_input``) -- folding it in is a
|
|
87
|
+
follow-up, not this PR.
|
|
88
|
+
|
|
89
|
+
Raises:
|
|
90
|
+
ValueError: On a missing/unreadable file or malformed JSON -- the message
|
|
91
|
+
names ``label`` (the flag) so the caller can print it at exit 2 as-is.
|
|
92
|
+
"""
|
|
93
|
+
try:
|
|
94
|
+
if raw == "-":
|
|
95
|
+
return json.loads(sys.stdin.read())
|
|
96
|
+
if raw.startswith("@"):
|
|
97
|
+
file_path = Path(raw[1:])
|
|
98
|
+
if not file_path.is_file():
|
|
99
|
+
raise ValueError(f"{label}: file not found: {file_path}")
|
|
100
|
+
return json.loads(file_path.read_text(encoding="utf-8"))
|
|
101
|
+
return json.loads(raw)
|
|
102
|
+
except json.JSONDecodeError as exc:
|
|
103
|
+
raise ValueError(f"{label}: invalid JSON: {exc}") from exc
|
|
104
|
+
except OSError as exc:
|
|
105
|
+
# a directory, a permission problem -- a usage error, not a crash
|
|
106
|
+
raise ValueError(f"{label}: cannot read file: {exc}") from exc
|
|
107
|
+
|
|
108
|
+
|
|
77
109
|
def read_password_stdin() -> str:
|
|
78
110
|
"""Read a password from stdin.
|
|
79
111
|
|