@platforma-open/milaboratories.repertoire-mutation-heatmap.block 1.0.0 → 1.1.1

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.
package/dist/index.js CHANGED
@@ -21,14 +21,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/plugin_handle.js
24
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/plugin_handle.js
25
25
  const PLUGIN_OUTPUT_PREFIX = "plugin-output#";
26
26
  /** Construct the output key for a plugin output in the block outputs map. */
27
27
  function pluginOutputKey(handle, outputKey) {
28
28
  return `${PLUGIN_OUTPUT_PREFIX}${handle}#${outputKey}`;
29
29
  }
30
30
  //#endregion
31
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/block_storage.js
31
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/block_storage.js
32
32
  /**
33
33
  * Discriminator key for BlockStorage format detection.
34
34
  * This unique hash-based key identifies data as BlockStorage vs legacy formats.
@@ -270,7 +270,7 @@ function getPluginData(rawStorage, handle) {
270
270
  return pluginEntry.__data;
271
271
  }
272
272
  //#endregion
273
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/block_migrations.js
273
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/block_migrations.js
274
274
  /** Create a DataVersioned wrapper with correct shape */
275
275
  function makeVersionedData(version, data) {
276
276
  return {
@@ -765,7 +765,7 @@ var DataModel = class DataModel {
765
765
  }
766
766
  };
767
767
  //#endregion
768
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/internal.js
768
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/internal.js
769
769
  /** Utility code helping to identify whether the code is running in actual UI environment */
770
770
  function isInUI() {
771
771
  return typeof globalThis.getPlatforma !== "undefined" || typeof globalThis.platforma !== "undefined";
@@ -835,7 +835,7 @@ function registerFutureAwait(handle, onResolve) {
835
835
  futureResolves.get(handle).push(onResolve);
836
836
  }
837
837
  //#endregion
838
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/block_storage_facade.js
838
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/block_storage_facade.js
839
839
  /**
840
840
  * All facade callback names as constants.
841
841
  * These are the source of truth - the interface is derived from these.
@@ -870,7 +870,7 @@ function registerFacadeCallbacks(callbacks) {
870
870
  for (const key of Object.values(BlockStorageFacadeCallbacks)) tryRegisterCallback(key, callbacks[key]);
871
871
  }
872
872
  //#endregion
873
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/future.js
873
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/future.js
874
874
  var FutureRef = class FutureRef {
875
875
  handle;
876
876
  postProcess;
@@ -4443,16 +4443,18 @@ objectType({
4443
4443
  content: stringType()
4444
4444
  });
4445
4445
  objectType({
4446
+ /** Included left border. */
4446
4447
  from: numberType().min(0),
4448
+ /** Excluded right border. */
4447
4449
  to: numberType().min(1)
4448
4450
  });
4449
4451
  //#endregion
4450
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/util.js
4452
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/util.js
4451
4453
  function assertNever(x) {
4452
4454
  throw new Error("Unexpected object: " + x);
4453
4455
  }
4454
4456
  //#endregion
4455
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/data_info.js
4457
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/data_info.js
4456
4458
  /**
4457
4459
  * Type guard function that checks if the given value is a valid DataInfo.
4458
4460
  *
@@ -4643,7 +4645,7 @@ function entriesToDataInfo(dataInfoEntries) {
4643
4645
  }
4644
4646
  }
4645
4647
  //#endregion
4646
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/errors.js
4648
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/errors.js
4647
4649
  var ServiceError = class extends Error {
4648
4650
  name = "ServiceError";
4649
4651
  };
@@ -4667,7 +4669,7 @@ function ensureError(value) {
4667
4669
  return new Error(stringifyValue(value));
4668
4670
  }
4669
4671
  //#endregion
4670
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/json.js
4672
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/json.js
4671
4673
  var import_canonicalize = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
4672
4674
  module.exports = function serialize(object) {
4673
4675
  if (typeof object === "number" && isNaN(object)) throw new Error("NaN is not allowed");
@@ -4693,7 +4695,7 @@ function parseJson(value) {
4693
4695
  return JSON.parse(value);
4694
4696
  }
4695
4697
  //#endregion
4696
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js
4698
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js
4697
4699
  function readMetadata(metadata, key) {
4698
4700
  return metadata?.[key];
4699
4701
  }
@@ -4985,7 +4987,7 @@ function matchAxisId(query, target) {
4985
4987
  return query.name === target.name && matchDomain$1(query.domain, target.domain) && matchDomain$1(query.contextDomain, target.contextDomain);
4986
4988
  }
4987
4989
  //#endregion
4988
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/query/utils.js
4990
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/query/utils.js
4989
4991
  /**
4990
4992
  * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.
4991
4993
  *
@@ -5063,7 +5065,7 @@ function mapSpecQueryColumns(query, cb) {
5063
5065
  return traverseQuerySpec(query, { column: cb });
5064
5066
  }
5065
5067
  //#endregion
5066
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/table_calculate.js
5068
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/table_calculate.js
5067
5069
  function mapPTableDef(def, cb) {
5068
5070
  return {
5069
5071
  ...def,
@@ -5106,7 +5108,7 @@ function mapJoinEntry(entry, cb) {
5106
5108
  }
5107
5109
  }
5108
5110
  //#endregion
5109
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/ids.js
5111
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/ids.js
5110
5112
  /**
5111
5113
  * Canonically serializes a {@link UniversalPColumnId} to a string.
5112
5114
  * @param id - The column identifier to serialize
@@ -5116,7 +5118,7 @@ function stringifyColumnId(id) {
5116
5118
  return (0, import_canonicalize.default)(id);
5117
5119
  }
5118
5120
  //#endregion
5119
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/anchored.js
5121
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/anchored.js
5120
5122
  function axisKey(axis) {
5121
5123
  return (0, import_canonicalize.default)(getAxisId(axis));
5122
5124
  }
@@ -5128,6 +5130,7 @@ function domainKey(key, value) {
5128
5130
  * Maintains maps of known domain values and axes that can be referenced by anchors
5129
5131
  */
5130
5132
  var AnchoredIdDeriver = class {
5133
+ anchors;
5131
5134
  axes = /* @__PURE__ */ new Map();
5132
5135
  domains = /* @__PURE__ */ new Map();
5133
5136
  contextDomains = /* @__PURE__ */ new Map();
@@ -5361,7 +5364,7 @@ function isAnchorAxisRef(value) {
5361
5364
  return typeof value === "object" && "anchor" in value;
5362
5365
  }
5363
5366
  //#endregion
5364
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/pool/spec.js
5367
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/pool/spec.js
5365
5368
  function isPColumnSpec(spec) {
5366
5369
  return spec.kind === "PColumn";
5367
5370
  }
@@ -5407,7 +5410,7 @@ function extractAllColumns(entry) {
5407
5410
  return [...columns.values()];
5408
5411
  }
5409
5412
  //#endregion
5410
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/selectors.js
5413
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/selectors.js
5411
5414
  /**
5412
5415
  * Determines if an axis ID matches an axis selector.
5413
5416
  *
@@ -5488,7 +5491,7 @@ function legacyColumnSelectorsToPredicate(predicateOrSelectors) {
5488
5491
  else return (spec) => isPColumnSpec(spec) && matchPColumn(spec, predicateOrSelectors);
5489
5492
  }
5490
5493
  //#endregion
5491
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/native_id.js
5494
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/native_id.js
5492
5495
  function deriveNativeId(spec) {
5493
5496
  const result = {
5494
5497
  kind: spec.kind,
@@ -5501,13 +5504,13 @@ function deriveNativeId(spec) {
5501
5504
  }
5502
5505
  Array.isArray;
5503
5506
  //#endregion
5504
- //#region ../node_modules/.pnpm/@milaboratories+helpers@1.14.2/node_modules/@milaboratories/helpers/dist/error.js
5507
+ //#region ../node_modules/.pnpm/@milaboratories+helpers@1.14.3/node_modules/@milaboratories/helpers/dist/error.js
5505
5508
  function throwError(v) {
5506
5509
  if (typeof v === "string") throw new Error(v);
5507
5510
  else throw v;
5508
5511
  }
5509
5512
  //#endregion
5510
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/linker_columns.js
5513
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/linker_columns.js
5511
5514
  var LinkerMap = class LinkerMap {
5512
5515
  /** Graph of linkers connected by axes (single or grouped by parents) */
5513
5516
  data;
@@ -5685,7 +5688,7 @@ var LinkerMap = class LinkerMap {
5685
5688
  }
5686
5689
  };
5687
5690
  //#endregion
5688
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/flags/block_flags.js
5691
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/flags/block_flags.js
5689
5692
  /**
5690
5693
  * Required PFrames version. Bump this in lockstep with the `@milaboratories/pframes-rs-*`
5691
5694
  * version in `pnpm-workspace.yaml` so blocks built against the new SDK refuse to load on
@@ -5728,7 +5731,7 @@ function withEnrichments(ref, requireEnrichments = true) {
5728
5731
  }
5729
5732
  }
5730
5733
  //#endregion
5731
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/value_or_error.js
5734
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/value_or_error.js
5732
5735
  function mapValueInVOE(voe, cb) {
5733
5736
  return voe.ok ? {
5734
5737
  ok: true,
@@ -5736,7 +5739,7 @@ function mapValueInVOE(voe, cb) {
5736
5739
  } : voe;
5737
5740
  }
5738
5741
  //#endregion
5739
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/resource_types.js
5742
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/resource_types.js
5740
5743
  /** Well-known resource type names used across the platform. */
5741
5744
  const ResourceTypeName = {
5742
5745
  StreamManager: "StreamManager",
@@ -5774,10 +5777,13 @@ const ResourceTypeName = {
5774
5777
  WorkingDirectory: "WorkingDirectory",
5775
5778
  UserProject: "UserProject",
5776
5779
  Projects: "Projects",
5777
- ClientRoot: "ClientRoot"
5780
+ ClientRoot: "ClientRoot",
5781
+ SharingOutbox: "SharingOutbox",
5782
+ SharingState: "SharingState",
5783
+ SharedEnvelope: "SharedEnvelope"
5778
5784
  };
5779
5785
  //#endregion
5780
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/services/service_types.js
5786
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/services/service_types.js
5781
5787
  const SERVICE_ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*$/;
5782
5788
  const { service, isNodeService, isWasmService, isMainService, getServiceKind, getServiceModelMethods, getServiceUiMethods } = (() => {
5783
5789
  const typeMap = /* @__PURE__ */ new Map();
@@ -5816,7 +5822,7 @@ const { service, isNodeService, isWasmService, isMainService, getServiceKind, ge
5816
5822
  };
5817
5823
  })();
5818
5824
  //#endregion
5819
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/services/service_declarations.js
5825
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/services/service_declarations.js
5820
5826
  const Services = {
5821
5827
  PFrameSpec: service()({
5822
5828
  type: "wasm",
@@ -5888,7 +5894,7 @@ function resolveRequiredServices(flags) {
5888
5894
  }
5889
5895
  Object.fromEntries(Object.keys(Services).map((key) => [`requires${key}`, true]));
5890
5896
  //#endregion
5891
- //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.2/node_modules/@milaboratories/pl-model-common/dist/services/service_injectors.js
5897
+ //#region ../node_modules/.pnpm/@milaboratories+pl-model-common@1.46.4/node_modules/@milaboratories/pl-model-common/dist/services/service_injectors.js
5892
5898
  function buildMethodMap(pick) {
5893
5899
  const result = {};
5894
5900
  for (const id of Object.values(Services)) result[id] = [...pick(id)];
@@ -5897,7 +5903,7 @@ function buildMethodMap(pick) {
5897
5903
  buildMethodMap(getServiceUiMethods);
5898
5904
  buildMethodMap(getServiceModelMethods);
5899
5905
  //#endregion
5900
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/accessor.js
5906
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/accessor.js
5901
5907
  function ifDef(value, cb) {
5902
5908
  return value === void 0 ? void 0 : cb(value);
5903
5909
  }
@@ -6148,11 +6154,11 @@ var TreeNodeAccessor = class TreeNodeAccessor {
6148
6154
  }
6149
6155
  };
6150
6156
  //#endregion
6151
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/internal.js
6157
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/internal.js
6152
6158
  const StagingAccessorName = "staging";
6153
6159
  const MainAccessorName = "main";
6154
6160
  //#endregion
6155
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/util/axis_filtering.js
6161
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/util/axis_filtering.js
6156
6162
  function filterDataInfoEntries(dataInfoEntries, axisFilters) {
6157
6163
  const sortedFilters = [...axisFilters].sort((a, b) => b[0] - a[0]);
6158
6164
  const { type } = dataInfoEntries;
@@ -6258,7 +6264,7 @@ function isNil(x) {
6258
6264
  return x == null;
6259
6265
  }
6260
6266
  //#endregion
6261
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/labels/derive_distinct_labels.js
6267
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/labels/derive_distinct_labels.js
6262
6268
  const DISTANCE_PENALTY = .001;
6263
6269
  const LABEL_TYPE = "__LABEL__";
6264
6270
  const LABEL_TYPE_FULL = "__LABEL__@1";
@@ -6524,7 +6530,7 @@ function minimizeTypeSet(typeSet, records, stats, forceTraceElements, forcedSet,
6524
6530
  return result;
6525
6531
  }
6526
6532
  //#endregion
6527
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/util/label.js
6533
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/util/label.js
6528
6534
  /** @deprecated Use deriveDistinctLabels */
6529
6535
  function deriveLabels(values, getSpec, options = {}) {
6530
6536
  return deriveDistinctLabels(values.map(getSpec), options).map((label, i) => ({
@@ -6533,7 +6539,7 @@ function deriveLabels(values, getSpec, options = {}) {
6533
6539
  }));
6534
6540
  }
6535
6541
  //#endregion
6536
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/util/pcolumn_data.js
6542
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/util/pcolumn_data.js
6537
6543
  const RT_RESOURCE_MAP = "PColumnData/ResourceMap";
6538
6544
  const RT_RESOURCE_MAP_PARTITIONED = "PColumnData/Partitioned/ResourceMap";
6539
6545
  const RT_JSON_PARTITIONED = "PColumnData/JsonPartitioned";
@@ -6831,7 +6837,7 @@ function allPColumnsReady(columns) {
6831
6837
  return columns.every(isPColumnReady);
6832
6838
  }
6833
6839
  //#endregion
6834
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/util/column_collection.js
6840
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/util/column_collection.js
6835
6841
  function isPColumnValues(value) {
6836
6842
  if (!Array.isArray(value)) return false;
6837
6843
  if (value.length === 0) return true;
@@ -7107,7 +7113,7 @@ var PColumnCollection = class {
7107
7113
  }
7108
7114
  };
7109
7115
  //#endregion
7110
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/services/block_services.js
7116
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/services/block_services.js
7111
7117
  /**
7112
7118
  * Services required by all V3 blocks by default.
7113
7119
  * Edit this when a new service should be available to all blocks.
@@ -7122,7 +7128,7 @@ const BLOCK_SERVICE_FLAGS = {
7122
7128
  };
7123
7129
  resolveRequiredServices(BLOCK_SERVICE_FLAGS);
7124
7130
  //#endregion
7125
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/services/service_bridge.js
7131
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/services/service_bridge.js
7126
7132
  /**
7127
7133
  * Builds a ServiceProxy from a ServiceDispatch.
7128
7134
  * Each service method call is forwarded to dispatch.callServiceMethod.
@@ -7131,7 +7137,7 @@ function createServiceProxy(dispatch) {
7131
7137
  return ((serviceId) => Object.freeze(Object.fromEntries(dispatch.getServiceMethods(serviceId).map((method) => [method, (...args) => dispatch.callServiceMethod(serviceId, method, ...args)]))));
7132
7138
  }
7133
7139
  //#endregion
7134
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/services/get_services.js
7140
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/services/get_services.js
7135
7141
  const cachedServices = /* @__PURE__ */ new WeakMap();
7136
7142
  function getService(name) {
7137
7143
  const ctx = getCfgRenderCtx();
@@ -7145,7 +7151,7 @@ function getService(name) {
7145
7151
  })();
7146
7152
  }
7147
7153
  //#endregion
7148
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/util/pframe_upgraders.js
7154
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/util/pframe_upgraders.js
7149
7155
  function patchInSetFilters(filters) {
7150
7156
  const inSetToOrEqual = (predicate) => {
7151
7157
  if (predicate.operator !== "InSet") return predicate;
@@ -7183,7 +7189,7 @@ function patchInSetFilters(filters) {
7183
7189
  return filters.map((filter) => mapFilter(filter, inSetToOrEqual));
7184
7190
  }
7185
7191
  //#endregion
7186
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/render/api.js
7192
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/render/api.js
7187
7193
  /**
7188
7194
  * Helper function to match domain objects
7189
7195
  * @param query Optional domain to match against
@@ -7637,27 +7643,27 @@ var PluginRenderCtx = class extends RenderCtxBase {
7637
7643
  }
7638
7644
  };
7639
7645
  //#endregion
7640
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/version.js
7641
- const PlatformaSDKVersion = "1.79.20";
7646
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/version.js
7647
+ const PlatformaSDKVersion = "1.79.27";
7642
7648
  //#endregion
7643
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/bconfig/types.js
7649
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/bconfig/types.js
7644
7650
  function isConfigLambda(cfgOrFh) {
7645
7651
  return cfgOrFh.__renderLambda === true;
7646
7652
  }
7647
7653
  //#endregion
7648
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/bconfig/normalization.js
7654
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/bconfig/normalization.js
7649
7655
  function downgradeCfgOrLambda(data) {
7650
7656
  if (data === void 0) return void 0;
7651
7657
  if (isConfigLambda(data)) return data.handle;
7652
7658
  return data;
7653
7659
  }
7654
7660
  //#endregion
7655
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/plugin_model.js
7661
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/plugin_model.js
7656
7662
  /** Internal plugin↔block handshake. `Symbol.for` (not `Symbol`) so it stays
7657
7663
  * identical across multiple `@platforma-sdk/model` copies in one process. */
7658
7664
  const CREATE_PLUGIN_MODEL = Symbol.for("@platforma-sdk/model:createPluginModel");
7659
7665
  //#endregion
7660
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/block_storage_callbacks.js
7666
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/block_storage_callbacks.js
7661
7667
  /**
7662
7668
  * BlockStorage Callback Implementations - wired to facade callbacks in BlockModelV3.done().
7663
7669
  *
@@ -7834,7 +7840,7 @@ function derivePrerunArgsFromStorage(storageJson, argsFunction, prerunArgsFuncti
7834
7840
  }
7835
7841
  }
7836
7842
  //#endregion
7837
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/block_model.js
7843
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/block_model.js
7838
7844
  /**
7839
7845
  * Merges two feature flag objects with type-aware logic:
7840
7846
  * - `supports*` (boolean): OR — `true` if either side is `true`
@@ -8146,7 +8152,7 @@ var BlockModelV3 = class BlockModelV3 {
8146
8152
  }
8147
8153
  };
8148
8154
  //#endregion
8149
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/pframe_utils/axes.js
8155
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/pframe_utils/axes.js
8150
8156
  /** Create id for column copy with added keys in axes domains */
8151
8157
  const colId = (id, domains, contextDomains) => {
8152
8158
  let wid = id.toString();
@@ -8252,7 +8258,7 @@ function getAdditionalColumnsForColumn(blockAxes, column) {
8252
8258
  })];
8253
8259
  }
8254
8260
  //#endregion
8255
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/columns/column_snapshot_provider.js
8261
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/columns/column_snapshot_provider.js
8256
8262
  /**
8257
8263
  * Simple provider wrapping an array of PColumns.
8258
8264
  * Always complete, data status always 'ready'.
@@ -8380,7 +8386,7 @@ function toColumnSnapshotProvider(source) {
8380
8386
  throw new Error("Unknown ColumnSource type");
8381
8387
  }
8382
8388
  //#endregion
8383
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/columns/column_selector.js
8389
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/columns/column_selector.js
8384
8390
  function normalizeStringMatchers(input) {
8385
8391
  if (typeof input === "string") return [{
8386
8392
  type: "regex",
@@ -8424,7 +8430,7 @@ function convertColumnSelectorToMultiColumnSelector(input) {
8424
8430
  return (Array.isArray(input) ? input : [input]).map(convertRelaxedColumnSelectorToMultiColumnSelector);
8425
8431
  }
8426
8432
  //#endregion
8427
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/columns/column_collection_builder.js
8433
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/columns/column_collection_builder.js
8428
8434
  /**
8429
8435
  * Mutable builder that accumulates column sources, then produces
8430
8436
  * a ColumnCollection (plain) or AnchoredColumnCollection (with anchors).
@@ -8655,7 +8661,7 @@ function matchingModeToConstraints(mode) {
8655
8661
  }
8656
8662
  }
8657
8663
  //#endregion
8658
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/columns/ctx_column_sources.js
8664
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/columns/ctx_column_sources.js
8659
8665
  /**
8660
8666
  * Collect ColumnSnapshotProviders from `outputs`, `prerun`, and
8661
8667
  * `resultPool` in that order. Dedup keeps the first occurrence per
@@ -8729,7 +8735,7 @@ function walkTree(node, out) {
8729
8735
  }
8730
8736
  }
8731
8737
  //#endregion
8732
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/pframe_utils/columns.js
8738
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/pframe_utils/columns.js
8733
8739
  function getAllRelatedColumns(ctx, predicate) {
8734
8740
  const columns = new PColumnCollection();
8735
8741
  columns.addColumnProvider(ctx.resultPool);
@@ -8808,7 +8814,7 @@ function discoverIntegrableColumnIds(ctx, rootColumns) {
8808
8814
  }
8809
8815
  }
8810
8816
  //#endregion
8811
- //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.20/node_modules/@platforma-sdk/model/dist/components/PFrameForGraphs.js
8817
+ //#region ../node_modules/.pnpm/@platforma-sdk+model@1.79.27/node_modules/@platforma-sdk/model/dist/components/PFrameForGraphs.js
8812
8818
  function isHiddenFromGraphColumn(column) {
8813
8819
  return !!readAnnotationJson(column, Annotation.HideDataFromGraphs);
8814
8820
  }
@@ -8892,6 +8898,7 @@ const STATE_MATRIX = "pl7.app/repertoire/stateMatrix";
8892
8898
  const VARIANT_KEY_AXIS = "pl7.app/variantKey";
8893
8899
  const KNOWN_VARIANT_KEY_AXIS = "pl7.app/knownVariantKey";
8894
8900
  const SAMPLE_ID_AXIS = "pl7.app/sampleId";
8901
+ const NO_DATASET_LABEL = "No dataset selected";
8895
8902
  /** Strip empty bounds / empty selection; lex-sort samples for a stable cache key. */
8896
8903
  function canonicalizeFilter(f) {
8897
8904
  const out = { membership: f.membership ?? "all" };
@@ -8905,6 +8912,8 @@ const dataModel = new DataModelBuilder().from("v1").init(() => ({
8905
8912
  valueMode: "abundance",
8906
8913
  normalize: true,
8907
8914
  filter: { membership: "all" },
8915
+ roundFrequencyRefs: [],
8916
+ compositionEpsilon: 1e-6,
8908
8917
  stateHeatmapState: {
8909
8918
  title: "Deep Mutational Scanning",
8910
8919
  template: "heatmap",
@@ -8930,39 +8939,136 @@ const dataModel = new DataModelBuilder().from("v1").init(() => ({
8930
8939
  hideAxisLabels: false,
8931
8940
  cellSize: 20
8932
8941
  } }
8942
+ },
8943
+ compositionHeatmapState: {
8944
+ title: "Enrichment Analysis",
8945
+ template: "heatmap",
8946
+ currentTab: null,
8947
+ layersSettings: { heatmap: {
8948
+ normalizationDirection: null,
8949
+ transform: null
8950
+ } },
8951
+ axesSettings: { axisY: {
8952
+ hideAxisLabels: false,
8953
+ cellSize: 20
8954
+ } }
8933
8955
  }
8934
8956
  }));
8935
8957
  const platforma$1 = BlockModelV3.create(dataModel).args((data) => {
8936
8958
  if (data.stateMatrixRef === void 0) throw new Error("Select a state-matrix column to render");
8937
- if (data.valueMode === "abundance" && data.abundanceRef === void 0) throw new Error("Abundance value-mode requires an abundance column");
8938
- if (data.valueMode === "property" && data.propertyRef === void 0) throw new Error("Property value-mode requires a per-variant property column");
8959
+ if (data.selectedParentId === void 0) throw new Error("Select a parent");
8960
+ if (data.abundanceRef === void 0) throw new Error("Select an abundance column");
8939
8961
  return {
8940
8962
  stateMatrixRef: data.stateMatrixRef,
8963
+ selectedParentId: data.selectedParentId,
8941
8964
  abundanceRef: data.abundanceRef,
8942
- propertyRef: data.valueMode === "property" ? data.propertyRef : void 0,
8965
+ propertyRef: void 0,
8943
8966
  knownAbundanceRef: data.knownAbundanceRef,
8944
8967
  level: data.level,
8945
- valueMode: data.valueMode,
8946
- normalize: data.valueMode === "abundance" ? data.normalize : false,
8947
- filter: canonicalizeFilter(data.filter)
8968
+ valueMode: "abundance",
8969
+ normalize: data.normalize,
8970
+ filter: canonicalizeFilter(data.filter),
8971
+ roundFrequencyRefs: data.roundFrequencyRefs ?? [],
8972
+ compositionEpsilon: data.compositionEpsilon ?? 1e-6
8948
8973
  };
8949
- }).output("stateMatrixOptions", (ctx) => ctx.resultPool.getOptions([{ name: STATE_MATRIX }], { label: { includeNativeLabel: true } })).output("abundanceOptions", (ctx) => ctx.resultPool.getOptions([{
8950
- axes: [{ name: SAMPLE_ID_AXIS }, { name: VARIANT_KEY_AXIS }],
8951
- annotations: { "pl7.app/isAbundance": "true" }
8952
- }], { label: { includeNativeLabel: true } })).output("propertyOptions", (ctx) => {
8953
- const anchor = ctx.data.stateMatrixRef;
8954
- if (anchor === void 0) return void 0;
8955
- return ctx.resultPool.getCanonicalOptions({ main: anchor }, [{ axes: [{
8956
- anchor: "main",
8957
- idx: 0
8958
- }] }]);
8974
+ }).output("stateMatrixOptions", (ctx) => {
8975
+ const options = ctx.resultPool.getOptions([{ name: STATE_MATRIX }], { label: { includeNativeLabel: false } });
8976
+ const labelCounts = /* @__PURE__ */ new Map();
8977
+ for (const o of options) labelCounts.set(o.label, (labelCounts.get(o.label) ?? 0) + 1);
8978
+ return options.map((o) => {
8979
+ if ((labelCounts.get(o.label) ?? 0) <= 1) return o;
8980
+ const alphabet = ctx.resultPool.getPColumnSpecByRef(o.ref)?.axesSpec.find((a) => a.domain?.["pl7.app/alphabet"])?.domain?.["pl7.app/alphabet"];
8981
+ const suffix = alphabet === "aminoacid" ? " (aa)" : alphabet === "nucleotide" ? " (nt)" : "";
8982
+ return {
8983
+ ...o,
8984
+ label: o.label + suffix
8985
+ };
8986
+ });
8987
+ }).output("abundanceOptions", (ctx) => {
8988
+ const { stateMatrixRef } = ctx.data;
8989
+ if (stateMatrixRef === void 0) return void 0;
8990
+ const stateSpec = ctx.resultPool.getPColumnSpecByRef(stateMatrixRef);
8991
+ if (!stateSpec) return void 0;
8992
+ const smVariantKey = stateSpec.axesSpec.find((a) => a.name === VARIANT_KEY_AXIS);
8993
+ if (!smVariantKey) return void 0;
8994
+ const runId = smVariantKey.domain?.["pl7.app/repertoire/extractionRunId"];
8995
+ const alphabet = smVariantKey.domain?.["pl7.app/alphabet"];
8996
+ return ctx.resultPool.getOptions((spec) => {
8997
+ if (spec.kind !== "PColumn") return false;
8998
+ const s = spec;
8999
+ if (s.annotations?.["pl7.app/isAbundance"] !== "true") return false;
9000
+ if (s.axesSpec.length !== 2) return false;
9001
+ const vk = s.axesSpec.find((a) => a.name === VARIANT_KEY_AXIS);
9002
+ if (!vk || !s.axesSpec.some((a) => a.name === SAMPLE_ID_AXIS)) return false;
9003
+ return vk.domain?.["pl7.app/repertoire/extractionRunId"] === runId && vk.domain?.["pl7.app/alphabet"] === alphabet;
9004
+ }, { label: { includeNativeLabel: true } });
9005
+ }).output("propertyOptions", (ctx) => {
9006
+ const stateMatrixRef = ctx.data.stateMatrixRef;
9007
+ if (stateMatrixRef === void 0) return void 0;
9008
+ const stateSpec = ctx.resultPool.getPColumnSpecByRef(stateMatrixRef);
9009
+ if (!stateSpec) return void 0;
9010
+ const anchors = { main: stateSpec };
9011
+ const abundanceRef = ctx.data.abundanceRef;
9012
+ const abundanceSpec = abundanceRef ? ctx.resultPool.getPColumnSpecByRef(abundanceRef) : void 0;
9013
+ if (abundanceSpec) anchors.freqAnchor = abundanceSpec;
9014
+ const sourceColumns = ctx.resultPool.selectColumns((spec) => spec.valueType !== "File" && !(spec.annotations?.["pl7.app/isLinkerColumn"] === "true" && spec.axesSpec.length > 2));
9015
+ const collection = new ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSource(sourceColumns).build({ anchors });
9016
+ if (!collection) return void 0;
9017
+ const numeric = /* @__PURE__ */ new Set([
9018
+ "Int",
9019
+ "Long",
9020
+ "Float",
9021
+ "Double"
9022
+ ]);
9023
+ const seen = /* @__PURE__ */ new Set();
9024
+ const options = [];
9025
+ for (const m of collection.findColumns({
9026
+ mode: "enrichment",
9027
+ maxHops: 0
9028
+ })) {
9029
+ if (!numeric.has(m.column.spec.valueType)) continue;
9030
+ const dedupKey = m.column.spec.name + "|" + JSON.stringify(m.column.spec.domain ?? {});
9031
+ if (seen.has(dedupKey)) continue;
9032
+ seen.add(dedupKey);
9033
+ options.push({
9034
+ label: m.column.spec.annotations?.["pl7.app/label"] ?? m.column.id,
9035
+ value: m.column.id
9036
+ });
9037
+ }
9038
+ return options;
9039
+ }).output("roundFrequencyOptions", (ctx) => {
9040
+ const abundanceRef = ctx.data.abundanceRef;
9041
+ if (abundanceRef === void 0) return void 0;
9042
+ const anchorSpec = ctx.resultPool.getPColumnSpecByRef(abundanceRef);
9043
+ if (!anchorSpec) return void 0;
9044
+ const sourceColumns = ctx.resultPool.selectColumns((spec) => spec.valueType !== "File" && !(spec.annotations?.["pl7.app/isLinkerColumn"] === "true" && spec.axesSpec.length > 2));
9045
+ const collection = new ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSource(sourceColumns).build({ anchors: { freqAnchor: anchorSpec } });
9046
+ if (!collection) return void 0;
9047
+ return collection.findColumns({
9048
+ include: { name: "pl7.app/frequency" },
9049
+ mode: "enrichment",
9050
+ maxHops: 0
9051
+ }).map((m) => ({
9052
+ label: m.column.spec.annotations?.["pl7.app/label"] ?? m.column.id,
9053
+ value: m.column.id
9054
+ }));
8959
9055
  }).output("knownAbundanceOptions", (ctx) => ctx.resultPool.getOptions([{
8960
9056
  axes: [{ name: SAMPLE_ID_AXIS }, { name: KNOWN_VARIANT_KEY_AXIS }],
8961
9057
  annotations: {
8962
9058
  "pl7.app/isAbundance": "true",
8963
9059
  "pl7.app/abundance/aggregated": "true"
8964
9060
  }
8965
- }], { label: { includeNativeLabel: true } })).output("stateMatrixSpec", (ctx) => ctx.data.stateMatrixRef ? ctx.resultPool.getPColumnSpecByRef(ctx.data.stateMatrixRef) : void 0).output("sampleLabelPframe", (ctx) => {
9061
+ }], { label: { includeNativeLabel: true } })).output("stateMatrixSpec", (ctx) => ctx.data.stateMatrixRef ? ctx.resultPool.getPColumnSpecByRef(ctx.data.stateMatrixRef) : void 0).output("stateMatrixPf", (ctx) => {
9062
+ const { stateMatrixRef } = ctx.data;
9063
+ if (stateMatrixRef === void 0) return void 0;
9064
+ const col = ctx.resultPool.getPColumnByRef(stateMatrixRef);
9065
+ if (col === void 0) return void 0;
9066
+ return ctx.createPFrame([col]);
9067
+ }).output("stateMatrixColId", (ctx) => {
9068
+ const { stateMatrixRef } = ctx.data;
9069
+ if (stateMatrixRef === void 0) return void 0;
9070
+ return ctx.resultPool.getPColumnByRef(stateMatrixRef)?.id;
9071
+ }).output("sampleLabelPframe", (ctx) => {
8966
9072
  const { abundanceRef } = ctx.data;
8967
9073
  if (abundanceRef === void 0) return void 0;
8968
9074
  const cols = ctx.resultPool.getAnchoredPColumns({ main: abundanceRef }, [{
@@ -8998,6 +9104,20 @@ const platforma$1 = BlockModelV3.create(dataModel).args((data) => {
8998
9104
  } catch {
8999
9105
  return;
9000
9106
  }
9107
+ }).outputWithStatus("compositionHeatmapPf", (ctx) => {
9108
+ try {
9109
+ const pCols = ctx.outputs?.resolve("compositionHeatmapPf")?.getPColumns();
9110
+ if (pCols === void 0) return void 0;
9111
+ return createPFrameForGraphs(ctx, pCols);
9112
+ } catch {
9113
+ return;
9114
+ }
9115
+ }).output("compositionHeatmapPCols", (ctx) => {
9116
+ try {
9117
+ return ctx.outputs?.resolve("compositionHeatmapPf")?.getPColumns();
9118
+ } catch {
9119
+ return;
9120
+ }
9001
9121
  }).outputWithStatus("knownHeatmapPf", (ctx) => {
9002
9122
  const { knownAbundanceRef } = ctx.data;
9003
9123
  if (knownAbundanceRef === void 0) return void 0;
@@ -9040,12 +9160,17 @@ const platforma$1 = BlockModelV3.create(dataModel).args((data) => {
9040
9160
  } catch {
9041
9161
  return;
9042
9162
  }
9043
- }).output("isRunning", (ctx) => ctx.outputs?.getIsReadyOrError() === false).title(() => "Deep Mutational Scanning").sections((ctx) => {
9163
+ }).output("isRunning", (ctx) => ctx.outputs?.getIsReadyOrError() === false).title(() => "Deep Mutational Scanning").subtitle((ctx) => ctx.data.customBlockLabel || ctx.data.defaultBlockLabel || NO_DATASET_LABEL).sections((ctx) => {
9044
9164
  const sections = [{
9045
9165
  type: "link",
9046
9166
  href: "/",
9047
9167
  label: "Mutation Heatmap"
9048
9168
  }];
9169
+ if (ctx.data.roundFrequencyRefs.length >= 2) sections.push({
9170
+ type: "link",
9171
+ href: "/composition",
9172
+ label: "Enrichment Analysis"
9173
+ });
9049
9174
  if (ctx.data.knownAbundanceRef !== void 0) sections.push({
9050
9175
  type: "link",
9051
9176
  href: "/known-heatmap",