keboola-cli 0.99.0__tar.gz → 0.99.1__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.99.0 → keboola_cli-0.99.1}/PKG-INFO +1 -1
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/pyproject.toml +1 -1
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/file_size_baseline.json +4 -5
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/changelog.py +15 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/commands/_lineage_build_output.py +74 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/commands/_lineage_tree.py +276 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/context.py +10 -2
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/lineage.py +77 -328
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/lineage.py +14 -24
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_lineage_ai.py +447 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_lineage_er.py +182 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_lineage_mermaid.py +244 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_lineage_paths.py +91 -0
- keboola_cli-0.99.1/src/keboola_agent_cli/services/_lineage_trace.py +323 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/deep_lineage_service.py +112 -532
- keboola_cli-0.99.1/tests/test_deep_lineage_ai.py +659 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_deep_lineage_service.py +8 -3
- keboola_cli-0.99.1/tests/test_lineage_view.py +771 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/.gitignore +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/CLAUDE.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/LICENSE +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/Makefile +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/README.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/examples/README.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/formal/sync/README.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/plugins/kbagent/skills/kbagent-cicd-migration/scripts/migrate_cicd.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/plugins/kbagent/skills/kbagent-promotion-pipeline/scripts/generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_file_size.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_release_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_sentinel_guards.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_version_gates.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/gen_endpoint_reference.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/pre-commit +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/sync_version.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/auth_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/device.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/environment.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/pkce.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/sentinel.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/state_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/token_provider.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auth/totp.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/_s3_multipart.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/billing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/editor.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/merge_requests.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/notifications.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/triggers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_config_clone_cmd.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_config_oauth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_config_trash_cmd.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_data_app_password.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_flow_triggers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_merge_request_common.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_merge_request_render.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_merge_request_writes.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_progress.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_project_create.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_project_ref.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_storage_describe.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_storage_jobs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_storage_table_detail.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_storage_tables_render.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_sync_clone_render.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_sync_push_render.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/_url_copy.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/billing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/config_state.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/merge_request.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/notification.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/serve.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/effective_branch.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/frozen_dist.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/project_ref.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/_serve_command_map.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/app.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/route_permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/billing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/merge_requests.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/notifications.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_column_descriptions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_config_clone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_config_set_guard.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_config_trash.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_data_app_bodies.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_data_app_password.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_describe_batch_input.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_fqn.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_storage_downloads.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_storage_jobs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_storage_tables.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_baseline.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_clone_warnings.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_data_app.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_stale.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_workspace.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_table_detail.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_token_last_used.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/_workspace_load_plan.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/auth_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/billing_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/merge_request_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/notification_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/sync_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/table_usage.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/branch_registry.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/branch_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/telemetry.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/update_runner.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/src/keboola_agent_cli/yaml_input.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/__init__.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/conftest.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/helpers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agent_tombstone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_api_call_counts.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_device.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_environment.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_picker.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_pkce.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_register_projects.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_sentinel.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_sentinel_guards.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_state_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auth_totp.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_base_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_billing_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_billing_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_billing_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_branch_registry.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_check_file_size.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_check_release_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_check_sentinel_guards.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_check_version_gates.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_checkbox_select.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_cli_auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_client_token_events.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_component_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_clone_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_clone_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_search.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_set_guard.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_state.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_trash.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_config_update.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_password.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_e2e.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_e2e_auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_effective_branch.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_encryption.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_errors.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_frozen_dist.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_gen_endpoint_reference.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_generate_promotion_pipeline.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_helpers.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_http_base.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_http_base_auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_integration.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_job_options.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_lib.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_license_consistency.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_mcp_migration_recipe.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_member_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_merge_request_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_merge_request_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_merge_request_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_migrate_cicd.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_notification_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_notification_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_notification_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_org_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_output.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_partial_failure_exit_code.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_pricing.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_create_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_ref.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_project_token_stdin_no_leak.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_release_kbagent_ai_kit_sync.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_repl.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_result_models.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_s3_multipart.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_search_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_semantic_layer_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_semantic_layer_scope_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_serve_banner_encoding.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_serve_telemetry.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_auth.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_project_ref.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_route_permissions.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_services.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sharing_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_import_jobs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_table_definition.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_adopted_files.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_baseline_stamping.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_branch_scope.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_cli_behavior.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_clone_links.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_data_app_type.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_formal_counterexamples.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_pull_companion_files.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_push_encrypt_first.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_push_script_guard.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_sync_workspaces.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_table_usage.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_telemetry.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_token_provider.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_token_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_transfer_progress.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_triggers_client.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_update_runner.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_url_copy.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_version_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/tests/test_yaml_input.py +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/README.md +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/index.html +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/package.json +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/api/client.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/changelogNotes.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/changelogNotes.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/CommandPalette.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/DetailTabs.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/KeyValueGrid.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/PillList.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/RawDetail.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/SessionExpiredBanner.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/components/WhatsNew.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/config/credits.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/config/credits.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/lib/time.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/lib/time.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/JobsAll.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Tokens.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/TokensAll.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/jobsShared.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/storageSel.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/tokensShared.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/pages/tokensShared.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/router.test.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/router.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/useHashSelection.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/src/whatsnew.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.99.0 → keboola_cli-0.99.1}/web/frontend/vite.config.ts +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": "Grandfathered files over their CONTRIBUTING.md hard ceiling, in CODE LINES (see scripts/check_file_size.py). They may only shrink. Regenerate with `make loc-baseline` after a split -- never to silence a file you just grew.",
|
|
3
3
|
"files": {
|
|
4
|
-
"commands/config.py":
|
|
5
|
-
"commands/
|
|
6
|
-
"commands/storage.py": 2221,
|
|
4
|
+
"commands/config.py": 1952,
|
|
5
|
+
"commands/storage.py": 2005,
|
|
7
6
|
"services/data_app_service.py": 1600,
|
|
8
|
-
"services/storage_service.py":
|
|
9
|
-
"services/sync_service.py":
|
|
7
|
+
"services/storage_service.py": 1664,
|
|
8
|
+
"services/sync_service.py": 1641
|
|
10
9
|
}
|
|
11
10
|
}
|
|
@@ -26,6 +26,21 @@ from .constants import CHANGELOG_HEADLINE_MAX_CHARS
|
|
|
26
26
|
|
|
27
27
|
# Ordered newest-first. Each value is a list of brief one-line descriptions.
|
|
28
28
|
CHANGELOG: dict[str, list[str]] = {
|
|
29
|
+
"0.99.1": [
|
|
30
|
+
"Fix (#846, #849): `lineage build --ai` now writes the real path of each code file into "
|
|
31
|
+
"`.lineage_ai_tasks.json`. In a single-project sync every path pointed at a file that "
|
|
32
|
+
"did not exist. The scan also reads each config from its branch directory in the "
|
|
33
|
+
"manifest instead of always `main`, and reads config rows from the config's own folder.",
|
|
34
|
+
"Fix (#847, #849): AI results now add `writes` edges from `outputs`, so tables a Python app "
|
|
35
|
+
"writes through the Storage API get a producer. `external` systems are kept and shown. "
|
|
36
|
+
"Column mappings match the input table exactly. Outputs that cannot be matched, and "
|
|
37
|
+
"results whose code has changed since, are listed in `ai_status` and not applied.",
|
|
38
|
+
"Fix (#848, #849): `lineage show` prints a real tree, with each node under its actual parent. "
|
|
39
|
+
"`--column` follows one column hop by hop and says where its mapping is unknown. Edges "
|
|
40
|
+
"read `reads` / `writes` with an `[AI]` badge. Diagrams always flow left to right, "
|
|
41
|
+
"`-f html` defaults to depth 3, `--columns` now works for diagrams, and the ER view "
|
|
42
|
+
"always lists columns. The server's Both view no longer breaks the ER diagram.",
|
|
43
|
+
],
|
|
29
44
|
"0.99.0": [
|
|
30
45
|
"New (#728): `project add` and `project edit` can take a Storage token without putting "
|
|
31
46
|
"it on the command line. Use `--token-stdin` (a hidden prompt in a terminal, or a pipe), "
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Human-mode ``lineage build`` output for the AI status block (#847).
|
|
2
|
+
|
|
3
|
+
Kept out of ``commands/lineage.py``, which is over its file-size budget.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from rich.markup import escape
|
|
11
|
+
|
|
12
|
+
from ..output import OutputFormatter
|
|
13
|
+
|
|
14
|
+
# Bound the unresolved-outputs / missing-code-file listings in human mode;
|
|
15
|
+
# --json always carries the full lists.
|
|
16
|
+
_MAX_LISTED = 10
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def print_ai_status(formatter: OutputFormatter, ai_status: dict[str, Any]) -> None:
|
|
20
|
+
"""Print what applying AI results and generating AI tasks did."""
|
|
21
|
+
console = formatter.console
|
|
22
|
+
if ai_status.get("ai_results_applied"):
|
|
23
|
+
console.print(
|
|
24
|
+
f"\n AI results applied: {ai_status.get('ai_edges_added', 0)} edges added"
|
|
25
|
+
f" ({ai_status.get('ai_reads_added', 0)} reads,"
|
|
26
|
+
f" {ai_status.get('ai_writes_added', 0)} writes),"
|
|
27
|
+
f" {ai_status.get('ai_columns_merged', 0)} columns merged,"
|
|
28
|
+
f" {ai_status.get('ai_external_added', 0)} external systems"
|
|
29
|
+
)
|
|
30
|
+
if ai_status.get("ai_col_map_skipped"):
|
|
31
|
+
console.print(
|
|
32
|
+
f" Column mappings skipped (input table not matched exactly):"
|
|
33
|
+
f" {ai_status['ai_col_map_skipped']}"
|
|
34
|
+
)
|
|
35
|
+
_print_bounded(
|
|
36
|
+
formatter,
|
|
37
|
+
"AI outputs not resolved to a table",
|
|
38
|
+
[
|
|
39
|
+
f"{u['config_fqn']}: {u['table']} ({u['reason']}"
|
|
40
|
+
+ (f": {', '.join(u['candidates'])}" if u.get("candidates") else "")
|
|
41
|
+
+ ")"
|
|
42
|
+
for u in ai_status.get("ai_outputs_unresolved") or []
|
|
43
|
+
],
|
|
44
|
+
)
|
|
45
|
+
_print_bounded(
|
|
46
|
+
formatter,
|
|
47
|
+
"AI results stale (code changed, not applied)",
|
|
48
|
+
list(ai_status.get("ai_results_stale") or []),
|
|
49
|
+
)
|
|
50
|
+
if ai_status.get("ai_tasks_generated"):
|
|
51
|
+
console.print(
|
|
52
|
+
f"\n [bold]AI tasks generated: {ai_status['ai_tasks_generated']}[/bold]"
|
|
53
|
+
f" (already done: {ai_status.get('ai_already_done', 0)})"
|
|
54
|
+
)
|
|
55
|
+
console.print(f" Task file: {escape(str(ai_status['ai_tasks_file']))}")
|
|
56
|
+
console.print(" Next: let your AI agent process the tasks, then re-run this command.")
|
|
57
|
+
_print_bounded(
|
|
58
|
+
formatter,
|
|
59
|
+
"AI tasks skipped, code file not found",
|
|
60
|
+
[
|
|
61
|
+
f"{m['config_fqn']}: {m['code_file']}"
|
|
62
|
+
for m in ai_status.get("ai_tasks_missing_code_file") or []
|
|
63
|
+
],
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _print_bounded(formatter: OutputFormatter, title: str, lines: list[str]) -> None:
|
|
68
|
+
if not lines:
|
|
69
|
+
return
|
|
70
|
+
formatter.console.print(f"\n [yellow]{title}: {len(lines)}[/yellow]")
|
|
71
|
+
for line in lines[:_MAX_LISTED]:
|
|
72
|
+
formatter.console.print(f" {escape(line)}")
|
|
73
|
+
if len(lines) > _MAX_LISTED:
|
|
74
|
+
formatter.console.print(f" ... and {len(lines) - _MAX_LISTED} more")
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"""Human output for `kbagent lineage show`: text tree, column trace, diagrams (#848).
|
|
2
|
+
|
|
3
|
+
Split out of ``commands/lineage.py`` (over its file-size budget). Rendering
|
|
4
|
+
only -- every traversal decision is made by the service
|
|
5
|
+
(``services/_lineage_trace.py``); this module turns its result into text.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
from collections.abc import Callable, Hashable
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
import typer
|
|
15
|
+
from rich.markup import escape
|
|
16
|
+
|
|
17
|
+
from ..errors import ErrorCode
|
|
18
|
+
from ..output import OutputFormatter
|
|
19
|
+
from ..services._lineage_mermaid import edge_label, is_ai_edge
|
|
20
|
+
from ..services.deep_lineage_service import DeepLineageService, LineageGraph
|
|
21
|
+
|
|
22
|
+
DIAGRAM_FORMATS = ("mermaid", "html", "er")
|
|
23
|
+
|
|
24
|
+
# `-f html` renders a picture; at depth 10 a real project's fan-in renders
|
|
25
|
+
# unreadably small, so html alone defaults shallower (#848). Explicit
|
|
26
|
+
# `--depth` always wins, and `--json` keeps the data default.
|
|
27
|
+
HTML_DEFAULT_DEPTH = 3
|
|
28
|
+
DEFAULT_DEPTH = 10
|
|
29
|
+
|
|
30
|
+
_TERMINAL_TEXT = {
|
|
31
|
+
"column_mapping_unknown": "column mapping unknown beyond this point",
|
|
32
|
+
"ambiguous_output_table": "ambiguous: several output tables carry this column",
|
|
33
|
+
"output_table_unknown": "no output table known to carry this column",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def resolve_depth(depth: int | None, output_format: str, json_mode: bool) -> int:
|
|
38
|
+
"""`--depth` when given, else 3 for a rendered html diagram and 10 otherwise."""
|
|
39
|
+
if depth is not None:
|
|
40
|
+
return depth
|
|
41
|
+
return HTML_DEFAULT_DEPTH if output_format == "html" and not json_mode else DEFAULT_DEPTH
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def node_description(graph: LineageGraph, fqn: str) -> str:
|
|
45
|
+
"""Plain (unescaped) one-line description of a node, type prefix first."""
|
|
46
|
+
if fqn in graph.tables:
|
|
47
|
+
t = graph.tables[fqn]
|
|
48
|
+
return f"[table] {fqn} ({len(t.columns)} cols, {t.rows_count:,} rows)"
|
|
49
|
+
if fqn in graph.configurations:
|
|
50
|
+
c = graph.configurations[fqn]
|
|
51
|
+
return f"[{c.component_type}] {c.project_alias}:{c.config_name} ({c.component_id})"
|
|
52
|
+
return fqn
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _edge_text(edge: dict) -> str:
|
|
56
|
+
"""`reads` / `writes` / `shares`, plus an `[AI]` badge for AI-detected edges."""
|
|
57
|
+
return edge_label(edge) + (" [AI]" if is_ai_edge(edge) else "")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _print(formatter: OutputFormatter, text: str) -> None:
|
|
61
|
+
# soft_wrap: never hard-wrap a tree line -- the indentation is the structure.
|
|
62
|
+
formatter.console.print(text, soft_wrap=True)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _header(
|
|
66
|
+
formatter: OutputFormatter, graph: LineageGraph, result: dict, direction: str, suffix: str = ""
|
|
67
|
+
) -> None:
|
|
68
|
+
label = "Upstream dependencies" if direction == "upstream" else "Downstream dependents"
|
|
69
|
+
desc = escape(node_description(graph, result["node"]))
|
|
70
|
+
_print(formatter, f"\n[bold]{label} of {desc}[/bold]{suffix}\n")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _print_tree(
|
|
74
|
+
formatter: OutputFormatter,
|
|
75
|
+
root: Hashable,
|
|
76
|
+
children: dict[Hashable, list[tuple[dict, Hashable]]],
|
|
77
|
+
max_depth: int,
|
|
78
|
+
render: Callable[[dict, Hashable], str],
|
|
79
|
+
after: Callable[[Hashable, int], None],
|
|
80
|
+
arrow: str,
|
|
81
|
+
detail: Callable[[dict, int], None] | None = None,
|
|
82
|
+
) -> None:
|
|
83
|
+
"""Depth-first print of a real tree: every child under its actual parent.
|
|
84
|
+
|
|
85
|
+
A node already expanded is printed again as a leaf with ``(see above)``
|
|
86
|
+
-- unless this occurrence leaves it MORE depth budget than the earlier
|
|
87
|
+
one had, in which case it is expanded again so nothing within ``depth``
|
|
88
|
+
is hidden behind a back-reference.
|
|
89
|
+
|
|
90
|
+
``detail(edge, level)`` runs under EVERY printed line, back-references
|
|
91
|
+
included: it describes the edge, not the node. ``after(child, level)``
|
|
92
|
+
runs only where the child is expanded: it describes the node.
|
|
93
|
+
"""
|
|
94
|
+
expanded: dict[Hashable, int] = {root: max_depth}
|
|
95
|
+
|
|
96
|
+
def visit(key: Hashable, level: int) -> None:
|
|
97
|
+
for edge, child in children.get(key, []):
|
|
98
|
+
remaining = max_depth - level
|
|
99
|
+
line = f"{' ' * level}{arrow} {render(edge, child)}"
|
|
100
|
+
if expanded.get(child, -1) >= remaining:
|
|
101
|
+
_print(formatter, line + " [dim](see above)[/dim]")
|
|
102
|
+
if detail:
|
|
103
|
+
detail(edge, level)
|
|
104
|
+
continue
|
|
105
|
+
_print(formatter, line)
|
|
106
|
+
if detail:
|
|
107
|
+
detail(edge, level)
|
|
108
|
+
expanded[child] = remaining
|
|
109
|
+
after(child, level + 1)
|
|
110
|
+
if remaining > 0:
|
|
111
|
+
visit(child, level + 1)
|
|
112
|
+
|
|
113
|
+
visit(root, 1)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _children(
|
|
117
|
+
edges: list[dict], direction: str, key: Callable[[dict, str], Hashable]
|
|
118
|
+
) -> dict[Hashable, list[tuple[dict, Hashable]]]:
|
|
119
|
+
"""Index edges by parent: upstream parents are targets, downstream parents sources."""
|
|
120
|
+
upstream = direction == "upstream"
|
|
121
|
+
index: dict[Hashable, list[tuple[dict, Hashable]]] = {}
|
|
122
|
+
for edge in edges:
|
|
123
|
+
parent, child = ("target", "source") if upstream else ("source", "target")
|
|
124
|
+
index.setdefault(key(edge, parent), []).append((edge, key(edge, child)))
|
|
125
|
+
return index
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def print_lineage_tree(
|
|
129
|
+
formatter: OutputFormatter,
|
|
130
|
+
graph: LineageGraph,
|
|
131
|
+
result: dict,
|
|
132
|
+
direction: str,
|
|
133
|
+
show_columns: bool = False,
|
|
134
|
+
depth: int = DEFAULT_DEPTH,
|
|
135
|
+
) -> None:
|
|
136
|
+
"""Print a node's upstream/downstream lineage as a real tree."""
|
|
137
|
+
_header(formatter, graph, result, direction)
|
|
138
|
+
node = result["node"]
|
|
139
|
+
edges = result.get("edges", [])
|
|
140
|
+
cfg = graph.configurations.get(node)
|
|
141
|
+
_print_external(formatter, cfg.external if cfg else [], " ")
|
|
142
|
+
if not edges:
|
|
143
|
+
if not (cfg and cfg.external):
|
|
144
|
+
_print(formatter, " (none found)")
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
def render(edge: dict, child: Hashable) -> str:
|
|
148
|
+
text = f"{escape(_edge_text(edge))} {escape(node_description(graph, str(child)))}"
|
|
149
|
+
cols = edge.get("columns") or []
|
|
150
|
+
if cols and not show_columns:
|
|
151
|
+
more = f"... +{len(cols) - 5}" if len(cols) > 5 else ""
|
|
152
|
+
text += " " + escape(f"[{', '.join(cols[:5])}{more}]")
|
|
153
|
+
return text
|
|
154
|
+
|
|
155
|
+
def detail(edge: dict, level: int) -> None:
|
|
156
|
+
if show_columns:
|
|
157
|
+
_print_edge_columns(formatter, edge, level)
|
|
158
|
+
|
|
159
|
+
def after(child: Hashable, level: int) -> None:
|
|
160
|
+
child_cfg = graph.configurations.get(str(child))
|
|
161
|
+
_print_external(formatter, child_cfg.external if child_cfg else [], " " * (level + 1))
|
|
162
|
+
|
|
163
|
+
max_depth = max([depth, *(e["depth"] for e in edges)])
|
|
164
|
+
arrow = "<-" if direction == "upstream" else "->"
|
|
165
|
+
_print_tree(
|
|
166
|
+
formatter,
|
|
167
|
+
node,
|
|
168
|
+
_children(edges, direction, lambda e, end: e[end]),
|
|
169
|
+
max_depth,
|
|
170
|
+
render,
|
|
171
|
+
after,
|
|
172
|
+
arrow,
|
|
173
|
+
detail,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _print_external(formatter: OutputFormatter, external: list[dict], indent: str) -> None:
|
|
178
|
+
"""One `external: <system> (<op>)` line per AI-recorded external system."""
|
|
179
|
+
for item in external or []:
|
|
180
|
+
system, op = escape(str(item.get("system", ""))), escape(str(item.get("op", "")))
|
|
181
|
+
_print(formatter, f"{indent}external: {system} ({op})")
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _print_edge_columns(formatter: OutputFormatter, edge: dict, level: int) -> None:
|
|
185
|
+
"""`--columns`: list the mapping (or the column list) of THIS edge.
|
|
186
|
+
|
|
187
|
+
Per edge, not per child node: two configs reading the same table each
|
|
188
|
+
get their own mapping under their own occurrence of that table (#849).
|
|
189
|
+
"""
|
|
190
|
+
indent = " " * (level + 1)
|
|
191
|
+
for out_col, src in (edge.get("column_mapping") or {}).items():
|
|
192
|
+
_print(formatter, f"{indent}[dim]{escape(out_col)}[/dim] <- {escape(src)}")
|
|
193
|
+
if not edge.get("column_mapping"):
|
|
194
|
+
cols = edge.get("columns") or []
|
|
195
|
+
for col in cols[:10]:
|
|
196
|
+
_print(formatter, f"{indent}[dim]{escape(col)}[/dim]")
|
|
197
|
+
if len(cols) > 10:
|
|
198
|
+
_print(formatter, f"{indent}[dim]... +{len(cols) - 10} more[/dim]")
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def print_column_trace(
|
|
202
|
+
formatter: OutputFormatter, graph: LineageGraph, result: dict, direction: str
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Print a `--column` trace: one line per hop, terminals marked inline."""
|
|
205
|
+
column = result["column"]
|
|
206
|
+
_header(formatter, graph, result, direction, f" [dim](column: {escape(column)})[/dim]")
|
|
207
|
+
edges = result.get("edges", [])
|
|
208
|
+
terminals: dict[Hashable, list[dict]] = {}
|
|
209
|
+
for terminal in result.get("terminals", []):
|
|
210
|
+
terminals.setdefault((terminal["node"], terminal["column"].lower()), []).append(terminal)
|
|
211
|
+
|
|
212
|
+
def key(edge: dict, end: str) -> tuple[str, str]:
|
|
213
|
+
return edge[end], edge[f"{end}_column"].lower()
|
|
214
|
+
|
|
215
|
+
def render(edge: dict, child: Hashable) -> str:
|
|
216
|
+
end = "source" if direction == "upstream" else "target"
|
|
217
|
+
col = edge[f"{end}_column"]
|
|
218
|
+
return escape(f"{_edge_text(edge)} {node_description(graph, edge[end])} · column {col}")
|
|
219
|
+
|
|
220
|
+
def after(child: Hashable, level: int) -> None:
|
|
221
|
+
for terminal in terminals.get(child, []):
|
|
222
|
+
text = _TERMINAL_TEXT.get(terminal["reason"], terminal["reason"])
|
|
223
|
+
if terminal.get("candidates"):
|
|
224
|
+
text += ": " + ", ".join(terminal["candidates"])
|
|
225
|
+
_print(formatter, f"{' ' * (level + 1)}[yellow]! {escape(text)}[/yellow]")
|
|
226
|
+
|
|
227
|
+
root = (result["node"], column.lower())
|
|
228
|
+
after(root, 0)
|
|
229
|
+
if not edges:
|
|
230
|
+
if not terminals:
|
|
231
|
+
_print(formatter, " (no column lineage found)")
|
|
232
|
+
return
|
|
233
|
+
max_depth = max(e["depth"] for e in edges)
|
|
234
|
+
arrow = "<-" if direction == "upstream" else "->"
|
|
235
|
+
_print_tree(formatter, root, _children(edges, direction, key), max_depth, render, after, arrow)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def output_diagram(
|
|
239
|
+
formatter: OutputFormatter,
|
|
240
|
+
graph: LineageGraph,
|
|
241
|
+
query_result: dict,
|
|
242
|
+
direction: str,
|
|
243
|
+
output_format: str,
|
|
244
|
+
show_columns: bool,
|
|
245
|
+
) -> None:
|
|
246
|
+
"""Render a query result as mermaid, er, or an html file."""
|
|
247
|
+
node_fqn = query_result["node"]
|
|
248
|
+
edges = query_result.get("edges", [])
|
|
249
|
+
warnings: Any = query_result.get("warnings")
|
|
250
|
+
if output_format == "er":
|
|
251
|
+
typer.echo(
|
|
252
|
+
# ER always lists columns; `--columns` only shapes the flowcharts.
|
|
253
|
+
DeepLineageService.render_er_diagram(edges, graph, node_fqn, warnings=warnings)
|
|
254
|
+
)
|
|
255
|
+
return
|
|
256
|
+
code = DeepLineageService.render_mermaid(
|
|
257
|
+
edges, graph, direction, node_fqn, show_columns=show_columns, warnings=warnings
|
|
258
|
+
)
|
|
259
|
+
if output_format == "mermaid":
|
|
260
|
+
typer.echo(code)
|
|
261
|
+
return
|
|
262
|
+
html_content = DeepLineageService.render_html(code, f"Lineage {direction} of {node_fqn}")
|
|
263
|
+
# `--columns` renders a different diagram: its own name, so the two runs
|
|
264
|
+
# do not silently overwrite each other.
|
|
265
|
+
suffix = "_columns" if show_columns else ""
|
|
266
|
+
filename = f"lineage_{direction}_{re.sub(r'[^a-zA-Z0-9_]', '_', node_fqn)}{suffix}.html"
|
|
267
|
+
try:
|
|
268
|
+
with open(filename, "w", encoding="utf-8") as f:
|
|
269
|
+
f.write(html_content)
|
|
270
|
+
except OSError as exc:
|
|
271
|
+
formatter.error(
|
|
272
|
+
message=f"Cannot write HTML file '{filename}': {exc}", error_code=ErrorCode.WRITE_ERROR
|
|
273
|
+
)
|
|
274
|
+
raise typer.Exit(code=1) from None
|
|
275
|
+
if not formatter.json_mode:
|
|
276
|
+
formatter.console.print(f"HTML lineage diagram saved to: {escape(filename)}")
|
|
@@ -1086,14 +1086,22 @@ remain branch-aware because modifying a dev branch is the expected intent.
|
|
|
1086
1086
|
[--format text|mermaid|html|er]
|
|
1087
1087
|
Query upstream/downstream from cached lineage graph (from lineage build).
|
|
1088
1088
|
Node identifiers: full FQN project-alias:bucket_id.table_name or just table_id.
|
|
1089
|
-
|
|
1089
|
+
Text output is a real tree (repeats shown as "(see above)"); edges are
|
|
1090
|
+
labelled reads / writes / shares, "[AI]" = AI-detected. --columns shows
|
|
1091
|
+
column-level mapping. -c COL traces one column of a TABLE hop by hop
|
|
1092
|
+
through mappings recorded by `lineage build --ai` and stops where no
|
|
1093
|
+
mapping is known (JSON: terminals[] with node, column, reason); a config
|
|
1094
|
+
focus, or -c with mermaid/html/er, is a usage error (exit 2). Diagrams are
|
|
1095
|
+
always left-to-right with the queried node highlighted. --depth defaults
|
|
1096
|
+
to 3 for -f html, 10 otherwise.
|
|
1090
1097
|
|
|
1091
1098
|
kbagent lineage info --load PATH
|
|
1092
1099
|
Show what's in a cached lineage graph: projects, tables, most connected nodes.
|
|
1093
1100
|
|
|
1094
1101
|
kbagent lineage server --load PATH [--port N] [--host HOST]
|
|
1095
1102
|
Start interactive lineage browser in the web browser. Sidebar-based node
|
|
1096
|
-
picker with mermaid/ER diagram rendering and export.
|
|
1103
|
+
picker with mermaid/ER diagram rendering and export. "Both" directions is
|
|
1104
|
+
one server-side union rendered once (direction=both).
|
|
1097
1105
|
|
|
1098
1106
|
### Organization Management
|
|
1099
1107
|
|