typedef-data-intelligence 0.26.2__tar.gz → 0.28.0__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.
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/CHANGELOG.md +32 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/PKG-INFO +2 -1
- typedef_data_intelligence-0.28.0/docs/reference/SEMANTIC_DIFF_HARNESS.md +130 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/pyproject.toml +3 -1
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/app.py +86 -29
- typedef_data_intelligence-0.28.0/src/lineage/api/controlplane_identity.py +77 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_context.py +2 -1
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_quickstart.py +278 -31
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_setup.py +421 -325
- typedef_data_intelligence-0.28.0/src/lineage/api/desktop_sync.py +2637 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_wizard_sync.py +2 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_workspaces.py +1325 -165
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_worktree.py +949 -330
- typedef_data_intelligence-0.28.0/src/lineage/api/posthog_analytics.py +351 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/pydantic.py +2 -6
- typedef_data_intelligence-0.28.0/src/lineage/context_projects/__init__.py +18 -0
- typedef_data_intelligence-0.28.0/src/lineage/context_projects/dbt_plugin.py +463 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/ephemeral_lineage_report.py +3 -4
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/runner.py +7 -1
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/__init__.py +1 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/cli.py +186 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/db_names.py +82 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/dbt_compile.py +87 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/diff_runner.py +63 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/fixtures/column_rename_downstream/fixture.yaml +18 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/fixtures/column_rename_downstream/mutation.diff +469 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/fixtures_loader.py +107 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/ingest.py +51 -0
- typedef_data_intelligence-0.28.0/src/lineage/devtools/unified_graph/semantic_diff/source_prep.py +88 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/unified_graph/surreal/desktop_mcp.py +202 -64
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/unified_graph/unified_cli.py +40 -2
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/mcp/runner.py +14 -10
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/typedef_cli.py +2 -2
- typedef_data_intelligence-0.28.0/src/lineage/utils/dbt_profile.py +306 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_context_reader_cache.py +22 -18
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_databricks_setup.py +167 -17
- typedef_data_intelligence-0.28.0/tests/api/test_desktop_posthog.py +1289 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_quickstart.py +33 -18
- typedef_data_intelligence-0.28.0/tests/api/test_desktop_setup_env_vars.py +58 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_sync.py +107 -49
- typedef_data_intelligence-0.28.0/tests/api/test_desktop_sync_render_profile.py +353 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_telemetry.py +89 -2
- typedef_data_intelligence-0.28.0/tests/api/test_desktop_workspaces_adopt.py +156 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_integrations.py +8 -6
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_preview_name.py +1 -1
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_projects_and_repos.py +35 -23
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_r3_r10.py +52 -12
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_summary.py +27 -62
- typedef_data_intelligence-0.28.0/tests/api/test_desktop_workspaces_wizard.py +176 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_worktree.py +12 -18
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_worktree_clone.py +13 -36
- typedef_data_intelligence-0.28.0/tests/api/test_target_envelope_reads.py +117 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_wizard_create_project_integration_persistence.py +3 -3
- typedef_data_intelligence-0.28.0/tests/api/test_workspace_clone_settings.py +288 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_worktree_registry_workspaces_shape.py +117 -18
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/backends/lineage/test_search_enum_coverage.py +1 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/conftest.py +0 -24
- typedef_data_intelligence-0.28.0/tests/docs/test_desktop_posthog_event_docs.py +213 -0
- typedef_data_intelligence-0.28.0/tests/integration/test_semantic_diff_harness.py +70 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/mcp/test_desktop_mcp_retry.py +114 -48
- typedef_data_intelligence-0.28.0/tests/mcp/test_list_projects.py +220 -0
- typedef_data_intelligence-0.28.0/tests/unit/context_projects/test_dbt_plugin.py +418 -0
- typedef_data_intelligence-0.28.0/tests/unit/devtools/test_semdiff_harness_units.py +418 -0
- typedef_data_intelligence-0.28.0/tests/unit/utils/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/unit/utils/test_dbt_docs_generate.py +29 -0
- typedef_data_intelligence-0.28.0/tests/unit/utils/test_dbt_profile.py +315 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/unit/utils/test_run_dbt_command.py +56 -0
- typedef_data_intelligence-0.26.2/src/lineage/api/desktop_projects.py +0 -1317
- typedef_data_intelligence-0.26.2/src/lineage/api/desktop_sync.py +0 -1553
- typedef_data_intelligence-0.26.2/tests/api/test_desktop_projects.py +0 -1785
- typedef_data_intelligence-0.26.2/tests/api/test_desktop_projects_env_vars.py +0 -7
- typedef_data_intelligence-0.26.2/tests/api/test_desktop_workspaces_wizard.py +0 -76
- typedef_data_intelligence-0.26.2/tests/api/test_workspace_schema_write_targets.py +0 -363
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/.dockerignore +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/.env.example +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/.gitignore +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/.justfile_help.txt +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/Dockerfile +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/Dockerfile.dev +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/Justfile +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/MODEL_USAGE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/README.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/README.pypi.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/config.api.yml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/config.cli.yml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/config.desktop.yml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/config.ingest.unified.yml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/config.ingest.yml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docker-entrypoint.dev.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/LINEAR_TICKETING_BACKEND.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/BUSINESS_CONCEPT_INDEX.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/CLUSTERING_ALGORITHM_DECISION.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/GENERIC_REPORT_SCHEMA.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/HYBRID_ANALYSIS_ARCHITECTURE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/PHASE2_IR_STITCHING.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/PIPELINE_PRIMITIVES_USECASES.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/SALESFORCE_REPORT_IR.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/SEMANTIC_JOIN_RESOLUTION.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/architecture/SEMANTIC_SCHEMA_DESIGN.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/AGENT_DESIGN_NOTES.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/COLUMN_PROFILING.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/COLUMN_PROFILING_IMPLEMENTATION.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/EXTRACTION_DETECTION.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/PERFORMANCE_AND_QUALITY_SPECIALISTS.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/design/STREAMING_SUBAGENT_ARCHITECTURE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/examples/memory_usage_examples.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/examples/pydantic_tool_customization_example.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/ADDING_LINEAGE_BACKEND.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/AGENT_USER_GUIDE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/CLI_USAGE_EXAMPLES.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/GETTING_STARTED.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/MEMORY_SYSTEM.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/MIGRATION_THREE_SQL.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/SALESFORCE_AUTH.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/SCOPE_LEVEL_LINEAGE_GUIDE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/SEMANTIC_DIMENSIONS_GUIDE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/docs/reference/TYPE_ENUMS.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/pytest.ini +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/create_salesforce_reports.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/data_generation/utils.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/databricks-smoke.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/delete_salesforce_reports.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/populate_salesforce_schema.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/replay_events.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/reset_demo_git_workspace.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/reset_demo_linear.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/snowflake_server.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/surreal-engine-bench.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/surreal-fts-b2-corpus.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/surreal-fts-bench.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/surreal-fts-quality.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/scripts/tui/pilotty-smoke.sh +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/snowflake-mcp-config.yaml +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/auth_context.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/collector.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/concept_cards.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_agents.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/desktop_runtime.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/graph_availability.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/ontology.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/semantic_runtime.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/cli.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/clustering_metrics.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/drop_snowflake_tables.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/eval_clustering.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/list_ephemeral_models.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/refingerprint_cache.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/regen_semantic_goldens.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/reset_git_workspace.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/reset_linear_workspace.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/reset_project.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/run_dbt_workflow.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/semantic_goldens.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_bench.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_cells.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_corpus.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_corpus_dump.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_coverage.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_coverage_report.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_oracle.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_quality.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/fts_quality_bench.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/log_parse.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/surreal_bench/report.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/unified_graph/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/devtools/unified_graph/surreal/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/mcp/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/mcp/server.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/templates/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/templates/typedef_config.yaml.j2 +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/AGENTS.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/CLAUDE.md +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/app.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/backend.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/perf.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/activity.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/artifacts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/chat.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/daemon.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/help.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/key_inspector.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/placeholders.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/status.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/screens/tickets.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/styles.tcss +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/theme.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/artifact_types.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/builders.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/cell_renderers.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/formatters.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/helpers.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/artifacts/viewer.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/widgets/image.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/base.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/helpers.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/backend.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/config.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/cube.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/dbt_source.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/integration_base.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/linear.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/looker.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/project.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/salesforce.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/snowflake.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/init/steps/validation.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/project_selector.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/styles.tcss +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/tui/wizards/sync_progress.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/databricks.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/databricks_oauth.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/dbt.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/drop_snowflake_objects.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/env.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/git.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/gitignore.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/logging.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/run_snowflake_query.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/utils/snowflake.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_concept_cards.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_agents_runtime.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_clerk_auth.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_databricks_oauth.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_diagnostics.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_runtime.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_salesforce.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_save_env_credentials.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_search.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_setup.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_setup_clone.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_desktop_workspaces_delete.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_graph_availability_any_sentinel.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_health_readiness.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_surreal_graph_availability.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/api/test_validate_project_collisions.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/backends/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/backends/lineage/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/backends/lineage/test_surreal_search.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/test_fts_cells.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/test_fts_coverage.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/test_fts_quality.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/test_log_parse.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/devtools/surreal_bench/test_report.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/integration/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/mcp/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/mcp/test_server.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_dbt_venv_helpers.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_git_utils.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_gitignore_utils.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_helpers_semantic.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_model_tier_validation.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_sf_login_cli.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_template_yaml_escaping.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_typedef_cli_import_budget.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/test_unified_cli_airflow.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_activity_screen.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_chat_mode_switching.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_chat_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_copy_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_daemon_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_exit_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_startup_flow.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_app_tickets_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_artifact_viewer_icons.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_artifacts_screen.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_backend_manager_lifecycle.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_chat_activity_modal_guard.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_chat_agent_header.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_chat_artifact_viewer_mount_guard.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_chat_screen_input_behavior.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_chat_slash_commands.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_daemon_screen_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_daemon_screen_styling.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_diagnostics_widget.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_help_screen_shortcuts.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_key_inspector_screen.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_shortcuts_screen.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_status_bar_hints.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_status_screen.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_tickets_focus_styles.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_tickets_screen_styling.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_tui_perf_logging.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_wizard_async_auto_advance.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/tui/test_wizard_style_parity.py +0 -0
- {typedef_data_intelligence-0.26.2/tests/unit/formula → typedef_data_intelligence-0.28.0/tests/unit/devtools}/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2/tests/unit/utils → typedef_data_intelligence-0.28.0/tests/unit/formula}/__init__.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/unit/utils/test_databricks_utils.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/unit/utils/test_logging.py +0 -0
- {typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/tests/unit/utils/test_snowflake_utils.py +0 -0
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.28.0](https://github.com/typedef-ai/typedef/compare/typedef-data-intelligence-v0.27.0...typedef-data-intelligence-v0.28.0) (2026-06-02)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **typedef-desktop:** context project model + kind contract design + migrating dbt projects ([#800](https://github.com/typedef-ai/typedef/issues/800)) ([7cb7e6b](https://github.com/typedef-ai/typedef/commit/7cb7e6b7580bccbc9984289c4c0fa409b98f0929))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **desktop:** preserve PostHog fields ([#811](https://github.com/typedef-ai/typedef/issues/811)) ([151626f](https://github.com/typedef-ai/typedef/commit/151626f32fc6b4733841cb20273d1be5aaebd698))
|
|
14
|
+
|
|
15
|
+
## [0.27.0](https://github.com/typedef-ai/typedef/compare/typedef-data-intelligence-v0.26.2...typedef-data-intelligence-v0.27.0) (2026-06-02)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Miscellaneous Chores
|
|
19
|
+
|
|
20
|
+
* **lineage:** semantic graph diff realistic mutation harness (TD-3110) ([#806](https://github.com/typedef-ai/typedef/issues/806)) ([217509f](https://github.com/typedef-ai/typedef/commit/217509f2190728bcb6a8fae8731d61612823c3d0))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Features
|
|
24
|
+
|
|
25
|
+
* add posthog analytics ([#736](https://github.com/typedef-ai/typedef/issues/736)) ([63c1d50](https://github.com/typedef-ai/typedef/commit/63c1d506dc6858d4ee49c59b8351eff8c31ba45f))
|
|
26
|
+
* **td-2962:** multi-project configuration (settings UI + wizard rewrite) ([#770](https://github.com/typedef-ai/typedef/issues/770)) ([dc900d3](https://github.com/typedef-ai/typedef/commit/dc900d38e2bd7411587caf6408ab69b77045e6cf))
|
|
27
|
+
* **td-3185:** per-project dbt-package systems + nested L2 rendering ([#799](https://github.com/typedef-ai/typedef/issues/799)) ([dd81bdc](https://github.com/typedef-ai/typedef/commit/dd81bdc8fd316e2fce5a2fca239987cf3d75193e))
|
|
28
|
+
* **typedef-desktop multi-project:** selective graph ingest (td-2802) ([#721](https://github.com/typedef-ai/typedef/issues/721)) ([e150054](https://github.com/typedef-ai/typedef/commit/e150054bedf5ab900e7e769ebbcd467277ba4978))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Code Refactoring
|
|
32
|
+
|
|
33
|
+
* **remove-legacy:** PR-6 — remove legacy projects synthesis (TD-2959 milestone 1) ([#796](https://github.com/typedef-ai/typedef/issues/796)) ([4445f9a](https://github.com/typedef-ai/typedef/commit/4445f9ae33125bc1ea1f26b5440fce44feb9bd7e))
|
|
34
|
+
|
|
3
35
|
## [0.26.2](https://github.com/typedef-ai/typedef/compare/typedef-data-intelligence-v0.26.1...typedef-data-intelligence-v0.26.2) (2026-05-30)
|
|
4
36
|
|
|
5
37
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: typedef-data-intelligence
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.28.0
|
|
4
4
|
Summary: Unified lineage management and AI-powered analytics platform for dbt projects
|
|
5
5
|
Project-URL: Homepage, https://typedef.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/typedef-ai/data-intelligence
|
|
@@ -40,6 +40,7 @@ Requires-Dist: networkx>=3.6
|
|
|
40
40
|
Requires-Dist: openlineage-dbt>=1.39.0
|
|
41
41
|
Requires-Dist: openlineage-python
|
|
42
42
|
Requires-Dist: plotly>=6.3.1
|
|
43
|
+
Requires-Dist: posthog>=7.9.7
|
|
43
44
|
Requires-Dist: pydantic-ai-skills>=0.5.1
|
|
44
45
|
Requires-Dist: pydantic-ai-todo>=0.1.10
|
|
45
46
|
Requires-Dist: pydantic-ai<1.82.0,>=1.66.0
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Semantic Graph Diff Mutation Harness (TD-3110)
|
|
2
|
+
|
|
3
|
+
The harness applies a scripted, realistic dbt source mutation, rebuilds the
|
|
4
|
+
graph through the normal **structural** sync path into two throwaway SurrealDB
|
|
5
|
+
databases, runs the landed semantic-diff engine, and writes deterministic
|
|
6
|
+
JSON + Markdown diff artifacts. Its output is grounding evidence for
|
|
7
|
+
[TD-3193](https://linear.app/typedef-ai/issue/TD-3193) (compaction +
|
|
8
|
+
blast-radius summaries): the raw, uncompacted noise profile of a real refactor.
|
|
9
|
+
|
|
10
|
+
It consumes the public diff API
|
|
11
|
+
(`core.backends.unified_graph.semantic_diff`) — it does **not** reimplement
|
|
12
|
+
snapshot or diff logic.
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- **`TYPEDEF_HOME=~/.typedef-desktop`** must be exported. Without it,
|
|
17
|
+
`repos_dir()` and the dbt-adapter venv resolve to the empty `~/.typedef`.
|
|
18
|
+
(The `just` recipe and the CLI both default it.)
|
|
19
|
+
- The **SurrealDB sidecar** must be running at `ws://127.0.0.1:3567`
|
|
20
|
+
(namespace `lineage`, auth `root`/`root`). The embedded `surrealkv://`
|
|
21
|
+
fallback opens an empty store and must not be used.
|
|
22
|
+
- **Git access** to the fixture's `git_url` — either already pooled locally at
|
|
23
|
+
`repos_dir() / hash_git_url(git_url)` or cloneable fresh.
|
|
24
|
+
- **Snowflake credentials** for the `dbt compile` step only. Structural ingest
|
|
25
|
+
itself is offline (no profiling, no warehouse sampling, no LLM). The default
|
|
26
|
+
dbt profile is resolved from the project key
|
|
27
|
+
(`~/.typedef-desktop/profiles/<project>/context/<project>/`); override with
|
|
28
|
+
`--profiles-dir`. The harness reads the rendered `profiles.yml`'s top-level
|
|
29
|
+
key and passes it via `--profile` (the desktop re-renders that key, so it is
|
|
30
|
+
not assumed).
|
|
31
|
+
|
|
32
|
+
## Run
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
just semantic-diff-harness column_rename_downstream
|
|
36
|
+
# or, with options:
|
|
37
|
+
TYPEDEF_HOME=~/.typedef-desktop uv run lineage-semantic-diff-harness \
|
|
38
|
+
--fixture column_rename_downstream
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Useful flags: `--project` / `--profiles-dir` (creds lookup), `--gold-db` /
|
|
42
|
+
`--candidate-db` (override the throwaway DB names), `--out-dir`, `--reuse-gold`
|
|
43
|
+
(skip rebuilding gold when its DB already has data), `--save-reference` (copy
|
|
44
|
+
the reports into the fixture dir as a checked-in golden), `--keep-work` (keep
|
|
45
|
+
the temp gold/candidate checkouts for inspection; by default they are removed
|
|
46
|
+
on exit so repeated runs don't leak `$TMPDIR`).
|
|
47
|
+
|
|
48
|
+
The derived throwaway DB names embed the fixture's short `base_commit` hash
|
|
49
|
+
(`semdiff_<case>_<base8>_{gold,cand}`), so bumping a fixture's `base_commit`
|
|
50
|
+
lands in a fresh gold DB — `--reuse-gold` never silently reuses a graph built
|
|
51
|
+
from the old base.
|
|
52
|
+
|
|
53
|
+
**Exit codes** (the harness is usable as a verification gate):
|
|
54
|
+
|
|
55
|
+
- `0` — every `expected_change_kind` was observed.
|
|
56
|
+
- `2` — verification mismatch (an expected change kind was not produced) or an
|
|
57
|
+
unknown `--fixture` name. The mismatch is also logged as a warning; available
|
|
58
|
+
fixtures are listed on an unknown name and in `--help`.
|
|
59
|
+
|
|
60
|
+
At mattermost scale a full run (build gold + candidate, both via
|
|
61
|
+
`dbt deps`+`compile`, then structural ingest, then diff) is **~6–7 minutes** —
|
|
62
|
+
the two Snowflake compiles dominate.
|
|
63
|
+
|
|
64
|
+
## Artifacts
|
|
65
|
+
|
|
66
|
+
Written to `artifacts/semantic-diff/<fixture>/` (gitignored):
|
|
67
|
+
|
|
68
|
+
- `report.json` — the schema-v1 `DiffResult` serialization (output of record)
|
|
69
|
+
- `report.md` — human-readable report
|
|
70
|
+
- `raw_facts.json` — the raw fact-delta appendix (the noise profile for TD-3193)
|
|
71
|
+
|
|
72
|
+
## Determinism
|
|
73
|
+
|
|
74
|
+
The diff is deterministic for unchanged inputs at the **structural** level —
|
|
75
|
+
graph nodes, edges, and closures are byte-stable. This relies on the
|
|
76
|
+
order-independent `DbtProjector` (closure-root resolution and volatile-field
|
|
77
|
+
stripping, including the absolute per-checkout `compiled_path`) and
|
|
78
|
+
`include_generation_time=False`.
|
|
79
|
+
|
|
80
|
+
**Known residual:** a small set (~10) of warehouse-querying union models
|
|
81
|
+
(`base_*__tracks`) and `dbt_project_evaluator` models have **non-deterministic
|
|
82
|
+
`compiled_sql`** across independent `dbt compile` invocations — their
|
|
83
|
+
rudderstack union macros (`get_event_relations`) query
|
|
84
|
+
`information_schema.tables` with no `ORDER BY`, so the UNION branch set/order
|
|
85
|
+
varies per compile. Their `canonical_sql`/`fingerprint` differ only because the
|
|
86
|
+
compiled-SQL input does (the unified-graph canonicalization is itself
|
|
87
|
+
deterministic — verified). This is **upstream `dbt compile` non-determinism in
|
|
88
|
+
the dbt project**, not a harness, ingest, or diff-projector issue (~29 facts on
|
|
89
|
+
the mattermost fixture). Tracked separately (fix: add `ORDER BY` to the
|
|
90
|
+
project's `get_event_relations` macro). Structural facts are unaffected.
|
|
91
|
+
|
|
92
|
+
## Add a new mutation fixture
|
|
93
|
+
|
|
94
|
+
A fixture is `fixtures/<case>/` containing `mutation.diff` (a git patch) and
|
|
95
|
+
`fixture.yaml` (portable identifiers only):
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
name: <case>
|
|
99
|
+
description: <what the mutation does>
|
|
100
|
+
source:
|
|
101
|
+
git_url: git@github.com:org/repo # SSH form, no .git suffix
|
|
102
|
+
subproject: path/to/dbt_project # dbt project dir within the repo
|
|
103
|
+
base_commit: <full sha> # pinned
|
|
104
|
+
project: <typedef project key> # creds/profile lookup only
|
|
105
|
+
expected_change_kinds: [RemovedColumn, AddedColumn, ...]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
To author the patch:
|
|
109
|
+
|
|
110
|
+
1. `git worktree add /tmp/fx <base_commit>` from the pooled repo (or clone it).
|
|
111
|
+
2. Make a realistic, **consistent** source change (rename a column at its
|
|
112
|
+
definition **and** every reference, including `schema.yml`; the schema.yml
|
|
113
|
+
`columns:` entries feed the graph, so a SQL-only rename leaves a phantom
|
|
114
|
+
node). The change must keep the project compiling.
|
|
115
|
+
3. `git diff > fixtures/<case>/mutation.diff` (from the repo root, so paths are
|
|
116
|
+
repo-relative for `git apply`).
|
|
117
|
+
4. Write `fixtures/<case>/fixture.yaml` with portable identifiers only — never
|
|
118
|
+
a machine-local path or repo-id (the harness derives the local checkout via
|
|
119
|
+
`hash_git_url` or a fresh clone).
|
|
120
|
+
5. `uv run lineage-semantic-diff-harness --fixture <case>` and inspect
|
|
121
|
+
`report.md`.
|
|
122
|
+
|
|
123
|
+
Because `dbt compile` does not validate column existence, the **harness run
|
|
124
|
+
itself** is the verification: a clean rename shows the cascade (column
|
|
125
|
+
add/remove, lineage-edge churn, fingerprint changes) without orphan-lineage
|
|
126
|
+
artifacts.
|
|
127
|
+
|
|
128
|
+
The typedef project key affects only credential/profile lookup and is
|
|
129
|
+
overridable; it has **no bearing on the diff result** (gold and candidate share
|
|
130
|
+
the same dbt project name, hence the same `system_canonical_id`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "typedef-data-intelligence"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.28.0"
|
|
4
4
|
description = "Unified lineage management and AI-powered analytics platform for dbt projects"
|
|
5
5
|
readme = "README.pypi.md"
|
|
6
6
|
license = "LicenseRef-Proprietary"
|
|
@@ -48,6 +48,7 @@ dependencies = [
|
|
|
48
48
|
"dbt-snowflake>=1.7.0",
|
|
49
49
|
"openlineage-dbt>=1.39.0",
|
|
50
50
|
"openlineage-python",
|
|
51
|
+
"posthog>=7.9.7",
|
|
51
52
|
"textual>=6.6.0",
|
|
52
53
|
"pydantic-deep>=0.2.17",
|
|
53
54
|
"antlr4-python3-runtime>=4.13.0",
|
|
@@ -105,6 +106,7 @@ lineage-list-ephemerals = "lineage.devtools.list_ephemeral_models:main"
|
|
|
105
106
|
lineage-mcp = "lineage.mcp.runner:main"
|
|
106
107
|
lineage-unified-build = "lineage.devtools.unified_graph.unified_cli:main"
|
|
107
108
|
lineage-desktop-mcp = "lineage.devtools.unified_graph.surreal.desktop_mcp:main"
|
|
109
|
+
lineage-semantic-diff-harness = "lineage.devtools.unified_graph.semantic_diff.cli:main"
|
|
108
110
|
|
|
109
111
|
[build-system]
|
|
110
112
|
requires = ["hatchling"]
|
{typedef_data_intelligence-0.26.2 → typedef_data_intelligence-0.28.0}/src/lineage/api/app.py
RENAMED
|
@@ -266,8 +266,25 @@ async def lifespan(app: FastAPI):
|
|
|
266
266
|
|
|
267
267
|
# Run TD-2959 config migration before anything else reads UnifiedConfig.
|
|
268
268
|
# Idempotent: marker file at $TYPEDEF_HOME/migrations/td-2959.json
|
|
269
|
-
# short-circuits subsequent boots.
|
|
270
|
-
#
|
|
269
|
+
# short-circuits subsequent boots. This converts legacy ``main``-shape
|
|
270
|
+
# configs (top-level projects/data/default_project) into the workspaces
|
|
271
|
+
# schema in place — it is the ONLY remaining bridge for legacy configs
|
|
272
|
+
# now that the read-side synthesis was removed (PR 6 / TD-3074).
|
|
273
|
+
#
|
|
274
|
+
# DEFERRED — PR-6 / Phase 6 final cleanup (see
|
|
275
|
+
# docs/multi-project-milestone-1-design.md:115, "Group J Phase 6").
|
|
276
|
+
# That milestone scopes deletion of the *entire* legacy/migration
|
|
277
|
+
# scaffolding into PR 6: this ``run_migration`` path + ``repair_legacy_paths``
|
|
278
|
+
# + the ``core.migrations.td_2959`` module + ``apply_legacy_project_to_workspace``
|
|
279
|
+
# + the ``_drop_legacy_top_level_keys`` validator. We deliberately KEEP it
|
|
280
|
+
# here: the doc's "after PR 6 there is no migration" assumes the td-2959
|
|
281
|
+
# migration already shipped and ran in an earlier release, but this stack
|
|
282
|
+
# is unshipped — deleting the migration before it has run on installs would
|
|
283
|
+
# break legacy ``main``-shape configs on first upgrade.
|
|
284
|
+
# GATE for removal: only delete once the td-2959 migration has shipped +
|
|
285
|
+
# run in a released version (a published floor past which legacy configs
|
|
286
|
+
# are unsupported). At that point a legacy config should fail loudly at
|
|
287
|
+
# startup rather than silently boot with its projects dropped.
|
|
271
288
|
try:
|
|
272
289
|
from core.migrations.td_2959 import (
|
|
273
290
|
repair_legacy_paths,
|
|
@@ -331,6 +348,47 @@ async def lifespan(app: FastAPI):
|
|
|
331
348
|
missing,
|
|
332
349
|
)
|
|
333
350
|
|
|
351
|
+
# TD-3200 Phase 3: convert any already-workspaces-shape config from the
|
|
352
|
+
# pre-envelope ContextEntry/flat-LineageTarget shape to the
|
|
353
|
+
# ContextProject/BuildTarget envelope. Runs AFTER the TD-2959 step:
|
|
354
|
+
# a freshly-upgraded legacy config already lands in envelope shape (so
|
|
355
|
+
# this no-ops + stamps its marker), while a config migrated to
|
|
356
|
+
# workspaces shape by an earlier build (flat targets, code_projects,
|
|
357
|
+
# context_id) is reshaped in place here. Backup + marker guarded;
|
|
358
|
+
# idempotent. Outlives td_2959 (PR-6 deletes that module, not this).
|
|
359
|
+
from core.migrations.context_project import (
|
|
360
|
+
run_envelope_migration,
|
|
361
|
+
run_envelope_repair,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
envelope_report = run_envelope_migration()
|
|
365
|
+
if envelope_report.applied:
|
|
366
|
+
logger.info(
|
|
367
|
+
"TD-3200 envelope migration applied at startup: "
|
|
368
|
+
"%d context targets, %d worktree targets reshaped, "
|
|
369
|
+
"%d code_projects collections dropped, %d editable-only preserved",
|
|
370
|
+
envelope_report.reshaped_context_entries,
|
|
371
|
+
envelope_report.reshaped_worktree_targets,
|
|
372
|
+
envelope_report.dropped_code_projects,
|
|
373
|
+
envelope_report.preserved_editable_only,
|
|
374
|
+
)
|
|
375
|
+
elif envelope_report.errors:
|
|
376
|
+
logger.error(
|
|
377
|
+
"TD-3200 envelope migration errors: %s", envelope_report.errors
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
# Always-run, marker-less repair: strips stray build-state keys a buggy
|
|
381
|
+
# writer may have re-stamped onto an already-envelope target/entry
|
|
382
|
+
# after the one-shot migration ran. Cheap + idempotent (mirrors
|
|
383
|
+
# repair_legacy_paths).
|
|
384
|
+
repaired = run_envelope_repair()
|
|
385
|
+
if repaired:
|
|
386
|
+
logger.warning(
|
|
387
|
+
"TD-3200 envelope repair: moved stray build-state keys back "
|
|
388
|
+
"into state on %d context entr(ies)/worktree(s)",
|
|
389
|
+
repaired,
|
|
390
|
+
)
|
|
391
|
+
|
|
334
392
|
# No legacy projection needed — pre-PR-6 readers consume the
|
|
335
393
|
# synthesized ``UnifiedConfig.projects`` @property which reflects
|
|
336
394
|
# the active workspace on every read.
|
|
@@ -416,7 +474,7 @@ async def lifespan(app: FastAPI):
|
|
|
416
474
|
_ucfg_for_data = getattr(app.state, "unified_config", None)
|
|
417
475
|
if _ucfg_for_data is not None:
|
|
418
476
|
try:
|
|
419
|
-
_data_cfg = _ucfg_for_data.
|
|
477
|
+
_data_cfg = _ucfg_for_data.get_workspace_data_config(
|
|
420
478
|
_ucfg_for_data.default_project
|
|
421
479
|
)
|
|
422
480
|
app.state.standalone_data_backend = create_data_backend(
|
|
@@ -451,21 +509,18 @@ async def lifespan(app: FastAPI):
|
|
|
451
509
|
logger.info("Initialized standalone reports backend: %s", _reports_dir)
|
|
452
510
|
|
|
453
511
|
# Initialize ticket storage for desktop agents (OAuth or API key).
|
|
454
|
-
# Ticket config
|
|
455
|
-
#
|
|
512
|
+
# Ticket config resolves through the typed three-tier walk
|
|
513
|
+
# (context entry → workspace → installation), no legacy projects
|
|
514
|
+
# view.
|
|
456
515
|
_ucfg_for_tickets = getattr(app.state, "unified_config", None)
|
|
457
516
|
_ticket_cfg = None
|
|
458
517
|
if _ucfg_for_tickets is not None:
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
_ucfg_for_tickets.
|
|
462
|
-
if _dp and _ucfg_for_tickets.projects
|
|
463
|
-
else None
|
|
518
|
+
_resolved_ticket = _ucfg_for_tickets.resolve_ticket(
|
|
519
|
+
workspace_name=_ucfg_for_tickets.resolve_active_workspace(),
|
|
520
|
+
project_name=_ucfg_for_tickets.default_project,
|
|
464
521
|
)
|
|
465
|
-
if
|
|
466
|
-
_ticket_cfg =
|
|
467
|
-
elif _ucfg_for_tickets.ticket.enabled:
|
|
468
|
-
_ticket_cfg = _ucfg_for_tickets.ticket
|
|
522
|
+
if _resolved_ticket is not None and _resolved_ticket.enabled:
|
|
523
|
+
_ticket_cfg = _resolved_ticket
|
|
469
524
|
|
|
470
525
|
if _ticket_cfg is not None:
|
|
471
526
|
try:
|
|
@@ -682,6 +737,13 @@ async def lifespan(app: FastAPI):
|
|
|
682
737
|
"Failed to terminate active quickstart workers", exc_info=True
|
|
683
738
|
)
|
|
684
739
|
|
|
740
|
+
try:
|
|
741
|
+
from lineage.api.posthog_analytics import shutdown_shared_posthog_client
|
|
742
|
+
|
|
743
|
+
shutdown_shared_posthog_client()
|
|
744
|
+
except Exception:
|
|
745
|
+
logger.debug("Failed to shut down PostHog analytics client", exc_info=True)
|
|
746
|
+
|
|
685
747
|
# Close standalone data backend (e.g. DuckDB file handle)
|
|
686
748
|
standalone_db = getattr(app.state, "standalone_data_backend", None)
|
|
687
749
|
if standalone_db is not None:
|
|
@@ -795,16 +857,15 @@ def _create_linear_token_manager(cfg: UnifiedConfig):
|
|
|
795
857
|
from core.backends.config import LinearTicketConfig
|
|
796
858
|
from core.backends.tickets.factory import create_linear_token_manager_from_config
|
|
797
859
|
|
|
798
|
-
#
|
|
860
|
+
# Resolve the LinearTicketConfig via the typed three-tier walk
|
|
861
|
+
# (context entry → workspace → installation), no legacy projects view.
|
|
799
862
|
linear_cfg = None
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
if linear_cfg is None and isinstance(cfg.ticket, LinearTicketConfig):
|
|
807
|
-
linear_cfg = cfg.ticket
|
|
863
|
+
resolved_ticket = cfg.resolve_ticket(
|
|
864
|
+
workspace_name=cfg.resolve_active_workspace(),
|
|
865
|
+
project_name=cfg.default_project,
|
|
866
|
+
)
|
|
867
|
+
if isinstance(resolved_ticket, LinearTicketConfig):
|
|
868
|
+
linear_cfg = resolved_ticket
|
|
808
869
|
|
|
809
870
|
if linear_cfg is None:
|
|
810
871
|
return None
|
|
@@ -904,7 +965,7 @@ def initialize_app_state() -> AppState:
|
|
|
904
965
|
# Initialize data backend from project config
|
|
905
966
|
active_project = os.getenv("TYPEDEF_ACTIVE_PROJECT") or cfg.default_project
|
|
906
967
|
try:
|
|
907
|
-
data_config = cfg.
|
|
968
|
+
data_config = cfg.get_workspace_data_config(active_project)
|
|
908
969
|
except ValueError as exc:
|
|
909
970
|
raise RuntimeError(
|
|
910
971
|
"No data backend configuration found. "
|
|
@@ -915,7 +976,7 @@ def initialize_app_state() -> AppState:
|
|
|
915
976
|
|
|
916
977
|
# Get per-project git config if active project specified
|
|
917
978
|
git_config = None
|
|
918
|
-
if active_project and cfg.
|
|
979
|
+
if active_project and cfg.has_workspace_project(active_project):
|
|
919
980
|
git_config = cfg.get_project_git_config(active_project)
|
|
920
981
|
if git_config and git_config.enabled:
|
|
921
982
|
logger.info(f"📁 Git configuration loaded for project: {active_project}")
|
|
@@ -1256,9 +1317,6 @@ if _HAS_DESKTOP_API:
|
|
|
1256
1317
|
)
|
|
1257
1318
|
from agent.api.desktop_pty import router as desktop_pty_router # noqa: E402
|
|
1258
1319
|
from lineage.api.desktop_agents import router as desktop_agents_router # noqa: E402
|
|
1259
|
-
from lineage.api.desktop_projects import (
|
|
1260
|
-
router as desktop_projects_router, # noqa: E402
|
|
1261
|
-
)
|
|
1262
1320
|
from lineage.api.desktop_quickstart import (
|
|
1263
1321
|
router as desktop_quickstart_router, # noqa: E402
|
|
1264
1322
|
)
|
|
@@ -1288,7 +1346,6 @@ if _HAS_DESKTOP_API:
|
|
|
1288
1346
|
app.include_router(desktop_worktree_router)
|
|
1289
1347
|
app.include_router(desktop_setup_router)
|
|
1290
1348
|
app.include_router(desktop_credentials_router)
|
|
1291
|
-
app.include_router(desktop_projects_router)
|
|
1292
1349
|
app.include_router(desktop_workspaces_router)
|
|
1293
1350
|
app.include_router(desktop_repos_router)
|
|
1294
1351
|
app.include_router(desktop_quickstart_router)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Trusted controlplane identity resolution for backend analytics."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class ControlplaneIdentityConfig:
|
|
14
|
+
"""Auth-service validation configuration."""
|
|
15
|
+
|
|
16
|
+
auth_base_url: str
|
|
17
|
+
timeout_seconds: float = 2.0
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class ControlplaneAnalyticsIdentity:
|
|
22
|
+
"""Pseudonymous analytics identity minted by the auth service."""
|
|
23
|
+
|
|
24
|
+
analytics_user_id: str
|
|
25
|
+
analytics_org_id: str
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class _ValidateTokenResponse(BaseModel):
|
|
29
|
+
model_config = ConfigDict(extra="ignore")
|
|
30
|
+
|
|
31
|
+
analytics_user_id: str | None = None
|
|
32
|
+
analytics_org_id: str | None = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def resolve_controlplane_analytics_identity(
|
|
36
|
+
*,
|
|
37
|
+
token: str | None,
|
|
38
|
+
config: ControlplaneIdentityConfig | None,
|
|
39
|
+
client: httpx.AsyncClient | None = None,
|
|
40
|
+
request_headers: Mapping[str, str] | None = None,
|
|
41
|
+
) -> ControlplaneAnalyticsIdentity | None:
|
|
42
|
+
"""Resolve analytics identity from a trusted auth-service validation call.
|
|
43
|
+
|
|
44
|
+
`request_headers` is accepted for call-site convenience, but renderer-supplied
|
|
45
|
+
identity or auth URL headers are intentionally ignored.
|
|
46
|
+
"""
|
|
47
|
+
_ = request_headers
|
|
48
|
+
if not token or not config or not config.auth_base_url:
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
auth_base_url = config.auth_base_url.rstrip("/")
|
|
52
|
+
url = f"{auth_base_url}/v1/auth/validate"
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
if client is not None:
|
|
56
|
+
response = await client.post(url, json={"token": token})
|
|
57
|
+
else:
|
|
58
|
+
async with httpx.AsyncClient(timeout=config.timeout_seconds) as new_client:
|
|
59
|
+
response = await new_client.post(url, json={"token": token})
|
|
60
|
+
except httpx.HTTPError:
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
if response.status_code != 200:
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
validated = _ValidateTokenResponse.model_validate(response.json())
|
|
68
|
+
except (ValueError, ValidationError):
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
if not validated.analytics_user_id or not validated.analytics_org_id:
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
return ControlplaneAnalyticsIdentity(
|
|
75
|
+
analytics_user_id=validated.analytics_user_id,
|
|
76
|
+
analytics_org_id=validated.analytics_org_id,
|
|
77
|
+
)
|
|
@@ -117,9 +117,10 @@ def resolve_desktop_request_context(request: Request) -> DesktopRequestContext:
|
|
|
117
117
|
graph_name = None
|
|
118
118
|
if config is not None and project_name is not None:
|
|
119
119
|
try:
|
|
120
|
-
data_config = config.
|
|
120
|
+
data_config = config.get_workspace_data_config(
|
|
121
121
|
project_name,
|
|
122
122
|
worktree_id=None,
|
|
123
|
+
workspace_name=workspace_name,
|
|
123
124
|
)
|
|
124
125
|
except ValueError:
|
|
125
126
|
data_config = None
|