@milaboratories/pl-middle-layer 1.46.28 → 1.46.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"middle_layer.cjs","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport { field, isNullResourceId, toGlobalResourceId } from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, withProjectAuthored } from \"../mutator/project\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":["randomUUID","createProject","field","toGlobalResourceId","withProjectAuthored","isNullResourceId","Project","HmacSha256Signer","ops","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","getQuickJS","RuntimeCapabilities","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"mappings":"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"}
1
+ {"version":3,"file":"middle_layer.cjs","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport { field, isNullResourceId, toGlobalResourceId } from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, withProjectAuthored } from \"../mutator/project\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTableV2\", true);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":["randomUUID","createProject","field","toGlobalResourceId","withProjectAuthored","isNullResourceId","Project","HmacSha256Signer","ops","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","getQuickJS","RuntimeCapabilities","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"middle_layer.d.ts","sourceRoot":"","sources":["../../src/middle_layer/middle_layer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middle_layer.d.ts","sourceRoot":"","sources":["../../src/middle_layer/middle_layer.ts"],"names":[],"mappings":"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"}
@@ -207,6 +207,7 @@ class MiddleLayer {
207
207
  // add runtime capabilities of model here
208
208
  runtimeCapabilities.addSupportedRequirement("requiresModelAPIVersion", 1);
209
209
  runtimeCapabilities.addSupportedRequirement("requiresModelAPIVersion", 2);
210
+ runtimeCapabilities.addSupportedRequirement("requiresCreatePTableV2", true);
210
211
  // runtime capabilities of the desktop are to be added by the desktop app / test framework
211
212
  const env = {
212
213
  pl,
@@ -1 +1 @@
1
- {"version":3,"file":"middle_layer.js","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport { field, isNullResourceId, toGlobalResourceId } from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, withProjectAuthored } from \"../mutator/project\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middle_layer.js","sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport { field, isNullResourceId, toGlobalResourceId } from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, withProjectAuthored } from \"../mutator/project\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTableV2\", true);\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n quickJs,\n projectHelper: new ProjectHelper(quickJs),\n dispose: async () => {\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -111,6 +111,12 @@ async function migrateV2ToV3(tx, rid) {
111
111
  const stateR = tx.createJsonGzValue(unifiedState);
112
112
  const stateF = plClient.field(rid, blockStorageFieldName);
113
113
  tx.createField(stateF, "Dynamic", stateR);
114
+ // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)
115
+ if (currentArgsRid) {
116
+ const prerunArgsR = tx.createJsonGzValue(args);
117
+ const prerunArgsF = plClient.field(rid, project_model.projectFieldName(block.id, "currentPrerunArgs"));
118
+ tx.createField(prerunArgsF, "Dynamic", prerunArgsR);
119
+ }
114
120
  }
115
121
  }
116
122
 
@@ -1 +1 @@
1
- {"version":3,"file":"migration.cjs","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n } else if (schemaVersion !== SchemaVersionV1) {\n // If we got here and it's not v1 (which was handled above), it's unknown\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n }\n}\n"],"names":["SchemaVersionKey","SchemaVersionCurrent","SchemaVersionV1","SchemaVersionV2","ProjectStructureKey","allBlocks","BlockFrontendStateKeyPrefixV1","cachedDeserialize","field","projectFieldName","isNullResourceId"],"mappings":"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"}
1
+ {"version":3,"file":"migration.cjs","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n } else if (schemaVersion !== SchemaVersionV1) {\n // If we got here and it's not v1 (which was handled above), it's unknown\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"names":["SchemaVersionKey","SchemaVersionCurrent","SchemaVersionV1","SchemaVersionV2","ProjectStructureKey","allBlocks","BlockFrontendStateKeyPrefixV1","cachedDeserialize","field","projectFieldName","isNullResourceId"],"mappings":"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"}
@@ -109,6 +109,12 @@ async function migrateV2ToV3(tx, rid) {
109
109
  const stateR = tx.createJsonGzValue(unifiedState);
110
110
  const stateF = field(rid, blockStorageFieldName);
111
111
  tx.createField(stateF, "Dynamic", stateR);
112
+ // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)
113
+ if (currentArgsRid) {
114
+ const prerunArgsR = tx.createJsonGzValue(args);
115
+ const prerunArgsF = field(rid, projectFieldName(block.id, "currentPrerunArgs"));
116
+ tx.createField(prerunArgsF, "Dynamic", prerunArgsR);
117
+ }
112
118
  }
113
119
  }
114
120
 
@@ -1 +1 @@
1
- {"version":3,"file":"migration.js","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n } else if (schemaVersion !== SchemaVersionV1) {\n // If we got here and it's not v1 (which was handled above), it's unknown\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n }\n}\n"],"names":[],"mappings":";;;;;;AAcA;;;;;AAKG;AACI,eAAe,sBAAsB,CAAC,EAAY,EAAE,GAAe,EAAA;IACxE,MAAM,EAAE,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAI;QACpD,IAAI,aAAa,GAAG,MAAM,EAAE,CAAC,aAAa,CAAS,GAAG,EAAE,gBAAgB,CAAC;QACzE,IAAI,aAAa,KAAK,oBAAoB;YAAE;;AAG5C,QAAA,IAAI,aAAa,KAAK,eAAe,EAAE;AACrC,YAAA,MAAM,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC;YAC5B,aAAa,GAAG,eAAe;QACjC;AAEA,QAAA,IAAI,aAAa,KAAK,eAAe,EAAE;AACrC,YAAA,MAAM,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC;QAC9B;AAAO,aAAA,IAAI,aAAa,KAAK,eAAe,EAAE;;AAE5C,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,aAAa,CAAA,CAAE,CAAC;QACrE;AAEA,QAAA,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AACzE,QAAA,MAAM,EAAE,CAAC,MAAM,EAAE;AACnB,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;;;AAQG;AACH,eAAe,aAAa,CAAC,EAAiB,EAAE,GAAe,EAAA;IAC7D,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC3C,QAAA,EAAE,CAAC,aAAa,CAAmB,GAAG,EAAE,mBAAmB,CAAC;AAC5D,QAAA,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;AACtB,KAAA,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;AACxC,QAAA,MAAM,KAAK,GAAG,6BAA6B,GAAG,KAAK,CAAC,EAAE;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACvE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;AAC7C,QAAA,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;IAC7B;AACF;AAEA;;;;;;;;;;;;;;;;AAgBG;AACH,eAAe,aAAa,CAAC,EAAiB,EAAE,GAAe,EAAA;IAC7D,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,QAAA,EAAE,CAAC,aAAa,CAAmB,GAAG,EAAE,mBAAmB,CAAC;AAC5D,QAAA,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;AAC9B,KAAA,CAAC;;AAGF,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB;AAC9C,IAAA,KAAK,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,EAAE;QACxC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QAC/B;IACF;IAEA,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;;QAExC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,SAAsC,CAAC;QAC3F,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC;QAEtE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC;;QAGzD,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,YAAA,UAAU,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/E,YAAA,cAAc,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AACxF,SAAA,CAAC;;AAGF,QAAA,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;AAC5E,QAAA,MAAM,IAAI,GAAG,eAAe,EAAE,IAAI,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;;AAGjF,QAAA,MAAM,YAAY,GAAG;YACnB,IAAI;YACJ,OAAO;SACR;QAED,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;;QAGxE,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC;QAChD,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3C;AACF;;;;"}
1
+ {"version":3,"file":"migration.js","sources":["../../src/mutator/migration.ts"],"sourcesContent":["import type { PlClient, PlTransaction, ResourceId } from \"@milaboratories/pl-client\";\nimport type { ProjectField, ProjectStructure } from \"../model/project_model\";\nimport {\n projectFieldName,\n ProjectStructureKey,\n SchemaVersionCurrent,\n SchemaVersionKey,\n SchemaVersionV2,\n} from \"../model/project_model\";\nimport { BlockFrontendStateKeyPrefixV1, SchemaVersionV1 } from \"../model/project_model_v1\";\nimport { field, isNullResourceId } from \"@milaboratories/pl-client\";\nimport { cachedDeserialize } from \"@milaboratories/ts-helpers\";\nimport { allBlocks } from \"../model/project_model_util\";\n\n/**\n * Migrates the project to the latest schema version.\n *\n * @param pl - The client to use.\n * @param rid - The resource id of the project.\n */\nexport async function applyProjectMigrations(pl: PlClient, rid: ResourceId) {\n await pl.withWriteTx(\"ProjectMigration\", async (tx) => {\n let schemaVersion = await tx.getKValueJson<string>(rid, SchemaVersionKey);\n if (schemaVersion === SchemaVersionCurrent) return;\n\n // Apply migrations in sequence\n if (schemaVersion === SchemaVersionV1) {\n await migrateV1ToV2(tx, rid);\n schemaVersion = SchemaVersionV2;\n }\n\n if (schemaVersion === SchemaVersionV2) {\n await migrateV2ToV3(tx, rid);\n } else if (schemaVersion !== SchemaVersionV1) {\n // If we got here and it's not v1 (which was handled above), it's unknown\n throw new Error(`Unknown project schema version: ${schemaVersion}`);\n }\n\n tx.setKValue(rid, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n await tx.commit();\n });\n}\n\n/**\n * Migrates the project from schema version 1 to 2.\n *\n * Summary of changes:\n * - uiState is now stored in a field instead of a KV\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV1ToV2(tx: PlTransaction, rid: ResourceId) {\n const [structure, allKV] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.listKeyValues(rid),\n ]);\n const kvMap = new Map<string, Uint8Array>(allKV.map((kv) => [kv.key, kv.value]));\n for (const block of allBlocks(structure)) {\n const kvKey = BlockFrontendStateKeyPrefixV1 + block.id;\n const uiState = kvMap.get(kvKey);\n const valueJson = uiState ? cachedDeserialize(uiState) : {};\n const uiStateR = tx.createJsonGzValue(valueJson);\n const uiStateF = field(rid, projectFieldName(block.id, \"blockStorage\"));\n tx.createField(uiStateF, \"Dynamic\", uiStateR);\n tx.deleteKValue(rid, kvKey);\n }\n}\n\n/**\n * Migrates the project from schema version 2 to 3.\n *\n * Summary of changes:\n * - Introduces unified 'blockStorage' field containing { args, uiState }\n * - Adds 'currentPrerunArgs' field for staging/prerun rendering\n * - For each block:\n * 1. Read existing 'blockStorage' field (contains uiState in v2)\n * 2. Read existing 'currentArgs' field (contains args)\n * 3. Create unified state = { args: currentArgs, uiState: oldState }\n * 4. Write to new {blockId}-blockStorage field (overwrites)\n * 5. Initialize {blockId}-currentPrerunArgs (same as prodArgs for v1/v2 blocks)\n * - Note: currentArgs and prodArgs fields remain for compatibility layer\n *\n * @param tx - The transaction to use.\n * @param rid - The resource id of the project.\n */\nasync function migrateV2ToV3(tx: PlTransaction, rid: ResourceId) {\n const [structure, fullResourceState] = await Promise.all([\n tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey),\n tx.getResourceData(rid, true),\n ]);\n\n // Build a map of field name -> resource id for quick lookup\n const fieldMap = new Map<string, ResourceId>();\n for (const f of fullResourceState.fields) {\n if (!isNullResourceId(f.value)) {\n fieldMap.set(f.name, f.value);\n }\n }\n\n for (const block of allBlocks(structure)) {\n // Read existing field values\n const uiStateFieldName = projectFieldName(block.id, \"uiState\" as ProjectField[\"fieldName\"]);\n const currentArgsFieldName = projectFieldName(block.id, \"currentArgs\");\n\n const uiStateRid = fieldMap.get(uiStateFieldName);\n const currentArgsRid = fieldMap.get(currentArgsFieldName);\n\n // Read field data in parallel where available\n const [uiStateData, currentArgsData] = await Promise.all([\n uiStateRid ? tx.getResourceData(uiStateRid, false) : Promise.resolve(undefined),\n currentArgsRid ? tx.getResourceData(currentArgsRid, false) : Promise.resolve(undefined),\n ]);\n\n // Extract values - in v2, 'blockStorage' contains raw uiState, not wrapped\n const uiState = uiStateData?.data ? cachedDeserialize(uiStateData.data) : {};\n const args = currentArgsData?.data ? cachedDeserialize(currentArgsData.data) : {};\n\n // Create unified state: { args, uiState }\n const unifiedState = {\n args,\n uiState,\n };\n\n const blockStorageFieldName = projectFieldName(block.id, \"blockStorage\");\n\n // Write new unified blockStorage field (overwrite existing)\n const stateR = tx.createJsonGzValue(unifiedState);\n const stateF = field(rid, blockStorageFieldName);\n tx.createField(stateF, \"Dynamic\", stateR);\n\n // Initialize currentPrerunArgs from currentArgs (for legacy blocks, prerunArgs = args)\n if (currentArgsRid) {\n const prerunArgsR = tx.createJsonGzValue(args);\n const prerunArgsF = field(rid, projectFieldName(block.id, \"currentPrerunArgs\"));\n tx.createField(prerunArgsF, \"Dynamic\", prerunArgsR);\n }\n }\n}\n"],"names":[],"mappings":";;;;;;AAcA;;;;;AAKG;AACI,eAAe,sBAAsB,CAAC,EAAY,EAAE,GAAe,EAAA;IACxE,MAAM,EAAE,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,KAAI;QACpD,IAAI,aAAa,GAAG,MAAM,EAAE,CAAC,aAAa,CAAS,GAAG,EAAE,gBAAgB,CAAC;QACzE,IAAI,aAAa,KAAK,oBAAoB;YAAE;;AAG5C,QAAA,IAAI,aAAa,KAAK,eAAe,EAAE;AACrC,YAAA,MAAM,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC;YAC5B,aAAa,GAAG,eAAe;QACjC;AAEA,QAAA,IAAI,aAAa,KAAK,eAAe,EAAE;AACrC,YAAA,MAAM,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC;QAC9B;AAAO,aAAA,IAAI,aAAa,KAAK,eAAe,EAAE;;AAE5C,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,aAAa,CAAA,CAAE,CAAC;QACrE;AAEA,QAAA,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AACzE,QAAA,MAAM,EAAE,CAAC,MAAM,EAAE;AACnB,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;;;AAQG;AACH,eAAe,aAAa,CAAC,EAAiB,EAAE,GAAe,EAAA;IAC7D,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC3C,QAAA,EAAE,CAAC,aAAa,CAAmB,GAAG,EAAE,mBAAmB,CAAC;AAC5D,QAAA,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;AACtB,KAAA,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;AACxC,QAAA,MAAM,KAAK,GAAG,6BAA6B,GAAG,KAAK,CAAC,EAAE;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACvE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;AAC7C,QAAA,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;IAC7B;AACF;AAEA;;;;;;;;;;;;;;;;AAgBG;AACH,eAAe,aAAa,CAAC,EAAiB,EAAE,GAAe,EAAA;IAC7D,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,QAAA,EAAE,CAAC,aAAa,CAAmB,GAAG,EAAE,mBAAmB,CAAC;AAC5D,QAAA,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;AAC9B,KAAA,CAAC;;AAGF,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB;AAC9C,IAAA,KAAK,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,EAAE;QACxC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QAC/B;IACF;IAEA,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;;QAExC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,SAAsC,CAAC;QAC3F,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC;QAEtE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC;;QAGzD,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,YAAA,UAAU,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/E,YAAA,cAAc,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AACxF,SAAA,CAAC;;AAGF,QAAA,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;AAC5E,QAAA,MAAM,IAAI,GAAG,eAAe,EAAE,IAAI,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;;AAGjF,QAAA,MAAM,YAAY,GAAG;YACnB,IAAI;YACJ,OAAO;SACR;QAED,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;;QAGxE,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC;QAChD,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;;QAGzC,IAAI,cAAc,EAAE;YAClB,MAAM,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC9C,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAC/E,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;QACrD;IACF;AACF;;;;"}
@@ -871,8 +871,25 @@ class ProjectMutator {
871
871
  console.warn(`[migrateBlockPack] Block ${blockId} migration warning: ${migrationResult.warn}`);
872
872
  }
873
873
  this.setBlockStorageRaw(blockId, migrationResult.newStorageJson);
874
+ // Re-derive currentArgs from migrated storage (new block code + migrated data)
875
+ const deriveArgsResult = this.projectHelper.deriveArgsFromStorage(newConfig, migrationResult.newStorageJson);
876
+ if (!deriveArgsResult.error) {
877
+ this.setBlockFieldObj(blockId, "currentArgs", this.createJsonFieldValue(deriveArgsResult.value));
878
+ }
879
+ // Derive prerunArgs from the migrated storage so staging can re-render
880
+ const prerunArgs = this.projectHelper.derivePrerunArgsFromStorage(newConfig, migrationResult.newStorageJson);
881
+ if (prerunArgs !== undefined) {
882
+ this.setBlockFieldObj(blockId, "currentPrerunArgs", this.createJsonFieldValue(prerunArgs));
883
+ }
884
+ }
885
+ }
886
+ else {
887
+ // Legacy blocks (modelAPIVersion 1): prerunArgs = currentArgs
888
+ if (info.fields.currentArgs !== undefined) {
889
+ this.setBlockFieldObj(blockId, "currentPrerunArgs", info.fields.currentArgs);
874
890
  }
875
891
  }
892
+ this.blocksWithChangedInputs.add(blockId);
876
893
  // resetting staging outputs for all downstream blocks
877
894
  this.getStagingGraph().traverse("downstream", [blockId], ({ id }) => this.resetStaging(id));
878
895
  }