@platforma-open/milaboratories.sequence-properties.workflow 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
   WARN  Issue while reading "/home/runner/work/sequence-properties/sequence-properties/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
2
2
 
3
- > @platforma-open/milaboratories.sequence-properties.workflow@1.1.1 build /home/runner/work/sequence-properties/sequence-properties/workflow
3
+ > @platforma-open/milaboratories.sequence-properties.workflow@1.1.2 build /home/runner/work/sequence-properties/sequence-properties/workflow
4
4
  > shx rm -rf dist && pl-tengo check && pl-tengo build
5
5
 
6
6
  info: Skipping unknown file type: wf.test.ts
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @platforma-open/MiLaboratories.sequence-properties.workflow
2
2
 
3
+ ## 1.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 9d628d9: **Workflow (SD-008):** Derive receptor from `pl7.app/vdj/chain` when `pl7.app/vdj/receptor` is absent. Bulk MiXCR axes carry the chain key (`IGHeavy`, `IGLight`, `TCRAlpha`, `TCRBeta`, `TCRGamma`, `TCRDelta`) without the receptor key, which previously fired R13b's "Receptor type not detected" warning on every bulk run. Detection precedence now: axis receptor → axis chain → per-column receptor → per-column chain → IG default + warning. Inputs that carry receptor explicitly are unaffected.
8
+
9
+ **Model:** Default-visible single upstream amino-acid sequence column matching the analysed coverage tier — peptide (`pl7.app/sequence`, feature=peptide) for peptide mode; full-chain VDJRegion (`pl7.app/vdj/sequence`, feature=VDJRegion or VDJRegionInFrame, chain A) for `full_chain` tier; CDR3 (`pl7.app/vdj/sequence`, feature=CDR3, chain A) for `cdr3_only` and `partial` tiers. Chain B (light / beta / delta) and secondary alleles stay available via the column picker.
10
+
11
+ **UI:** Move the "Input dataset" picker into a Settings slide-out drawer (matches the convention used by clonotype-clustering and other sibling blocks). Drawer auto-opens on first load when no input is selected, auto-closes when the workflow starts running.
12
+
13
+ **Software:** Switch the Python runenv from `runenv-python-3:3.12.10` to `runenv-python-3:3.12.10-scientific-slim`. The scientific-slim image now ships biopython, so the per-block dependency install is faster and matches the convention used by sibling python blocks (e.g. `titeseq-analysis`).
14
+
15
+ - Updated dependencies [9d628d9]
16
+ - @platforma-open/milaboratories.sequence-properties.software@1.1.1
17
+
3
18
  ## 1.1.1
4
19
 
5
20
  ### Patch Changes
Binary file
Binary file
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@platforma-open/milaboratories.sequence-properties.workflow",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Block Workflow",
5
5
  "type": "module",
6
6
  "dependencies": {
7
7
  "@platforma-sdk/workflow-tengo": "5.16.0",
8
- "@platforma-open/milaboratories.sequence-properties.software": "1.1.0"
8
+ "@platforma-open/milaboratories.sequence-properties.software": "1.1.1"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@platforma-sdk/tengo-builder": "2.5.17",
@@ -58,6 +58,44 @@ contains := func(arr, x) {
58
58
  return false
59
59
  }
60
60
 
61
+ // Spec deviation SD-008 — see docs/spec-deviations.md.
62
+ // Bulk MiXCR axes carry `pl7.app/vdj/chain` without the spec-required
63
+ // `pl7.app/vdj/receptor`. The chain enum maps unambiguously to a receptor —
64
+ // derive it when receptor is absent. Returns "" for unrecognised input;
65
+ // caller falls through to the IG default + R13b warning, which still fires
66
+ // for genuinely unknown datasets.
67
+ CHAIN_TO_RECEPTOR := {
68
+ IGHeavy: "IG",
69
+ IGLight: "IG",
70
+ IGKappa: "IG",
71
+ IGLambda: "IG",
72
+ TCRAlpha: "TCRAB",
73
+ TCRBeta: "TCRAB",
74
+ TCRGamma: "TCRGD",
75
+ TCRDelta: "TCRGD"
76
+ }
77
+
78
+ chainToReceptor := func(chain) {
79
+ if chain == undefined { return "" }
80
+ r := CHAIN_TO_RECEPTOR[chain]
81
+ if r == undefined { return "" }
82
+ return r
83
+ }
84
+
85
+ // Resolve receptor from a (receptor, chain) domain pair. Explicit receptor
86
+ // wins; chain-derived receptor is the fallback. Returns { value, seen };
87
+ // `seen` false when neither key resolves.
88
+ resolveReceptor := func(receptorVal, chainVal) {
89
+ if receptorVal == "IG" || receptorVal == "TCRAB" || receptorVal == "TCRGD" {
90
+ return { value: receptorVal, seen: true }
91
+ }
92
+ derived := chainToReceptor(chainVal)
93
+ if derived != "" {
94
+ return { value: derived, seen: true }
95
+ }
96
+ return { value: "", seen: false }
97
+ }
98
+
61
99
  wf.prepare(func(args) {
62
100
  bb := wf.createPBundleBuilder()
63
101
  bb.ignoreMissingDomains()
@@ -132,10 +170,17 @@ wf.body(func(args) {
132
170
  // anchor's secondary axis), not on per-region sequence column domains. Read
133
171
  // from the axis first; the per-column check inside the loop stays as a
134
172
  // fallback for non-MiXCR producers.
173
+ //
174
+ // Spec deviation SD-008 — bulk MiXCR axes lack `pl7.app/vdj/receptor` but
175
+ // carry `pl7.app/vdj/chain`; derive receptor from chain when receptor is
176
+ // absent. See docs/spec-deviations.md.
135
177
  if keyAxisSpec.domain != undefined {
136
- axisR := keyAxisSpec.domain["pl7.app/vdj/receptor"]
137
- if axisR == "IG" || axisR == "TCRAB" || axisR == "TCRGD" {
138
- receptor = axisR
178
+ r := resolveReceptor(
179
+ keyAxisSpec.domain["pl7.app/vdj/receptor"],
180
+ keyAxisSpec.domain["pl7.app/vdj/chain"]
181
+ )
182
+ if r.seen {
183
+ receptor = r.value
139
184
  receptorSeen = true
140
185
  }
141
186
  }
@@ -192,9 +237,10 @@ wf.body(func(args) {
192
237
  }
193
238
 
194
239
  // Same receptor value is expected on every input column; last seen wins.
195
- r := d["pl7.app/vdj/receptor"]
196
- if r == "IG" || r == "TCRAB" || r == "TCRGD" {
197
- receptor = r
240
+ // SD-008: derive from chain when explicit receptor key is absent.
241
+ rec := resolveReceptor(d["pl7.app/vdj/receptor"], d["pl7.app/vdj/chain"])
242
+ if rec.seen {
243
+ receptor = rec.value
198
244
  receptorSeen = true
199
245
  }
200
246