datex-studio-cli 0.5.2__tar.gz → 0.5.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 (239) hide show
  1. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/PKG-INFO +1 -1
  2. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/pyproject.toml +1 -1
  3. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/__init__.py +1 -1
  4. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/auth.py +32 -0
  5. datex_studio_cli-0.5.4/src/dxs/core/auth/browser_pages.py +72 -0
  6. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/msal_client.py +22 -2
  7. datex_studio_cli-0.5.4/src/dxs/core/auth/pages/error.html +234 -0
  8. datex_studio_cli-0.5.4/src/dxs/core/auth/pages/success.html +217 -0
  9. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/onboarding.py +126 -2
  10. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/quartermaster/client.py +16 -4
  11. datex_studio_cli-0.5.4/src/dxs/core/quartermaster/tenants.py +57 -0
  12. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/404/index.html +1 -1
  13. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/404.html +1 -1
  14. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/capture/index.html +1 -1
  15. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/capture/index.txt +1 -1
  16. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/index.html +1 -1
  17. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/design/index.txt +1 -1
  18. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/index.html +1 -1
  19. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/index.txt +1 -1
  20. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.dockerignore +0 -0
  21. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/actionlint.yaml +0 -0
  22. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/build-image.yml +0 -0
  23. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/ci.yml +0 -0
  24. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/promote-prod.yml +0 -0
  25. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.github/workflows/release.yml +0 -0
  26. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/.gitignore +0 -0
  27. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/CONTEXT.md +0 -0
  28. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/README.md +0 -0
  29. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/.env.example +0 -0
  30. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/Dockerfile +0 -0
  31. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/README.md +0 -0
  32. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/apply-local-cache.js +0 -0
  33. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/collector-config.yaml +0 -0
  34. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/docker-compose.yml +0 -0
  35. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/local-test-settings.json +0 -0
  36. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/otel/remote-settings.json +0 -0
  37. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/report-creator.skill +0 -0
  38. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/analyze_corpus.py +0 -0
  39. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/check_wheel_completeness.py +0 -0
  40. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/datadog_errors.py +0 -0
  41. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/generate_rdlx_schema.py +0 -0
  42. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/scripts/wavelength_query.py +0 -0
  43. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/__main__.py +0 -0
  44. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/cli.py +0 -0
  45. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/__init__.py +0 -0
  46. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/api.py +0 -0
  47. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/branch.py +0 -0
  48. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/branch_commit_guard.py +0 -0
  49. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/cascade.py +0 -0
  50. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/config.py +0 -0
  51. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/configuration.py +0 -0
  52. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm.py +0 -0
  53. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm_delivery.py +0 -0
  54. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/crm_time.py +0 -0
  55. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/datasource.py +0 -0
  56. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/devops.py +0 -0
  57. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/document.py +0 -0
  58. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/endpoint.py +0 -0
  59. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/env.py +0 -0
  60. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/explore.py +0 -0
  61. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/function.py +0 -0
  62. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/init.py +0 -0
  63. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/marketplace.py +0 -0
  64. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/__init__.py +0 -0
  65. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/_common.py +0 -0
  66. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/api.py +0 -0
  67. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/create.py +0 -0
  68. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/data.py +0 -0
  69. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/pack.py +0 -0
  70. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/ng/preview.py +0 -0
  71. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/odata.py +0 -0
  72. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/organization.py +0 -0
  73. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/proxy.py +0 -0
  74. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/reference.py +0 -0
  75. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/release_notes.py +0 -0
  76. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/repo.py +0 -0
  77. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/__init__.py +0 -0
  78. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/add_cmds.py +0 -0
  79. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/api.py +0 -0
  80. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/batch.py +0 -0
  81. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/create.py +0 -0
  82. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/data.py +0 -0
  83. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/dataset.py +0 -0
  84. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/edit.py +0 -0
  85. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/folder.py +0 -0
  86. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/preview.py +0 -0
  87. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/report/schema_cmds.py +0 -0
  88. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/reset.py +0 -0
  89. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/schema.py +0 -0
  90. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/servicepack.py +0 -0
  91. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/skills.py +0 -0
  92. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/source.py +0 -0
  93. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/studio.py +0 -0
  94. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/telemetry.py +0 -0
  95. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/user.py +0 -0
  96. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/commands/validation_report.py +0 -0
  97. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/context.py +0 -0
  98. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/__init__.py +0 -0
  99. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/agent_browser.py +0 -0
  100. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/__init__.py +0 -0
  101. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/app_config.py +0 -0
  102. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/client.py +0 -0
  103. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/endpoints.py +0 -0
  104. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/metadata_models.py +0 -0
  105. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/models.py +0 -0
  106. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/reference_graph.py +0 -0
  107. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/api/replacements.py +0 -0
  108. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/__init__.py +0 -0
  109. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/datex_tenant.py +0 -0
  110. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/decorators.py +0 -0
  111. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/tenants.py +0 -0
  112. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/auth/token_cache.py +0 -0
  113. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/cache.py +0 -0
  114. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/__init__.py +0 -0
  115. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_generator.py +0 -0
  116. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_models.py +0 -0
  117. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/flow_shape.py +0 -0
  118. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/generator.py +0 -0
  119. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/models.py +0 -0
  120. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/parsers.py +0 -0
  121. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/resolver.py +0 -0
  122. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/type_def_parser.py +0 -0
  123. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/datasource/validator.py +0 -0
  124. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/__init__.py +0 -0
  125. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/flow_models.py +0 -0
  126. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/models.py +0 -0
  127. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/designer/parsers.py +0 -0
  128. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/__init__.py +0 -0
  129. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/client.py +0 -0
  130. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/helpers.py +0 -0
  131. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/devops/models.py +0 -0
  132. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/__init__.py +0 -0
  133. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/client.py +0 -0
  134. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/html.py +0 -0
  135. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/metadata_cache.py +0 -0
  136. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/pagination.py +0 -0
  137. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/resolvers.py +0 -0
  138. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/dynamics/time_entry.py +0 -0
  139. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/__init__.py +0 -0
  140. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/client.py +0 -0
  141. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/edmx_parser.py +0 -0
  142. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/footprint/metadata.py +0 -0
  143. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/__init__.py +0 -0
  144. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/generator.py +0 -0
  145. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/models.py +0 -0
  146. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/function/validator.py +0 -0
  147. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/graph.py +0 -0
  148. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/__init__.py +0 -0
  149. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/csv_fmt.py +0 -0
  150. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/formatter.py +0 -0
  151. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/json_fmt.py +0 -0
  152. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/redaction.py +0 -0
  153. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/output/yaml_fmt.py +0 -0
  154. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/quartermaster/__init__.py +0 -0
  155. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/release_notes.py +0 -0
  156. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/responses.py +0 -0
  157. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/__init__.py +0 -0
  158. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/frontmatter.py +0 -0
  159. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/installer.py +0 -0
  160. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/layout.py +0 -0
  161. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/lock.py +0 -0
  162. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/resolver.py +0 -0
  163. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/skills/staleness.py +0 -0
  164. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/__init__.py +0 -0
  165. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/config.py +0 -0
  166. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/identity.py +0 -0
  167. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/recorder.py +0 -0
  168. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/scrubber.py +0 -0
  169. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/core/telemetry/sender.py +0 -0
  170. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/models/__init__.py +0 -0
  171. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/__init__.py +0 -0
  172. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/folder.py +0 -0
  173. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/manifest.py +0 -0
  174. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/mocks.py +0 -0
  175. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/preview.py +0 -0
  176. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/scaffold.py +0 -0
  177. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/ng/serve_lock.py +0 -0
  178. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/py.typed +0 -0
  179. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/__init__.py +0 -0
  180. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/datasource_binding.py +0 -0
  181. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/engine.py +0 -0
  182. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/field_parser.py +0 -0
  183. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/folder.py +0 -0
  184. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/manifest.py +0 -0
  185. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/models.py +0 -0
  186. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/preview.py +0 -0
  187. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/preview_arjs.py +0 -0
  188. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/schema.py +0 -0
  189. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/svg_renderer.py +0 -0
  190. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/__init__.py +0 -0
  191. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
  192. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
  193. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/validate_arjs.py +0 -0
  194. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/validator.py +0 -0
  195. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/report/wrapper.py +0 -0
  196. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/__init__.py +0 -0
  197. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/click_options.py +0 -0
  198. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/clipboard.py +0 -0
  199. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/config.py +0 -0
  200. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/errors.py +0 -0
  201. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/filtering.py +0 -0
  202. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/image.py +0 -0
  203. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/paths.py +0 -0
  204. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/resolvers.py +0 -0
  205. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/responses.py +0 -0
  206. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/restricted.py +0 -0
  207. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/sorting.py +0 -0
  208. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/update_check.py +0 -0
  209. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/utils/versioning.py +0 -0
  210. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/__init__.py +0 -0
  211. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/app.py +0 -0
  212. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/design.py +0 -0
  213. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/proxy_app.py +0 -0
  214. {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.4/src/dxs/web/static/_next/static/CAvN0dC1A3kKCmq1ZHlgY}/_buildManifest.js +0 -0
  215. {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.4/src/dxs/web/static/_next/static/CAvN0dC1A3kKCmq1ZHlgY}/_ssgManifest.js +0 -0
  216. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
  217. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
  218. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
  219. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/538-b06224e65f71c9a1.js +0 -0
  220. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
  221. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
  222. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
  223. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
  224. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/_not-found/page-e3c660196c244183.js +0 -0
  225. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js +0 -0
  226. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/design/page-689cd5b9e1d9a74e.js +0 -0
  227. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/layout-cec86f90e385371d.js +0 -0
  228. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/app/page-f0380b0f29983264.js +0 -0
  229. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
  230. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
  231. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/main-app-694cf3568b6c9fa9.js +0 -0
  232. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -0
  233. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -0
  234. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  235. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
  236. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
  237. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/render-cli.js +0 -0
  238. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/report-preview.html +0 -0
  239. {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.4}/src/dxs/web/static/report-validate.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: datex-studio-cli
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: CLI for Datex Studio low-code platform, designed for LLM-based AI agents
5
5
  Project-URL: Homepage, https://github.com/datex/datex-studio-cli
6
6
  Project-URL: Documentation, https://github.com/datex/datex-studio-cli
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "datex-studio-cli"
7
- version = "0.5.2"
7
+ version = "0.5.4"
8
8
  description = "CLI for Datex Studio low-code platform, designed for LLM-based AI agents"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,4 +1,4 @@
1
1
  """Datex Studio CLI - Command-line interface for Datex Studio platform."""
2
2
 
3
- __version__ = "0.5.2"
3
+ __version__ = "0.5.4"
4
4
  __app_name__ = "dxs"
@@ -32,14 +32,38 @@ from dxs.core.auth.token_cache import CachedIdentity, get_identity_override
32
32
  from dxs.core.footprint import get_footprint_token
33
33
  from dxs.core.onboarding import (
34
34
  LoginPresenter,
35
+ apply_sign_in_tenant_hint,
35
36
  human_present,
36
37
  map_login_failure,
38
+ missing_service_principal_tenant,
37
39
  )
40
+ from dxs.core.quartermaster.tenants import lookup_sign_in_tenant
38
41
  from dxs.utils.errors import AuthenticationError, DxsError, ValidationError
39
42
  from dxs.utils.responses import list_response, single
40
43
  from dxs.utils.restricted import restrict_in_restricted_mode
41
44
 
42
45
 
46
+ def _sharpen_missing_service_principal(
47
+ mapped: AuthenticationError, tenant_id: str | None, raw_error: str
48
+ ) -> AuthenticationError:
49
+ """Ask Quartermaster which tenant the org actually signs in against.
50
+
51
+ Only for DXS-AUTH-030, only after the login already failed, and only ever
52
+ additive: any problem reaching the service leaves the mapped notice as-is.
53
+ The tenant comes from the caller when it resolved one, and otherwise out of
54
+ Entra's own error text — a blank-prompt or org-name login never had one.
55
+ """
56
+ requested = tenant_id or missing_service_principal_tenant(raw_error)
57
+ if not requested:
58
+ return mapped
59
+ try:
60
+ return apply_sign_in_tenant_hint(
61
+ mapped, requested_tenant=requested, sign_in=lookup_sign_in_tenant(requested)
62
+ )
63
+ except Exception: # noqa: BLE001 - never worsen a diagnosed failure
64
+ return mapped
65
+
66
+
43
67
  def _reject_tenant_override(ctx: DxsContext, command: str) -> None:
44
68
  """Block --tenant on identity-management commands.
45
69
 
@@ -319,6 +343,10 @@ def run_standard_login(
319
343
  on_additional_consent_needed=consent_cb,
320
344
  consent_outcomes=outcomes,
321
345
  login_hint=upn,
346
+ # The success page shows the org chip only when the caller knew
347
+ # the org before the browser opened (login <ORG> / switch <ORG>);
348
+ # bare logins discover the org only after this returns.
349
+ org_name=organization_name,
322
350
  )
323
351
  else:
324
352
  ctx.log("Initiating device code authentication...")
@@ -333,6 +361,10 @@ def run_standard_login(
333
361
  mapped = map_login_failure(
334
362
  e, external=tenant_scoped, tenant_id=tenant_id, domain=domain, upn=upn
335
363
  )
364
+ if mapped.code == "DXS-AUTH-030":
365
+ mapped = _sharpen_missing_service_principal(
366
+ mapped, tenant_id, f"{e.message} {e.details}"
367
+ )
336
368
  if mapped is e:
337
369
  raise
338
370
  raise mapped from e
@@ -0,0 +1,72 @@
1
+ """HTML pages served in the browser after the PKCE login redirect.
2
+
3
+ The pages themselves are designer-authored files in ``pages/`` (shipped as
4
+ package data). MSAL's local redirect server (``msal.oauth2cli.authcode``)
5
+ renders them via ``string.Template.safe_substitute`` and serves each exactly
6
+ once from a one-shot HTTP server, which imposes rules any replacement page
7
+ must keep (pinned by ``tests/test_auth_browser_pages.py``):
8
+
9
+ - The first character must be ``<`` — the server labels the response
10
+ ``text/html`` only when the body starts with ``<``.
11
+ - ``<meta charset="utf-8">`` is required — the server sends no charset header,
12
+ and the body is UTF-8 encoded.
13
+ - Everything inline (CSS, script, favicon and logos as data URIs): the server
14
+ is gone after the page is sent, so a second request can never be served.
15
+ - ``$name`` is a substitution slot; a literal dollar sign must be written
16
+ ``$$``, and JS ``${...}`` template literals are banned (they collide with
17
+ the braced slot syntax). Page scripts write ``\\u0024`` instead of a raw
18
+ dollar for the same reason.
19
+ - Slots may sit only in element text, never in JS string literals: MSAL
20
+ escapes values for HTML only, so a backslash or newline in Entra's error
21
+ text would break out of a JS literal. Scripts read the substituted values
22
+ back from the DOM.
23
+ - The success redirect carries only auth artifacts (``code``/``state``) — no
24
+ identity — so the success page must never render its substitution input.
25
+ Its one declared slot, ``$org``, is never present in the auth response;
26
+ it is reserved for engineering-side injection, and the page's script
27
+ removes the org chip while the token is unfilled.
28
+ - ``safe_substitute`` leaves an unfilled slot as its literal token text, so
29
+ the pages' scripts hide any slot whose text still starts with a dollar.
30
+ """
31
+
32
+ import html
33
+ from importlib.resources import files
34
+ from string import Template
35
+
36
+
37
+ def _load_page(name: str) -> str:
38
+ return files("dxs.core.auth").joinpath("pages").joinpath(name).read_text(encoding="utf-8")
39
+
40
+
41
+ SUCCESS_PAGE_HTML = _load_page("success.html")
42
+ ERROR_PAGE_HTML = _load_page("error.html")
43
+
44
+ # The success page bakes in an "Access approved" copy variant for the staff
45
+ # consent round, switched by this marker in its script. The replace is
46
+ # deliberately silent on a miss — a redesigned page without the marker must
47
+ # not break logins — and the variant test is what turns a missing marker into
48
+ # a CI failure instead of quietly serving sign-in copy.
49
+ CONSENT_SUCCESS_PAGE_HTML = SUCCESS_PAGE_HTML.replace(
50
+ 'var VARIANT = "signin";', 'var VARIANT = "approved";'
51
+ )
52
+
53
+
54
+ def success_page(org: str | None = None, *, approved: bool = False) -> str:
55
+ """The success page, with the org context chip filled in when known.
56
+
57
+ ``org`` is the organization display name a login command resolved before
58
+ opening the browser (the ``dxs auth login <ORG>`` / ``switch <ORG>``
59
+ paths); ``None`` or blank leaves the ``$org`` token in place, which the
60
+ page's own script treats as "unknown" and removes the chip. The value is
61
+ HTML-escaped here because MSAL escapes only what *it* substitutes.
62
+ Substitution is single-pass, so a dollar sign inside the name lands
63
+ literally — the page then hides a chip whose text starts with one, per
64
+ the unset-token convention, rather than rendering it.
65
+
66
+ ``approved`` selects the staff consent round's "Access approved" copy.
67
+ """
68
+ base = CONSENT_SUCCESS_PAGE_HTML if approved else SUCCESS_PAGE_HTML
69
+ name = (org or "").strip()
70
+ if not name:
71
+ return base
72
+ return Template(base).safe_substitute(org=html.escape(name))
@@ -8,6 +8,7 @@ from typing import Any, cast
8
8
 
9
9
  import msal
10
10
 
11
+ from dxs.core.auth.browser_pages import ERROR_PAGE_HTML, success_page
11
12
  from dxs.utils.config import get_settings
12
13
  from dxs.utils.errors import AuthenticationError
13
14
 
@@ -309,6 +310,7 @@ class MSALClient:
309
310
  on_additional_consent_needed: Callable[[str, list[str]], None] | None = None,
310
311
  consent_outcomes: list[ConsentOutcome] | None = None,
311
312
  login_hint: str | None = None,
313
+ org_name: str | None = None,
312
314
  ) -> dict[str, Any]:
313
315
  """Authenticate with multiple resources via the system browser (PKCE).
314
316
 
@@ -330,6 +332,10 @@ class MSALClient:
330
332
  primary round only, since the consent rounds that follow ride the
331
333
  session that round established.
332
334
 
335
+ ``org_name`` is the organization display name, when the caller resolved
336
+ one before opening the browser; it fills the context chip on the
337
+ post-redirect success pages (primary and consent rounds alike).
338
+
333
339
  Raises:
334
340
  AuthenticationError: If the primary authentication fails.
335
341
  """
@@ -341,6 +347,7 @@ class MSALClient:
341
347
  scopes=primary_scopes,
342
348
  extra_scopes_to_consent=extra_to_consent,
343
349
  login_hint=login_hint,
350
+ org_name=org_name,
344
351
  )
345
352
 
346
353
  if callable(additional_scope_sets):
@@ -354,6 +361,7 @@ class MSALClient:
354
361
  on_device_code=None,
355
362
  on_additional_consent_needed=on_additional_consent_needed,
356
363
  interactive=True,
364
+ org_name=org_name,
357
365
  )
358
366
  if not outcome.ok:
359
367
  logger.warning(
@@ -373,6 +381,7 @@ class MSALClient:
373
381
  on_device_code: Callable[[dict[str, Any]], None] | None,
374
382
  on_additional_consent_needed: Callable[[str, list[str]], None] | None,
375
383
  interactive: bool = False,
384
+ org_name: str | None = None,
376
385
  ) -> ConsentOutcome:
377
386
  """Acquire one additional resource's token, reporting how it went.
378
387
 
@@ -417,7 +426,7 @@ class MSALClient:
417
426
  # Consent needed - run a consent flow for this resource
418
427
  if interactive:
419
428
  consent = self._acquire_consent_for_resource_interactive(
420
- scope_set, on_additional_consent_needed
429
+ scope_set, on_additional_consent_needed, org_name=org_name
421
430
  )
422
431
  else:
423
432
  consent = self._acquire_consent_for_resource(
@@ -438,6 +447,7 @@ class MSALClient:
438
447
  self,
439
448
  scopes: list[str],
440
449
  on_additional_consent_needed: Callable[[str, list[str]], None] | None = None,
450
+ org_name: str | None = None,
441
451
  ) -> dict[str, Any]:
442
452
  """Browser consent round for one resource (the interactive-flow sibling
443
453
  of :meth:`_acquire_consent_for_resource`).
@@ -450,7 +460,11 @@ class MSALClient:
450
460
  on_additional_consent_needed(resource_name, scopes)
451
461
 
452
462
  try:
453
- result = self._app.acquire_token_interactive(scopes=scopes)
463
+ result = self._app.acquire_token_interactive(
464
+ scopes=scopes,
465
+ success_template=success_page(org_name, approved=True),
466
+ error_template=ERROR_PAGE_HTML,
467
+ )
454
468
  except Exception as e:
455
469
  logger.debug("Interactive flow failed for resource consent: %s", e)
456
470
  return {"error": "exception", "error_description": str(e)}
@@ -523,6 +537,7 @@ class MSALClient:
523
537
  scopes: list[str],
524
538
  extra_scopes_to_consent: list[str] | None = None,
525
539
  login_hint: str | None = None,
540
+ org_name: str | None = None,
526
541
  ) -> dict[str, Any]:
527
542
  """Authenticate interactively via browser with multi-resource consent.
528
543
 
@@ -539,6 +554,9 @@ class MSALClient:
539
554
  which on a machine with several tenants is rarely who was asked
540
555
  for. It is only a hint — the caller still has to verify the
541
556
  account that comes back.
557
+ org_name: Organization display name, when the caller resolved one
558
+ before opening the browser; shown on the post-redirect success
559
+ page's context chip.
542
560
 
543
561
  Returns:
544
562
  Token response containing access_token, refresh_token, etc.
@@ -551,6 +569,8 @@ class MSALClient:
551
569
  scopes=scopes,
552
570
  extra_scopes_to_consent=extra_scopes_to_consent,
553
571
  login_hint=login_hint,
572
+ success_template=success_page(org_name),
573
+ error_template=ERROR_PAGE_HTML,
554
574
  )
555
575
  except Exception as e:
556
576
  raise AuthenticationError(
@@ -0,0 +1,234 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <meta name="robots" content="noindex">
7
+ <title>Sign-in didn't complete · Datex Studio CLI</title>
8
+ <link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2064%22%3E%3Crect%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2214%22%20fill%3D%22%235B09AF%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%225%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.95%22%3E%3Cpath%20d%3D%22M20%2022l10%2010-10%2010%22%2F%3E%3Cpath%20d%3D%22M36%2022l10%2010-10%2010%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
9
+ <style>
10
+ *,*::before,*::after{box-sizing:border-box}
11
+ html,body{height:100%}
12
+ :root{
13
+ --bg:#F5F7F9; --grid:rgba(91,9,175,.10);
14
+ --card:#FFFFFF; --bd:#DCE2EC; --sh:0 1px 2px rgba(59,70,79,.04),0 18px 40px -18px rgba(59,70,79,.22);
15
+ --tx:#22292F; --bo:#3B464F; --mu:#5B6A75; --su:#74828D;
16
+ --brand:#5B09AF; --brand-h:#410880; --lav:#B3A7FE; --lav-soft:#E9E4FF;
17
+ --chip:#FFFFFF; --tbg:#22292F; --tbd:rgba(255,255,255,.10); --tmu:#9AA6B1; --tp:#B3A7FE;
18
+ --hair:#DCE2EC; --sunken:#F5F7F9;
19
+ }
20
+ @media (prefers-color-scheme:dark){
21
+ html:not([data-theme="light"]){
22
+ --bg:#12161A; --grid:rgba(179,167,254,.12);
23
+ --card:#1B2126; --bd:rgba(255,255,255,.09); --sh:0 24px 60px -24px rgba(0,0,0,.7);
24
+ --tx:#FFFFFF; --bo:#EDF1F6; --mu:#9AA6B1; --su:#74828D;
25
+ --brand:#8B3FDD; --brand-h:#7423C9; --lav-soft:rgba(179,167,254,.14);
26
+ --chip:#232A31; --tbg:#12161A; --tbd:rgba(255,255,255,.08);
27
+ --hair:rgba(255,255,255,.09); --sunken:rgba(255,255,255,.04);
28
+ }
29
+ }
30
+ html[data-theme="dark"]{
31
+ --bg:#12161A; --grid:rgba(179,167,254,.12);
32
+ --card:#1B2126; --bd:rgba(255,255,255,.09); --sh:0 24px 60px -24px rgba(0,0,0,.7);
33
+ --tx:#FFFFFF; --bo:#EDF1F6; --mu:#9AA6B1; --su:#74828D;
34
+ --brand:#8B3FDD; --brand-h:#7423C9; --lav-soft:rgba(179,167,254,.14);
35
+ --chip:#232A31; --tbg:#12161A; --tbd:rgba(255,255,255,.08);
36
+ --hair:rgba(255,255,255,.09); --sunken:rgba(255,255,255,.04);
37
+ }
38
+ body{
39
+ margin:0;padding:28px;background:var(--bg);color:var(--tx);
40
+ font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
41
+ -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
42
+ display:grid;place-items:center;
43
+ }
44
+ body::before{
45
+ content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
46
+ background-image:repeating-linear-gradient(135deg,var(--grid) 0 1px,transparent 1px 15px);
47
+ -webkit-mask-image:radial-gradient(130% 80% at 50% -10%,#000 0%,transparent 72%);
48
+ mask-image:radial-gradient(130% 80% at 50% -10%,#000 0%,transparent 72%);
49
+ }
50
+ .card{
51
+ position:relative;z-index:1;width:100%;max-width:560px;background:var(--card);
52
+ border:1px solid var(--bd);border-radius:20px;box-shadow:var(--sh);
53
+ padding:40px 40px 32px;overflow:hidden;
54
+ animation:rise .5s cubic-bezier(.4,0,.2,1) both;
55
+ }
56
+ .lockup{display:flex;align-items:center;gap:13px;margin:0 0 34px}
57
+ .lockup img{height:19px;width:auto;display:block}
58
+ .m-d{display:none}
59
+ @media (prefers-color-scheme:dark){html:not([data-theme="light"]) .m-l{display:none}html:not([data-theme="light"]) .m-d{display:block}}
60
+ html[data-theme="dark"] .m-l{display:none}
61
+ html[data-theme="dark"] .m-d{display:block}
62
+ .lockup .rule{width:1px;height:15px;background:var(--bd)}
63
+ .kicker{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--mu)}
64
+ .glyph{
65
+ width:54px;height:54px;border-radius:50%;background:var(--chip);
66
+ border:1.5px solid var(--lav);display:grid;place-items:center;margin-bottom:26px;
67
+ animation:pop .45s cubic-bezier(.4,0,.2,1) .12s both;
68
+ }
69
+ .glyph.calm{border-color:var(--bd)}
70
+ .glyph.warn{border-color:#EFB52F;background:var(--chip)}
71
+ .glyph svg{width:25px;height:25px;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;fill:none}
72
+ .glyph svg path{stroke:var(--brand)}
73
+ .glyph.calm svg path{stroke:var(--su)}
74
+ .glyph.warn svg path{stroke:#C68F1B}
75
+ @media (prefers-color-scheme:dark){html:not([data-theme="light"]) .glyph.warn svg path{stroke:#EFB52F}}
76
+ html[data-theme="dark"] .glyph.warn svg path{stroke:#EFB52F}
77
+ .draw{stroke-dasharray:34;stroke-dashoffset:34;animation:draw .42s cubic-bezier(.4,0,.2,1) .34s both}
78
+ .org{
79
+ display:inline-block;margin:0 0 14px;padding:5px 11px;border-radius:999px;
80
+ background:var(--lav-soft);color:var(--brand);font-size:12px;font-weight:700;letter-spacing:.02em;
81
+ }
82
+ h1{margin:0;font-size:clamp(27px,3.6vw,33px);line-height:1.14;letter-spacing:-.021em;font-weight:800;color:var(--tx)}
83
+ .lede{margin:14px 0 0;font-size:16px;line-height:1.62;color:var(--mu);max-width:44ch;text-wrap:pretty}
84
+ .term{
85
+ margin-top:28px;border-radius:12px;background:var(--tbg);border:1px solid var(--tbd);
86
+ padding:14px 16px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
87
+ font-size:13px;line-height:1.95;color:var(--tmu);overflow-x:auto;
88
+ }
89
+ .term .row{white-space:nowrap}
90
+ .term .p{color:var(--tp)}
91
+ .term .ok{color:#3FC589}
92
+ .term .cmd{color:#EDF1F6}
93
+ .caret{display:inline-block;width:7px;height:14px;background:#B3A7FE;vertical-align:-2px;animation:blink 1.1s steps(1,end) 1s infinite}
94
+ .code{
95
+ display:inline-flex;align-items:center;gap:8px;margin-top:24px;padding:6px 11px;border-radius:8px;
96
+ background:var(--sunken);border:1px solid var(--bd);
97
+ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:var(--bo);
98
+ }
99
+ .code b{font-family:inherit;font-weight:400;color:var(--su)}
100
+ details{margin-top:18px;border-top:1px solid var(--hair);padding-top:16px}
101
+ summary{
102
+ cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;
103
+ font-size:13px;font-weight:600;color:var(--mu);width:max-content;
104
+ }
105
+ summary::-webkit-details-marker{display:none}
106
+ summary svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s cubic-bezier(.4,0,.2,1)}
107
+ details[open] summary svg{transform:rotate(90deg)}
108
+ summary:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav-soft);border-radius:6px}
109
+ .detail{
110
+ margin:12px 0 0;padding:12px 14px;border-radius:10px;background:var(--sunken);border:1px solid var(--bd);
111
+ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.65;
112
+ color:var(--mu);white-space:pre-wrap;word-break:break-word;
113
+ }
114
+ .foot{margin:26px 0 0;padding-top:18px;border-top:1px solid var(--hair);font-size:13px;line-height:1.6;color:var(--su)}
115
+ .foot b{color:var(--mu);font-weight:600}
116
+ .stagger>*{animation:rise .5s cubic-bezier(.4,0,.2,1) both}
117
+ .stagger>*:nth-child(1){animation-delay:.10s}
118
+ .stagger>*:nth-child(2){animation-delay:.17s}
119
+ .stagger>*:nth-child(3){animation-delay:.24s}
120
+ .stagger>*:nth-child(4){animation-delay:.31s}
121
+ .stagger>*:nth-child(5){animation-delay:.38s}
122
+ .btnrow{display:flex;align-items:center;gap:20px;margin-top:28px;flex-wrap:wrap}
123
+ .btn{
124
+ display:inline-flex;align-items:center;gap:9px;height:44px;padding:0 20px;border-radius:10px;
125
+ background:var(--brand);color:#fff;text-decoration:none;font-size:14.5px;font-weight:600;
126
+ box-shadow:0 6px 18px -6px rgba(91,9,175,.55);transition:background .16s cubic-bezier(.4,0,.2,1),box-shadow .16s,transform .12s;
127
+ }
128
+ .btn:hover{background:var(--brand-h);box-shadow:0 10px 24px -8px rgba(91,9,175,.6)}
129
+ .btn:active{transform:translateY(1px)}
130
+ .btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav)}
131
+ .btn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
132
+ .ghost{font-size:14px;font-weight:600;color:var(--mu);text-decoration:none;border-bottom:1px solid transparent;transition:color .16s,border-color .16s}
133
+ .ghost:hover{color:var(--brand);border-color:var(--lav)}
134
+ .ghost:focus-visible{outline:none;box-shadow:0 0 0 3px var(--lav-soft);border-radius:4px}
135
+ a{color:var(--brand)}
136
+ a:hover{color:var(--brand-h)}
137
+ .band{
138
+ margin:-40px -40px 30px;height:96px;position:relative;overflow:hidden;
139
+ background:linear-gradient(115deg,#410880 0%,#5B09AF 52%,#7423C9 100%);
140
+ display:flex;align-items:center;padding:0 40px;
141
+ }
142
+ .band::after{
143
+ content:"";position:absolute;inset:0;
144
+ background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.30) 0 1px,transparent 1px 15px);
145
+ opacity:.55;
146
+ }
147
+ .band img{height:22px;width:auto;position:relative;z-index:1;display:block}
148
+ @keyframes rise{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
149
+ @keyframes pop{from{opacity:0;transform:scale(.86)}to{opacity:1;transform:none}}
150
+ @keyframes draw{to{stroke-dashoffset:0}}
151
+ @keyframes blink{50%{opacity:0}}
152
+ @media (prefers-reduced-motion:reduce){
153
+ *{animation:none!important;transition:none!important}
154
+ .draw{stroke-dashoffset:0}
155
+ }
156
+ @media (max-width:560px){
157
+ body{padding:16px}
158
+ .card{padding:30px 24px 24px;border-radius:16px}
159
+ .band{margin:-30px -24px 24px;padding:0 24px;height:82px}
160
+ }
161
+ </style>
162
+ </head>
163
+ <body>
164
+ <main class="card">
165
+ <div class="lockup">
166
+ <img class="m-l" src="data:image/png;base64,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" alt="Datex">
167
+ <img class="m-d" src="data:image/png;base64,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" alt="Datex">
168
+ <span class="rule"></span>
169
+ <span class="kicker">Studio CLI</span>
170
+ </div>
171
+ <div class="glyph warn" id="glyph">
172
+ <svg viewBox="0 0 24 24" aria-hidden="true" id="icon-warn">
173
+ <path class="draw" d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/>
174
+ <path d="M12 9v4"/><path d="M12 17h.01"/>
175
+ </svg>
176
+ <svg viewBox="0 0 24 24" aria-hidden="true" id="icon-calm" style="display:none">
177
+ <path class="draw" d="M18 6 6 18"/><path d="M6 6l12 12"/>
178
+ </svg>
179
+ </div>
180
+ <div class="stagger">
181
+ <h1 id="head">Sign-in didn't complete</h1>
182
+ <p class="lede" id="lede">Microsoft turned us back before we could finish. Give it another run &mdash; if it happens again, Datex support can take it from there.</p>
183
+ <div class="term" aria-hidden="true">
184
+ <div class="row"><span class="p">&rsaquo;</span> <span class="cmd">dxs auth login</span> <span class="caret"></span></div>
185
+ </div>
186
+ <div id="tech">
187
+ <span class="code"><b>error</b> <span id="code">$error</span></span>
188
+ <details id="det">
189
+ <summary><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> Technical detail</summary>
190
+ <p class="detail" id="desc">$error_description</p>
191
+ </details>
192
+ </div>
193
+ <p class="foot" id="foot">Close this tab and run the command again. <b>Nothing was changed on your account.</b></p>
194
+ </div>
195
+ </main>
196
+ <script>
197
+ (function () {
198
+ var q = new URLSearchParams(location.search);
199
+ // Tidy the error params out of the address bar (only after the query is read).
200
+ try { history.replaceState(null, "", location.pathname); } catch (e) {}
201
+ var t = q.get("demo_theme");
202
+ if (t === "dark" || t === "light") document.documentElement.setAttribute("data-theme", t);
203
+ var unset = function (v) { return !v || v.charAt(0) === "\u0024"; };
204
+
205
+ var el = function (id) { return document.getElementById(id); };
206
+ // The slots are substituted (HTML-escaped) into the DOM; reading them back
207
+ // keeps the values out of JS string literals, where escaping rules differ.
208
+ var code = el("code").textContent;
209
+ var desc = el("desc").textContent;
210
+ if (q.get("demo_error")) { code = q.get("demo_error"); el("code").textContent = code; }
211
+ if (q.get("demo_desc")) { desc = q.get("demo_desc"); el("desc").textContent = desc; }
212
+ var cancelled = !unset(code) && /^(abort|access_denied|user_cancel(led)?)/i.test(code);
213
+
214
+ if (cancelled) {
215
+ // --- STATE A: the person backed out. Quiet, no technical detail. -----
216
+ el("glyph").className = "glyph calm";
217
+ el("icon-warn").style.display = "none";
218
+ el("icon-calm").style.display = "";
219
+ el("head").textContent = "Sign-in cancelled";
220
+ el("lede").textContent = "No changes made, nothing to clean up. Run it again whenever you're ready.";
221
+ el("tech").parentNode.removeChild(el("tech"));
222
+ el("foot").innerHTML = "You can close this tab. <b>The terminal is waiting.<\/b>";
223
+ document.title = "Sign-in cancelled \u00B7 Datex Studio CLI";
224
+ } else {
225
+ // --- STATE B: something actually failed. Keep the detail available. --
226
+ if (unset(code)) { el("code").parentNode.parentNode.removeChild(el("code").parentNode); }
227
+ else { el("code").textContent = code; }
228
+ if (unset(desc)) { el("det").parentNode.removeChild(el("det")); }
229
+ else { el("desc").textContent = desc; }
230
+ }
231
+ })();
232
+ </script>
233
+ </body>
234
+ </html>