@milaboratories/pl-middle-layer 1.75.0 → 1.76.0

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 (48) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.d.ts +3 -2
  3. package/dist/index.js +2 -2
  4. package/dist/middle_layer/block_action_context.cjs +57 -0
  5. package/dist/middle_layer/block_action_context.cjs.map +1 -0
  6. package/dist/middle_layer/block_action_context.d.ts +47 -0
  7. package/dist/middle_layer/block_action_context.d.ts.map +1 -0
  8. package/dist/middle_layer/block_action_context.js +57 -0
  9. package/dist/middle_layer/block_action_context.js.map +1 -0
  10. package/dist/middle_layer/build_stamp.cjs +1 -1
  11. package/dist/middle_layer/build_stamp.js +1 -1
  12. package/dist/middle_layer/index.d.ts +2 -1
  13. package/dist/middle_layer/project.cjs +8 -0
  14. package/dist/middle_layer/project.cjs.map +1 -1
  15. package/dist/middle_layer/project.d.ts +6 -0
  16. package/dist/middle_layer/project.d.ts.map +1 -1
  17. package/dist/middle_layer/project.js +8 -0
  18. package/dist/middle_layer/project.js.map +1 -1
  19. package/dist/model/project_model.cjs +1 -1
  20. package/dist/model/project_model.cjs.map +1 -1
  21. package/dist/model/project_model.d.ts +1 -1
  22. package/dist/model/project_model.js +1 -1
  23. package/dist/model/project_model.js.map +1 -1
  24. package/dist/mutator/project.cjs +19 -4
  25. package/dist/mutator/project.cjs.map +1 -1
  26. package/dist/mutator/project.d.ts.map +1 -1
  27. package/dist/mutator/project.js +19 -4
  28. package/dist/mutator/project.js.map +1 -1
  29. package/dist/mutator/template/render_block.cjs +35 -2
  30. package/dist/mutator/template/render_block.cjs.map +1 -1
  31. package/dist/mutator/template/render_block.js +35 -4
  32. package/dist/mutator/template/render_block.js.map +1 -1
  33. package/dist/mutator/template/render_template.cjs +16 -1
  34. package/dist/mutator/template/render_template.cjs.map +1 -1
  35. package/dist/mutator/template/render_template.d.ts +12 -1
  36. package/dist/mutator/template/render_template.d.ts.map +1 -1
  37. package/dist/mutator/template/render_template.js +16 -2
  38. package/dist/mutator/template/render_template.js.map +1 -1
  39. package/package.json +7 -7
  40. package/src/middle_layer/block_action_context.test.ts +148 -0
  41. package/src/middle_layer/block_action_context.ts +162 -0
  42. package/src/middle_layer/index.ts +6 -0
  43. package/src/middle_layer/project.ts +13 -0
  44. package/src/model/project_model.ts +5 -2
  45. package/src/mutator/project.ts +47 -13
  46. package/src/mutator/project_action_context.test.ts +178 -0
  47. package/src/mutator/template/render_block.ts +70 -5
  48. package/src/mutator/template/render_template.ts +22 -2
package/dist/index.cjs CHANGED
@@ -83,6 +83,7 @@ exports.canGrantToEveryone = require_sharing_model.canGrantToEveryone;
83
83
  exports.canImpersonate = require_sharing_model.canImpersonate;
84
84
  exports.checkNetwork = require_network_check.checkNetwork;
85
85
  exports.createRenderTemplate = require_render_template.createRenderTemplate;
86
+ exports.createRenderTemplateWithResource = require_render_template.createRenderTemplateWithResource;
86
87
  exports.decodeEnvelopeData = require_sharing_model.decodeEnvelopeData;
87
88
  exports.deriveGlobalPObjectId = require_data.deriveGlobalPObjectId;
88
89
  exports.deriveLocalPObjectId = require_data.deriveLocalPObjectId;
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ import { CachedTemplate, ExplicitTemplate, PreparedTemplate, TemplateFromFile, T
16
16
  import { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec } from "./model/block_pack_spec.js";
17
17
  import { TemplateParseOutcome, parseProjectTemplateV1Yaml } from "./model/template_parser.js";
18
18
  import "./model/index.js";
19
+ import { BlockActionContextMode, BlockActionContextNode, BlockActionReading, BlockActionTransition } from "./middle_layer/block_action_context.js";
19
20
  import { Project } from "./middle_layer/project.js";
20
21
  import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./middle_layer/ops.js";
21
22
  import { MiddleLayerDriverKit, initDriverKit } from "./middle_layer/driver_kit.js";
@@ -26,7 +27,7 @@ import "./middle_layer/index.js";
26
27
  import { CheckNetworkOpts, checkNetwork, initNetworkCheck } from "./network_check/network_check.js";
27
28
  import { TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, loadTemplate, prepareTemplateSpec } from "./mutator/template/template_loading.js";
28
29
  import { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, cacheBlockPackTemplate, dropTemplateCache, flattenTemplateTree, getOrCreateTemplateCache, invalidateTemplateCacheId, loadTemplateCached, runGc } from "./mutator/template/template_cache.js";
29
- import { createRenderTemplate } from "./mutator/template/render_template.js";
30
+ import { createRenderTemplate, createRenderTemplateWithResource } from "./mutator/template/render_template.js";
30
31
  import { duplicateProject } from "./mutator/project.js";
31
32
  import { parseFinalPObjectCollection } from "./pool/p_object_collection.js";
32
33
  import { deriveGlobalPObjectId, deriveLocalPObjectId } from "./pool/data.js";
@@ -36,4 +37,4 @@ export * from "@platforma-sdk/model";
36
37
  export * from "@milaboratories/pl-model-middle-layer";
37
38
  export * from "@milaboratories/pl-deployments";
38
39
  export * from "@milaboratories/pl-client";
39
- export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, type AppliedEntry, type AvailableShare, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, type CreateProjectFromTemplateOutcome, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeData, EnvelopeFolder, EnvelopeFolderId, EnvelopeFolderProject, type EnvelopeFolderSummary, EnvelopeFolderTemplate, EnvelopeMode, EnvelopePayload, EnvelopePayloadKind, EnvelopeProject, EnvelopeSchemaVersion, EnvelopeSchemaVersionCurrent, type ExactResolution, ExplicitTemplate, type FieldType, FoldersField, type FoldersListing, type FoldersProjectEntry, FoldersResourceType, type FoldersTemplateEntry, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, HiddenFieldPrefix, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, PreparedTemplate, Project, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, type ProjectTemplateExportOutcome, ProjectsField, ProjectsResourceType, type ResolvedEntry, type ResourceType, type SaveProjectAsTemplateOutcome, SchemaVersionCurrent, SchemaVersionKey, ShareAudience, ShareFolderOptions, ShareHidden, ShareId, ShareOptions, ShareOutcome, ShareProjectsOptions, ShareReplaceOption, ShareTemplateOptions, SharedEnvelopeResourceType, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type StoredTemplateData, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, type TemplateExportProblem, TemplateFromFile, TemplateFromRegistry, type TemplateId, type TemplateListEntry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TemplatesField, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, envelopeFolderRoot, envelopeProjectMap, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, hiddenField, hiddenFieldShareId, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isHiddenField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, locationOf, newEnvelopeFolderId, newProjectFieldUuid, newShareId, normalizeEnvelopeData, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, stringifyProjectTemplateV1, templateBlockPackProvider };
40
+ export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, type AppliedEntry, type AvailableShare, type BlockActionContextMode, type BlockActionContextNode, type BlockActionReading, type BlockActionTransition, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, type CreateProjectFromTemplateOutcome, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeData, EnvelopeFolder, EnvelopeFolderId, EnvelopeFolderProject, type EnvelopeFolderSummary, EnvelopeFolderTemplate, EnvelopeMode, EnvelopePayload, EnvelopePayloadKind, EnvelopeProject, EnvelopeSchemaVersion, EnvelopeSchemaVersionCurrent, type ExactResolution, ExplicitTemplate, type FieldType, FoldersField, type FoldersListing, type FoldersProjectEntry, FoldersResourceType, type FoldersTemplateEntry, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, HiddenFieldPrefix, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, PreparedTemplate, Project, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, type ProjectTemplateExportOutcome, ProjectsField, ProjectsResourceType, type ResolvedEntry, type ResourceType, type SaveProjectAsTemplateOutcome, SchemaVersionCurrent, SchemaVersionKey, ShareAudience, ShareFolderOptions, ShareHidden, ShareId, ShareOptions, ShareOutcome, ShareProjectsOptions, ShareReplaceOption, ShareTemplateOptions, SharedEnvelopeResourceType, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type StoredTemplateData, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, type TemplateExportProblem, TemplateFromFile, TemplateFromRegistry, type TemplateId, type TemplateListEntry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TemplatesField, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, createRenderTemplateWithResource, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, envelopeFolderRoot, envelopeProjectMap, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, hiddenField, hiddenFieldShareId, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isHiddenField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, locationOf, newEnvelopeFolderId, newProjectFieldUuid, newShareId, normalizeEnvelopeData, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, stringifyProjectTemplateV1, templateBlockPackProvider };
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { BlockArgsAuthorKeyPrefix, ProjectCreatedTimestamp, ProjectLastModifiedT
7
7
  import { ProjectsField, ProjectsResourceType } from "./middle_layer/project_list.js";
8
8
  import { TemplatesField } from "./middle_layer/template_list.js";
9
9
  import { FoldersField, FoldersResourceType } from "./middle_layer/folders.js";
10
- import { createRenderTemplate } from "./mutator/template/render_template.js";
10
+ import { createRenderTemplate, createRenderTemplateWithResource } from "./mutator/template/render_template.js";
11
11
  import { TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, loadTemplate, prepareTemplateSpec } from "./mutator/template/template_loading.js";
12
12
  import { FrontendFromFolderResourceType, FrontendFromLocalTgzResourceType, FrontendFromUrlResourceType } from "./model/block_pack_spec.js";
13
13
  import { EnvelopeSchemaVersionCurrent, HiddenFieldPrefix, SharedEnvelopeResourceType, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, asShareId, canGrantToEveryone, canImpersonate, decodeEnvelopeData, envelopeFolderRoot, envelopeProjectMap, hiddenField, hiddenFieldShareId, isHiddenField, newEnvelopeFolderId, newProjectFieldUuid, newShareId, normalizeEnvelopeData } from "./model/sharing_model.js";
@@ -30,4 +30,4 @@ export * from "@platforma-sdk/model";
30
30
  export * from "@milaboratories/pl-model-middle-layer";
31
31
  export * from "@milaboratories/pl-deployments";
32
32
  export * from "@milaboratories/pl-client";
33
- export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, BlockArgsAuthorKeyPrefix, BlockPackRegistry, CentralBlockRegistry, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, EnvelopeSchemaVersionCurrent, FoldersField, FoldersResourceType, FrontendFromFolderResourceType, FrontendFromLocalTgzResourceType, FrontendFromUrlResourceType, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, HiddenFieldPrefix, MiddleLayer, Project, ProjectCreatedTimestamp, ProjectLastModifiedTimestamp, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, ProjectsResourceType, SchemaVersionCurrent, SchemaVersionKey, SharedEnvelopeResourceType, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, TemplateCacheFieldName, TemplateCacheType, TemplateEntryRejected, TemplatesField, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, envelopeFolderRoot, envelopeProjectMap, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, hiddenField, hiddenFieldShareId, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isHiddenField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, locationOf, newEnvelopeFolderId, newProjectFieldUuid, newShareId, normalizeEnvelopeData, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, stringifyProjectTemplateV1, templateBlockPackProvider };
33
+ export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, BlockArgsAuthorKeyPrefix, BlockPackRegistry, CentralBlockRegistry, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, EnvelopeSchemaVersionCurrent, FoldersField, FoldersResourceType, FrontendFromFolderResourceType, FrontendFromLocalTgzResourceType, FrontendFromUrlResourceType, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, HiddenFieldPrefix, MiddleLayer, Project, ProjectCreatedTimestamp, ProjectLastModifiedTimestamp, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, ProjectsResourceType, SchemaVersionCurrent, SchemaVersionKey, SharedEnvelopeResourceType, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, TemplateCacheFieldName, TemplateCacheType, TemplateEntryRejected, TemplatesField, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, createRenderTemplateWithResource, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, envelopeFolderRoot, envelopeProjectMap, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, hiddenField, hiddenFieldShareId, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isHiddenField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, locationOf, newEnvelopeFolderId, newProjectFieldUuid, newShareId, normalizeEnvelopeData, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, stringifyProjectTemplateV1, templateBlockPackProvider };
@@ -0,0 +1,57 @@
1
+ const require_project_model = require("../model/project_model.cjs");
2
+ let _milaboratories_pl_client = require("@milaboratories/pl-client");
3
+ // src/middle_layer/block_action_context.ts
4
+ const childFieldPrefix = "child/";
5
+ async function readBlockActionContextTree(pl, projectRid, blockId, mode) {
6
+ return await pl.withReadTx("readBlockActionContextTree", async (tx) => {
7
+ const project = await tx.getResourceData(projectRid, true);
8
+ const fieldName = require_project_model.projectFieldName(blockId, mode === "prod" ? "prodActionContext" : "stagingActionContext");
9
+ const actionContextField = project.fields.find((f) => f.name === fieldName);
10
+ if (actionContextField === void 0 || (0, _milaboratories_pl_client.isNullSignedResourceId)(actionContextField.value)) return void 0;
11
+ return await readActionContextNode(tx, actionContextField.value);
12
+ });
13
+ }
14
+ async function readActionContextNode(tx, contextRef) {
15
+ const [context, kvs] = await Promise.all([tx.getResourceData(contextRef, true), tx.listKeyValuesString(contextRef)]);
16
+ const baggage = context.data === void 0 || context.data.length === 0 ? {} : JSON.parse(Buffer.from(context.data).toString());
17
+ const transitions = [];
18
+ const readings = [];
19
+ for (const { key, value } of kvs) {
20
+ const parts = key.split("/");
21
+ if (parts[0] === "transition" && parts.length === 4) {
22
+ const parsed = JSON.parse(value);
23
+ transitions.push({
24
+ namespace: parts[1],
25
+ resource: parts[2],
26
+ timestampNs: parts[3],
27
+ state: parsed.state ?? "",
28
+ detail: parsed.detail ?? "",
29
+ reason: parsed.reason ?? ""
30
+ });
31
+ } else if (parts[0] === "reading" && parts.length === 4) readings.push({
32
+ namespace: parts[1],
33
+ resource: parts[2],
34
+ key: parts[3],
35
+ value
36
+ });
37
+ }
38
+ transitions.sort((a, b) => compareDecimal(a.timestampNs, b.timestampNs));
39
+ const childRefs = [];
40
+ for (const f of context.fields) if (f.name.startsWith(childFieldPrefix) && !(0, _milaboratories_pl_client.isNullSignedResourceId)(f.value)) childRefs.push(f.value);
41
+ const children = await Promise.all(childRefs.map((ref) => readActionContextNode(tx, ref)));
42
+ return {
43
+ contextId: String((0, _milaboratories_pl_client.parseSignedResourceId)(contextRef).globalId),
44
+ resource: transitions.find((t) => t.namespace === "render")?.resource,
45
+ baggage,
46
+ transitions,
47
+ readings,
48
+ children
49
+ };
50
+ }
51
+ /** Compares non-negative decimal integers given as strings. */
52
+ function compareDecimal(a, b) {
53
+ return a.length !== b.length ? a.length - b.length : a < b ? -1 : a > b ? 1 : 0;
54
+ }
55
+ exports.readBlockActionContextTree = readBlockActionContextTree;
56
+
57
+ //# sourceMappingURL=block_action_context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_action_context.cjs","names":["projectFieldName","isNullSignedResourceId","parseSignedResourceId"],"sources":["../../src/middle_layer/block_action_context.ts"],"sourcesContent":["import type {\n KeyValueString,\n OptionalSignedResourceId,\n SignedResourceId,\n} from \"@milaboratories/pl-client\";\nimport { isNullSignedResourceId, parseSignedResourceId } from \"@milaboratories/pl-client\";\nimport { projectFieldName } from \"../model/project_model\";\n\n/** Which render of a block the action context tree belongs to. */\nexport type BlockActionContextMode = \"prod\" | \"staging\";\n\n/** An action transition: transition/<namespace>/<resource>/<ns> in an action context. */\nexport type BlockActionTransition = {\n namespace: string;\n /** The resource that reported, e.g. the render or a command it created. */\n resource: string;\n /** Server clock in nanoseconds when the transition was recorded, as a decimal string. */\n timestampNs: string;\n state: string;\n detail: string;\n reason: string;\n};\n\n/**\n * A reading: reading/<namespace>/<resource>/<key> in an action context. The backend sets it asynchronously:\n * of two readings of one key, the one from the transaction opened later stays.\n */\nexport type BlockActionReading = {\n namespace: string;\n resource: string;\n key: string;\n /** Opaque bytes as UTF-8 text; the reporter owns the format. */\n value: string;\n};\n\n/** One action context: the action context of one render and the renders it created. */\nexport type BlockActionContextNode = {\n /**\n * Global resource ID of this ActionContext resource itself, as a decimal string. Not the ID of the\n * render it describes: that is {@link BlockActionContextNode.resource}. Pass it back to the MCP\n * tool to fetch this node's subtree.\n */\n contextId: string;\n /**\n * The render the context belongs to: the resource of its first transition under namespace \"render\",\n * which the workflow controller records when it evaluates the render.\n * Undefined until that transition is applied, or on a backend without block action context reports.\n */\n resource?: string;\n /** Context baggage: name, block-pack, block-id, run-id and so on. */\n baggage: Record<string, string>;\n /** In time order. */\n transitions: BlockActionTransition[];\n readings: BlockActionReading[];\n children: BlockActionContextNode[];\n};\n\nconst childFieldPrefix = \"child/\";\n\n/**\n * Reads the action context tree of a block render: the root action context the project holds in\n * <blockId>-prodActionContext or <blockId>-stagingActionContext, and every child context under it.\n * Reads the current state in one transaction; it does not watch for changes.\n *\n * @returns undefined when the block has no action context: it was not rendered yet, or the backend\n * does not support block action context.\n */\n/**\n * The part of a read transaction the reader uses: a {@link PlTransaction} satisfies it, and a test\n * can serve it without a backend.\n */\nexport interface ActionContextReadTx {\n getResourceData(\n rId: SignedResourceId,\n loadFields: true,\n ): Promise<{\n readonly data?: Uint8Array;\n readonly fields: readonly { readonly name: string; readonly value: OptionalSignedResourceId }[];\n }>;\n listKeyValuesString(rId: SignedResourceId): Promise<KeyValueString[]>;\n}\n\n/** The part of a client the reader uses: a {@link PlClient} satisfies it. */\nexport interface ActionContextReader {\n withReadTx<T>(name: string, body: (tx: ActionContextReadTx) => Promise<T>): Promise<T>;\n}\n\nexport async function readBlockActionContextTree(\n pl: ActionContextReader,\n projectRid: SignedResourceId,\n blockId: string,\n mode: BlockActionContextMode,\n): Promise<BlockActionContextNode | undefined> {\n return await pl.withReadTx(\"readBlockActionContextTree\", async (tx) => {\n const project = await tx.getResourceData(projectRid, true);\n const fieldName = projectFieldName(\n blockId,\n mode === \"prod\" ? \"prodActionContext\" : \"stagingActionContext\",\n );\n const actionContextField = project.fields.find((f) => f.name === fieldName);\n if (actionContextField === undefined || isNullSignedResourceId(actionContextField.value))\n return undefined;\n\n return await readActionContextNode(tx, actionContextField.value);\n });\n}\n\nasync function readActionContextNode(\n tx: ActionContextReadTx,\n contextRef: SignedResourceId,\n): Promise<BlockActionContextNode> {\n const [context, kvs] = await Promise.all([\n tx.getResourceData(contextRef, true),\n tx.listKeyValuesString(contextRef),\n ]);\n\n const baggage =\n context.data === undefined || context.data.length === 0\n ? {}\n : (JSON.parse(Buffer.from(context.data).toString()) as Record<string, string>);\n\n const transitions: BlockActionTransition[] = [];\n const readings: BlockActionReading[] = [];\n for (const { key, value } of kvs) {\n const parts = key.split(\"/\");\n if (parts[0] === \"transition\" && parts.length === 4) {\n const parsed = JSON.parse(value) as { state?: string; detail?: string; reason?: string };\n transitions.push({\n namespace: parts[1],\n resource: parts[2],\n timestampNs: parts[3],\n state: parsed.state ?? \"\",\n detail: parsed.detail ?? \"\",\n reason: parsed.reason ?? \"\",\n });\n } else if (parts[0] === \"reading\" && parts.length === 4) {\n readings.push({ namespace: parts[1], resource: parts[2], key: parts[3], value });\n }\n }\n transitions.sort((a, b) => compareDecimal(a.timestampNs, b.timestampNs));\n\n const childRefs: SignedResourceId[] = [];\n for (const f of context.fields) {\n if (f.name.startsWith(childFieldPrefix) && !isNullSignedResourceId(f.value))\n childRefs.push(f.value);\n }\n const children = await Promise.all(childRefs.map((ref) => readActionContextNode(tx, ref)));\n\n return {\n contextId: String(parseSignedResourceId(contextRef).globalId),\n resource: transitions.find((t) => t.namespace === \"render\")?.resource,\n baggage,\n transitions,\n readings,\n children,\n };\n}\n\n/** Compares non-negative decimal integers given as strings. */\nfunction compareDecimal(a: string, b: string): number {\n return a.length !== b.length ? a.length - b.length : a < b ? -1 : a > b ? 1 : 0;\n}\n"],"mappings":";;;AAyDA,MAAM,mBAAmB;AA8BzB,eAAsB,2BACpB,IACA,YACA,SACA,MAC6C;CAC7C,OAAO,MAAM,GAAG,WAAW,8BAA8B,OAAO,OAAO;EACrE,MAAM,UAAU,MAAM,GAAG,gBAAgB,YAAY,IAAI;EACzD,MAAM,YAAYA,sBAAAA,iBAChB,SACA,SAAS,SAAS,sBAAsB,sBAC1C;EACA,MAAM,qBAAqB,QAAQ,OAAO,MAAM,MAAM,EAAE,SAAS,SAAS;EAC1E,IAAI,uBAAuB,KAAA,MAAA,GAAaC,0BAAAA,uBAAAA,CAAuB,mBAAmB,KAAK,GACrF,OAAO,KAAA;EAET,OAAO,MAAM,sBAAsB,IAAI,mBAAmB,KAAK;CACjE,CAAC;AACH;AAEA,eAAe,sBACb,IACA,YACiC;CACjC,MAAM,CAAC,SAAS,OAAO,MAAM,QAAQ,IAAI,CACvC,GAAG,gBAAgB,YAAY,IAAI,GACnC,GAAG,oBAAoB,UAAU,CACnC,CAAC;CAED,MAAM,UACJ,QAAQ,SAAS,KAAA,KAAa,QAAQ,KAAK,WAAW,IAClD,CAAC,IACA,KAAK,MAAM,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;CAEtD,MAAM,cAAuC,CAAC;CAC9C,MAAM,WAAiC,CAAC;CACxC,KAAK,MAAM,EAAE,KAAK,WAAW,KAAK;EAChC,MAAM,QAAQ,IAAI,MAAM,GAAG;EAC3B,IAAI,MAAM,OAAO,gBAAgB,MAAM,WAAW,GAAG;GACnD,MAAM,SAAS,KAAK,MAAM,KAAK;GAC/B,YAAY,KAAK;IACf,WAAW,MAAM;IACjB,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,OAAO,OAAO,SAAS;IACvB,QAAQ,OAAO,UAAU;IACzB,QAAQ,OAAO,UAAU;GAC3B,CAAC;EACH,OAAO,IAAI,MAAM,OAAO,aAAa,MAAM,WAAW,GACpD,SAAS,KAAK;GAAE,WAAW,MAAM;GAAI,UAAU,MAAM;GAAI,KAAK,MAAM;GAAI;EAAM,CAAC;CAEnF;CACA,YAAY,MAAM,GAAG,MAAM,eAAe,EAAE,aAAa,EAAE,WAAW,CAAC;CAEvE,MAAM,YAAgC,CAAC;CACvC,KAAK,MAAM,KAAK,QAAQ,QACtB,IAAI,EAAE,KAAK,WAAW,gBAAgB,KAAK,EAAA,GAACA,0BAAAA,uBAAAA,CAAuB,EAAE,KAAK,GACxE,UAAU,KAAK,EAAE,KAAK;CAE1B,MAAM,WAAW,MAAM,QAAQ,IAAI,UAAU,KAAK,QAAQ,sBAAsB,IAAI,GAAG,CAAC,CAAC;CAEzF,OAAO;EACL,WAAW,QAAA,GAAOC,0BAAAA,sBAAAA,CAAsB,UAAU,CAAC,CAAC,QAAQ;EAC5D,UAAU,YAAY,MAAM,MAAM,EAAE,cAAc,QAAQ,CAAC,EAAE;EAC7D;EACA;EACA;EACA;CACF;AACF;;AAGA,SAAS,eAAe,GAAW,GAAmB;CACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAChF"}
@@ -0,0 +1,47 @@
1
+ import { SignedResourceId } from "@milaboratories/pl-client";
2
+ /** Which render of a block the action context tree belongs to. */
3
+ export type BlockActionContextMode = "prod" | "staging";
4
+ /** An action transition: transition/<namespace>/<resource>/<ns> in an action context. */
5
+ export type BlockActionTransition = {
6
+ namespace: string;
7
+ /** The resource that reported, e.g. the render or a command it created. */
8
+ resource: string;
9
+ /** Server clock in nanoseconds when the transition was recorded, as a decimal string. */
10
+ timestampNs: string;
11
+ state: string;
12
+ detail: string;
13
+ reason: string;
14
+ };
15
+ /**
16
+ * A reading: reading/<namespace>/<resource>/<key> in an action context. The backend sets it asynchronously:
17
+ * of two readings of one key, the one from the transaction opened later stays.
18
+ */
19
+ export type BlockActionReading = {
20
+ namespace: string;
21
+ resource: string;
22
+ key: string;
23
+ /** Opaque bytes as UTF-8 text; the reporter owns the format. */
24
+ value: string;
25
+ };
26
+ /** One action context: the action context of one render and the renders it created. */
27
+ export type BlockActionContextNode = {
28
+ /**
29
+ * Global resource ID of this ActionContext resource itself, as a decimal string. Not the ID of the
30
+ * render it describes: that is {@link BlockActionContextNode.resource}. Pass it back to the MCP
31
+ * tool to fetch this node's subtree.
32
+ */
33
+ contextId: string;
34
+ /**
35
+ * The render the context belongs to: the resource of its first transition under namespace "render",
36
+ * which the workflow controller records when it evaluates the render.
37
+ * Undefined until that transition is applied, or on a backend without block action context reports.
38
+ */
39
+ resource?: string;
40
+ /** Context baggage: name, block-pack, block-id, run-id and so on. */
41
+ baggage: Record<string, string>;
42
+ /** In time order. */
43
+ transitions: BlockActionTransition[];
44
+ readings: BlockActionReading[];
45
+ children: BlockActionContextNode[];
46
+ };
47
+ //# sourceMappingURL=block_action_context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_action_context.d.ts","names":[],"sources":["../../src/middle_layer/block_action_context.ts"],"mappings":";;YASY;;YAGA;EACV;;EAEA;;EAEA;EACA;EACA;EACA;;;;;;YAOU;EACV;EACA;EACA;;EAEA;;;YAIU;;;;;;EAMV;;;;;;EAMA;;EAEA,SAAS;;EAET,aAAa;EACb,UAAU;EACV,UAAU"}
@@ -0,0 +1,57 @@
1
+ import { projectFieldName } from "../model/project_model.js";
2
+ import { isNullSignedResourceId, parseSignedResourceId } from "@milaboratories/pl-client";
3
+ // src/middle_layer/block_action_context.ts
4
+ const childFieldPrefix = "child/";
5
+ async function readBlockActionContextTree(pl, projectRid, blockId, mode) {
6
+ return await pl.withReadTx("readBlockActionContextTree", async (tx) => {
7
+ const project = await tx.getResourceData(projectRid, true);
8
+ const fieldName = projectFieldName(blockId, mode === "prod" ? "prodActionContext" : "stagingActionContext");
9
+ const actionContextField = project.fields.find((f) => f.name === fieldName);
10
+ if (actionContextField === void 0 || isNullSignedResourceId(actionContextField.value)) return void 0;
11
+ return await readActionContextNode(tx, actionContextField.value);
12
+ });
13
+ }
14
+ async function readActionContextNode(tx, contextRef) {
15
+ const [context, kvs] = await Promise.all([tx.getResourceData(contextRef, true), tx.listKeyValuesString(contextRef)]);
16
+ const baggage = context.data === void 0 || context.data.length === 0 ? {} : JSON.parse(Buffer.from(context.data).toString());
17
+ const transitions = [];
18
+ const readings = [];
19
+ for (const { key, value } of kvs) {
20
+ const parts = key.split("/");
21
+ if (parts[0] === "transition" && parts.length === 4) {
22
+ const parsed = JSON.parse(value);
23
+ transitions.push({
24
+ namespace: parts[1],
25
+ resource: parts[2],
26
+ timestampNs: parts[3],
27
+ state: parsed.state ?? "",
28
+ detail: parsed.detail ?? "",
29
+ reason: parsed.reason ?? ""
30
+ });
31
+ } else if (parts[0] === "reading" && parts.length === 4) readings.push({
32
+ namespace: parts[1],
33
+ resource: parts[2],
34
+ key: parts[3],
35
+ value
36
+ });
37
+ }
38
+ transitions.sort((a, b) => compareDecimal(a.timestampNs, b.timestampNs));
39
+ const childRefs = [];
40
+ for (const f of context.fields) if (f.name.startsWith(childFieldPrefix) && !isNullSignedResourceId(f.value)) childRefs.push(f.value);
41
+ const children = await Promise.all(childRefs.map((ref) => readActionContextNode(tx, ref)));
42
+ return {
43
+ contextId: String(parseSignedResourceId(contextRef).globalId),
44
+ resource: transitions.find((t) => t.namespace === "render")?.resource,
45
+ baggage,
46
+ transitions,
47
+ readings,
48
+ children
49
+ };
50
+ }
51
+ /** Compares non-negative decimal integers given as strings. */
52
+ function compareDecimal(a, b) {
53
+ return a.length !== b.length ? a.length - b.length : a < b ? -1 : a > b ? 1 : 0;
54
+ }
55
+ export { readBlockActionContextTree };
56
+
57
+ //# sourceMappingURL=block_action_context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_action_context.js","names":[],"sources":["../../src/middle_layer/block_action_context.ts"],"sourcesContent":["import type {\n KeyValueString,\n OptionalSignedResourceId,\n SignedResourceId,\n} from \"@milaboratories/pl-client\";\nimport { isNullSignedResourceId, parseSignedResourceId } from \"@milaboratories/pl-client\";\nimport { projectFieldName } from \"../model/project_model\";\n\n/** Which render of a block the action context tree belongs to. */\nexport type BlockActionContextMode = \"prod\" | \"staging\";\n\n/** An action transition: transition/<namespace>/<resource>/<ns> in an action context. */\nexport type BlockActionTransition = {\n namespace: string;\n /** The resource that reported, e.g. the render or a command it created. */\n resource: string;\n /** Server clock in nanoseconds when the transition was recorded, as a decimal string. */\n timestampNs: string;\n state: string;\n detail: string;\n reason: string;\n};\n\n/**\n * A reading: reading/<namespace>/<resource>/<key> in an action context. The backend sets it asynchronously:\n * of two readings of one key, the one from the transaction opened later stays.\n */\nexport type BlockActionReading = {\n namespace: string;\n resource: string;\n key: string;\n /** Opaque bytes as UTF-8 text; the reporter owns the format. */\n value: string;\n};\n\n/** One action context: the action context of one render and the renders it created. */\nexport type BlockActionContextNode = {\n /**\n * Global resource ID of this ActionContext resource itself, as a decimal string. Not the ID of the\n * render it describes: that is {@link BlockActionContextNode.resource}. Pass it back to the MCP\n * tool to fetch this node's subtree.\n */\n contextId: string;\n /**\n * The render the context belongs to: the resource of its first transition under namespace \"render\",\n * which the workflow controller records when it evaluates the render.\n * Undefined until that transition is applied, or on a backend without block action context reports.\n */\n resource?: string;\n /** Context baggage: name, block-pack, block-id, run-id and so on. */\n baggage: Record<string, string>;\n /** In time order. */\n transitions: BlockActionTransition[];\n readings: BlockActionReading[];\n children: BlockActionContextNode[];\n};\n\nconst childFieldPrefix = \"child/\";\n\n/**\n * Reads the action context tree of a block render: the root action context the project holds in\n * <blockId>-prodActionContext or <blockId>-stagingActionContext, and every child context under it.\n * Reads the current state in one transaction; it does not watch for changes.\n *\n * @returns undefined when the block has no action context: it was not rendered yet, or the backend\n * does not support block action context.\n */\n/**\n * The part of a read transaction the reader uses: a {@link PlTransaction} satisfies it, and a test\n * can serve it without a backend.\n */\nexport interface ActionContextReadTx {\n getResourceData(\n rId: SignedResourceId,\n loadFields: true,\n ): Promise<{\n readonly data?: Uint8Array;\n readonly fields: readonly { readonly name: string; readonly value: OptionalSignedResourceId }[];\n }>;\n listKeyValuesString(rId: SignedResourceId): Promise<KeyValueString[]>;\n}\n\n/** The part of a client the reader uses: a {@link PlClient} satisfies it. */\nexport interface ActionContextReader {\n withReadTx<T>(name: string, body: (tx: ActionContextReadTx) => Promise<T>): Promise<T>;\n}\n\nexport async function readBlockActionContextTree(\n pl: ActionContextReader,\n projectRid: SignedResourceId,\n blockId: string,\n mode: BlockActionContextMode,\n): Promise<BlockActionContextNode | undefined> {\n return await pl.withReadTx(\"readBlockActionContextTree\", async (tx) => {\n const project = await tx.getResourceData(projectRid, true);\n const fieldName = projectFieldName(\n blockId,\n mode === \"prod\" ? \"prodActionContext\" : \"stagingActionContext\",\n );\n const actionContextField = project.fields.find((f) => f.name === fieldName);\n if (actionContextField === undefined || isNullSignedResourceId(actionContextField.value))\n return undefined;\n\n return await readActionContextNode(tx, actionContextField.value);\n });\n}\n\nasync function readActionContextNode(\n tx: ActionContextReadTx,\n contextRef: SignedResourceId,\n): Promise<BlockActionContextNode> {\n const [context, kvs] = await Promise.all([\n tx.getResourceData(contextRef, true),\n tx.listKeyValuesString(contextRef),\n ]);\n\n const baggage =\n context.data === undefined || context.data.length === 0\n ? {}\n : (JSON.parse(Buffer.from(context.data).toString()) as Record<string, string>);\n\n const transitions: BlockActionTransition[] = [];\n const readings: BlockActionReading[] = [];\n for (const { key, value } of kvs) {\n const parts = key.split(\"/\");\n if (parts[0] === \"transition\" && parts.length === 4) {\n const parsed = JSON.parse(value) as { state?: string; detail?: string; reason?: string };\n transitions.push({\n namespace: parts[1],\n resource: parts[2],\n timestampNs: parts[3],\n state: parsed.state ?? \"\",\n detail: parsed.detail ?? \"\",\n reason: parsed.reason ?? \"\",\n });\n } else if (parts[0] === \"reading\" && parts.length === 4) {\n readings.push({ namespace: parts[1], resource: parts[2], key: parts[3], value });\n }\n }\n transitions.sort((a, b) => compareDecimal(a.timestampNs, b.timestampNs));\n\n const childRefs: SignedResourceId[] = [];\n for (const f of context.fields) {\n if (f.name.startsWith(childFieldPrefix) && !isNullSignedResourceId(f.value))\n childRefs.push(f.value);\n }\n const children = await Promise.all(childRefs.map((ref) => readActionContextNode(tx, ref)));\n\n return {\n contextId: String(parseSignedResourceId(contextRef).globalId),\n resource: transitions.find((t) => t.namespace === \"render\")?.resource,\n baggage,\n transitions,\n readings,\n children,\n };\n}\n\n/** Compares non-negative decimal integers given as strings. */\nfunction compareDecimal(a: string, b: string): number {\n return a.length !== b.length ? a.length - b.length : a < b ? -1 : a > b ? 1 : 0;\n}\n"],"mappings":";;;AAyDA,MAAM,mBAAmB;AA8BzB,eAAsB,2BACpB,IACA,YACA,SACA,MAC6C;CAC7C,OAAO,MAAM,GAAG,WAAW,8BAA8B,OAAO,OAAO;EACrE,MAAM,UAAU,MAAM,GAAG,gBAAgB,YAAY,IAAI;EACzD,MAAM,YAAY,iBAChB,SACA,SAAS,SAAS,sBAAsB,sBAC1C;EACA,MAAM,qBAAqB,QAAQ,OAAO,MAAM,MAAM,EAAE,SAAS,SAAS;EAC1E,IAAI,uBAAuB,KAAA,KAAa,uBAAuB,mBAAmB,KAAK,GACrF,OAAO,KAAA;EAET,OAAO,MAAM,sBAAsB,IAAI,mBAAmB,KAAK;CACjE,CAAC;AACH;AAEA,eAAe,sBACb,IACA,YACiC;CACjC,MAAM,CAAC,SAAS,OAAO,MAAM,QAAQ,IAAI,CACvC,GAAG,gBAAgB,YAAY,IAAI,GACnC,GAAG,oBAAoB,UAAU,CACnC,CAAC;CAED,MAAM,UACJ,QAAQ,SAAS,KAAA,KAAa,QAAQ,KAAK,WAAW,IAClD,CAAC,IACA,KAAK,MAAM,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;CAEtD,MAAM,cAAuC,CAAC;CAC9C,MAAM,WAAiC,CAAC;CACxC,KAAK,MAAM,EAAE,KAAK,WAAW,KAAK;EAChC,MAAM,QAAQ,IAAI,MAAM,GAAG;EAC3B,IAAI,MAAM,OAAO,gBAAgB,MAAM,WAAW,GAAG;GACnD,MAAM,SAAS,KAAK,MAAM,KAAK;GAC/B,YAAY,KAAK;IACf,WAAW,MAAM;IACjB,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,OAAO,OAAO,SAAS;IACvB,QAAQ,OAAO,UAAU;IACzB,QAAQ,OAAO,UAAU;GAC3B,CAAC;EACH,OAAO,IAAI,MAAM,OAAO,aAAa,MAAM,WAAW,GACpD,SAAS,KAAK;GAAE,WAAW,MAAM;GAAI,UAAU,MAAM;GAAI,KAAK,MAAM;GAAI;EAAM,CAAC;CAEnF;CACA,YAAY,MAAM,GAAG,MAAM,eAAe,EAAE,aAAa,EAAE,WAAW,CAAC;CAEvE,MAAM,YAAgC,CAAC;CACvC,KAAK,MAAM,KAAK,QAAQ,QACtB,IAAI,EAAE,KAAK,WAAW,gBAAgB,KAAK,CAAC,uBAAuB,EAAE,KAAK,GACxE,UAAU,KAAK,EAAE,KAAK;CAE1B,MAAM,WAAW,MAAM,QAAQ,IAAI,UAAU,KAAK,QAAQ,sBAAsB,IAAI,GAAG,CAAC,CAAC;CAEzF,OAAO;EACL,WAAW,OAAO,sBAAsB,UAAU,CAAC,CAAC,QAAQ;EAC5D,UAAU,YAAY,MAAM,MAAM,EAAE,cAAc,QAAQ,CAAC,EAAE;EAC7D;EACA;EACA;EACA;CACF;AACF;;AAGA,SAAS,eAAe,GAAW,GAAmB;CACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAChF"}
@@ -1,7 +1,7 @@
1
1
  // src/middle_layer/build_stamp.ts
2
2
  function injectedStamp() {
3
3
  try {
4
- return "b9a3db4cb3c2-dirty-1793804477626";
4
+ return "082d6d37cf86-dirty-1793815175256";
5
5
  } catch {
6
6
  return;
7
7
  }
@@ -1,7 +1,7 @@
1
1
  // src/middle_layer/build_stamp.ts
2
2
  function injectedStamp() {
3
3
  try {
4
- return "b9a3db4cb3c2-dirty-1793804477603";
4
+ return "082d6d37cf86-dirty-1793815175234";
5
5
  } catch {
6
6
  return;
7
7
  }
@@ -1,10 +1,11 @@
1
1
  import { CreateProjectFromTemplateOutcome, SaveProjectAsTemplateOutcome, StoredTemplateData, TemplateId, TemplateListEntry, TemplatesField } from "./template_list.js";
2
2
  import { FoldersField, FoldersListing, FoldersProjectEntry, FoldersResourceType, FoldersTemplateEntry } from "./folders.js";
3
3
  import { AvailableShare, EnvelopeFolderSummary, OutgoingShare } from "./sharing_list.js";
4
+ import { BlockActionContextMode, BlockActionContextNode, BlockActionReading, BlockActionTransition } from "./block_action_context.js";
4
5
  import { Project } from "./project.js";
5
6
  import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./ops.js";
6
7
  import { MiddleLayerDriverKit, initDriverKit } from "./driver_kit.js";
7
8
  import { TreeSnapshotMiss, TreeSnapshotStat } from "./tree_snapshot_store.js";
8
9
  import { MiddleLayer } from "./middle_layer.js";
9
10
  import { ProjectsField, ProjectsResourceType } from "./project_list.js";
10
- export { type AvailableShare, type CreateProjectFromTemplateOutcome, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, type EnvelopeFolderSummary, FoldersField, type FoldersListing, type FoldersProjectEntry, FoldersResourceType, type FoldersTemplateEntry, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, Project, ProjectsField, ProjectsResourceType, type SaveProjectAsTemplateOutcome, type StoredTemplateData, type TemplateId, type TemplateListEntry, TemplatesField, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, initDriverKit };
11
+ export { type AvailableShare, type BlockActionContextMode, type BlockActionContextNode, type BlockActionReading, type BlockActionTransition, type CreateProjectFromTemplateOutcome, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, type EnvelopeFolderSummary, FoldersField, type FoldersListing, type FoldersProjectEntry, FoldersResourceType, type FoldersTemplateEntry, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, Project, ProjectsField, ProjectsResourceType, type SaveProjectAsTemplateOutcome, type StoredTemplateData, type TemplateId, type TemplateListEntry, TemplatesField, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, initDriverKit };
@@ -7,6 +7,7 @@ const require_project_overview = require("./project_overview.cjs");
7
7
  const require_column_links = require("./column_links.cjs");
8
8
  const require_frontend_path = require("./frontend_path.cjs");
9
9
  const require_block = require("./block.cjs");
10
+ const require_block_action_context = require("./block_action_context.cjs");
10
11
  const require_active_cfg = require("./active_cfg.cjs");
11
12
  const require_navigation_states = require("./navigation_states.cjs");
12
13
  const require_project_overview_light = require("./project_overview_light.cjs");
@@ -538,6 +539,13 @@ var Project = class Project {
538
539
  * Returns a computable, that can be used to retrieve and watch full block state,
539
540
  * including outputs, arguments, ui state.
540
541
  * */
542
+ /**
543
+ * Reads the block action context tree of a block render (see readBlockActionContextTree): current state, not
544
+ * watched. Undefined when the block has no action context.
545
+ */
546
+ async getBlockActionContext(blockId, mode = "prod") {
547
+ return await require_block_action_context.readBlockActionContextTree(this.env.pl, this.rid, blockId, mode);
548
+ }
541
549
  getBlockState(blockId) {
542
550
  return this.getBlockComputables(blockId).fullState;
543
551
  }