datex-studio-cli 0.5.2__tar.gz → 0.5.3__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.
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/PKG-INFO +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/pyproject.toml +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/__init__.py +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/auth.py +28 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/onboarding.py +126 -2
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/quartermaster/client.py +16 -4
- datex_studio_cli-0.5.3/src/dxs/core/quartermaster/tenants.py +57 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/404/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/404.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/capture/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/capture/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/index.html +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/index.txt +1 -1
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.dockerignore +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.github/actionlint.yaml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.github/workflows/build-image.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.github/workflows/ci.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.github/workflows/promote-prod.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.github/workflows/release.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/.gitignore +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/CONTEXT.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/README.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/.env.example +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/Dockerfile +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/README.md +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/apply-local-cache.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/collector-config.yaml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/docker-compose.yml +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/local-test-settings.json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/otel/remote-settings.json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/report-creator.skill +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/scripts/analyze_corpus.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/scripts/check_wheel_completeness.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/scripts/datadog_errors.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/scripts/generate_rdlx_schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/scripts/wavelength_query.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/__main__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/cli.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/branch.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/branch_commit_guard.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/cascade.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/configuration.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/crm.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/crm_delivery.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/crm_time.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/datasource.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/devops.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/document.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/endpoint.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/env.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/explore.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/function.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/init.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/marketplace.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/_common.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/create.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/data.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/pack.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/ng/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/odata.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/organization.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/proxy.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/reference.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/release_notes.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/repo.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/add_cmds.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/api.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/batch.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/create.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/data.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/dataset.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/edit.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/report/schema_cmds.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/reset.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/servicepack.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/skills.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/source.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/studio.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/telemetry.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/user.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/commands/validation_report.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/context.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/agent_browser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/app_config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/endpoints.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/metadata_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/reference_graph.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/api/replacements.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/datex_tenant.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/decorators.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/msal_client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/tenants.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/auth/token_cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/flow_generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/flow_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/flow_shape.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/parsers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/resolver.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/type_def_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/datasource/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/designer/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/designer/flow_models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/designer/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/designer/parsers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/devops/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/devops/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/devops/helpers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/devops/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/html.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/metadata_cache.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/pagination.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/resolvers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/dynamics/time_entry.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/footprint/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/footprint/client.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/footprint/edmx_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/footprint/metadata.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/function/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/function/generator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/function/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/function/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/graph.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/csv_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/formatter.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/json_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/redaction.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/output/yaml_fmt.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/quartermaster/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/release_notes.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/responses.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/frontmatter.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/installer.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/layout.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/lock.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/resolver.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/skills/staleness.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/identity.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/recorder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/scrubber.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/core/telemetry/sender.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/models/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/manifest.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/mocks.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/scaffold.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/ng/serve_lock.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/py.typed +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/datasource_binding.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/engine.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/field_parser.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/folder.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/manifest.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/models.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/preview.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/preview_arjs.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/schema.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/svg_renderer.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/templates/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/validate_arjs.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/validator.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/report/wrapper.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/click_options.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/clipboard.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/config.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/errors.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/filtering.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/image.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/paths.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/resolvers.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/responses.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/restricted.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/sorting.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/update_check.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/utils/versioning.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/__init__.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/app.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/design.py +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/proxy_app.py +0 -0
- {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.3/src/dxs/web/static/_next/static/Xsbcf46McNo4ycd40X4z0}/_buildManifest.js +0 -0
- {datex_studio_cli-0.5.2/src/dxs/web/static/_next/static/5ccHgxTeTrw5DjrFowRBg → datex_studio_cli-0.5.3/src/dxs/web/static/_next/static/Xsbcf46McNo4ycd40X4z0}/_ssgManifest.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/538-b06224e65f71c9a1.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/app/_not-found/page-e3c660196c244183.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/app/design/page-689cd5b9e1d9a74e.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/app/layout-cec86f90e385371d.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/app/page-f0380b0f29983264.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/main-app-694cf3568b6c9fa9.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/render-cli.js +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/report-preview.html +0 -0
- {datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/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.
|
|
3
|
+
Version: 0.5.3
|
|
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
|
|
@@ -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
|
|
|
@@ -333,6 +357,10 @@ def run_standard_login(
|
|
|
333
357
|
mapped = map_login_failure(
|
|
334
358
|
e, external=tenant_scoped, tenant_id=tenant_id, domain=domain, upn=upn
|
|
335
359
|
)
|
|
360
|
+
if mapped.code == "DXS-AUTH-030":
|
|
361
|
+
mapped = _sharpen_missing_service_principal(
|
|
362
|
+
mapped, tenant_id, f"{e.message} {e.details}"
|
|
363
|
+
)
|
|
336
364
|
if mapped is e:
|
|
337
365
|
raise
|
|
338
366
|
raise mapped from e
|
|
@@ -8,6 +8,7 @@ keeps a hard rule: machine envelopes go to stdout, human chrome to stderr.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import os
|
|
11
|
+
import re
|
|
11
12
|
import shutil
|
|
12
13
|
import sys
|
|
13
14
|
from dataclasses import dataclass, field
|
|
@@ -19,6 +20,7 @@ import click
|
|
|
19
20
|
if TYPE_CHECKING:
|
|
20
21
|
from dxs.context import DxsContext
|
|
21
22
|
from dxs.core.api.client import ApiClient
|
|
23
|
+
from dxs.core.quartermaster.tenants import SignInTenant
|
|
22
24
|
from dxs.utils.errors import AuthenticationError
|
|
23
25
|
|
|
24
26
|
|
|
@@ -151,6 +153,51 @@ def detect_profile(client: "ApiClient") -> OnboardingProfile:
|
|
|
151
153
|
)
|
|
152
154
|
|
|
153
155
|
|
|
156
|
+
# AADSTS650052: the tenant holds no service principal for a Datex app, so the
|
|
157
|
+
# sign-in cannot even reach a consent screen. Its prose ("Contact your IT Admin
|
|
158
|
+
# ... or consent to the application") reads as consent-required and is not: no
|
|
159
|
+
# consent granted in the tenant named by the error helps a user whose account
|
|
160
|
+
# lives in a different one, which is the common cause — a work-email domain
|
|
161
|
+
# resolves to the org's own corporate tenant (`homeTenantId`), while Datex
|
|
162
|
+
# provisioned `wavelength<org>.onmicrosoft.com` for them and invited their staff
|
|
163
|
+
# into that. Detected and answered ahead of the consent family for that reason.
|
|
164
|
+
_MISSING_SP_MARKERS = (
|
|
165
|
+
"aadsts650052",
|
|
166
|
+
"lacks a service principal",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# The tenant is named in the error text, which is the only source on paths where
|
|
170
|
+
# the caller never resolved one (a blank prompt, an org-name login).
|
|
171
|
+
_MISSING_SP_TENANT = re.compile(
|
|
172
|
+
r"organization\s+'?([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})'?",
|
|
173
|
+
re.IGNORECASE,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def is_missing_service_principal_error(error_text: str) -> bool:
|
|
178
|
+
"""True when the tenant signed in against has no Datex service principal."""
|
|
179
|
+
text = (error_text or "").lower()
|
|
180
|
+
return any(marker in text for marker in _MISSING_SP_MARKERS)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def missing_service_principal_tenant(error_text: str) -> str | None:
|
|
184
|
+
"""The tenant ID Entra named in an AADSTS650052 failure, if it is there."""
|
|
185
|
+
match = _MISSING_SP_TENANT.search(error_text or "")
|
|
186
|
+
return match.group(1) if match else None
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def render_missing_service_principal_notice(tenant_id: str, domain: str | None) -> str:
|
|
190
|
+
"""Actionable notice for a sign-in scoped to a tenant Datex does not live in."""
|
|
191
|
+
where = f" ({domain})" if domain else ""
|
|
192
|
+
tenant = tenant_id or "the tenant you signed in against"
|
|
193
|
+
return (
|
|
194
|
+
f"AADSTS650052: tenant {tenant}{where} has no service principal for the Datex apps, "
|
|
195
|
+
"so no Datex sign-in against it can succeed. A work-email domain resolves to your "
|
|
196
|
+
"organization's own corporate tenant, which is not where your Datex account lives "
|
|
197
|
+
"when Datex provisioned a wavelength<org>.onmicrosoft.com tenant for your organization."
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
154
201
|
# Admin-consent-required failure markers. AADSTS65001 = user/admin has not consented;
|
|
155
202
|
# AADSTS90094 = admin consent required. VERIFY these against a real un-consented tenant
|
|
156
203
|
# during rollout — device-code flow may surface the code in either the primary result
|
|
@@ -165,8 +212,15 @@ _CONSENT_ERROR_MARKERS = (
|
|
|
165
212
|
|
|
166
213
|
|
|
167
214
|
def is_consent_required_error(error_text: str) -> bool:
|
|
168
|
-
"""True when an auth failure indicates the app is not consented in the tenant.
|
|
215
|
+
"""True when an auth failure indicates the app is not consented in the tenant.
|
|
216
|
+
|
|
217
|
+
A missing service principal (AADSTS650052) is deliberately excluded: its text
|
|
218
|
+
carries both "consent" and "IT Admin", so the heuristic below claims it, and
|
|
219
|
+
every remedy that follows from that answer points at the wrong tenant.
|
|
220
|
+
"""
|
|
169
221
|
text = (error_text or "").lower()
|
|
222
|
+
if is_missing_service_principal_error(text):
|
|
223
|
+
return False
|
|
170
224
|
if any(marker in text for marker in _CONSENT_ERROR_MARKERS):
|
|
171
225
|
return True
|
|
172
226
|
# Catch phrasings like "admin approval required" / "has not consented".
|
|
@@ -248,7 +302,9 @@ def map_login_failure(
|
|
|
248
302
|
are external-tenant only: both are meaningless for the home tenant, where
|
|
249
303
|
the app is consented and every user is a member. The Conditional Access
|
|
250
304
|
notice is not, because that policy is configured per tenant and the home
|
|
251
|
-
tenant can adopt it like any other.
|
|
305
|
+
tenant can adopt it like any other. Neither is the missing-service-principal
|
|
306
|
+
notice: it names the tenant Entra refused, which it carries in its own text,
|
|
307
|
+
so it stays diagnostic on the paths where the caller resolved no tenant at all.
|
|
252
308
|
"""
|
|
253
309
|
from dxs.utils.errors import AuthenticationError
|
|
254
310
|
|
|
@@ -266,6 +322,22 @@ def map_login_failure(
|
|
|
266
322
|
"If you are on a remote host, sign in locally and copy ~/.datex/credentials.yaml",
|
|
267
323
|
],
|
|
268
324
|
)
|
|
325
|
+
if is_missing_service_principal_error(combined):
|
|
326
|
+
tenant = tenant_id or missing_service_principal_tenant(combined) or ""
|
|
327
|
+
consent_hint = "dxs auth consent" + (f" --tenant-id {tenant}" if tenant else "")
|
|
328
|
+
return AuthenticationError(
|
|
329
|
+
message=render_missing_service_principal_notice(tenant, domain),
|
|
330
|
+
code="DXS-AUTH-030",
|
|
331
|
+
suggestions=[
|
|
332
|
+
"dxs init --domain wavelength<org>.onmicrosoft.com "
|
|
333
|
+
"# sign in against the tenant Datex provisioned for you",
|
|
334
|
+
"Sign in there with the same work email — the tenant only decides which "
|
|
335
|
+
"directory issues the token, not which credentials you type",
|
|
336
|
+
"Ask Datex support which Entra tenant your organization signs in against",
|
|
337
|
+
"If your organization does sign in with its own tenant, a tenant admin "
|
|
338
|
+
f"must grant consent first: {consent_hint}",
|
|
339
|
+
],
|
|
340
|
+
)
|
|
269
341
|
if not external:
|
|
270
342
|
return error
|
|
271
343
|
if upn and is_guest_account_error(combined):
|
|
@@ -286,6 +358,58 @@ def map_login_failure(
|
|
|
286
358
|
return error
|
|
287
359
|
|
|
288
360
|
|
|
361
|
+
def apply_sign_in_tenant_hint(
|
|
362
|
+
error: "AuthenticationError",
|
|
363
|
+
*,
|
|
364
|
+
requested_tenant: str,
|
|
365
|
+
sign_in: "SignInTenant | None",
|
|
366
|
+
) -> "AuthenticationError":
|
|
367
|
+
"""Replace the generic AADSTS650052 advice with this org's actual tenant.
|
|
368
|
+
|
|
369
|
+
:func:`map_login_failure` can only describe the *shape* of the fix, since
|
|
370
|
+
nothing local knows which directory a given organization signs in against.
|
|
371
|
+
Given Quartermaster's answer, the advice collapses to one command — or, when
|
|
372
|
+
the tenant that refused the login is the right one after all, to the consent
|
|
373
|
+
route instead. ``sign_in`` of None (unknown org, service unreachable, older
|
|
374
|
+
service) leaves the generic notice exactly as it was.
|
|
375
|
+
"""
|
|
376
|
+
from dxs.utils.errors import AuthenticationError
|
|
377
|
+
|
|
378
|
+
if sign_in is None:
|
|
379
|
+
return error
|
|
380
|
+
|
|
381
|
+
if sign_in.tenant_id.strip().lower() == requested_tenant.strip().lower():
|
|
382
|
+
return AuthenticationError(
|
|
383
|
+
message=(
|
|
384
|
+
f"AADSTS650052: {requested_tenant} is the tenant your organization signs in "
|
|
385
|
+
"against, so the Datex apps have simply never been consented there — no "
|
|
386
|
+
"service principal for them exists in it yet."
|
|
387
|
+
),
|
|
388
|
+
code="DXS-AUTH-030",
|
|
389
|
+
suggestions=[
|
|
390
|
+
f"A tenant admin runs once: dxs auth consent --tenant-id {requested_tenant}",
|
|
391
|
+
"A blank Microsoft page carrying admin_consent=True is success, not a failure",
|
|
392
|
+
"Then retry the login",
|
|
393
|
+
],
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
target = sign_in.domain or sign_in.tenant_id
|
|
397
|
+
flag = f"--domain {sign_in.domain}" if sign_in.domain else f"--tenant-id {sign_in.tenant_id}"
|
|
398
|
+
return AuthenticationError(
|
|
399
|
+
message=(
|
|
400
|
+
f"AADSTS650052: your organization signs in against {target}, not tenant "
|
|
401
|
+
f"{requested_tenant} — that one is only where your work-email domain resolves, "
|
|
402
|
+
"and the Datex apps do not exist in it."
|
|
403
|
+
),
|
|
404
|
+
code="DXS-AUTH-030",
|
|
405
|
+
suggestions=[
|
|
406
|
+
f"dxs init {flag}",
|
|
407
|
+
"Sign in there with the same work email — you are a guest in that directory, so "
|
|
408
|
+
"your own organization's credentials still apply",
|
|
409
|
+
],
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
|
|
289
413
|
def browser_allowed(no_browser: bool = False) -> bool:
|
|
290
414
|
"""Whether login chrome may open (or be) a browser.
|
|
291
415
|
|
|
@@ -109,8 +109,18 @@ class QuartermasterClient:
|
|
|
109
109
|
|
|
110
110
|
# -- requests --------------------------------------------------------
|
|
111
111
|
|
|
112
|
-
def _request(
|
|
113
|
-
|
|
112
|
+
def _request(
|
|
113
|
+
self, path: str, params: dict[str, Any] | None, accept: str, *, anonymous: bool = False
|
|
114
|
+
) -> httpx.Response:
|
|
115
|
+
"""``anonymous`` omits the bearer entirely — not merely optional.
|
|
116
|
+
|
|
117
|
+
The bootstrap route (`/tenants/v1/signin-tenant`) is reached while a
|
|
118
|
+
login is failing, so there is no token to attach and asking for one
|
|
119
|
+
would raise where the caller needs an answer or a shrug.
|
|
120
|
+
"""
|
|
121
|
+
headers = {"Accept": accept}
|
|
122
|
+
if not anonymous:
|
|
123
|
+
headers["Authorization"] = f"Bearer {get_access_token()}"
|
|
114
124
|
try:
|
|
115
125
|
response = self._http().get(path, params=params, headers=headers)
|
|
116
126
|
except httpx.HTTPError as exc:
|
|
@@ -162,8 +172,10 @@ class QuartermasterClient:
|
|
|
162
172
|
status_code=status,
|
|
163
173
|
)
|
|
164
174
|
|
|
165
|
-
def get_json(
|
|
166
|
-
|
|
175
|
+
def get_json(
|
|
176
|
+
self, path: str, params: dict[str, Any] | None = None, *, anonymous: bool = False
|
|
177
|
+
) -> Any:
|
|
178
|
+
response = self._request(path, params, "application/json", anonymous=anonymous)
|
|
167
179
|
try:
|
|
168
180
|
return response.json()
|
|
169
181
|
except ValueError as exc:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Which Entra tenant an organization signs in against (`/tenants/v1/`).
|
|
2
|
+
|
|
3
|
+
The bootstrap half of the AADSTS650052 recovery: a work-email domain resolves,
|
|
4
|
+
through Entra's public discovery document, to the caller's own corporate
|
|
5
|
+
tenant — which for every org Datex provisioned a `wavelength<org>.onmicrosoft.com`
|
|
6
|
+
tenant for is the wrong directory. Quartermaster holds the org records that map
|
|
7
|
+
one to the other and answers anonymously, which is what makes it reachable from
|
|
8
|
+
a login that has just failed.
|
|
9
|
+
|
|
10
|
+
Every failure is a shrug. This runs on an error path, after a login already
|
|
11
|
+
failed with a diagnosis in hand: a Quartermaster that is down, slow, blocked by
|
|
12
|
+
a corporate proxy, older than this CLI, or simply not configured must leave that
|
|
13
|
+
diagnosis alone rather than replace it with a worse one.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
|
|
20
|
+
from dxs.core.quartermaster.client import QuartermasterClient
|
|
21
|
+
|
|
22
|
+
# Short on purpose: a failed login is already waiting on this.
|
|
23
|
+
_TIMEOUT_SECONDS = 5.0
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class SignInTenant:
|
|
28
|
+
"""The directory an org authenticates against; ``domain`` when one is recorded."""
|
|
29
|
+
|
|
30
|
+
tenant_id: str
|
|
31
|
+
domain: str | None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def lookup_sign_in_tenant(tenant_id: str) -> SignInTenant | None:
|
|
35
|
+
"""Resolve ``tenant_id`` to the tenant its organization signs in against.
|
|
36
|
+
|
|
37
|
+
Returns None for every failure and for an unrecognized tenant — callers use
|
|
38
|
+
it to sharpen an error, never to decide whether one occurred.
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
with QuartermasterClient(timeout=_TIMEOUT_SECONDS) as client:
|
|
42
|
+
body = client.get_json(
|
|
43
|
+
"/tenants/v1/signin-tenant", {"tenant": tenant_id}, anonymous=True
|
|
44
|
+
)
|
|
45
|
+
except Exception: # noqa: BLE001 - best-effort by contract; see module docstring
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
if not isinstance(body, dict):
|
|
49
|
+
return None
|
|
50
|
+
resolved = body.get("sign_in_tenant_id")
|
|
51
|
+
if not isinstance(resolved, str) or not resolved.strip():
|
|
52
|
+
return None
|
|
53
|
+
domain = body.get("sign_in_domain")
|
|
54
|
+
return SignInTenant(
|
|
55
|
+
tenant_id=resolved.strip(),
|
|
56
|
+
domain=domain.strip() if isinstance(domain, str) and domain.strip() else None,
|
|
57
|
+
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--Xsbcf46McNo4ycd40X4z0--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/360c657de5e04df8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-2b297ada5306c17f.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-102f2e5b2e3dc2ef.js" async=""></script><script src="/_next/static/chunks/main-app-694cf3568b6c9fa9.js" async=""></script><script src="/_next/static/chunks/909-c88abba3cf0caec3.js" async=""></script><script src="/_next/static/chunks/697-0e000ab410d9f470.js" async=""></script><script src="/_next/static/chunks/app/layout-cec86f90e385371d.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Datex FDE Agent Console</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-background text-foreground h-screen overflow-hidden flex flex-col"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div class="flex flex-col h-full overflow-hidden"><header class="flex-shrink-0 border-b px-4 py-4 flex items-center gap-3"><button class="p-1 rounded-md hover:bg-accent" aria-label="Toggle navigation"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu h-5 w-5" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><h1 class="text-xl font-semibold tracking-tight">Datex FDE Agent Console</h1><div class="ml-auto"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9" disabled=""></button></div></header><div class="flex flex-1 min-h-0"><aside class="hidden md:flex flex-col border-r bg-background flex-shrink-0 transition-[width] duration-200 w-0 overflow-hidden"><nav class="flex flex-col gap-1 p-2"><button class="flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground bg-accent text-accent-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-table h-4 w-4" aria-hidden="true"><path d="M12 3v18"></path><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 9h18"></path><path d="M3 15h18"></path></svg>Data Studio</button><button class="flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette h-4 w-4" aria-hidden="true"><path d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"></path><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle></svg>Report Designer</button></nav></aside><main class="flex-1 min-h-0 min-w-0 overflow-hidden"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div></div><script src="/_next/static/chunks/webpack-2b297ada5306c17f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[3479,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"ThemeProvider\"]\n3:I[2308,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"default\"]\n4:I[9766,[],\"\"]\n5:I[8924,[],\"\"]\n6:I[4431,[],\"OutletBoundary\"]\n8:I[5278,[],\"AsyncMetadataOutlet\"]\na:I[4431,[],\"ViewportBoundary\"]\nc:I[4431,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7150,[],\"\"]\n:HL[\"/_next/static/css/360c657de5e04df8.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Xsbcf46McNo4ycd40X4z0\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/360c657de5e04df8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"bg-background text-foreground h-screen overflow-hidden flex flex-col\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Datex FDE Agent Console\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--Xsbcf46McNo4ycd40X4z0--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/360c657de5e04df8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-2b297ada5306c17f.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-102f2e5b2e3dc2ef.js" async=""></script><script src="/_next/static/chunks/main-app-694cf3568b6c9fa9.js" async=""></script><script src="/_next/static/chunks/909-c88abba3cf0caec3.js" async=""></script><script src="/_next/static/chunks/697-0e000ab410d9f470.js" async=""></script><script src="/_next/static/chunks/app/layout-cec86f90e385371d.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Datex FDE Agent Console</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-background text-foreground h-screen overflow-hidden flex flex-col"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div class="flex flex-col h-full overflow-hidden"><header class="flex-shrink-0 border-b px-4 py-4 flex items-center gap-3"><button class="p-1 rounded-md hover:bg-accent" aria-label="Toggle navigation"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu h-5 w-5" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><h1 class="text-xl font-semibold tracking-tight">Datex FDE Agent Console</h1><div class="ml-auto"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9" disabled=""></button></div></header><div class="flex flex-1 min-h-0"><aside class="hidden md:flex flex-col border-r bg-background flex-shrink-0 transition-[width] duration-200 w-0 overflow-hidden"><nav class="flex flex-col gap-1 p-2"><button class="flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground bg-accent text-accent-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-table h-4 w-4" aria-hidden="true"><path d="M12 3v18"></path><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 9h18"></path><path d="M3 15h18"></path></svg>Data Studio</button><button class="flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette h-4 w-4" aria-hidden="true"><path d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"></path><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"></circle><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"></circle><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"></circle><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"></circle></svg>Report Designer</button></nav></aside><main class="flex-1 min-h-0 min-w-0 overflow-hidden"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div></div><script src="/_next/static/chunks/webpack-2b297ada5306c17f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[3479,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"ThemeProvider\"]\n3:I[2308,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"default\"]\n4:I[9766,[],\"\"]\n5:I[8924,[],\"\"]\n6:I[4431,[],\"OutletBoundary\"]\n8:I[5278,[],\"AsyncMetadataOutlet\"]\na:I[4431,[],\"ViewportBoundary\"]\nc:I[4431,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7150,[],\"\"]\n:HL[\"/_next/static/css/360c657de5e04df8.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Xsbcf46McNo4ycd40X4z0\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/360c657de5e04df8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"bg-background text-foreground h-screen overflow-hidden flex flex-col\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Datex FDE Agent Console\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
|
{datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/capture/index.html
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--Xsbcf46McNo4ycd40X4z0--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/360c657de5e04df8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-2b297ada5306c17f.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-102f2e5b2e3dc2ef.js" async=""></script><script src="/_next/static/chunks/main-app-694cf3568b6c9fa9.js" async=""></script><script src="/_next/static/chunks/909-c88abba3cf0caec3.js" async=""></script><script src="/_next/static/chunks/697-0e000ab410d9f470.js" async=""></script><script src="/_next/static/chunks/app/layout-cec86f90e385371d.js" async=""></script><script src="/_next/static/chunks/0b24cca5-c1e1c8810348f107.js" async=""></script><script src="/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js" async=""></script><script src="/_next/static/chunks/538-b06224e65f71c9a1.js" async=""></script><script src="/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js" async=""></script><title>Datex FDE Agent Console</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-background text-foreground h-screen overflow-hidden flex flex-col"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div>No report open</div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-2b297ada5306c17f.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[3479,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"ThemeProvider\"]\n3:I[2308,[\"909\",\"static/chunks/909-c88abba3cf0caec3.js\",\"697\",\"static/chunks/697-0e000ab410d9f470.js\",\"177\",\"static/chunks/app/layout-cec86f90e385371d.js\"],\"default\"]\n4:I[9766,[],\"\"]\n5:I[8924,[],\"\"]\n6:I[1959,[],\"ClientPageRoot\"]\n7:I[6743,[\"903\",\"static/chunks/0b24cca5-c1e1c8810348f107.js\",\"507\",\"static/chunks/8b8f67fc-6295949a4b5485a4.js\",\"538\",\"static/chunks/538-b06224e65f71c9a1.js\",\"672\",\"static/chunks/app/design/capture/page-c083dc9f01f32a04.js\"],\"default\"]\na:I[4431,[],\"OutletBoundary\"]\nc:I[5278,[],\"AsyncMetadataOutlet\"]\ne:I[4431,[],\"ViewportBoundary\"]\n10:I[4431,[],\"MetadataBoundary\"]\n11:\"$Sreact.suspense\"\n13:I[7150,[],\"\"]\n:HL[\"/_next/static/css/360c657de5e04df8.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Xsbcf46McNo4ycd40X4z0\",\"p\":\"\",\"c\":[\"\",\"design\",\"capture\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"design\",{\"children\":[\"capture\",{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/360c657de5e04df8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"bg-background text-foreground h-screen overflow-hidden flex flex-col\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}],{\"children\":[\"design\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"capture\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"Component\":\"$7\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@8\",\"$@9\"]}],null,[\"$\",\"$La\",null,{\"children\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"promise\":\"$@d\"}]]}]]}],{},null,false]},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],null],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$11\",null,{\"fallback\":null,\"children\":\"$L12\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$13\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:{}\n9:\"$0:f:0:1:2:children:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nb:null\n"])</script><script>self.__next_f.push([1,"d:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Datex FDE Agent Console\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"12:\"$d:metadata\"\n"])</script></body></html>
|
{datex_studio_cli-0.5.2 → datex_studio_cli-0.5.3}/src/dxs/web/static/design/capture/index.txt
RENAMED
|
@@ -12,7 +12,7 @@ e:I[4431,[],"ViewportBoundary"]
|
|
|
12
12
|
11:"$Sreact.suspense"
|
|
13
13
|
13:I[7150,[],""]
|
|
14
14
|
:HL["/_next/static/css/360c657de5e04df8.css","style"]
|
|
15
|
-
0:{"P":null,"b":"
|
|
15
|
+
0:{"P":null,"b":"Xsbcf46McNo4ycd40X4z0","p":"","c":["","design","capture",""],"i":false,"f":[[["",{"children":["design",{"children":["capture",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/360c657de5e04df8.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"bg-background text-foreground h-screen overflow-hidden flex flex-col","children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]}]]}],{"children":["design",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["capture",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","searchParams":{},"params":{},"promises":["$@8","$@9"]}],null,["$","$La",null,{"children":["$Lb",["$","$Lc",null,{"promise":"$@d"}]]}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Le",null,{"children":"$Lf"}],null],["$","$L10",null,{"children":["$","div",null,{"hidden":true,"children":["$","$11",null,{"fallback":null,"children":"$L12"}]}]}]]}],false]],"m":"$undefined","G":["$13",[]],"s":false,"S":true}
|
|
16
16
|
8:{}
|
|
17
17
|
9:"$0:f:0:1:2:children:2:children:2:children:1:props:children:0:props:params"
|
|
18
18
|
f:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|