keboola-cli 0.76.0__tar.gz → 0.76.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.76.0 → keboola_cli-0.76.1}/PKG-INFO +1 -1
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/pyproject.toml +1 -1
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/changelog.py +11 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/serve.py +50 -3
- keboola_cli-0.76.1/tests/test_serve_banner_encoding.py +252 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/.gitignore +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/CLAUDE.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/CONTRIBUTING.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/Makefile +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/README.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/examples/README.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/examples/storage_tui/README.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/benchmark.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/check_command_sync.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/check_error_codes.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/check_mcp_parity.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/check_wheel_ui.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/debug_linkedby_type.sh +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/gen_command_reference.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/gen_release_notes.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/generate_changelog.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/generate_skill.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/hatch_build.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/lineage_deep.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/post-edit-quality.sh +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/pre-commit +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/sync_version.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/scripts/web-dev.sh +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/__main__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/ai_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/auto_update.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/_core.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/_transfer.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/branches.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/configs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/misc.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/query.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/queue.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/storage_files.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/storage_tables.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/stream.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/tokens.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/client/workspaces.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_helpers.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/agent.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/branch.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/changelog.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/component.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/config.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/context.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/data_app.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/dev_portal.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/docs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/doctor.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/encrypt.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/feature.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/flow.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/http_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/init.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/job.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/kai.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/lineage.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/org.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/permissions.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/project.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/repl.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/schedule.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/search.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/sharing.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/storage.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/stream.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/sync.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/token.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/tool.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/transformation.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/version.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/workspace.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/config_store.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/constants.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/data_science_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/dev_portal_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/errors.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/http_base.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/json_utils.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/lib.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/manage_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/mcp_parity.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/metastore_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/models.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/output.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/permissions.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/py.typed +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/result_models.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/scheduler_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/agent_runner.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/agents_store.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/app.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/auth.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/dependencies.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/pricing.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/agents.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/branches.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/components.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/configs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/docs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/feature.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/flows.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/health.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/kai.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/mcp.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/members.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/org.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/projects.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/search.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/storage.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/stream.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/token.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/server/sse.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_encryption.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_models.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/agent_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/base.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/branch_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/component_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/config_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/data_app_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/deep_lineage_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/docs_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/doctor_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/feature_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/flow_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/flow_validation.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/job_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/kai_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/lineage_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/mcp_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/mcp_transport.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/member_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/org_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/project_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/schedule_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/search_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/sharing_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/storage_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/stream_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/sync_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/token_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/transformation_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/variables_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/version_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/services/workspace_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/stream_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/clone.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/config_format.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/git_utils.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/manifest.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/naming.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/secrets.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/sync/sql_split.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/__init__.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/conftest.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/helpers.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agent_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agent_prompt.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agent_prompt_helper.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agent_runner.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agent_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_agents_store_events.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_ai_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_auto_update.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_base_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_branch_metadata_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_branch_metadata_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_branch_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_build_hook.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_changelog_check.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_changelog_render.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_check_command_sync.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_choice_enums.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_client_device_enrollment.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_component_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_component_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_component_sync_action.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_create_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_create_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_encryption.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_examples.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_metadata.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_rename.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_rename_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_resolution.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_row_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_row_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_search.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_search_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_set_default_bucket.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_store.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_config_update.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_git_repo.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_plain_env_keys.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_secrets_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_secrets_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_data_app_validate_repo_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_deep_lineage_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_dev_portal_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_dev_portal_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_dev_portal_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_docs_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_doctor_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_e2e.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_e2e_config_dir_mode.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_e2e_lineage_deep.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_encrypt_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_encrypt_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_encryption.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_errors.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_feature_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_feature_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_file_locking.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_flow_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_flow_examples.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_flow_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_flow_validation.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_gen_command_reference.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_gen_release_notes.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_helpers.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_http_base.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_http_client_cmd.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_http_forwarder_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_integration.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_job_idempotency_store.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_json_utils.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_kai_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_kai_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_lib.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_lib_device_enrollment.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_lineage_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_local_ai_chat.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_manage_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_manage_token_bulk.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_manage_token_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_mcp_deprecation_warnings.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_mcp_parity_map.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_mcp_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_mcp_transport.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_member_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_member_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_metastore_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_models.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_normalize_script.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_org_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_output.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_permissions.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_permissions_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_pricing.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_project_edit.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_project_edit_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_project_info_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_project_info_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_repl.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_result_models.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_run_broadcaster.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_schedule_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_schedule_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_scheduler_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_search_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_search_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_semantic_layer_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_semantic_layer_schema.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_semantic_layer_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_serve_conversation_id.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_serve_ui.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_server_router_calls.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_server_smoke.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_services.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sharing_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_skill_frontmatter.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sql_split.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_clone.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_create_table.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_delete.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_describe_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_describe_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_empty_definition.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_export_filters.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_files.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_snapshots.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_swap.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_tables.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_truncate.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_storage_write.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_stream_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_stream_client.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_stream_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_branch_mapping.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_clone.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_code_extraction.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_config_format.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_diff_engine.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_e2e.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_encrypt.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_force_pull_baseline.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_manifest.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_naming.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_plaintext_audit.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_reconcile.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_secrets.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_storage_jobs.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_sync_version_script.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_token_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_token_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_tool_call_permissions.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_transformation_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_transformation_ops.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_variables_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_variables_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_version_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_workspace_cli.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_workspace_gc.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_workspace_service.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/tests/test_workspace_sql_helper.py +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/README.md +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/index.html +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/package-lock.json +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/package.json +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/postcss.config.js +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/App.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/api/client.ts +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/AgentRunView.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/ConfirmModal.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/Drawer.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/Empty.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/JsonView.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/components/Table.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/index.css +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/layout/Shell.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/layout/Sidebar.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/layout/StatusBar.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/layout/TopBar.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/main.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Agents.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Branches.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Changelog.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Components.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Configs.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Dashboard.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/DataApps.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Doctor.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Encrypt.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Flows.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Jobs.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Lineage.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/LocalAi.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Mcp.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Members.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Org.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Projects.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Schedules.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Search.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Sharing.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Storage.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Streams.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/pages/Workspaces.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/state.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/theme.tsx +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/src/types.ts +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/tailwind.config.ts +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/tsconfig.json +0 -0
- {keboola_cli-0.76.0 → keboola_cli-0.76.1}/web/frontend/vite.config.ts +0 -0
|
@@ -24,6 +24,17 @@ 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.76.1": [
|
|
28
|
+
"Fix (#522, #526): `kbagent serve --ui` no longer crashes on startup on Windows "
|
|
29
|
+
"consoles with a non-UTF-8 codepage (cp1250 on Czech/Polish/Hungarian Windows). The "
|
|
30
|
+
"startup banner's box-drawing glyphs (`├─` / `└─`) raised `UnicodeEncodeError` from "
|
|
31
|
+
"`sys.stdout.write` before uvicorn bound the port, so the server never started. They "
|
|
32
|
+
"now degrade to ASCII (`|-` / `` `- ``) when the console can't encode them -- the same "
|
|
33
|
+
"UTF-8/ASCII fallback `install.sh` already uses -- with a belt-and-braces `try/except` "
|
|
34
|
+
"so a cosmetic banner can never abort startup. Modern UTF-8 terminals are unchanged. "
|
|
35
|
+
"The `set PYTHONUTF8=1` workaround is no longer needed. Thanks to @papousek-radan for "
|
|
36
|
+
"the detailed report.",
|
|
37
|
+
],
|
|
27
38
|
"0.76.0": [
|
|
28
39
|
"Change (#520): the ~3,960-LOC `client.py` is split into a `client/` package by "
|
|
29
40
|
"endpoint family (storage tables/files, configs, queue, tokens, branches, stream, "
|
|
@@ -86,6 +86,53 @@ def _autodetect_ui_dist() -> Path | None:
|
|
|
86
86
|
return None
|
|
87
87
|
|
|
88
88
|
|
|
89
|
+
# Box-drawing glyphs used by the startup banner, mapped to ASCII so the banner
|
|
90
|
+
# degrades to `|-` / `` `- `` on a console that can't render Unicode -- the same
|
|
91
|
+
# fallback install.sh uses (Unicode only under a UTF-8 locale, ASCII otherwise).
|
|
92
|
+
_BANNER_ASCII_FALLBACK = str.maketrans({"├": "|", "└": "`", "─": "-"})
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _encode_safe(text: str, encoding: str | None) -> str:
|
|
96
|
+
"""Return ``text`` with box-drawing glyphs stripped to ASCII if unencodable.
|
|
97
|
+
|
|
98
|
+
On Windows with a non-UTF-8 console codepage (cp1250 on Czech/Polish/
|
|
99
|
+
Hungarian locales, and any other legacy single-byte encoding) the ``├─`` /
|
|
100
|
+
``└─`` glyphs in the startup banner cannot be encoded, so ``sys.stdout.write``
|
|
101
|
+
raises ``UnicodeEncodeError`` -- which crashed ``kbagent serve`` before
|
|
102
|
+
uvicorn ever bound the port (issue #522). When ``encoding`` can represent the
|
|
103
|
+
banner we keep the Unicode glyphs; otherwise we transliterate to ASCII.
|
|
104
|
+
|
|
105
|
+
``encoding`` is ``sys.stdout.encoding`` at the call site (``None`` on an
|
|
106
|
+
exotic stream); an unknown codec name (``LookupError``) also degrades to
|
|
107
|
+
ASCII rather than propagating.
|
|
108
|
+
"""
|
|
109
|
+
enc = encoding or "utf-8"
|
|
110
|
+
try:
|
|
111
|
+
text.encode(enc)
|
|
112
|
+
except (UnicodeEncodeError, LookupError):
|
|
113
|
+
return text.translate(_BANNER_ASCII_FALLBACK)
|
|
114
|
+
return text
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _write_banner(text: str) -> None:
|
|
118
|
+
"""Write the startup banner without ever letting a glyph crash startup.
|
|
119
|
+
|
|
120
|
+
Two layers of defense (issue #522): first transliterate to ASCII when
|
|
121
|
+
stdout's encoding can't represent the banner, then wrap the write in a
|
|
122
|
+
belt-and-braces ``try/except`` so even an unforeseen un-encodable character
|
|
123
|
+
re-emits with lossy replacement instead of aborting the server. A degraded
|
|
124
|
+
banner is always better than a server that won't start.
|
|
125
|
+
"""
|
|
126
|
+
encoding = getattr(sys.stdout, "encoding", None)
|
|
127
|
+
safe = _encode_safe(text, encoding)
|
|
128
|
+
try:
|
|
129
|
+
sys.stdout.write(safe)
|
|
130
|
+
except UnicodeEncodeError:
|
|
131
|
+
enc = encoding or "ascii"
|
|
132
|
+
sys.stdout.write(safe.encode(enc, "replace").decode(enc, "replace"))
|
|
133
|
+
sys.stdout.flush()
|
|
134
|
+
|
|
135
|
+
|
|
89
136
|
def serve_command(
|
|
90
137
|
host: str = typer.Option(
|
|
91
138
|
"127.0.0.1",
|
|
@@ -232,7 +279,7 @@ def serve_command(
|
|
|
232
279
|
# UI mode: the user opens the browser directly; there is no BFF to
|
|
233
280
|
# paste the token into. The token is still printed so scripted
|
|
234
281
|
# callers / curl one-liners keep working.
|
|
235
|
-
|
|
282
|
+
banner = (
|
|
236
283
|
"\n"
|
|
237
284
|
" kbagent serve (single-process UI mode)\n"
|
|
238
285
|
f" ├─ open: http://{host}:{port}/\n"
|
|
@@ -252,7 +299,7 @@ def serve_command(
|
|
|
252
299
|
"\n"
|
|
253
300
|
)
|
|
254
301
|
else:
|
|
255
|
-
|
|
302
|
+
banner = (
|
|
256
303
|
"\n"
|
|
257
304
|
" kbagent serve\n"
|
|
258
305
|
f" ├─ host: http://{host}:{port}\n"
|
|
@@ -270,7 +317,7 @@ def serve_command(
|
|
|
270
317
|
f" export KBAGENT_CONVERSATION_ID={conversation_id}\n"
|
|
271
318
|
"\n"
|
|
272
319
|
)
|
|
273
|
-
|
|
320
|
+
_write_banner(banner)
|
|
274
321
|
|
|
275
322
|
uvicorn.run(
|
|
276
323
|
app,
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"""Tests for the encoding-safe startup banner in ``kbagent serve`` (issue #522).
|
|
2
|
+
|
|
3
|
+
On Windows with a non-UTF-8 console codepage (cp1250 on Czech/Polish/Hungarian
|
|
4
|
+
locales, and any legacy single-byte encoding) the box-drawing glyphs ``├─`` /
|
|
5
|
+
``└─`` in the startup banner cannot be encoded. ``sys.stdout.write`` then raises
|
|
6
|
+
``UnicodeEncodeError`` -- and because that happens *before* ``uvicorn.run``, the
|
|
7
|
+
server never binds the port. The banner is cosmetic, so it must degrade to ASCII
|
|
8
|
+
instead of crashing startup.
|
|
9
|
+
|
|
10
|
+
These tests cover the two helpers that implement the fix:
|
|
11
|
+
|
|
12
|
+
* ``_encode_safe(text, encoding)`` -- pure transliteration decision.
|
|
13
|
+
* ``_write_banner(text)`` -- the I/O wrapper with a belt-and-braces fallback.
|
|
14
|
+
|
|
15
|
+
plus an AST-based regression guard that keeps the ASCII fallback table in sync
|
|
16
|
+
with whatever glyphs the live banner literals actually use.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import ast
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
import pytest
|
|
26
|
+
|
|
27
|
+
from keboola_agent_cli.commands import serve
|
|
28
|
+
from keboola_agent_cli.commands.serve import (
|
|
29
|
+
_BANNER_ASCII_FALLBACK,
|
|
30
|
+
_encode_safe,
|
|
31
|
+
_write_banner,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# The exact glyphs the banner uses; cp1250 (and every other legacy single-byte
|
|
35
|
+
# console codepage) cannot encode any of them.
|
|
36
|
+
_BOX_GLYPHS = ("├", "└", "─")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class _Cp1250Stdout:
|
|
40
|
+
"""A stdout stand-in that behaves like a real cp1250 Windows console.
|
|
41
|
+
|
|
42
|
+
Writing a character cp1250 cannot represent raises ``UnicodeEncodeError``,
|
|
43
|
+
exactly as the Windows console does -- so a test that drives ``_write_banner``
|
|
44
|
+
through this object reproduces issue #522 faithfully rather than approximating
|
|
45
|
+
it.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
encoding = "cp1250"
|
|
49
|
+
|
|
50
|
+
def __init__(self) -> None:
|
|
51
|
+
self._chunks: list[str] = []
|
|
52
|
+
|
|
53
|
+
def write(self, s: str) -> int:
|
|
54
|
+
s.encode(self.encoding) # raises UnicodeEncodeError on ├ └ ─
|
|
55
|
+
self._chunks.append(s)
|
|
56
|
+
return len(s)
|
|
57
|
+
|
|
58
|
+
def flush(self) -> None: # pragma: no cover - trivial
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
def getvalue(self) -> str:
|
|
62
|
+
return "".join(self._chunks)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TestFakeConsoleFidelity:
|
|
66
|
+
"""Guard the guard: prove the fake actually reproduces the crash, so the
|
|
67
|
+
passing ``_write_banner`` test below is meaningful and not vacuous."""
|
|
68
|
+
|
|
69
|
+
def test_naive_write_of_glyphs_crashes(self) -> None:
|
|
70
|
+
fake = _Cp1250Stdout()
|
|
71
|
+
with pytest.raises(UnicodeEncodeError):
|
|
72
|
+
fake.write(" ├─ open: http://x\n")
|
|
73
|
+
|
|
74
|
+
def test_plain_ascii_write_is_fine(self) -> None:
|
|
75
|
+
fake = _Cp1250Stdout()
|
|
76
|
+
fake.write(" |- open: http://x\n")
|
|
77
|
+
assert "open" in fake.getvalue()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class TestEncodeSafe:
|
|
81
|
+
def test_utf8_keeps_unicode_glyphs(self) -> None:
|
|
82
|
+
banner = " ├─ open\n └─ token\n"
|
|
83
|
+
# A UTF-8 console can render the glyphs, so nothing is transliterated.
|
|
84
|
+
assert _encode_safe(banner, "utf-8") == banner
|
|
85
|
+
|
|
86
|
+
def test_cp1250_transliterates_to_ascii(self) -> None:
|
|
87
|
+
out = _encode_safe(" ├─ open\n └─ token\n", "cp1250")
|
|
88
|
+
assert out == " |- open\n `- token\n"
|
|
89
|
+
for glyph in _BOX_GLYPHS:
|
|
90
|
+
assert glyph not in out
|
|
91
|
+
|
|
92
|
+
def test_none_encoding_defaults_to_utf8(self) -> None:
|
|
93
|
+
# An exotic stream can report ``encoding is None``; we default to UTF-8
|
|
94
|
+
# (the modern norm) and keep the glyphs rather than needlessly degrading.
|
|
95
|
+
banner = " ├─ open\n"
|
|
96
|
+
assert _encode_safe(banner, None) == banner
|
|
97
|
+
|
|
98
|
+
def test_unknown_codec_degrades_to_ascii(self) -> None:
|
|
99
|
+
# A bogus/unknown codec name raises LookupError from str.encode; that
|
|
100
|
+
# must degrade to ASCII, not propagate.
|
|
101
|
+
out = _encode_safe(" ├─ open\n", "definitely-not-a-codec")
|
|
102
|
+
assert out == " |- open\n"
|
|
103
|
+
|
|
104
|
+
def test_ascii_only_text_is_unchanged_on_cp1250(self) -> None:
|
|
105
|
+
text = " kbagent serve\n token: abc123\n"
|
|
106
|
+
assert _encode_safe(text, "cp1250") == text
|
|
107
|
+
|
|
108
|
+
@pytest.mark.parametrize("encoding", ["cp1250", "cp1252", "latin-1", "ascii"])
|
|
109
|
+
def test_result_is_always_encodable_on_legacy_consoles(self, encoding: str) -> None:
|
|
110
|
+
# Property: whatever legacy single-byte console we target, the result
|
|
111
|
+
# of _encode_safe must round-trip cleanly (no UnicodeEncodeError).
|
|
112
|
+
banner = " ├─ open\n ├─ docs\n └─ token\n"
|
|
113
|
+
_encode_safe(banner, encoding).encode(encoding) # must not raise
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class TestWriteBanner:
|
|
117
|
+
def test_does_not_crash_on_cp1250_and_emits_ascii(
|
|
118
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
119
|
+
) -> None:
|
|
120
|
+
fake = _Cp1250Stdout()
|
|
121
|
+
monkeypatch.setattr(sys, "stdout", fake)
|
|
122
|
+
_write_banner(" ├─ open: http://127.0.0.1:8001/\n └─ token: secret\n")
|
|
123
|
+
out = fake.getvalue()
|
|
124
|
+
assert "|- open" in out
|
|
125
|
+
assert "`- token" in out
|
|
126
|
+
for glyph in _BOX_GLYPHS:
|
|
127
|
+
assert glyph not in out
|
|
128
|
+
|
|
129
|
+
def test_preserves_unicode_on_utf8_console(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
130
|
+
# A real UTF-8 console keeps the glyphs verbatim -- the fix must not
|
|
131
|
+
# degrade output on the common (modern) case. (io.StringIO can't stand
|
|
132
|
+
# in here: it's a slotted C type with no settable ``encoding`` attr.)
|
|
133
|
+
class _Utf8Stdout:
|
|
134
|
+
encoding = "utf-8"
|
|
135
|
+
|
|
136
|
+
def __init__(self) -> None:
|
|
137
|
+
self._chunks: list[str] = []
|
|
138
|
+
|
|
139
|
+
def write(self, s: str) -> int:
|
|
140
|
+
s.encode(self.encoding) # utf-8 encodes everything -> never raises
|
|
141
|
+
self._chunks.append(s)
|
|
142
|
+
return len(s)
|
|
143
|
+
|
|
144
|
+
def flush(self) -> None:
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
def getvalue(self) -> str:
|
|
148
|
+
return "".join(self._chunks)
|
|
149
|
+
|
|
150
|
+
buf = _Utf8Stdout()
|
|
151
|
+
monkeypatch.setattr(sys, "stdout", buf)
|
|
152
|
+
_write_banner(" ├─ open\n └─ token\n")
|
|
153
|
+
assert buf.getvalue() == " ├─ open\n └─ token\n"
|
|
154
|
+
|
|
155
|
+
def test_belt_and_braces_survives_liar_encoding(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
156
|
+
# Pathological stream: claims UTF-8 (so _encode_safe keeps the glyphs)
|
|
157
|
+
# but its write() still rejects them. The try/except must catch the
|
|
158
|
+
# UnicodeEncodeError and re-emit lossily rather than crash startup.
|
|
159
|
+
class _LiarStdout:
|
|
160
|
+
encoding = "utf-8"
|
|
161
|
+
|
|
162
|
+
def __init__(self) -> None:
|
|
163
|
+
self.calls = 0
|
|
164
|
+
self.buf: list[str] = []
|
|
165
|
+
|
|
166
|
+
def write(self, s: str) -> int:
|
|
167
|
+
self.calls += 1
|
|
168
|
+
if self.calls == 1:
|
|
169
|
+
# First (optimistic) write rejects the glyphs.
|
|
170
|
+
raise UnicodeEncodeError("cp1250", s, 0, 1, "mock")
|
|
171
|
+
self.buf.append(s)
|
|
172
|
+
return len(s)
|
|
173
|
+
|
|
174
|
+
def flush(self) -> None:
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
liar = _LiarStdout()
|
|
178
|
+
monkeypatch.setattr(sys, "stdout", liar)
|
|
179
|
+
_write_banner(" ├─ open\n") # must not raise
|
|
180
|
+
assert liar.calls == 2 # optimistic write, then lossy fallback write
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _static_banner_text(node: ast.AST) -> str:
|
|
184
|
+
"""Flatten a str/f-string literal AST node to its static text.
|
|
185
|
+
|
|
186
|
+
``banner = ("...\n" f" ├─ {x}\n" ...)`` parses to a ``Constant`` (pure
|
|
187
|
+
string) or ``JoinedStr`` (f-string). We keep the literal ``Constant`` parts
|
|
188
|
+
(which carry the box glyphs) and drop the ``{expr}`` interpolations, which
|
|
189
|
+
are runtime values with no bearing on the fallback table.
|
|
190
|
+
"""
|
|
191
|
+
if isinstance(node, ast.Constant) and isinstance(node.value, str):
|
|
192
|
+
return node.value
|
|
193
|
+
if isinstance(node, ast.JoinedStr):
|
|
194
|
+
parts = []
|
|
195
|
+
for value in node.values:
|
|
196
|
+
if isinstance(value, ast.Constant) and isinstance(value.value, str):
|
|
197
|
+
parts.append(value.value)
|
|
198
|
+
# FormattedValue ({expr}) contributes only runtime data -> skip.
|
|
199
|
+
return "".join(parts)
|
|
200
|
+
return ""
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _live_banner_literals() -> list[str]:
|
|
204
|
+
"""Extract every ``banner = (...)`` literal from serve_command's source.
|
|
205
|
+
|
|
206
|
+
Parsing the real module (not a copy pasted into the test) means this guard
|
|
207
|
+
tracks whatever glyphs the shipping banner actually uses -- add a new one
|
|
208
|
+
without extending _BANNER_ASCII_FALLBACK and the round-trip below fails.
|
|
209
|
+
"""
|
|
210
|
+
src = Path(serve.__file__).read_text(encoding="utf-8")
|
|
211
|
+
tree = ast.parse(src)
|
|
212
|
+
fn = next(
|
|
213
|
+
n for n in ast.walk(tree) if isinstance(n, ast.FunctionDef) and n.name == "serve_command"
|
|
214
|
+
)
|
|
215
|
+
literals = [
|
|
216
|
+
_static_banner_text(node.value)
|
|
217
|
+
for node in ast.walk(fn)
|
|
218
|
+
if isinstance(node, ast.Assign)
|
|
219
|
+
and any(isinstance(t, ast.Name) and t.id == "banner" for t in node.targets)
|
|
220
|
+
]
|
|
221
|
+
return [text for text in literals if text]
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class TestLiveBannerRegression:
|
|
225
|
+
"""The fallback table must cover every glyph the real banner emits."""
|
|
226
|
+
|
|
227
|
+
def test_both_banners_were_found(self) -> None:
|
|
228
|
+
# Sanity: serve_command builds two banners (UI and API-only). If a
|
|
229
|
+
# refactor renames the variable, catch it here rather than silently
|
|
230
|
+
# testing nothing.
|
|
231
|
+
literals = _live_banner_literals()
|
|
232
|
+
assert len(literals) == 2, f"expected 2 banner literals, found {len(literals)}"
|
|
233
|
+
|
|
234
|
+
@pytest.mark.parametrize("encoding", ["cp1250", "cp1252", "latin-1"])
|
|
235
|
+
def test_live_banners_survive_legacy_consoles(self, encoding: str) -> None:
|
|
236
|
+
for banner in _live_banner_literals():
|
|
237
|
+
safe = _encode_safe(banner, encoding)
|
|
238
|
+
safe.encode(encoding) # must not raise -> banner can't crash serve
|
|
239
|
+
|
|
240
|
+
def test_every_non_ascii_glyph_is_in_fallback_table(self) -> None:
|
|
241
|
+
# Directly assert the invariant: any non-ASCII character appearing in a
|
|
242
|
+
# live banner literal has an ASCII mapping. This is the actionable
|
|
243
|
+
# failure ("add glyph X to _BANNER_ASCII_FALLBACK") for a future editor.
|
|
244
|
+
# str.maketrans keys the table by code point (int), not by character,
|
|
245
|
+
# so membership is tested with ord(ch).
|
|
246
|
+
for banner in _live_banner_literals():
|
|
247
|
+
for ch in banner:
|
|
248
|
+
if ord(ch) > 127:
|
|
249
|
+
assert ord(ch) in _BANNER_ASCII_FALLBACK, (
|
|
250
|
+
f"banner glyph {ch!r} (U+{ord(ch):04X}) has no ASCII "
|
|
251
|
+
f"fallback; add it to _BANNER_ASCII_FALLBACK in serve.py"
|
|
252
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_data_app_runtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_semantic_layer_crud.py
RENAMED
|
File without changes
|
{keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{keboola_cli-0.76.0 → keboola_cli-0.76.1}/src/keboola_agent_cli/commands/_storage_snapshots.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|