@milaboratories/pl-middle-layer 1.67.5 → 1.68.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 (106) hide show
  1. package/dist/block_registry/registry-v2-provider.d.ts +1 -3
  2. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
  3. package/dist/block_registry/registry.d.ts +5 -9
  4. package/dist/block_registry/registry.d.ts.map +1 -1
  5. package/dist/block_registry/template_provider.d.ts +3 -5
  6. package/dist/block_registry/template_provider.d.ts.map +1 -1
  7. package/dist/block_registry/watcher.d.ts +4 -6
  8. package/dist/block_registry/watcher.d.ts.map +1 -1
  9. package/dist/block_registry/well_known_registries.d.ts +3 -5
  10. package/dist/block_registry/well_known_registries.d.ts.map +1 -1
  11. package/dist/index.d.ts +6 -2
  12. package/dist/middle_layer/build_stamp.cjs +34 -0
  13. package/dist/middle_layer/build_stamp.cjs.map +1 -0
  14. package/dist/middle_layer/build_stamp.js +34 -0
  15. package/dist/middle_layer/build_stamp.js.map +1 -0
  16. package/dist/middle_layer/driver_kit.d.ts +3 -4
  17. package/dist/middle_layer/driver_kit.d.ts.map +1 -1
  18. package/dist/middle_layer/index.d.ts +3 -2
  19. package/dist/middle_layer/middle_layer.cjs +48 -0
  20. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  21. package/dist/middle_layer/middle_layer.d.ts +23 -4
  22. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  23. package/dist/middle_layer/middle_layer.js +48 -0
  24. package/dist/middle_layer/middle_layer.js.map +1 -1
  25. package/dist/middle_layer/ops.cjs +8 -2
  26. package/dist/middle_layer/ops.cjs.map +1 -1
  27. package/dist/middle_layer/ops.d.ts +70 -26
  28. package/dist/middle_layer/ops.d.ts.map +1 -1
  29. package/dist/middle_layer/ops.js +8 -2
  30. package/dist/middle_layer/ops.js.map +1 -1
  31. package/dist/middle_layer/project.cjs +163 -8
  32. package/dist/middle_layer/project.cjs.map +1 -1
  33. package/dist/middle_layer/project.d.ts +56 -7
  34. package/dist/middle_layer/project.d.ts.map +1 -1
  35. package/dist/middle_layer/project.js +165 -11
  36. package/dist/middle_layer/project.js.map +1 -1
  37. package/dist/middle_layer/project_list.d.ts +5 -3
  38. package/dist/middle_layer/project_list.d.ts.map +1 -1
  39. package/dist/middle_layer/sharing_list.d.ts +3 -4
  40. package/dist/middle_layer/sharing_list.d.ts.map +1 -1
  41. package/dist/middle_layer/tree_snapshot_store.cjs +283 -0
  42. package/dist/middle_layer/tree_snapshot_store.cjs.map +1 -0
  43. package/dist/middle_layer/tree_snapshot_store.d.ts +143 -0
  44. package/dist/middle_layer/tree_snapshot_store.d.ts.map +1 -0
  45. package/dist/middle_layer/tree_snapshot_store.js +280 -0
  46. package/dist/middle_layer/tree_snapshot_store.js.map +1 -0
  47. package/dist/middle_layer/types.d.ts +1 -3
  48. package/dist/middle_layer/types.d.ts.map +1 -1
  49. package/dist/model/block_pack_spec.d.ts +13 -15
  50. package/dist/model/block_pack_spec.d.ts.map +1 -1
  51. package/dist/model/frontend.d.ts +1 -2
  52. package/dist/model/frontend.d.ts.map +1 -1
  53. package/dist/model/project_helper.d.ts +2 -4
  54. package/dist/model/project_helper.d.ts.map +1 -1
  55. package/dist/model/project_model.d.ts +12 -12
  56. package/dist/model/project_model.d.ts.map +1 -1
  57. package/dist/model/sharing_model.d.ts +24 -26
  58. package/dist/model/sharing_model.d.ts.map +1 -1
  59. package/dist/model/template_apply.d.ts +9 -8
  60. package/dist/model/template_apply.d.ts.map +1 -1
  61. package/dist/model/template_export.d.ts +2 -2
  62. package/dist/model/template_export.d.ts.map +1 -1
  63. package/dist/model/template_parser.d.ts +2 -4
  64. package/dist/model/template_parser.d.ts.map +1 -1
  65. package/dist/model/template_resolve.d.ts +10 -11
  66. package/dist/model/template_resolve.d.ts.map +1 -1
  67. package/dist/model/template_serializer.d.ts +6 -5
  68. package/dist/model/template_serializer.d.ts.map +1 -1
  69. package/dist/model/template_spec.d.ts +7 -9
  70. package/dist/model/template_spec.d.ts.map +1 -1
  71. package/dist/mutator/block-pack/block_pack.d.ts +2 -3
  72. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  73. package/dist/mutator/project.cjs +20 -3
  74. package/dist/mutator/project.cjs.map +1 -1
  75. package/dist/mutator/project.d.ts +4 -3
  76. package/dist/mutator/project.d.ts.map +1 -1
  77. package/dist/mutator/project.js +20 -3
  78. package/dist/mutator/project.js.map +1 -1
  79. package/dist/mutator/template/render_template.d.ts +1 -3
  80. package/dist/mutator/template/render_template.d.ts.map +1 -1
  81. package/dist/mutator/template/template_cache.d.ts +15 -16
  82. package/dist/mutator/template/template_cache.d.ts.map +1 -1
  83. package/dist/mutator/template/template_loading.d.ts +10 -12
  84. package/dist/mutator/template/template_loading.d.ts.map +1 -1
  85. package/dist/network_check/network_check.d.ts +3 -5
  86. package/dist/network_check/network_check.d.ts.map +1 -1
  87. package/dist/pool/data.d.ts +2 -4
  88. package/dist/pool/data.d.ts.map +1 -1
  89. package/dist/pool/driver.d.ts +6 -6
  90. package/dist/pool/driver.d.ts.map +1 -1
  91. package/dist/pool/index.d.ts +1 -0
  92. package/dist/pool/p_object_collection.d.ts +1 -3
  93. package/dist/pool/p_object_collection.d.ts.map +1 -1
  94. package/dist/pool/result_pool.d.ts +3 -1
  95. package/dist/worker/worker.d.ts +1 -1
  96. package/package.json +14 -14
  97. package/src/middle_layer/build_stamp.ts +36 -0
  98. package/src/middle_layer/index.ts +1 -0
  99. package/src/middle_layer/middle_layer.ts +77 -0
  100. package/src/middle_layer/ops.ts +46 -1
  101. package/src/middle_layer/project.ts +234 -14
  102. package/src/middle_layer/project_failsafe.test.ts +47 -0
  103. package/src/middle_layer/tree_snapshot_scenarios.test.ts +337 -0
  104. package/src/middle_layer/tree_snapshot_store.test.ts +331 -0
  105. package/src/middle_layer/tree_snapshot_store.ts +419 -0
  106. package/src/mutator/project.ts +27 -5
@@ -1,13 +1,11 @@
1
1
  import { Dispatcher } from "undici";
2
2
  import { RegistryV2Reader } from "@platforma-sdk/block-tools";
3
-
4
3
  //#region src/block_registry/registry-v2-provider.d.ts
5
- declare class V2RegistryProvider {
4
+ export declare class V2RegistryProvider {
6
5
  private readonly http;
7
6
  private readonly registries;
8
7
  constructor(http: Dispatcher);
9
8
  getRegistry(url: string): RegistryV2Reader;
10
9
  }
11
10
  //#endregion
12
- export { V2RegistryProvider };
13
11
  //# sourceMappingURL=registry-v2-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-v2-provider.d.ts","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"mappings":";;;;cAGa,kBAAA;EAAA,iBAGkB,IAAA;EAAA,iBAFZ,UAAA;cAEY,IAAA,EAAM,UAAA;EAE5B,WAAA,CAAY,GAAA,WAAc,gBAAgB;AAAA"}
1
+ {"version":3,"file":"registry-v2-provider.d.ts","names":[],"sources":["../../src/block_registry/registry-v2-provider.ts"],"mappings":";;;qBAGa;mBAGkB;mBAFZ;EAEjB,YAA6B,MAAM;EAE5B,YAAY,cAAc"}
@@ -3,17 +3,16 @@ import { BlockPackFromRegistryV2, BlockPackId, BlockPackListing, RegistryEntry,
3
3
  import { Dispatcher } from "undici";
4
4
  import { BlockPackDescriptionAbsolute } from "@platforma-sdk/block-tools";
5
5
  import { BlockKindReference } from "@milaboratories/pl-model-common";
6
-
7
6
  //#region src/block_registry/registry.d.ts
8
- declare function getDevV1PacketMtime(devPath: string): Promise<string>;
9
- declare function getDevV2PacketMtime(description: BlockPackDescriptionAbsolute): Promise<string>;
7
+ export declare function getDevV1PacketMtime(devPath: string): Promise<string>;
8
+ export declare function getDevV2PacketMtime(description: BlockPackDescriptionAbsolute): Promise<string>;
10
9
  /** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
11
10
  * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
12
11
  * prepare (which bakes the result into the spec) and the update watcher (which
13
12
  * recomputes it to diff against the stored value) — divergence makes the block
14
13
  * flap perpetually "update available". */
15
- declare function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string>;
16
- declare class BlockPackRegistry {
14
+ export declare function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string>;
15
+ export declare class BlockPackRegistry {
17
16
  private readonly v2Provider;
18
17
  private readonly registries;
19
18
  private readonly http?;
@@ -30,12 +29,9 @@ declare class BlockPackRegistry {
30
29
  * delegate to the reader's pure-core-backed `resolveKind`. All version-math
31
30
  * lives in `@platforma-sdk/block-tools` (no backend involvement).
32
31
  */
33
- resolveKind(registryId: string, ref: BlockKindReference, {
34
- allowUnstable
35
- }: {
32
+ resolveKind(registryId: string, ref: BlockKindReference, { allowUnstable }: {
36
33
  allowUnstable: boolean;
37
34
  }): Promise<BlockPackFromRegistryV2>;
38
35
  }
39
36
  //#endregion
40
- export { BlockPackRegistry, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime };
41
37
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;;iBA8CsB,mBAAA,CAAoB,OAAA,WAAkB,OAAO;AAAA,iBAW7C,mBAAA,CACpB,WAAA,EAAa,4BAAA,GACZ,OAAO;AAbV;;;;AAAmE;AAAnE,iBA0BsB,kBAAA,CAAmB,OAAA,UAAiB,SAAA,WAAoB,OAAO;AAAA,cAcxE,iBAAA;EAAA,iBAEQ,UAAA;EAAA,iBACA,UAAA;EAAA,iBACA,IAAA;cAFA,UAAA,EAAY,kBAAA,EACZ,UAAA,EAAY,aAAA,IACZ,IAAA,GAAO,UAAA;EAAA,QAGZ,kBAAA;EA4LD,cAAA,CAAe,OAAA;IAAY,MAAA,GAAS,WAAA;EAAA,IAAgB,OAAA,CAAQ,gBAAA;EAU5D,WAAA,CACX,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,WACC,OAAA,CAAQ,uBAAA;;;;;;;AA/NwE;EAiPtE,WAAA,CACX,UAAA,UACA,GAAA,EAAK,kBAAA;IACH;EAAA;IAAmB,aAAA;EAAA,IACpB,OAAA,CAAQ,uBAAA;AAAA"}
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;wBA8CsB,oBAAoB,kBAAkB;wBAWtC,oBACpB,aAAa,+BACZ;;;;;;wBAamB,mBAAmB,iBAAiB,oBAAoB;qBAcjE;mBAEQ;mBACA;mBACA;EAHnB,YACmB,YAAY,oBACZ,YAAY,iBACZ,OAAO;UAGZ;EA4LD,eAAe;IAAY,SAAS;MAAgB,QAAQ;EAU5D,YACX,oBACA,SAAS,aACT,kBACC,QAAQ;;;;;;;;EAkBE,YACX,oBACA,KAAK,sBACH;IAAmB;MACpB,QAAQ"}
@@ -2,7 +2,6 @@ import { BlockPackProvider } from "../model/template_resolve.js";
2
2
  import { BlockPackFromRegistryV2, BlockPackId, RegistryEntry, SingleBlockPackOverview } from "@milaboratories/pl-model-middle-layer";
3
3
  import { MiLogger } from "@milaboratories/ts-helpers";
4
4
  import { BlockKindReference } from "@milaboratories/pl-model-common";
5
-
6
5
  //#region src/block_registry/template_provider.d.ts
7
6
  /**
8
7
  * The part of {@link BlockPackRegistry} a template's provider uses.
@@ -11,7 +10,7 @@ import { BlockKindReference } from "@milaboratories/pl-model-common";
11
10
  * configured environment — and so it is obvious that these two calls are the entire
12
11
  * dependency.
13
12
  */
14
- type KindAwareRegistry = {
13
+ export type KindAwareRegistry = {
15
14
  resolveKind: (registryId: string, ref: BlockKindReference, options: {
16
15
  allowUnstable: boolean;
17
16
  }) => Promise<BlockPackFromRegistryV2>;
@@ -32,7 +31,7 @@ type KindAwareRegistry = {
32
31
  * registries — with the search stopping at the first hit, the earlier registry is
33
32
  * simply the answer.
34
33
  */
35
- declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): string[];
34
+ export declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): string[];
36
35
  /**
37
36
  * A {@link BlockPackProvider} over the configured block registries.
38
37
  *
@@ -52,11 +51,10 @@ declare function kindCapableRegistryIds(entries: readonly RegistryEntry[]): stri
52
51
  * fallback to the next registry has to swallow the reason; this is the only place it
53
52
  * survives
54
53
  */
55
- declare function templateBlockPackProvider(deps: {
54
+ export declare function templateBlockPackProvider(deps: {
56
55
  readonly registry: KindAwareRegistry;
57
56
  readonly registryIds: readonly string[];
58
57
  readonly logger: MiLogger;
59
58
  }): BlockPackProvider;
60
59
  //#endregion
61
- export { KindAwareRegistry, kindCapableRegistryIds, templateBlockPackProvider };
62
60
  //# sourceMappingURL=template_provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template_provider.d.ts","names":[],"sources":["../../src/block_registry/template_provider.ts"],"mappings":";;;;;;;;AAqBA;;;;;KAAY,iBAAA;EACV,WAAA,GACE,UAAA,UACA,GAAA,EAAK,kBAAA,EACL,OAAA;IAAW,aAAA;EAAA,MACR,OAAA,CAAQ,uBAAA;EACb,WAAA,GACE,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,aACG,OAAA,CAAQ,uBAAA;AAAA;;;;;;;;;;;;;;;;iBAkBC,sBAAA,CAAuB,OAAiC,WAAf,aAAa;AAlBhC;AAkBtC;;;;AAAwE;AAuBxE;;;;;;;;;;;;;AAzCsC,iBAyCtB,yBAAA,CAA0B,IAAA;EAAA,SAC/B,QAAA,EAAU,iBAAA;EAAA,SACV,WAAA;EAAA,SACA,MAAA,EAAQ,QAAA;AAAA,IACf,iBAAA"}
1
+ {"version":3,"file":"template_provider.d.ts","names":[],"sources":["../../src/block_registry/template_provider.ts"],"mappings":";;;;;;;;;;;;YAqBY;EACV,cACE,oBACA,KAAK,oBACL;IAAW;QACR,QAAQ;EACb,cACE,oBACA,SAAS,aACT,oBACG,QAAQ;;;;;;;;;;;;;;;;;wBAkBC,uBAAuB,kBAAkB;;;;;;;;;;;;;;;;;;;;wBAuBzC,0BAA0B;WAC/B,UAAU;WACV;WACA,QAAQ;IACf"}
@@ -3,21 +3,20 @@ import { BlockPackSpec, BlockSettings, UpdateSuggestions } from "@milaboratories
3
3
  import { Dispatcher } from "undici";
4
4
  import { MiLogger } from "@milaboratories/ts-helpers";
5
5
  import { PollComputablePool, PollPoolOps } from "@milaboratories/computable";
6
-
7
6
  //#region src/block_registry/watcher.d.ts
8
- type BlockUpdateWatcherOps = Partial<PollPoolOps> & {
7
+ export type BlockUpdateWatcherOps = Partial<PollPoolOps> & {
9
8
  readonly http?: Dispatcher;
10
9
  readonly preferredUpdateChannel?: string;
11
10
  };
12
- type CheckForUpdateRequest = {
11
+ export type CheckForUpdateRequest = {
13
12
  currentSpec: BlockPackSpec;
14
13
  settings: BlockSettings;
15
14
  };
16
- type CheckForUpdateResponse = {
15
+ export type CheckForUpdateResponse = {
17
16
  suggestions: UpdateSuggestions;
18
17
  mainSuggestion?: BlockPackSpec;
19
18
  };
20
- declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateRequest, CheckForUpdateResponse> {
19
+ export declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateRequest, CheckForUpdateResponse> {
21
20
  private readonly registryProvider;
22
21
  private readonly http?;
23
22
  private readonly preferredUpdateChannel?;
@@ -27,5 +26,4 @@ declare class BlockUpdateWatcher extends PollComputablePool<CheckForUpdateReques
27
26
  protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean;
28
27
  }
29
28
  //#endregion
30
- export { BlockUpdateWatcher, BlockUpdateWatcherOps, CheckForUpdateRequest, CheckForUpdateResponse };
31
29
  //# sourceMappingURL=watcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":";;;;;;;KA6BY,qBAAA,GAAwB,OAAA,CAAQ,WAAA;EAAA,SACjC,IAAA,GAAO,UAAA;EAAA,SACP,sBAAA;AAAA;AAAA,KAKC,qBAAA;EACV,WAAA,EAAa,aAAA;EACb,QAAA,EAAU,aAAa;AAAA;AAAA,KAGb,sBAAA;EACV,WAAA,EAAa,iBAAA;EACb,cAAA,GAAiB,aAAa;AAAA;AAAA,cAGnB,kBAAA,SAA2B,kBAAA,CACtC,qBAAA,EACA,sBAAA;EAAA,iBAMmB,gBAAA;EAAA,iBAJF,IAAA;EAAA,iBACA,sBAAA;cAGE,gBAAA,EAAkB,kBAAA,EACnC,MAAA,EAAQ,QAAA,EACR,GAAA,GAAK,qBAAA;EAAA,UAOG,MAAA,CAAO,GAAA,EAAK,qBAAA;EAAA,UAeN,SAAA,CAAU,GAAA,EAAK,qBAAA,GAAwB,OAAA,CAAQ,sBAAA;EAAA,UAgIrD,YAAA,CAAa,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,sBAAA;AAAA"}
1
+ {"version":3,"file":"watcher.d.ts","names":[],"sources":["../../src/block_registry/watcher.ts"],"mappings":";;;;;;YA6BY,wBAAwB,QAAQ;WACjC,OAAO;WACP;;YAKC;EACV,aAAa;EACb,UAAU;;YAGA;EACV,aAAa;EACb,iBAAiB;;qBAGN,2BAA2B,mBACtC,uBACA;mBAMmB;mBAJF;mBACA;EAEjB,YACmB,kBAAkB,oBACnC,QAAQ,UACR,MAAK;YAOG,OAAO,KAAK;YAeN,UAAU,KAAK,wBAAwB,QAAQ;YAgIrD,aAAa,MAAM,wBAAwB,MAAM"}
@@ -1,9 +1,7 @@
1
1
  import { RegistrySpec } from "@milaboratories/pl-model-middle-layer";
2
-
3
2
  //#region src/block_registry/well_known_registries.d.ts
4
- declare const CentralBlockRegistry: RegistrySpec;
5
- declare const V1CentralRegistry: RegistrySpec;
6
- declare const V1CentralDevSnapshotRegistry: RegistrySpec;
3
+ export declare const CentralBlockRegistry: RegistrySpec;
4
+ export declare const V1CentralRegistry: RegistrySpec;
5
+ export declare const V1CentralDevSnapshotRegistry: RegistrySpec;
7
6
  //#endregion
8
- export { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry };
9
7
  //# sourceMappingURL=well_known_registries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"well_known_registries.d.ts","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"mappings":";;;cAEa,oBAAA,EAAsB,YAGlC;AAAA,cAEY,iBAAA,EAAmB,YAG/B;AAAA,cAEY,4BAAA,EAA8B,YAG1C"}
1
+ {"version":3,"file":"well_known_registries.d.ts","names":[],"sources":["../../src/block_registry/well_known_registries.ts"],"mappings":";;qBAEa,sBAAsB;qBAKtB,mBAAmB;qBAKnB,8BAA8B"}
package/dist/index.d.ts CHANGED
@@ -4,17 +4,21 @@ import { CentralBlockRegistry, V1CentralDevSnapshotRegistry, V1CentralRegistry }
4
4
  import { AppliedEntry, TemplateApplyProblem, TemplateApplyReport, TemplateEntryRejected } from "./model/template_apply.js";
5
5
  import { BlockPackProvider, ExactResolution, KindResolution, ResolvedEntry, TemplateResolveOutcome, parseBlockPackName, resolveTemplateEntries } from "./model/template_resolve.js";
6
6
  import { KindAwareRegistry, kindCapableRegistryIds, templateBlockPackProvider } from "./block_registry/template_provider.js";
7
+ import "./block_registry/index.js";
7
8
  import { BlockArgsAuthorKeyPrefix, ProjectCreatedTimestamp, ProjectField, ProjectId, ProjectLastModifiedTimestamp, ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, SchemaVersionCurrent, SchemaVersionKey } from "./model/project_model.js";
8
9
  import { AcceptanceFieldPrefix, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, ProjectChangeAction, ProjectFieldUuid, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, acceptanceField, acceptanceFieldLogin, asShareId, canGrantToEveryone, canImpersonate, decisionField, decodeEnvelopeData, isAcceptanceField, newShareId } from "./model/sharing_model.js";
9
10
  import { OutgoingShare, PendingShare } from "./middle_layer/sharing_list.js";
10
11
  import { CachedTemplate, ExplicitTemplate, PreparedTemplate, TemplateFromFile, TemplateFromRegistry, TemplateSpecAny, TemplateSpecPrepared } from "./model/template_spec.js";
11
12
  import { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec } from "./model/block_pack_spec.js";
12
13
  import { TemplateParseOutcome, parseProjectTemplateV1Yaml } from "./model/template_parser.js";
14
+ import "./model/index.js";
13
15
  import { Project } from "./middle_layer/project.js";
14
- import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings } from "./middle_layer/ops.js";
16
+ import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./middle_layer/ops.js";
15
17
  import { MiddleLayerDriverKit, initDriverKit } from "./middle_layer/driver_kit.js";
18
+ import { TreeSnapshotMiss, TreeSnapshotStat } from "./middle_layer/tree_snapshot_store.js";
16
19
  import { MiddleLayer } from "./middle_layer/middle_layer.js";
17
20
  import { ProjectsField } from "./middle_layer/project_list.js";
21
+ import "./middle_layer/index.js";
18
22
  import { CheckNetworkOpts, checkNetwork, initNetworkCheck } from "./network_check/network_check.js";
19
23
  import { TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, loadTemplate, prepareTemplateSpec } from "./mutator/template/template_loading.js";
20
24
  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";
@@ -28,4 +32,4 @@ export * from "@platforma-sdk/model";
28
32
  export * from "@milaboratories/pl-model-middle-layer";
29
33
  export * from "@milaboratories/pl-deployments";
30
34
  export * from "@milaboratories/pl-client";
31
- export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, AcceptanceFieldPrefix, type AppliedEntry, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, type ExactResolution, ExplicitTemplate, type FieldType, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, PreparedTemplate, Project, ProjectChangeAction, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, type ResolvedEntry, type ResourceType, SchemaVersionCurrent, SchemaVersionKey, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, TemplateFromFile, TemplateFromRegistry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, acceptanceField, acceptanceFieldLogin, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decisionField, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isAcceptanceField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, newShareId, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, templateBlockPackProvider };
35
+ export { ACCESS_COUNT_KEY, ACCESS_KEY_PREFIX, AcceptanceFieldPrefix, type AppliedEntry, BlockArgsAuthorKeyPrefix, BlockPackExplicit, type BlockPackProvider, BlockPackRegistry, BlockPackSpecAny, BlockPackSpecPrepared, CachedTemplate, CentralBlockRegistry, CheckNetworkOpts, DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, EnvelopeAcceptance, EnvelopeData, EnvelopeMode, EnvelopeProject, type ExactResolution, ExplicitTemplate, type FieldType, FrontendFromFolder, FrontendFromFolderData, FrontendFromFolderResourceType, FrontendFromLocalTgz, FrontendFromLocalTgzData, FrontendFromLocalTgzResourceType, FrontendFromUrl, FrontendFromUrlData, FrontendFromUrlResourceType, FrontendSpec, GC_ACCESS_THRESHOLD, GC_MAX_ENTRIES, type InternalLsDriver, KindAwareRegistry, type KindResolution, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, PreparedTemplate, Project, ProjectChangeAction, ProjectCreatedTimestamp, type ProjectField, ProjectFieldUuid, type ProjectId, ProjectLastModifiedTimestamp, type ProjectListEntry, ProjectMetaKey, ProjectResourceType, ProjectStructureAuthorKey, ProjectStructureKey, ProjectsField, type ResolvedEntry, type ResourceType, SchemaVersionCurrent, SchemaVersionKey, ShareId, ShareProjectsOptions, SharedEnvelopeResourceType, SharingDecision, SharingOutboxField, SharingOutboxResourceType, SharingStateField, SharingStateResourceType, type TemplateApplyProblem, type TemplateApplyReport, TemplateCacheFieldName, TemplateCacheStat, TemplateCacheType, TemplateEntryRejected, TemplateFromFile, TemplateFromRegistry, type TemplateParseOutcome, type TemplateResolveOutcome, TemplateSpecAny, TemplateSpecPrepared, TengoTemplateGet, TengoTemplateGetRegistry, TengoTemplateGetTemplate, TengoTemplateGetTemplateURI, TengoTemplatePack, TengoTemplatePackConvert, TengoTemplatePackConvertTemplate, TengoTemplatePackConvertTemplatePack, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, V1CentralDevSnapshotRegistry, V1CentralRegistry, V2RegistryProvider, acceptanceField, acceptanceFieldLogin, asShareId, cacheBlockPackTemplate, canGrantToEveryone, canImpersonate, checkNetwork, createRenderTemplate, decisionField, decodeEnvelopeData, deriveGlobalPObjectId, deriveLocalPObjectId, dropTemplateCache, duplicateProject, flattenTemplateTree, getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime, getOrCreateTemplateCache, initDriverKit, initNetworkCheck, invalidateTemplateCacheId, isAcceptanceField, kindCapableRegistryIds, loadTemplate, loadTemplateCached, newShareId, parseBlockPackName, parseFinalPObjectCollection, parseProjectTemplateV1Yaml, prepareTemplateSpec, resolveTemplateEntries, runGc, templateBlockPackProvider };
@@ -0,0 +1,34 @@
1
+ //#region src/middle_layer/build_stamp.ts
2
+ function injectedStamp() {
3
+ try {
4
+ return "48a74953f8cd-dirty-1787671552027";
5
+ } catch {
6
+ return;
7
+ }
8
+ }
9
+ /**
10
+ * Identifies the build of this package, and through it the rules that shape what a persisted
11
+ * tree mirror contains: the pruning function, the field filter and the traversal stop rules,
12
+ * all of which live in this package. (The finality predicate comes from pl-client and is NOT
13
+ * covered, which is harmless: finality is recomputed on restore, so it is the one rule that
14
+ * cannot poison a stored file.)
15
+ *
16
+ * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing
17
+ * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts
18
+ * of an installed version. A build from a dirty worktree includes the build time, so editing
19
+ * those rules locally can never hit a snapshot written under the old ones. In practice release
20
+ * builds are dirty too, because CI writes version bumps into the worktree before building; that
21
+ * costs nothing, since the stamp only has to be stable within an artifact.
22
+ *
23
+ * With no build at all (sources mode) the value is a constant. That deliberately trades away
24
+ * the dirty-worktree guarantee: it means someone running from sources exercises the restore
25
+ * path at all, rather than every snapshot being a guaranteed miss for the one audience most
26
+ * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources
27
+ * and hitting a mirror written under the old ones, is the local-development gap the design
28
+ * already accepts, and `treeSnapshots: false` or deleting the directory clears it.
29
+ */
30
+ const ML_BUILD_STAMP = injectedStamp() ?? "sources";
31
+ //#endregion
32
+ exports.ML_BUILD_STAMP = ML_BUILD_STAMP;
33
+
34
+ //# sourceMappingURL=build_stamp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_stamp.cjs","names":[],"sources":["../../src/middle_layer/build_stamp.ts"],"sourcesContent":["/** Injected by rolldown at build time, see `build.node.config.js`. Absent when the package is\n * consumed straight from sources (`USE_SOURCES=1`), because no build step runs then. */\ndeclare const __PL_ML_BUILD_STAMP__: string | undefined;\n\nfunction injectedStamp(): string | undefined {\n try {\n // Read inside a try: with no build step the identifier is an undeclared global, and\n // reading it throws a ReferenceError rather than yielding undefined.\n return __PL_ML_BUILD_STAMP__;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Identifies the build of this package, and through it the rules that shape what a persisted\n * tree mirror contains: the pruning function, the field filter and the traversal stop rules,\n * all of which live in this package. (The finality predicate comes from pl-client and is NOT\n * covered, which is harmless: finality is recomputed on restore, so it is the one rule that\n * cannot poison a stored file.)\n *\n * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing\n * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts\n * of an installed version. A build from a dirty worktree includes the build time, so editing\n * those rules locally can never hit a snapshot written under the old ones. In practice release\n * builds are dirty too, because CI writes version bumps into the worktree before building; that\n * costs nothing, since the stamp only has to be stable within an artifact.\n *\n * With no build at all (sources mode) the value is a constant. That deliberately trades away\n * the dirty-worktree guarantee: it means someone running from sources exercises the restore\n * path at all, rather than every snapshot being a guaranteed miss for the one audience most\n * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources\n * and hitting a mirror written under the old ones, is the local-development gap the design\n * already accepts, and `treeSnapshots: false` or deleting the directory clears it.\n */\nexport const ML_BUILD_STAMP: string = injectedStamp() ?? \"sources\";\n"],"mappings":";AAIA,SAAS,gBAAoC;CAC3C,IAAI;EAGF,OAAA;CACF,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAyB,cAAc,KAAK"}
@@ -0,0 +1,34 @@
1
+ //#region src/middle_layer/build_stamp.ts
2
+ function injectedStamp() {
3
+ try {
4
+ return "48a74953f8cd-dirty-1787671551997";
5
+ } catch {
6
+ return;
7
+ }
8
+ }
9
+ /**
10
+ * Identifies the build of this package, and through it the rules that shape what a persisted
11
+ * tree mirror contains: the pruning function, the field filter and the traversal stop rules,
12
+ * all of which live in this package. (The finality predicate comes from pl-client and is NOT
13
+ * covered, which is harmless: finality is recomputed on restore, so it is the one rule that
14
+ * cannot poison a stored file.)
15
+ *
16
+ * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing
17
+ * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts
18
+ * of an installed version. A build from a dirty worktree includes the build time, so editing
19
+ * those rules locally can never hit a snapshot written under the old ones. In practice release
20
+ * builds are dirty too, because CI writes version bumps into the worktree before building; that
21
+ * costs nothing, since the stamp only has to be stable within an artifact.
22
+ *
23
+ * With no build at all (sources mode) the value is a constant. That deliberately trades away
24
+ * the dirty-worktree guarantee: it means someone running from sources exercises the restore
25
+ * path at all, rather than every snapshot being a guaranteed miss for the one audience most
26
+ * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources
27
+ * and hitting a mirror written under the old ones, is the local-development gap the design
28
+ * already accepts, and `treeSnapshots: false` or deleting the directory clears it.
29
+ */
30
+ const ML_BUILD_STAMP = injectedStamp() ?? "sources";
31
+ //#endregion
32
+ export { ML_BUILD_STAMP };
33
+
34
+ //# sourceMappingURL=build_stamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_stamp.js","names":[],"sources":["../../src/middle_layer/build_stamp.ts"],"sourcesContent":["/** Injected by rolldown at build time, see `build.node.config.js`. Absent when the package is\n * consumed straight from sources (`USE_SOURCES=1`), because no build step runs then. */\ndeclare const __PL_ML_BUILD_STAMP__: string | undefined;\n\nfunction injectedStamp(): string | undefined {\n try {\n // Read inside a try: with no build step the identifier is an undeclared global, and\n // reading it throws a ReferenceError rather than yielding undefined.\n return __PL_ML_BUILD_STAMP__;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Identifies the build of this package, and through it the rules that shape what a persisted\n * tree mirror contains: the pruning function, the field filter and the traversal stop rules,\n * all of which live in this package. (The finality predicate comes from pl-client and is NOT\n * covered, which is harmless: finality is recomputed on restore, so it is the one rule that\n * cannot poison a stored file.)\n *\n * Used as a cache-key component, so a change to those rules invalidates every snapshot, costing\n * one cold open. Each built artifact bakes in one stamp, so reopens stay warm across restarts\n * of an installed version. A build from a dirty worktree includes the build time, so editing\n * those rules locally can never hit a snapshot written under the old ones. In practice release\n * builds are dirty too, because CI writes version bumps into the worktree before building; that\n * costs nothing, since the stamp only has to be stable within an artifact.\n *\n * With no build at all (sources mode) the value is a constant. That deliberately trades away\n * the dirty-worktree guarantee: it means someone running from sources exercises the restore\n * path at all, rather than every snapshot being a guaranteed miss for the one audience most\n * likely to find its defects. The exposure it reintroduces, editing pruning rules from sources\n * and hitting a mirror written under the old ones, is the local-development gap the design\n * already accepts, and `treeSnapshots: false` or deleting the directory clears it.\n */\nexport const ML_BUILD_STAMP: string = injectedStamp() ?? \"sources\";\n"],"mappings":";AAIA,SAAS,gBAAoC;CAC3C,IAAI;EAGF,OAAA;CACF,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,iBAAyB,cAAc,KAAK"}
@@ -1,10 +1,10 @@
1
1
  import { InternalPFrameDriver } from "../pool/driver.js";
2
+ import "../pool/index.js";
2
3
  import { DriverKitOpsConstructor } from "./ops.js";
3
4
  import { Signer } from "@milaboratories/ts-helpers";
4
5
  import * as Sdk from "@milaboratories/pl-model-common";
5
6
  import { PlClient } from "@milaboratories/pl-client";
6
7
  import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, InternalLsDriver, LogsDriver, UploadDriver } from "@milaboratories/pl-drivers";
7
-
8
8
  //#region src/middle_layer/driver_kit.d.ts
9
9
  /**
10
10
  * Drivers offered by the middle-layer for internal consumers,
@@ -13,7 +13,7 @@ import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, InternalLsD
13
13
  * This intertface is basically a version of the DriverKit from
14
14
  * UI SDK with extended API.
15
15
  * */
16
- interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
16
+ export interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
17
17
  /** Dispose the driver kit and all its resources. */
18
18
  dispose(): Promise<void>;
19
19
  readonly blobDriver: DownloadDriver;
@@ -33,7 +33,6 @@ interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
33
33
  * */
34
34
  readonly uploadDriver: UploadDriver;
35
35
  }
36
- declare function initDriverKit(pl: PlClient, workdir: string, frontendDownloadPath: string, _ops: DriverKitOpsConstructor): Promise<MiddleLayerDriverKit>;
36
+ export declare function initDriverKit(pl: PlClient, workdir: string, frontendDownloadPath: string, _ops: DriverKitOpsConstructor): Promise<MiddleLayerDriverKit>;
37
37
  //#endregion
38
- export { MiddleLayerDriverKit, initDriverKit };
39
38
  //# sourceMappingURL=driver_kit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver_kit.d.ts","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"mappings":";;;;;;;;;;AA+BA;;;;;UAAiB,oBAAA,SAA6B,GAAA,CAAI,SAAA,EAAW,eAAA;EASvC;EAPpB,OAAA,IAAW,OAAA;EAAA,SAGF,UAAA,EAAY,cAAA;EAAA,SAEZ,eAAA,EAAiB,uBAAA;EAAA,SAEjB,SAAA,EAAW,UAAA;EAAA,SAEX,QAAA,EAAU,gBAAA;EAAA,SAEV,YAAA,EAAc,oBAAA;EAAA,SAEd,cAAA,EAAgB,iBAAA;EAfiD;;;;EAAA,SAqBjE,MAAA,EAAQ,MAAA;EAnBjB;;;;EAAA,SAyBS,YAAA,EAAc,YAAA;AAAA;AAAA,iBAGH,aAAA,CACpB,EAAA,EAAI,QAAA,EACJ,OAAA,UACA,oBAAA,UACA,IAAA,EAAM,uBAAA,GACL,OAAA,CAAQ,oBAAA"}
1
+ {"version":3,"file":"driver_kit.d.ts","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"mappings":";;;;;;;;;;;;;;;iBA+BiB,6BAA6B,IAAI,WAAW;;EAE3D,WAAW;WAGF,YAAY;WAEZ,iBAAiB;WAEjB,WAAW;WAEX,UAAU;WAEV,cAAc;WAEd,gBAAgB;;;;;WAMhB,QAAQ;;;;;WAMR,cAAc;;wBAGH,cACpB,IAAI,UACJ,iBACA,8BACA,MAAM,0BACL,QAAQ"}
@@ -1,7 +1,8 @@
1
1
  import { OutgoingShare, PendingShare } from "./sharing_list.js";
2
2
  import { Project } from "./project.js";
3
- import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings } from "./ops.js";
3
+ import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayerDebugOptions, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, TreeSnapshotOps } from "./ops.js";
4
4
  import { MiddleLayerDriverKit, initDriverKit } from "./driver_kit.js";
5
+ import { TreeSnapshotMiss, TreeSnapshotStat } from "./tree_snapshot_store.js";
5
6
  import { MiddleLayer } from "./middle_layer.js";
6
7
  import { ProjectsField } from "./project_list.js";
7
- export { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, Project, ProjectsField, initDriverKit };
8
+ export { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings, DriverKitOps, DriverKitOpsConstructor, DriverKitOpsPaths, DriverKitOpsSettings, MiddleLayer, MiddleLayerDebugOptions, MiddleLayerDriverKit, MiddleLayerOps, MiddleLayerOpsConstructor, MiddleLayerOpsPaths, MiddleLayerOpsSettings, type OutgoingShare, type PendingShare, Project, ProjectsField, type TreeSnapshotMiss, TreeSnapshotOps, type TreeSnapshotStat, initDriverKit };
@@ -18,6 +18,7 @@ const require_watcher = require("../block_registry/watcher.cjs");
18
18
  const require_driver_kit = require("./driver_kit.cjs");
19
19
  const require_service_factories = require("../service_factories.cjs");
20
20
  const require_project_helper = require("../model/project_helper.cjs");
21
+ const require_tree_snapshot_store = require("./tree_snapshot_store.cjs");
21
22
  let _platforma_sdk_model = require("@platforma-sdk/model");
22
23
  let undici = require("undici");
23
24
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
@@ -28,6 +29,10 @@ let _milaboratories_computable = require("@milaboratories/computable");
28
29
  let node_crypto = require("node:crypto");
29
30
  let quickjs_emscripten = require("quickjs-emscripten");
30
31
  //#region src/middle_layer/middle_layer.ts
32
+ /** How long shutdown waits for close-boundary snapshot writes that are already running. Long
33
+ * enough for a ten-megabyte encode and write on ordinary storage, short enough that a wedged
34
+ * filesystem does not hold the quit open. */
35
+ const SNAPSHOT_DRAIN_TIMEOUT_MS = 5e3;
31
36
  /**
32
37
  * Main access object to work with pl from UI.
33
38
  *
@@ -757,6 +762,32 @@ var MiddleLayer = class MiddleLayer {
757
762
  }
758
763
  }
759
764
  openedProjects = /* @__PURE__ */ new Map();
765
+ /** Snapshot writes started by {@link closeProject} and not yet finished. Held only so
766
+ * {@link close} can give them a bounded chance to land. */
767
+ pendingSnapshotWrites = /* @__PURE__ */ new Set();
768
+ trackSnapshotWrite(write) {
769
+ this.pendingSnapshotWrites.add(write);
770
+ write.finally(() => this.pendingSnapshotWrites.delete(write));
771
+ }
772
+ /** Waits for close-boundary snapshot writes that are already running, up to `timeoutMs`.
773
+ *
774
+ * This starts no work: quitting still performs no snapshot of its own. It only lets a write
775
+ * that a project close already began finish, so closing a project and immediately quitting
776
+ * does not routinely lose it. Bounded, because a wedged filesystem must not hang the quit,
777
+ * and losing the write costs one cold open rather than any correctness. */
778
+ async drainSnapshotWrites(timeoutMs) {
779
+ if (this.pendingSnapshotWrites.size === 0) return;
780
+ let timer;
781
+ const expiry = new Promise((resolve) => {
782
+ timer = setTimeout(resolve, timeoutMs);
783
+ timer.unref?.();
784
+ });
785
+ try {
786
+ await Promise.race([Promise.allSettled(this.pendingSnapshotWrites), expiry]);
787
+ } finally {
788
+ if (timer !== void 0) clearTimeout(timer);
789
+ }
790
+ }
760
791
  /** Opens a project, and starts corresponding project maintenance loop. */
761
792
  async openProject(id) {
762
793
  if (this.openedProjects.has(id)) throw new Error(`Project ${id} already opened`);
@@ -769,6 +800,7 @@ var MiddleLayer = class MiddleLayer {
769
800
  const prj = this.openedProjects.get(id);
770
801
  if (prj === void 0) throw new Error(`Project ${id} not found among opened projects`);
771
802
  this.openedProjects.delete(id);
803
+ this.trackSnapshotWrite(prj.snapshotOnClose());
772
804
  await prj.destroy();
773
805
  this.openedProjectsList.setValue([...this.openedProjects.keys()]);
774
806
  }
@@ -782,6 +814,12 @@ var MiddleLayer = class MiddleLayer {
782
814
  isProjectOpened(id) {
783
815
  return this.openedProjects.has(id);
784
816
  }
817
+ /** Counters for the persisted project tree mirrors, or undefined when they are switched off.
818
+ * Reads and hits are what show whether a reopen was actually warm, and the miss breakdown
819
+ * says why it was not. */
820
+ get treeSnapshotStats() {
821
+ return this.env.treeSnapshots?.getStats();
822
+ }
785
823
  /**
786
824
  * Deallocates all runtime resources consumed by this object and awaits
787
825
  * actual termination of event loops and other processes associated with
@@ -796,6 +834,7 @@ var MiddleLayer = class MiddleLayer {
796
834
  this.sharingStateTree.terminate(),
797
835
  this.pendingSharesTree.terminate()
798
836
  ]);
837
+ await this.drainSnapshotWrites(SNAPSHOT_DRAIN_TIMEOUT_MS);
799
838
  await this.env.dispose();
800
839
  await this.pl.close();
801
840
  }
@@ -858,6 +897,14 @@ var MiddleLayer = class MiddleLayer {
858
897
  runtimeCapabilities.addSupportedRequirement("requiresPFramesVersion", _milaboratories_pl_model_common.REQUIRES_PFRAMES_VERSION);
859
898
  (0, _milaboratories_pl_model_common.registerServiceCapabilities)((flag, value) => runtimeCapabilities.addSupportedRequirement(flag, value));
860
899
  const serviceRegistry = require_service_factories.createModelServiceRegistry({ logger });
900
+ const treeSnapshots = require_tree_snapshot_store.TreeSnapshotStore.create(pl, {
901
+ dir: ops.treeSnapshotPath,
902
+ maxSizeBytes: ops.treeSnapshotOps.maxSizeBytes,
903
+ enabled: ops.treeSnapshotOps.enabled,
904
+ logger
905
+ });
906
+ if (ops.treeSnapshotOps.enabled) await treeSnapshots?.evict();
907
+ else await require_tree_snapshot_store.TreeSnapshotStore.purge(ops.treeSnapshotPath, logger);
861
908
  const env = {
862
909
  pl,
863
910
  blockEventDispatcher: new _milaboratories_ts_helpers.BlockEventDispatcher(),
@@ -878,6 +925,7 @@ var MiddleLayer = class MiddleLayer {
878
925
  serviceRegistry,
879
926
  quickJs,
880
927
  projectHelper: new require_project_helper.ProjectHelper(quickJs, logger),
928
+ treeSnapshots,
881
929
  dispose: async () => {
882
930
  await serviceRegistry.dispose();
883
931
  await retryHttpDispatcher.destroy();