@milaboratories/pl-middle-layer 1.71.7 → 1.71.9

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.
Files changed (35) hide show
  1. package/dist/js_render/index.cjs +28 -5
  2. package/dist/js_render/index.cjs.map +1 -1
  3. package/dist/js_render/index.js +28 -5
  4. package/dist/js_render/index.js.map +1 -1
  5. package/dist/middle_layer/active_cfg.cjs +1 -1
  6. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  7. package/dist/middle_layer/active_cfg.js +1 -1
  8. package/dist/middle_layer/active_cfg.js.map +1 -1
  9. package/dist/middle_layer/block.cjs +2 -2
  10. package/dist/middle_layer/block.cjs.map +1 -1
  11. package/dist/middle_layer/block.js +2 -2
  12. package/dist/middle_layer/block.js.map +1 -1
  13. package/dist/middle_layer/build_stamp.cjs +1 -1
  14. package/dist/middle_layer/build_stamp.js +1 -1
  15. package/dist/middle_layer/driver_kit.cjs +5 -5
  16. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  17. package/dist/middle_layer/driver_kit.d.ts +3 -3
  18. package/dist/middle_layer/driver_kit.d.ts.map +1 -1
  19. package/dist/middle_layer/driver_kit.js +5 -5
  20. package/dist/middle_layer/driver_kit.js.map +1 -1
  21. package/dist/middle_layer/project_overview.cjs +5 -5
  22. package/dist/middle_layer/project_overview.cjs.map +1 -1
  23. package/dist/middle_layer/project_overview.js +5 -5
  24. package/dist/middle_layer/project_overview.js.map +1 -1
  25. package/dist/middle_layer/render.cjs +2 -2
  26. package/dist/middle_layer/render.cjs.map +1 -1
  27. package/dist/middle_layer/render.js +2 -2
  28. package/dist/middle_layer/render.js.map +1 -1
  29. package/package.json +11 -11
  30. package/src/js_render/index.ts +35 -4
  31. package/src/middle_layer/active_cfg.ts +9 -1
  32. package/src/middle_layer/block.ts +3 -1
  33. package/src/middle_layer/driver_kit.ts +12 -12
  34. package/src/middle_layer/project_overview.ts +41 -11
  35. package/src/middle_layer/render.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"driver_kit.js","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { Recorder } from \"@milaboratories/pl-flight-recorder\";\nimport {\n openFlightSession,\n wrapDataDriver,\n wrapModelDriver,\n} from \"@milaboratories/pl-flight-recorder\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Diagnostics log for the model layer, present only when flight recording is\n * switched on. Render spans are written through it so that a join recorded by\n * the instrumented pFrame driver can be attributed to the block that built it.\n * */\n readonly flightRecorder?: Recorder;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const rawPFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n cachePath: ops.parquetCachePath,\n options: ops.pFrameDriverOps,\n cacheOps: ops.parquetCacheOps,\n });\n\n // Every join a block model builds and every row it reads back passes through\n // this one driver, so instrumenting it here covers the whole model layer\n // without touching the call sites. The session is undefined unless recording\n // is switched on, in which case the driver is used exactly as before.\n const flightSession = openFlightSession({ role: \"middle-layer\" });\n const pFrameDriver: InternalPFrameDriver = flightSession\n ? wrapDataDriver(\n wrapModelDriver(rawPFrameDriver, flightSession.recorder, flightSession.registry),\n flightSession.recorder,\n flightSession.registry,\n )\n : rawPFrameDriver;\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n flightRecorder: flightSession?.recorder,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n flightSession?.close(\"driver-kit-disposed\");\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA0EA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAG;EACH,GAAG,yBAAyB,OAAO;EACnC,GAAG;CACL;CAEA,MAAM,SAAS,IAAI,iBAAiB,IAAI,WAAW;CAEnD,MAAM,iBAAiB,qBAAqB,IAAI,QAAQ,IAAI,IAAI,gBAAgB;CAChF,MAAM,aAAa,iBAAiB,IAAI,IAAI,MAAM;CAClD,MAAM,mBAAmB,uBAAuB,IAAI,IAAI,MAAM;CAC9D,MAAM,uBAAuB,2BAA2B,IAAI,IAAI,MAAM;CAEtE,MAAM,aAAa,MAAM,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,aACN;CAEA,MAAM,kBAAkB,IAAI,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,0BACN;CAEA,MAAM,eAAe,IAAI,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,eACN;CACA,MAAM,mBAAmB,IAAI,iBAAiB,IAAI,QAAQ,YAAY,IAAI,kBAAkB;CAC5F,MAAM,YAAY,IAAI,WAAW,IAAI,QAAQ,kBAAkB,UAAU;CACzE,MAAM,WAAW,MAAM,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,4BACN;CAEA,MAAM,kBAAkB,MAAM,mBAAmB;EAC/C;EACA,QAAQ,IAAI;EACZ,WAAW,IAAI;EACf,WAAW,IAAI;EACf,SAAS,IAAI;EACb,UAAU,IAAI;CAChB,CAAC;CAMD,MAAM,gBAAgB,kBAAkB,EAAE,MAAM,eAAe,CAAC;CAiBhE,MAAM,YAAY;EAChB;EACiB;EACjB;EACA;EACA;EACA;EACA,cAvByC,gBACvC,eACE,gBAAgB,iBAAiB,cAAc,UAAU,cAAc,QAAQ,GAC/E,cAAc,UACd,cAAc,QAChB,IACA;EAkBF,gBAAgB,IAhBiB,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,yBAWiC;EACrC,gBAAgB,eAAe;CACjC;CAEA,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,WACxD,kBAAkB,MAAM,IAAI,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,CACjE;EACA,MAAM,QAAQ,IAAI,eAAe;EACjC,eAAe,MAAM,qBAAqB;CAC5C;CAEA,OAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;CACzB;AACF"}
1
+ {"version":3,"file":"driver_kit.js","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { Recorder } from \"@milaboratories/pl-crash-recorder\";\nimport {\n openRecordingSession,\n wrapDataDriver,\n wrapModelDriver,\n} from \"@milaboratories/pl-crash-recorder\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Diagnostics log for the model layer, present only when crash recording is\n * switched on. Render spans are written through it so that a join recorded by\n * the instrumented pFrame driver can be attributed to the block that built it.\n * */\n readonly crashRecorder?: Recorder;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const rawPFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n cachePath: ops.parquetCachePath,\n options: ops.pFrameDriverOps,\n cacheOps: ops.parquetCacheOps,\n });\n\n // Every join a block model builds and every row it reads back passes through\n // this one driver, so instrumenting it here covers the whole model layer\n // without touching the call sites. The session is undefined unless recording\n // is switched on, in which case the driver is used exactly as before.\n const recordingSession = openRecordingSession({ role: \"middle-layer\" });\n const pFrameDriver: InternalPFrameDriver = recordingSession\n ? wrapDataDriver(\n wrapModelDriver(rawPFrameDriver, recordingSession.recorder, recordingSession.registry),\n recordingSession.recorder,\n recordingSession.registry,\n )\n : rawPFrameDriver;\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n crashRecorder: recordingSession?.recorder,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n recordingSession?.close(\"driver-kit-disposed\");\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA0EA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAG;EACH,GAAG,yBAAyB,OAAO;EACnC,GAAG;CACL;CAEA,MAAM,SAAS,IAAI,iBAAiB,IAAI,WAAW;CAEnD,MAAM,iBAAiB,qBAAqB,IAAI,QAAQ,IAAI,IAAI,gBAAgB;CAChF,MAAM,aAAa,iBAAiB,IAAI,IAAI,MAAM;CAClD,MAAM,mBAAmB,uBAAuB,IAAI,IAAI,MAAM;CAC9D,MAAM,uBAAuB,2BAA2B,IAAI,IAAI,MAAM;CAEtE,MAAM,aAAa,MAAM,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,aACN;CAEA,MAAM,kBAAkB,IAAI,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,0BACN;CAEA,MAAM,eAAe,IAAI,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,eACN;CACA,MAAM,mBAAmB,IAAI,iBAAiB,IAAI,QAAQ,YAAY,IAAI,kBAAkB;CAC5F,MAAM,YAAY,IAAI,WAAW,IAAI,QAAQ,kBAAkB,UAAU;CACzE,MAAM,WAAW,MAAM,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,4BACN;CAEA,MAAM,kBAAkB,MAAM,mBAAmB;EAC/C;EACA,QAAQ,IAAI;EACZ,WAAW,IAAI;EACf,WAAW,IAAI;EACf,SAAS,IAAI;EACb,UAAU,IAAI;CAChB,CAAC;CAMD,MAAM,mBAAmB,qBAAqB,EAAE,MAAM,eAAe,CAAC;CAiBtE,MAAM,YAAY;EAChB;EACiB;EACjB;EACA;EACA;EACA;EACA,cAvByC,mBACvC,eACE,gBAAgB,iBAAiB,iBAAiB,UAAU,iBAAiB,QAAQ,GACrF,iBAAiB,UACjB,iBAAiB,QACnB,IACA;EAkBF,gBAAgB,IAhBiB,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,yBAWiC;EACrC,eAAe,kBAAkB;CACnC;CAEA,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,WACxD,kBAAkB,MAAM,IAAI,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,CACjE;EACA,MAAM,QAAQ,IAAI,eAAe;EACjC,kBAAkB,MAAM,qBAAqB;CAC/C;CAEA,OAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;CACzB;AACF"}
@@ -86,7 +86,7 @@ function projectOverview(prjEntry, navigationStates, env) {
86
86
  if (info.prod !== void 0) if (limbo.has(id)) calculationStatus = "Limbo";
87
87
  else calculationStatus = info.prod.finished ? "Done" : "Running";
88
88
  const bp = require_util$1.getBlockPackInfo(prj, id);
89
- const { sections, title, subtitle, tags, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime } = require_util.ifNotUndef(bp, ({ bpId, cfg }) => {
89
+ const { sections, title, subtitle, tags, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime } = require_util.ifNotUndef(bp, ({ bpId, cfg, info: blockPackInfo }) => {
90
90
  if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) return {
91
91
  isIncompatibleWithRuntime: true,
92
92
  featureFlags: cfg.featureFlags
@@ -101,19 +101,19 @@ function projectOverview(prjEntry, navigationStates, env) {
101
101
  };
102
102
  const codeWithInfo = codeWithInfoOrError.value;
103
103
  return {
104
- sections: require_render.computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId).wrap({ recover: (cause) => {
104
+ sections: require_render.computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
105
105
  env.logger.error(new Error("Error in block model sections", { cause }));
106
106
  return [];
107
107
  } }),
108
- title: require_util.ifNotUndef(cfg.title, (title) => require_render.computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId).wrap({ recover: (cause) => {
108
+ title: require_util.ifNotUndef(cfg.title, (title) => require_render.computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
109
109
  env.logger.error(new Error("Error in block model title", { cause }));
110
110
  return "Invalid title";
111
111
  } })),
112
- subtitle: require_util.ifNotUndef(cfg.subtitle, (subtitle) => require_render.computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId).wrap({ recover: (cause) => {
112
+ subtitle: require_util.ifNotUndef(cfg.subtitle, (subtitle) => require_render.computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
113
113
  env.logger.error(new Error("Error in block model subtitle", { cause }));
114
114
  return "Invalid subtitle";
115
115
  } })),
116
- tags: require_util.ifNotUndef(cfg.tags, (tags) => require_render.computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId).wrap({ recover: (cause) => {
116
+ tags: require_util.ifNotUndef(cfg.tags, (tags) => require_render.computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
117
117
  env.logger.error(new Error("Error in block model tags", { cause }));
118
118
  return [];
119
119
  } })),
@@ -1 +1 @@
1
- {"version":3,"file":"project_overview.cjs","names":["Computable","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","allBlocks","projectFieldName","productionGraph","getBlockPackInfo","ifNotUndef","constructBlockContext","constructBlockContextArgsOnly","computableFromCfgOrRF","BLOCK_STORAGE_FACADE_VERSION","ProjectStructureAuthorKey","getDebugFlags"],"sources":["../../src/middle_layer/project_overview.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectRenderingState, ProjectStructure } from \"../model/project_model\";\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from \"../model/project_model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { allBlocks, productionGraph } from \"../model/project_model_util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport { type BlockSection, BLOCK_STORAGE_FACADE_VERSION } from \"@platforma-sdk/model\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport type { NavigationStates } from \"./navigation_states\";\nimport { getBlockPackInfo } from \"./util\";\nimport { resourceIdToString, type SignedResourceId } from \"@milaboratories/pl-client\";\nimport { omitBy, isEqual } from \"es-toolkit\";\nimport { getDebugFlags } from \"../debug\";\n\ntype BlockInfo = {\n argsRid?: SignedResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const cleanA = omitBy(a, (_, key) => key.startsWith(\"__\"));\n const cleanB = omitBy(b, (_, key) => key.startsWith(\"__\"));\n return isEqual(cleanA, cleanB);\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, \"currentArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const currentArguments = cInputs?.getDataAsJson<Record<string, unknown>>();\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, \"prodArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, \"prodOutput\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, \"prodUiCtx\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs?.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: bInfo.argsRid\n ? env.projectHelper.getEnrichmentTargets(\n () => bpInfo.cfg,\n () => args,\n { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId },\n )\n : undefined,\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = \"NotCalculated\";\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = \"Limbo\";\n else calculationStatus = info.prod.finished ? \"Done\" : \"Running\";\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const {\n sections,\n title,\n subtitle,\n tags,\n inputsValid,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n } =\n ifNotUndef(bp, ({ bpId, cfg }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtx = constructBlockContext(prjEntry, id);\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(cfg));\n if (codeWithInfoOrError.error) {\n return {\n title: codeWithInfoOrError.error.message,\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const codeWithInfo = codeWithInfoOrError.value;\n return {\n sections: computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId).wrap(\n {\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model sections\", { cause }));\n return [];\n },\n },\n ) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model title\", { cause }));\n return \"Invalid title\";\n },\n }) as ComputableStableDefined<string>,\n ),\n subtitle: ifNotUndef(\n cfg.subtitle,\n (subtitle) =>\n computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model subtitle\", { cause }));\n return \"Invalid subtitle\";\n },\n }) as ComputableStableDefined<string>,\n ),\n tags: ifNotUndef(\n cfg.tags,\n (tags) =>\n computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model tags\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<string[]>,\n ),\n // inputsValid: for modelAPIVersion 2, it's true if currentArgs exists (args derivation succeeded)\n // For older blocks, use the inputsValid callback from config\n inputsValid:\n cfg.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION\n ? info.currentArguments !== undefined\n : cfg.inputsValid\n ? (computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (cause) => {\n env.logger.error(\n new Error(\"Error in block model inputsValid\", { cause }),\n );\n return false;\n },\n }) as ComputableStableDefined<boolean>)\n : undefined,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, \"blockSettings\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n // Get block storage debug view by calling VM function (only for Model API v2 blocks)\n const storageDebugView = ifNotUndef(bp, ({ cfg }) => {\n if (cfg.modelAPIVersion !== BLOCK_STORAGE_FACADE_VERSION) {\n return undefined;\n }\n const storageNode = prj.traverse({\n field: projectFieldName(id, \"blockStorage\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const rawStorageJson = storageNode?.getDataAsString();\n return env.projectHelper.getStorageDebugViewInVM(cfg, rawStorageJson);\n });\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n subtitle,\n tags,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === \"Limbo\",\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots(\"upstream\", id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots(\"downstream\", id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n storageDebugView,\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb[\"updates\"];\n return bb;\n }),\n };\n },\n onRecalculation: getDebugFlags().logProjectOverviewStat\n ? (stats) => {\n console.log(`[projectOverview] ${JSON.stringify(stats)}`);\n }\n : undefined,\n },\n ).withStableType();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"project_overview.cjs","names":["Computable","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","allBlocks","projectFieldName","productionGraph","getBlockPackInfo","ifNotUndef","constructBlockContext","constructBlockContextArgsOnly","computableFromCfgOrRF","BLOCK_STORAGE_FACADE_VERSION","ProjectStructureAuthorKey","getDebugFlags"],"sources":["../../src/middle_layer/project_overview.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectRenderingState, ProjectStructure } from \"../model/project_model\";\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from \"../model/project_model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { allBlocks, productionGraph } from \"../model/project_model_util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport { type BlockSection, BLOCK_STORAGE_FACADE_VERSION } from \"@platforma-sdk/model\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport type { NavigationStates } from \"./navigation_states\";\nimport { getBlockPackInfo } from \"./util\";\nimport { resourceIdToString, type SignedResourceId } from \"@milaboratories/pl-client\";\nimport { omitBy, isEqual } from \"es-toolkit\";\nimport { getDebugFlags } from \"../debug\";\n\ntype BlockInfo = {\n argsRid?: SignedResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const cleanA = omitBy(a, (_, key) => key.startsWith(\"__\"));\n const cleanB = omitBy(b, (_, key) => key.startsWith(\"__\"));\n return isEqual(cleanA, cleanB);\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, \"currentArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const currentArguments = cInputs?.getDataAsJson<Record<string, unknown>>();\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, \"prodArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, \"prodOutput\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, \"prodUiCtx\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs?.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: bInfo.argsRid\n ? env.projectHelper.getEnrichmentTargets(\n () => bpInfo.cfg,\n () => args,\n { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId },\n )\n : undefined,\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = \"NotCalculated\";\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = \"Limbo\";\n else calculationStatus = info.prod.finished ? \"Done\" : \"Running\";\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const {\n sections,\n title,\n subtitle,\n tags,\n inputsValid,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n } =\n ifNotUndef(bp, ({ bpId, cfg, info: blockPackInfo }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtx = constructBlockContext(prjEntry, id);\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(cfg));\n if (codeWithInfoOrError.error) {\n return {\n title: codeWithInfoOrError.error.message,\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const codeWithInfo = codeWithInfoOrError.value;\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtx,\n cfg.sections,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model sections\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model title\", { cause }));\n return \"Invalid title\";\n },\n }) as ComputableStableDefined<string>,\n ),\n subtitle: ifNotUndef(\n cfg.subtitle,\n (subtitle) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n subtitle,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model subtitle\", { cause }));\n return \"Invalid subtitle\";\n },\n }) as ComputableStableDefined<string>,\n ),\n tags: ifNotUndef(\n cfg.tags,\n (tags) =>\n computableFromCfgOrRF(\n env,\n blockCtx,\n tags,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model tags\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<string[]>,\n ),\n // inputsValid: for modelAPIVersion 2, it's true if currentArgs exists (args derivation succeeded)\n // For older blocks, use the inputsValid callback from config\n inputsValid:\n cfg.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION\n ? info.currentArguments !== undefined\n : cfg.inputsValid\n ? (computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (cause) => {\n env.logger.error(\n new Error(\"Error in block model inputsValid\", { cause }),\n );\n return false;\n },\n }) as ComputableStableDefined<boolean>)\n : undefined,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, \"blockSettings\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n // Get block storage debug view by calling VM function (only for Model API v2 blocks)\n const storageDebugView = ifNotUndef(bp, ({ cfg }) => {\n if (cfg.modelAPIVersion !== BLOCK_STORAGE_FACADE_VERSION) {\n return undefined;\n }\n const storageNode = prj.traverse({\n field: projectFieldName(id, \"blockStorage\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const rawStorageJson = storageNode?.getDataAsString();\n return env.projectHelper.getStorageDebugViewInVM(cfg, rawStorageJson);\n });\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n subtitle,\n tags,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === \"Limbo\",\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots(\"upstream\", id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots(\"downstream\", id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n storageDebugView,\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb[\"updates\"];\n return bb;\n }),\n };\n },\n onRecalculation: getDebugFlags().logProjectOverviewStat\n ? (stats) => {\n console.log(`[projectOverview] ${JSON.stringify(stats)}`);\n }\n : undefined,\n },\n ).withStableType();\n}\n"],"mappings":"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"}
@@ -86,7 +86,7 @@ function projectOverview(prjEntry, navigationStates, env) {
86
86
  if (info.prod !== void 0) if (limbo.has(id)) calculationStatus = "Limbo";
87
87
  else calculationStatus = info.prod.finished ? "Done" : "Running";
88
88
  const bp = getBlockPackInfo(prj, id);
89
- const { sections, title, subtitle, tags, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime } = ifNotUndef(bp, ({ bpId, cfg }) => {
89
+ const { sections, title, subtitle, tags, inputsValid, sdkVersion, featureFlags, isIncompatibleWithRuntime } = ifNotUndef(bp, ({ bpId, cfg, info: blockPackInfo }) => {
90
90
  if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) return {
91
91
  isIncompatibleWithRuntime: true,
92
92
  featureFlags: cfg.featureFlags
@@ -101,19 +101,19 @@ function projectOverview(prjEntry, navigationStates, env) {
101
101
  };
102
102
  const codeWithInfo = codeWithInfoOrError.value;
103
103
  return {
104
- sections: computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId).wrap({ recover: (cause) => {
104
+ sections: computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
105
105
  env.logger.error(new Error("Error in block model sections", { cause }));
106
106
  return [];
107
107
  } }),
108
- title: ifNotUndef(cfg.title, (title) => computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId).wrap({ recover: (cause) => {
108
+ title: ifNotUndef(cfg.title, (title) => computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
109
109
  env.logger.error(new Error("Error in block model title", { cause }));
110
110
  return "Invalid title";
111
111
  } })),
112
- subtitle: ifNotUndef(cfg.subtitle, (subtitle) => computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId).wrap({ recover: (cause) => {
112
+ subtitle: ifNotUndef(cfg.subtitle, (subtitle) => computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
113
113
  env.logger.error(new Error("Error in block model subtitle", { cause }));
114
114
  return "Invalid subtitle";
115
115
  } })),
116
- tags: ifNotUndef(cfg.tags, (tags) => computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId).wrap({ recover: (cause) => {
116
+ tags: ifNotUndef(cfg.tags, (tags) => computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId, {}, blockPackInfo.source).wrap({ recover: (cause) => {
117
117
  env.logger.error(new Error("Error in block model tags", { cause }));
118
118
  return [];
119
119
  } })),
@@ -1 +1 @@
1
- {"version":3,"file":"project_overview.js","names":[],"sources":["../../src/middle_layer/project_overview.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectRenderingState, ProjectStructure } from \"../model/project_model\";\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from \"../model/project_model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { allBlocks, productionGraph } from \"../model/project_model_util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport { type BlockSection, BLOCK_STORAGE_FACADE_VERSION } from \"@platforma-sdk/model\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport type { NavigationStates } from \"./navigation_states\";\nimport { getBlockPackInfo } from \"./util\";\nimport { resourceIdToString, type SignedResourceId } from \"@milaboratories/pl-client\";\nimport { omitBy, isEqual } from \"es-toolkit\";\nimport { getDebugFlags } from \"../debug\";\n\ntype BlockInfo = {\n argsRid?: SignedResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const cleanA = omitBy(a, (_, key) => key.startsWith(\"__\"));\n const cleanB = omitBy(b, (_, key) => key.startsWith(\"__\"));\n return isEqual(cleanA, cleanB);\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, \"currentArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const currentArguments = cInputs?.getDataAsJson<Record<string, unknown>>();\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, \"prodArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, \"prodOutput\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, \"prodUiCtx\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs?.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: bInfo.argsRid\n ? env.projectHelper.getEnrichmentTargets(\n () => bpInfo.cfg,\n () => args,\n { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId },\n )\n : undefined,\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = \"NotCalculated\";\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = \"Limbo\";\n else calculationStatus = info.prod.finished ? \"Done\" : \"Running\";\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const {\n sections,\n title,\n subtitle,\n tags,\n inputsValid,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n } =\n ifNotUndef(bp, ({ bpId, cfg }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtx = constructBlockContext(prjEntry, id);\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(cfg));\n if (codeWithInfoOrError.error) {\n return {\n title: codeWithInfoOrError.error.message,\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const codeWithInfo = codeWithInfoOrError.value;\n return {\n sections: computableFromCfgOrRF(env, blockCtx, cfg.sections, codeWithInfo, bpId).wrap(\n {\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model sections\", { cause }));\n return [];\n },\n },\n ) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(env, blockCtxArgsOnly, title, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model title\", { cause }));\n return \"Invalid title\";\n },\n }) as ComputableStableDefined<string>,\n ),\n subtitle: ifNotUndef(\n cfg.subtitle,\n (subtitle) =>\n computableFromCfgOrRF(env, blockCtxArgsOnly, subtitle, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model subtitle\", { cause }));\n return \"Invalid subtitle\";\n },\n }) as ComputableStableDefined<string>,\n ),\n tags: ifNotUndef(\n cfg.tags,\n (tags) =>\n computableFromCfgOrRF(env, blockCtx, tags, codeWithInfo, bpId).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model tags\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<string[]>,\n ),\n // inputsValid: for modelAPIVersion 2, it's true if currentArgs exists (args derivation succeeded)\n // For older blocks, use the inputsValid callback from config\n inputsValid:\n cfg.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION\n ? info.currentArguments !== undefined\n : cfg.inputsValid\n ? (computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (cause) => {\n env.logger.error(\n new Error(\"Error in block model inputsValid\", { cause }),\n );\n return false;\n },\n }) as ComputableStableDefined<boolean>)\n : undefined,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, \"blockSettings\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n // Get block storage debug view by calling VM function (only for Model API v2 blocks)\n const storageDebugView = ifNotUndef(bp, ({ cfg }) => {\n if (cfg.modelAPIVersion !== BLOCK_STORAGE_FACADE_VERSION) {\n return undefined;\n }\n const storageNode = prj.traverse({\n field: projectFieldName(id, \"blockStorage\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const rawStorageJson = storageNode?.getDataAsString();\n return env.projectHelper.getStorageDebugViewInVM(cfg, rawStorageJson);\n });\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n subtitle,\n tags,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === \"Limbo\",\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots(\"upstream\", id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots(\"downstream\", id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n storageDebugView,\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb[\"updates\"];\n return bb;\n }),\n };\n },\n onRecalculation: getDebugFlags().logProjectOverviewStat\n ? (stats) => {\n console.log(`[projectOverview] ${JSON.stringify(stats)}`);\n }\n : undefined,\n },\n ).withStableType();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"project_overview.js","names":[],"sources":["../../src/middle_layer/project_overview.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectRenderingState, ProjectStructure } from \"../model/project_model\";\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectStructureAuthorKey,\n ProjectStructureKey,\n} from \"../model/project_model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { allBlocks, productionGraph } from \"../model/project_model_util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n ProjectMeta,\n ProjectOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport { type BlockSection, BLOCK_STORAGE_FACADE_VERSION } from \"@platforma-sdk/model\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport type { NavigationStates } from \"./navigation_states\";\nimport { getBlockPackInfo } from \"./util\";\nimport { resourceIdToString, type SignedResourceId } from \"@milaboratories/pl-client\";\nimport { omitBy, isEqual } from \"es-toolkit\";\nimport { getDebugFlags } from \"../debug\";\n\ntype BlockInfo = {\n argsRid?: SignedResourceId;\n currentArguments: unknown;\n prod?: ProdState;\n};\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: Record<string, unknown>;\n};\n\nfunction argsEquals(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n const cleanA = omitBy(a, (_, key) => key.startsWith(\"__\"));\n const cleanB = omitBy(b, (_, key) => key.startsWith(\"__\"));\n return isEqual(cleanA, cleanB);\n}\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey),\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, \"currentArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const currentArguments = cInputs?.getDataAsJson<Record<string, unknown>>();\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, \"prodArgs\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n if (rInputs !== undefined) {\n const prodArgs = rInputs.getDataAsJson() as Record<string, unknown>;\n const result = prj.getField({\n field: projectFieldName(id, \"prodOutput\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n const ctx = prj.getField({\n field: projectFieldName(id, \"prodUiCtx\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotFound: true,\n });\n prod = {\n arguments: prodArgs,\n stale: !argsEquals(currentArguments, prodArgs),\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError())),\n };\n }\n\n infos.set(id, { currentArguments, prod, argsRid: cInputs?.resourceInfo.id });\n }\n\n const currentGraph = productionGraph(structure, (id) => {\n const bpInfo = getBlockPackInfo(prj, id)!;\n const bInfo = infos.get(id)!;\n const args = bInfo.currentArguments;\n return {\n args,\n enrichmentTargets: bInfo.argsRid\n ? env.projectHelper.getEnrichmentTargets(\n () => bpInfo.cfg,\n () => args,\n { argsRid: bInfo.argsRid, blockPackRid: bpInfo.bpResourceId },\n )\n : undefined,\n };\n });\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = \"NotCalculated\";\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = \"Limbo\";\n else calculationStatus = info.prod.finished ? \"Done\" : \"Running\";\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const {\n sections,\n title,\n subtitle,\n tags,\n inputsValid,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n } =\n ifNotUndef(bp, ({ bpId, cfg, info: blockPackInfo }) => {\n if (!env.runtimeCapabilities.checkCompatibility(cfg.featureFlags)) {\n return {\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const blockCtx = constructBlockContext(prjEntry, id);\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(cfg));\n if (codeWithInfoOrError.error) {\n return {\n title: codeWithInfoOrError.error.message,\n isIncompatibleWithRuntime: true,\n featureFlags: cfg.featureFlags,\n };\n }\n const codeWithInfo = codeWithInfoOrError.value;\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtx,\n cfg.sections,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model sections\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model title\", { cause }));\n return \"Invalid title\";\n },\n }) as ComputableStableDefined<string>,\n ),\n subtitle: ifNotUndef(\n cfg.subtitle,\n (subtitle) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n subtitle,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model subtitle\", { cause }));\n return \"Invalid subtitle\";\n },\n }) as ComputableStableDefined<string>,\n ),\n tags: ifNotUndef(\n cfg.tags,\n (tags) =>\n computableFromCfgOrRF(\n env,\n blockCtx,\n tags,\n codeWithInfo,\n bpId,\n {},\n blockPackInfo.source,\n ).wrap({\n recover: (cause) => {\n env.logger.error(new Error(\"Error in block model tags\", { cause }));\n return [];\n },\n }) as ComputableStableDefined<string[]>,\n ),\n // inputsValid: for modelAPIVersion 2, it's true if currentArgs exists (args derivation succeeded)\n // For older blocks, use the inputsValid callback from config\n inputsValid:\n cfg.modelAPIVersion === BLOCK_STORAGE_FACADE_VERSION\n ? info.currentArguments !== undefined\n : cfg.inputsValid\n ? (computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n codeWithInfo,\n bpId,\n ).wrap({\n recover: (cause) => {\n env.logger.error(\n new Error(\"Error in block model inputsValid\", { cause }),\n );\n return false;\n },\n }) as ComputableStableDefined<boolean>)\n : undefined,\n sdkVersion: codeWithInfo?.sdkVersion,\n featureFlags: codeWithInfo?.featureFlags ?? {},\n isIncompatibleWithRuntime: false,\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, \"blockSettings\"),\n assertFieldType: \"Dynamic\",\n errorIfFieldNotSet: true,\n })\n .getDataAsJson() as BlockSettings;\n\n // Get block storage debug view by calling VM function (only for Model API v2 blocks)\n const storageDebugView = ifNotUndef(bp, ({ cfg }) => {\n if (cfg.modelAPIVersion !== BLOCK_STORAGE_FACADE_VERSION) {\n return undefined;\n }\n const storageNode = prj.traverse({\n field: projectFieldName(id, \"blockStorage\"),\n assertFieldType: \"Dynamic\",\n stableIfNotFound: true,\n });\n const rawStorageJson = storageNode?.getDataAsString();\n return env.projectHelper.getStorageDebugViewInVM(cfg, rawStorageJson);\n });\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings }),\n );\n\n return {\n projectResourceId: resourceIdToString(prjEntry.rid),\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n subtitle,\n tags,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === \"Limbo\",\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots(\"upstream\", id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots(\"downstream\", id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n featureFlags,\n isIncompatibleWithRuntime,\n navigationState: navigationStates.getState(id),\n storageDebugView,\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks,\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion,\n };\n delete bb[\"updates\"];\n return bb;\n }),\n };\n },\n onRecalculation: getDebugFlags().logProjectOverviewStat\n ? (stats) => {\n console.log(`[projectOverview] ${JSON.stringify(stats)}`);\n }\n : undefined,\n },\n ).withStableType();\n}\n"],"mappings":"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"}
@@ -7,10 +7,10 @@ function isActive(cfg) {
7
7
  if ((0, _platforma_sdk_model.isConfigLambda)(cfg)) return cfg.isActive === true;
8
8
  else return require_util.hasActiveCfgComponents(cfg);
9
9
  }
10
- function computableFromCfgOrRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops = {}) {
10
+ function computableFromCfgOrRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops = {}, blockPack) {
11
11
  if ((0, _platforma_sdk_model.isConfigLambda)(cfgOrFh)) {
12
12
  if (codeWithInfo === void 0) throw new Error("computableFromCfgOrRF: No code bundle.");
13
- return require_index.computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);
13
+ return require_index.computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops, blockPack);
14
14
  } else return require_executor.computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);
15
15
  }
16
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"render.cjs","names":["hasActiveCfgComponents","computableFromRF","computableFromCfg"],"sources":["../../src/middle_layer/render.ts"],"sourcesContent":["import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from \"@platforma-sdk/model\";\nimport { isConfigLambda } from \"@platforma-sdk/model\";\nimport type { Computable, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { computableFromCfg } from \"../cfg_render/executor\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { computableFromRF } from \"../js_render\";\nimport type { BlockContextAny } from \"./block_ctx\";\nimport { hasActiveCfgComponents } from \"../cfg_render/util\";\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error(\"computableFromCfgOrRF: No code bundle.\");\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n"],"mappings":";;;;;AASA,SAAgB,SAAS,KAAyC;CAChE,KAAA,GAAA,qBAAA,eAAA,CAAmB,GAAG,GAAG,OAAO,IAAI,aAAa;MAC5C,OAAOA,aAAAA,uBAAuB,GAAG;AACxC;AAEA,SAAgB,sBACd,KACA,KACA,SACA,cACA,WACA,MAAuC,CAAC,GACnB;CACrB,KAAA,GAAA,qBAAA,eAAA,CAAmB,OAAO,GAAG;EAC3B,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,wCAAwC;EACxF,OAAOC,cAAAA,iBAAiB,KAAK,KAAK,SAAS,cAAc,WAAW,GAAG;CACzE,OAAO,OAAOC,iBAAAA,kBAAkB,IAAI,WAAW,KAAK,SAAS,GAAG;AAClE"}
1
+ {"version":3,"file":"render.cjs","names":["hasActiveCfgComponents","computableFromRF","computableFromCfg"],"sources":["../../src/middle_layer/render.ts"],"sourcesContent":["import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from \"@platforma-sdk/model\";\nimport { isConfigLambda } from \"@platforma-sdk/model\";\nimport type { Computable, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { computableFromCfg } from \"../cfg_render/executor\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { computableFromRF } from \"../js_render\";\nimport type { BlockContextAny } from \"./block_ctx\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { hasActiveCfgComponents } from \"../cfg_render/util\";\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n blockPack?: BlockPackSpec,\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error(\"computableFromCfgOrRF: No code bundle.\");\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops, blockPack);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n"],"mappings":";;;;;AAUA,SAAgB,SAAS,KAAyC;CAChE,KAAA,GAAA,qBAAA,eAAA,CAAmB,GAAG,GAAG,OAAO,IAAI,aAAa;MAC5C,OAAOA,aAAAA,uBAAuB,GAAG;AACxC;AAEA,SAAgB,sBACd,KACA,KACA,SACA,cACA,WACA,MAAuC,CAAC,GACxC,WACqB;CACrB,KAAA,GAAA,qBAAA,eAAA,CAAmB,OAAO,GAAG;EAC3B,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,wCAAwC;EACxF,OAAOC,cAAAA,iBAAiB,KAAK,KAAK,SAAS,cAAc,WAAW,KAAK,SAAS;CACpF,OAAO,OAAOC,iBAAAA,kBAAkB,IAAI,WAAW,KAAK,SAAS,GAAG;AAClE"}
@@ -7,10 +7,10 @@ function isActive(cfg) {
7
7
  if (isConfigLambda(cfg)) return cfg.isActive === true;
8
8
  else return hasActiveCfgComponents(cfg);
9
9
  }
10
- function computableFromCfgOrRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops = {}) {
10
+ function computableFromCfgOrRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops = {}, blockPack) {
11
11
  if (isConfigLambda(cfgOrFh)) {
12
12
  if (codeWithInfo === void 0) throw new Error("computableFromCfgOrRF: No code bundle.");
13
- return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);
13
+ return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops, blockPack);
14
14
  } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);
15
15
  }
16
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","names":[],"sources":["../../src/middle_layer/render.ts"],"sourcesContent":["import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from \"@platforma-sdk/model\";\nimport { isConfigLambda } from \"@platforma-sdk/model\";\nimport type { Computable, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { computableFromCfg } from \"../cfg_render/executor\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { computableFromRF } from \"../js_render\";\nimport type { BlockContextAny } from \"./block_ctx\";\nimport { hasActiveCfgComponents } from \"../cfg_render/util\";\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error(\"computableFromCfgOrRF: No code bundle.\");\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n"],"mappings":";;;;;AASA,SAAgB,SAAS,KAAyC;CAChE,IAAI,eAAe,GAAG,GAAG,OAAO,IAAI,aAAa;MAC5C,OAAO,uBAAuB,GAAG;AACxC;AAEA,SAAgB,sBACd,KACA,KACA,SACA,cACA,WACA,MAAuC,CAAC,GACnB;CACrB,IAAI,eAAe,OAAO,GAAG;EAC3B,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,wCAAwC;EACxF,OAAO,iBAAiB,KAAK,KAAK,SAAS,cAAc,WAAW,GAAG;CACzE,OAAO,OAAO,kBAAkB,IAAI,WAAW,KAAK,SAAS,GAAG;AAClE"}
1
+ {"version":3,"file":"render.js","names":[],"sources":["../../src/middle_layer/render.ts"],"sourcesContent":["import type { BlockCodeWithInfo, TypedConfigOrConfigLambda } from \"@platforma-sdk/model\";\nimport { isConfigLambda } from \"@platforma-sdk/model\";\nimport type { Computable, ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { computableFromCfg } from \"../cfg_render/executor\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { computableFromRF } from \"../js_render\";\nimport type { BlockContextAny } from \"./block_ctx\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport { hasActiveCfgComponents } from \"../cfg_render/util\";\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n codeWithInfo: BlockCodeWithInfo | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n blockPack?: BlockPackSpec,\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (codeWithInfo === undefined) throw new Error(\"computableFromCfgOrRF: No code bundle.\");\n return computableFromRF(env, ctx, cfgOrFh, codeWithInfo, configKey, ops, blockPack);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n"],"mappings":";;;;;AAUA,SAAgB,SAAS,KAAyC;CAChE,IAAI,eAAe,GAAG,GAAG,OAAO,IAAI,aAAa;MAC5C,OAAO,uBAAuB,GAAG;AACxC;AAEA,SAAgB,sBACd,KACA,KACA,SACA,cACA,WACA,MAAuC,CAAC,GACxC,WACqB;CACrB,IAAI,eAAe,OAAO,GAAG;EAC3B,IAAI,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,wCAAwC;EACxF,OAAO,iBAAiB,KAAK,KAAK,SAAS,cAAc,WAAW,KAAK,SAAS;CACpF,OAAO,OAAO,kBAAkB,IAAI,WAAW,KAAK,SAAS,GAAG;AAClE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.71.7",
3
+ "version": "1.71.9",
4
4
  "description": "Pl Middle Layer",
5
5
  "keywords": [],
6
6
  "license": "UNLICENSED",
@@ -19,7 +19,7 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
- "@milaboratories/pframes-rs-node": "1.1.60",
22
+ "@milaboratories/pframes-rs-node": "1.1.61",
23
23
  "canonicalize": "~2.1.0",
24
24
  "denque": "^2.1.0",
25
25
  "es-toolkit": "^1.39.10",
@@ -31,25 +31,25 @@
31
31
  "yaml": "^2.8.0",
32
32
  "zod": "~3.25.76",
33
33
  "@milaboratories/columns-collection-driver": "0.2.5",
34
- "@milaboratories/pf-driver": "1.9.2",
35
- "@milaboratories/pl-client": "3.16.2",
36
- "@milaboratories/pf-spec-driver": "1.5.2",
37
- "@milaboratories/computable": "2.9.8",
38
34
  "@milaboratories/helpers": "1.14.5",
35
+ "@milaboratories/pf-driver": "1.9.3",
36
+ "@milaboratories/computable": "2.9.8",
37
+ "@milaboratories/pf-spec-driver": "1.5.3",
38
+ "@milaboratories/pl-client": "3.16.2",
39
39
  "@milaboratories/pl-deployments": "3.0.17",
40
- "@milaboratories/pl-errors": "1.4.40",
40
+ "@milaboratories/pl-crash-recorder": "0.3.0",
41
41
  "@milaboratories/pl-drivers": "1.16.21",
42
- "@milaboratories/pl-flight-recorder": "0.2.1",
42
+ "@milaboratories/pl-errors": "1.4.40",
43
43
  "@milaboratories/pl-http": "1.2.4",
44
44
  "@milaboratories/pl-model-common": "1.49.0",
45
45
  "@milaboratories/pl-model-middle-layer": "1.32.1",
46
46
  "@milaboratories/pl-tree": "1.14.4",
47
47
  "@milaboratories/pl-model-backend": "1.4.25",
48
+ "@milaboratories/ts-helpers": "1.8.6",
49
+ "@milaboratories/resolve-helper": "1.1.3",
48
50
  "@platforma-sdk/block-tools": "2.15.2",
49
51
  "@platforma-sdk/model": "1.83.17",
50
- "@milaboratories/resolve-helper": "1.1.3",
51
- "@milaboratories/ts-helpers": "1.8.6",
52
- "@platforma-sdk/workflow-tengo": "6.10.3"
52
+ "@platforma-sdk/workflow-tengo": "6.10.4"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/node": "~24.5.2",
@@ -1,5 +1,6 @@
1
1
  import type { MiddleLayerEnvironment } from "../middle_layer/middle_layer";
2
2
  import type { BlockCodeWithInfo, ConfigRenderLambda } from "@platforma-sdk/model";
3
+ import type { BlockPackSpec } from "@milaboratories/pl-model-middle-layer";
3
4
  import type { ComputableRenderingOps } from "@milaboratories/computable";
4
5
  import { Computable } from "@milaboratories/computable";
5
6
  import type { QuickJSWASMModule } from "quickjs-emscripten";
@@ -8,7 +9,7 @@ import type { DeadlineSettings } from "./context";
8
9
  import { JsExecutionContext } from "./context";
9
10
  import type { BlockContextAny } from "../middle_layer/block_ctx";
10
11
  import { getDebugFlags } from "../debug";
11
- import { recordModelRenderSync } from "@milaboratories/pl-flight-recorder";
12
+ import { recordModelRenderSync } from "@milaboratories/pl-crash-recorder";
12
13
 
13
14
  /** Memory ceiling applied to every QuickJS runtime that evaluates model code. */
14
15
  const QUICK_JS_MEMORY_LIMIT = 1024 * 1024 * 8;
@@ -87,6 +88,7 @@ export function computableFromRF(
87
88
  codeWithInfo: BlockCodeWithInfo,
88
89
  configKey: string,
89
90
  ops: Partial<ComputableRenderingOps> = {},
91
+ blockPack?: BlockPackSpec,
90
92
  ): Computable<unknown> {
91
93
  // adding configKey to reload all outputs on block-pack update
92
94
  const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;
@@ -130,9 +132,13 @@ export function computableFromRF(
130
132
  { computableCtx: cCtx, blockCtx: ctx, mlEnv: env },
131
133
  );
132
134
 
133
- const flightRecorder = env.driverKit.flightRecorder;
135
+ const crashRecorder = env.driverKit.crashRecorder;
134
136
  const renderInfo = {
135
137
  blockId: ctx.blockId,
138
+ // A block id is unique to one project; these say which code it is, so a
139
+ // log can be read against the right version without the project.
140
+ ...describeBlockPack(blockPack),
141
+ sdkVersion: codeWithInfo.sdkVersion,
136
142
  key,
137
143
  lambda: fh.handle,
138
144
  // The sandbox has its own 8 MB ceiling, so the model's own objects can
@@ -142,7 +148,7 @@ export function computableFromRF(
142
148
  getStats: () => ({ ...rCtx.stats }),
143
149
  };
144
150
 
145
- return recordModelRenderSync(flightRecorder, renderInfo, () => {
151
+ return recordModelRenderSync(crashRecorder, renderInfo, () => {
146
152
  rCtx.evaluateBundle(code.content);
147
153
  const result = rCtx.runCallback(fh.handle);
148
154
 
@@ -178,7 +184,7 @@ export function computableFromRF(
178
184
  // A deferred render resumes here, potentially many times, and each
179
185
  // resumption can build joins of its own, so each gets its own span.
180
186
  return recordModelRenderSync(
181
- flightRecorder,
187
+ crashRecorder,
182
188
  { ...renderInfo, recalculation: recalculationCounter },
183
189
  () => {
184
190
  // resolving futures
@@ -257,3 +263,28 @@ export function executeSingleLambda(
257
263
  scope.dispose();
258
264
  }
259
265
  }
266
+
267
+ /**
268
+ * The part of a block pack that names the code, and nothing else.
269
+ *
270
+ * Registry packs carry an organization, name and version, which is what a reader
271
+ * needs to open the right source. Local and development packs carry a filesystem
272
+ * path instead; the path is deliberately not recorded — it identifies the
273
+ * machine rather than the code, and its `type` already says that no published
274
+ * version exists to look up.
275
+ */
276
+ function describeBlockPack(spec: BlockPackSpec | undefined): {
277
+ block?: string;
278
+ blockVersion?: string;
279
+ blockSource?: string;
280
+ } {
281
+ if (spec === undefined) return {};
282
+ if (spec.type === "from-registry-v1" || spec.type === "from-registry-v2") {
283
+ return {
284
+ block: `${spec.id.organization}:${spec.id.name}`,
285
+ blockVersion: spec.id.version,
286
+ blockSource: spec.type,
287
+ };
288
+ }
289
+ return { block: "(unpublished)", blockSource: spec.type };
290
+ }
@@ -39,7 +39,15 @@ export function activeConfigs(
39
39
  for (const cfg of activeOutputConfigs) {
40
40
  ret.push(
41
41
  Computable.wrapError(
42
- computableFromCfgOrRF(env, blockCtx, cfg, codeWithInfoOrError.value, bp.bpId),
42
+ computableFromCfgOrRF(
43
+ env,
44
+ blockCtx,
45
+ cfg,
46
+ codeWithInfoOrError.value,
47
+ bp.bpId,
48
+ {},
49
+ bp.info.source,
50
+ ),
43
51
  ),
44
52
  );
45
53
  }
@@ -67,7 +67,7 @@ export function blockOutputs(
67
67
  const prj = c.accessor(projectEntry).node();
68
68
  const ctx = constructBlockContext(projectEntry, blockId);
69
69
 
70
- return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId }) => {
70
+ return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId, info }) => {
71
71
  const outputs: Record<string, Computable<any>> = {};
72
72
  for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {
73
73
  const computableOutput = computableFromCfgOrRF(
@@ -76,6 +76,8 @@ export function blockOutputs(
76
76
  cellCfg,
77
77
  extractCodeWithInfo(cfg),
78
78
  bpId,
79
+ {},
80
+ info.source,
79
81
  );
80
82
  outputs[cellId] = Computable.wrapError(computableOutput, 1);
81
83
  }
@@ -19,12 +19,12 @@ import { isAsyncDisposable } from "@milaboratories/helpers";
19
19
  import { HmacSha256Signer } from "@milaboratories/ts-helpers";
20
20
  import type { InternalPFrameDriver } from "../pool";
21
21
  import { createPFrameDriver } from "../pool";
22
- import type { Recorder } from "@milaboratories/pl-flight-recorder";
22
+ import type { Recorder } from "@milaboratories/pl-crash-recorder";
23
23
  import {
24
- openFlightSession,
24
+ openRecordingSession,
25
25
  wrapDataDriver,
26
26
  wrapModelDriver,
27
- } from "@milaboratories/pl-flight-recorder";
27
+ } from "@milaboratories/pl-crash-recorder";
28
28
  import type { DriverKitOps, DriverKitOpsConstructor } from "./ops";
29
29
  import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from "./ops";
30
30
 
@@ -53,11 +53,11 @@ export interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
53
53
  readonly frontendDriver: DownloadUrlDriver;
54
54
 
55
55
  /**
56
- * Diagnostics log for the model layer, present only when flight recording is
56
+ * Diagnostics log for the model layer, present only when crash recording is
57
57
  * switched on. Render spans are written through it so that a join recorded by
58
58
  * the instrumented pFrame driver can be attributed to the block that built it.
59
59
  * */
60
- readonly flightRecorder?: Recorder;
60
+ readonly crashRecorder?: Recorder;
61
61
 
62
62
  /**
63
63
  * Signer is initialized from local secret in drivers initialization routine,
@@ -140,12 +140,12 @@ export async function initDriverKit(
140
140
  // this one driver, so instrumenting it here covers the whole model layer
141
141
  // without touching the call sites. The session is undefined unless recording
142
142
  // is switched on, in which case the driver is used exactly as before.
143
- const flightSession = openFlightSession({ role: "middle-layer" });
144
- const pFrameDriver: InternalPFrameDriver = flightSession
143
+ const recordingSession = openRecordingSession({ role: "middle-layer" });
144
+ const pFrameDriver: InternalPFrameDriver = recordingSession
145
145
  ? wrapDataDriver(
146
- wrapModelDriver(rawPFrameDriver, flightSession.recorder, flightSession.registry),
147
- flightSession.recorder,
148
- flightSession.registry,
146
+ wrapModelDriver(rawPFrameDriver, recordingSession.recorder, recordingSession.registry),
147
+ recordingSession.recorder,
148
+ recordingSession.registry,
149
149
  )
150
150
  : rawPFrameDriver;
151
151
 
@@ -166,7 +166,7 @@ export async function initDriverKit(
166
166
  uploadDriver,
167
167
  pFrameDriver,
168
168
  frontendDriver: frontendDownloadDriver,
169
- flightRecorder: flightSession?.recorder,
169
+ crashRecorder: recordingSession?.recorder,
170
170
  };
171
171
 
172
172
  const dispose = async () => {
@@ -174,7 +174,7 @@ export async function initDriverKit(
174
174
  isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],
175
175
  );
176
176
  await Promise.all(disposePromises);
177
- flightSession?.close("driver-kit-disposed");
177
+ recordingSession?.close("driver-kit-disposed");
178
178
  };
179
179
 
180
180
  return {