diff --git a/.changeset/soft-hoops-search.md b/.changeset/soft-hoops-search.md new file mode 100644 index 0000000..b707630 --- /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.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 +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. diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 25ed978..d404be7 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: @@ -24,8 +24,10 @@ jobs: with: app-name: 'Block: Samples And Data' app-name-slug: 'block-samples-and-data' - node-version: '20.x' - build-script-name: 'build' + node-version: '22.x' + 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/.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/.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..e949b11 100644 --- a/block/package.json +++ b/block/package.json @@ -11,8 +11,8 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "sources": "./src/index.ts", "types": "./dist/index.d.ts", + "sources": "./src/index.ts", "default": "./dist/index.js" } }, @@ -20,13 +20,15 @@ "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", + "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" }, "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/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..722fc25 --- /dev/null +++ b/kind/package.json @@ -0,0 +1,38 @@ +{ + "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:", + "es-toolkit": "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..f1575f0 --- /dev/null +++ b/kind/src/index.ts @@ -0,0 +1,15 @@ +import { defineBlockKind } from "@platforma-sdk/block-kind"; +import { name, version } from "../package.json" with { type: "json" }; +import { parseInitializationParams } from "./params"; +import type { BlockParams } from "./types"; + +export * from "./types"; + +// 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/params.ts b/kind/src/params.ts new file mode 100644 index 0000000..c61812a --- /dev/null +++ b/kind/src/params.ts @@ -0,0 +1,169 @@ +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, + 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[] => 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 new file mode 100644 index 0000000..eb7047f --- /dev/null +++ b/kind/src/types.ts @@ -0,0 +1,258 @@ +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"; +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/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/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..22cc767 --- /dev/null +++ b/model/src/template_params.ts @@ -0,0 +1,115 @@ +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"; + +/** + * 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. + * + * 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); + } +} + +/** + * 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: {} }; +} 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..bc16ae8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,44 +10,44 @@ catalogs: specifier: ^2.29.7 version: 2.29.7 '@milaboratories/helpers': - specifier: 1.14.1 - version: 1.14.1 + specifier: 1.14.5 + version: 1.14.5 '@milaboratories/pl-model-common': - specifier: ^1.31.2 - version: 1.31.2 + specifier: 1.48.0 + version: 1.48.0 '@milaboratories/ts-builder': - specifier: 1.6.0 - version: 1.6.0 + specifier: 1.7.0 + version: 1.7.0 '@milaboratories/ts-configs': - specifier: 1.3.0 - version: 1.3.0 + 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.11.6 - version: 2.11.6 + specifier: 2.14.2 + version: 2.14.2 '@platforma-sdk/model': - specifier: 1.79.20 - version: 1.79.20 - '@platforma-sdk/package-builder': - specifier: 3.14.0 - version: 3.14.0 + specifier: 1.82.0 + version: 1.82.0 '@platforma-sdk/tengo-builder': - specifier: 4.0.11 - version: 4.0.11 + specifier: 4.0.23 + version: 4.0.23 '@platforma-sdk/test': - specifier: 1.79.23 - version: 1.79.23 + specifier: 1.82.3 + version: 1.82.3 '@platforma-sdk/ui-vue': - specifier: 1.79.20 - version: 1.79.20 + specifier: 1.82.1 + version: 1.82.1 '@platforma-sdk/workflow-tengo': - specifier: 6.6.5 - version: 6.6.5 + specifier: 6.8.2 + version: 6.8.2 '@vueuse/core': specifier: ^12.2.0 version: 12.8.2 @@ -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 @@ -98,10 +101,10 @@ importers: 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) + 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.11.6(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) shx: specifier: 'catalog:' version: 0.4.0 @@ -113,10 +116,13 @@ importers: 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) + 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: 'catalog:' - version: 1.3.0 + version: 1.4.0 + '@platforma-open/milaboratories.samples-and-data.kind': + specifier: workspace:* + version: link:../kind '@platforma-open/milaboratories.samples-and-data.model': specifier: workspace:* version: link:../model @@ -128,10 +134,10 @@ importers: version: link:../workflow '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.11.6(@types/node@24.5.2) + version: 2.14.2(@types/node@24.5.2) '@platforma-sdk/model': specifier: 'catalog:' - version: 1.79.20 + version: 1.82.0 shx: specifier: 'catalog:' version: 0.4.0 @@ -139,11 +145,42 @@ importers: specifier: 'catalog:' version: 5.6.3 + kind: + dependencies: + '@milaboratories/pl-model-common': + specifier: 'catalog:' + version: 1.48.0 + '@platforma-sdk/block-kind': + specifier: 'catalog:' + version: 1.1.0 + '@types/node': + specifier: '*' + version: 24.5.2 + es-toolkit: + specifier: 'catalog:' + version: 1.39.10 + typescript: + specifier: '*' + version: 5.9.3 + devDependencies: + '@milaboratories/ts-builder': + 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: 'catalog:' + version: 1.4.0 + '@platforma-sdk/block-tools': + specifier: 'catalog:' + version: 2.14.2(@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 + version: 1.82.0 '@types/node': specifier: '*' version: 24.5.2 @@ -156,22 +193,22 @@ importers: 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) + 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: 'catalog:' - version: 1.3.0 + version: 1.4.0 '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 2.11.6(@types/node@24.5.2) + version: 2.14.2(@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': + '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 3.14.0 + version: 2.14.2(@types/node@24.5.2) software/parse-seurat: devDependencies: @@ -181,9 +218,9 @@ importers: '@platforma-open/milaboratories.runenv-r-samples-and-data': specifier: 'catalog:' version: 1.0.1 - '@platforma-sdk/package-builder': + '@platforma-sdk/block-tools': specifier: 'catalog:' - version: 3.14.0 + version: 2.14.2(@types/node@24.5.2) test: dependencies: @@ -192,7 +229,7 @@ importers: version: link:../model '@platforma-sdk/model': specifier: 'catalog:' - version: 1.79.20 + version: 1.82.0 this-block: specifier: workspace:@platforma-open/milaboratories.samples-and-data@* version: link:../block @@ -202,13 +239,13 @@ importers: 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) + 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: 'catalog:' - version: 1.3.0 + version: 1.4.0 '@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.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) @@ -220,7 +257,7 @@ importers: version: link:../model '@platforma-sdk/ui-vue': specifier: 'catalog:' - version: 1.79.20(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) + version: 1.82.1(@bytecodealliance/preview2-shim@0.17.8)(typescript@5.8.2) typescript: specifier: '*' version: 5.8.2 @@ -230,19 +267,19 @@ importers: devDependencies: '@milaboratories/helpers': specifier: 'catalog:' - version: 1.14.1 + version: 1.14.5 '@milaboratories/pl-model-common': specifier: 'catalog:' - version: 1.31.2 + version: 1.48.0 '@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) + 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: 'catalog:' - version: 1.3.0 + version: 1.4.0 '@platforma-sdk/model': specifier: 'catalog:' - version: 1.79.20 + version: 1.82.0 '@types/node': specifier: '*' version: 24.5.2 @@ -281,14 +318,14 @@ importers: version: link:../software/parse-seurat '@platforma-sdk/workflow-tengo': specifier: 'catalog:' - version: 6.6.5 + version: 6.8.2 devDependencies: '@platforma-sdk/tengo-builder': specifier: 'catalog:' - version: 4.0.11 + version: 4.0.23 '@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.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 @@ -376,6 +413,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 +882,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 +1037,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 +1095,96 @@ 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.4': + resolution: {integrity: sha512-abbgAzME71ARvgnGQHte+dPMgt2JGBJN4YpGLVxiYr7GToHwypsEi3PY/dAqriQWRtpKR82EpIAMxXVq0d7XMw==} - '@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==} engines: {node: '>=22'} - '@milaboratories/pf-driver@1.7.14': - resolution: {integrity: sha512-JRuMmuhObyD27MtpCcimGklr2yMJ2PobcYJ2y5k+UuhQWXKllhEDlUAyv2Xw/I7Xxym8Nn2npcVdOaJvTP3bPA==} + '@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.4.16': - resolution: {integrity: sha512-x6SQVUU3fl+1fFavCSzc1DNMB08HKoo0PT5dpXJWAi6oEw77yueoe1StZJVY0Kgj1BpVhlmuuC87PJu8s4eFRw==} + '@milaboratories/pf-spec-driver@1.5.1': + resolution: {integrity: sha512-K7BuQCUXqpUOAwgJ1aIO8SSQbE8RSEVb8J5e6vIpI6PqV7Uc8LHFswTguOSgSuacpMgQmEP9jmIKyafJdJ7PDw==} + + '@milaboratories/pf-spec@1.0.1': + resolution: {integrity: sha512-UbLycglulwrFgil6n1By17YGOVHzZXeb+tAVUej6ZFOmpRtAMQYVLOXAX4FN2tc98eDTJ+YrYdZCa7qWi1gBxw==} + peerDependencies: + '@bytecodealliance/preview2-shim': ^0.20.1 - '@milaboratories/pframes-rs-node@1.1.52': - resolution: {integrity: sha512-Uu4KsQx0GiKvFASI+Cm0nMCMieUVo35mpz4j8mYUYImr7S+bVDDcHweCWrkLkSeImnOQnYHVo9RycViG6QwUQw==} + '@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.12.0': - resolution: {integrity: sha512-uca6tbW7hy7H/Sf010/9HNQMFKwf6bJ/JONyNgvQB+hGdJZb//vjw0xoBQDun0wSAkPm+9H2I+e0q6RUfcNZng==} + '@milaboratories/pl-client@3.14.7': + resolution: {integrity: sha512-HIjPfGAYRRD0hbq5YSTkWt5XgBiv+yYtw73EjWLxui8eUEeB2ffdgsvH7IhVx2oXjUOL4p7M4i8PBnmdJ3830w==} 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.16': + resolution: {integrity: sha512-nFAIY4rxAssVqicSzgSNVQB/ZOjHjh4uhvde8aWFqQcMZCQDhHSaVJezzxRdotS8JiY5kI4r/Y0cN+Ey1MDDog==} 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.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-error-like@1.12.9': - resolution: {integrity: sha512-9qlfawLFO4qG656ayvVSRholhhwlfXUvKKllXpHadqbnf2zO2oCd+5J76bPaFXDz/A3T+1eokCnCX74JsqCYSw==} + '@milaboratories/pl-errors@1.4.36': + resolution: {integrity: sha512-WzKECX8Te6uP2DT7z2yTN6RrkiAWowYeU1rmB1Uc6sQBBWC6OjiqjiyOjvFeqxi73oXODARhLaLnqJcpG1onNA==} - '@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.67.2': + resolution: {integrity: sha512-5SLP4UPMlAf8zLRWjZiWDioyFyBXnc0NxZvSUvL39Lc9h6tuk2MQ5ACUmXCSbBkFW1tV6dBGnc+50YdfTQ90gQ==} 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-common@1.31.2': - resolution: {integrity: sha512-dnK0zXzylN7MAO1Nyx8EJargaqa94iDDEDwZW7d1/lRl1p50cR9zGP8pUnIy1I8UcI4lzH34f81RRQy6AbTuTw==} + '@milaboratories/pl-model-backend@1.4.21': + resolution: {integrity: sha512-Z2z5J8bglslgXXoi1aySi1ho+/d+ylJiuEaRw9XTNuE5iBM3EQPe0rw095pXGOinTlMpmvUcCI2wkVCraUQ1dA==} '@milaboratories/pl-model-common@1.46.2': resolution: {integrity: sha512-VEeauisApYScvCS8lnK3zpFJ520xuTAodKJmjR8ulHcMrWMyWMfHEdGb7j5OMD0mM/OwTgmQrrJ5eB7Xd+xoOQ==} + '@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.30.9': - resolution: {integrity: sha512-fnrCjWPR0HeytWC3rnHkY3bpNk3UOuED+lwmauhYBKRaF46cV1df46clJSkGNZHS9g439SYwclW4no2X/ALaFQ==} + '@milaboratories/pl-model-middle-layer@1.32.0': + resolution: {integrity: sha512-X1iLGgOwzkw8mQ/GfTxfOTJakBJ26np85h5HqUziMbVkFL0SR7wpd7xpgUs6TKVkYNM8viAv3iA2k63Yc5SahQ==} - '@milaboratories/pl-tree@1.12.14': - resolution: {integrity: sha512-G6uUG+3b4rH0eEQP6B31unFJtxsutETJckvapqXd9u+Uo906mK4w5u6DnXcNWfhWhKx3/hp8v89CsYSDO3b7Qw==} + '@milaboratories/pl-tree@1.13.7': + resolution: {integrity: sha512-q4pURdiq7cwOV1TAkIa6fZo3s3mzglBSokLgBSmoBPtnj9bsna5nTrqQFqp9KCzPb9N9PbTRE75du+I5YDbc+g==} 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.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==} @@ -1158,25 +1197,19 @@ packages: os: [darwin, linux, win32] hasBin: true - '@milaboratories/ts-builder@1.6.0': - resolution: {integrity: sha512-OlQ38jsriFf7qS5AmNIch65qQAOZBRFaLT15N/JJqe9dIytKJNS8Ff9G4vowWtFiRzyeyWRArBtgVOeAmoYuKQ==} + '@milaboratories/ts-builder@1.7.0': + resolution: {integrity: sha512-VT8xf4jZg2Dyo6KR5s+z4WiHrVfAJ46d7N39k7JPNlOlig910/h/1LKgXSgWysWfAp+2pYKvq7flAu3JKLKarg==} hasBin: true - '@milaboratories/ts-configs@1.3.0': - resolution: {integrity: sha512-6rZaMOJotG+v6eXoupHgPqxArpNBNl0f7sd5K+kUo1PUhPTe632eLJtEeBbFtwDGNYqL9QUacd4pT5t6oDOf0A==} + '@milaboratories/ts-configs@1.4.0': + resolution: {integrity: sha512-VzU9D+RiggsG4VYteJSBN4o8IjYae9GbZ8MofikMJQLOI1Ir9/pVyPXXGnG/TAGvmcjbK/psAiZVGSvI5MBPGg==} - '@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@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==} @@ -1728,14 +1761,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.22': + resolution: {integrity: sha512-f9vT+iSfNelgAGjaNzn1GErhmxHbjG6HtskAMoaUEbrciCG8c8i8cSCJPLu0xKNBcjM1UW+T10uD89Ckq2vkxQ==} - '@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 +1788,36 @@ 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@1.1.0': + resolution: {integrity: sha512-4uh+40o6BGfQcPPhkYGCjng8EXR9qn+6i5Fuc3RJ5QGfPYfcwbxT35G2V7ALUxmsqjLZ5SGL+JcW6Lm2v0cZHA==} + + '@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': resolution: {integrity: sha512-p9lBxhFXM9WoRsrJO7dfkiXSK+1m63yIn1sKhBO71eMbhrLMyVYHEOeNf3w5OCdbRF5QsNhXzWuiTmFK3zHFsA==} hasBin: true - '@platforma-sdk/model@1.79.20': - resolution: {integrity: sha512-0ULETzwgo4E5rIddn/PoCAY5gSv9luDYAaSp66b8u3u1XTh43k7fgOpobu/rrfHJMiY9IGfzALDlo6jtvMLUyQ==} - - '@platforma-sdk/package-builder-lib@1.1.0': - resolution: {integrity: sha512-h/Hx4Fg+kGnX2sVPWJa48JHbSEofTnaOescTKBP1Py5wl3A68BjqKaI6yybLWSR5Ojp3tHNNlvFSAnoF2QYMMg==} + '@platforma-sdk/model@1.82.0': + resolution: {integrity: sha512-m2GQFYQUS+XivC+Bsan9UlTvOM7R4wraF0eWMwQiZt3yjCSw09z12Be0uydTKLGVvLPbsw7zjhibMop3eBTb1w==} - '@platforma-sdk/package-builder@3.14.0': - resolution: {integrity: sha512-7bRducsc9NLc1zo0GRfz3RHSTejxFfmFvr21EH8NBndGaCj5KvHt2+0jmQsSI1Sl7ZCaj+zQKWWukRlsi+b/uA==} - hasBin: true + '@platforma-sdk/package-builder-lib@1.3.0': + resolution: {integrity: sha512-CdBjmNo6E1fBxKYWaXa49L/L2WLURxs2f1TAqxLIZlHRE4DZ6E1TEj3jNNKESWp+/9rwtLkTAzmTzNPrDgz+2Q==} - '@platforma-sdk/tengo-builder@4.0.11': - resolution: {integrity: sha512-c0LuiR7vtclto853Q1O+j8g109ooIZKtEl5tqRHG6dN/kk6S+J7DZHCpAjFuZ9pt3x6jF95sNaJEtP8uFs1uXw==} + '@platforma-sdk/tengo-builder@4.0.23': + resolution: {integrity: sha512-Qkxpg3wuZQOc6KbEL3pifOCdqOH91TaL3jDluVIm5mz3qpx96KO+To8AT/0nLqmvaF7yv8AP22QiyyqduAhGiw==} engines: {node: '>=22'} hasBin: true - '@platforma-sdk/test@1.79.23': - resolution: {integrity: sha512-vb5K4Rtjy5ogom3fBYpOxvKL+Nb50iURUdd1vjzN3pcQGx47omBnDr9YvNvUsRC3INhZibLzy44dUKD2la/IMw==} + '@platforma-sdk/test@1.82.3': + resolution: {integrity: sha512-l621C70u97yw9MeSte4BV/BYjYYHiYt3IFwJZSLCfkGuDgXRXdYj8e5Leek17jmIe0YdVem/P/6DPtl1V4X74g==} - '@platforma-sdk/ui-vue@1.79.20': - resolution: {integrity: sha512-VwBG8MKV1M2KMR2PgW+o6uxJJRCFGihaRsnkzLL8HGKM/Vr9k3FY/V929B1XAhU5y9wb1g7fKNJvy9JNEq5GiQ==} + '@platforma-sdk/ui-vue@1.82.1': + resolution: {integrity: sha512-HCwLm+yN2cKbRL0caQ21+40mcodVGTmnruruNQAkcCkgHu4AaRmkEVRtel8AdHLpcqJS5ray341E1bqGErguSw==} - '@platforma-sdk/workflow-tengo@6.6.5': - resolution: {integrity: sha512-BIY0DongPruQ7e2EMYy2b0UtO5ziGcLvr2RWgJ8ki17VKNzW3esm/RBszGHMrTYmXM0Yw7mCSasor4vH560g7A==} + '@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==} @@ -1812,29 +1844,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 +2401,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 +4028,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 +4052,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 +4871,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 +4962,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 +5833,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 +5985,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 +6088,30 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@milaboratories/computable@2.9.5': + '@milaboratories/columns-collection-driver@0.2.4': + dependencies: + '@milaboratories/helpers': 1.14.5 + '@milaboratories/pl-model-common': 1.48.0 + + '@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@1.14.2': {} - '@milaboratories/pf-driver@1.7.14(@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': 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': 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': 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 transitivePeerDependencies: @@ -6047,28 +6119,33 @@ snapshots: - encoding - supports-color - '@milaboratories/pf-spec-driver@1.4.16(@bytecodealliance/preview2-shim@0.17.8)': + '@milaboratories/pf-spec-driver@1.5.1(@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': 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/pframes-rs-node@1.1.52': + '@milaboratories/pf-spec@1.0.1(@bytecodealliance/preview2-shim@0.17.8)': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.8 + '@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': 1.14.2 - '@milaboratories/pframes-rs-serv': 1.1.52 + '@milaboratories/pframes-rs-serv': 1.1.56 '@milaboratories/pl-model-common': 1.46.2 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 @@ -6077,22 +6154,15 @@ snapshots: commander: 14.0.3 selfsigned: 5.5.0 - '@milaboratories/pframes-rs-wasip2@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)': - 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 + '@milaboratories/pframes-rs-wasip2@1.1.56': {} - '@milaboratories/pl-client@3.12.0': + '@milaboratories/pl-client@3.14.7': 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': 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 '@protobuf-ts/runtime-rpc': 2.11.1 canonicalize: 2.1.0 @@ -6104,19 +6174,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.16': 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': 1.48.0 + '@milaboratories/ts-helpers': 1.8.6 decompress: 4.2.1 ssh2: 1.16.0 tar: 7.4.3 @@ -6125,16 +6195,16 @@ snapshots: yaml: 2.8.1 zod: 3.25.76 - '@milaboratories/pl-drivers@1.16.3': + '@milaboratories/pl-drivers@1.16.16': 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': 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 '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime-rpc': 2.11.1 @@ -6154,22 +6224,17 @@ snapshots: json-stringify-safe: 5.0.1 zod: 3.25.76 - '@milaboratories/pl-error-like@1.12.9': + '@milaboratories/pl-errors@1.4.36': 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.7 + '@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 +6242,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.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 + '@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.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.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.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.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': 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 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,24 +6282,25 @@ snapshots: - encoding - supports-color - '@milaboratories/pl-model-backend@1.4.9': + '@milaboratories/pl-model-backend@1.4.21': dependencies: - '@milaboratories/pl-client': 3.12.0 + '@milaboratories/pl-client': 3.14.7 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@1.31.2': + '@milaboratories/pl-model-common@1.46.2': dependencies: - '@milaboratories/helpers': 1.14.1 - '@milaboratories/pl-error-like': 1.12.9 + '@milaboratories/helpers': 1.14.2 + '@milaboratories/pl-error-like': 1.12.10 canonicalize: 2.1.0 zod: 3.25.76 - '@milaboratories/pl-model-common@1.46.2': + '@milaboratories/pl-model-common@1.48.0': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': 1.14.5 '@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': @@ -6245,27 +6311,27 @@ snapshots: utility-types: 3.11.0 zod: 3.25.76 - '@milaboratories/pl-model-middle-layer@1.30.9': + '@milaboratories/pl-model-middle-layer@1.32.0': dependencies: - '@milaboratories/helpers': 1.14.2 - '@milaboratories/pl-model-common': 1.46.2 + '@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.12.14': + '@milaboratories/pl-tree@1.13.7': 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.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.31': + '@milaboratories/ptabler-expression-js@1.2.38': dependencies: - '@platforma-open/milaboratories.software-ptabler.schema': 1.15.15 + '@platforma-open/milaboratories.software-ptabler.schema': 1.15.22 '@milaboratories/resolve-helper@1.1.3': {} @@ -6273,9 +6339,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@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': 1.3.0 + '@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 @@ -6314,9 +6380,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@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': 1.3.0 + '@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 @@ -6355,9 +6421,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@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': 1.3.0 + '@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 @@ -6396,9 +6462,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@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': 1.3.0 + '@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 @@ -6437,18 +6503,18 @@ snapshots: - vue - yaml - '@milaboratories/ts-configs@1.3.0': {} + '@milaboratories/ts-configs@1.4.0': {} - '@milaboratories/ts-helpers@1.8.3': + '@milaboratories/ts-helpers@1.8.6': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': 1.14.5 canonicalize: 2.1.0 denque: 2.1.0 - '@milaboratories/uikit@2.15.11(typescript@5.8.2)': + '@milaboratories/uikit@2.15.24(typescript@5.8.2)': dependencies: - '@milaboratories/helpers': 1.14.2 - '@platforma-sdk/model': 1.79.20 + '@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 @@ -6479,11 +6545,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 +6922,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.22': dependencies: - '@milaboratories/pl-model-common': 1.46.2 + '@milaboratories/pl-model-common': 1.48.0 - '@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 +6948,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@1.1.0': {} + + '@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 '@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.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.3 + '@milaboratories/ts-helpers': 1.8.6 '@platforma-sdk/blocks-deps-updater': 2.2.0 + '@platforma-sdk/package-builder-lib': 1.3.0 canonicalize: 2.1.0 commander: 15.0.0 lru-cache: 11.2.2 @@ -6909,20 +6979,21 @@ snapshots: dependencies: yaml: 2.8.1 - '@platforma-sdk/model@1.79.20': + '@platforma-sdk/model@1.82.0': dependencies: - '@milaboratories/helpers': 1.14.2 + '@milaboratories/helpers': 1.14.5 '@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': 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 + 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.3.0': dependencies: '@aws-sdk/client-s3': 3.859.0 '@aws-sdk/lib-storage': 3.859.0(@aws-sdk/client-s3@3.859.0) @@ -6935,30 +7006,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@platforma-sdk/package-builder@3.14.0': - 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': + '@platforma-sdk/tengo-builder@4.0.23': dependencies: - '@milaboratories/pl-model-backend': 1.4.9 + '@milaboratories/pl-model-backend': 1.4.21 '@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.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.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.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: @@ -6980,13 +7043,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.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.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.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.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 +7071,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@1.82.1(@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.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 @@ -7044,17 +7108,17 @@ snapshots: - typescript - universal-cookie - '@platforma-sdk/workflow-tengo@6.6.5': + '@platforma-sdk/workflow-tengo@6.8.2': 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 +7145,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 +7237,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 +7706,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 +9415,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 +9446,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 +10287,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..2899178 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - block + - kind - model - software/parse-h5ad - software/parse-seurat @@ -8,24 +9,26 @@ 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.14.2 + "@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.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 - "@milaboratories/helpers": 1.14.1 - "@milaboratories/pl-model-common": ^1.31.2 + "@platforma-sdk/test": 1.82.3 + "@milaboratories/helpers": 1.14.5 + "@milaboratories/pl-model-common": 1.48.0 "vue": 3.5.24 "zod": ~3.25.76 + "es-toolkit": 1.39.10 "radashi": ^12.7.0 "utility-types": ^3.11.0 @@ -43,5 +46,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.7.0 + "@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"]