From c3727809bedd18621c18a4d4180e7828d2bec3bd Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 02:43:18 -0500 Subject: [PATCH 01/18] feat(workbench): support native integration UI routes --- src/ui/lib/pluginApi.js | 2 +- tests/ui/workbench-catalog-contracts.test.js | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ui/lib/pluginApi.js b/src/ui/lib/pluginApi.js index d81f48f8..4fc4cbf0 100644 --- a/src/ui/lib/pluginApi.js +++ b/src/ui/lib/pluginApi.js @@ -5,7 +5,7 @@ const BASE = "/_svc/workbench"; const SLUG = /^[a-z0-9][a-z0-9_-]*$/; const FIELD_ID = /^[a-z][a-z0-9_]*$/; const FORBIDDEN_FIELD_IDS = new Set(["constructor", "prototype", "__proto__", "password", "token", "secret", "api_key", "credentials"]); -const ENDPOINT = /^\/plugins\/[a-z0-9][a-z0-9_-]*\/(?:api\/)?(?:run|status|log|artifacts|file|render|search|studies|experiments|variants|pathways|genes|ui-query|ui-detail|ui-reference|ui-artifacts|ui-resources)\/(?:[A-Za-z0-9_.:{}-]+\/){0,3}(?:\?[^#]*)?$/; +const ENDPOINT = /^\/plugins\/[a-z0-9][a-z0-9_-]*\/(?:api\/)?(?:run|status|log|artifacts|file|render|search|studies|experiments|variants|pathways|genes|ui-run|ui-status|ui-log|ui-query|ui-detail|ui-reference|ui-artifacts|ui-resources)\/(?:[A-Za-z0-9_.:{}-]+\/){0,3}(?:\?[^#]*)?$/; const RUN_ID = /^[A-Za-z0-9_.:-]+$/; const RESOURCE_TYPES = new Set(["run"]); const NATIVE_RENDERERS = new Set(["async_analysis", "generic_runner", "informational", "query"]); diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 4de99603..ca80bdd4 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,23 +11,24 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 220 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 224 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 227, legacy: 274 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 231, legacy: 270 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(220); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(224); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ - "chembl_search", "pubmed_search", + "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", + "pubmed_search", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 2c4679679387a4d330fcedcdc92abd1bd9443409 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 02:43:59 -0500 Subject: [PATCH 02/18] test(workbench): cover second integration UI batch --- tests/ui/workbench-catalog-contracts.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index ca80bdd4..6871b748 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,24 +11,24 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 224 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 228 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 231, legacy: 270 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 235, legacy: 266 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(224); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(228); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", - "pubmed_search", + "dnanexus", "dvc", "elabftw", "figshare", "pubmed_search", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); @@ -44,7 +44,7 @@ describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { } } expect(native.filter(plugin => plugin.renderer === "informational")).toHaveLength(138); - for (const held of ["bindingdb", "intact", "dbsnp", "dvc", "format_converter"]) { + for (const held of ["bindingdb", "intact", "dbsnp", "format_converter"]) { expect(catalog.plugins.find(entry => entry.slug === held).descriptor.native_supported).toBe(false); } }, 60000); From 1d6ba4d47bb8d30dc8f1dddb47933e78dea6b48f Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 02:44:51 -0500 Subject: [PATCH 03/18] test(workbench): cover third integration UI batch --- tests/ui/workbench-catalog-contracts.test.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 6871b748..5b8ad285 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,24 +11,25 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 228 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 232 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 235, legacy: 266 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 239, legacy: 262 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(228); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(232); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", - "dnanexus", "dvc", "elabftw", "figshare", "pubmed_search", + "dnanexus", "dvc", "elabftw", "figshare", "ga4gh_interoperability", "jupyterhub", + "knime", "labkey", "pubmed_search", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From bce01d546984ae71012bca4b55f8258690d8a355 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 02:45:20 -0500 Subject: [PATCH 04/18] test(workbench): cover fourth integration UI batch --- tests/ui/workbench-catalog-contracts.test.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 5b8ad285..205f7ffe 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 232 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 236 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 239, legacy: 262 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 243, legacy: 258 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(232); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(236); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); @@ -29,7 +29,8 @@ describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", "dnanexus", "dvc", "elabftw", "figshare", "ga4gh_interoperability", "jupyterhub", - "knime", "labkey", "pubmed_search", + "knime", "labkey", "lims_integration", "microsoft_graph", "openspecimen", + "pubmed_search", "s3_integration", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 3eef032f7ab9db90061c29f852085c8dcb0f4cc4 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 02:48:32 -0500 Subject: [PATCH 05/18] test(workbench): cover final integration UI batch --- tests/ui/workbench-catalog-contracts.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 205f7ffe..dbb1b0eb 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 236 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 239 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 243, legacy: 258 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 246, legacy: 255 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(236); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(239); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); @@ -30,7 +30,7 @@ describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", "dnanexus", "dvc", "elabftw", "figshare", "ga4gh_interoperability", "jupyterhub", "knime", "labkey", "lims_integration", "microsoft_graph", "openspecimen", - "pubmed_search", "s3_integration", + "pubmed_search", "s3_integration", "seven_bridges", "terra", "zenodo", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 26c730d7aa37b27ee8af8c5bbffb6da61d23782d Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:49:45 -0500 Subject: [PATCH 06/18] test(workbench): cover first genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index dbb1b0eb..e1e8a6ac 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 239 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 243 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 246, legacy: 255 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 250, legacy: 251 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(239); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(243); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From 3c541b606a080009e0569249e0b513787e4195da Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:50:11 -0500 Subject: [PATCH 07/18] test(workbench): cover second genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index e1e8a6ac..0c9d3258 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 243 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 247 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 250, legacy: 251 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 254, legacy: 247 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(243); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(247); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From 54a7504a1bf5e3a4831ab0662a1171e8954d2339 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:50:48 -0500 Subject: [PATCH 08/18] test(workbench): cover third genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 0c9d3258..d687a199 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 247 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 251 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 254, legacy: 247 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 258, legacy: 243 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(247); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(251); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From 1f09fa5c4f39046e12f34e5f16940bdcf367e480 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:51:19 -0500 Subject: [PATCH 09/18] test(workbench): cover fourth genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index d687a199..627e7260 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 251 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 255 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 258, legacy: 243 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 262, legacy: 239 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(251); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(255); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From 7c3e2b0b1222331eafb3036b3de8b52c4d892391 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:51:46 -0500 Subject: [PATCH 10/18] test(workbench): cover fifth genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 627e7260..9acc8643 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 255 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 259 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 262, legacy: 239 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 266, legacy: 235 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(255); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(259); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From c2ab7f846e2a6dd4bd77d73ba1b497abbe07a75b Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:52:24 -0500 Subject: [PATCH 11/18] test(workbench): cover sixth genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 9acc8643..aa3b22b7 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 259 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 263 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 266, legacy: 235 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 270, legacy: 231 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(259); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(263); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From 71a13b855b776976b4b819a714eebb6c1b887700 Mon Sep 17 00:00:00 2001 From: man4ish Date: Thu, 8 Oct 2026 07:54:26 -0500 Subject: [PATCH 12/18] test(workbench): cover final genomics UI batch --- tests/ui/workbench-catalog-contracts.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index aa3b22b7..1f9c6369 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 263 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 264 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 270, legacy: 231 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 271, legacy: 230 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(263); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(264); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); From a962bba9d9fbd51552d023dc5a7464f0514dd9ec Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 10:49:45 -0500 Subject: [PATCH 13/18] test(studio): validate native UI plus25 batch 1 --- tests/ui/workbench-catalog-contracts.test.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 1f9c6369..1956499d 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,26 +11,28 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 264 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 269 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 271, legacy: 230 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 276, legacy: 225 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(264); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(269); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", - "dnanexus", "dvc", "elabftw", "figshare", "ga4gh_interoperability", "jupyterhub", - "knime", "labkey", "lims_integration", "microsoft_graph", "openspecimen", - "pubmed_search", "s3_integration", "seven_bridges", "terra", "zenodo", + "dnanexus", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", + "jupyterhub", "knime", "labkey", "lims_integration", "manhattan_qq_plot", + "microsoft_graph", "ml_eval_plots", "msa_conservation_viewer", + "omics_data_qc_harmonizer", "openspecimen", "pubmed_search", "s3_integration", + "seven_bridges", "terra", "zenodo", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 22988c0bb54d09c4f94a185e665ddbadca010e3e Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 10:50:44 -0500 Subject: [PATCH 14/18] test(studio): validate native UI plus25 batch 2 --- tests/ui/workbench-catalog-contracts.test.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index 1956499d..a9330624 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,28 +11,30 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 269 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 274 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 276, legacy: 225 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 281, legacy: 220 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(269); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(274); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ - "atlassian", "aws_healthomics", "benchling", "chembl_search", "cloud_integration", + "admet_prediction", "atlassian", "aws_healthomics", "benchling", "chembl_search", + "cloud_integration", "dnanexus", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", "jupyterhub", "knime", "labkey", "lims_integration", "manhattan_qq_plot", "microsoft_graph", "ml_eval_plots", "msa_conservation_viewer", - "omics_data_qc_harmonizer", "openspecimen", "pubmed_search", "s3_integration", - "seven_bridges", "terra", "zenodo", + "omics_data_qc_harmonizer", "omics_qc_metrics_extractor", "omics_qc_report_generator", + "openspecimen", "pubmed_search", "s3_integration", "sashimi_plot", "seven_bridges", + "terra", "venn_upset_plot", "zenodo", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 6b4d1dc99818f65336e48f5a95afd27ef6385d18 Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 10:51:40 -0500 Subject: [PATCH 15/18] test(studio): validate native UI plus25 batch 3 --- tests/ui/workbench-catalog-contracts.test.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index a9330624..b6d3a236 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,27 +11,28 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 274 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 279 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 281, legacy: 220 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 286, legacy: 215 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(274); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(279); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ "admet_prediction", "atlassian", "aws_healthomics", "benchling", "chembl_search", - "cloud_integration", - "dnanexus", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", + "chemoinfo_intelligence", "cloud_integration", "dnanexus", "drug_report_generator", + "druglikeness_scoring", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", "jupyterhub", "knime", "labkey", "lims_integration", "manhattan_qq_plot", - "microsoft_graph", "ml_eval_plots", "msa_conservation_viewer", + "mechanism_analysis", "microsoft_graph", "ml_eval_plots", "molecular_descriptors", + "msa_conservation_viewer", "omics_data_qc_harmonizer", "omics_qc_metrics_extractor", "omics_qc_report_generator", "openspecimen", "pubmed_search", "s3_integration", "sashimi_plot", "seven_bridges", "terra", "venn_upset_plot", "zenodo", From 4c1527c74f92dee17353e4ae6c30cbd31143ed05 Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 10:52:34 -0500 Subject: [PATCH 16/18] test(studio): validate native UI plus25 batch 4 --- tests/ui/workbench-catalog-contracts.test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index b6d3a236..c2bcef22 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,31 +11,31 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 279 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 284 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 286, legacy: 215 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 291, legacy: 210 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(279); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(284); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ - "admet_prediction", "atlassian", "aws_healthomics", "benchling", "chembl_search", - "chemoinfo_intelligence", "cloud_integration", "dnanexus", "drug_report_generator", + "admet_prediction", "atlassian", "aws_healthomics", "benchling", "cell_comm_visualization", + "chembl_search", "chemoinfo_intelligence", "cloud_integration", "clustering", "dnanexus", "drug_report_generator", "druglikeness_scoring", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", "jupyterhub", "knime", "labkey", "lims_integration", "manhattan_qq_plot", "mechanism_analysis", "microsoft_graph", "ml_eval_plots", "molecular_descriptors", "msa_conservation_viewer", "omics_data_qc_harmonizer", "omics_qc_metrics_extractor", "omics_qc_report_generator", - "openspecimen", "pubmed_search", "s3_integration", "sashimi_plot", "seven_bridges", - "terra", "venn_upset_plot", "zenodo", + "openspecimen", "pathway_mapping", "pubmed_search", "s3_integration", "sashimi_plot", + "seven_bridges", "target_prediction", "terra", "toxicity_prediction", "venn_upset_plot", "zenodo", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From e2d3203671cf4a68496b5958b6415cdc53444ca3 Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 10:53:55 -0500 Subject: [PATCH 17/18] test(studio): validate native UI plus25 batch 5 --- tests/ui/workbench-catalog-contracts.test.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index c2bcef22..dcc403d2 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,17 +11,17 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 284 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 289 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 291, legacy: 210 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 296, legacy: 205 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); - expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(284); + expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(289); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", ]); @@ -31,11 +31,12 @@ describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { "chembl_search", "chemoinfo_intelligence", "cloud_integration", "clustering", "dnanexus", "drug_report_generator", "druglikeness_scoring", "dvc", "elabftw", "exome_analysis", "figshare", "ga4gh_interoperability", "jupyterhub", "knime", "labkey", "lims_integration", "manhattan_qq_plot", - "mechanism_analysis", "microsoft_graph", "ml_eval_plots", "molecular_descriptors", + "marker_identification", "mechanism_analysis", "microsoft_graph", "ml_eval_plots", "molecular_descriptors", "msa_conservation_viewer", "omics_data_qc_harmonizer", "omics_qc_metrics_extractor", "omics_qc_report_generator", "openspecimen", "pathway_mapping", "pubmed_search", "s3_integration", "sashimi_plot", - "seven_bridges", "target_prediction", "terra", "toxicity_prediction", "venn_upset_plot", "zenodo", + "scanpy_clustering", "scanpy_markers", "seven_bridges", "single_cell_analysis", + "single_cell_annotation", "target_prediction", "terra", "toxicity_prediction", "venn_upset_plot", "zenodo", ]); for (const entry of catalog.plugins) { const descriptor = validatePluginDescriptor(entry.descriptor, entry.slug); From 498dae1e79524ca2f0256d0c1506720cb343414e Mon Sep 17 00:00:00 2001 From: man4ish Date: Fri, 9 Oct 2026 11:18:15 -0500 Subject: [PATCH 18/18] test(studio): validate integrated native UI catalog --- tests/ui/workbench-catalog-contracts.test.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/ui/workbench-catalog-contracts.test.js b/tests/ui/workbench-catalog-contracts.test.js index dcc403d2..258b9c19 100644 --- a/tests/ui/workbench-catalog-contracts.test.js +++ b/tests/ui/workbench-catalog-contracts.test.js @@ -11,19 +11,31 @@ import { resolveWorkbenchComponent } from "../../src/ui/components/workbench/com const source = process.env.WORKBENCH_SOURCE; const enabled = Boolean(source); describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { - it("validates 289 v1 native descriptors, seven v2 queries, and legacy fallbacks", () => { + it("validates 289 v1 native descriptors, 78 v2 queries, and legacy fallbacks", () => { const exporter = path.join(source, "scripts/export_workbench_ui_compatibility.py"); expect(existsSync(exporter)).toBe(true); const catalog = JSON.parse(execFileSync(process.env.PYTHON || "python3", ["-B", exporter], { cwd: source, encoding: "utf8", maxBuffer: 8 * 1024 * 1024, env: { ...process.env, PYTHONDONTWRITEBYTECODE: "1", DJANGO_DEBUG: "true", DJANGO_SETTINGS_MODULE: "omnibioai.settings_test" }, })); - expect(catalog.counts).toEqual({ enabled: 501, native: 296, legacy: 205 }); + expect(catalog.counts).toEqual({ enabled: 501, native: 367, legacy: 134 }); expect(catalog.plugins).toHaveLength(501); const native = catalog.plugins.filter(plugin => plugin.descriptor.native_supported); expect(native.filter(plugin => plugin.schema_version === 1)).toHaveLength(289); expect(native.filter(plugin => plugin.schema_version === 2).map(plugin => plugin.slug).sort()).toEqual([ - "clinicaltrials_gov", "disease_ontology", "ensembl", "hgnc", "medgen", "mondo", "rcsb_pdb", + "all_of_us", "api_analytics", "bindingdb", "biogrid", "bioportal", "brenda", + "cbioportal", "ccle", "cell_ontology", "chebi", "civic", "clingen", + "clinicaltrials_gov", "cpic", "dbgap", "depmap", "dgidb", "disease_ontology", + "disgenet", "drugcentral", "drugsatfda", "ena", "encode", "ensembl", + "expression_atlas", "gdc", "gene_ontology", "genereviews", "gnomad", "gtex", + "hgmd", "hgnc", "hpa", "icgc", "intact", "integration_connections", + "interpro", "job_queue_manager", "kegg", "lipidmaps", "lovd", "mastermind", + "mavedb", "medgen", "metabolights", "mondo", "msigdb", "ncbi", + "notification_center", "omim", "opentargets", "orphanet", "panglaodb", "panther", + "pdb_redo", "pdbe", "pharmvar", "pharos", "phegeni", "pride", + "proteomexchange", "pubchem", "rcsb_pdb", "rfam", "rxnorm", "sgd", + "snpedia", "sra", "storage_quota_manager", "string_db", "swisslipids", "targetscan", + "tcga", "topmed", "ucsc", "uniprot", "wikipathways", "wormbase", ]); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "query")).toHaveLength(9); expect(native.filter(plugin => plugin.schema_version === 1 && plugin.renderer === "async_analysis").map(plugin => plugin.slug).sort()).toEqual([ @@ -52,7 +64,7 @@ describe.skipIf(!enabled)("generated Workbench catalog compatibility", () => { } } expect(native.filter(plugin => plugin.renderer === "informational")).toHaveLength(138); - for (const held of ["bindingdb", "intact", "dbsnp", "format_converter"]) { + for (const held of ["dbsnp", "environment_manager", "format_converter", "multiqc_wrapper"]) { expect(catalog.plugins.find(entry => entry.slug === held).descriptor.native_supported).toBe(false); } }, 60000);