keboola-cli 0.80.2__tar.gz → 0.80.4__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.
Files changed (479) hide show
  1. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/PKG-INFO +1 -1
  2. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/pyproject.toml +1 -1
  3. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/changelog.py +44 -0
  4. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_reference_data.py +5 -1
  5. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/dev_portal.py +2 -2
  6. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/deep_lineage_service.py +19 -2
  7. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/sync_service.py +1 -1
  8. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/manifest.py +36 -1
  9. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_deep_lineage_service.py +47 -0
  10. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_manifest.py +46 -0
  11. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/.gitignore +0 -0
  12. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/CLAUDE.md +0 -0
  13. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/CONTRIBUTING.md +0 -0
  14. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/LICENSE +0 -0
  15. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/Makefile +0 -0
  16. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/README.md +0 -0
  17. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/examples/README.md +0 -0
  18. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/examples/storage_tui/README.md +0 -0
  19. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/plugins/kbagent/.claude-plugin/CLAUDE.md +0 -0
  20. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/benchmark.py +0 -0
  21. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_command_sync.py +0 -0
  22. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_error_codes.py +0 -0
  23. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_file_size.py +0 -0
  24. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_mcp_parity.py +0 -0
  25. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_sentinel_guards.py +0 -0
  26. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/check_wheel_ui.py +0 -0
  27. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/debug_linkedby_type.sh +0 -0
  28. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/file_size_baseline.json +0 -0
  29. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/gen_command_reference.py +0 -0
  30. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/gen_release_notes.py +0 -0
  31. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/generate_changelog.py +0 -0
  32. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/generate_skill.py +0 -0
  33. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/hatch_build.py +0 -0
  34. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/lineage_deep.py +0 -0
  35. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/post-edit-quality.sh +0 -0
  36. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/pre-commit +0 -0
  37. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/sync_version.py +0 -0
  38. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/scripts/web-dev.sh +0 -0
  39. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/__init__.py +0 -0
  40. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/__main__.py +0 -0
  41. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/ai_client.py +0 -0
  42. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/__init__.py +0 -0
  43. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/auth_client.py +0 -0
  44. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/device.py +0 -0
  45. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/environment.py +0 -0
  46. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/models.py +0 -0
  47. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/pkce.py +0 -0
  48. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/sentinel.py +0 -0
  49. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/state_store.py +0 -0
  50. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auth/token_provider.py +0 -0
  51. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/auto_update.py +0 -0
  52. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/cli.py +0 -0
  53. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/__init__.py +0 -0
  54. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_client.py +0 -0
  55. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_core.py +0 -0
  56. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/_transfer.py +0 -0
  57. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/branches.py +0 -0
  58. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/configs.py +0 -0
  59. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/misc.py +0 -0
  60. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/query.py +0 -0
  61. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/queue.py +0 -0
  62. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/storage_files.py +0 -0
  63. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/storage_tables.py +0 -0
  64. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/stream.py +0 -0
  65. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/tokens.py +0 -0
  66. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/client/workspaces.py +0 -0
  67. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/__init__.py +0 -0
  68. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_auth_picker.py +0 -0
  69. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_checkbox_select.py +0 -0
  70. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_data_app_git.py +0 -0
  71. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_data_app_runtime.py +0 -0
  72. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_helpers.py +0 -0
  73. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_metadata_input.py +0 -0
  74. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_crud.py +0 -0
  75. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_semantic_layer_helpers.py +0 -0
  76. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/_storage_snapshots.py +0 -0
  77. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/agent.py +0 -0
  78. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/auth.py +0 -0
  79. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/branch.py +0 -0
  80. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/changelog.py +0 -0
  81. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/component.py +0 -0
  82. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/config.py +0 -0
  83. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/context.py +0 -0
  84. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/data_app.py +0 -0
  85. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/docs.py +0 -0
  86. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/doctor.py +0 -0
  87. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/encrypt.py +0 -0
  88. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/feature.py +0 -0
  89. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/flow.py +0 -0
  90. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/http_client.py +0 -0
  91. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/init.py +0 -0
  92. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/job.py +0 -0
  93. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/kai.py +0 -0
  94. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/lineage.py +0 -0
  95. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/org.py +0 -0
  96. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/permissions.py +0 -0
  97. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/project.py +0 -0
  98. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/repl.py +0 -0
  99. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/schedule.py +0 -0
  100. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/search.py +0 -0
  101. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/semantic_layer.py +0 -0
  102. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/serve.py +0 -0
  103. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/sharing.py +0 -0
  104. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/storage.py +0 -0
  105. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/stream.py +0 -0
  106. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/sync.py +0 -0
  107. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/token.py +0 -0
  108. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/tool.py +0 -0
  109. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/transformation.py +0 -0
  110. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/version.py +0 -0
  111. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/commands/workspace.py +0 -0
  112. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/config_store.py +0 -0
  113. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/constants.py +0 -0
  114. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/data_science_client.py +0 -0
  115. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/dev_portal_client.py +0 -0
  116. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/errors.py +0 -0
  117. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/frozen_dist.py +0 -0
  118. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/http_base.py +0 -0
  119. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/json_utils.py +0 -0
  120. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/lib.py +0 -0
  121. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/manage_client.py +0 -0
  122. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/mcp_parity.py +0 -0
  123. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/metastore_client.py +0 -0
  124. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/models.py +0 -0
  125. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/output.py +0 -0
  126. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/permissions.py +0 -0
  127. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/py.typed +0 -0
  128. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/__init__.py +0 -0
  129. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/__init__.py +0 -0
  130. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/conditional-flow-schema.json +0 -0
  131. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/conditional_flow_examples.jsonl +0 -0
  132. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/flow-schema.json +0 -0
  133. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/resources/flow/legacy_flow_examples.jsonl +0 -0
  134. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/result_models.py +0 -0
  135. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/scheduler_client.py +0 -0
  136. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/__init__.py +0 -0
  137. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/agent_runner.py +0 -0
  138. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/agents_store.py +0 -0
  139. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/app.py +0 -0
  140. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/auth.py +0 -0
  141. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/dependencies.py +0 -0
  142. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/pricing.py +0 -0
  143. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/__init__.py +0 -0
  144. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/agents.py +0 -0
  145. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/ai_chat.py +0 -0
  146. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/branches.py +0 -0
  147. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/components.py +0 -0
  148. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/configs.py +0 -0
  149. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/data_apps.py +0 -0
  150. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/dev_portal.py +0 -0
  151. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/docs.py +0 -0
  152. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/encrypt.py +0 -0
  153. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/feature.py +0 -0
  154. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/flows.py +0 -0
  155. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/health.py +0 -0
  156. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/jobs.py +0 -0
  157. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/kai.py +0 -0
  158. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/lineage.py +0 -0
  159. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/mcp.py +0 -0
  160. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/members.py +0 -0
  161. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/org.py +0 -0
  162. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/projects.py +0 -0
  163. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/schedules.py +0 -0
  164. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/search.py +0 -0
  165. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/semantic_layer.py +0 -0
  166. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/sharing.py +0 -0
  167. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/storage.py +0 -0
  168. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/stream.py +0 -0
  169. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/token.py +0 -0
  170. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/transformation.py +0 -0
  171. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/routers/workspaces.py +0 -0
  172. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/run_broadcaster.py +0 -0
  173. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/server/sse.py +0 -0
  174. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/__init__.py +0 -0
  175. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_auth_registration.py +0 -0
  176. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_encryption.py +0 -0
  177. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_cascade.py +0 -0
  178. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_crud.py +0 -0
  179. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_internals.py +0 -0
  180. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_lookup.py +0 -0
  181. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_semantic_layer_reference_data.py +0 -0
  182. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_bindings.py +0 -0
  183. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_branch.py +0 -0
  184. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_bulk.py +0 -0
  185. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_clone.py +0 -0
  186. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_models.py +0 -0
  187. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_push_ops.py +0 -0
  188. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_storage.py +0 -0
  189. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_sync_writeback.py +0 -0
  190. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/_transformation_ops.py +0 -0
  191. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/agent_service.py +0 -0
  192. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/auth_service.py +0 -0
  193. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/base.py +0 -0
  194. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/branch_service.py +0 -0
  195. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/component_service.py +0 -0
  196. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/config_service.py +0 -0
  197. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/data_app_git_service.py +0 -0
  198. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/data_app_service.py +0 -0
  199. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/dev_portal_service.py +0 -0
  200. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/docs_service.py +0 -0
  201. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/doctor_service.py +0 -0
  202. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/encrypt_service.py +0 -0
  203. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/feature_service.py +0 -0
  204. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/flow_service.py +0 -0
  205. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/flow_validation.py +0 -0
  206. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/http_forwarder_service.py +0 -0
  207. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/job_idempotency_store.py +0 -0
  208. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/job_service.py +0 -0
  209. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/kai_service.py +0 -0
  210. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/lineage_service.py +0 -0
  211. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/mcp_service.py +0 -0
  212. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/mcp_transport.py +0 -0
  213. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/member_service.py +0 -0
  214. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/org_service.py +0 -0
  215. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/project_service.py +0 -0
  216. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/repo_validate_service.py +0 -0
  217. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/schedule_service.py +0 -0
  218. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/search_service.py +0 -0
  219. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/semantic_layer_service.py +0 -0
  220. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/sharing_service.py +0 -0
  221. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/snapshot_service.py +0 -0
  222. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/storage_service.py +0 -0
  223. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/stream_service.py +0 -0
  224. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/token_service.py +0 -0
  225. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/transformation_service.py +0 -0
  226. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/variables_service.py +0 -0
  227. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/version_service.py +0 -0
  228. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/services/workspace_service.py +0 -0
  229. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/stream_client.py +0 -0
  230. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/__init__.py +0 -0
  231. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/branch_mapping.py +0 -0
  232. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/clone.py +0 -0
  233. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/code_extraction.py +0 -0
  234. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/config_format.py +0 -0
  235. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/diff_engine.py +0 -0
  236. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/git_utils.py +0 -0
  237. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/naming.py +0 -0
  238. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/secrets.py +0 -0
  239. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/sync/sql_split.py +0 -0
  240. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/src/keboola_agent_cli/update_runner.py +0 -0
  241. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/__init__.py +0 -0
  242. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/conftest.py +0 -0
  243. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/helpers.py +0 -0
  244. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_cli.py +0 -0
  245. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_prompt.py +0 -0
  246. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_prompt_helper.py +0 -0
  247. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_runner.py +0 -0
  248. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agent_service.py +0 -0
  249. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_agents_store_events.py +0 -0
  250. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_ai_client.py +0 -0
  251. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_client.py +0 -0
  252. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_device.py +0 -0
  253. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_environment.py +0 -0
  254. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_models.py +0 -0
  255. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_picker.py +0 -0
  256. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_pkce.py +0 -0
  257. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_register_projects.py +0 -0
  258. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_sentinel.py +0 -0
  259. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_sentinel_guards.py +0 -0
  260. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_service.py +0 -0
  261. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auth_state_store.py +0 -0
  262. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_auto_update.py +0 -0
  263. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_base_service.py +0 -0
  264. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_metadata_cli.py +0 -0
  265. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_metadata_service.py +0 -0
  266. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_branch_service.py +0 -0
  267. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_build_hook.py +0 -0
  268. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_changelog_check.py +0 -0
  269. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_changelog_render.py +0 -0
  270. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_command_sync.py +0 -0
  271. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_file_size.py +0 -0
  272. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_check_sentinel_guards.py +0 -0
  273. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_checkbox_select.py +0 -0
  274. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_choice_enums.py +0 -0
  275. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_cli.py +0 -0
  276. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_cli_auth.py +0 -0
  277. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_client.py +0 -0
  278. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_client_device_enrollment.py +0 -0
  279. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_cli.py +0 -0
  280. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_service.py +0 -0
  281. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_component_sync_action.py +0 -0
  282. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_create_cli.py +0 -0
  283. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_create_service.py +0 -0
  284. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_encryption.py +0 -0
  285. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_examples.py +0 -0
  286. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_metadata.py +0 -0
  287. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_rename.py +0 -0
  288. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_rename_cli.py +0 -0
  289. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_resolution.py +0 -0
  290. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_row_cli.py +0 -0
  291. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_row_service.py +0 -0
  292. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_search.py +0 -0
  293. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_search_cli.py +0 -0
  294. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_set_default_bucket.py +0 -0
  295. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_store.py +0 -0
  296. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_config_update.py +0 -0
  297. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_cli.py +0 -0
  298. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_git_repo.py +0 -0
  299. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_plain_env_keys.py +0 -0
  300. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_secrets_cli.py +0 -0
  301. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_secrets_service.py +0 -0
  302. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_service.py +0 -0
  303. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_data_app_validate_repo_service.py +0 -0
  304. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_cli.py +0 -0
  305. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_client.py +0 -0
  306. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_dev_portal_service.py +0 -0
  307. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_docs_cli.py +0 -0
  308. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_doctor_service.py +0 -0
  309. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e.py +0 -0
  310. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_auth.py +0 -0
  311. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_config_dir_mode.py +0 -0
  312. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_e2e_lineage_deep.py +0 -0
  313. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encrypt_cli.py +0 -0
  314. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encrypt_service.py +0 -0
  315. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_encryption.py +0 -0
  316. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_errors.py +0 -0
  317. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_feature_cli.py +0 -0
  318. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_feature_service.py +0 -0
  319. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_file_locking.py +0 -0
  320. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_cli.py +0 -0
  321. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_examples.py +0 -0
  322. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_service.py +0 -0
  323. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_flow_validation.py +0 -0
  324. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_frozen_dist.py +0 -0
  325. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_gen_command_reference.py +0 -0
  326. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_gen_release_notes.py +0 -0
  327. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_helpers.py +0 -0
  328. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_base.py +0 -0
  329. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_base_auth.py +0 -0
  330. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_client_cmd.py +0 -0
  331. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_http_forwarder_service.py +0 -0
  332. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_integration.py +0 -0
  333. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_job_idempotency_store.py +0 -0
  334. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_json_utils.py +0 -0
  335. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_kai_cli.py +0 -0
  336. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_kai_service.py +0 -0
  337. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lib.py +0 -0
  338. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lib_device_enrollment.py +0 -0
  339. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_lineage_service.py +0 -0
  340. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_local_ai_chat.py +0 -0
  341. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_client.py +0 -0
  342. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_token_bulk.py +0 -0
  343. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_manage_token_cli.py +0 -0
  344. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_deprecation_warnings.py +0 -0
  345. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_parity_map.py +0 -0
  346. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_service.py +0 -0
  347. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_mcp_transport.py +0 -0
  348. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_member_cli.py +0 -0
  349. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_member_service.py +0 -0
  350. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_metastore_client.py +0 -0
  351. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_models.py +0 -0
  352. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_normalize_script.py +0 -0
  353. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_org_service.py +0 -0
  354. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_output.py +0 -0
  355. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_permissions.py +0 -0
  356. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_permissions_cli.py +0 -0
  357. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_pricing.py +0 -0
  358. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_edit.py +0 -0
  359. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_edit_cli.py +0 -0
  360. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_info_cli.py +0 -0
  361. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_project_info_service.py +0 -0
  362. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_repl.py +0 -0
  363. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_result_models.py +0 -0
  364. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_run_broadcaster.py +0 -0
  365. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_schedule_cli.py +0 -0
  366. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_schedule_service.py +0 -0
  367. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_scheduler_client.py +0 -0
  368. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_search_cli.py +0 -0
  369. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_search_service.py +0 -0
  370. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_cli.py +0 -0
  371. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_schema.py +0 -0
  372. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_semantic_layer_service.py +0 -0
  373. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_banner_encoding.py +0 -0
  374. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_conversation_id.py +0 -0
  375. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_serve_ui.py +0 -0
  376. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_router_calls.py +0 -0
  377. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_semantic_layer_routes_e2e.py +0 -0
  378. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_server_smoke.py +0 -0
  379. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_services.py +0 -0
  380. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sharing_service.py +0 -0
  381. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_skill_frontmatter.py +0 -0
  382. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sql_split.py +0 -0
  383. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_clone.py +0 -0
  384. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_create_table.py +0 -0
  385. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_delete.py +0 -0
  386. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_describe_cli.py +0 -0
  387. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_describe_service.py +0 -0
  388. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_empty_definition.py +0 -0
  389. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_export_filters.py +0 -0
  390. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_files.py +0 -0
  391. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_snapshots.py +0 -0
  392. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_swap.py +0 -0
  393. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_tables.py +0 -0
  394. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_truncate.py +0 -0
  395. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_storage_write.py +0 -0
  396. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_cli.py +0 -0
  397. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_client.py +0 -0
  398. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_stream_service.py +0 -0
  399. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_branch_mapping.py +0 -0
  400. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_cli.py +0 -0
  401. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_clone.py +0 -0
  402. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_code_extraction.py +0 -0
  403. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_config_format.py +0 -0
  404. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_diff_engine.py +0 -0
  405. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_e2e.py +0 -0
  406. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_encrypt.py +0 -0
  407. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_force_pull_baseline.py +0 -0
  408. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_naming.py +0 -0
  409. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_plaintext_audit.py +0 -0
  410. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_reconcile.py +0 -0
  411. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_secrets.py +0 -0
  412. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_service.py +0 -0
  413. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_storage_jobs.py +0 -0
  414. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_sync_version_script.py +0 -0
  415. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_cli.py +0 -0
  416. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_provider.py +0 -0
  417. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_token_service.py +0 -0
  418. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_tool_call_permissions.py +0 -0
  419. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_transformation_cli.py +0 -0
  420. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_transformation_ops.py +0 -0
  421. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_update_runner.py +0 -0
  422. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_variables_cli.py +0 -0
  423. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_variables_service.py +0 -0
  424. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_version_service.py +0 -0
  425. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_cli.py +0 -0
  426. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_gc.py +0 -0
  427. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_service.py +0 -0
  428. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/tests/test_workspace_sql_helper.py +0 -0
  429. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/README.md +0 -0
  430. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/index.html +0 -0
  431. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/package-lock.json +0 -0
  432. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/package.json +0 -0
  433. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/postcss.config.js +0 -0
  434. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/App.tsx +0 -0
  435. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/api/client.ts +0 -0
  436. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/AgentRunView.tsx +0 -0
  437. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/ConfirmModal.tsx +0 -0
  438. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Drawer.tsx +0 -0
  439. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Empty.tsx +0 -0
  440. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/JsonView.tsx +0 -0
  441. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/ManageTokenModal.tsx +0 -0
  442. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/components/Table.tsx +0 -0
  443. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/index.css +0 -0
  444. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/Shell.tsx +0 -0
  445. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/Sidebar.tsx +0 -0
  446. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/StatusBar.tsx +0 -0
  447. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/layout/TopBar.tsx +0 -0
  448. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/main.tsx +0 -0
  449. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Agents.tsx +0 -0
  450. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Branches.tsx +0 -0
  451. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Changelog.tsx +0 -0
  452. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Components.tsx +0 -0
  453. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Configs.tsx +0 -0
  454. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Dashboard.tsx +0 -0
  455. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/DataApps.tsx +0 -0
  456. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Doctor.tsx +0 -0
  457. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Encrypt.tsx +0 -0
  458. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Flows.tsx +0 -0
  459. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Jobs.tsx +0 -0
  460. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Lineage.tsx +0 -0
  461. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/LocalAi.tsx +0 -0
  462. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Mcp.tsx +0 -0
  463. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Members.tsx +0 -0
  464. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Org.tsx +0 -0
  465. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Projects.tsx +0 -0
  466. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Schedules.tsx +0 -0
  467. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Search.tsx +0 -0
  468. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/SemanticLayer.tsx +0 -0
  469. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/SemanticLayerDialogs.tsx +0 -0
  470. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Sharing.tsx +0 -0
  471. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Storage.tsx +0 -0
  472. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Streams.tsx +0 -0
  473. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/pages/Workspaces.tsx +0 -0
  474. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/state.tsx +0 -0
  475. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/theme.tsx +0 -0
  476. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/src/types.ts +0 -0
  477. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/tailwind.config.ts +0 -0
  478. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/tsconfig.json +0 -0
  479. {keboola_cli-0.80.2 → keboola_cli-0.80.4}/web/frontend/vite.config.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: keboola-cli
3
- Version: 0.80.2
3
+ Version: 0.80.4
4
4
  Summary: AI-friendly CLI for managing Keboola projects
5
5
  Author-email: Keboola <dev@keboola.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "keboola-cli"
3
- version = "0.80.2"
3
+ version = "0.80.4"
4
4
  description = "AI-friendly CLI for managing Keboola projects"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -24,6 +24,50 @@ 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.80.4": [
28
+ "Fix: a sync manifest written on Windows was unusable by everyone else "
29
+ "on the team. `.keboola/manifest.json` is a **tracked** file -- sharing "
30
+ "the synced tree through git is the point of the sync workflow -- but "
31
+ "`sync push --adopt-existing` recorded config paths with the host's "
32
+ "separator, so a Windows machine committed "
33
+ "`extractor\\keboola.ex-http\\name`. The asymmetry is what hid it: "
34
+ "`Path()` on Windows accepts forward slashes, so POSIX-written "
35
+ "manifests work everywhere, while on POSIX a backslash path is a single "
36
+ "filename that matches nothing. Paths are now written with `as_posix()` "
37
+ "and normalised on load, so a manifest already committed by a Windows "
38
+ "kbagent repairs itself on the next read instead of needing a hand "
39
+ "edit. Found by running the full test suite on Windows rather than by a "
40
+ "report -- see the note below.",
41
+ "Note (tests): this is the first Windows-only defect the project found "
42
+ "itself. The full suite has never run on Windows in CI (only a narrow "
43
+ "slice does), and a real run was 55 failures -- unusable as a gate, so "
44
+ "nobody enabled it, so anything could hide in it. Working through those "
45
+ "failures to make gating possible is what surfaced this one, among "
46
+ "otherwise routine test-portability noise. The remaining failures are "
47
+ "POSIX-only permission assertions and unguarded `fcntl` imports.",
48
+ ],
49
+ "0.80.3": [
50
+ "Fix (#570): `kbagent lineage build` crashed with `UnicodeDecodeError` on "
51
+ "Windows when a transformation's `transform.sql` or `code.py` contained "
52
+ "non-ASCII text -- an accented word in a Czech comment was enough to abort "
53
+ "the whole graph. The reads used `Path.read_text()`, which decodes with "
54
+ "the platform default: cp1250 on a Czech box, where UTF-8's continuation "
55
+ "bytes are undefined. Keboola serves this content as UTF-8, so UTF-8 is "
56
+ "now explicit, which also makes a build reproducible across machines "
57
+ "instead of varying with the host locale. Files that genuinely hold "
58
+ "non-UTF-8 bytes -- a transformation edited locally and saved in the OS "
59
+ 'codepage -- decode with `errors="replace"`: table identifiers are '
60
+ "ASCII, so a mangled comment costs nothing and never costs the graph. The "
61
+ "`PYTHONUTF8=1` workaround is no longer needed. Thanks to "
62
+ "@MichalProchazkaP3 for the report.",
63
+ "Fix (#570): the same unqualified `Path.read_text()` in "
64
+ "`dev-portal create --data` / `patch --value-file` and "
65
+ "`semantic-layer reference-data set --members-file` now reads UTF-8 too. "
66
+ "Those parse their input as data rather than scan it, so they stay "
67
+ "strict: a decode error there is honest and identical on every OS, "
68
+ "whereas the platform default silently produced different results per "
69
+ "machine.",
70
+ ],
27
71
  "0.80.2": [
28
72
  "Fix (#571): the deferred Windows self-update never applied. kbagent has "
29
73
  "not auto-updated on Windows since the deferred path landed in 0.78.0 -- "
@@ -111,7 +111,11 @@ def _print_reference_data_delete_result(console: Console, data: dict) -> None:
111
111
  def _load_members(formatter: Any, members_file: str) -> list[dict]:
112
112
  """Read a JSON array of member objects from a file or ``-`` (stdin)."""
113
113
  try:
114
- raw = sys.stdin.read() if members_file == "-" else Path(members_file).read_text()
114
+ raw = (
115
+ sys.stdin.read()
116
+ if members_file == "-"
117
+ else Path(members_file).read_text(encoding="utf-8")
118
+ )
115
119
  except OSError as exc:
116
120
  formatter.error(
117
121
  message=f"Could not read members file {members_file!r}: {exc}",
@@ -317,7 +317,7 @@ def _load_payload(data: str | None) -> dict:
317
317
  raise typer.BadParameter("--data is required")
318
318
  if data == "-":
319
319
  return json.loads(sys.stdin.read())
320
- return json.loads(Path(data).read_text())
320
+ return json.loads(Path(data).read_text(encoding="utf-8"))
321
321
 
322
322
 
323
323
  def _render_pending(formatter: OutputFormatter, pending: PendingWrite) -> None:
@@ -435,7 +435,7 @@ def patch_cmd(
435
435
  payload = _load_payload(data)
436
436
  elif property_:
437
437
  if value_file:
438
- raw = Path(value_file).read_text()
438
+ raw = Path(value_file).read_text(encoding="utf-8")
439
439
  elif value is not None:
440
440
  raw = value
441
441
  else:
@@ -48,6 +48,23 @@ _QUALIFIED_3 = re.compile(r'"KBC_USE4_(\d+)"\s*\.\s*"([^"]+)"\s*\.\s*"([^"]+)"')
48
48
  _QUALIFIED_2 = re.compile(r'"([^"]+)"\s*\.\s*"([^"]+)"')
49
49
 
50
50
 
51
+ def _read_source(path: Path) -> str:
52
+ """Read a transformation's code, whatever bytes the file actually holds.
53
+
54
+ ``Path.read_text()`` decodes with the platform default, which on a Czech or
55
+ Polish Windows box is cp1250 -- so a single accented character in a SQL
56
+ comment aborted the whole lineage build with ``UnicodeDecodeError`` (issue
57
+ #570). Keboola serves this content as UTF-8, so UTF-8 is the right guess
58
+ everywhere, and forcing it also makes a build reproducible across machines.
59
+
60
+ ``errors="replace"`` because the goal here is finding table references: a
61
+ file that genuinely holds non-UTF-8 bytes (a locally-edited transformation
62
+ saved in the OS codepage) should cost a mangled comment, never the entire
63
+ graph. Table identifiers are ASCII, so nothing load-bearing is lost.
64
+ """
65
+ return path.read_text(encoding="utf-8", errors="replace")
66
+
67
+
51
68
  def extract_sql_table_refs(sql: str, project_id: int) -> list[tuple[int, str, str]]:
52
69
  """Extract table references from Snowflake SQL using a state machine.
53
70
 
@@ -632,10 +649,10 @@ class DeepLineageService:
632
649
  code_py = full_path / "code.py"
633
650
 
634
651
  if transform_sql.exists():
635
- code = transform_sql.read_text()
652
+ code = _read_source(transform_sql)
636
653
  code_type = "sql"
637
654
  elif code_py.exists():
638
- code = code_py.read_text()
655
+ code = _read_source(code_py)
639
656
  code_type = "python"
640
657
 
641
658
  # Include config row mappings
@@ -2350,7 +2350,7 @@ class SyncService(BaseService):
2350
2350
  {
2351
2351
  "component_id": keboola_meta.get("component_id", "unknown"),
2352
2352
  "config_id": keboola_meta.get("config_id", ""),
2353
- "path": str(config_dir.relative_to(project_root / branch.path)),
2353
+ "path": config_dir.relative_to(project_root / branch.path).as_posix(),
2354
2354
  }
2355
2355
  )
2356
2356
 
@@ -10,7 +10,7 @@ import json
10
10
  from pathlib import Path
11
11
  from typing import Any
12
12
 
13
- from pydantic import BaseModel, ConfigDict, Field
13
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
14
14
 
15
15
  from ..constants import KEBOOLA_DIR_NAME, MANIFEST_FILENAME, MANIFEST_VERSION
16
16
 
@@ -59,6 +59,26 @@ class ManifestNaming(BaseModel):
59
59
  data_app_config: str = Field(default="app/{component_id}/{config_name}", alias="dataAppConfig")
60
60
 
61
61
 
62
+ def _posix_path(value: str) -> str:
63
+ r"""Normalise a manifest path to forward slashes.
64
+
65
+ The manifest is a **tracked** file -- the point of a sync tree is that a
66
+ team shares it through git -- so its paths must mean the same thing on
67
+ every machine. The asymmetry is what makes this bite: ``Path()`` on Windows
68
+ happily accepts ``a/b``, but on POSIX ``a\b`` is a single filename that
69
+ merely contains a backslash. So a manifest written on Windows silently
70
+ stops resolving for everyone else on the team, while the reverse direction
71
+ works fine and hides the problem.
72
+
73
+ Applied on load as well as on write, so a manifest already committed by a
74
+ Windows kbagent repairs itself on the next read instead of needing a hand
75
+ edit. Component and config names are slugified by :mod:`.naming` long
76
+ before they reach a path, so a backslash here is always a separator and
77
+ never part of a real name.
78
+ """
79
+ return value.replace("\\", "/")
80
+
81
+
62
82
  class ManifestBranch(BaseModel):
63
83
  """A branch entry in the manifest."""
64
84
 
@@ -68,6 +88,11 @@ class ManifestBranch(BaseModel):
68
88
  path: str
69
89
  metadata: dict[str, Any] = Field(default_factory=dict)
70
90
 
91
+ @field_validator("path")
92
+ @classmethod
93
+ def _normalise_path(cls, value: str) -> str:
94
+ return _posix_path(value)
95
+
71
96
 
72
97
  class ManifestConfigRow(BaseModel):
73
98
  """A single configuration row reference.
@@ -85,6 +110,11 @@ class ManifestConfigRow(BaseModel):
85
110
  path: str
86
111
  metadata: dict[str, Any] = Field(default_factory=dict)
87
112
 
113
+ @field_validator("path")
114
+ @classmethod
115
+ def _normalise_path(cls, value: str) -> str:
116
+ return _posix_path(value)
117
+
88
118
 
89
119
  class ManifestConfiguration(BaseModel):
90
120
  """A single configuration reference inside the manifest."""
@@ -98,6 +128,11 @@ class ManifestConfiguration(BaseModel):
98
128
  metadata: dict[str, Any] = Field(default_factory=dict)
99
129
  rows: list[ManifestConfigRow] = Field(default_factory=list)
100
130
 
131
+ @field_validator("path")
132
+ @classmethod
133
+ def _normalise_path(cls, value: str) -> str:
134
+ return _posix_path(value)
135
+
101
136
 
102
137
  # ---------------------------------------------------------------------------
103
138
  # Root manifest
@@ -4,6 +4,7 @@ import json
4
4
  from pathlib import Path
5
5
  from unittest.mock import patch
6
6
 
7
+ import pytest
7
8
  import yaml
8
9
 
9
10
  from keboola_agent_cli.config_store import ConfigStore
@@ -15,6 +16,7 @@ from keboola_agent_cli.services.deep_lineage_service import (
15
16
  Table,
16
17
  _collect_create_targets,
17
18
  _collect_cte_names,
19
+ _read_source,
18
20
  _strip_comments_and_strings,
19
21
  extract_sql_table_refs,
20
22
  )
@@ -939,3 +941,48 @@ class TestRenderErDiagramXssRegression:
939
941
  )
940
942
  assert "<img" not in rendered
941
943
  assert "&lt;img" in rendered
944
+
945
+
946
+ class TestSourceReadsAreUtf8:
947
+ """Transformation code must decode the same on every host (issue #570).
948
+
949
+ `Path.read_text()` uses the platform default encoding. On a Czech or Polish
950
+ Windows box that is cp1250, so one accented character in a SQL comment
951
+ aborted the entire `lineage build` with `UnicodeDecodeError`. These run
952
+ everywhere by driving the decode explicitly rather than by depending on the
953
+ host's locale.
954
+ """
955
+
956
+ def test_utf8_content_survives_a_cp1250_default(
957
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
958
+ ) -> None:
959
+ """The exact reported crash: UTF-8 bytes read on a cp1250 host."""
960
+ sql = tmp_path / "transform.sql"
961
+ # U+0159 encodes to 0xC5 0x99 in UTF-8; 0x99 is undefined in cp1250,
962
+ # which is what raised in the report.
963
+ sql.write_bytes("-- příprava dat\nSELECT 1 FROM t;\n".encode())
964
+
965
+ real_read_text = Path.read_text
966
+
967
+ def cp1250_default(
968
+ self: Path, encoding: str | None = None, errors: str | None = None
969
+ ) -> str:
970
+ # Mimic a Windows host: no explicit encoding means cp1250.
971
+ return real_read_text(self, encoding=encoding or "cp1250", errors=errors)
972
+
973
+ monkeypatch.setattr(Path, "read_text", cp1250_default)
974
+
975
+ code = _read_source(sql)
976
+ assert "SELECT 1 FROM t" in code
977
+ assert "příprava" in code, "UTF-8 content must round-trip intact"
978
+
979
+ def test_genuinely_undecodable_bytes_do_not_abort_the_build(self, tmp_path: Path) -> None:
980
+ """A locally-edited file saved in the OS codepage costs a comment, not the graph."""
981
+ sql = tmp_path / "transform.sql"
982
+ # 0x81 is invalid UTF-8 and is the byte from the report's traceback.
983
+ sql.write_bytes(b"-- koment\x81\nSELECT 1 FROM in.c_bucket.tbl;\n")
984
+
985
+ code = _read_source(sql)
986
+
987
+ # The table reference -- the only thing lineage actually needs -- survives.
988
+ assert "in.c_bucket.tbl" in code
@@ -1,6 +1,7 @@
1
1
  """Tests for sync manifest models and load/save functions."""
2
2
 
3
3
  import json
4
+ from pathlib import Path
4
5
 
5
6
  import pytest
6
7
 
@@ -275,3 +276,48 @@ class TestManifestExtraFields:
275
276
  # Extra field on nested model
276
277
  project_dumped = loaded.project.model_dump(mode="json", by_alias=True)
277
278
  assert project_dumped["unknownField"] == "kept"
279
+
280
+
281
+ class TestManifestPathsArePortable:
282
+ """The manifest is tracked in git, so its paths must be OS-neutral.
283
+
284
+ The asymmetry is what makes this dangerous: `Path()` on Windows accepts
285
+ `a/b`, but on POSIX `a\\b` is a single filename containing a backslash. A
286
+ manifest written on Windows therefore stops resolving for every teammate on
287
+ macOS or Linux, while the reverse direction works and hides the problem.
288
+ """
289
+
290
+ def test_windows_separators_are_normalised_on_load(self) -> None:
291
+ """A manifest already committed by a Windows kbagent repairs itself."""
292
+ cfg = ManifestConfiguration(
293
+ branchId=1,
294
+ componentId="keboola.ex-http",
295
+ id="123",
296
+ path=r"extractor\keboola.ex-http\adopted-extractor",
297
+ )
298
+ assert cfg.path == "extractor/keboola.ex-http/adopted-extractor"
299
+
300
+ def test_branch_and_row_paths_are_normalised_too(self) -> None:
301
+ assert ManifestBranch(id=1, path=r"main\nested").path == "main/nested"
302
+ assert ManifestConfigRow(id="r1", path=r"rows\first").path == "rows/first"
303
+
304
+ def test_posix_paths_are_left_alone(self) -> None:
305
+ """The common case must be untouched, not round-tripped through a rewrite."""
306
+ cfg = ManifestConfiguration(branchId=1, componentId="c", id="1", path="extractor/c/name")
307
+ assert cfg.path == "extractor/c/name"
308
+
309
+ def test_a_saved_manifest_holds_forward_slashes(self, tmp_path: Path) -> None:
310
+ """End to end: what lands in git is portable regardless of the writer's OS."""
311
+ manifest = Manifest(
312
+ project=ManifestProject(id=1, apiHost="connection.keboola.com"),
313
+ naming=ManifestNaming(),
314
+ branches=[ManifestBranch(id=1, path="main")],
315
+ configurations=[
316
+ ManifestConfiguration(branchId=1, componentId="c", id="1", path=r"extractor\c\name")
317
+ ],
318
+ )
319
+ save_manifest(tmp_path, manifest)
320
+
321
+ raw = (tmp_path / ".keboola" / "manifest.json").read_text(encoding="utf-8")
322
+ assert "extractor/c/name" in raw
323
+ assert "\\\\" not in raw, "a backslash in the tracked manifest breaks POSIX checkouts"
File without changes
File without changes
File without changes
File without changes
File without changes