@operato/twin-kernel 0.7.29 → 0.7.31
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/flow-engine.d.ts +40 -0
- package/dist/flow-engine.js +67 -6
- package/dist-cjs/index.cjs +63 -6
- package/package.json +1 -1
package/dist/flow-engine.d.ts
CHANGED
|
@@ -248,6 +248,15 @@ export declare const ATTENTION_DEFAULTS: {
|
|
|
248
248
|
export declare const OPERATION_PROPERTY: {
|
|
249
249
|
/** 그 현장에서 이 공정이 걸리는 시간 — 실측이 없을 때 상수를 대신한다. */
|
|
250
250
|
readonly duration: "operation.duration";
|
|
251
|
+
/**
|
|
252
|
+
* 양품률 — 이 공정을 지난 것 중 몇이 양품인가. **커널이 읽는 값은 0..1** 이다(`OP_PARAM.yield`).
|
|
253
|
+
*
|
|
254
|
+
* 기본값이 코드 상수(0.8)였고, 그 상수가 불량 과다 주목 신호까지 만들었다 — 현장이 자기 수를 말할
|
|
255
|
+
* 자리가 필요하다. 사람이 넣는 단위(퍼센트)와 커널이 읽는 값(비율)이 다르므로 환산은 호스트가 한다.
|
|
256
|
+
*/
|
|
257
|
+
readonly yield: "operation.yield";
|
|
258
|
+
/** 셋업·체인지오버 시간 — 가동 앞에 붙는다(`OP_PARAM.setupDuration`, ISO 8601). */
|
|
259
|
+
readonly setupDuration: "operation.setupDuration";
|
|
251
260
|
};
|
|
252
261
|
/** 판정에 쓸 기준 — 대상별 선언이 있으면 그것, 없으면 기본값(그 사실을 함께 든다). */
|
|
253
262
|
export interface AttentionThresholds {
|
|
@@ -366,6 +375,13 @@ export declare abstract class FlowEngine implements TwinKernel {
|
|
|
366
375
|
* 없다), 행을 지어 만들면 지어낸 `intent` 가 능력 계산까지 오염시킨다.
|
|
367
376
|
*/
|
|
368
377
|
protected localDurations: Map<string, number>;
|
|
378
|
+
/**
|
|
379
|
+
* 현장이 선언한 공정 모수(작업 종류 → 모수 id → 값) — `declareParameters` 로 들어온다.
|
|
380
|
+
*
|
|
381
|
+
* 값은 **표준 표기 그대로** 든다(ISA-95 `Parameter.Value.ValueString`): 수율은 0..1, 셋업은 ISO 8601.
|
|
382
|
+
* 읽는 쪽(`paramNumber`·`paramDuration`)이 명세 행보다 이것을 먼저 본다.
|
|
383
|
+
*/
|
|
384
|
+
protected localParams: Map<string, Map<string, string>>;
|
|
369
385
|
/** 관측 구동(P0) — 이벤트를 접는 투영기와 그 사실. tick 과 섞이지 않게 명시적으로 들고 있다. */
|
|
370
386
|
private observer?;
|
|
371
387
|
/** 관측분이 아직 커널 상태로 옮겨지지 않았다 — 스냅샷·fork 직전에 한 번만 옮긴다. */
|
|
@@ -713,6 +729,23 @@ export declare abstract class FlowEngine implements TwinKernel {
|
|
|
713
729
|
* 그 어긋남을 아무도 볼 수 없다(이 시스템에서 가장 비싼 종류의 침묵이다).
|
|
714
730
|
*/
|
|
715
731
|
declareDurations(durations: Record<string, IsoDuration> | undefined | null): void;
|
|
732
|
+
/**
|
|
733
|
+
* **현장이 정한 공정 모수** — 수율·셋업처럼 「얼마나 성공하나·바꾸는 데 얼마나 걸리나」 (2026-08-19).
|
|
734
|
+
*
|
|
735
|
+
* ── 왜 필요한가 ─────────────────────────────────────────────────────────────
|
|
736
|
+
* 양품률의 기본값은 커널 소스의 상수 0.8 이었다. 그 상수는 조용하지 않다: **불량 판정(주목 신호)까지
|
|
737
|
+
* 만든다** — 초기 라인이든 성숙한 라인이든 같은 0.8 로 굴러가고, 화면은 그 결과를 사실처럼 보인다.
|
|
738
|
+
* 셋업도 같다(기본 상수). 현장이 자기 수를 말할 문이 없었다.
|
|
739
|
+
*
|
|
740
|
+
* ── 소요시간과 같은 규율 ────────────────────────────────────────────────────
|
|
741
|
+
* · 값은 **표준 표기 그대로** 받는다(ISA-95 `Parameter.Value.ValueString`): 수율 0..1, 셋업 ISO 8601.
|
|
742
|
+
* 퍼센트·분 같은 사람 단위를 커널이 알 필요는 없다 — 그 환산은 값을 받는 쪽(호스트)이 한다.
|
|
743
|
+
* · **현장 선언이 원천 명세를 이긴다**(ADR-0034) — 원천 사본이 낡았을 때 고칠 자리가 그것뿐이다.
|
|
744
|
+
* · 명세 행이 없는 종류에도 얹힌다 — 행을 지어 만들면 지어낸 `intent` 가 능력 계산을 오염시킨다.
|
|
745
|
+
* · 무엇을 썼는지는 `specCoverage()` 의 `parameters` 가 그대로 밝힌다.
|
|
746
|
+
* · 빈 이름·빈 값은 **던진다**: 받아 두고 무시하면 화면은 「넣었습니다」라고 말하고 시뮬은 상수로 돈다.
|
|
747
|
+
*/
|
|
748
|
+
declareParameters(params: Record<string, Record<string, string | number>> | undefined | null): void;
|
|
716
749
|
/**
|
|
717
750
|
* 라우트(공정 순서) — 수율을 거슬러 올릴 때 필요하다. 기본은 모른다(선언 순서를 쓴다).
|
|
718
751
|
* 생산 정의를 가진 커널이 override 해서 자기 라우트를 답한다.
|
|
@@ -791,6 +824,13 @@ export declare abstract class FlowEngine implements TwinKernel {
|
|
|
791
824
|
protected paramNumber(opKey: string, id: string): number | undefined;
|
|
792
825
|
/** 명세 모수(기간) — ISO 8601 문자열을 밀리초로. 선언 없으면 undefined. */
|
|
793
826
|
protected paramDuration(opKey: string, id: string): number | undefined;
|
|
827
|
+
/**
|
|
828
|
+
* 모수 값 한 개 — **현장이 정한 것이 원천 명세를 이긴다**(소요시간과 같은 순서: ADR-0034).
|
|
829
|
+
*
|
|
830
|
+
* 두 읽기(수·기간)가 같은 자리에서 값을 얻어야 우선순위가 한 벌로 남는다 — 예전에는 각자 명세 행만
|
|
831
|
+
* 뒤졌고, 그래서 현장 선언을 얹을 자리가 아예 없었다.
|
|
832
|
+
*/
|
|
833
|
+
private paramValue;
|
|
794
834
|
private noteSpecUse;
|
|
795
835
|
private noteParamUse;
|
|
796
836
|
/**
|
package/dist/flow-engine.js
CHANGED
|
@@ -77,7 +77,16 @@ export const ATTENTION_DEFAULTS = { congestionPct: 90, scrapPct: 15, scrapMinSam
|
|
|
77
77
|
*/
|
|
78
78
|
export const OPERATION_PROPERTY = {
|
|
79
79
|
/** 그 현장에서 이 공정이 걸리는 시간 — 실측이 없을 때 상수를 대신한다. */
|
|
80
|
-
duration: 'operation.duration'
|
|
80
|
+
duration: 'operation.duration',
|
|
81
|
+
/**
|
|
82
|
+
* 양품률 — 이 공정을 지난 것 중 몇이 양품인가. **커널이 읽는 값은 0..1** 이다(`OP_PARAM.yield`).
|
|
83
|
+
*
|
|
84
|
+
* 기본값이 코드 상수(0.8)였고, 그 상수가 불량 과다 주목 신호까지 만들었다 — 현장이 자기 수를 말할
|
|
85
|
+
* 자리가 필요하다. 사람이 넣는 단위(퍼센트)와 커널이 읽는 값(비율)이 다르므로 환산은 호스트가 한다.
|
|
86
|
+
*/
|
|
87
|
+
yield: 'operation.yield',
|
|
88
|
+
/** 셋업·체인지오버 시간 — 가동 앞에 붙는다(`OP_PARAM.setupDuration`, ISO 8601). */
|
|
89
|
+
setupDuration: 'operation.setupDuration'
|
|
81
90
|
};
|
|
82
91
|
export function deriveAttentions(view, acked,
|
|
83
92
|
/** 지금(ISO) — 납기 판정에 필요하다. **주지 않으면 지연을 판정하지 않는다**(모르면 판단하지 않는다). */
|
|
@@ -330,6 +339,13 @@ export class FlowEngine {
|
|
|
330
339
|
* 없다), 행을 지어 만들면 지어낸 `intent` 가 능력 계산까지 오염시킨다.
|
|
331
340
|
*/
|
|
332
341
|
localDurations = new Map();
|
|
342
|
+
/**
|
|
343
|
+
* 현장이 선언한 공정 모수(작업 종류 → 모수 id → 값) — `declareParameters` 로 들어온다.
|
|
344
|
+
*
|
|
345
|
+
* 값은 **표준 표기 그대로** 든다(ISA-95 `Parameter.Value.ValueString`): 수율은 0..1, 셋업은 ISO 8601.
|
|
346
|
+
* 읽는 쪽(`paramNumber`·`paramDuration`)이 명세 행보다 이것을 먼저 본다.
|
|
347
|
+
*/
|
|
348
|
+
localParams = new Map();
|
|
333
349
|
/** 관측 구동(P0) — 이벤트를 접는 투영기와 그 사실. tick 과 섞이지 않게 명시적으로 들고 있다. */
|
|
334
350
|
observer;
|
|
335
351
|
/** 관측분이 아직 커널 상태로 옮겨지지 않았다 — 스냅샷·fork 직전에 한 번만 옮긴다. */
|
|
@@ -1477,6 +1493,40 @@ export class FlowEngine {
|
|
|
1477
1493
|
this.localDurations.set(key, ms);
|
|
1478
1494
|
}
|
|
1479
1495
|
}
|
|
1496
|
+
/**
|
|
1497
|
+
* **현장이 정한 공정 모수** — 수율·셋업처럼 「얼마나 성공하나·바꾸는 데 얼마나 걸리나」 (2026-08-19).
|
|
1498
|
+
*
|
|
1499
|
+
* ── 왜 필요한가 ─────────────────────────────────────────────────────────────
|
|
1500
|
+
* 양품률의 기본값은 커널 소스의 상수 0.8 이었다. 그 상수는 조용하지 않다: **불량 판정(주목 신호)까지
|
|
1501
|
+
* 만든다** — 초기 라인이든 성숙한 라인이든 같은 0.8 로 굴러가고, 화면은 그 결과를 사실처럼 보인다.
|
|
1502
|
+
* 셋업도 같다(기본 상수). 현장이 자기 수를 말할 문이 없었다.
|
|
1503
|
+
*
|
|
1504
|
+
* ── 소요시간과 같은 규율 ────────────────────────────────────────────────────
|
|
1505
|
+
* · 값은 **표준 표기 그대로** 받는다(ISA-95 `Parameter.Value.ValueString`): 수율 0..1, 셋업 ISO 8601.
|
|
1506
|
+
* 퍼센트·분 같은 사람 단위를 커널이 알 필요는 없다 — 그 환산은 값을 받는 쪽(호스트)이 한다.
|
|
1507
|
+
* · **현장 선언이 원천 명세를 이긴다**(ADR-0034) — 원천 사본이 낡았을 때 고칠 자리가 그것뿐이다.
|
|
1508
|
+
* · 명세 행이 없는 종류에도 얹힌다 — 행을 지어 만들면 지어낸 `intent` 가 능력 계산을 오염시킨다.
|
|
1509
|
+
* · 무엇을 썼는지는 `specCoverage()` 의 `parameters` 가 그대로 밝힌다.
|
|
1510
|
+
* · 빈 이름·빈 값은 **던진다**: 받아 두고 무시하면 화면은 「넣었습니다」라고 말하고 시뮬은 상수로 돈다.
|
|
1511
|
+
*/
|
|
1512
|
+
declareParameters(params) {
|
|
1513
|
+
for (const [kind, entries] of Object.entries(params ?? {})) {
|
|
1514
|
+
const key = String(kind ?? '').trim();
|
|
1515
|
+
if (!key)
|
|
1516
|
+
throw new Error('declareParameters: an operation kind is empty — say which operation the parameter belongs to');
|
|
1517
|
+
for (const [id, value] of Object.entries(entries ?? {})) {
|
|
1518
|
+
const paramId = String(id ?? '').trim();
|
|
1519
|
+
if (!paramId)
|
|
1520
|
+
throw new Error(`declareParameters: operation "${key}" has a parameter with no id — the value would never be read`);
|
|
1521
|
+
const text = String(value ?? '').trim();
|
|
1522
|
+
if (!text)
|
|
1523
|
+
throw new Error(`declareParameters: "${key}.${paramId}" has no value — an empty parameter is not a declaration`);
|
|
1524
|
+
const bucket = this.localParams.get(key) ?? new Map();
|
|
1525
|
+
bucket.set(paramId, text);
|
|
1526
|
+
this.localParams.set(key, bucket);
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1480
1530
|
/**
|
|
1481
1531
|
* 라우트(공정 순서) — 수율을 거슬러 올릴 때 필요하다. 기본은 모른다(선언 순서를 쓴다).
|
|
1482
1532
|
* 생산 정의를 가진 커널이 override 해서 자기 라우트를 답한다.
|
|
@@ -1659,10 +1709,10 @@ export class FlowEngine {
|
|
|
1659
1709
|
}
|
|
1660
1710
|
/** 명세 모수(숫자) — 선언 없으면 undefined(0 으로 꾸미지 않는다). 소비처가 기본값을 정한다. */
|
|
1661
1711
|
paramNumber(opKey, id) {
|
|
1662
|
-
const
|
|
1663
|
-
if (
|
|
1712
|
+
const raw = this.paramValue(opKey, id);
|
|
1713
|
+
if (raw === undefined)
|
|
1664
1714
|
return undefined;
|
|
1665
|
-
const n = Number(
|
|
1715
|
+
const n = Number(raw);
|
|
1666
1716
|
if (!Number.isFinite(n))
|
|
1667
1717
|
return undefined;
|
|
1668
1718
|
this.noteParamUse(opKey, id);
|
|
@@ -1670,12 +1720,23 @@ export class FlowEngine {
|
|
|
1670
1720
|
}
|
|
1671
1721
|
/** 명세 모수(기간) — ISO 8601 문자열을 밀리초로. 선언 없으면 undefined. */
|
|
1672
1722
|
paramDuration(opKey, id) {
|
|
1673
|
-
const
|
|
1674
|
-
const ms = parseIsoDuration(p?.value);
|
|
1723
|
+
const ms = parseIsoDuration(this.paramValue(opKey, id));
|
|
1675
1724
|
if (ms !== undefined)
|
|
1676
1725
|
this.noteParamUse(opKey, id);
|
|
1677
1726
|
return ms;
|
|
1678
1727
|
}
|
|
1728
|
+
/**
|
|
1729
|
+
* 모수 값 한 개 — **현장이 정한 것이 원천 명세를 이긴다**(소요시간과 같은 순서: ADR-0034).
|
|
1730
|
+
*
|
|
1731
|
+
* 두 읽기(수·기간)가 같은 자리에서 값을 얻어야 우선순위가 한 벌로 남는다 — 예전에는 각자 명세 행만
|
|
1732
|
+
* 뒤졌고, 그래서 현장 선언을 얹을 자리가 아예 없었다.
|
|
1733
|
+
*/
|
|
1734
|
+
paramValue(opKey, id) {
|
|
1735
|
+
const local = this.localParams.get(opKey)?.get(id);
|
|
1736
|
+
if (local !== undefined)
|
|
1737
|
+
return local;
|
|
1738
|
+
return this.operationSpecs.get(opKey)?.parameters?.find(x => x.id === id)?.value;
|
|
1739
|
+
}
|
|
1679
1740
|
noteSpecUse(kind, duration, variability) {
|
|
1680
1741
|
const cur = this.specUse.get(kind);
|
|
1681
1742
|
if (cur) {
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -2966,7 +2966,16 @@ var ATTENTION_PROPERTY = {
|
|
|
2966
2966
|
var ATTENTION_DEFAULTS = { congestionPct: 90, scrapPct: 15, scrapMinSamples: 10 };
|
|
2967
2967
|
var OPERATION_PROPERTY = {
|
|
2968
2968
|
/** 그 현장에서 이 공정이 걸리는 시간 — 실측이 없을 때 상수를 대신한다. */
|
|
2969
|
-
duration: "operation.duration"
|
|
2969
|
+
duration: "operation.duration",
|
|
2970
|
+
/**
|
|
2971
|
+
* 양품률 — 이 공정을 지난 것 중 몇이 양품인가. **커널이 읽는 값은 0..1** 이다(`OP_PARAM.yield`).
|
|
2972
|
+
*
|
|
2973
|
+
* 기본값이 코드 상수(0.8)였고, 그 상수가 불량 과다 주목 신호까지 만들었다 — 현장이 자기 수를 말할
|
|
2974
|
+
* 자리가 필요하다. 사람이 넣는 단위(퍼센트)와 커널이 읽는 값(비율)이 다르므로 환산은 호스트가 한다.
|
|
2975
|
+
*/
|
|
2976
|
+
yield: "operation.yield",
|
|
2977
|
+
/** 셋업·체인지오버 시간 — 가동 앞에 붙는다(`OP_PARAM.setupDuration`, ISO 8601). */
|
|
2978
|
+
setupDuration: "operation.setupDuration"
|
|
2970
2979
|
};
|
|
2971
2980
|
function deriveAttentions(view, acked, nowIso, thresholds) {
|
|
2972
2981
|
const out = [];
|
|
@@ -3175,6 +3184,13 @@ var FlowEngine = class {
|
|
|
3175
3184
|
* 없다), 행을 지어 만들면 지어낸 `intent` 가 능력 계산까지 오염시킨다.
|
|
3176
3185
|
*/
|
|
3177
3186
|
localDurations = /* @__PURE__ */ new Map();
|
|
3187
|
+
/**
|
|
3188
|
+
* 현장이 선언한 공정 모수(작업 종류 → 모수 id → 값) — `declareParameters` 로 들어온다.
|
|
3189
|
+
*
|
|
3190
|
+
* 값은 **표준 표기 그대로** 든다(ISA-95 `Parameter.Value.ValueString`): 수율은 0..1, 셋업은 ISO 8601.
|
|
3191
|
+
* 읽는 쪽(`paramNumber`·`paramDuration`)이 명세 행보다 이것을 먼저 본다.
|
|
3192
|
+
*/
|
|
3193
|
+
localParams = /* @__PURE__ */ new Map();
|
|
3178
3194
|
/** 관측 구동(P0) — 이벤트를 접는 투영기와 그 사실. tick 과 섞이지 않게 명시적으로 들고 있다. */
|
|
3179
3195
|
observer;
|
|
3180
3196
|
/** 관측분이 아직 커널 상태로 옮겨지지 않았다 — 스냅샷·fork 직전에 한 번만 옮긴다. */
|
|
@@ -4213,6 +4229,37 @@ var FlowEngine = class {
|
|
|
4213
4229
|
this.localDurations.set(key, ms2);
|
|
4214
4230
|
}
|
|
4215
4231
|
}
|
|
4232
|
+
/**
|
|
4233
|
+
* **현장이 정한 공정 모수** — 수율·셋업처럼 「얼마나 성공하나·바꾸는 데 얼마나 걸리나」 (2026-08-19).
|
|
4234
|
+
*
|
|
4235
|
+
* ── 왜 필요한가 ─────────────────────────────────────────────────────────────
|
|
4236
|
+
* 양품률의 기본값은 커널 소스의 상수 0.8 이었다. 그 상수는 조용하지 않다: **불량 판정(주목 신호)까지
|
|
4237
|
+
* 만든다** — 초기 라인이든 성숙한 라인이든 같은 0.8 로 굴러가고, 화면은 그 결과를 사실처럼 보인다.
|
|
4238
|
+
* 셋업도 같다(기본 상수). 현장이 자기 수를 말할 문이 없었다.
|
|
4239
|
+
*
|
|
4240
|
+
* ── 소요시간과 같은 규율 ────────────────────────────────────────────────────
|
|
4241
|
+
* · 값은 **표준 표기 그대로** 받는다(ISA-95 `Parameter.Value.ValueString`): 수율 0..1, 셋업 ISO 8601.
|
|
4242
|
+
* 퍼센트·분 같은 사람 단위를 커널이 알 필요는 없다 — 그 환산은 값을 받는 쪽(호스트)이 한다.
|
|
4243
|
+
* · **현장 선언이 원천 명세를 이긴다**(ADR-0034) — 원천 사본이 낡았을 때 고칠 자리가 그것뿐이다.
|
|
4244
|
+
* · 명세 행이 없는 종류에도 얹힌다 — 행을 지어 만들면 지어낸 `intent` 가 능력 계산을 오염시킨다.
|
|
4245
|
+
* · 무엇을 썼는지는 `specCoverage()` 의 `parameters` 가 그대로 밝힌다.
|
|
4246
|
+
* · 빈 이름·빈 값은 **던진다**: 받아 두고 무시하면 화면은 「넣었습니다」라고 말하고 시뮬은 상수로 돈다.
|
|
4247
|
+
*/
|
|
4248
|
+
declareParameters(params) {
|
|
4249
|
+
for (const [kind, entries] of Object.entries(params ?? {})) {
|
|
4250
|
+
const key = String(kind ?? "").trim();
|
|
4251
|
+
if (!key) throw new Error("declareParameters: an operation kind is empty \u2014 say which operation the parameter belongs to");
|
|
4252
|
+
for (const [id, value] of Object.entries(entries ?? {})) {
|
|
4253
|
+
const paramId = String(id ?? "").trim();
|
|
4254
|
+
if (!paramId) throw new Error(`declareParameters: operation "${key}" has a parameter with no id \u2014 the value would never be read`);
|
|
4255
|
+
const text = String(value ?? "").trim();
|
|
4256
|
+
if (!text) throw new Error(`declareParameters: "${key}.${paramId}" has no value \u2014 an empty parameter is not a declaration`);
|
|
4257
|
+
const bucket = this.localParams.get(key) ?? /* @__PURE__ */ new Map();
|
|
4258
|
+
bucket.set(paramId, text);
|
|
4259
|
+
this.localParams.set(key, bucket);
|
|
4260
|
+
}
|
|
4261
|
+
}
|
|
4262
|
+
}
|
|
4216
4263
|
/**
|
|
4217
4264
|
* 라우트(공정 순서) — 수율을 거슬러 올릴 때 필요하다. 기본은 모른다(선언 순서를 쓴다).
|
|
4218
4265
|
* 생산 정의를 가진 커널이 override 해서 자기 라우트를 답한다.
|
|
@@ -4377,20 +4424,30 @@ var FlowEngine = class {
|
|
|
4377
4424
|
}
|
|
4378
4425
|
/** 명세 모수(숫자) — 선언 없으면 undefined(0 으로 꾸미지 않는다). 소비처가 기본값을 정한다. */
|
|
4379
4426
|
paramNumber(opKey, id) {
|
|
4380
|
-
const
|
|
4381
|
-
if (
|
|
4382
|
-
const n = Number(
|
|
4427
|
+
const raw = this.paramValue(opKey, id);
|
|
4428
|
+
if (raw === void 0) return void 0;
|
|
4429
|
+
const n = Number(raw);
|
|
4383
4430
|
if (!Number.isFinite(n)) return void 0;
|
|
4384
4431
|
this.noteParamUse(opKey, id);
|
|
4385
4432
|
return n;
|
|
4386
4433
|
}
|
|
4387
4434
|
/** 명세 모수(기간) — ISO 8601 문자열을 밀리초로. 선언 없으면 undefined. */
|
|
4388
4435
|
paramDuration(opKey, id) {
|
|
4389
|
-
const
|
|
4390
|
-
const ms2 = parseIsoDuration(p?.value);
|
|
4436
|
+
const ms2 = parseIsoDuration(this.paramValue(opKey, id));
|
|
4391
4437
|
if (ms2 !== void 0) this.noteParamUse(opKey, id);
|
|
4392
4438
|
return ms2;
|
|
4393
4439
|
}
|
|
4440
|
+
/**
|
|
4441
|
+
* 모수 값 한 개 — **현장이 정한 것이 원천 명세를 이긴다**(소요시간과 같은 순서: ADR-0034).
|
|
4442
|
+
*
|
|
4443
|
+
* 두 읽기(수·기간)가 같은 자리에서 값을 얻어야 우선순위가 한 벌로 남는다 — 예전에는 각자 명세 행만
|
|
4444
|
+
* 뒤졌고, 그래서 현장 선언을 얹을 자리가 아예 없었다.
|
|
4445
|
+
*/
|
|
4446
|
+
paramValue(opKey, id) {
|
|
4447
|
+
const local = this.localParams.get(opKey)?.get(id);
|
|
4448
|
+
if (local !== void 0) return local;
|
|
4449
|
+
return this.operationSpecs.get(opKey)?.parameters?.find((x) => x.id === id)?.value;
|
|
4450
|
+
}
|
|
4394
4451
|
noteSpecUse(kind, duration, variability) {
|
|
4395
4452
|
const cur = this.specUse.get(kind);
|
|
4396
4453
|
if (cur) {
|
package/package.json
CHANGED