From e1cdf6bd592a1c79fde28f9ea0d6721375fff1ab Mon Sep 17 00:00:00 2001 From: Alexandr Date: Mon, 17 Aug 2026 17:53:41 +0200 Subject: [PATCH 01/11] chore: migrate to block structure v2 and upgrade SDK Output of `block-tools structure refresh`, plus the catalog entry for @platforma-sdk/block-kind and the kind/ workspace member the refresh needs to discover. block-tools 2.11.6 -> 2.13.0, model/ui-vue 1.79.20 -> 1.81.1, workflow-tengo 6.6.5 -> 6.8.2, tengo-builder 4.0.11 -> 4.0.22. Software packages move from pl-pkg to `block-tools software build`; build scripts move to the PL_BUILD_* channel scheme. --- .github/workflows/build.yaml | 20 +- .structure | 2 +- block/package.json | 3 +- model/package.json | 1 + package.json | 13 +- pnpm-lock.yaml | 893 +++++++++++++++-------------- pnpm-workspace.yaml | 20 +- software/parse-h5ad/package.json | 7 +- software/parse-seurat/package.json | 8 +- test/.oxfmtrc.json | 2 +- turbo.json | 20 +- 11 files changed, 539 insertions(+), 450 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 25ed978..6d20cdb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ on: workflow_dispatch: {} jobs: init: - runs-on: ubuntu-latest + runs-on: hz-ubuntu-dind steps: - uses: milaboratory/github-ci/actions/context/init@v4 with: @@ -25,7 +25,9 @@ jobs: app-name: 'Block: Samples And Data' app-name-slug: 'block-samples-and-data' node-version: '20.x' - build-script-name: 'build' + gha-runner-label: hz-ubuntu-dind + build-script-name: 'build:dev-local' + build-before-publish-script-name: 'build:release' pnpm-recursive-build: false test: true @@ -37,6 +39,11 @@ jobs: package-path: 'block' create-tag: 'true' + # Require the published `block` package to be bumped by a changeset on + # PRs (empty changeset or the `skip-changelog` label waives it). Needs + # the input to exist on the pinned `@v4` reusable workflow. + require-package-path-bump: true + npmrc-config: | { "registries": { @@ -56,6 +63,15 @@ jobs: "AWS_CI_IAM_MONOREPO_SIMPLE_ROLE": ${{ toJSON(secrets.AWS_CI_IAM_MONOREPO_SIMPLE_ROLE) }}, "AWS_CI_TURBOREPO_S3_BUCKET": ${{ toJSON(secrets.AWS_CI_TURBOREPO_S3_BUCKET) }}, + + "HZ_CI_TURBO_S3_BUCKET": ${{ toJSON(vars.HZ_CI_TURBO_S3_BUCKET) }}, + "HZ_CI_TURBO_S3_ENDPOINT": ${{ toJSON(vars.HZ_CI_TURBO_S3_ENDPOINT) }}, + "HZ_CI_TURBO_S3_REGION": ${{ toJSON(vars.HZ_CI_TURBO_S3_REGION) }}, + "HZ_CI_TURBO_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_ACCESS_KEY) }}, + "HZ_CI_TURBO_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_SECRET_KEY) }}, + "HZ_CI_CACHE_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_ACCESS_KEY) }}, + "HZ_CI_CACHE_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_SECRET_KEY) }}, + "PL_REGISTRY_PLATFORMA_OPEN_UPLOAD_URL": ${{ toJSON(secrets.PL_REGISTRY_PLOPEN_UPLOAD_URL) }}, "QUAY_USERNAME": ${{ toJSON(secrets.QUAY_USERNAME) }}, "QUAY_ROBOT_TOKEN": ${{ toJSON(secrets.QUAY_ROBOT_TOKEN) }} } diff --git a/.structure b/.structure index 491d734..218abba 100644 --- a/.structure +++ b/.structure @@ -1 +1 @@ -{"version":1} \ No newline at end of file +{"version":2} \ No newline at end of file diff --git a/block/package.json b/block/package.json index 2c9cd3d..553a501 100644 --- a/block/package.json +++ b/block/package.json @@ -20,13 +20,14 @@ "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"", "build": "ts-builder build --target block-facade && block-tools pack", "prepublishOnly": "block-tools publish -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", - "do-pack": "pnpm pack && shx mv *.tgz package.tgz", + "do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz", "check": "ts-builder type-check --target block-facade" }, "dependencies": {}, "devDependencies": { "@milaboratories/ts-builder": "catalog:", "@milaboratories/ts-configs": "catalog:", + "@platforma-open/milaboratories.samples-and-data.kind": "workspace:*", "@platforma-open/milaboratories.samples-and-data.model": "workspace:*", "@platforma-open/milaboratories.samples-and-data.ui": "workspace:*", "@platforma-open/milaboratories.samples-and-data.workflow": "workspace:*", diff --git a/model/package.json b/model/package.json index 9b08c1d..4b7f27a 100644 --- a/model/package.json +++ b/model/package.json @@ -22,6 +22,7 @@ "check": "ts-builder check --target block-model" }, "dependencies": { + "@platforma-open/milaboratories.samples-and-data.kind": "workspace:*", "@platforma-sdk/model": "catalog:", "zod": "catalog:" }, diff --git a/package.json b/package.json index e1b7970..10490a0 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,7 @@ { "scripts": { - "build": "turbo run build", - "build:dev": "env PL_PKG_DEV=local turbo run build", - "test": "env PL_PKG_DEV=local turbo run test --concurrency 1", - "test:dry-run": "env PL_PKG_DEV=local turbo run test --dry-run=json", + "test": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=binary PL_BUILD_LOCATION=local turbo run test --concurrency 1", + "test:dry-run": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=binary PL_BUILD_LOCATION=local turbo run test --dry-run=json", "mark-stable": "turbo run mark-stable", "watch": "turbo watch build", "changeset": "changeset", @@ -12,7 +10,12 @@ "fmt": "turbo run fmt", "check": "turbo run check", "do-pack": "turbo run do-pack", - "upgrade-sdk": "block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt" + "upgrade-sdk": "block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt", + "build:dev-local": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=all PL_BUILD_LOCATION=local turbo run build", + "build:dev-remote": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=all PL_BUILD_LOCATION=remote turbo run build", + "build:dev-no-software": "env PL_BUILD_CHANNEL=dev PL_BUILD_VARIANT=none turbo run build", + "build:dev-binary-existing": "env PL_BUILD_CHANNEL=dev PL_BUILD_USE_PUBLISHED=true turbo run build", + "build:release": "env PL_BUILD_CHANNEL=release PL_BUILD_VARIANT=all PL_BUILD_LOCATION=remote turbo run build" }, "devDependencies": { "@changesets/cli": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67b4672..e0965a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,45 +9,18 @@ catalogs: '@changesets/cli': specifier: ^2.29.7 version: 2.29.7 - '@milaboratories/helpers': - specifier: 1.14.1 - version: 1.14.1 - '@milaboratories/pl-model-common': - specifier: ^1.31.2 - version: 1.31.2 - '@milaboratories/ts-builder': - specifier: 1.6.0 - version: 1.6.0 - '@milaboratories/ts-configs': - specifier: 1.3.0 - version: 1.3.0 '@platforma-open/milaboratories.runenv-python-3': specifier: ^1.7.5 version: 1.7.5 '@platforma-open/milaboratories.runenv-r-samples-and-data': specifier: ^1.0.1 version: 1.0.1 - '@platforma-sdk/block-tools': - specifier: 2.11.6 - version: 2.11.6 - '@platforma-sdk/model': - specifier: 1.79.20 - version: 1.79.20 - '@platforma-sdk/package-builder': - specifier: 3.14.0 - version: 3.14.0 '@platforma-sdk/tengo-builder': - specifier: 4.0.11 - version: 4.0.11 + specifier: 4.0.22 + version: 4.0.22 '@platforma-sdk/test': - specifier: 1.79.23 - version: 1.79.23 - '@platforma-sdk/ui-vue': - specifier: 1.79.20 - version: 1.79.20 - '@platforma-sdk/workflow-tengo': - specifier: 6.6.5 - version: 6.6.5 + specifier: 1.81.3 + version: 1.81.3 '@vueuse/core': specifier: ^12.2.0 version: 12.8.2 @@ -82,6 +55,18 @@ catalogs: specifier: ~3.25.76 version: 3.25.76 +overrides: + '@milaboratories/uikit': file:../../core/platforma/lib/ui/uikit/package.tgz + '@platforma-sdk/ui-vue': file:../../core/platforma/sdk/ui-vue/package.tgz + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@platforma-sdk/workflow-tengo': file:../../core/platforma/sdk/workflow-tengo/package.tgz + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@platforma-sdk/block-kind': file:../../core/platforma/sdk/block-kind/package.tgz + '@platforma-sdk/block-tools': file:../../core/platforma/tools/block-tools/package.tgz + '@milaboratories/ts-builder': file:../../core/platforma/tools/ts-builder/package.tgz + '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz + importers: .: @@ -97,11 +82,11 @@ importers: specifier: 'catalog:' version: 2.29.7(@types/node@24.5.2) '@milaboratories/ts-builder': - specifier: 'catalog:' - version: 1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) + specifier: file:../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) '@platforma-sdk/block-tools': - specifier: 'catalog:' - version: 2.11.6(@types/node@24.5.2) + specifier: file:../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) shx: specifier: 'catalog:' version: 0.4.0 @@ -112,11 +97,14 @@ importers: block: devDependencies: '@milaboratories/ts-builder': - specifier: 'catalog:' - version: 1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1) + specifier: file:../../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: 'catalog:' - version: 1.3.0 + specifier: file:../../../core/platforma/tools/ts-configs/package.tgz + version: file:../../core/platforma/tools/ts-configs/package.tgz + '@platforma-open/milaboratories.samples-and-data.kind': + specifier: workspace:* + version: link:../kind '@platforma-open/milaboratories.samples-and-data.model': specifier: workspace:* version: link:../model @@ -127,11 +115,11 @@ importers: specifier: workspace:* version: link:../workflow '@platforma-sdk/block-tools': - specifier: 'catalog:' - version: 2.11.6(@types/node@24.5.2) + specifier: file:../../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) '@platforma-sdk/model': - specifier: 'catalog:' - version: 1.79.20 + specifier: file:../../../core/platforma/sdk/model/package.tgz + version: file:../../core/platforma/sdk/model/package.tgz shx: specifier: 'catalog:' version: 0.4.0 @@ -139,11 +127,39 @@ importers: specifier: 'catalog:' version: 5.6.3 + kind: + dependencies: + '@milaboratories/pl-model-common': + specifier: file:../../../core/platforma/lib/model/common/package.tgz + version: file:../../core/platforma/lib/model/common/package.tgz + '@platforma-sdk/block-kind': + specifier: file:../../../core/platforma/sdk/block-kind/package.tgz + version: file:../../core/platforma/sdk/block-kind/package.tgz + '@types/node': + specifier: '*' + version: 24.5.2 + typescript: + specifier: '*' + version: 5.9.3 + devDependencies: + '@milaboratories/ts-builder': + specifier: file:../../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) + '@milaboratories/ts-configs': + specifier: file:../../../core/platforma/tools/ts-configs/package.tgz + version: file:../../core/platforma/tools/ts-configs/package.tgz + '@platforma-sdk/block-tools': + specifier: file:../../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + model: dependencies: + '@platforma-open/milaboratories.samples-and-data.kind': + specifier: workspace:* + version: link:../kind '@platforma-sdk/model': - specifier: 'catalog:' - version: 1.79.20 + specifier: file:../../../core/platforma/sdk/model/package.tgz + version: file:../../core/platforma/sdk/model/package.tgz '@types/node': specifier: '*' version: 24.5.2 @@ -155,23 +171,23 @@ importers: version: 3.25.76 devDependencies: '@milaboratories/ts-builder': - specifier: 'catalog:' - version: 1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) + specifier: file:../../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: 'catalog:' - version: 1.3.0 + specifier: file:../../../core/platforma/tools/ts-configs/package.tgz + version: file:../../core/platforma/tools/ts-configs/package.tgz '@platforma-sdk/block-tools': - specifier: 'catalog:' - version: 2.11.6(@types/node@24.5.2) + specifier: file:../../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) software/parse-h5ad: devDependencies: '@platforma-open/milaboratories.runenv-python-3': specifier: 'catalog:' version: 1.7.5 - '@platforma-sdk/package-builder': - specifier: 'catalog:' - version: 3.14.0 + '@platforma-sdk/block-tools': + specifier: file:../../../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) software/parse-seurat: devDependencies: @@ -181,9 +197,9 @@ importers: '@platforma-open/milaboratories.runenv-r-samples-and-data': specifier: 'catalog:' version: 1.0.1 - '@platforma-sdk/package-builder': - specifier: 'catalog:' - version: 3.14.0 + '@platforma-sdk/block-tools': + specifier: file:../../../../core/platforma/tools/block-tools/package.tgz + version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) test: dependencies: @@ -191,8 +207,8 @@ importers: specifier: workspace:* version: link:../model '@platforma-sdk/model': - specifier: 'catalog:' - version: 1.79.20 + specifier: file:../../../core/platforma/sdk/model/package.tgz + version: file:../../core/platforma/sdk/model/package.tgz this-block: specifier: workspace:@platforma-open/milaboratories.samples-and-data@* version: link:../block @@ -201,14 +217,14 @@ importers: version: 5.8.2 devDependencies: '@milaboratories/ts-builder': - specifier: 'catalog:' - version: 1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) + specifier: file:../../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: 'catalog:' - version: 1.3.0 + specifier: file:../../../core/platforma/tools/ts-configs/package.tgz + version: file:../../core/platforma/tools/ts-configs/package.tgz '@platforma-sdk/test': specifier: 'catalog:' - version: 1.79.23(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) vitest: specifier: 'catalog:' version: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) @@ -219,8 +235,8 @@ importers: specifier: workspace:* version: link:../model '@platforma-sdk/ui-vue': - specifier: 'catalog:' - version: 1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) + specifier: file:../../../core/platforma/sdk/ui-vue/package.tgz + version: file:../../core/platforma/sdk/ui-vue/package.tgz(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) typescript: specifier: '*' version: 5.8.2 @@ -229,20 +245,20 @@ importers: version: 3.5.24(typescript@5.8.2) devDependencies: '@milaboratories/helpers': - specifier: 'catalog:' - version: 1.14.1 + specifier: file:../../../core/platforma/lib/util/helpers/package.tgz + version: file:../../core/platforma/lib/util/helpers/package.tgz '@milaboratories/pl-model-common': - specifier: 'catalog:' - version: 1.31.2 + specifier: file:../../../core/platforma/lib/model/common/package.tgz + version: file:../../core/platforma/lib/model/common/package.tgz '@milaboratories/ts-builder': - specifier: 'catalog:' - version: 1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1) + specifier: file:../../../core/platforma/tools/ts-builder/package.tgz + version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: 'catalog:' - version: 1.3.0 + specifier: file:../../../core/platforma/tools/ts-configs/package.tgz + version: file:../../core/platforma/tools/ts-configs/package.tgz '@platforma-sdk/model': - specifier: 'catalog:' - version: 1.79.20 + specifier: file:../../../core/platforma/sdk/model/package.tgz + version: file:../../core/platforma/sdk/model/package.tgz '@types/node': specifier: '*' version: 24.5.2 @@ -280,15 +296,15 @@ importers: specifier: workspace:* version: link:../software/parse-seurat '@platforma-sdk/workflow-tengo': - specifier: 'catalog:' - version: 6.6.5 + specifier: file:../../../core/platforma/sdk/workflow-tengo/package.tgz + version: file:../../core/platforma/sdk/workflow-tengo/package.tgz devDependencies: '@platforma-sdk/tengo-builder': specifier: 'catalog:' - version: 4.0.11 + version: 4.0.22 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.79.23(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) shx: specifier: 'catalog:' version: 0.4.0 @@ -376,6 +392,10 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + '@aws-sdk/client-ecr-public@3.859.0': + resolution: {integrity: sha512-pPY85lrGBNWynofNC6Er49W6aA4JvOOKC9RDbS8rWR8pBPEG6p0B82VQKFMR+3JYRogpfQf5hzU47um96EslFA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.859.0': resolution: {integrity: sha512-oFLHZX1X6o54ZlweubtSVvQDz15JiNrgDD7KeMZT2MwxiI3axPcHzTo2uizjj5mgNapmYjRmQS5c1c63dvruVA==} engines: {node: '>=18.0.0'} @@ -841,12 +861,12 @@ packages: cpu: [x64] os: [win32] - '@grpc/grpc-js@1.13.4': - resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} engines: {node: '>=12.10.0'} - '@grpc/proto-loader@0.7.13': - resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} engines: {node: '>=6'} hasBin: true @@ -996,20 +1016,20 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jitl/quickjs-ffi-types@0.31.0': - resolution: {integrity: sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw==} + '@jitl/quickjs-ffi-types@0.32.0': + resolution: {integrity: sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==} - '@jitl/quickjs-wasmfile-debug-asyncify@0.31.0': - resolution: {integrity: sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w==} + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': + resolution: {integrity: sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw==} - '@jitl/quickjs-wasmfile-debug-sync@0.31.0': - resolution: {integrity: sha512-8XvloaaWBONqcHXYs5tWOjdhQVxzULilIfB2hvZfS6S+fI4m2+lFiwQy7xeP8ExHmiZ7D8gZGChNkdLgjGfknw==} + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': + resolution: {integrity: sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q==} - '@jitl/quickjs-wasmfile-release-asyncify@0.31.0': - resolution: {integrity: sha512-uz0BbQYTxNsFkvkurd7vk2dOg57ElTBLCuvNtRl4rgrtbC++NIndD5qv2+AXb6yXDD3Uy1O2PCwmoaH0eXgEOg==} + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': + resolution: {integrity: sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q==} - '@jitl/quickjs-wasmfile-release-sync@0.31.0': - resolution: {integrity: sha512-hYduecOByj9AsAfsJhZh5nA6exokmuFC8cls39+lYmTCGY51bgjJJJwReEu7Ff7vBWaQCL6TeDdVlnp2WYz0jw==} + '@jitl/quickjs-wasmfile-release-sync@0.32.0': + resolution: {integrity: sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1054,98 +1074,98 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@milaboratories/computable@2.9.5': - resolution: {integrity: sha512-rzLJ6fjXcNL8jb6vexGR4d8wUGvrwC2CyjkMLU5GFy+7Q6lg1wTrJnu8fzDVhS2OjEEVbD+RTE7AGvK5pYYSMQ==} - engines: {node: '>=22.19.0'} + '@milaboratories/columns-collection-driver@0.2.3': + resolution: {integrity: sha512-3rNWmuQGvEaBEzGMHIWeOi1p8j8sMDpnPKNUQvT0Ji7/ArvnfM5HK8dywxB+n3mLK8c11lW16+auM5xuydJXGw==} - '@milaboratories/helpers@1.14.1': - resolution: {integrity: sha512-GcxeGHakSLhewbA7hd8YVHnEzyi95UnzcZhgwvRPO+W7/svZc8sAGidAV5xgN/YmVmJfCRl7hfiIcL37+fm0Ew==} - engines: {node: '>=22'} + '@milaboratories/computable@2.9.8': + resolution: {integrity: sha512-X0ZtxOnIJlAd9Y7CyBtWSKHgVuTKXbIryMwJaoYSEz0gY3JZVnsD0f59J/lwe3Key0/lSYh3EbL/pP5jACIzfQ==} + engines: {node: '>=22.19.0'} - '@milaboratories/helpers@1.14.2': - resolution: {integrity: sha512-zOkD4aWNbembwI+AsPTz7nmWC1VPA4rwGBc+Nd5jPpKVh7rCtZwQrlOP5mVqRVMKIAjb1nU8kzzCGfqNPqfJjA==} + '@milaboratories/helpers@file:../../core/platforma/lib/util/helpers/package.tgz': + resolution: {integrity: sha512-OOSprQlcyquHtMJmGeOEvcQ4bCREFIrypAmgGf3Laf91fM8rG1UZ7fphz6R/AjJ8tr2pOkpsPOrPhM2gCmai0Q==, tarball: file:../../core/platforma/lib/util/helpers/package.tgz} + version: 1.14.5 engines: {node: '>=22'} - '@milaboratories/pf-driver@1.7.14': - resolution: {integrity: sha512-JRuMmuhObyD27MtpCcimGklr2yMJ2PobcYJ2y5k+UuhQWXKllhEDlUAyv2Xw/I7Xxym8Nn2npcVdOaJvTP3bPA==} + '@milaboratories/pf-driver@1.9.0': + resolution: {integrity: sha512-OhMsf1jNMp31wRCrXHMU75WQj48Nc/lDeYTo4/6R6+FLYBYkK9yWgsSH+02V4WCKbUqsyF1Xy0+O+qsYjpqUDA==} engines: {node: '>=22.19.0'} - '@milaboratories/pf-spec-driver@1.4.16': - resolution: {integrity: sha512-x6SQVUU3fl+1fFavCSzc1DNMB08HKoo0PT5dpXJWAi6oEw77yueoe1StZJVY0Kgj1BpVhlmuuC87PJu8s4eFRw==} + '@milaboratories/pf-spec-driver@1.5.0': + resolution: {integrity: sha512-XWXrKCyCwcqS8EcukuyDqvMq0D6qt61zrkb3qGpWKyy0SVQNzXC2JL0ThCM2uGI7QQelgV0aagcg8xU5pGKWPw==} - '@milaboratories/pframes-rs-node@1.1.52': - resolution: {integrity: sha512-Uu4KsQx0GiKvFASI+Cm0nMCMieUVo35mpz4j8mYUYImr7S+bVDDcHweCWrkLkSeImnOQnYHVo9RycViG6QwUQw==} + '@milaboratories/pf-spec@1.0.0': + resolution: {integrity: sha512-JIOhJdDHcKDItjlxOT4wVmnjejoazM69qK5ylu+g5q65RIcH/R5MF2OGiu9nV7QbLEXszll+EVnvx6jYhuE44w==} + peerDependencies: + '@bytecodealliance/preview2-shim': ^0.20.1 + + '@milaboratories/pframes-rs-node@1.1.56': + resolution: {integrity: sha512-H6qltcR+HHb2kAy0U0zP90rqmv/MZGGkdXIyf89FUZTpoHOlXG4Ahxq7wXp9vviUczci4cLl2L0Q+dL2XGcsUA==} - '@milaboratories/pframes-rs-serv@1.1.52': - resolution: {integrity: sha512-yVfcyLztgj5UAffj30se5G4MwxkIOFVWPHY1tZZ8zLhQQzx95R/e1toAqq3FLV7y6kpJovwmLusbefgKw9Ejcg==} + '@milaboratories/pframes-rs-serv@1.1.56': + resolution: {integrity: sha512-Pi0CRuvkfL+PqdgQ8im0MW5tqVjUvJ8hJbOG7v5pS45adg8tuq4TyrAoWN7un9ZWQ6KRLypUD+7eXCwhjOwADg==} hasBin: true - '@milaboratories/pframes-rs-wasip2@1.1.52': - resolution: {integrity: sha512-0rb0We6Q/aqrHJ062dayvLb4RExODZdqfsVWdzeHq23alY5TjJRMWsO9aKQpPnOuUKjAimdjlp+Ldq9TVhbEtg==} + '@milaboratories/pframes-rs-wasip2@1.1.56': + resolution: {integrity: sha512-54bhC6XCAVO09J/sqVwEKA4hhTa27BDDNdH8BE+6+LvjBVkg/qq2/f0MzdrVijrmagbr97F1zgj5wIgUqwCSoA==} - '@milaboratories/pframes-rs-wasm@1.1.52': - resolution: {integrity: sha512-Wn8/LJxcsvWSSpdymdebWrBnmgu9wAbzvOiHCtXz7Aqt1M2T8Xp9a7CprzCYx+EvhSuAuoxbq6naxkPsQrbkvg==} - peerDependencies: - '@bytecodealliance/preview2-shim': 0.17.9 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.7 + '@milaboratories/pl-client@3.14.5': + resolution: {integrity: sha512-/n7Hjr43WYNkyrgPQ4FL0rQ5FthNS009WvVOBggnMSqCnp6xDHhv4DjLKlmlmdvQSzgI+SeoAjAn7TkOKpaoaA==} + engines: {node: '>=22.19.0'} - '@milaboratories/pl-client@3.12.0': - resolution: {integrity: sha512-uca6tbW7hy7H/Sf010/9HNQMFKwf6bJ/JONyNgvQB+hGdJZb//vjw0xoBQDun0wSAkPm+9H2I+e0q6RUfcNZng==} + '@milaboratories/pl-client@3.14.6': + resolution: {integrity: sha512-IPzh5bSibr02DMKpwlCW6TuHVxaDe2o6tjaEJ4P2y5lshRbe5SBR/ne/G/N7E7KEKxmpWq7ZapOCLkLyvqFFDw==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-config@1.8.2': - resolution: {integrity: sha512-FG9rlAKDf1rwlg+3G9OG2bCKISNp6ajM27W7ODDSsWE4MSCVxhYB172UusbohY2RDmaD9GI5pDKO5O9uoHQCCA==} + '@milaboratories/pl-config@1.8.5': + resolution: {integrity: sha512-XnfYXSSkRxeImQ21k6I8y5apisvagcSgMGfEeyRxNdSGwUVJbbI8TwJk+XBEDQ4lErW8oqtLxKjFQuHJMzRUoQ==} - '@milaboratories/pl-deployments@3.0.8': - resolution: {integrity: sha512-7WvA761yI7eLCdJE19uNa/a6fLxytVrKJ/utBJ6GelZQFuA/LT12VkG6r0uAFtU8afY9Sr89078oLzZSZJR/oA==} + '@milaboratories/pl-deployments@3.0.15': + resolution: {integrity: sha512-+i3bdvfPCXLZ789f5fRdtrbil3/RFyzSBNMkULcnyKY5u6GRZLjWDBC5aSE75PRTWx3Fxf743Fj9L3B6loMSWw==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-drivers@1.16.3': - resolution: {integrity: sha512-/HObfG0uuFDYUd8G3qxlhrvhvTo8T5MH42+Vpr8snN+YnSHGyMXo6rw6oKRNO+h/GF+kbI5DTr9kNsQVEwyFng==} + '@milaboratories/pl-drivers@1.16.15': + resolution: {integrity: sha512-mVKIEHVOeAPdwSZZk+URAFD6zoyPiAARinpDfihDvkFcrlTLIzeoOvnQNPG5a8jqc0GiW+a9mnTrfjG7+n82Ww==} engines: {node: '>=22'} '@milaboratories/pl-error-like@1.12.10': resolution: {integrity: sha512-iHmnLG5lxJqcymUmEL8onCDGEADk1S/5RNACQ5yfTCNcCkUc+7hYrDHQpFmWXPPGC9sG+NTBxt4wr5m8UsLm2g==} - '@milaboratories/pl-error-like@1.12.9': - resolution: {integrity: sha512-9qlfawLFO4qG656ayvVSRholhhwlfXUvKKllXpHadqbnf2zO2oCd+5J76bPaFXDz/A3T+1eokCnCX74JsqCYSw==} + '@milaboratories/pl-errors@1.4.35': + resolution: {integrity: sha512-rq5Lg9G7ax+LtMPdrkZg+Pdqk28JViiS/KIcQfk0Cg1ttZoAnhDhFIh6rAFy2eGybPtlzXqM32/ODKUSMawc8Q==} - '@milaboratories/pl-errors@1.4.24': - resolution: {integrity: sha512-pV0oF0zO6bwAo/llQlu4Q00uI0guPQ9Wn+coK3pwLrateKidVRH/2XhwUgTwgS8vDECBNCgtYR6E/Im+nl+FMw==} - - '@milaboratories/pl-healthcheck@1.0.1': - resolution: {integrity: sha512-eiYd/TFm18SW4EY8vkI3c+fcPnjUu3Hd1GnPLWCN8U+dNmp/tnrzfeCgaY4xO/s0vkHNX9E7IrsQiMg2Ioz4rw==} + '@milaboratories/pl-healthcheck@1.0.5': + resolution: {integrity: sha512-ZkQti4VU2FapJBFRtZGfR5NDPXEAEFgTf/NfemypgY0aA75fFPi4/c3BpXX5K7dht+JOgHqkMrBHxKIuE2T+fA==} engines: {node: '>=22.19.0'} '@milaboratories/pl-http@1.2.4': resolution: {integrity: sha512-QKmhx+WEvJCV9dUy/SBdQk/ApaJ5ewBFgm/b+XPlS10SusAdqUUTGvK5+hq8YSuUMXlHb/dk++UtI5YlDuDl2Q==} - '@milaboratories/pl-middle-layer@1.64.41': - resolution: {integrity: sha512-6xXwmTaaImd6HQ2PZgUWGf1gXsfgEPz3zWQsmaUaPMyMusjPVynPCX2hnThqrPVf54mEMlvc3HTGaC+dofDF0g==} + '@milaboratories/pl-middle-layer@1.66.19': + resolution: {integrity: sha512-rFBmJDdBcIrdDHz730p3sL8+7uUs7VimXYGQo9IbayxmAlp5mnft1XlPUTuVbwx5QeRNGv4Cwya1T+7WL1wSmw==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-model-backend@1.4.9': - resolution: {integrity: sha512-84+Pv2RhonE/ZwR5bXipOGK4cC5V3C4vmhzIgc8TWpgLxUNsjCjoodSo3bzPcpA+URShTf4+3h4C28O/wO/MCw==} + '@milaboratories/pl-model-backend@1.4.19': + resolution: {integrity: sha512-288BUlxQtpsd8CNpOGBqGTM1xMFX4JOuNzw5A4hxB+3sq+P2+JU0kNv6PbqIAiTwXeTZ7zsiqN4Gw/aYMSop6Q==} - '@milaboratories/pl-model-common@1.31.2': - resolution: {integrity: sha512-dnK0zXzylN7MAO1Nyx8EJargaqa94iDDEDwZW7d1/lRl1p50cR9zGP8pUnIy1I8UcI4lzH34f81RRQy6AbTuTw==} + '@milaboratories/pl-model-backend@1.4.20': + resolution: {integrity: sha512-AkV+PhmQms6WPwR3E75THrkD9fFE7OpfsIUC297HvnFUoCFXR6GOMGPworA/qipXReTmv192AqBpuaLdgAngyg==} - '@milaboratories/pl-model-common@1.46.2': - resolution: {integrity: sha512-VEeauisApYScvCS8lnK3zpFJ520xuTAodKJmjR8ulHcMrWMyWMfHEdGb7j5OMD0mM/OwTgmQrrJ5eB7Xd+xoOQ==} + '@milaboratories/pl-model-common@file:../../core/platforma/lib/model/common/package.tgz': + resolution: {integrity: sha512-/OUqb0HlYO68xLCb2Og3kzIuwkxtSH4F18R1/8NYWOjmOMaJk+CXRDAs9/NFLpDS0WqqKBbxf3N7stnjsAZDnQ==, tarball: file:../../core/platforma/lib/model/common/package.tgz} + version: 1.47.3 '@milaboratories/pl-model-middle-layer@1.30.7': resolution: {integrity: sha512-rs9x3Ron4ujR/UOdEgB8WUB1SvZ8ZAScT1Av/e4or+iiQ/CzhmK9nqtYamHVwKV+JgwIFbXQwxGvIHDVz955dQ==} - '@milaboratories/pl-model-middle-layer@1.30.9': - resolution: {integrity: sha512-fnrCjWPR0HeytWC3rnHkY3bpNk3UOuED+lwmauhYBKRaF46cV1df46clJSkGNZHS9g439SYwclW4no2X/ALaFQ==} + '@milaboratories/pl-model-middle-layer@1.31.0': + resolution: {integrity: sha512-D1vyGABBtCYyp2IhKd9eMoZtKUj1wUYpIzz4Xz5k+bfJWGEF8GmZGiOvO4oOvrsEsXlG4NyO249MnBKmHFcppQ==} - '@milaboratories/pl-tree@1.12.14': - resolution: {integrity: sha512-G6uUG+3b4rH0eEQP6B31unFJtxsutETJckvapqXd9u+Uo906mK4w5u6DnXcNWfhWhKx3/hp8v89CsYSDO3b7Qw==} + '@milaboratories/pl-tree@1.13.6': + resolution: {integrity: sha512-R3wnMjbCNfAsyGJe3FQOqEyrNePd9ZCwkjDj2ps7d9oeiJ7QX6hYkIVuMlq8IQNYOJybfHc/dFEvWeYE3uAAZg==} engines: {node: '>=22.19.0'} - '@milaboratories/ptabler-expression-js@1.2.31': - resolution: {integrity: sha512-VB3fxuVqc0Beb+3/ge9uZ39uU8YqAhck9pTIxTpNZ5hOfMtPGJEI98YxoJQ8BuYhyyx5SM5qMU04NNs/vdk46A==} + '@milaboratories/ptabler-expression-js@1.2.37': + resolution: {integrity: sha512-urVRk4b5Jse555euNNITlOJ437McZVtBnC5h/E6O+iHm+hfNIi6OP1aAD5ai4jOpHllm85zW5Ne7hVyyd71bJw==} '@milaboratories/resolve-helper@1.1.3': resolution: {integrity: sha512-38/dW/XRZQREOxAOOKtO0lzEWPCP/DH0qhB3q1kYcGoN++5V92/zbVwbYrMDeDcjTyo+D62iIep+sKXeWHa7Uw==} @@ -1158,25 +1178,22 @@ packages: os: [darwin, linux, win32] hasBin: true - '@milaboratories/ts-builder@1.6.0': - resolution: {integrity: sha512-OlQ38jsriFf7qS5AmNIch65qQAOZBRFaLT15N/JJqe9dIytKJNS8Ff9G4vowWtFiRzyeyWRArBtgVOeAmoYuKQ==} + '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz': + resolution: {integrity: sha512-RHkfb5+K2ohXSiKwY+cC6iMXSY0OQdUws4uNbdCHE/hWPYv8s3h70VvBgxXzmLkEt3FMbyt3HSCHlMb2Y+HhLQ==, tarball: file:../../core/platforma/tools/ts-builder/package.tgz} + version: 1.6.2 hasBin: true - '@milaboratories/ts-configs@1.3.0': - resolution: {integrity: sha512-6rZaMOJotG+v6eXoupHgPqxArpNBNl0f7sd5K+kUo1PUhPTe632eLJtEeBbFtwDGNYqL9QUacd4pT5t6oDOf0A==} + '@milaboratories/ts-configs@file:../../core/platforma/tools/ts-configs/package.tgz': + resolution: {integrity: sha512-Xy1GIT805U0/97eWt8lPYvkmyJcQYzBqTkLrMcF7x48hZSKzBIjn/ykVUCNjKgSM2S3t+crWzeXDmsJyPwzGNw==, tarball: file:../../core/platforma/tools/ts-configs/package.tgz} + version: 1.4.0 - '@milaboratories/ts-helpers@1.8.3': - resolution: {integrity: sha512-HK3AmNZl2fOzMHot2+ihKsOC+fluwhl5261VTn1zGS3LRpmC9bCk/po8SzsVmg79ccI5nESFTdz+BRaLsXncmQ==} + '@milaboratories/ts-helpers@1.8.6': + resolution: {integrity: sha512-ef01tARUl+0Urt3x8HHAByrhYHg4Rnn7WiFyJ+joZFZl1T1pUKTgfB7Zxc8Cn06HIl4i6H7s5OSymjZePIGqfQ==} engines: {node: '>=22.19.0'} - '@milaboratories/uikit@2.15.11': - resolution: {integrity: sha512-oBQiPXpHEwg1dLptfCQNtpRrJ3stunjrTWiP5U90rAXl4c6Z/Ks7YU/fVvoqdBsoSBQ6nEcAG0Sk4sV8DVRlJQ==} - - '@napi-rs/wasm-runtime@1.1.5': - resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@milaboratories/uikit@file:../../core/platforma/lib/ui/uikit/package.tgz': + resolution: {integrity: sha512-AkJiFM31tJTD6pqERGRr3+GAjgsf/hkFLXejEkyVT9DgsgsL89LvNT/Hr3glzkHL7pECHeoWNVqyeuAaXi7pJg==, tarball: file:../../core/platforma/lib/ui/uikit/package.tgz} + version: 2.15.22 '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} @@ -1728,14 +1745,14 @@ packages: '@platforma-open/milaboratories.runenv-r-samples-and-data@1.0.1': resolution: {integrity: sha512-uO8SXeZGpN27IAdUwbjAiDO7dPXTO3/7w8am7mIaKJjJQrOLI31MSuN0/r5ZG4ZU2JCJESmJHl9XMCBaYWQ82Q==} - '@platforma-open/milaboratories.software-ptabler.schema@1.15.15': - resolution: {integrity: sha512-zvPuRZgQyxjED+txJVgWHUOPeRp4TG1jOrJOtuw9WnwxFiHNjQHIB+Xe1j8f6skgMqZgRSQvEbhRvqbWjGmhKQ==} + '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': + resolution: {integrity: sha512-3EWO64poe5VcBIgVIdIFHwN7nPi000kPuaRmlVt3xnnQZqXUYDFNZfZ2Mc9/mE1Eq3FLwQxcy/5mng7LvgWnXg==} - '@platforma-open/milaboratories.software-ptabler@2.1.3': - resolution: {integrity: sha512-4cikdkdJ5WYc0Nw3IoZxzlFNKvG1qCAqSjypq5b18pIK6LBDayzhFcuw5TDd8O3bAFhoHP+3cVTmoO9XUTYMRg==} + '@platforma-open/milaboratories.software-ptabler@2.1.8': + resolution: {integrity: sha512-28dKwcKNIB/8OYH6l/li7Qa/aE2NgDVtNUmN8v6jZsLKT59ogFclz8ZrQ+OiQFzHQCLBlWBt5TdIHfHPxBaNFw==} - '@platforma-open/milaboratories.software-ptexter@1.2.2': - resolution: {integrity: sha512-I08YpKQ4+esLrfpVra5UJ+bznI9Zzba6OW0rKK407a1EUmanvYMVrCbM9gqnm6CHbv2vQxNGSaO8p1LoBh+9gA==} + '@platforma-open/milaboratories.software-ptexter@1.2.4': + resolution: {integrity: sha512-4ZqhqksSNVKWhEB9WwrL0rU89G+00ulzH1urYyNA4EdBVGA4mwbKbw0K/zcwce/oUYYMdRl+epXmr0w9wHyNzA==} '@platforma-open/milaboratories.software-small-binaries.hello-world-py@1.0.10': resolution: {integrity: sha512-16BGRLIrsVW+YIaXwWLX6Nbm80PS5mQJEclHhjNbRrRTLHPaKI4RygZfBC0lLNzvHBiTXU4Qkh1+WmdovkshDg==} @@ -1755,37 +1772,41 @@ packages: '@platforma-open/milaboratories.software-small-binaries@2.1.1': resolution: {integrity: sha512-KN1PR7YgUUfx1dxh/TtcoWpSZbOXbRxXzQuJ505qHuXuE0spYwC7bXnvJsEYbEwRcPMa0foTrjBnPNORE4yr+Q==} - '@platforma-sdk/block-tools@2.11.6': - resolution: {integrity: sha512-CyekNfqEildNeTrkjAeaWC7ah+skGMb3d/crSZSgCWACPIVQwg2oRZiJliwmJU/ylcTONPDAef7DYOtmfXsgtw==} + '@platforma-sdk/block-kind@file:../../core/platforma/sdk/block-kind/package.tgz': + resolution: {integrity: sha512-iALLquDVq4fPfsQJcqsqL/N9DtauVCLvjp0OwN/kySsZk9cDd6daBBX2kEARdStVblcPSnVycU7OV2upS1qsUA==, tarball: file:../../core/platforma/sdk/block-kind/package.tgz} + version: 1.0.0 + + '@platforma-sdk/block-tools@file:../../core/platforma/tools/block-tools/package.tgz': + resolution: {integrity: sha512-/S3ppeqbwbL+z4RIlMhy0f1vcUCi73s8ipEzpaTwajgoR9I+B/nzSOqEbKceGD+XtaiLIuzSp9dfj0p/ze3IIw==, tarball: file:../../core/platforma/tools/block-tools/package.tgz} + version: 2.12.12 hasBin: true '@platforma-sdk/blocks-deps-updater@2.2.0': resolution: {integrity: sha512-p9lBxhFXM9WoRsrJO7dfkiXSK+1m63yIn1sKhBO71eMbhrLMyVYHEOeNf3w5OCdbRF5QsNhXzWuiTmFK3zHFsA==} hasBin: true - '@platforma-sdk/model@1.79.20': - resolution: {integrity: sha512-0ULETzwgo4E5rIddn/PoCAY5gSv9luDYAaSp66b8u3u1XTh43k7fgOpobu/rrfHJMiY9IGfzALDlo6jtvMLUyQ==} + '@platforma-sdk/model@file:../../core/platforma/sdk/model/package.tgz': + resolution: {integrity: sha512-vKVHFN2JAZLlPV3KNEE1ygbG/zby0DtfCwl6xh9GN42bnkxXbbtBYj138ufFXI+UCTXRKzcFSRLB+hbPJuWjHQ==, tarball: file:../../core/platforma/sdk/model/package.tgz} + version: 1.81.0 - '@platforma-sdk/package-builder-lib@1.1.0': - resolution: {integrity: sha512-h/Hx4Fg+kGnX2sVPWJa48JHbSEofTnaOescTKBP1Py5wl3A68BjqKaI6yybLWSR5Ojp3tHNNlvFSAnoF2QYMMg==} + '@platforma-sdk/package-builder-lib@1.2.1': + resolution: {integrity: sha512-H6weitj7JxbiJSlteEFLafTJ+tfty6iv/imf3ysy8oCS8AZIRJk2VMW3M/aAc+xVkQeX7oVIwMwFMYrJIoFsAg==} - '@platforma-sdk/package-builder@3.14.0': - resolution: {integrity: sha512-7bRducsc9NLc1zo0GRfz3RHSTejxFfmFvr21EH8NBndGaCj5KvHt2+0jmQsSI1Sl7ZCaj+zQKWWukRlsi+b/uA==} - hasBin: true - - '@platforma-sdk/tengo-builder@4.0.11': - resolution: {integrity: sha512-c0LuiR7vtclto853Q1O+j8g109ooIZKtEl5tqRHG6dN/kk6S+J7DZHCpAjFuZ9pt3x6jF95sNaJEtP8uFs1uXw==} + '@platforma-sdk/tengo-builder@4.0.22': + resolution: {integrity: sha512-8+zDYDFFI2tQS7dplTcxgQdUwzt8+IO++sJiVbwBgwSg1Giyc2qMThEYPLK3QNFArgCsIDR6wQuS8t66pJsRPQ==} engines: {node: '>=22'} hasBin: true - '@platforma-sdk/test@1.79.23': - resolution: {integrity: sha512-vb5K4Rtjy5ogom3fBYpOxvKL+Nb50iURUdd1vjzN3pcQGx47omBnDr9YvNvUsRC3INhZibLzy44dUKD2la/IMw==} + '@platforma-sdk/test@1.81.3': + resolution: {integrity: sha512-LSDJoQqpxX2G8W7ZshnYWroqNQiFoxXQlka4pEJTnPEO8YISW3lWknBhqsxMp2GyepQNoyl2WO1bfiQz+ssT5A==} - '@platforma-sdk/ui-vue@1.79.20': - resolution: {integrity: sha512-VwBG8MKV1M2KMR2PgW+o6uxJJRCFGihaRsnkzLL8HGKM/Vr9k3FY/V929B1XAhU5y9wb1g7fKNJvy9JNEq5GiQ==} + '@platforma-sdk/ui-vue@file:../../core/platforma/sdk/ui-vue/package.tgz': + resolution: {integrity: sha512-lA9mHlSz4wsSrdQb4sJLD/v1UWTfVKZBKBhXa85keDuaKW4lwFXT7FSR7J1jy/UKboXw7aj7QUTa5AwkeOYB0Q==, tarball: file:../../core/platforma/sdk/ui-vue/package.tgz} + version: 1.81.0 - '@platforma-sdk/workflow-tengo@6.6.5': - resolution: {integrity: sha512-BIY0DongPruQ7e2EMYy2b0UtO5ziGcLvr2RWgJ8ki17VKNzW3esm/RBszGHMrTYmXM0Yw7mCSasor4vH560g7A==} + '@platforma-sdk/workflow-tengo@file:../../core/platforma/sdk/workflow-tengo/package.tgz': + resolution: {integrity: sha512-U3mW4N7nWqmT0Mjo1bImg/lH4zJDwXn0M+22JaAqewiXMpcCgvQY442FMcptHVLr5XaB8phL3AB162jtxNrNQA==, tarball: file:../../core/platforma/sdk/workflow-tengo/package.tgz} + version: 6.8.2 '@protobuf-ts/grpc-transport@2.11.1': resolution: {integrity: sha512-l6wrcFffY+tuNnuyrNCkRM8hDIsAZVLA8Mn7PKdVyYxITosYh60qW663p9kL6TWXYuDCL3oxH8ih3vLKTDyhtg==} @@ -1812,29 +1833,26 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} '@rolldown/binding-android-arm64@1.0.3': resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} @@ -2372,9 +2390,6 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} - '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -4002,8 +4017,8 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} engines: {node: '>=12.0.0'} pump@3.0.2: @@ -4026,11 +4041,11 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quickjs-emscripten-core@0.31.0: - resolution: {integrity: sha512-oQz8p0SiKDBc1TC7ZBK2fr0GoSHZKA0jZIeXxsnCyCs4y32FStzCW4d1h6E1sE0uHDMbGITbk2zhNaytaoJwXQ==} + quickjs-emscripten-core@0.32.0: + resolution: {integrity: sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==} - quickjs-emscripten@0.31.0: - resolution: {integrity: sha512-K7Yt78aRPLjPcqv3fIuLW1jW3pvwO21B9pmFOolsjM/57ZhdVXBr51GqJpalgBlkPu9foAvhEAuuQPnvIGvLvQ==} + quickjs-emscripten@0.32.0: + resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==} engines: {node: '>=16.0.0'} radashi@12.7.0: @@ -4845,9 +4860,6 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -4939,6 +4951,50 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 + '@aws-sdk/client-ecr-public@3.859.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.858.0 + '@aws-sdk/credential-provider-node': 3.859.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.858.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.858.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.2 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.9 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-s3@3.859.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 @@ -5766,16 +5822,16 @@ snapshots: '@esbuild/win32-x64@0.25.1': optional: true - '@grpc/grpc-js@1.13.4': + '@grpc/grpc-js@1.14.4': dependencies: - '@grpc/proto-loader': 0.7.13 + '@grpc/proto-loader': 0.8.1 '@js-sdsl/ordered-map': 4.4.2 - '@grpc/proto-loader@0.7.13': + '@grpc/proto-loader@0.8.1': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.4.0 + protobufjs: 7.6.5 yargs: 17.7.2 '@inquirer/ansi@1.0.2': {} @@ -5918,23 +5974,23 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jitl/quickjs-ffi-types@0.31.0': {} + '@jitl/quickjs-ffi-types@0.32.0': {} - '@jitl/quickjs-wasmfile-debug-asyncify@0.31.0': + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-debug-sync@0.31.0': + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-release-asyncify@0.31.0': + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - '@jitl/quickjs-wasmfile-release-sync@0.31.0': + '@jitl/quickjs-wasmfile-release-sync@0.32.0': dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -6021,25 +6077,28 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@milaboratories/computable@2.9.5': + '@milaboratories/columns-collection-driver@0.2.3': + dependencies: + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + + '@milaboratories/computable@2.9.8': dependencies: '@milaboratories/pl-error-like': 1.12.10 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 '@types/node': 24.5.2 utility-types: 3.11.0 - '@milaboratories/helpers@1.14.1': {} + '@milaboratories/helpers@file:../../core/platforma/lib/util/helpers/package.tgz': {} - '@milaboratories/helpers@1.14.2': {} - - '@milaboratories/pf-driver@1.7.14(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-driver@1.9.0(@bytecodealliance/preview2-shim@0.17.8)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-node': 1.1.52 - '@milaboratories/pframes-rs-wasm': 1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9) - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pframes-rs-node': 1.1.56 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/ts-helpers': 1.8.6 es-toolkit: 1.39.10 lru-cache: 11.2.2 transitivePeerDependencies: @@ -6047,52 +6106,68 @@ snapshots: - encoding - supports-color - '@milaboratories/pf-spec-driver@1.4.16(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-spec-driver@1.5.0(@bytecodealliance/preview2-shim@0.17.8)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-wasm': 1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9) - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz '@noble/hashes': 2.2.0 transitivePeerDependencies: - '@bytecodealliance/preview2-shim' - '@milaboratories/pframes-rs-node@1.1.52': + '@milaboratories/pf-spec@1.0.0(@bytecodealliance/preview2-shim@0.17.8)': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.8 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-middle-layer': 1.31.0 + + '@milaboratories/pframes-rs-node@1.1.56': dependencies: '@mapbox/node-pre-gyp': 2.0.3 - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pframes-rs-serv': 1.1.52 - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pframes-rs-serv': 1.1.56 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz ulid: 3.0.2 transitivePeerDependencies: - encoding - supports-color - '@milaboratories/pframes-rs-serv@1.1.52': + '@milaboratories/pframes-rs-serv@1.1.56': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz '@milaboratories/pl-model-middle-layer': 1.30.7 better-sqlite3: 12.10.0 commander: 14.0.3 selfsigned: 5.5.0 - '@milaboratories/pframes-rs-wasip2@1.1.52': {} + '@milaboratories/pframes-rs-wasip2@1.1.56': {} - '@milaboratories/pframes-rs-wasm@1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9)': + '@milaboratories/pl-client@3.14.5': dependencies: - '@bytecodealliance/preview2-shim': 0.17.8 - '@milaboratories/pframes-rs-wasip2': 1.1.52 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 + '@grpc/grpc-js': 1.14.4 + '@milaboratories/pl-http': 1.2.4 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + canonicalize: 2.1.0 + denque: 2.1.0 + long: 5.3.2 + lru-cache: 11.2.2 + openapi-fetch: 0.15.0 + undici: 7.16.0 + utility-types: 3.11.0 + yaml: 2.8.1 - '@milaboratories/pl-client@3.12.0': + '@milaboratories/pl-client@3.14.6': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.4 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 canonicalize: 2.1.0 @@ -6104,19 +6179,19 @@ snapshots: utility-types: 3.11.0 yaml: 2.8.1 - '@milaboratories/pl-config@1.8.2': + '@milaboratories/pl-config@1.8.5': dependencies: - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 upath: 2.0.1 yaml: 2.8.1 - '@milaboratories/pl-deployments@3.0.8': + '@milaboratories/pl-deployments@3.0.15': dependencies: - '@milaboratories/pl-config': 1.8.2 - '@milaboratories/pl-healthcheck': 1.0.1 + '@milaboratories/pl-config': 1.8.5 + '@milaboratories/pl-healthcheck': 1.0.5 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/ts-helpers': 1.8.6 decompress: 4.2.1 ssh2: 1.16.0 tar: 7.4.3 @@ -6125,16 +6200,16 @@ snapshots: yaml: 2.8.1 zod: 3.25.76 - '@milaboratories/pl-drivers@1.16.3': + '@milaboratories/pl-drivers@1.16.15': dependencies: - '@grpc/grpc-js': 1.13.4 - '@milaboratories/computable': 2.9.5 - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-tree': 1.12.14 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@grpc/grpc-js': 1.14.4 + '@milaboratories/computable': 2.9.8 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-tree': 1.13.6 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/plugin': 2.11.1 '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -6154,22 +6229,17 @@ snapshots: json-stringify-safe: 5.0.1 zod: 3.25.76 - '@milaboratories/pl-error-like@1.12.9': + '@milaboratories/pl-errors@1.4.35': dependencies: - json-stringify-safe: 5.0.1 - zod: 3.23.8 - - '@milaboratories/pl-errors@1.4.24': - dependencies: - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/ts-helpers': 1.8.6 zod: 3.25.76 - '@milaboratories/pl-healthcheck@1.0.1': + '@milaboratories/pl-healthcheck@1.0.5': dependencies: - '@grpc/grpc-js': 1.13.4 - '@milaboratories/ts-helpers': 1.8.3 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.13.4) + '@grpc/grpc-js': 1.14.4 + '@milaboratories/ts-helpers': 1.8.6 + '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -6177,33 +6247,33 @@ snapshots: dependencies: undici: 7.16.0 - '@milaboratories/pl-middle-layer@1.64.41(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': - dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pf-driver': 1.7.14(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pf-spec-driver': 1.4.16(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pframes-rs-node': 1.1.52 - '@milaboratories/pframes-rs-wasm': 1.1.52(@bytecodealliance/preview2-shim@0.17.8)(@milaboratories/pl-model-common@1.46.2)(@milaboratories/pl-model-middle-layer@1.30.9) - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/pl-deployments': 3.0.8 - '@milaboratories/pl-drivers': 1.16.3 - '@milaboratories/pl-errors': 1.4.24 + '@milaboratories/pl-middle-layer@1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': + dependencies: + '@milaboratories/columns-collection-driver': 0.2.3 + '@milaboratories/computable': 2.9.8 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pf-driver': 1.9.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pframes-rs-node': 1.1.56 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-deployments': 3.0.15 + '@milaboratories/pl-drivers': 1.16.15 + '@milaboratories/pl-errors': 1.4.35 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.9 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 - '@milaboratories/pl-tree': 1.12.14 + '@milaboratories/pl-model-backend': 1.4.20 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/pl-tree': 1.13.6 '@milaboratories/resolve-helper': 1.1.3 - '@milaboratories/ts-helpers': 1.8.3 - '@platforma-sdk/block-tools': 2.11.6(@types/node@24.5.2) - '@platforma-sdk/model': 1.79.20 - '@platforma-sdk/workflow-tengo': 6.6.5 + '@milaboratories/ts-helpers': 1.8.6 + '@platforma-sdk/block-tools': file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@platforma-sdk/workflow-tengo': file:../../core/platforma/sdk/workflow-tengo/package.tgz canonicalize: 2.1.0 denque: 2.1.0 es-toolkit: 1.39.10 lru-cache: 11.2.2 - quickjs-emscripten: 0.31.0 + quickjs-emscripten: 0.32.0 semver: 7.8.4 undici: 7.16.0 utility-types: 3.11.0 @@ -6217,55 +6287,55 @@ snapshots: - encoding - supports-color - '@milaboratories/pl-model-backend@1.4.9': + '@milaboratories/pl-model-backend@1.4.19': dependencies: - '@milaboratories/pl-client': 3.12.0 + '@milaboratories/pl-client': 3.14.5 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@1.31.2': + '@milaboratories/pl-model-backend@1.4.20': dependencies: - '@milaboratories/helpers': 1.14.1 - '@milaboratories/pl-error-like': 1.12.9 + '@milaboratories/pl-client': 3.14.6 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@1.46.2': + '@milaboratories/pl-model-common@file:../../core/platforma/lib/model/common/package.tgz': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz '@milaboratories/pl-error-like': 1.12.10 canonicalize: 2.1.0 + es-toolkit: 1.39.10 zod: 3.25.76 '@milaboratories/pl-model-middle-layer@1.30.7': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz es-toolkit: 1.39.10 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-model-middle-layer@1.30.9': + '@milaboratories/pl-model-middle-layer@1.31.0': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz es-toolkit: 1.39.10 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-tree@1.12.14': + '@milaboratories/pl-tree@1.13.6': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/pl-errors': 1.4.24 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-errors': 1.4.35 + '@milaboratories/ts-helpers': 1.8.6 denque: 2.1.0 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/ptabler-expression-js@1.2.31': + '@milaboratories/ptabler-expression-js@1.2.37': dependencies: - '@platforma-open/milaboratories.software-ptabler.schema': 1.15.15 + '@platforma-open/milaboratories.software-ptabler.schema': 1.15.21 '@milaboratories/resolve-helper@1.1.3': {} @@ -6273,9 +6343,9 @@ snapshots: '@milaboratories/tengo-tester@1.6.4': {} - '@milaboratories/ts-builder@1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1)': + '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': 1.3.0 + '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.24(typescript@5.8.2)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6314,9 +6384,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1)': + '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': 1.3.0 + '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.6.3)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6355,9 +6425,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1)': + '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': 1.3.0 + '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.2)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6396,9 +6466,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@1.6.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1)': + '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': 1.3.0 + '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.3)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6437,18 +6507,18 @@ snapshots: - vue - yaml - '@milaboratories/ts-configs@1.3.0': {} + '@milaboratories/ts-configs@file:../../core/platforma/tools/ts-configs/package.tgz': {} - '@milaboratories/ts-helpers@1.8.3': + '@milaboratories/ts-helpers@1.8.6': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz canonicalize: 2.1.0 denque: 2.1.0 - '@milaboratories/uikit@2.15.11(typescript@5.8.2)': + '@milaboratories/uikit@file:../../core/platforma/lib/ui/uikit/package.tgz(typescript@5.8.2)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@platforma-sdk/model': 1.79.20 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz '@types/d3-array': 3.2.1 '@types/d3-axis': 3.0.6 '@types/d3-scale': 4.0.9 @@ -6479,11 +6549,11 @@ snapshots: - typescript - universal-cookie - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.3 optional: true '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': @@ -6856,13 +6926,13 @@ snapshots: '@platforma-open/milaboratories.runenv-r-samples-and-data@1.0.1': {} - '@platforma-open/milaboratories.software-ptabler.schema@1.15.15': + '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': dependencies: - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@platforma-open/milaboratories.software-ptabler@2.1.3': {} + '@platforma-open/milaboratories.software-ptabler@2.1.8': {} - '@platforma-open/milaboratories.software-ptexter@1.2.2': {} + '@platforma-open/milaboratories.software-ptexter@1.2.4': {} '@platforma-open/milaboratories.software-small-binaries.hello-world-py@1.0.10': {} @@ -6882,17 +6952,21 @@ snapshots: '@platforma-open/milaboratories.software-small-binaries.mnz-client': 1.6.5 '@platforma-open/milaboratories.software-small-binaries.table-converter': 1.3.5 - '@platforma-sdk/block-tools@2.11.6(@types/node@24.5.2)': + '@platforma-sdk/block-kind@file:../../core/platforma/sdk/block-kind/package.tgz': {} + + '@platforma-sdk/block-tools@file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2)': dependencies: + '@aws-sdk/client-ecr-public': 3.859.0 '@aws-sdk/client-s3': 3.859.0 '@inquirer/prompts': 7.10.1(@types/node@24.5.2) '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.9 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 + '@milaboratories/pl-model-backend': 1.4.19 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-middle-layer': 1.31.0 '@milaboratories/resolve-helper': 1.1.3 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 '@platforma-sdk/blocks-deps-updater': 2.2.0 + '@platforma-sdk/package-builder-lib': 1.2.1 canonicalize: 2.1.0 commander: 15.0.0 lru-cache: 11.2.2 @@ -6909,20 +6983,21 @@ snapshots: dependencies: yaml: 2.8.1 - '@platforma-sdk/model@1.79.20': + '@platforma-sdk/model@file:../../core/platforma/sdk/model/package.tgz': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz '@milaboratories/pl-error-like': 1.12.10 - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/pl-model-middle-layer': 1.30.9 - '@milaboratories/ptabler-expression-js': 1.2.31 + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/ptabler-expression-js': 1.2.37 canonicalize: 2.1.0 es-toolkit: 1.39.10 fast-json-patch: 3.1.1 + lru-cache: 11.2.2 utility-types: 3.11.0 zod: 3.25.76 - '@platforma-sdk/package-builder-lib@1.1.0': + '@platforma-sdk/package-builder-lib@1.2.1': dependencies: '@aws-sdk/client-s3': 3.859.0 '@aws-sdk/lib-storage': 3.859.0(@aws-sdk/client-s3@3.859.0) @@ -6935,30 +7010,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@platforma-sdk/package-builder@3.14.0': + '@platforma-sdk/tengo-builder@4.0.22': dependencies: - '@platforma-sdk/package-builder-lib': 1.1.0 - commander: 15.0.0 - winston: 3.17.0 - transitivePeerDependencies: - - aws-crt - - '@platforma-sdk/tengo-builder@4.0.11': - dependencies: - '@milaboratories/pl-model-backend': 1.4.9 + '@milaboratories/pl-model-backend': 1.4.20 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/tengo-tester': 1.6.4 - '@milaboratories/ts-helpers': 1.8.3 + '@milaboratories/ts-helpers': 1.8.6 commander: 15.0.0 winston: 3.17.0 - '@platforma-sdk/test@1.79.23(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': + '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/pl-middle-layer': 1.64.41(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) - '@milaboratories/pl-tree': 1.12.14 - '@platforma-sdk/model': 1.79.20 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-tree': 1.13.6 + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) transitivePeerDependencies: @@ -6980,13 +7047,13 @@ snapshots: - supports-color - vite - '@platforma-sdk/test@1.79.23(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': + '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: - '@milaboratories/computable': 2.9.5 - '@milaboratories/pl-client': 3.12.0 - '@milaboratories/pl-middle-layer': 1.64.41(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) - '@milaboratories/pl-tree': 1.12.14 - '@platforma-sdk/model': 1.79.20 + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-tree': 1.13.6 + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz '@vitest/coverage-istanbul': 4.1.5(vitest@4.1.5) vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) transitivePeerDependencies: @@ -7008,12 +7075,13 @@ snapshots: - supports-color - vite - '@platforma-sdk/ui-vue@1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2)': + '@platforma-sdk/ui-vue@file:../../core/platforma/sdk/ui-vue/package.tgz(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2)': dependencies: - '@milaboratories/pf-spec-driver': 1.4.16(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pl-model-common': 1.46.2 - '@milaboratories/uikit': 2.15.11(typescript@5.8.2) - '@platforma-sdk/model': 1.79.20 + '@milaboratories/columns-collection-driver': 0.2.3 + '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/uikit': file:../../core/platforma/lib/ui/uikit/package.tgz(typescript@5.8.2) + '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz '@types/d3-format': 3.0.4 '@types/node': 24.5.2 '@types/semver': 7.7.0 @@ -7044,17 +7112,17 @@ snapshots: - typescript - universal-cookie - '@platforma-sdk/workflow-tengo@6.6.5': + '@platforma-sdk/workflow-tengo@file:../../core/platforma/sdk/workflow-tengo/package.tgz': dependencies: - '@milaboratories/pframes-rs-wasip2': 1.1.52 + '@milaboratories/pframes-rs-wasip2': 1.1.56 '@milaboratories/software-pframes-conv': 2.2.9 - '@platforma-open/milaboratories.software-ptabler': 2.1.3 - '@platforma-open/milaboratories.software-ptexter': 1.2.2 + '@platforma-open/milaboratories.software-ptabler': 2.1.8 + '@platforma-open/milaboratories.software-ptexter': 1.2.4 '@platforma-open/milaboratories.software-small-binaries': 2.1.1 - '@protobuf-ts/grpc-transport@2.11.1(@grpc/grpc-js@1.13.4)': + '@protobuf-ts/grpc-transport@2.11.1(@grpc/grpc-js@1.14.4)': dependencies: - '@grpc/grpc-js': 1.13.4 + '@grpc/grpc-js': 1.14.4 '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -7081,24 +7149,21 @@ snapshots: '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.4': {} + '@protobufjs/codegen@2.0.5': {} - '@protobufjs/eventemitter@1.1.0': {} + '@protobufjs/eventemitter@1.1.1': {} - '@protobufjs/fetch@1.1.0': + '@protobufjs/fetch@1.1.1': dependencies: '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 '@protobufjs/float@1.0.2': {} - '@protobufjs/inquire@1.1.0': {} - '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.0': {} + '@protobufjs/utf8@1.1.2': {} '@rolldown/binding-android-arm64@1.0.3': optional: true @@ -7176,7 +7241,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-wasm32-wasi@1.1.3': @@ -7645,11 +7710,6 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tybys/wasm-util@0.10.2': - dependencies: - tslib: 2.8.1 - optional: true - '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -9359,18 +9419,17 @@ snapshots: proto-list@1.2.4: {} - protobufjs@7.4.0: + protobufjs@7.6.5: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 + '@protobufjs/utf8': 1.1.2 '@types/node': 24.5.2 long: 5.3.2 @@ -9391,17 +9450,17 @@ snapshots: queue-microtask@1.2.3: {} - quickjs-emscripten-core@0.31.0: + quickjs-emscripten-core@0.32.0: dependencies: - '@jitl/quickjs-ffi-types': 0.31.0 + '@jitl/quickjs-ffi-types': 0.32.0 - quickjs-emscripten@0.31.0: + quickjs-emscripten@0.32.0: dependencies: - '@jitl/quickjs-wasmfile-debug-asyncify': 0.31.0 - '@jitl/quickjs-wasmfile-debug-sync': 0.31.0 - '@jitl/quickjs-wasmfile-release-asyncify': 0.31.0 - '@jitl/quickjs-wasmfile-release-sync': 0.31.0 - quickjs-emscripten-core: 0.31.0 + '@jitl/quickjs-wasmfile-debug-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-debug-sync': 0.32.0 + '@jitl/quickjs-wasmfile-release-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-release-sync': 0.32.0 + quickjs-emscripten-core: 0.32.0 radashi@12.7.0: {} @@ -10232,6 +10291,4 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod@3.23.8: {} - zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ae8a915..5212077 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - block + - kind - model - software/parse-h5ad - software/parse-seurat @@ -8,18 +9,19 @@ packages: - workflow catalog: - "@platforma-sdk/block-tools": 2.11.6 - "@platforma-sdk/model": 1.79.20 - "@platforma-sdk/ui-vue": 1.79.20 - "@platforma-sdk/tengo-builder": 4.0.11 - "@platforma-sdk/workflow-tengo": 6.6.5 + "@platforma-sdk/block-tools": 2.13.0 + "@platforma-sdk/block-kind": 1.0.0 + "@platforma-sdk/model": 1.81.1 + "@platforma-sdk/ui-vue": 1.81.1 + "@platforma-sdk/tengo-builder": 4.0.22 + "@platforma-sdk/workflow-tengo": 6.8.2 "@platforma-sdk/blocks-deps-updater": 2.2.0 - "@platforma-sdk/package-builder": 3.14.0 + "@platforma-sdk/package-builder": 3.15.0 "@platforma-open/milaboratories.runenv-python-3": ^1.7.5 "@platforma-open/milaboratories.runenv-r-samples-and-data": ^1.0.1 - "@platforma-sdk/test": 1.79.23 + "@platforma-sdk/test": 1.81.3 "@milaboratories/helpers": 1.14.1 "@milaboratories/pl-model-common": ^1.31.2 @@ -43,5 +45,5 @@ catalog: "@changesets/cli": ^2.29.7 "@types/node": ~20.16.15 - "@milaboratories/ts-builder": 1.6.0 - "@milaboratories/ts-configs": 1.3.0 + "@milaboratories/ts-builder": 1.6.2 + "@milaboratories/ts-configs": 1.4.0 diff --git a/software/parse-h5ad/package.json b/software/parse-h5ad/package.json index ba1c0c6..2f0f4f6 100644 --- a/software/parse-h5ad/package.json +++ b/software/parse-h5ad/package.json @@ -7,15 +7,14 @@ ], "type": "module", "scripts": { - "do-pack": "shx rm -f *.tgz && pl-pkg build && pnpm pack && shx mv platforma-open*.tgz package.tgz", - "build": "pl-pkg build", - "prepublishOnly": "pl-pkg prepublish", + "do-pack": "shx rm -f *.tgz && block-tools software build && pnpm pack && shx mv platforma-open*.tgz package.tgz", + "build": "block-tools software build", "changeset": "changeset", "version-packages": "changeset version" }, "devDependencies": { "@platforma-open/milaboratories.runenv-python-3": "catalog:", - "@platforma-sdk/package-builder": "catalog:" + "@platforma-sdk/block-tools": "catalog:" }, "block-software": { "entrypoints": { diff --git a/software/parse-seurat/package.json b/software/parse-seurat/package.json index 5038c1c..a6ab3da 100644 --- a/software/parse-seurat/package.json +++ b/software/parse-seurat/package.json @@ -7,16 +7,16 @@ ], "type": "module", "scripts": { - "build": "pl-pkg build", + "build": "block-tools software build", "test": "true", - "prepublishOnly": "pl-pkg prepublish", "changeset": "changeset", - "version-packages": "changeset version" + "version-packages": "changeset version", + "do-pack": "shx rm -f *.tgz && block-tools software build && pnpm pack && shx mv platforma-open*.tgz package.tgz" }, "devDependencies": { "@platforma-open/milaboratories.runenv-python-3": "catalog:", "@platforma-open/milaboratories.runenv-r-samples-and-data": "catalog:", - "@platforma-sdk/package-builder": "catalog:" + "@platforma-sdk/block-tools": "catalog:" }, "block-software": { "entrypoints": { diff --git a/test/.oxfmtrc.json b/test/.oxfmtrc.json index 7eff5e7..6f74854 100644 --- a/test/.oxfmtrc.json +++ b/test/.oxfmtrc.json @@ -1,4 +1,4 @@ { "extends": ["node_modules/@milaboratories/ts-builder/configs/oxfmt.json"], - "ignorePatterns": ["dist", "coverage", "CHANGELOG.md"] + "ignorePatterns": ["dist", "coverage", "CHANGELOG.md", ".test_auth.json"] } diff --git a/turbo.json b/turbo.json index a0530ea..d079cd3 100644 --- a/turbo.json +++ b/turbo.json @@ -12,13 +12,23 @@ "build": { "dependsOn": ["^build", "check"], "inputs": ["$TURBO_DEFAULT$"], - "env": ["PL_PKG_DEV", "PL_DOCKER_REGISTRY_PUSH_TO"], + "env": [ + "PL_DOCKER_REGISTRY_PUSH_TO", + "PL_BUILD_CHANNEL", + "PL_BUILD_VARIANT", + "PL_BUILD_LOCATION", + "PL_BUILD_USE_PUBLISHED", + "PL_DEV_DOCKER_PUSH_URL", + "PL_DEV_DOCKER_PULL_URL", + "PL_DEV_BINARY_UPLOAD_URL", + "PL_RELEASE_DOCKER_PUSH_URL", + "PL_RELEASE_DOCKER_PULL_URL", + "PL_RELEASE_BINARY_UPLOAD_URL", + "PL_REGISTRY_PLATFORMA_OPEN_UPLOAD_URL" + ], + "passThroughEnv": ["AWS_*", "PL_AWS_*"], "outputs": ["./dist/**", "./block-pack/**", "./pkg-*.tgz"] }, - "build:dev": { - "dependsOn": ["build"], - "outputs": ["./dist/**"] - }, "do-pack": { "dependsOn": ["build"], "outputs": ["package.tgz"] From 510bf5c4e78e944ce962e07bb7f1b7f8ae194efc Mon Sep 17 00:00:00 2001 From: Alexandr Date: Mon, 17 Aug 2026 17:53:53 +0200 Subject: [PATCH 02/11] feat: declare block kind with template init params MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every block must declare a kind; this one's init-params contract is the study setup a project template supplies — the metadata columns the study collects, the name of the sample column, and how its datasets are configured — plus whichever of its data can be resolved from where the block lands. Either the whole study travels or none of its data does. Block state is one connected thing: datasets key their files by sample or by group, sample groups and multiplexing rules name those samples, metadata values are keyed by them, and args holds the pieces to each other. So when every file is a storage reference (index:// names a storage and a path) the state goes as it stands; when any file is a local upload — a machine-local path signed with the installation's own secret — only the setup goes, and the new project imports its own data. Carrying part of it would mean picking which invariant to break. metadataUploadHandle stays out of the contract: it is not a link to the metadata table but scaffolding for one import dialog, cleared as soon as the parsed values land in metadata. The dataset and metadata types move into the kind package and are re-exported from the model, so every existing import keeps resolving. Also replaces the removed TreeNodeAccessor.resolveAny with traverse, which the SDK upgrade requires. --- kind/.oxfmtrc.json | 4 + kind/.oxlintrc.json | 3 + kind/package.json | 37 ++++++ kind/src/index.ts | 196 ++++++++++++++++++++++++++++ kind/src/types.ts | 228 +++++++++++++++++++++++++++++++++ kind/tsconfig.json | 10 ++ model/src/args.ts | 241 ++--------------------------------- model/src/data_model.ts | 27 ++-- model/src/index.ts | 12 +- model/src/template_params.ts | 113 ++++++++++++++++ 10 files changed, 631 insertions(+), 240 deletions(-) create mode 100644 kind/.oxfmtrc.json create mode 100644 kind/.oxlintrc.json create mode 100644 kind/package.json create mode 100644 kind/src/index.ts create mode 100644 kind/src/types.ts create mode 100644 kind/tsconfig.json create mode 100644 model/src/template_params.ts diff --git a/kind/.oxfmtrc.json b/kind/.oxfmtrc.json new file mode 100644 index 0000000..7eff5e7 --- /dev/null +++ b/kind/.oxfmtrc.json @@ -0,0 +1,4 @@ +{ + "extends": ["node_modules/@milaboratories/ts-builder/configs/oxfmt.json"], + "ignorePatterns": ["dist", "coverage", "CHANGELOG.md"] +} diff --git a/kind/.oxlintrc.json b/kind/.oxlintrc.json new file mode 100644 index 0000000..b1a1390 --- /dev/null +++ b/kind/.oxlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["node_modules/@milaboratories/ts-builder/dist/configs/oxlint-node.json"] +} diff --git a/kind/package.json b/kind/package.json new file mode 100644 index 0000000..0afc923 --- /dev/null +++ b/kind/package.json @@ -0,0 +1,37 @@ +{ + "name": "@platforma-open/milaboratories.samples-and-data.kind", + "version": "1.0.0", + "private": true, + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "sources": "./src/index.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "default": "./dist/index.js" + } + }, + "scripts": { + "fmt": "ts-builder format", + "watch": "ts-builder build --target block-kind --watch", + "build": "ts-builder build --target block-kind && block-tools build-kind-manifest", + "check": "ts-builder check --target block-kind" + }, + "dependencies": { + "@milaboratories/pl-model-common": "catalog:", + "@platforma-sdk/block-kind": "catalog:" + }, + "devDependencies": { + "@milaboratories/ts-builder": "catalog:", + "@milaboratories/ts-configs": "catalog:", + "@platforma-sdk/block-tools": "catalog:" + }, + "peerDependencies": { + "@types/node": "*", + "typescript": "*" + } +} diff --git a/kind/src/index.ts b/kind/src/index.ts new file mode 100644 index 0000000..a9edf85 --- /dev/null +++ b/kind/src/index.ts @@ -0,0 +1,196 @@ +import { assertParamsObject, defineBlockKind } from "@platforma-sdk/block-kind"; +import { name, version } from "../package.json" with { type: "json" }; +import type { DSAny, DSType, ImportFileHandle, MTColumn, MTValueType, PlId } from "./types"; + +export * from "./types"; + +/** + * This block's init-params contract — the study setup a creator or a project + * template supplies to seed a new instance: which metadata columns the study + * collects, how the sample column is named, how its datasets are configured, + * and whichever of its files can be resolved from where the block lands. + * + * A file travels only when it is a storage reference: `index://` names a + * `{storageId, path}` any installation carrying that storage can resolve, while + * `upload://` carries a local path signed with the installation's own secret. + * Samples travel with the files that produced them and not otherwise — samples + * are created by importing files, so a sample arriving without its file would + * be a row with metadata and no data, for the user to delete. + * + * Which of the two a given dataset gets is the exporting block's call, not this + * contract's: both a fully populated dataset and a bare shell are ordinary + * states of the block, so both are valid params. + * + * Every field is optional because a block may be created without a template, so + * `init` keeps a default for each. + */ +export type BlockParams = Partial<{ + datasets: DSAny[]; + metadata: MTColumn[]; + sampleIds: PlId[]; + sampleLabelColumnLabel: string; + sampleLabels: Record; + h5adFilesToPreprocess: ImportFileHandle[]; + seuratFilesToPreprocess: ImportFileHandle[]; +}>; + +/** + * The same contract at runtime, for params that arrive from a template file + * rather than from typed code — the only point that can catch a hand-written + * entry being wrong. + * + * Checks are at the envelope: an entry is an object, its discriminator is one + * this block knows, its scalar fields are the right primitives. What a value + * *means* is settled where it is used — the block's own `args` is what holds + * datasets, groups and rules to each other, and rejecting a half-configured + * study here would refuse states the editor can reach. + * + * The file handles inside a dataset are deliberately not walked. Their shape + * differs per dataset kind, and whether a handle still resolves is knowable only + * where the block runs, not here — the same limit every kind has on a handle. + */ +function parseInitializationParams(value: unknown): BlockParams { + assertParamsObject(value); + + const { + datasets, + metadata, + sampleIds, + sampleLabelColumnLabel, + sampleLabels, + h5adFilesToPreprocess, + seuratFilesToPreprocess, + } = value; + + if (sampleLabelColumnLabel !== undefined && typeof sampleLabelColumnLabel !== "string") { + throw new Error("'sampleLabelColumnLabel' must be a string."); + } + + if (metadata !== undefined) { + if (!Array.isArray(metadata)) throw new Error("'metadata' must be an array of columns."); + metadata.forEach(assertMetadataColumn); + } + + if (datasets !== undefined) { + if (!Array.isArray(datasets)) throw new Error("'datasets' must be an array of datasets."); + datasets.forEach(assertDataset); + } + + assertStringArray(sampleIds, "sampleIds"); + assertStringArray(h5adFilesToPreprocess, "h5adFilesToPreprocess"); + assertStringArray(seuratFilesToPreprocess, "seuratFilesToPreprocess"); + + if (sampleLabels !== undefined) { + assertObject(sampleLabels, "'sampleLabels'"); + for (const [id, label] of Object.entries(sampleLabels)) { + if (typeof label !== "string") { + throw new Error(`'sampleLabels' entry ${JSON.stringify(id)} must be a string.`); + } + } + } + + return { + datasets: datasets as DSAny[] | undefined, + metadata: metadata as MTColumn[] | undefined, + sampleIds: sampleIds as PlId[] | undefined, + sampleLabelColumnLabel, + sampleLabels: sampleLabels as Record | undefined, + h5adFilesToPreprocess: h5adFilesToPreprocess as ImportFileHandle[] | undefined, + seuratFilesToPreprocess: seuratFilesToPreprocess as ImportFileHandle[] | undefined, + }; +} + +function assertStringArray(value: unknown, field: string): void { + if (value === undefined) return; + if (!Array.isArray(value) || value.some((v) => typeof v !== "string")) { + throw new Error(`'${field}' must be an array of strings.`); + } +} + +/** + * The value types a metadata column may declare, as a runtime set. `satisfies + * Record` is what keeps it in step: a value type added to the + * union and forgotten here fails to compile, rather than turning into a kind + * that refuses a correct file. + */ +const MT_VALUE_TYPES = { + Long: true, + Double: true, + String: true, +} as const satisfies Record; + +/** The dataset kinds this block knows, kept in step with the union the same way. */ +const DATASET_TYPES = { + Fastq: true, + MultilaneFastq: true, + TaggedFastq: true, + Fasta: true, + Xsv: true, + TaggedXsv: true, + BulkCountMatrix: true, + CellRangerMTX: true, + MultiplexedFastq: true, + H5AD: true, + H5: true, + Seurat: true, + MultiSampleH5AD: true, + MultiSampleSeurat: true, +} as const satisfies Record; + +function assertMetadataColumn(column: unknown, index: number): void { + const where = `metadata column ${index}`; + assertObject(column, where); + + if (typeof column.id !== "string") throw new Error(`'id' of ${where} must be a string.`); + if (typeof column.label !== "string") throw new Error(`'label' of ${where} must be a string.`); + if (typeof column.global !== "boolean") + throw new Error(`'global' of ${where} must be a boolean.`); + if (!isKeyOf(MT_VALUE_TYPES, column.valueType)) { + throw new Error( + `'valueType' of ${where} must be one of ${keyList(MT_VALUE_TYPES)}, not ${JSON.stringify(column.valueType)}.`, + ); + } +} + +function assertDataset(dataset: unknown, index: number): void { + const where = `dataset ${index}`; + assertObject(dataset, where); + + if (typeof dataset.id !== "string") throw new Error(`'id' of ${where} must be a string.`); + if (typeof dataset.label !== "string") throw new Error(`'label' of ${where} must be a string.`); + + const content = dataset.content; + assertObject(content, `'content' of ${where}`); + + if (!isKeyOf(DATASET_TYPES, content.type)) { + throw new Error( + `'content.type' of ${where} must be one of ${keyList(DATASET_TYPES)}, not ${JSON.stringify(content.type)}.`, + ); + } + if (typeof content.gzipped !== "boolean") { + throw new Error(`'content.gzipped' of ${where} must be a boolean.`); + } +} + +function assertObject(value: unknown, where: string): asserts value is Record { + if (typeof value !== "object" || value === null || Array.isArray(value)) { + throw new Error(`${where} must be an object.`); + } +} + +function isKeyOf(set: Record, key: unknown): key is string { + return typeof key === "string" && key in set; +} + +function keyList(set: Record): string { + return Object.keys(set).join(", "); +} + +// Identity (`name`/`version`) comes from this package's own `package.json`, so +// the on-wire `{name}@{version}` reference can never drift from what npm +// publishes; the bundler inlines the JSON import. +export const kind = defineBlockKind({ + name, + version, + parseInitializationParams, +}); diff --git a/kind/src/types.ts b/kind/src/types.ts new file mode 100644 index 0000000..638f4b5 --- /dev/null +++ b/kind/src/types.ts @@ -0,0 +1,228 @@ +import type { ImportFileHandle, PlId } from "@milaboratories/pl-model-common"; +export type { ImportFileHandle, PlId } from "@milaboratories/pl-model-common"; + +/** ***** Metadata *******/ + +export type MTValueTypeLong = "Long"; +export type MTValueTypeDouble = "Double"; +export type MTValueTypeString = "String"; + +export interface MTColumnInfo { + /** + * Id of the metadata column, that is assigned when column is created and never changes. + * Value of this field will also used in resulting PColumn domain, if global option is false. + * If global is set to true, normalized label will be used. + */ + id: string; + /** + * Human readable name of the metadata column. + * Value of this field will be used in resulting PColumn domain, if global option is true. + * String normalization proceduyre will be applied before setting the domain. + */ + label: string; + /** + * Regulates identifier derivation, see description of the fields above. + */ + global: boolean; +} + +export interface MTDataDouble { + valueType: MTValueTypeDouble; + data: Record; +} + +export interface MTDataLong { + valueType: MTValueTypeLong; + data: Record; +} + +export interface MTDataString { + valueType: MTValueTypeString; + data: Record; +} + +export type MTColumn = (MTDataDouble | MTDataLong | MTDataString) & MTColumnInfo; +export type MTValueType = MTColumn["valueType"]; + +export interface IDSContent { + gzipped: boolean; +} + +/// --------------- Per Sample Datasets --------------- /// + +/** Datasets that have data per sample */ +export interface WithPerSampleData extends IDSContent { + // sample -> data + data: Record; +} + +export type ReadIndex = "R1" | "R2" | "I1" | "I2"; +export type ReadIndices = ReadIndex[]; +export type FastqFileGroup = Partial>; + +export interface DSContentFastq extends WithPerSampleData { + type: "Fastq"; + readIndices: ReadIndex[]; +} + +/* null means sample is added to the dataset, but file is not yet set */ +export interface DSContentFasta extends WithPerSampleData { + type: "Fasta"; +} + +export type Lane = string; + +export interface DSContentMultilaneFastq extends WithPerSampleData> { + type: "MultilaneFastq"; + readIndices: ReadIndex[]; +} + +export interface TaggedDatasetRecord { + lane?: string; + tags: Record; + files: FastqFileGroup; +} + +export interface DSContentTaggedFastq extends WithPerSampleData { + type: "TaggedFastq"; + readIndices: ReadIndex[]; + hasLanes: boolean; + tags: string[]; +} + +/* null means sample is added to the dataset, but file is not yet set */ +export interface DSContentXsv extends WithPerSampleData { + type: "Xsv"; + xsvType: "csv" | "tsv"; +} + +export interface TaggedXsvDatasetRecord { + tags: Record; + file: ImportFileHandle; +} + +export interface DSContentTaggedXsv extends WithPerSampleData { + type: "TaggedXsv"; + xsvType: "csv" | "tsv"; + tags: string[]; +} + +export type CellRangerMtxRole = "matrix.mtx" | "features.tsv" | "barcodes.tsv"; +export type CellRangerMtxFileGroup = Partial>; + +export interface DSContentCellRangerMtx extends WithPerSampleData { + type: "CellRangerMTX"; +} + +export interface DSContentH5ad extends WithPerSampleData { + type: "H5AD"; +} + +export interface DSContentH5 extends WithPerSampleData { + type: "H5"; +} + +export interface DSContentSeurat extends WithPerSampleData { + type: "Seurat"; +} + +/// --------------- Grouped Datasets --------------- /// + +/** Datasets that have data per sample */ +export interface WithSampleGroupsData extends IDSContent { + // group -> data + data: Record; + // group -> sampleId in dataset -> sample name in the file + sampleGroups: Record> | undefined; + // group id -> group name + groupLabels: Record; +} + +export interface DSContentBulkCountMatrix extends WithSampleGroupsData { + type: "BulkCountMatrix"; + xsvType: "csv" | "tsv"; +} + +/** + * One row in the Multiplexing Rules table. The same `(sampleGroupId, sampleId)` + * pair may appear multiple times — those entries represent per-sample + * alternatives (outer OR). `barcodes` keys are the dataset's declared + * `barcodeTags`; a multi-key record is an AND combination across tags. + * + * `ruleId` is a stable, block-local identifier used for ag-grid row identity, + * selection state across re-renders, and rule deletion. Plain string — these + * ids never leave the block, so they don't need to be globally unique PlIds. + */ +export interface BarcodeRule { + ruleId: string; + sampleGroupId: PlId; + sampleId: PlId; + barcodes: Record; +} + +export interface DSContentMultiplexedFastq extends WithSampleGroupsData { + type: "MultiplexedFastq"; + readIndices: ReadIndex[]; + /** Ordered, user-declared list of barcode tag names. */ + barcodeTags: string[]; + /** Flat per-sample multiplexing rules. */ + barcodeRules: BarcodeRule[]; +} + +export interface DSContentMultiSampleH5ad extends WithSampleGroupsData { + type: "MultiSampleH5AD"; + sampleColumnName?: string; +} + +export interface DSContentMultiSampleSeurat extends WithSampleGroupsData { + type: "MultiSampleSeurat"; + sampleColumnName?: string; +} + +/// --------------- End of Datasets --------------- /// + +export type DSContent = + | DSContentFastq + | DSContentMultilaneFastq + | DSContentTaggedFastq + | DSContentFasta + | DSContentXsv + | DSContentTaggedXsv + | DSContentBulkCountMatrix + | DSContentCellRangerMtx + | DSContentMultiplexedFastq + | DSContentH5ad + | DSContentH5 + | DSContentSeurat + | DSContentMultiSampleH5ad + | DSContentMultiSampleSeurat; + +export interface Dataset { + id: PlId; + label: string; + content: ContentType; +} + +export type DSAny = Dataset; +export type DSFasta = Dataset; +export type DSFastq = Dataset; +export type DSMultilaneFastq = Dataset; +export type DSTaggedFastq = Dataset; +export type DSXsv = Dataset; +export type DSTaggedXsv = Dataset; +export type DSCellRangerMtx = Dataset; +export type DSBulkCountMatrix = Dataset; +export type DSMultiplexedFastq = Dataset; +export type DSH5ad = Dataset; +export type DSH5 = Dataset; +export type DSSeurat = Dataset; +export type DSMultiSampleH5ad = Dataset; +export type DSMultiSampleSeurat = Dataset; + +export type DSType = DSAny["content"]["type"]; + +export type DSGrouped = + | DSBulkCountMatrix + | DSMultiSampleH5ad + | DSMultiplexedFastq + | DSMultiSampleSeurat; diff --git a/kind/tsconfig.json b/kind/tsconfig.json new file mode 100644 index 0000000..5411207 --- /dev/null +++ b/kind/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@milaboratories/ts-configs/block/facade", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "resolveJsonModule": true + }, + "include": ["src/**/*", "package.json"], + "exclude": ["dist", "node_modules"] +} diff --git a/model/src/args.ts b/model/src/args.ts index 6218d4a..f2b9c54 100644 --- a/model/src/args.ts +++ b/model/src/args.ts @@ -1,164 +1,16 @@ -import type { ImportFileHandle, PlId } from "@platforma-sdk/model"; -export type { PlId } from "@platforma-sdk/model"; - -/** ***** Metadata *******/ - -export type MTValueTypeLong = "Long"; -export type MTValueTypeDouble = "Double"; -export type MTValueTypeString = "String"; - -export interface MTColumnInfo { - /** - * Id of the metadata column, that is assigned when column is created and never changes. - * Value of this field will also used in resulting PColumn domain, if global option is false. - * If global is set to true, normalized label will be used. - */ - id: string; - /** - * Human readable name of the metadata column. - * Value of this field will be used in resulting PColumn domain, if global option is true. - * String normalization proceduyre will be applied before setting the domain. - */ - label: string; - /** - * Regulates identifier derivation, see description of the fields above. - */ - global: boolean; -} - -export interface MTDataDouble { - valueType: MTValueTypeDouble; - data: Record; -} - -export interface MTDataLong { - valueType: MTValueTypeLong; - data: Record; -} - -export interface MTDataString { - valueType: MTValueTypeString; - data: Record; -} - -export type MTColumn = (MTDataDouble | MTDataLong | MTDataString) & MTColumnInfo; -export type MTValueType = MTColumn["valueType"]; - -export interface IDSContent { - gzipped: boolean; -} - -/// --------------- Per Sample Datasets --------------- /// - -/** Datasets that have data per sample */ -export interface WithPerSampleData extends IDSContent { - // sample -> data - data: Record; -} - -export type ReadIndex = "R1" | "R2" | "I1" | "I2"; -export type ReadIndices = ReadIndex[]; -export type FastqFileGroup = Partial>; - -export interface DSContentFastq extends WithPerSampleData { - type: "Fastq"; - readIndices: ReadIndex[]; -} - -/* null means sample is added to the dataset, but file is not yet set */ -export interface DSContentFasta extends WithPerSampleData { - type: "Fasta"; -} - -export type Lane = string; - -export interface DSContentMultilaneFastq extends WithPerSampleData> { - type: "MultilaneFastq"; - readIndices: ReadIndex[]; -} - -export interface TaggedDatasetRecord { - lane?: string; - tags: Record; - files: FastqFileGroup; -} - -export interface DSContentTaggedFastq extends WithPerSampleData { - type: "TaggedFastq"; - readIndices: ReadIndex[]; - hasLanes: boolean; - tags: string[]; -} - -/* null means sample is added to the dataset, but file is not yet set */ -export interface DSContentXsv extends WithPerSampleData { - type: "Xsv"; - xsvType: "csv" | "tsv"; -} - -export interface TaggedXsvDatasetRecord { - tags: Record; - file: ImportFileHandle; -} - -export interface DSContentTaggedXsv extends WithPerSampleData { - type: "TaggedXsv"; - xsvType: "csv" | "tsv"; - tags: string[]; -} - -export type CellRangerMtxRole = "matrix.mtx" | "features.tsv" | "barcodes.tsv"; -export type CellRangerMtxFileGroup = Partial>; - -export interface DSContentCellRangerMtx extends WithPerSampleData { - type: "CellRangerMTX"; -} - -export interface DSContentH5ad extends WithPerSampleData { - type: "H5AD"; -} - -export interface DSContentH5 extends WithPerSampleData { - type: "H5"; -} - -export interface DSContentSeurat extends WithPerSampleData { - type: "Seurat"; -} - -/// --------------- Grouped Datasets --------------- /// - -/** Datasets that have data per sample */ -export interface WithSampleGroupsData extends IDSContent { - // group -> data - data: Record; - // group -> sampleId in dataset -> sample name in the file - sampleGroups: Record> | undefined; - // group id -> group name - groupLabels: Record; -} - -export interface DSContentBulkCountMatrix extends WithSampleGroupsData { - type: "BulkCountMatrix"; - xsvType: "csv" | "tsv"; -} - -/** - * One row in the Multiplexing Rules table. The same `(sampleGroupId, sampleId)` - * pair may appear multiple times — those entries represent per-sample - * alternatives (outer OR). `barcodes` keys are the dataset's declared - * `barcodeTags`; a multi-key record is an AND combination across tags. - * - * `ruleId` is a stable, block-local identifier used for ag-grid row identity, - * selection state across re-renders, and rule deletion. Plain string — these - * ids never leave the block, so they don't need to be globally unique PlIds. - */ -export interface BarcodeRule { - ruleId: string; - sampleGroupId: PlId; - sampleId: PlId; - barcodes: Record; -} +import type { ImportFileHandle } from "@platforma-sdk/model"; +import type { + DSAny, + DSGrouped, + MTColumn, + PlId, +} from "@platforma-open/milaboratories.samples-and-data.kind"; + +// The dataset and metadata shapes are the block's init-params contract, so they +// are declared by the kind and re-exported here: the model depends on the kind, +// never the other way round, and every existing `from "...model"` import keeps +// resolving. +export * from "@platforma-open/milaboratories.samples-and-data.kind"; // Block-local rule id generator. Avoids `uniquePlId` / `crypto.randomUUID` // because the model migration step runs in a sandbox without the Web Crypto @@ -167,73 +19,6 @@ export function makeRuleId(): string { return Math.random().toString(36).slice(2, 12); } -export interface DSContentMultiplexedFastq extends WithSampleGroupsData { - type: "MultiplexedFastq"; - readIndices: ReadIndex[]; - /** Ordered, user-declared list of barcode tag names. */ - barcodeTags: string[]; - /** Flat per-sample multiplexing rules. */ - barcodeRules: BarcodeRule[]; -} - -export interface DSContentMultiSampleH5ad extends WithSampleGroupsData { - type: "MultiSampleH5AD"; - sampleColumnName?: string; -} - -export interface DSContentMultiSampleSeurat extends WithSampleGroupsData { - type: "MultiSampleSeurat"; - sampleColumnName?: string; -} - -/// --------------- End of Datasets --------------- /// - -export type DSContent = - | DSContentFastq - | DSContentMultilaneFastq - | DSContentTaggedFastq - | DSContentFasta - | DSContentXsv - | DSContentTaggedXsv - | DSContentBulkCountMatrix - | DSContentCellRangerMtx - | DSContentMultiplexedFastq - | DSContentH5ad - | DSContentH5 - | DSContentSeurat - | DSContentMultiSampleH5ad - | DSContentMultiSampleSeurat; - -export interface Dataset { - id: PlId; - label: string; - content: ContentType; -} - -export type DSAny = Dataset; -export type DSFasta = Dataset; -export type DSFastq = Dataset; -export type DSMultilaneFastq = Dataset; -export type DSTaggedFastq = Dataset; -export type DSXsv = Dataset; -export type DSTaggedXsv = Dataset; -export type DSCellRangerMtx = Dataset; -export type DSBulkCountMatrix = Dataset; -export type DSMultiplexedFastq = Dataset; -export type DSH5ad = Dataset; -export type DSH5 = Dataset; -export type DSSeurat = Dataset; -export type DSMultiSampleH5ad = Dataset; -export type DSMultiSampleSeurat = Dataset; - -export type DSType = DSAny["content"]["type"]; - -export type DSGrouped = - | DSBulkCountMatrix - | DSMultiSampleH5ad - | DSMultiplexedFastq - | DSMultiSampleSeurat; - export function isGroupedDataset(ds: DSAny): ds is DSGrouped { return ( ds.content.type === "BulkCountMatrix" || diff --git a/model/src/data_model.ts b/model/src/data_model.ts index d582da6..d182449 100644 --- a/model/src/data_model.ts +++ b/model/src/data_model.ts @@ -1,3 +1,4 @@ +import { kind } from "@platforma-open/milaboratories.samples-and-data.kind"; import { DataModelBuilder } from "@platforma-sdk/model"; import type { BarcodeRule, @@ -73,21 +74,29 @@ function upgradeMultiplexedDatasets(prev: BlockDataV20260427): BlockDataV2026042 return { ...prev, datasets }; } -export const blockDataModel = new DataModelBuilder() +export const blockDataModel = new DataModelBuilder({ kind }) .from("V20260427") .upgradeLegacy(({ args, uiState }) => ({ ...args, suggestedImport: uiState?.suggestedImport ?? false, })) .migrate("V20260428", upgradeMultiplexedDatasets) - .init(() => ({ - datasets: [], - metadata: [], - sampleIds: [], - sampleLabelColumnLabel: "Sample", - sampleLabels: {}, - h5adFilesToPreprocess: [], - seuratFilesToPreprocess: [], + // `params` carries the study setup a project template supplies, plus whatever + // of its data came with files a new installation can resolve — see the kind's + // contract. Optional, because a block may be created without a template, so + // every field keeps a default. + // + // `metadataUploadHandle` is absent from the contract on purpose: it is not a + // link to the metadata table but scaffolding for one import dialog, cleared as + // soon as the parsed values land in `metadata`. + .init(({ params }) => ({ + datasets: params?.datasets ?? [], + metadata: params?.metadata ?? [], + sampleIds: params?.sampleIds ?? [], + sampleLabelColumnLabel: params?.sampleLabelColumnLabel ?? "Sample", + sampleLabels: params?.sampleLabels ?? {}, + h5adFilesToPreprocess: params?.h5adFilesToPreprocess ?? [], + seuratFilesToPreprocess: params?.seuratFilesToPreprocess ?? [], metadataUploadHandle: undefined, suggestedImport: false, })); diff --git a/model/src/index.ts b/model/src/index.ts index b460f98..2e3afa6 100644 --- a/model/src/index.ts +++ b/model/src/index.ts @@ -1,8 +1,11 @@ +import { kind } from "@platforma-open/milaboratories.samples-and-data.kind"; import type { ImportFileHandle, InferHrefType, InferOutputsType, PlId } from "@platforma-sdk/model"; import { BlockModelV3 } from "@platforma-sdk/model"; import { blockDataModel } from "./data_model"; -import { isGroupedDataset, type BlockArgs, type BlockPrerunArgs, type DSAny } from "./args"; +import { isGroupedDataset } from "./args"; +import type { BlockArgs, BlockPrerunArgs, DSAny } from "./args"; import { validateMultiplexingRules } from "./multiplexing-rules-validation"; +import { deriveTemplateParams } from "./template_params"; function validateDatasets(datasets: DSAny[]) { const valid = datasets.every((ds) => { @@ -22,7 +25,7 @@ function sortedStr(items: S[]): S[] { return [...items].sort(); } -export const platforma = BlockModelV3.create(blockDataModel) +export const platforma = BlockModelV3.create({ dataModel: blockDataModel, kind }) .args((data) => { validateDatasets(data.datasets); @@ -47,6 +50,8 @@ export const platforma = BlockModelV3.create(blockDataModel) }; }) + .templateParams(deriveTemplateParams) + .output( "fileImports", (ctx) => { @@ -125,7 +130,7 @@ export const platforma = BlockModelV3.create(blockDataModel) }) .retentiveOutput("metadataFile", (ctx) => - ctx.prerun?.resolveAny({ field: "metadataFile" })?.getFileHandle(), + ctx.prerun?.traverse({ field: "metadataFile" })?.getFileHandle(), ) .title(() => "Samples & Data") @@ -160,3 +165,4 @@ export type BlockOutputs = InferOutputsType; export type Href = InferHrefType; export * from "./args"; export * from "./multiplexing-rules-validation"; +export * from "./template_params"; diff --git a/model/src/template_params.ts b/model/src/template_params.ts new file mode 100644 index 0000000..fe738b9 --- /dev/null +++ b/model/src/template_params.ts @@ -0,0 +1,113 @@ +import type { BlockParams } from "@platforma-open/milaboratories.samples-and-data.kind"; +import type { ImportFileHandle } from "@platforma-sdk/model"; +import { assertNever, isImportFileHandleIndex } from "@platforma-sdk/model"; +import { isGroupedDataset } from "./args"; +import type { BlockData, DSAny, DSContent, MTColumn } from "./args"; + +/** + * Collects every file slot a dataset holds, empty ones included. + * + * Exhaustive over the dataset kinds: a kind added to `DSContent` and not handled + * here fails to compile on `assertNever`, rather than silently reporting that + * the new kind holds no files — which would make it look portable and send its + * local uploads into a template. + */ +function collectDatasetHandles(content: DSContent): (ImportFileHandle | null | undefined)[] { + switch (content.type) { + case "Fastq": + case "MultiplexedFastq": + case "CellRangerMTX": + return Object.values(content.data).flatMap((group) => Object.values(group)); + case "MultilaneFastq": + return Object.values(content.data).flatMap((lanes) => + Object.values(lanes).flatMap((group) => Object.values(group)), + ); + case "TaggedFastq": + return Object.values(content.data).flatMap((records) => + records.flatMap((record) => Object.values(record.files)), + ); + case "TaggedXsv": + return Object.values(content.data).flatMap((records) => records.map((record) => record.file)); + case "Fasta": + case "Xsv": + case "H5AD": + case "H5": + case "Seurat": + case "BulkCountMatrix": + case "MultiSampleH5AD": + case "MultiSampleSeurat": + return Object.values(content.data); + default: + return assertNever(content); + } +} + +/** + * Tells whether a dataset holds no file that is bound to this machine. + * + * A storage reference (`index://`) names a `{storageId, path}` any installation + * carrying that storage can resolve; an upload handle carries a local path + * signed with the installation's own secret and resolves nowhere else. A slot + * with no file yet is neither, so it does not stand in the way. + */ +function isDatasetPortable(ds: DSAny): boolean { + return collectDatasetHandles(ds.content).every((h) => h == null || isImportFileHandleIndex(h)); +} + +/** + * Strips everything a dataset holds per sample or per group, keeping how the + * dataset is configured: its type, read indices, tag names, barcode tags, xsv + * flavour, sample column name. + */ +function stripDatasetData(ds: DSAny): DSAny { + const grouped = isGroupedDataset(ds); + return { + ...ds, + // Cleared by name, not per dataset kind: the group fields exist only on + // grouped datasets and the rules only on multiplexed ones, so they are + // spread in conditionally and the union is restored by the one cast. + content: { + ...ds.content, + data: {}, + ...(grouped ? { sampleGroups: undefined, groupLabels: {} } : {}), + ...(ds.content.type === "MultiplexedFastq" ? { barcodeRules: [] } : {}), + } as DSContent, + }; +} + +/** Strips a metadata column's values, which are keyed by sample. */ +function stripColumnValues(column: MTColumn): MTColumn { + return { ...column, data: {} }; +} + +/** + * Derives the params a project exported as a template hands the block it seeds — + * the inverse of the data model's `init`. + * + * Either the whole study travels or none of its data does. The block's state is + * one connected thing — datasets key their files by sample or by group, sample + * groups and multiplexing rules name those samples, metadata values are keyed by + * them, and `args` holds the pieces to each other — so carrying part of it means + * choosing which invariants to break. When every file can be resolved from where + * the block lands, the state goes as it stands; when any file is local to this + * machine, only the study's setup goes and the new project imports its own data. + */ +export function deriveTemplateParams(data: BlockData): BlockParams { + if (data.datasets.every(isDatasetPortable)) { + return { + datasets: data.datasets, + metadata: data.metadata, + sampleIds: data.sampleIds, + sampleLabelColumnLabel: data.sampleLabelColumnLabel, + sampleLabels: data.sampleLabels, + h5adFilesToPreprocess: data.h5adFilesToPreprocess, + seuratFilesToPreprocess: data.seuratFilesToPreprocess, + }; + } + + return { + datasets: data.datasets.map(stripDatasetData), + metadata: data.metadata.map(stripColumnValues), + sampleLabelColumnLabel: data.sampleLabelColumnLabel, + }; +} From 83219010ce38165751a01de550b4a3bfb912dbaf Mon Sep 17 00:00:00 2001 From: Alexandr Date: Mon, 17 Aug 2026 17:54:00 +0200 Subject: [PATCH 03/11] chore: add changeset for the structure v2 migration and block kind --- .changeset/soft-hoops-search.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .changeset/soft-hoops-search.md diff --git a/.changeset/soft-hoops-search.md b/.changeset/soft-hoops-search.md new file mode 100644 index 0000000..cba5d9a --- /dev/null +++ b/.changeset/soft-hoops-search.md @@ -0,0 +1,31 @@ +--- +'@platforma-open/milaboratories.samples-and-data.parse-h5ad': patch +'@platforma-open/milaboratories.samples-and-data.parse-seurat': patch +'@platforma-open/milaboratories.samples-and-data.model': minor +'@platforma-open/milaboratories.samples-and-data': minor +--- + +Migrate to structure v2 and declare a block kind + +The SDK upgrade moves the block onto the current canonical layout (block-tools +2.13.0, model/ui-vue 1.81.1, workflow-tengo 6.8.2, tengo-builder 4.0.22) and +switches the software packages from `pl-pkg` to `block-tools software build`. + +The block now declares a kind, whose init-params contract is the study setup a +project template supplies — the metadata columns the study collects, the name of +the sample column, and how its datasets are configured — plus whichever of its +data can be resolved from where the block lands. + +A dataset travels whole when every one of its files is a storage reference +(`index://` names a storage and a path); a dataset holding any local upload is +reduced to its configuration with the file slots unset, because an upload handle +carries a machine-local path signed with the installation's own secret. The +decision is per dataset rather than per file so that a grouped dataset can never +arrive with fewer sample groups than file groups, which is the invariant `args` +enforces. Samples, their labels and their metadata values follow the datasets +that reference them, so a sample never arrives without the files that created +it. + +The dataset and metadata types move into the kind package and are re-exported +from the model, so every existing import keeps resolving. The model also exports +`templateParamsFor`, the projection itself. From 22891f1eb8d61897e78f78caffc3a7e497940b54 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Mon, 17 Aug 2026 17:54:00 +0200 Subject: [PATCH 04/11] chore: pin SDK deps to local monorepo builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Temporary. @platforma-sdk/block-kind is not published to npm yet, so the catalog entry only resolves through these overrides — drop this commit once it is published. --- package.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 10490a0..d0b5acf 100644 --- a/package.json +++ b/package.json @@ -28,5 +28,19 @@ "oxfmt": "*", "oxlint": "*" }, - "packageManager": "pnpm@9.12.0" + "packageManager": "pnpm@9.12.0", + "pnpm": { + "overrides": { + "@milaboratories/uikit": "file:../../core/platforma/lib/ui/uikit/package.tgz", + "@platforma-sdk/ui-vue": "file:../../core/platforma/sdk/ui-vue/package.tgz", + "@platforma-sdk/model": "file:../../core/platforma/sdk/model/package.tgz", + "@milaboratories/helpers": "file:../../core/platforma/lib/util/helpers/package.tgz", + "@platforma-sdk/workflow-tengo": "file:../../core/platforma/sdk/workflow-tengo/package.tgz", + "@milaboratories/pl-model-common": "file:../../core/platforma/lib/model/common/package.tgz", + "@platforma-sdk/block-kind": "file:../../core/platforma/sdk/block-kind/package.tgz", + "@platforma-sdk/block-tools": "file:../../core/platforma/tools/block-tools/package.tgz", + "@milaboratories/ts-builder": "file:../../core/platforma/tools/ts-builder/package.tgz", + "@milaboratories/ts-configs": "file:../../core/platforma/tools/ts-configs/package.tgz" + } + } } From 58d8a58094c5fbb7a39a3a32dab5653e8ed3785f Mon Sep 17 00:00:00 2001 From: Alexandr Date: Wed, 19 Aug 2026 14:31:12 +0200 Subject: [PATCH 05/11] chore: update package dependencies and scripts for block tools and SDK --- block/package.json | 4 ++-- package.json | 16 +--------------- pnpm-workspace.yaml | 16 ++++++++-------- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/block/package.json b/block/package.json index 553a501..74e5929 100644 --- a/block/package.json +++ b/block/package.json @@ -11,15 +11,15 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "sources": "./src/index.ts", "types": "./dist/index.d.ts", + "sources": "./src/index.ts", "default": "./dist/index.js" } }, "scripts": { "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"", "build": "ts-builder build --target block-facade && block-tools pack", - "prepublishOnly": "block-tools publish -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", + "prepublishOnly": "block-tools publish --unstable -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", "do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz", "check": "ts-builder type-check --target block-facade" }, diff --git a/package.json b/package.json index d0b5acf..10490a0 100644 --- a/package.json +++ b/package.json @@ -28,19 +28,5 @@ "oxfmt": "*", "oxlint": "*" }, - "packageManager": "pnpm@9.12.0", - "pnpm": { - "overrides": { - "@milaboratories/uikit": "file:../../core/platforma/lib/ui/uikit/package.tgz", - "@platforma-sdk/ui-vue": "file:../../core/platforma/sdk/ui-vue/package.tgz", - "@platforma-sdk/model": "file:../../core/platforma/sdk/model/package.tgz", - "@milaboratories/helpers": "file:../../core/platforma/lib/util/helpers/package.tgz", - "@platforma-sdk/workflow-tengo": "file:../../core/platforma/sdk/workflow-tengo/package.tgz", - "@milaboratories/pl-model-common": "file:../../core/platforma/lib/model/common/package.tgz", - "@platforma-sdk/block-kind": "file:../../core/platforma/sdk/block-kind/package.tgz", - "@platforma-sdk/block-tools": "file:../../core/platforma/tools/block-tools/package.tgz", - "@milaboratories/ts-builder": "file:../../core/platforma/tools/ts-builder/package.tgz", - "@milaboratories/ts-configs": "file:../../core/platforma/tools/ts-configs/package.tgz" - } - } + "packageManager": "pnpm@9.12.0" } diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5212077..8c30d6e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,11 +9,11 @@ packages: - workflow catalog: - "@platforma-sdk/block-tools": 2.13.0 - "@platforma-sdk/block-kind": 1.0.0 - "@platforma-sdk/model": 1.81.1 - "@platforma-sdk/ui-vue": 1.81.1 - "@platforma-sdk/tengo-builder": 4.0.22 + "@platforma-sdk/block-tools": 2.14.0 + "@platforma-sdk/block-kind": 1.1.0 + "@platforma-sdk/model": 1.82.0 + "@platforma-sdk/ui-vue": 1.82.1 + "@platforma-sdk/tengo-builder": 4.0.23 "@platforma-sdk/workflow-tengo": 6.8.2 "@platforma-sdk/blocks-deps-updater": 2.2.0 "@platforma-sdk/package-builder": 3.15.0 @@ -21,8 +21,8 @@ catalog: "@platforma-open/milaboratories.runenv-python-3": ^1.7.5 "@platforma-open/milaboratories.runenv-r-samples-and-data": ^1.0.1 - "@platforma-sdk/test": 1.81.3 - "@milaboratories/helpers": 1.14.1 + "@platforma-sdk/test": 1.82.0 + "@milaboratories/helpers": 1.14.5 "@milaboratories/pl-model-common": ^1.31.2 "vue": 3.5.24 @@ -45,5 +45,5 @@ catalog: "@changesets/cli": ^2.29.7 "@types/node": ~20.16.15 - "@milaboratories/ts-builder": 1.6.2 + "@milaboratories/ts-builder": 1.7.0 "@milaboratories/ts-configs": 1.4.0 From 87f516185202246a1736db972a878ca23ffbd803 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Wed, 19 Aug 2026 14:36:38 +0200 Subject: [PATCH 06/11] fix: align pl-model-common with the SDK and sync the lockfile @platforma-sdk/model 1.82.0 depends on pl-model-common 1.48.0, while the catalog range resolved the kind's direct dependency to 1.47.3. PlId is branded there, so the two copies gave the model two incompatible PlId types and multiplexing-rules-validation.ts failed to compile. Pin the catalog to the version the SDK uses. The lockfile still carried the local file: overrides after they were removed from package.json, which fails the frozen-install gate. Also puts deriveTemplateParams above its helpers. --- model/src/template_params.ts | 90 +++--- pnpm-lock.yaml | 530 +++++++++++++++++------------------ pnpm-workspace.yaml | 2 +- 3 files changed, 307 insertions(+), 315 deletions(-) diff --git a/model/src/template_params.ts b/model/src/template_params.ts index fe738b9..22cc767 100644 --- a/model/src/template_params.ts +++ b/model/src/template_params.ts @@ -4,6 +4,52 @@ import { assertNever, isImportFileHandleIndex } from "@platforma-sdk/model"; import { isGroupedDataset } from "./args"; import type { BlockData, DSAny, DSContent, MTColumn } from "./args"; +/** + * Derives the params a project exported as a template hands the block it seeds — + * the inverse of the data model's `init`. + * + * Either the whole study travels or none of its data does. The block's state is + * one connected thing — datasets key their files by sample or by group, sample + * groups and multiplexing rules name those samples, metadata values are keyed by + * them, and `args` holds the pieces to each other — so carrying part of it means + * choosing which invariants to break. When every file can be resolved from where + * the block lands, the state goes as it stands; when any file is local to this + * machine, only the study's setup goes and the new project imports its own data. + */ +export function deriveTemplateParams(data: BlockData): BlockParams { + if (data.datasets.every(isDatasetPortable)) { + return { + datasets: data.datasets, + metadata: data.metadata, + sampleIds: data.sampleIds, + sampleLabelColumnLabel: data.sampleLabelColumnLabel, + sampleLabels: data.sampleLabels, + h5adFilesToPreprocess: data.h5adFilesToPreprocess, + seuratFilesToPreprocess: data.seuratFilesToPreprocess, + }; + } + + return { + datasets: data.datasets.map(stripDatasetData), + metadata: data.metadata.map(stripColumnValues), + sampleLabelColumnLabel: data.sampleLabelColumnLabel, + }; +} + +// Internals + +/** + * Tells whether a dataset holds no file that is bound to this machine. + * + * A storage reference (`index://`) names a `{storageId, path}` any installation + * carrying that storage can resolve; an upload handle carries a local path + * signed with the installation's own secret and resolves nowhere else. A slot + * with no file yet is neither, so it does not stand in the way. + */ +function isDatasetPortable(ds: DSAny): boolean { + return collectDatasetHandles(ds.content).every((h) => h == null || isImportFileHandleIndex(h)); +} + /** * Collects every file slot a dataset holds, empty ones included. * @@ -42,18 +88,6 @@ function collectDatasetHandles(content: DSContent): (ImportFileHandle | null | u } } -/** - * Tells whether a dataset holds no file that is bound to this machine. - * - * A storage reference (`index://`) names a `{storageId, path}` any installation - * carrying that storage can resolve; an upload handle carries a local path - * signed with the installation's own secret and resolves nowhere else. A slot - * with no file yet is neither, so it does not stand in the way. - */ -function isDatasetPortable(ds: DSAny): boolean { - return collectDatasetHandles(ds.content).every((h) => h == null || isImportFileHandleIndex(h)); -} - /** * Strips everything a dataset holds per sample or per group, keeping how the * dataset is configured: its type, read indices, tag names, barcode tags, xsv @@ -79,35 +113,3 @@ function stripDatasetData(ds: DSAny): DSAny { function stripColumnValues(column: MTColumn): MTColumn { return { ...column, data: {} }; } - -/** - * Derives the params a project exported as a template hands the block it seeds — - * the inverse of the data model's `init`. - * - * Either the whole study travels or none of its data does. The block's state is - * one connected thing — datasets key their files by sample or by group, sample - * groups and multiplexing rules name those samples, metadata values are keyed by - * them, and `args` holds the pieces to each other — so carrying part of it means - * choosing which invariants to break. When every file can be resolved from where - * the block lands, the state goes as it stands; when any file is local to this - * machine, only the study's setup goes and the new project imports its own data. - */ -export function deriveTemplateParams(data: BlockData): BlockParams { - if (data.datasets.every(isDatasetPortable)) { - return { - datasets: data.datasets, - metadata: data.metadata, - sampleIds: data.sampleIds, - sampleLabelColumnLabel: data.sampleLabelColumnLabel, - sampleLabels: data.sampleLabels, - h5adFilesToPreprocess: data.h5adFilesToPreprocess, - seuratFilesToPreprocess: data.seuratFilesToPreprocess, - }; - } - - return { - datasets: data.datasets.map(stripDatasetData), - metadata: data.metadata.map(stripColumnValues), - sampleLabelColumnLabel: data.sampleLabelColumnLabel, - }; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0965a1..6a88903 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,18 +9,45 @@ catalogs: '@changesets/cli': specifier: ^2.29.7 version: 2.29.7 + '@milaboratories/helpers': + specifier: 1.14.5 + version: 1.14.5 + '@milaboratories/pl-model-common': + specifier: 1.48.0 + version: 1.48.0 + '@milaboratories/ts-builder': + specifier: 1.7.0 + version: 1.7.0 + '@milaboratories/ts-configs': + specifier: 1.4.0 + version: 1.4.0 '@platforma-open/milaboratories.runenv-python-3': specifier: ^1.7.5 version: 1.7.5 '@platforma-open/milaboratories.runenv-r-samples-and-data': specifier: ^1.0.1 version: 1.0.1 + '@platforma-sdk/block-kind': + specifier: 1.1.0 + version: 1.1.0 + '@platforma-sdk/block-tools': + specifier: 2.14.0 + version: 2.14.0 + '@platforma-sdk/model': + specifier: 1.82.0 + version: 1.82.0 '@platforma-sdk/tengo-builder': - specifier: 4.0.22 - version: 4.0.22 + specifier: 4.0.23 + version: 4.0.23 '@platforma-sdk/test': - specifier: 1.81.3 - version: 1.81.3 + specifier: 1.82.0 + version: 1.82.0 + '@platforma-sdk/ui-vue': + specifier: 1.82.1 + version: 1.82.1 + '@platforma-sdk/workflow-tengo': + specifier: 6.8.2 + version: 6.8.2 '@vueuse/core': specifier: ^12.2.0 version: 12.8.2 @@ -55,18 +82,6 @@ catalogs: specifier: ~3.25.76 version: 3.25.76 -overrides: - '@milaboratories/uikit': file:../../core/platforma/lib/ui/uikit/package.tgz - '@platforma-sdk/ui-vue': file:../../core/platforma/sdk/ui-vue/package.tgz - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@platforma-sdk/workflow-tengo': file:../../core/platforma/sdk/workflow-tengo/package.tgz - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@platforma-sdk/block-kind': file:../../core/platforma/sdk/block-kind/package.tgz - '@platforma-sdk/block-tools': file:../../core/platforma/tools/block-tools/package.tgz - '@milaboratories/ts-builder': file:../../core/platforma/tools/ts-builder/package.tgz - '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz - importers: .: @@ -82,11 +97,11 @@ importers: specifier: 'catalog:' version: 2.29.7(@types/node@24.5.2) '@milaboratories/ts-builder': - specifier: file:../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) '@platforma-sdk/block-tools': - specifier: file:../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) shx: specifier: 'catalog:' version: 0.4.0 @@ -97,11 +112,11 @@ importers: block: devDependencies: '@milaboratories/ts-builder': - specifier: file:../../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: file:../../../core/platforma/tools/ts-configs/package.tgz - version: file:../../core/platforma/tools/ts-configs/package.tgz + specifier: 'catalog:' + version: 1.4.0 '@platforma-open/milaboratories.samples-and-data.kind': specifier: workspace:* version: link:../kind @@ -115,11 +130,11 @@ importers: specifier: workspace:* version: link:../workflow '@platforma-sdk/block-tools': - specifier: file:../../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) '@platforma-sdk/model': - specifier: file:../../../core/platforma/sdk/model/package.tgz - version: file:../../core/platforma/sdk/model/package.tgz + specifier: 'catalog:' + version: 1.82.0 shx: specifier: 'catalog:' version: 0.4.0 @@ -130,11 +145,11 @@ importers: kind: dependencies: '@milaboratories/pl-model-common': - specifier: file:../../../core/platforma/lib/model/common/package.tgz - version: file:../../core/platforma/lib/model/common/package.tgz + specifier: 'catalog:' + version: 1.48.0 '@platforma-sdk/block-kind': - specifier: file:../../../core/platforma/sdk/block-kind/package.tgz - version: file:../../core/platforma/sdk/block-kind/package.tgz + specifier: 'catalog:' + version: 1.1.0 '@types/node': specifier: '*' version: 24.5.2 @@ -143,14 +158,14 @@ importers: version: 5.9.3 devDependencies: '@milaboratories/ts-builder': - specifier: file:../../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: file:../../../core/platforma/tools/ts-configs/package.tgz - version: file:../../core/platforma/tools/ts-configs/package.tgz + specifier: 'catalog:' + version: 1.4.0 '@platforma-sdk/block-tools': - specifier: file:../../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) model: dependencies: @@ -158,8 +173,8 @@ importers: specifier: workspace:* version: link:../kind '@platforma-sdk/model': - specifier: file:../../../core/platforma/sdk/model/package.tgz - version: file:../../core/platforma/sdk/model/package.tgz + specifier: 'catalog:' + version: 1.82.0 '@types/node': specifier: '*' version: 24.5.2 @@ -171,14 +186,14 @@ importers: version: 3.25.76 devDependencies: '@milaboratories/ts-builder': - specifier: file:../../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: file:../../../core/platforma/tools/ts-configs/package.tgz - version: file:../../core/platforma/tools/ts-configs/package.tgz + specifier: 'catalog:' + version: 1.4.0 '@platforma-sdk/block-tools': - specifier: file:../../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) software/parse-h5ad: devDependencies: @@ -186,8 +201,8 @@ importers: specifier: 'catalog:' version: 1.7.5 '@platforma-sdk/block-tools': - specifier: file:../../../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) software/parse-seurat: devDependencies: @@ -198,8 +213,8 @@ importers: specifier: 'catalog:' version: 1.0.1 '@platforma-sdk/block-tools': - specifier: file:../../../../core/platforma/tools/block-tools/package.tgz - version: file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) + specifier: 'catalog:' + version: 2.14.0(@types/node@24.5.2) test: dependencies: @@ -207,8 +222,8 @@ importers: specifier: workspace:* version: link:../model '@platforma-sdk/model': - specifier: file:../../../core/platforma/sdk/model/package.tgz - version: file:../../core/platforma/sdk/model/package.tgz + specifier: 'catalog:' + version: 1.82.0 this-block: specifier: workspace:@platforma-open/milaboratories.samples-and-data@* version: link:../block @@ -217,14 +232,14 @@ importers: version: 5.8.2 devDependencies: '@milaboratories/ts-builder': - specifier: file:../../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: file:../../../core/platforma/tools/ts-configs/package.tgz - version: file:../../core/platforma/tools/ts-configs/package.tgz + specifier: 'catalog:' + version: 1.4.0 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + version: 1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) vitest: specifier: 'catalog:' version: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) @@ -235,8 +250,8 @@ importers: specifier: workspace:* version: link:../model '@platforma-sdk/ui-vue': - specifier: file:../../../core/platforma/sdk/ui-vue/package.tgz - version: file:../../core/platforma/sdk/ui-vue/package.tgz(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) + specifier: 'catalog:' + version: 1.82.1(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) typescript: specifier: '*' version: 5.8.2 @@ -245,20 +260,20 @@ importers: version: 3.5.24(typescript@5.8.2) devDependencies: '@milaboratories/helpers': - specifier: file:../../../core/platforma/lib/util/helpers/package.tgz - version: file:../../core/platforma/lib/util/helpers/package.tgz + specifier: 'catalog:' + version: 1.14.5 '@milaboratories/pl-model-common': - specifier: file:../../../core/platforma/lib/model/common/package.tgz - version: file:../../core/platforma/lib/model/common/package.tgz + specifier: 'catalog:' + version: 1.48.0 '@milaboratories/ts-builder': - specifier: file:../../../core/platforma/tools/ts-builder/package.tgz - version: file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1) + specifier: 'catalog:' + version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1) '@milaboratories/ts-configs': - specifier: file:../../../core/platforma/tools/ts-configs/package.tgz - version: file:../../core/platforma/tools/ts-configs/package.tgz + specifier: 'catalog:' + version: 1.4.0 '@platforma-sdk/model': - specifier: file:../../../core/platforma/sdk/model/package.tgz - version: file:../../core/platforma/sdk/model/package.tgz + specifier: 'catalog:' + version: 1.82.0 '@types/node': specifier: '*' version: 24.5.2 @@ -296,15 +311,15 @@ importers: specifier: workspace:* version: link:../software/parse-seurat '@platforma-sdk/workflow-tengo': - specifier: file:../../../core/platforma/sdk/workflow-tengo/package.tgz - version: file:../../core/platforma/sdk/workflow-tengo/package.tgz + specifier: 'catalog:' + version: 6.8.2 devDependencies: '@platforma-sdk/tengo-builder': specifier: 'catalog:' - version: 4.0.22 + version: 4.0.23 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + version: 1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) shx: specifier: 'catalog:' version: 0.4.0 @@ -1074,27 +1089,30 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@milaboratories/columns-collection-driver@0.2.3': - resolution: {integrity: sha512-3rNWmuQGvEaBEzGMHIWeOi1p8j8sMDpnPKNUQvT0Ji7/ArvnfM5HK8dywxB+n3mLK8c11lW16+auM5xuydJXGw==} + '@milaboratories/columns-collection-driver@0.2.4': + resolution: {integrity: sha512-abbgAzME71ARvgnGQHte+dPMgt2JGBJN4YpGLVxiYr7GToHwypsEi3PY/dAqriQWRtpKR82EpIAMxXVq0d7XMw==} '@milaboratories/computable@2.9.8': resolution: {integrity: sha512-X0ZtxOnIJlAd9Y7CyBtWSKHgVuTKXbIryMwJaoYSEz0gY3JZVnsD0f59J/lwe3Key0/lSYh3EbL/pP5jACIzfQ==} engines: {node: '>=22.19.0'} - '@milaboratories/helpers@file:../../core/platforma/lib/util/helpers/package.tgz': - resolution: {integrity: sha512-OOSprQlcyquHtMJmGeOEvcQ4bCREFIrypAmgGf3Laf91fM8rG1UZ7fphz6R/AjJ8tr2pOkpsPOrPhM2gCmai0Q==, tarball: file:../../core/platforma/lib/util/helpers/package.tgz} - version: 1.14.5 + '@milaboratories/helpers@1.14.2': + resolution: {integrity: sha512-zOkD4aWNbembwI+AsPTz7nmWC1VPA4rwGBc+Nd5jPpKVh7rCtZwQrlOP5mVqRVMKIAjb1nU8kzzCGfqNPqfJjA==} engines: {node: '>=22'} - '@milaboratories/pf-driver@1.9.0': - resolution: {integrity: sha512-OhMsf1jNMp31wRCrXHMU75WQj48Nc/lDeYTo4/6R6+FLYBYkK9yWgsSH+02V4WCKbUqsyF1Xy0+O+qsYjpqUDA==} + '@milaboratories/helpers@1.14.5': + resolution: {integrity: sha512-Kiy0g7sEmFQxDwtnmTrdJ8XdUK0IDAB5ZnPCNEbK7lPGHIa+xG3kzfeR4y44QBdrYaK0NwG63D8Fc7dlv9KItg==} + engines: {node: '>=22'} + + '@milaboratories/pf-driver@1.9.1': + resolution: {integrity: sha512-i4qt1kcOcvOAHGlA7tCHce1QpsvmrCDu2vvmZz/kfHPma7YyDU7PSSr6hhuV+rf7HZTJz7z193c7wCXTFTLrzQ==} engines: {node: '>=22.19.0'} - '@milaboratories/pf-spec-driver@1.5.0': - resolution: {integrity: sha512-XWXrKCyCwcqS8EcukuyDqvMq0D6qt61zrkb3qGpWKyy0SVQNzXC2JL0ThCM2uGI7QQelgV0aagcg8xU5pGKWPw==} + '@milaboratories/pf-spec-driver@1.5.1': + resolution: {integrity: sha512-K7BuQCUXqpUOAwgJ1aIO8SSQbE8RSEVb8J5e6vIpI6PqV7Uc8LHFswTguOSgSuacpMgQmEP9jmIKyafJdJ7PDw==} - '@milaboratories/pf-spec@1.0.0': - resolution: {integrity: sha512-JIOhJdDHcKDItjlxOT4wVmnjejoazM69qK5ylu+g5q65RIcH/R5MF2OGiu9nV7QbLEXszll+EVnvx6jYhuE44w==} + '@milaboratories/pf-spec@1.0.1': + resolution: {integrity: sha512-UbLycglulwrFgil6n1By17YGOVHzZXeb+tAVUej6ZFOmpRtAMQYVLOXAX4FN2tc98eDTJ+YrYdZCa7qWi1gBxw==} peerDependencies: '@bytecodealliance/preview2-shim': ^0.20.1 @@ -1108,30 +1126,26 @@ packages: '@milaboratories/pframes-rs-wasip2@1.1.56': resolution: {integrity: sha512-54bhC6XCAVO09J/sqVwEKA4hhTa27BDDNdH8BE+6+LvjBVkg/qq2/f0MzdrVijrmagbr97F1zgj5wIgUqwCSoA==} - '@milaboratories/pl-client@3.14.5': - resolution: {integrity: sha512-/n7Hjr43WYNkyrgPQ4FL0rQ5FthNS009WvVOBggnMSqCnp6xDHhv4DjLKlmlmdvQSzgI+SeoAjAn7TkOKpaoaA==} - engines: {node: '>=22.19.0'} - - '@milaboratories/pl-client@3.14.6': - resolution: {integrity: sha512-IPzh5bSibr02DMKpwlCW6TuHVxaDe2o6tjaEJ4P2y5lshRbe5SBR/ne/G/N7E7KEKxmpWq7ZapOCLkLyvqFFDw==} + '@milaboratories/pl-client@3.14.7': + resolution: {integrity: sha512-HIjPfGAYRRD0hbq5YSTkWt5XgBiv+yYtw73EjWLxui8eUEeB2ffdgsvH7IhVx2oXjUOL4p7M4i8PBnmdJ3830w==} engines: {node: '>=22.19.0'} '@milaboratories/pl-config@1.8.5': resolution: {integrity: sha512-XnfYXSSkRxeImQ21k6I8y5apisvagcSgMGfEeyRxNdSGwUVJbbI8TwJk+XBEDQ4lErW8oqtLxKjFQuHJMzRUoQ==} - '@milaboratories/pl-deployments@3.0.15': - resolution: {integrity: sha512-+i3bdvfPCXLZ789f5fRdtrbil3/RFyzSBNMkULcnyKY5u6GRZLjWDBC5aSE75PRTWx3Fxf743Fj9L3B6loMSWw==} + '@milaboratories/pl-deployments@3.0.16': + resolution: {integrity: sha512-nFAIY4rxAssVqicSzgSNVQB/ZOjHjh4uhvde8aWFqQcMZCQDhHSaVJezzxRdotS8JiY5kI4r/Y0cN+Ey1MDDog==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-drivers@1.16.15': - resolution: {integrity: sha512-mVKIEHVOeAPdwSZZk+URAFD6zoyPiAARinpDfihDvkFcrlTLIzeoOvnQNPG5a8jqc0GiW+a9mnTrfjG7+n82Ww==} + '@milaboratories/pl-drivers@1.16.16': + resolution: {integrity: sha512-Z60p02vIPmdy/M10gacg6I2BZ2T/gySPMm2Q8IbfvCbUJRjXXfbkGxN8hBoeRQShcXgM5svu0hPZfv1e87QRmQ==} engines: {node: '>=22'} '@milaboratories/pl-error-like@1.12.10': resolution: {integrity: sha512-iHmnLG5lxJqcymUmEL8onCDGEADk1S/5RNACQ5yfTCNcCkUc+7hYrDHQpFmWXPPGC9sG+NTBxt4wr5m8UsLm2g==} - '@milaboratories/pl-errors@1.4.35': - resolution: {integrity: sha512-rq5Lg9G7ax+LtMPdrkZg+Pdqk28JViiS/KIcQfk0Cg1ttZoAnhDhFIh6rAFy2eGybPtlzXqM32/ODKUSMawc8Q==} + '@milaboratories/pl-errors@1.4.36': + resolution: {integrity: sha512-WzKECX8Te6uP2DT7z2yTN6RrkiAWowYeU1rmB1Uc6sQBBWC6OjiqjiyOjvFeqxi73oXODARhLaLnqJcpG1onNA==} '@milaboratories/pl-healthcheck@1.0.5': resolution: {integrity: sha512-ZkQti4VU2FapJBFRtZGfR5NDPXEAEFgTf/NfemypgY0aA75fFPi4/c3BpXX5K7dht+JOgHqkMrBHxKIuE2T+fA==} @@ -1140,32 +1154,31 @@ packages: '@milaboratories/pl-http@1.2.4': resolution: {integrity: sha512-QKmhx+WEvJCV9dUy/SBdQk/ApaJ5ewBFgm/b+XPlS10SusAdqUUTGvK5+hq8YSuUMXlHb/dk++UtI5YlDuDl2Q==} - '@milaboratories/pl-middle-layer@1.66.19': - resolution: {integrity: sha512-rFBmJDdBcIrdDHz730p3sL8+7uUs7VimXYGQo9IbayxmAlp5mnft1XlPUTuVbwx5QeRNGv4Cwya1T+7WL1wSmw==} + '@milaboratories/pl-middle-layer@1.67.0': + resolution: {integrity: sha512-T4+QXmlqG32y27z1fy5tIzBqs6DXij3JBhUYLZVnN7s6PTTDdKlj80V/ebt5Wysp2meoEP+B+sk84adE/FBeJA==} engines: {node: '>=22.19.0'} - '@milaboratories/pl-model-backend@1.4.19': - resolution: {integrity: sha512-288BUlxQtpsd8CNpOGBqGTM1xMFX4JOuNzw5A4hxB+3sq+P2+JU0kNv6PbqIAiTwXeTZ7zsiqN4Gw/aYMSop6Q==} + '@milaboratories/pl-model-backend@1.4.21': + resolution: {integrity: sha512-Z2z5J8bglslgXXoi1aySi1ho+/d+ylJiuEaRw9XTNuE5iBM3EQPe0rw095pXGOinTlMpmvUcCI2wkVCraUQ1dA==} - '@milaboratories/pl-model-backend@1.4.20': - resolution: {integrity: sha512-AkV+PhmQms6WPwR3E75THrkD9fFE7OpfsIUC297HvnFUoCFXR6GOMGPworA/qipXReTmv192AqBpuaLdgAngyg==} + '@milaboratories/pl-model-common@1.46.2': + resolution: {integrity: sha512-VEeauisApYScvCS8lnK3zpFJ520xuTAodKJmjR8ulHcMrWMyWMfHEdGb7j5OMD0mM/OwTgmQrrJ5eB7Xd+xoOQ==} - '@milaboratories/pl-model-common@file:../../core/platforma/lib/model/common/package.tgz': - resolution: {integrity: sha512-/OUqb0HlYO68xLCb2Og3kzIuwkxtSH4F18R1/8NYWOjmOMaJk+CXRDAs9/NFLpDS0WqqKBbxf3N7stnjsAZDnQ==, tarball: file:../../core/platforma/lib/model/common/package.tgz} - version: 1.47.3 + '@milaboratories/pl-model-common@1.48.0': + resolution: {integrity: sha512-oCVrjFNmjQolb7YWnbSGHnp6GGVm1PhG1lnNABp9lqYjvA2ISjIPQLIo/vT2ca0mqwLrEvbuRqiqSFOg7sQ5tQ==} '@milaboratories/pl-model-middle-layer@1.30.7': resolution: {integrity: sha512-rs9x3Ron4ujR/UOdEgB8WUB1SvZ8ZAScT1Av/e4or+iiQ/CzhmK9nqtYamHVwKV+JgwIFbXQwxGvIHDVz955dQ==} - '@milaboratories/pl-model-middle-layer@1.31.0': - resolution: {integrity: sha512-D1vyGABBtCYyp2IhKd9eMoZtKUj1wUYpIzz4Xz5k+bfJWGEF8GmZGiOvO4oOvrsEsXlG4NyO249MnBKmHFcppQ==} + '@milaboratories/pl-model-middle-layer@1.32.0': + resolution: {integrity: sha512-X1iLGgOwzkw8mQ/GfTxfOTJakBJ26np85h5HqUziMbVkFL0SR7wpd7xpgUs6TKVkYNM8viAv3iA2k63Yc5SahQ==} - '@milaboratories/pl-tree@1.13.6': - resolution: {integrity: sha512-R3wnMjbCNfAsyGJe3FQOqEyrNePd9ZCwkjDj2ps7d9oeiJ7QX6hYkIVuMlq8IQNYOJybfHc/dFEvWeYE3uAAZg==} + '@milaboratories/pl-tree@1.13.7': + resolution: {integrity: sha512-q4pURdiq7cwOV1TAkIa6fZo3s3mzglBSokLgBSmoBPtnj9bsna5nTrqQFqp9KCzPb9N9PbTRE75du+I5YDbc+g==} engines: {node: '>=22.19.0'} - '@milaboratories/ptabler-expression-js@1.2.37': - resolution: {integrity: sha512-urVRk4b5Jse555euNNITlOJ437McZVtBnC5h/E6O+iHm+hfNIi6OP1aAD5ai4jOpHllm85zW5Ne7hVyyd71bJw==} + '@milaboratories/ptabler-expression-js@1.2.38': + resolution: {integrity: sha512-z14oa/V3nkBGHxnygpfxUBU7EfHQKHh1KZgK47ouqIw7CvuOmqjViRdynY4HZNjAh3n3AGHpBbEFs/J+hQMW3g==} '@milaboratories/resolve-helper@1.1.3': resolution: {integrity: sha512-38/dW/XRZQREOxAOOKtO0lzEWPCP/DH0qhB3q1kYcGoN++5V92/zbVwbYrMDeDcjTyo+D62iIep+sKXeWHa7Uw==} @@ -1178,22 +1191,19 @@ packages: os: [darwin, linux, win32] hasBin: true - '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz': - resolution: {integrity: sha512-RHkfb5+K2ohXSiKwY+cC6iMXSY0OQdUws4uNbdCHE/hWPYv8s3h70VvBgxXzmLkEt3FMbyt3HSCHlMb2Y+HhLQ==, tarball: file:../../core/platforma/tools/ts-builder/package.tgz} - version: 1.6.2 + '@milaboratories/ts-builder@1.7.0': + resolution: {integrity: sha512-VT8xf4jZg2Dyo6KR5s+z4WiHrVfAJ46d7N39k7JPNlOlig910/h/1LKgXSgWysWfAp+2pYKvq7flAu3JKLKarg==} hasBin: true - '@milaboratories/ts-configs@file:../../core/platforma/tools/ts-configs/package.tgz': - resolution: {integrity: sha512-Xy1GIT805U0/97eWt8lPYvkmyJcQYzBqTkLrMcF7x48hZSKzBIjn/ykVUCNjKgSM2S3t+crWzeXDmsJyPwzGNw==, tarball: file:../../core/platforma/tools/ts-configs/package.tgz} - version: 1.4.0 + '@milaboratories/ts-configs@1.4.0': + resolution: {integrity: sha512-VzU9D+RiggsG4VYteJSBN4o8IjYae9GbZ8MofikMJQLOI1Ir9/pVyPXXGnG/TAGvmcjbK/psAiZVGSvI5MBPGg==} '@milaboratories/ts-helpers@1.8.6': resolution: {integrity: sha512-ef01tARUl+0Urt3x8HHAByrhYHg4Rnn7WiFyJ+joZFZl1T1pUKTgfB7Zxc8Cn06HIl4i6H7s5OSymjZePIGqfQ==} engines: {node: '>=22.19.0'} - '@milaboratories/uikit@file:../../core/platforma/lib/ui/uikit/package.tgz': - resolution: {integrity: sha512-AkJiFM31tJTD6pqERGRr3+GAjgsf/hkFLXejEkyVT9DgsgsL89LvNT/Hr3glzkHL7pECHeoWNVqyeuAaXi7pJg==, tarball: file:../../core/platforma/lib/ui/uikit/package.tgz} - version: 2.15.22 + '@milaboratories/uikit@2.15.24': + resolution: {integrity: sha512-/NFdh4fcxhArGToWn4kSvSTuOEpFSjfDErPC4bkNXQ0UV633etU+v/vV81J+oSC/BlyCc5Rire9qLHhut18g+w==} '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} @@ -1745,8 +1755,8 @@ packages: '@platforma-open/milaboratories.runenv-r-samples-and-data@1.0.1': resolution: {integrity: sha512-uO8SXeZGpN27IAdUwbjAiDO7dPXTO3/7w8am7mIaKJjJQrOLI31MSuN0/r5ZG4ZU2JCJESmJHl9XMCBaYWQ82Q==} - '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': - resolution: {integrity: sha512-3EWO64poe5VcBIgVIdIFHwN7nPi000kPuaRmlVt3xnnQZqXUYDFNZfZ2Mc9/mE1Eq3FLwQxcy/5mng7LvgWnXg==} + '@platforma-open/milaboratories.software-ptabler.schema@1.15.22': + resolution: {integrity: sha512-f9vT+iSfNelgAGjaNzn1GErhmxHbjG6HtskAMoaUEbrciCG8c8i8cSCJPLu0xKNBcjM1UW+T10uD89Ckq2vkxQ==} '@platforma-open/milaboratories.software-ptabler@2.1.8': resolution: {integrity: sha512-28dKwcKNIB/8OYH6l/li7Qa/aE2NgDVtNUmN8v6jZsLKT59ogFclz8ZrQ+OiQFzHQCLBlWBt5TdIHfHPxBaNFw==} @@ -1772,41 +1782,36 @@ packages: '@platforma-open/milaboratories.software-small-binaries@2.1.1': resolution: {integrity: sha512-KN1PR7YgUUfx1dxh/TtcoWpSZbOXbRxXzQuJ505qHuXuE0spYwC7bXnvJsEYbEwRcPMa0foTrjBnPNORE4yr+Q==} - '@platforma-sdk/block-kind@file:../../core/platforma/sdk/block-kind/package.tgz': - resolution: {integrity: sha512-iALLquDVq4fPfsQJcqsqL/N9DtauVCLvjp0OwN/kySsZk9cDd6daBBX2kEARdStVblcPSnVycU7OV2upS1qsUA==, tarball: file:../../core/platforma/sdk/block-kind/package.tgz} - version: 1.0.0 + '@platforma-sdk/block-kind@1.1.0': + resolution: {integrity: sha512-4uh+40o6BGfQcPPhkYGCjng8EXR9qn+6i5Fuc3RJ5QGfPYfcwbxT35G2V7ALUxmsqjLZ5SGL+JcW6Lm2v0cZHA==} - '@platforma-sdk/block-tools@file:../../core/platforma/tools/block-tools/package.tgz': - resolution: {integrity: sha512-/S3ppeqbwbL+z4RIlMhy0f1vcUCi73s8ipEzpaTwajgoR9I+B/nzSOqEbKceGD+XtaiLIuzSp9dfj0p/ze3IIw==, tarball: file:../../core/platforma/tools/block-tools/package.tgz} - version: 2.12.12 + '@platforma-sdk/block-tools@2.14.0': + resolution: {integrity: sha512-sAsSDAHVAqlDn/QO+KuBnaVy/VomiHM4cI4ghylcY0Fq2CroVyz8Cm5YNw0SPINuUYmpzvVQuG9ili9Fn7uOog==} hasBin: true '@platforma-sdk/blocks-deps-updater@2.2.0': resolution: {integrity: sha512-p9lBxhFXM9WoRsrJO7dfkiXSK+1m63yIn1sKhBO71eMbhrLMyVYHEOeNf3w5OCdbRF5QsNhXzWuiTmFK3zHFsA==} hasBin: true - '@platforma-sdk/model@file:../../core/platforma/sdk/model/package.tgz': - resolution: {integrity: sha512-vKVHFN2JAZLlPV3KNEE1ygbG/zby0DtfCwl6xh9GN42bnkxXbbtBYj138ufFXI+UCTXRKzcFSRLB+hbPJuWjHQ==, tarball: file:../../core/platforma/sdk/model/package.tgz} - version: 1.81.0 + '@platforma-sdk/model@1.82.0': + resolution: {integrity: sha512-m2GQFYQUS+XivC+Bsan9UlTvOM7R4wraF0eWMwQiZt3yjCSw09z12Be0uydTKLGVvLPbsw7zjhibMop3eBTb1w==} - '@platforma-sdk/package-builder-lib@1.2.1': - resolution: {integrity: sha512-H6weitj7JxbiJSlteEFLafTJ+tfty6iv/imf3ysy8oCS8AZIRJk2VMW3M/aAc+xVkQeX7oVIwMwFMYrJIoFsAg==} + '@platforma-sdk/package-builder-lib@1.3.0': + resolution: {integrity: sha512-CdBjmNo6E1fBxKYWaXa49L/L2WLURxs2f1TAqxLIZlHRE4DZ6E1TEj3jNNKESWp+/9rwtLkTAzmTzNPrDgz+2Q==} - '@platforma-sdk/tengo-builder@4.0.22': - resolution: {integrity: sha512-8+zDYDFFI2tQS7dplTcxgQdUwzt8+IO++sJiVbwBgwSg1Giyc2qMThEYPLK3QNFArgCsIDR6wQuS8t66pJsRPQ==} + '@platforma-sdk/tengo-builder@4.0.23': + resolution: {integrity: sha512-Qkxpg3wuZQOc6KbEL3pifOCdqOH91TaL3jDluVIm5mz3qpx96KO+To8AT/0nLqmvaF7yv8AP22QiyyqduAhGiw==} engines: {node: '>=22'} hasBin: true - '@platforma-sdk/test@1.81.3': - resolution: {integrity: sha512-LSDJoQqpxX2G8W7ZshnYWroqNQiFoxXQlka4pEJTnPEO8YISW3lWknBhqsxMp2GyepQNoyl2WO1bfiQz+ssT5A==} + '@platforma-sdk/test@1.82.0': + resolution: {integrity: sha512-0fSW+Awn8FBfUDjFEAGL0HXqcJGzs5FpF3gUVcIxCY78Veiz9L6jUNncxB3pCO9ezYueVIXDDpPAETg4Hsvy6A==} - '@platforma-sdk/ui-vue@file:../../core/platforma/sdk/ui-vue/package.tgz': - resolution: {integrity: sha512-lA9mHlSz4wsSrdQb4sJLD/v1UWTfVKZBKBhXa85keDuaKW4lwFXT7FSR7J1jy/UKboXw7aj7QUTa5AwkeOYB0Q==, tarball: file:../../core/platforma/sdk/ui-vue/package.tgz} - version: 1.81.0 + '@platforma-sdk/ui-vue@1.82.1': + resolution: {integrity: sha512-HCwLm+yN2cKbRL0caQ21+40mcodVGTmnruruNQAkcCkgHu4AaRmkEVRtel8AdHLpcqJS5ray341E1bqGErguSw==} - '@platforma-sdk/workflow-tengo@file:../../core/platforma/sdk/workflow-tengo/package.tgz': - resolution: {integrity: sha512-U3mW4N7nWqmT0Mjo1bImg/lH4zJDwXn0M+22JaAqewiXMpcCgvQY442FMcptHVLr5XaB8phL3AB162jtxNrNQA==, tarball: file:../../core/platforma/sdk/workflow-tengo/package.tgz} - version: 6.8.2 + '@platforma-sdk/workflow-tengo@6.8.2': + resolution: {integrity: sha512-AHR/Y+vbyfda17A7xY2uH9TlXiBpM8242tTO6+lj8phA4/KS6mez4GLu4ZEaASlZpX6YkQsUs5LUxYQU7pXeiQ==} '@protobuf-ts/grpc-transport@2.11.1': resolution: {integrity: sha512-l6wrcFffY+tuNnuyrNCkRM8hDIsAZVLA8Mn7PKdVyYxITosYh60qW663p9kL6TWXYuDCL3oxH8ih3vLKTDyhtg==} @@ -6077,10 +6082,10 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@milaboratories/columns-collection-driver@0.2.3': + '@milaboratories/columns-collection-driver@0.2.4': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.48.0 '@milaboratories/computable@2.9.8': dependencies: @@ -6089,15 +6094,17 @@ snapshots: '@types/node': 24.5.2 utility-types: 3.11.0 - '@milaboratories/helpers@file:../../core/platforma/lib/util/helpers/package.tgz': {} + '@milaboratories/helpers@1.14.2': {} - '@milaboratories/pf-driver@1.9.0(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/helpers@1.14.5': {} + + '@milaboratories/pf-driver@1.9.1(@bytecodealliance/preview2-shim@0.17.8)': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-spec': 1.0.1(@bytecodealliance/preview2-shim@0.17.8) '@milaboratories/pframes-rs-node': 1.1.56 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 '@milaboratories/ts-helpers': 1.8.6 es-toolkit: 1.39.10 lru-cache: 11.2.2 @@ -6106,27 +6113,27 @@ snapshots: - encoding - supports-color - '@milaboratories/pf-spec-driver@1.5.0(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-spec-driver@1.5.1(@bytecodealliance/preview2-shim@0.17.8)': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pf-spec': 1.0.0(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-spec': 1.0.1(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': 1.48.0 '@noble/hashes': 2.2.0 transitivePeerDependencies: - '@bytecodealliance/preview2-shim' - '@milaboratories/pf-spec@1.0.0(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-spec@1.0.1(@bytecodealliance/preview2-shim@0.17.8)': dependencies: '@bytecodealliance/preview2-shim': 0.17.8 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 '@milaboratories/pframes-rs-node@1.1.56': dependencies: '@mapbox/node-pre-gyp': 2.0.3 - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/helpers': 1.14.2 '@milaboratories/pframes-rs-serv': 1.1.56 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-common': 1.46.2 ulid: 3.0.2 transitivePeerDependencies: - encoding @@ -6134,8 +6141,8 @@ snapshots: '@milaboratories/pframes-rs-serv@1.1.56': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/helpers': 1.14.2 + '@milaboratories/pl-model-common': 1.46.2 '@milaboratories/pl-model-middle-layer': 1.30.7 better-sqlite3: 12.10.0 commander: 14.0.3 @@ -6143,29 +6150,11 @@ snapshots: '@milaboratories/pframes-rs-wasip2@1.1.56': {} - '@milaboratories/pl-client@3.14.5': + '@milaboratories/pl-client@3.14.7': dependencies: '@grpc/grpc-js': 1.14.4 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/ts-helpers': 1.8.6 - '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) - '@protobuf-ts/runtime': 2.11.1 - '@protobuf-ts/runtime-rpc': 2.11.1 - canonicalize: 2.1.0 - denque: 2.1.0 - long: 5.3.2 - lru-cache: 11.2.2 - openapi-fetch: 0.15.0 - undici: 7.16.0 - utility-types: 3.11.0 - yaml: 2.8.1 - - '@milaboratories/pl-client@3.14.6': - dependencies: - '@grpc/grpc-js': 1.14.4 - '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-common': 1.48.0 '@milaboratories/ts-helpers': 1.8.6 '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/runtime': 2.11.1 @@ -6185,12 +6174,12 @@ snapshots: upath: 2.0.1 yaml: 2.8.1 - '@milaboratories/pl-deployments@3.0.15': + '@milaboratories/pl-deployments@3.0.16': dependencies: '@milaboratories/pl-config': 1.8.5 '@milaboratories/pl-healthcheck': 1.0.5 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-common': 1.48.0 '@milaboratories/ts-helpers': 1.8.6 decompress: 4.2.1 ssh2: 1.16.0 @@ -6200,14 +6189,14 @@ snapshots: yaml: 2.8.1 zod: 3.25.76 - '@milaboratories/pl-drivers@1.16.15': + '@milaboratories/pl-drivers@1.16.16': dependencies: '@grpc/grpc-js': 1.14.4 '@milaboratories/computable': 2.9.8 - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pl-client': 3.14.6 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-tree': 1.13.6 + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-tree': 1.13.7 '@milaboratories/ts-helpers': 1.8.6 '@protobuf-ts/grpc-transport': 2.11.1(@grpc/grpc-js@1.14.4) '@protobuf-ts/plugin': 2.11.1 @@ -6229,9 +6218,9 @@ snapshots: json-stringify-safe: 5.0.1 zod: 3.25.76 - '@milaboratories/pl-errors@1.4.35': + '@milaboratories/pl-errors@1.4.36': dependencies: - '@milaboratories/pl-client': 3.14.6 + '@milaboratories/pl-client': 3.14.7 '@milaboratories/ts-helpers': 1.8.6 zod: 3.25.76 @@ -6247,28 +6236,28 @@ snapshots: dependencies: undici: 7.16.0 - '@milaboratories/pl-middle-layer@1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': + '@milaboratories/pl-middle-layer@1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': dependencies: - '@milaboratories/columns-collection-driver': 0.2.3 + '@milaboratories/columns-collection-driver': 0.2.4 '@milaboratories/computable': 2.9.8 - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pf-driver': 1.9.0(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pf-driver': 1.9.1(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pf-spec-driver': 1.5.1(@bytecodealliance/preview2-shim@0.17.8) '@milaboratories/pframes-rs-node': 1.1.56 - '@milaboratories/pl-client': 3.14.6 - '@milaboratories/pl-deployments': 3.0.15 - '@milaboratories/pl-drivers': 1.16.15 - '@milaboratories/pl-errors': 1.4.35 + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-deployments': 3.0.16 + '@milaboratories/pl-drivers': 1.16.16 + '@milaboratories/pl-errors': 1.4.36 '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.20 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-model-middle-layer': 1.31.0 - '@milaboratories/pl-tree': 1.13.6 + '@milaboratories/pl-model-backend': 1.4.21 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 + '@milaboratories/pl-tree': 1.13.7 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/ts-helpers': 1.8.6 - '@platforma-sdk/block-tools': file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2) - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz - '@platforma-sdk/workflow-tengo': file:../../core/platforma/sdk/workflow-tengo/package.tgz + '@platforma-sdk/block-tools': 2.14.0(@types/node@24.5.2) + '@platforma-sdk/model': 1.82.0 + '@platforma-sdk/workflow-tengo': 6.8.2 canonicalize: 2.1.0 denque: 2.1.0 es-toolkit: 1.39.10 @@ -6287,21 +6276,22 @@ snapshots: - encoding - supports-color - '@milaboratories/pl-model-backend@1.4.19': + '@milaboratories/pl-model-backend@1.4.21': dependencies: - '@milaboratories/pl-client': 3.14.5 + '@milaboratories/pl-client': 3.14.7 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-backend@1.4.20': + '@milaboratories/pl-model-common@1.46.2': dependencies: - '@milaboratories/pl-client': 3.14.6 + '@milaboratories/helpers': 1.14.2 + '@milaboratories/pl-error-like': 1.12.10 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@file:../../core/platforma/lib/model/common/package.tgz': + '@milaboratories/pl-model-common@1.48.0': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/helpers': 1.14.5 '@milaboratories/pl-error-like': 1.12.10 canonicalize: 2.1.0 es-toolkit: 1.39.10 @@ -6309,33 +6299,33 @@ snapshots: '@milaboratories/pl-model-middle-layer@1.30.7': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/helpers': 1.14.2 + '@milaboratories/pl-model-common': 1.46.2 es-toolkit: 1.39.10 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-model-middle-layer@1.31.0': + '@milaboratories/pl-model-middle-layer@1.32.0': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.48.0 es-toolkit: 1.39.10 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-tree@1.13.6': + '@milaboratories/pl-tree@1.13.7': dependencies: '@milaboratories/computable': 2.9.8 - '@milaboratories/pl-client': 3.14.6 - '@milaboratories/pl-errors': 1.4.35 + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-errors': 1.4.36 '@milaboratories/ts-helpers': 1.8.6 denque: 2.1.0 utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/ptabler-expression-js@1.2.37': + '@milaboratories/ptabler-expression-js@1.2.38': dependencies: - '@platforma-open/milaboratories.software-ptabler.schema': 1.15.21 + '@platforma-open/milaboratories.software-ptabler.schema': 1.15.22 '@milaboratories/resolve-helper@1.1.3': {} @@ -6343,9 +6333,9 @@ snapshots: '@milaboratories/tengo-tester@1.6.4': {} - '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1)': + '@milaboratories/ts-builder@1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.24(typescript@5.8.2))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.24(typescript@5.8.2)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6384,9 +6374,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1)': + '@milaboratories/ts-builder@1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.6.3))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.6.3)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6425,9 +6415,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1)': + '@milaboratories/ts-builder@1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.8.2))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.2)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6466,9 +6456,9 @@ snapshots: - vue - yaml - '@milaboratories/ts-builder@file:../../core/platforma/tools/ts-builder/package.tgz(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1)': + '@milaboratories/ts-builder@1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1)': dependencies: - '@milaboratories/ts-configs': file:../../core/platforma/tools/ts-configs/package.tgz + '@milaboratories/ts-configs': 1.4.0 '@vitejs/plugin-vue': 6.0.7(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.3)) commander: 15.0.0 jsonc-parser: 3.3.1 @@ -6507,18 +6497,18 @@ snapshots: - vue - yaml - '@milaboratories/ts-configs@file:../../core/platforma/tools/ts-configs/package.tgz': {} + '@milaboratories/ts-configs@1.4.0': {} '@milaboratories/ts-helpers@1.8.6': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/helpers': 1.14.5 canonicalize: 2.1.0 denque: 2.1.0 - '@milaboratories/uikit@file:../../core/platforma/lib/ui/uikit/package.tgz(typescript@5.8.2)': + '@milaboratories/uikit@2.15.24(typescript@5.8.2)': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@milaboratories/helpers': 1.14.5 + '@platforma-sdk/model': 1.82.0 '@types/d3-array': 3.2.1 '@types/d3-axis': 3.0.6 '@types/d3-scale': 4.0.9 @@ -6926,9 +6916,9 @@ snapshots: '@platforma-open/milaboratories.runenv-r-samples-and-data@1.0.1': {} - '@platforma-open/milaboratories.software-ptabler.schema@1.15.21': + '@platforma-open/milaboratories.software-ptabler.schema@1.15.22': dependencies: - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz + '@milaboratories/pl-model-common': 1.48.0 '@platforma-open/milaboratories.software-ptabler@2.1.8': {} @@ -6952,21 +6942,21 @@ snapshots: '@platforma-open/milaboratories.software-small-binaries.mnz-client': 1.6.5 '@platforma-open/milaboratories.software-small-binaries.table-converter': 1.3.5 - '@platforma-sdk/block-kind@file:../../core/platforma/sdk/block-kind/package.tgz': {} + '@platforma-sdk/block-kind@1.1.0': {} - '@platforma-sdk/block-tools@file:../../core/platforma/tools/block-tools/package.tgz(@types/node@24.5.2)': + '@platforma-sdk/block-tools@2.14.0(@types/node@24.5.2)': dependencies: '@aws-sdk/client-ecr-public': 3.859.0 '@aws-sdk/client-s3': 3.859.0 '@inquirer/prompts': 7.10.1(@types/node@24.5.2) '@milaboratories/pl-http': 1.2.4 - '@milaboratories/pl-model-backend': 1.4.19 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-model-middle-layer': 1.31.0 + '@milaboratories/pl-model-backend': 1.4.21 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/ts-helpers': 1.8.6 '@platforma-sdk/blocks-deps-updater': 2.2.0 - '@platforma-sdk/package-builder-lib': 1.2.1 + '@platforma-sdk/package-builder-lib': 1.3.0 canonicalize: 2.1.0 commander: 15.0.0 lru-cache: 11.2.2 @@ -6983,13 +6973,13 @@ snapshots: dependencies: yaml: 2.8.1 - '@platforma-sdk/model@file:../../core/platforma/sdk/model/package.tgz': + '@platforma-sdk/model@1.82.0': dependencies: - '@milaboratories/helpers': file:../../core/platforma/lib/util/helpers/package.tgz + '@milaboratories/helpers': 1.14.5 '@milaboratories/pl-error-like': 1.12.10 - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/pl-model-middle-layer': 1.31.0 - '@milaboratories/ptabler-expression-js': 1.2.37 + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/pl-model-middle-layer': 1.32.0 + '@milaboratories/ptabler-expression-js': 1.2.38 canonicalize: 2.1.0 es-toolkit: 1.39.10 fast-json-patch: 3.1.1 @@ -6997,7 +6987,7 @@ snapshots: utility-types: 3.11.0 zod: 3.25.76 - '@platforma-sdk/package-builder-lib@1.2.1': + '@platforma-sdk/package-builder-lib@1.3.0': dependencies: '@aws-sdk/client-s3': 3.859.0 '@aws-sdk/lib-storage': 3.859.0(@aws-sdk/client-s3@3.859.0) @@ -7010,22 +7000,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@platforma-sdk/tengo-builder@4.0.22': + '@platforma-sdk/tengo-builder@4.0.23': dependencies: - '@milaboratories/pl-model-backend': 1.4.20 + '@milaboratories/pl-model-backend': 1.4.21 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/tengo-tester': 1.6.4 '@milaboratories/ts-helpers': 1.8.6 commander: 15.0.0 winston: 3.17.0 - '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': + '@platforma-sdk/test@1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': dependencies: '@milaboratories/computable': 2.9.8 - '@milaboratories/pl-client': 3.14.6 - '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) - '@milaboratories/pl-tree': 1.13.6 - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-middle-layer': 1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-tree': 1.13.7 + '@platforma-sdk/model': 1.82.0 '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) transitivePeerDependencies: @@ -7047,13 +7037,13 @@ snapshots: - supports-color - vite - '@platforma-sdk/test@1.81.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': + '@platforma-sdk/test@1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: '@milaboratories/computable': 2.9.8 - '@milaboratories/pl-client': 3.14.6 - '@milaboratories/pl-middle-layer': 1.66.19(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) - '@milaboratories/pl-tree': 1.13.6 - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-middle-layer': 1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-tree': 1.13.7 + '@platforma-sdk/model': 1.82.0 '@vitest/coverage-istanbul': 4.1.5(vitest@4.1.5) vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) transitivePeerDependencies: @@ -7075,13 +7065,13 @@ snapshots: - supports-color - vite - '@platforma-sdk/ui-vue@file:../../core/platforma/sdk/ui-vue/package.tgz(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2)': + '@platforma-sdk/ui-vue@1.82.1(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2)': dependencies: - '@milaboratories/columns-collection-driver': 0.2.3 - '@milaboratories/pf-spec-driver': 1.5.0(@bytecodealliance/preview2-shim@0.17.8) - '@milaboratories/pl-model-common': file:../../core/platforma/lib/model/common/package.tgz - '@milaboratories/uikit': file:../../core/platforma/lib/ui/uikit/package.tgz(typescript@5.8.2) - '@platforma-sdk/model': file:../../core/platforma/sdk/model/package.tgz + '@milaboratories/columns-collection-driver': 0.2.4 + '@milaboratories/pf-spec-driver': 1.5.1(@bytecodealliance/preview2-shim@0.17.8) + '@milaboratories/pl-model-common': 1.48.0 + '@milaboratories/uikit': 2.15.24(typescript@5.8.2) + '@platforma-sdk/model': 1.82.0 '@types/d3-format': 3.0.4 '@types/node': 24.5.2 '@types/semver': 7.7.0 @@ -7112,7 +7102,7 @@ snapshots: - typescript - universal-cookie - '@platforma-sdk/workflow-tengo@file:../../core/platforma/sdk/workflow-tengo/package.tgz': + '@platforma-sdk/workflow-tengo@6.8.2': dependencies: '@milaboratories/pframes-rs-wasip2': 1.1.56 '@milaboratories/software-pframes-conv': 2.2.9 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8c30d6e..36192e9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -23,7 +23,7 @@ catalog: "@platforma-sdk/test": 1.82.0 "@milaboratories/helpers": 1.14.5 - "@milaboratories/pl-model-common": ^1.31.2 + "@milaboratories/pl-model-common": 1.48.0 "vue": 3.5.24 From baa3841d684b6ccc594f394d443356c2edf53756 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Wed, 19 Aug 2026 14:36:47 +0200 Subject: [PATCH 07/11] chore: refresh SDK versions named in the changeset --- .changeset/soft-hoops-search.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/soft-hoops-search.md b/.changeset/soft-hoops-search.md index cba5d9a..b707630 100644 --- a/.changeset/soft-hoops-search.md +++ b/.changeset/soft-hoops-search.md @@ -8,7 +8,7 @@ Migrate to structure v2 and declare a block kind The SDK upgrade moves the block onto the current canonical layout (block-tools -2.13.0, model/ui-vue 1.81.1, workflow-tengo 6.8.2, tengo-builder 4.0.22) and +2.14.0, model/ui-vue 1.82.x, workflow-tengo 6.8.2, tengo-builder 4.0.23) and switches the software packages from `pl-pkg` to `block-tools software build`. The block now declares a kind, whose init-params contract is the study setup a From 06ed83b6d1ca28f1e16c141e700f466710e0290d Mon Sep 17 00:00:00 2001 From: Alexandr Date: Wed, 19 Aug 2026 17:19:07 +0200 Subject: [PATCH 08/11] chore: update Node.js version to 22.x and bump SDK dependencies --- .github/workflows/build.yaml | 2 +- .github/workflows/mark-stable.yaml | 2 +- block/package.json | 1 + pnpm-lock.yaml | 132 ++++++----------------------- pnpm-workspace.yaml | 4 +- 5 files changed, 31 insertions(+), 110 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6d20cdb..d404be7 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ jobs: with: app-name: 'Block: Samples And Data' app-name-slug: 'block-samples-and-data' - node-version: '20.x' + node-version: '22.x' gha-runner-label: hz-ubuntu-dind build-script-name: 'build:dev-local' build-before-publish-script-name: 'build:release' diff --git a/.github/workflows/mark-stable.yaml b/.github/workflows/mark-stable.yaml index e98e84a..b8f97f1 100644 --- a/.github/workflows/mark-stable.yaml +++ b/.github/workflows/mark-stable.yaml @@ -15,7 +15,7 @@ jobs: uses: milaboratory/github-ci/.github/workflows/block-mark-stable.yaml@v4 with: app-name: 'Block: Samples And Data - Mark Stable' - node-version: '20.x' + node-version: '22.x' npmrc-config: | { "registries": { diff --git a/block/package.json b/block/package.json index 74e5929..8979303 100644 --- a/block/package.json +++ b/block/package.json @@ -20,6 +20,7 @@ "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"", "build": "ts-builder build --target block-facade && block-tools pack", "prepublishOnly": "block-tools publish --unstable -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", + "mark-stable": "block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'", "do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz", "check": "ts-builder type-check --target block-facade" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a88903..3b05c67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,8 +31,8 @@ catalogs: specifier: 1.1.0 version: 1.1.0 '@platforma-sdk/block-tools': - specifier: 2.14.0 - version: 2.14.0 + specifier: 2.14.2 + version: 2.14.2 '@platforma-sdk/model': specifier: 1.82.0 version: 1.82.0 @@ -40,8 +40,8 @@ catalogs: specifier: 4.0.23 version: 4.0.23 '@platforma-sdk/test': - specifier: 1.82.0 - version: 1.82.0 + specifier: 1.82.3 + version: 1.82.3 '@platforma-sdk/ui-vue': specifier: 1.82.1 version: 1.82.1 @@ -101,7 +101,7 @@ importers: version: 1.7.0(@types/node@24.5.2)(rollup@4.37.0)(vue@3.5.25(typescript@5.9.3))(yaml@2.8.1) '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) shx: specifier: 'catalog:' version: 0.4.0 @@ -131,7 +131,7 @@ importers: version: link:../workflow '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) '@platforma-sdk/model': specifier: 'catalog:' version: 1.82.0 @@ -165,7 +165,7 @@ importers: version: 1.4.0 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) model: dependencies: @@ -193,7 +193,7 @@ importers: version: 1.4.0 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) software/parse-h5ad: devDependencies: @@ -202,7 +202,7 @@ importers: version: 1.7.5 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) software/parse-seurat: devDependencies: @@ -214,7 +214,7 @@ importers: version: 1.0.1 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.14.0(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) test: dependencies: @@ -239,7 +239,7 @@ importers: version: 1.4.0 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + version: 1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) vitest: specifier: 'catalog:' version: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) @@ -319,7 +319,7 @@ importers: version: 4.0.23 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + version: 1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) shx: specifier: 'catalog:' version: 0.4.0 @@ -1154,8 +1154,8 @@ packages: '@milaboratories/pl-http@1.2.4': resolution: {integrity: sha512-QKmhx+WEvJCV9dUy/SBdQk/ApaJ5ewBFgm/b+XPlS10SusAdqUUTGvK5+hq8YSuUMXlHb/dk++UtI5YlDuDl2Q==} - '@milaboratories/pl-middle-layer@1.67.0': - resolution: {integrity: sha512-T4+QXmlqG32y27z1fy5tIzBqs6DXij3JBhUYLZVnN7s6PTTDdKlj80V/ebt5Wysp2meoEP+B+sk84adE/FBeJA==} + '@milaboratories/pl-middle-layer@1.67.2': + resolution: {integrity: sha512-5SLP4UPMlAf8zLRWjZiWDioyFyBXnc0NxZvSUvL39Lc9h6tuk2MQ5ACUmXCSbBkFW1tV6dBGnc+50YdfTQ90gQ==} engines: {node: '>=22.19.0'} '@milaboratories/pl-model-backend@1.4.21': @@ -1785,8 +1785,8 @@ packages: '@platforma-sdk/block-kind@1.1.0': resolution: {integrity: sha512-4uh+40o6BGfQcPPhkYGCjng8EXR9qn+6i5Fuc3RJ5QGfPYfcwbxT35G2V7ALUxmsqjLZ5SGL+JcW6Lm2v0cZHA==} - '@platforma-sdk/block-tools@2.14.0': - resolution: {integrity: sha512-sAsSDAHVAqlDn/QO+KuBnaVy/VomiHM4cI4ghylcY0Fq2CroVyz8Cm5YNw0SPINuUYmpzvVQuG9ili9Fn7uOog==} + '@platforma-sdk/block-tools@2.14.2': + resolution: {integrity: sha512-pYreKAu14sl/KKZZs0g/oldxUSvxPeBNc4QoxYHbdxhUykX78OsyL9/288QS8EcaltO+atblU/Zs7AtKaPvdVA==} hasBin: true '@platforma-sdk/blocks-deps-updater@2.2.0': @@ -1804,8 +1804,8 @@ packages: engines: {node: '>=22'} hasBin: true - '@platforma-sdk/test@1.82.0': - resolution: {integrity: sha512-0fSW+Awn8FBfUDjFEAGL0HXqcJGzs5FpF3gUVcIxCY78Veiz9L6jUNncxB3pCO9ezYueVIXDDpPAETg4Hsvy6A==} + '@platforma-sdk/test@1.82.3': + resolution: {integrity: sha512-l621C70u97yw9MeSte4BV/BYjYYHiYt3IFwJZSLCfkGuDgXRXdYj8e5Leek17jmIe0YdVem/P/6DPtl1V4X74g==} '@platforma-sdk/ui-vue@1.82.1': resolution: {integrity: sha512-HCwLm+yN2cKbRL0caQ21+40mcodVGTmnruruNQAkcCkgHu4AaRmkEVRtel8AdHLpcqJS5ray341E1bqGErguSw==} @@ -6236,7 +6236,7 @@ snapshots: dependencies: undici: 7.16.0 - '@milaboratories/pl-middle-layer@1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': + '@milaboratories/pl-middle-layer@1.67.2(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)': dependencies: '@milaboratories/columns-collection-driver': 0.2.4 '@milaboratories/computable': 2.9.8 @@ -6255,7 +6255,7 @@ snapshots: '@milaboratories/pl-tree': 1.13.7 '@milaboratories/resolve-helper': 1.1.3 '@milaboratories/ts-helpers': 1.8.6 - '@platforma-sdk/block-tools': 2.14.0(@types/node@24.5.2) + '@platforma-sdk/block-tools': 2.14.2(@types/node@24.5.2) '@platforma-sdk/model': 1.82.0 '@platforma-sdk/workflow-tengo': 6.8.2 canonicalize: 2.1.0 @@ -6944,7 +6944,7 @@ snapshots: '@platforma-sdk/block-kind@1.1.0': {} - '@platforma-sdk/block-tools@2.14.0(@types/node@24.5.2)': + '@platforma-sdk/block-tools@2.14.2(@types/node@24.5.2)': dependencies: '@aws-sdk/client-ecr-public': 3.859.0 '@aws-sdk/client-s3': 3.859.0 @@ -7009,43 +7009,15 @@ snapshots: commander: 15.0.0 winston: 3.17.0 - '@platforma-sdk/test@1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': - dependencies: - '@milaboratories/computable': 2.9.8 - '@milaboratories/pl-client': 3.14.7 - '@milaboratories/pl-middle-layer': 1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) - '@milaboratories/pl-tree': 1.13.7 - '@platforma-sdk/model': 1.82.0 - '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) - vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) - transitivePeerDependencies: - - '@bytecodealliance/preview2-shim' - - '@edge-runtime/vm' - - '@opentelemetry/api' - - '@types/node' - - '@vitest/browser-playwright' - - '@vitest/browser-preview' - - '@vitest/browser-webdriverio' - - '@vitest/coverage-v8' - - '@vitest/ui' - - aws-crt - - bare-buffer - - encoding - - happy-dom - - jsdom - - msw - - supports-color - - vite - - '@platforma-sdk/test@1.82.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': + '@platforma-sdk/test@1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: '@milaboratories/computable': 2.9.8 '@milaboratories/pl-client': 3.14.7 - '@milaboratories/pl-middle-layer': 1.67.0(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-middle-layer': 1.67.2(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) '@milaboratories/pl-tree': 1.13.7 '@platforma-sdk/model': 1.82.0 '@vitest/coverage-istanbul': 4.1.5(vitest@4.1.5) - vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) transitivePeerDependencies: - '@bytecodealliance/preview2-shim' - '@edge-runtime/vm' @@ -7794,22 +7766,6 @@ snapshots: vite: 8.0.16(@types/node@24.5.2)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.3) - '@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': - dependencies: - '@babel/core': 7.29.0 - '@istanbuljs/schema': 0.1.3 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - magicast: 0.5.2 - obug: 2.1.3 - tinyrainbow: 3.1.0 - vitest: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) - transitivePeerDependencies: - - supports-color - '@vitest/coverage-istanbul@4.1.5(vitest@4.1.5)': dependencies: '@babel/core': 7.29.0 @@ -7822,7 +7778,7 @@ snapshots: magicast: 0.5.2 obug: 2.1.3 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -7852,14 +7808,6 @@ snapshots: optionalDependencies: vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) - '@vitest/mocker@4.1.5(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 4.1.5 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) - '@vitest/mocker@4.1.5(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.1.5 @@ -10076,35 +10024,7 @@ snapshots: - tsx - yaml - vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)): - dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.5.2 - '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) - transitivePeerDependencies: - - msw - - vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)): + vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 36192e9..ab30267 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,7 +9,7 @@ packages: - workflow catalog: - "@platforma-sdk/block-tools": 2.14.0 + "@platforma-sdk/block-tools": 2.14.2 "@platforma-sdk/block-kind": 1.1.0 "@platforma-sdk/model": 1.82.0 "@platforma-sdk/ui-vue": 1.82.1 @@ -21,7 +21,7 @@ catalog: "@platforma-open/milaboratories.runenv-python-3": ^1.7.5 "@platforma-open/milaboratories.runenv-r-samples-and-data": ^1.0.1 - "@platforma-sdk/test": 1.82.0 + "@platforma-sdk/test": 1.82.3 "@milaboratories/helpers": 1.14.5 "@milaboratories/pl-model-common": 1.48.0 From d1b30f7f3df7a87760499caf22fd67ae74859156 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Thu, 20 Aug 2026 11:07:29 +0200 Subject: [PATCH 09/11] refactor: bring the kind's parser onto the shared shape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Splits the kind into types/params/index like every sibling block, and replaces the hand-rolled primitive checks with es-toolkit predicates: isPlainObject for the object envelopes — hand-written it is wrong three ways, since typeof null is "object", Object.keys(5) is [] and Object.keys(["a"]) is ["0"] — plus isString and isBoolean for the fields. The file-handle check now uses the SDK's own prefix guards instead of accepting any string. Adds the CONTRACT table with the satisfies drift guard the other kinds carry, which this one lacked: every field being optional means a parser that simply forgot one would otherwise return a valid BlockParams and say nothing. Numeric and array guards stay native on purpose. es-toolkit only ships those in its lodash-compat layer, where isInteger returns a plain boolean and cannot be a type guard at all, and isNumber accepts NaN and boxed Numbers — both looser than Number.isInteger and Array.isArray. The per-item error messages get coarser: a bad metadata column now names the field rather than the row index. That is what the shared shape costs, and what the five sibling kinds already accept. --- kind/package.json | 3 +- kind/src/index.ts | 187 +------------------------------------------- kind/src/params.ts | 168 +++++++++++++++++++++++++++++++++++++++ kind/src/types.ts | 30 +++++++ pnpm-lock.yaml | 94 +++++++++++++++++++++- pnpm-workspace.yaml | 1 + 6 files changed, 294 insertions(+), 189 deletions(-) create mode 100644 kind/src/params.ts diff --git a/kind/package.json b/kind/package.json index 0afc923..722fc25 100644 --- a/kind/package.json +++ b/kind/package.json @@ -23,7 +23,8 @@ }, "dependencies": { "@milaboratories/pl-model-common": "catalog:", - "@platforma-sdk/block-kind": "catalog:" + "@platforma-sdk/block-kind": "catalog:", + "es-toolkit": "catalog:" }, "devDependencies": { "@milaboratories/ts-builder": "catalog:", diff --git a/kind/src/index.ts b/kind/src/index.ts index a9edf85..f1575f0 100644 --- a/kind/src/index.ts +++ b/kind/src/index.ts @@ -1,191 +1,10 @@ -import { assertParamsObject, defineBlockKind } from "@platforma-sdk/block-kind"; +import { defineBlockKind } from "@platforma-sdk/block-kind"; import { name, version } from "../package.json" with { type: "json" }; -import type { DSAny, DSType, ImportFileHandle, MTColumn, MTValueType, PlId } from "./types"; +import { parseInitializationParams } from "./params"; +import type { BlockParams } from "./types"; export * from "./types"; -/** - * This block's init-params contract — the study setup a creator or a project - * template supplies to seed a new instance: which metadata columns the study - * collects, how the sample column is named, how its datasets are configured, - * and whichever of its files can be resolved from where the block lands. - * - * A file travels only when it is a storage reference: `index://` names a - * `{storageId, path}` any installation carrying that storage can resolve, while - * `upload://` carries a local path signed with the installation's own secret. - * Samples travel with the files that produced them and not otherwise — samples - * are created by importing files, so a sample arriving without its file would - * be a row with metadata and no data, for the user to delete. - * - * Which of the two a given dataset gets is the exporting block's call, not this - * contract's: both a fully populated dataset and a bare shell are ordinary - * states of the block, so both are valid params. - * - * Every field is optional because a block may be created without a template, so - * `init` keeps a default for each. - */ -export type BlockParams = Partial<{ - datasets: DSAny[]; - metadata: MTColumn[]; - sampleIds: PlId[]; - sampleLabelColumnLabel: string; - sampleLabels: Record; - h5adFilesToPreprocess: ImportFileHandle[]; - seuratFilesToPreprocess: ImportFileHandle[]; -}>; - -/** - * The same contract at runtime, for params that arrive from a template file - * rather than from typed code — the only point that can catch a hand-written - * entry being wrong. - * - * Checks are at the envelope: an entry is an object, its discriminator is one - * this block knows, its scalar fields are the right primitives. What a value - * *means* is settled where it is used — the block's own `args` is what holds - * datasets, groups and rules to each other, and rejecting a half-configured - * study here would refuse states the editor can reach. - * - * The file handles inside a dataset are deliberately not walked. Their shape - * differs per dataset kind, and whether a handle still resolves is knowable only - * where the block runs, not here — the same limit every kind has on a handle. - */ -function parseInitializationParams(value: unknown): BlockParams { - assertParamsObject(value); - - const { - datasets, - metadata, - sampleIds, - sampleLabelColumnLabel, - sampleLabels, - h5adFilesToPreprocess, - seuratFilesToPreprocess, - } = value; - - if (sampleLabelColumnLabel !== undefined && typeof sampleLabelColumnLabel !== "string") { - throw new Error("'sampleLabelColumnLabel' must be a string."); - } - - if (metadata !== undefined) { - if (!Array.isArray(metadata)) throw new Error("'metadata' must be an array of columns."); - metadata.forEach(assertMetadataColumn); - } - - if (datasets !== undefined) { - if (!Array.isArray(datasets)) throw new Error("'datasets' must be an array of datasets."); - datasets.forEach(assertDataset); - } - - assertStringArray(sampleIds, "sampleIds"); - assertStringArray(h5adFilesToPreprocess, "h5adFilesToPreprocess"); - assertStringArray(seuratFilesToPreprocess, "seuratFilesToPreprocess"); - - if (sampleLabels !== undefined) { - assertObject(sampleLabels, "'sampleLabels'"); - for (const [id, label] of Object.entries(sampleLabels)) { - if (typeof label !== "string") { - throw new Error(`'sampleLabels' entry ${JSON.stringify(id)} must be a string.`); - } - } - } - - return { - datasets: datasets as DSAny[] | undefined, - metadata: metadata as MTColumn[] | undefined, - sampleIds: sampleIds as PlId[] | undefined, - sampleLabelColumnLabel, - sampleLabels: sampleLabels as Record | undefined, - h5adFilesToPreprocess: h5adFilesToPreprocess as ImportFileHandle[] | undefined, - seuratFilesToPreprocess: seuratFilesToPreprocess as ImportFileHandle[] | undefined, - }; -} - -function assertStringArray(value: unknown, field: string): void { - if (value === undefined) return; - if (!Array.isArray(value) || value.some((v) => typeof v !== "string")) { - throw new Error(`'${field}' must be an array of strings.`); - } -} - -/** - * The value types a metadata column may declare, as a runtime set. `satisfies - * Record` is what keeps it in step: a value type added to the - * union and forgotten here fails to compile, rather than turning into a kind - * that refuses a correct file. - */ -const MT_VALUE_TYPES = { - Long: true, - Double: true, - String: true, -} as const satisfies Record; - -/** The dataset kinds this block knows, kept in step with the union the same way. */ -const DATASET_TYPES = { - Fastq: true, - MultilaneFastq: true, - TaggedFastq: true, - Fasta: true, - Xsv: true, - TaggedXsv: true, - BulkCountMatrix: true, - CellRangerMTX: true, - MultiplexedFastq: true, - H5AD: true, - H5: true, - Seurat: true, - MultiSampleH5AD: true, - MultiSampleSeurat: true, -} as const satisfies Record; - -function assertMetadataColumn(column: unknown, index: number): void { - const where = `metadata column ${index}`; - assertObject(column, where); - - if (typeof column.id !== "string") throw new Error(`'id' of ${where} must be a string.`); - if (typeof column.label !== "string") throw new Error(`'label' of ${where} must be a string.`); - if (typeof column.global !== "boolean") - throw new Error(`'global' of ${where} must be a boolean.`); - if (!isKeyOf(MT_VALUE_TYPES, column.valueType)) { - throw new Error( - `'valueType' of ${where} must be one of ${keyList(MT_VALUE_TYPES)}, not ${JSON.stringify(column.valueType)}.`, - ); - } -} - -function assertDataset(dataset: unknown, index: number): void { - const where = `dataset ${index}`; - assertObject(dataset, where); - - if (typeof dataset.id !== "string") throw new Error(`'id' of ${where} must be a string.`); - if (typeof dataset.label !== "string") throw new Error(`'label' of ${where} must be a string.`); - - const content = dataset.content; - assertObject(content, `'content' of ${where}`); - - if (!isKeyOf(DATASET_TYPES, content.type)) { - throw new Error( - `'content.type' of ${where} must be one of ${keyList(DATASET_TYPES)}, not ${JSON.stringify(content.type)}.`, - ); - } - if (typeof content.gzipped !== "boolean") { - throw new Error(`'content.gzipped' of ${where} must be a boolean.`); - } -} - -function assertObject(value: unknown, where: string): asserts value is Record { - if (typeof value !== "object" || value === null || Array.isArray(value)) { - throw new Error(`${where} must be an object.`); - } -} - -function isKeyOf(set: Record, key: unknown): key is string { - return typeof key === "string" && key in set; -} - -function keyList(set: Record): string { - return Object.keys(set).join(", "); -} - // Identity (`name`/`version`) comes from this package's own `package.json`, so // the on-wire `{name}@{version}` reference can never drift from what npm // publishes; the bundler inlines the JSON import. diff --git a/kind/src/params.ts b/kind/src/params.ts new file mode 100644 index 0000000..5494511 --- /dev/null +++ b/kind/src/params.ts @@ -0,0 +1,168 @@ +import { assertParamsObject } from "@platforma-sdk/block-kind"; +import { isImportFileHandleIndex, isImportFileHandleUpload } from "@milaboratories/pl-model-common"; +import { isBoolean, isPlainObject, isString } from "es-toolkit"; +import type { + BlockParams, + DSAny, + DSType, + ImportFileHandle, + MTColumn, + MTValueType, + PlId, +} from "./types"; + +/** + * The contract at runtime, for params that arrive from a template file rather + * than from typed code. + * + * Each field the contract names is read and checked; a key it does not name is + * dropped by never being read, so it needs no rejection here. Params written + * against a different version of the contract are caught by the version in the + * template entry's `{name}@{selector}` reference, not by a key-set check. + */ +export function parseInitializationParams(value: unknown): BlockParams { + assertParamsObject(value); + + const params: Record = {}; + for (const [field, { is, must }] of Object.entries(CONTRACT)) { + const raw = value[field]; + if (raw === undefined) continue; + if (!is(raw)) throw new Error(`'${field}' must be ${must}.`); + params[field] = raw; + } + // Every value placed here passed its own field's guard, and `CONTRACT` is + // proven exhaustive over `BlockParams` by the `satisfies` below. + return params as BlockParams; +} + +// --------------------------------------------------------------------------- +// Internals +// --------------------------------------------------------------------------- + +type Guard = (value: unknown) => value is T; + +/** A guard plus how to finish the sentence "'field' must be …". */ +type Check = { readonly is: Guard; readonly must: string }; + +function check(is: Guard, must: string): Check { + return { is, must }; +} + +function arrayOf(item: Guard): Guard { + return (v): v is T[] => Array.isArray(v) && v.every((e) => item(e)); +} + +function recordOf(item: Guard): Guard> { + return (v): v is Record => isPlainObject(v) && Object.values(v).every((e) => item(e)); +} + +/** + * A guard over the keys of one of the tag sets below, so the runtime check and + * the type it guards are both read off the same object. + */ +function keyOf(set: Record): Guard { + return (v): v is T => isString(v) && v in set; +} + +function keyList(set: Record): string { + return Object.keys(set).join(", "); +} + +/** + * The value types a metadata column may declare, as a runtime set. `satisfies + * Record` is what keeps it in step: a value type added to the + * union and forgotten here fails to compile, rather than turning into a kind + * that refuses a correct file. + */ +const MT_VALUE_TYPES = { + Long: true, + Double: true, + String: true, +} as const satisfies Record; + +/** The dataset kinds this block knows, kept in step with the union the same way. */ +const DATASET_TYPES = { + Fastq: true, + MultilaneFastq: true, + TaggedFastq: true, + Fasta: true, + Xsv: true, + TaggedXsv: true, + BulkCountMatrix: true, + CellRangerMTX: true, + MultiplexedFastq: true, + H5AD: true, + H5: true, + Seurat: true, + MultiSampleH5AD: true, + MultiSampleSeurat: true, +} as const satisfies Record; + +/** + * A `PlId` is a branded 24-char base32 string, but the brand is erased at + * runtime and the block treats these ids as opaque keys, so the envelope check + * is the string test. + */ +const isPlId = isString as Guard; + +/** + * Both handle forms are accepted. The projection only sends `index://` handles, + * but `upload://` is a legitimate value of the type, and the two SDK guards are + * prefix tests — the cast only gets a checked string past a signature that + * expects the union. + */ +const isFileHandle: Guard = (v): v is ImportFileHandle => + isString(v) && + (isImportFileHandleIndex(v as ImportFileHandle) || + isImportFileHandleUpload(v as ImportFileHandle)); + +/** + * A metadata column at the envelope: its identity, its declared value type, and + * nothing about the values. What the values mean is settled where they are used. + */ +const isMetadataColumn: Guard = (v): v is MTColumn => + isPlainObject(v) && + isString(v.id) && + isString(v.label) && + isBoolean(v.global) && + keyOf(MT_VALUE_TYPES)(v.valueType); + +/** + * A dataset at the envelope: its identity and the discriminator of its content. + * + * The file handles inside are deliberately not walked. Their shape differs per + * dataset kind, and whether a handle still resolves is knowable only where the + * block runs, not here — the same limit every kind has on a handle. Likewise + * the per-sample and per-group maps: the block's own `args` is what holds + * datasets, groups and rules to each other, and rejecting a half-configured + * study here would refuse states the editor can reach. + */ +const isDataset: Guard = (v): v is DSAny => + isPlainObject(v) && + isString(v.id) && + isString(v.label) && + isPlainObject(v.content) && + keyOf(DATASET_TYPES)(v.content.type) && + isBoolean(v.content.gzipped); + +/** + * The contract, field by field, at runtime. + * + * The `satisfies` clause is the drift guard: it demands an entry for every key + * `BlockParams` declares, and types each guard against that key's own type. Add + * a field to the contract and this stops compiling until the check exists — + * which matters here because every field is optional, so a parser that simply + * forgot one would otherwise return a valid `BlockParams` and say nothing. + */ +const CONTRACT = { + datasets: check(arrayOf(isDataset), `an array of datasets of: ${keyList(DATASET_TYPES)}`), + metadata: check( + arrayOf(isMetadataColumn), + `an array of metadata columns valued: ${keyList(MT_VALUE_TYPES)}`, + ), + sampleIds: check(arrayOf(isPlId), "an array of sample ids"), + sampleLabelColumnLabel: check(isString, "a string"), + sampleLabels: check(recordOf(isString), "an object of sample id to label"), + h5adFilesToPreprocess: check(arrayOf(isFileHandle), "an array of file handles"), + seuratFilesToPreprocess: check(arrayOf(isFileHandle), "an array of file handles"), +} satisfies { [K in keyof BlockParams]-?: Check> }; diff --git a/kind/src/types.ts b/kind/src/types.ts index 638f4b5..ea52b10 100644 --- a/kind/src/types.ts +++ b/kind/src/types.ts @@ -226,3 +226,33 @@ export type DSGrouped = | DSMultiSampleH5ad | DSMultiplexedFastq | DSMultiSampleSeurat; + +/** + * This block's init-params contract — the study setup a creator or a project + * template supplies to seed a new instance: which metadata columns the study + * collects, how the sample column is named, how its datasets are configured, + * and whichever of its files can be resolved from where the block lands. + * + * A file travels only when it is a storage reference: `index://` names a + * `{storageId, path}` any installation carrying that storage can resolve, while + * `upload://` carries a local path signed with the installation's own secret. + * Samples travel with the files that produced them and not otherwise — samples + * are created by importing files, so a sample arriving without its file would + * be a row with metadata and no data, for the user to delete. + * + * Which of the two a given dataset gets is the exporting block's call, not this + * contract's: both a fully populated dataset and a bare shell are ordinary + * states of the block, so both are valid params. + * + * Every field is optional because a block may be created without a template, so + * `init` keeps a default for each. + */ +export type BlockParams = Partial<{ + datasets: DSAny[]; + metadata: MTColumn[]; + sampleIds: PlId[]; + sampleLabelColumnLabel: string; + sampleLabels: Record; + h5adFilesToPreprocess: ImportFileHandle[]; + seuratFilesToPreprocess: ImportFileHandle[]; +}>; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b05c67..bc16ae8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,6 +57,9 @@ catalogs: ag-grid-vue3: specifier: ~34.1.2 version: 34.1.2 + es-toolkit: + specifier: 1.39.10 + version: 1.39.10 radashi: specifier: ^12.7.0 version: 12.7.0 @@ -153,6 +156,9 @@ importers: '@types/node': specifier: '*' version: 24.5.2 + es-toolkit: + specifier: 'catalog:' + version: 1.39.10 typescript: specifier: '*' version: 5.9.3 @@ -239,7 +245,7 @@ importers: version: 1.4.0 '@platforma-sdk/test': specifier: 'catalog:' - version: 1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + version: 1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) vitest: specifier: 'catalog:' version: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) @@ -7009,6 +7015,34 @@ snapshots: commander: 15.0.0 winston: 3.17.0 + '@platforma-sdk/test@1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': + dependencies: + '@milaboratories/computable': 2.9.8 + '@milaboratories/pl-client': 3.14.7 + '@milaboratories/pl-middle-layer': 1.67.2(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2) + '@milaboratories/pl-tree': 1.13.7 + '@platforma-sdk/model': 1.82.0 + '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + transitivePeerDependencies: + - '@bytecodealliance/preview2-shim' + - '@edge-runtime/vm' + - '@opentelemetry/api' + - '@types/node' + - '@vitest/browser-playwright' + - '@vitest/browser-preview' + - '@vitest/browser-webdriverio' + - '@vitest/coverage-v8' + - '@vitest/ui' + - aws-crt + - bare-buffer + - encoding + - happy-dom + - jsdom + - msw + - supports-color + - vite + '@platforma-sdk/test@1.82.3(@bytecodealliance/preview2-shim@0.17.8)(@types/node@24.5.2)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: '@milaboratories/computable': 2.9.8 @@ -7017,7 +7051,7 @@ snapshots: '@milaboratories/pl-tree': 1.13.7 '@platforma-sdk/model': 1.82.0 '@vitest/coverage-istanbul': 4.1.5(vitest@4.1.5) - vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) transitivePeerDependencies: - '@bytecodealliance/preview2-shim' - '@edge-runtime/vm' @@ -7766,6 +7800,22 @@ snapshots: vite: 8.0.16(@types/node@24.5.2)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.3) + '@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.29.0 + '@istanbuljs/schema': 0.1.3 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.2 + obug: 2.1.3 + tinyrainbow: 3.1.0 + vitest: 4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-istanbul@4.1.5(vitest@4.1.5)': dependencies: '@babel/core': 7.29.0 @@ -7778,7 +7828,7 @@ snapshots: magicast: 0.5.2 obug: 2.1.3 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) + vitest: 4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -7808,6 +7858,14 @@ snapshots: optionalDependencies: vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) + '@vitest/mocker@4.1.5(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.1.5 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) + '@vitest/mocker@4.1.5(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.1.5 @@ -10024,7 +10082,35 @@ snapshots: - tsx - yaml - vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)))(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)): + vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)): + dependencies: + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 6.2.3(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.5.2 + '@vitest/coverage-istanbul': 4.1.5(vitest@4.0.10(@types/node@24.5.2)(lightningcss@1.32.0)(yaml@2.8.1)) + transitivePeerDependencies: + - msw + + vitest@4.1.5(@types/node@24.5.2)(@vitest/coverage-istanbul@4.1.5)(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.5 '@vitest/mocker': 4.1.5(vite@8.0.16(@types/node@24.5.2)(yaml@2.8.1)) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ab30267..2899178 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -28,6 +28,7 @@ catalog: "vue": 3.5.24 "zod": ~3.25.76 + "es-toolkit": 1.39.10 "radashi": ^12.7.0 "utility-types": ^3.11.0 From a34c174339ad6031659b8305aca5c33fe617e07e Mon Sep 17 00:00:00 2001 From: Alexandr Date: Thu, 20 Aug 2026 11:19:06 +0200 Subject: [PATCH 10/11] refactor: take the array guard from es-toolkit and lead types.ts with the contract MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit isArray comes from es-toolkit/compat, which is where the narrowing version lives; the root entry ships none. BlockParams was appended at the end of types.ts, under 240 lines of the dataset and metadata types that support it. It is what the file exists to declare, so it now leads — as it does in every sibling kind. --- kind/src/params.ts | 3 ++- kind/src/types.ts | 60 +++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/kind/src/params.ts b/kind/src/params.ts index 5494511..c61812a 100644 --- a/kind/src/params.ts +++ b/kind/src/params.ts @@ -1,6 +1,7 @@ import { assertParamsObject } from "@platforma-sdk/block-kind"; import { isImportFileHandleIndex, isImportFileHandleUpload } from "@milaboratories/pl-model-common"; import { isBoolean, isPlainObject, isString } from "es-toolkit"; +import { isArray } from "es-toolkit/compat"; import type { BlockParams, DSAny, @@ -49,7 +50,7 @@ function check(is: Guard, must: string): Check { } function arrayOf(item: Guard): Guard { - return (v): v is T[] => Array.isArray(v) && v.every((e) => item(e)); + return (v): v is T[] => isArray(v) && v.every((e) => item(e)); } function recordOf(item: Guard): Guard> { diff --git a/kind/src/types.ts b/kind/src/types.ts index ea52b10..eb7047f 100644 --- a/kind/src/types.ts +++ b/kind/src/types.ts @@ -1,6 +1,36 @@ import type { ImportFileHandle, PlId } from "@milaboratories/pl-model-common"; export type { ImportFileHandle, PlId } from "@milaboratories/pl-model-common"; +/** + * This block's init-params contract — the study setup a creator or a project + * template supplies to seed a new instance: which metadata columns the study + * collects, how the sample column is named, how its datasets are configured, + * and whichever of its files can be resolved from where the block lands. + * + * A file travels only when it is a storage reference: `index://` names a + * `{storageId, path}` any installation carrying that storage can resolve, while + * `upload://` carries a local path signed with the installation's own secret. + * Samples travel with the files that produced them and not otherwise — samples + * are created by importing files, so a sample arriving without its file would + * be a row with metadata and no data, for the user to delete. + * + * Which of the two a given dataset gets is the exporting block's call, not this + * contract's: both a fully populated dataset and a bare shell are ordinary + * states of the block, so both are valid params. + * + * Every field is optional because a block may be created without a template, so + * `init` keeps a default for each. + */ +export type BlockParams = Partial<{ + datasets: DSAny[]; + metadata: MTColumn[]; + sampleIds: PlId[]; + sampleLabelColumnLabel: string; + sampleLabels: Record; + h5adFilesToPreprocess: ImportFileHandle[]; + seuratFilesToPreprocess: ImportFileHandle[]; +}>; + /** ***** Metadata *******/ export type MTValueTypeLong = "Long"; @@ -226,33 +256,3 @@ export type DSGrouped = | DSMultiSampleH5ad | DSMultiplexedFastq | DSMultiSampleSeurat; - -/** - * This block's init-params contract — the study setup a creator or a project - * template supplies to seed a new instance: which metadata columns the study - * collects, how the sample column is named, how its datasets are configured, - * and whichever of its files can be resolved from where the block lands. - * - * A file travels only when it is a storage reference: `index://` names a - * `{storageId, path}` any installation carrying that storage can resolve, while - * `upload://` carries a local path signed with the installation's own secret. - * Samples travel with the files that produced them and not otherwise — samples - * are created by importing files, so a sample arriving without its file would - * be a row with metadata and no data, for the user to delete. - * - * Which of the two a given dataset gets is the exporting block's call, not this - * contract's: both a fully populated dataset and a bare shell are ordinary - * states of the block, so both are valid params. - * - * Every field is optional because a block may be created without a template, so - * `init` keeps a default for each. - */ -export type BlockParams = Partial<{ - datasets: DSAny[]; - metadata: MTColumn[]; - sampleIds: PlId[]; - sampleLabelColumnLabel: string; - sampleLabels: Record; - h5adFilesToPreprocess: ImportFileHandle[]; - seuratFilesToPreprocess: ImportFileHandle[]; -}>; From e85cc0300f46ffdfec72411be86df552673ed012 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Thu, 20 Aug 2026 14:08:56 +0200 Subject: [PATCH 11/11] chore: drop --unstable from the facade's prepublishOnly Publishing goes to the normal channel. The flag was carried while the batch was in flight; the structurer strips it on every refresh, so keeping it also meant `structure check` reporting this one field as drift forever. --- block/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/package.json b/block/package.json index 8979303..e949b11 100644 --- a/block/package.json +++ b/block/package.json @@ -19,7 +19,7 @@ "scripts": { "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"", "build": "ts-builder build --target block-facade && block-tools pack", - "prepublishOnly": "block-tools publish --unstable -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", + "prepublishOnly": "block-tools publish -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science", "mark-stable": "block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'", "do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz", "check": "ts-builder type-check --target block-facade"