From ed7b8210dc4a38a6acac81c3e963d0833230cb3c Mon Sep 17 00:00:00 2001 From: Alexandr Date: Mon, 10 Aug 2026 16:17:12 +0200 Subject: [PATCH 01/29] MILAB-6648: migrate the example blocks to BlockModelV3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanical, and a prerequisite rather than part of the feature: a kind is a mandatory component of a V3 block, so the workspace cannot hold V2 example blocks once the following commits land. The `-v3` suffixed duplicates that existed for migration testing are removed and their non-suffixed counterparts take their place, so every reference to `enter-numbers-v3` / `sum-numbers-v3` in tests moves with them. `ml-legacy.test.ts` and `v2.test.ts` covered the V2 path only and are dropped; the two cases from `ml-legacy.test.ts` still worth keeping are carried into `ml-v3.test.ts`. Each block's model also projects its params, which only compiles once the params contract lands — see the sdk/model commit later in this branch. --- .../blob-url-custom-protocol/.structure | 2 +- .../block/package.json | 1 + .../model/package.json | 1 + .../model/src/index.ts | 49 +- .../ui/src/MainPage.vue | 8 +- .../blob-url-custom-protocol/ui/src/app.ts | 10 +- etc/blocks/download-file/.structure | 2 +- etc/blocks/download-file/block/package.json | 1 + etc/blocks/download-file/model/package.json | 1 + etc/blocks/download-file/model/src/index.ts | 74 +- etc/blocks/download-file/ui/src/MainPage.vue | 14 +- etc/blocks/download-file/ui/src/app.ts | 10 +- etc/blocks/enter-numbers-v3/.structure | 1 - .../enter-numbers-v3/block/CHANGELOG.md | 1 - .../block/logos/block-logo.png | Bin 21527 -> 0 bytes .../block/logos/organization-logo.png | Bin 21527 -> 0 bytes .../enter-numbers-v3/block/package.json | 55 - .../enter-numbers-v3/block/src/AGENTS.ts | 5 - .../block/src/agents-extra.ts | 8 - .../enter-numbers-v3/block/src/block-extra.ts | 9 - .../enter-numbers-v3/block/src/index.ts | 55 - .../enter-numbers-v3/block/tsconfig.json | 4 - .../enter-numbers-v3/model/.oxfmtrc.json | 4 - .../enter-numbers-v3/model/.oxlintrc.json | 3 - .../enter-numbers-v3/model/CHANGELOG.md | 1 - .../enter-numbers-v3/model/package.json | 42 - .../enter-numbers-v3/model/src/index.ts | 99 - .../enter-numbers-v3/model/tsconfig.json | 4 - etc/blocks/enter-numbers-v3/ui/.oxfmtrc.json | 3 - etc/blocks/enter-numbers-v3/ui/.oxlintrc.json | 3 - etc/blocks/enter-numbers-v3/ui/CHANGELOG.md | 1 - etc/blocks/enter-numbers-v3/ui/index.html | 12 - etc/blocks/enter-numbers-v3/ui/package.json | 33 - .../enter-numbers-v3/ui/src/MainPage.vue | 85 - etc/blocks/enter-numbers-v3/ui/src/app.ts | 54 - etc/blocks/enter-numbers-v3/ui/src/main.ts | 5 - etc/blocks/enter-numbers-v3/ui/tsconfig.json | 4 - .../enter-numbers-v3/workflow/CHANGELOG.md | 1 - .../enter-numbers-v3/workflow/format.el | 42 - .../enter-numbers-v3/workflow/package.json | 21 - .../workflow/src/main.tpl.tengo | 9 - .../workflow/src/numbers.lib.tengo | 67 - .../workflow/src/prerun.tpl.tengo | 20 - .../enter-numbers-v3/workflow/tsconfig.json | 16 - .../workflow/vitest.config.mts | 9 - etc/blocks/enter-numbers/.structure | 2 +- etc/blocks/enter-numbers/block/CHANGELOG.md | 1736 ----------------- etc/blocks/enter-numbers/block/package.json | 8 +- etc/blocks/enter-numbers/model/CHANGELOG.md | 432 ---- etc/blocks/enter-numbers/model/package.json | 3 +- etc/blocks/enter-numbers/model/src/index.ts | 91 +- etc/blocks/enter-numbers/ui/CHANGELOG.md | 1656 ---------------- etc/blocks/enter-numbers/ui/package.json | 2 +- etc/blocks/enter-numbers/ui/src/MainPage.vue | 43 +- etc/blocks/enter-numbers/ui/src/app.ts | 17 +- .../enter-numbers/workflow/CHANGELOG.md | 123 -- .../enter-numbers/workflow/package.json | 2 +- .../workflow/src/numbers.lib.tengo | 6 +- .../workflow/src/prerun.tpl.tengo | 18 +- etc/blocks/filter-column-test/.structure | 2 +- .../filter-column-test/block/package.json | 1 + .../filter-column-test/model/package.json | 1 + .../filter-column-test/model/src/index.ts | 11 +- .../filter-column-test/test/package.json | 4 +- etc/blocks/model-test/.structure | 2 +- etc/blocks/model-test/block/package.json | 1 + etc/blocks/model-test/model/package.json | 1 + etc/blocks/model-test/model/src/index.ts | 26 +- etc/blocks/monetization-test/.structure | 2 +- .../monetization-test/block/package.json | 1 + .../monetization-test/model/package.json | 1 + .../monetization-test/model/src/index.ts | 89 +- etc/blocks/monetization-test/ui/src/app.ts | 6 +- .../ui/src/pages/MainPage.vue | 22 +- etc/blocks/pool-explorer/.structure | 2 +- etc/blocks/pool-explorer/block/package.json | 1 + etc/blocks/pool-explorer/model/package.json | 1 + etc/blocks/pool-explorer/model/src/index.ts | 24 +- etc/blocks/read-logs/.structure | 2 +- etc/blocks/read-logs/block/package.json | 1 + etc/blocks/read-logs/model/package.json | 1 + etc/blocks/read-logs/model/src/index.ts | 63 +- etc/blocks/read-logs/ui/src/MainPage.vue | 12 +- etc/blocks/read-logs/ui/src/app.ts | 10 +- etc/blocks/sum-numbers-v3/.structure | 1 - etc/blocks/sum-numbers-v3/block/CHANGELOG.md | 1 - .../sum-numbers-v3/block/logos/block-logo.png | Bin 21527 -> 0 bytes .../block/logos/organization-logo.png | Bin 21527 -> 0 bytes etc/blocks/sum-numbers-v3/block/package.json | 55 - etc/blocks/sum-numbers-v3/block/src/AGENTS.ts | 5 - .../sum-numbers-v3/block/src/agents-extra.ts | 8 - .../sum-numbers-v3/block/src/block-extra.ts | 9 - etc/blocks/sum-numbers-v3/block/src/index.ts | 55 - etc/blocks/sum-numbers-v3/block/tsconfig.json | 4 - etc/blocks/sum-numbers-v3/model/.oxfmtrc.json | 4 - .../sum-numbers-v3/model/.oxlintrc.json | 3 - etc/blocks/sum-numbers-v3/model/CHANGELOG.md | 1 - etc/blocks/sum-numbers-v3/model/package.json | 42 - etc/blocks/sum-numbers-v3/model/src/index.ts | 75 - etc/blocks/sum-numbers-v3/model/tsconfig.json | 4 - etc/blocks/sum-numbers-v3/ui/.oxfmtrc.json | 3 - etc/blocks/sum-numbers-v3/ui/.oxlintrc.json | 3 - etc/blocks/sum-numbers-v3/ui/CHANGELOG.md | 1 - etc/blocks/sum-numbers-v3/ui/index.html | 12 - etc/blocks/sum-numbers-v3/ui/package.json | 34 - etc/blocks/sum-numbers-v3/ui/src/MainPage.vue | 52 - etc/blocks/sum-numbers-v3/ui/src/app.ts | 39 - etc/blocks/sum-numbers-v3/ui/src/main.ts | 5 - etc/blocks/sum-numbers-v3/ui/tsconfig.json | 4 - .../sum-numbers-v3/workflow/CHANGELOG.md | 1 - etc/blocks/sum-numbers-v3/workflow/format.el | 42 - .../sum-numbers-v3/workflow/package.json | 21 - .../workflow/src/main.tpl.tengo | 89 - .../sum-numbers-v3/workflow/tsconfig.json | 16 - .../sum-numbers-v3/workflow/vitest.config.mts | 9 - etc/blocks/sum-numbers/.structure | 2 +- etc/blocks/sum-numbers/block/CHANGELOG.md | 874 --------- etc/blocks/sum-numbers/block/package.json | 7 +- etc/blocks/sum-numbers/model/CHANGELOG.md | 230 --- etc/blocks/sum-numbers/model/package.json | 3 +- etc/blocks/sum-numbers/model/src/index.ts | 42 +- etc/blocks/sum-numbers/ui/CHANGELOG.md | 810 -------- etc/blocks/sum-numbers/ui/package.json | 2 +- etc/blocks/sum-numbers/ui/src/MainPage.vue | 12 +- etc/blocks/sum-numbers/ui/src/app.ts | 10 +- etc/blocks/sum-numbers/workflow/CHANGELOG.md | 105 - etc/blocks/sum-numbers/workflow/package.json | 2 +- .../sum-numbers/workflow/src/main.tpl.tengo | 3 + .../workflow/src/prerun.tpl.tengo | 0 etc/blocks/table-test/.structure | 2 +- etc/blocks/table-test/block/package.json | 1 + etc/blocks/table-test/model/package.json | 1 + etc/blocks/table-test/model/src/index.ts | 11 +- etc/blocks/transfer-files/.structure | 2 +- etc/blocks/transfer-files/block/package.json | 1 + etc/blocks/transfer-files/model/package.json | 1 + etc/blocks/transfer-files/model/src/index.ts | 42 +- etc/blocks/transfer-files/ui/src/MainPage.vue | 10 +- etc/blocks/transfer-files/ui/src/app.ts | 10 +- etc/blocks/ui-examples/.structure | 2 +- etc/blocks/ui-examples/block/package.json | 1 + etc/blocks/ui-examples/model/package.json | 1 + etc/blocks/ui-examples/model/src/index.ts | 14 +- etc/blocks/upload-file/.structure | 2 +- etc/blocks/upload-file/block/package.json | 1 + etc/blocks/upload-file/model/package.json | 1 + etc/blocks/upload-file/model/src/index.ts | 37 +- etc/blocks/upload-file/ui/src/MainPage.vue | 10 +- etc/blocks/upload-file/ui/src/app.ts | 10 +- .../src/mutator/project-v3.test.ts | 22 +- .../package.json | 2 - .../src/migrations.test.ts | 22 +- .../src/ml-legacy.test.ts | 1540 --------------- .../src/ml-v3.test.ts | 175 +- .../src/template-cache-v3.test.ts | 2 +- .../src/v2.test.ts | 134 -- .../src/v3.test.ts | 8 +- tests/mcp-server/src/blocks.test.ts | 2 +- tests/mcp-server/src/pipeline.test.ts | 2 +- tests/mcp-server/src/state.test.ts | 2 +- tools/block-tools/src/v2/from_pack_v2.test.ts | 4 +- 161 files changed, 788 insertions(+), 9262 deletions(-) delete mode 100644 etc/blocks/enter-numbers-v3/.structure delete mode 100644 etc/blocks/enter-numbers-v3/block/CHANGELOG.md delete mode 100644 etc/blocks/enter-numbers-v3/block/logos/block-logo.png delete mode 100644 etc/blocks/enter-numbers-v3/block/logos/organization-logo.png delete mode 100644 etc/blocks/enter-numbers-v3/block/package.json delete mode 100644 etc/blocks/enter-numbers-v3/block/src/AGENTS.ts delete mode 100644 etc/blocks/enter-numbers-v3/block/src/agents-extra.ts delete mode 100644 etc/blocks/enter-numbers-v3/block/src/block-extra.ts delete mode 100644 etc/blocks/enter-numbers-v3/block/src/index.ts delete mode 100644 etc/blocks/enter-numbers-v3/block/tsconfig.json delete mode 100644 etc/blocks/enter-numbers-v3/model/.oxfmtrc.json delete mode 100644 etc/blocks/enter-numbers-v3/model/.oxlintrc.json delete mode 100644 etc/blocks/enter-numbers-v3/model/CHANGELOG.md delete mode 100644 etc/blocks/enter-numbers-v3/model/package.json delete mode 100644 etc/blocks/enter-numbers-v3/model/src/index.ts delete mode 100644 etc/blocks/enter-numbers-v3/model/tsconfig.json delete mode 100644 etc/blocks/enter-numbers-v3/ui/.oxfmtrc.json delete mode 100644 etc/blocks/enter-numbers-v3/ui/.oxlintrc.json delete mode 100644 etc/blocks/enter-numbers-v3/ui/CHANGELOG.md delete mode 100644 etc/blocks/enter-numbers-v3/ui/index.html delete mode 100644 etc/blocks/enter-numbers-v3/ui/package.json delete mode 100644 etc/blocks/enter-numbers-v3/ui/src/MainPage.vue delete mode 100644 etc/blocks/enter-numbers-v3/ui/src/app.ts delete mode 100644 etc/blocks/enter-numbers-v3/ui/src/main.ts delete mode 100644 etc/blocks/enter-numbers-v3/ui/tsconfig.json delete mode 100644 etc/blocks/enter-numbers-v3/workflow/CHANGELOG.md delete mode 100644 etc/blocks/enter-numbers-v3/workflow/format.el delete mode 100644 etc/blocks/enter-numbers-v3/workflow/package.json delete mode 100644 etc/blocks/enter-numbers-v3/workflow/src/main.tpl.tengo delete mode 100644 etc/blocks/enter-numbers-v3/workflow/src/numbers.lib.tengo delete mode 100644 etc/blocks/enter-numbers-v3/workflow/src/prerun.tpl.tengo delete mode 100644 etc/blocks/enter-numbers-v3/workflow/tsconfig.json delete mode 100644 etc/blocks/enter-numbers-v3/workflow/vitest.config.mts delete mode 100644 etc/blocks/sum-numbers-v3/.structure delete mode 100644 etc/blocks/sum-numbers-v3/block/CHANGELOG.md delete mode 100644 etc/blocks/sum-numbers-v3/block/logos/block-logo.png delete mode 100644 etc/blocks/sum-numbers-v3/block/logos/organization-logo.png delete mode 100644 etc/blocks/sum-numbers-v3/block/package.json delete mode 100644 etc/blocks/sum-numbers-v3/block/src/AGENTS.ts delete mode 100644 etc/blocks/sum-numbers-v3/block/src/agents-extra.ts delete mode 100644 etc/blocks/sum-numbers-v3/block/src/block-extra.ts delete mode 100644 etc/blocks/sum-numbers-v3/block/src/index.ts delete mode 100644 etc/blocks/sum-numbers-v3/block/tsconfig.json delete mode 100644 etc/blocks/sum-numbers-v3/model/.oxfmtrc.json delete mode 100644 etc/blocks/sum-numbers-v3/model/.oxlintrc.json delete mode 100644 etc/blocks/sum-numbers-v3/model/CHANGELOG.md delete mode 100644 etc/blocks/sum-numbers-v3/model/package.json delete mode 100644 etc/blocks/sum-numbers-v3/model/src/index.ts delete mode 100644 etc/blocks/sum-numbers-v3/model/tsconfig.json delete mode 100644 etc/blocks/sum-numbers-v3/ui/.oxfmtrc.json delete mode 100644 etc/blocks/sum-numbers-v3/ui/.oxlintrc.json delete mode 100644 etc/blocks/sum-numbers-v3/ui/CHANGELOG.md delete mode 100644 etc/blocks/sum-numbers-v3/ui/index.html delete mode 100644 etc/blocks/sum-numbers-v3/ui/package.json delete mode 100644 etc/blocks/sum-numbers-v3/ui/src/MainPage.vue delete mode 100644 etc/blocks/sum-numbers-v3/ui/src/app.ts delete mode 100644 etc/blocks/sum-numbers-v3/ui/src/main.ts delete mode 100644 etc/blocks/sum-numbers-v3/ui/tsconfig.json delete mode 100644 etc/blocks/sum-numbers-v3/workflow/CHANGELOG.md delete mode 100644 etc/blocks/sum-numbers-v3/workflow/format.el delete mode 100644 etc/blocks/sum-numbers-v3/workflow/package.json delete mode 100644 etc/blocks/sum-numbers-v3/workflow/src/main.tpl.tengo delete mode 100644 etc/blocks/sum-numbers-v3/workflow/tsconfig.json delete mode 100644 etc/blocks/sum-numbers-v3/workflow/vitest.config.mts rename etc/blocks/{sum-numbers-v3 => sum-numbers}/workflow/src/prerun.tpl.tengo (100%) delete mode 100644 tests/drivers-ml-blocks-integration/src/ml-legacy.test.ts delete mode 100644 tests/drivers-ml-blocks-integration/src/v2.test.ts diff --git a/etc/blocks/blob-url-custom-protocol/.structure b/etc/blocks/blob-url-custom-protocol/.structure index 491d734467..218abba169 100644 --- a/etc/blocks/blob-url-custom-protocol/.structure +++ b/etc/blocks/blob-url-custom-protocol/.structure @@ -1 +1 @@ -{"version":1} \ No newline at end of file +{"version":2} \ No newline at end of file diff --git a/etc/blocks/blob-url-custom-protocol/block/package.json b/etc/blocks/blob-url-custom-protocol/block/package.json index e9321db2f3..d235ea42e3 100644 --- a/etc/blocks/blob-url-custom-protocol/block/package.json +++ b/etc/blocks/blob-url-custom-protocol/block/package.json @@ -25,6 +25,7 @@ }, "dependencies": {}, "devDependencies": { + "@milaboratories/milaboratories.test-blob-url-custom-protocol.kind": "workspace:*", "@milaboratories/milaboratories.test-blob-url-custom-protocol.model": "workspace:*", "@milaboratories/milaboratories.test-blob-url-custom-protocol.ui": "workspace:*", "@milaboratories/milaboratories.test-blob-url-custom-protocol.workflow": "workspace:*", diff --git a/etc/blocks/blob-url-custom-protocol/model/package.json b/etc/blocks/blob-url-custom-protocol/model/package.json index 7c71fb507b..4e52ad12de 100644 --- a/etc/blocks/blob-url-custom-protocol/model/package.json +++ b/etc/blocks/blob-url-custom-protocol/model/package.json @@ -25,6 +25,7 @@ "watch": "ts-builder build --target block-model --watch" }, "dependencies": { + "@milaboratories/milaboratories.test-blob-url-custom-protocol.kind": "workspace:*", "@platforma-sdk/model": "workspace:*", "zod": "catalog:" }, diff --git a/etc/blocks/blob-url-custom-protocol/model/src/index.ts b/etc/blocks/blob-url-custom-protocol/model/src/index.ts index a7aa2c03b4..00767519b5 100644 --- a/etc/blocks/blob-url-custom-protocol/model/src/index.ts +++ b/etc/blocks/blob-url-custom-protocol/model/src/index.ts @@ -1,10 +1,6 @@ import type { ImportFileHandle, InferHrefType, InferOutputsType } from "@platforma-sdk/model"; -import { - BlockModel, - extractArchiveAndGetURL, - getResourceField, - MainOutputs, -} from "@platforma-sdk/model"; +import { BlockModelV3, DataModelBuilder } from "@platforma-sdk/model"; +import { kind } from "@milaboratories/milaboratories.test-blob-url-custom-protocol.kind"; import { z } from "zod"; export const ImportFileHandleSchema = z @@ -14,26 +10,51 @@ export const ImportFileHandleSchema = z ((_a) => true) as (arg: string | undefined) => arg is ImportFileHandle | undefined, ); -export const BlockArgs = z.object({ +export const BlockData = z.object({ inputTgzHandle: ImportFileHandleSchema, inputZipHandle: ImportFileHandleSchema, }); -export type BlockArgs = z.infer; +export type BlockData = z.infer; -export const platforma = BlockModel.create("Heavy") +/** What the workflow consumes — projected from {@link BlockData} by the args lambda. */ +export type BlockArgs = { + inputTgzHandle: ImportFileHandle | undefined; + inputZipHandle: ImportFileHandle | undefined; +}; - .withArgs({ - inputTgzHandle: undefined, - inputZipHandle: undefined, - }) +// This block takes no init params (its kind declares `Record`): +// both fields are desktop-signed `ImportFileHandle`s, which no template can +// pre-wire. So `init` ignores params and returns the unset defaults. +const dataModel = new DataModelBuilder({ kind }) + .from("v1") + .init(() => ({ inputTgzHandle: undefined, inputZipHandle: undefined })); + +export const platforma = BlockModelV3.create({ dataModel, kind }) + + .args((data) => ({ + inputTgzHandle: data.inputTgzHandle, + inputZipHandle: data.inputZipHandle, + })) + + // Nothing to project: the kind takes no params, because both handles are signed, + // session-local references from an OS file-dialog gesture and would not resolve in + // the project a template is applied into. + .templateParams(() => ({})) .output("handleTgz", (ctx) => ctx.outputs?.resolve("handleTgz")?.getImportProgress()) .output("handleZip", (ctx) => ctx.outputs?.resolve("handleZip")?.getImportProgress()) - .output("tgz_content", extractArchiveAndGetURL(getResourceField(MainOutputs, "siteTgz"), "tgz")) + // Both archive outputs use the accessor form. V1 drove `tgz_content` through + // the config-based `extractArchiveAndGetURL(getResourceField(MainOutputs, …))` + // helpers so the block covered both surfaces; those helpers return a + // `TypedConfig`, which only V1's `output()` accepts — `BlockModelV3.output()` + // takes render lambdas only. The config surface is therefore gone here, and + // the two outputs differ solely in the archive format they extract. + .output("tgz_content", (ctx) => ctx.outputs?.resolve("siteTgz")?.extractArchiveAndGetURL("tgz")) .output("zip_content", (ctx) => ctx.outputs?.resolve("siteZip")?.extractArchiveAndGetURL("zip")) + .sections((_ctx) => { return [{ type: "link", href: "/", label: "Main" }]; }) diff --git a/etc/blocks/blob-url-custom-protocol/ui/src/MainPage.vue b/etc/blocks/blob-url-custom-protocol/ui/src/MainPage.vue index 0111dd1961..ed90b15af1 100644 --- a/etc/blocks/blob-url-custom-protocol/ui/src/MainPage.vue +++ b/etc/blocks/blob-url-custom-protocol/ui/src/MainPage.vue @@ -7,8 +7,8 @@ const app = useApp();