@operato/twin-kernel 0.11.27 → 0.11.28
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 +5 -0
- package/dist/flow-engine.js +15 -0
- package/dist/observed-reducer.d.ts +7 -0
- package/dist/observed-reducer.js +12 -0
- package/dist-cjs/index.cjs +25 -2
- package/package.json +1 -1
package/dist/flow-engine.d.ts
CHANGED
|
@@ -825,6 +825,11 @@ export declare abstract class FlowEngine implements TwinKernel {
|
|
|
825
825
|
id: string;
|
|
826
826
|
since: string;
|
|
827
827
|
}[];
|
|
828
|
+
/**
|
|
829
|
+
* **접힌 오더**(ADR-0092) — 저널이나 원천을 다시 읽어 세우는 트윈도 이어받아야 한다. 이것이 없으면 세는 수를 잃고,
|
|
830
|
+
* 원천이 옛 종결을 다시 보낼 때 그것을 거를 경계가 없어 접힌 오더가 뜨거운 줄로 되살아난다.
|
|
831
|
+
*/
|
|
832
|
+
foldedOrders?: FoldedOrders;
|
|
828
833
|
}): void;
|
|
829
834
|
/**
|
|
830
835
|
* 씨앗의 확보분 중 **이 트윈에 실제로 있는 것만** 남긴다 — 없는 것은 세고 버린다.
|
package/dist/flow-engine.js
CHANGED
|
@@ -1049,6 +1049,21 @@ export class FlowEngine {
|
|
|
1049
1049
|
for (const e of snap?.attentionSince ?? [])
|
|
1050
1050
|
if (e?.id && e.since)
|
|
1051
1051
|
this._attentionSince.set(e.id, e.since);
|
|
1052
|
+
if (snap?.foldedOrders && foldedOrderCount(snap.foldedOrders)) {
|
|
1053
|
+
/*
|
|
1054
|
+
* 이미 접힌 것이 있으면(재개점이 먼저 되세웠다) 건드리지 않는다 — 같은 값을 또 더하면 세는 수가 두 번 는다.
|
|
1055
|
+
* 미러는 리듀서가 원천이다 — 거기에 넣어야 다시 온 옛 종결을 거른다. 리듀서가 아직 없으면 만든다(§restoreObserved).
|
|
1056
|
+
*/
|
|
1057
|
+
if (this.observeMode) {
|
|
1058
|
+
if (!this.observer)
|
|
1059
|
+
this.observer = new ObservedReducer(this.boardDef ?? { locations: [], equipment: [] });
|
|
1060
|
+
if (this.observer.adoptFoldedOrders(snap.foldedOrders))
|
|
1061
|
+
this.observedDirty = true;
|
|
1062
|
+
}
|
|
1063
|
+
else if (!foldedOrderCount(this.foldedOrders)) {
|
|
1064
|
+
this.foldedOrders = structuredClone(snap.foldedOrders);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1052
1067
|
}
|
|
1053
1068
|
/**
|
|
1054
1069
|
* 씨앗의 확보분 중 **이 트윈에 실제로 있는 것만** 남긴다 — 없는 것은 세고 버린다.
|
|
@@ -525,6 +525,13 @@ export declare class ObservedReducer {
|
|
|
525
525
|
* 모델에서 오는 판정 입력(교대·등급·시간대)은 생성자가 이미 세웠으므로 건드리지 않는다.
|
|
526
526
|
*/
|
|
527
527
|
restore(cp: ReducerCheckpoint): void;
|
|
528
|
+
/**
|
|
529
|
+
* **이어받은 접힌 쪽을 앉힌다**(ADR-0092) — 이어가기 씨앗으로 뜨는 미러가 부른다(§`FlowEngine.hydrateContinuity`).
|
|
530
|
+
*
|
|
531
|
+
* 이미 접힌 것이 있으면 **건드리지 않는다.** 재개점(체크포인트)이 먼저 되세웠다면 그것이 정본이고, 같은 값을 또 더하면 세는
|
|
532
|
+
* 수가 두 번 는다. 비어 있을 때만 이어받는다. 이어받았으면 참을 돌려준다.
|
|
533
|
+
*/
|
|
534
|
+
adoptFoldedOrders(folded: FoldedOrders): boolean;
|
|
528
535
|
/**
|
|
529
536
|
* **끝난 오더를 접는다**(ADR-0092) — 접은 수를 돌려준다.
|
|
530
537
|
*
|
package/dist/observed-reducer.js
CHANGED
|
@@ -1409,6 +1409,18 @@ export class ObservedReducer {
|
|
|
1409
1409
|
this.corrections = (cp?.corrections ?? []).map(c => ({ ...c }));
|
|
1410
1410
|
this.unhandled = new Map((cp?.unhandled ?? []).map(({ eventType, ...v }) => [eventType, { ...v }]));
|
|
1411
1411
|
}
|
|
1412
|
+
/**
|
|
1413
|
+
* **이어받은 접힌 쪽을 앉힌다**(ADR-0092) — 이어가기 씨앗으로 뜨는 미러가 부른다(§`FlowEngine.hydrateContinuity`).
|
|
1414
|
+
*
|
|
1415
|
+
* 이미 접힌 것이 있으면 **건드리지 않는다.** 재개점(체크포인트)이 먼저 되세웠다면 그것이 정본이고, 같은 값을 또 더하면 세는
|
|
1416
|
+
* 수가 두 번 는다. 비어 있을 때만 이어받는다. 이어받았으면 참을 돌려준다.
|
|
1417
|
+
*/
|
|
1418
|
+
adoptFoldedOrders(folded) {
|
|
1419
|
+
if (foldedOrderCount(this.foldedOrders))
|
|
1420
|
+
return false;
|
|
1421
|
+
this.foldedOrders = structuredClone(folded);
|
|
1422
|
+
return true;
|
|
1423
|
+
}
|
|
1412
1424
|
/**
|
|
1413
1425
|
* **끝난 오더를 접는다**(ADR-0092) — 접은 수를 돌려준다.
|
|
1414
1426
|
*
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -868,6 +868,7 @@ var ALLOCATION_POLICY = {
|
|
|
868
868
|
/** 먼저 만료되는 것부터(First Expired, First Out). */
|
|
869
869
|
fefo: "fefo"
|
|
870
870
|
};
|
|
871
|
+
var BASIS_UNKNOWN = ["BEFORE_BASELINE"];
|
|
871
872
|
var CMD = {
|
|
872
873
|
orderHold: "order.hold",
|
|
873
874
|
orderResume: "order.resume",
|
|
@@ -2299,8 +2300,12 @@ var SPECS = {
|
|
|
2299
2300
|
*/
|
|
2300
2301
|
recipeKey: "string",
|
|
2301
2302
|
recipeBasis: "object",
|
|
2302
|
-
materialBasis: "object[]"
|
|
2303
|
+
materialBasis: "object[]",
|
|
2304
|
+
/* 근거 칸이 빈 까닭 — 닫힌 낱말이다(§`BASIS_UNKNOWN`). 투입이 근거 장치보다 먼저였던 오더도 이행은 사실이다. */
|
|
2305
|
+
basisUnknown: "string"
|
|
2303
2306
|
},
|
|
2307
|
+
/* 상태·종류는 도메인이 소유한다 — 닫지 않는다. 근거가 빈 까닭은 커널이 읽으므로 닫는다. */
|
|
2308
|
+
enums: { basisUnknown: BASIS_UNKNOWN },
|
|
2304
2309
|
/*
|
|
2305
2310
|
* 확보분의 안쪽을 본다 — 열쇠와 수 둘이다(§`AllocatedQuantity`). 안 보면 틀린 이름이 조용히
|
|
2306
2311
|
* 지나가고(`epcs`·`quantity` 따위), 미러는 잡힌 수를 0 으로 읽는다.
|
|
@@ -2322,7 +2327,6 @@ var SPECS = {
|
|
|
2322
2327
|
positive: ["qty"]
|
|
2323
2328
|
}
|
|
2324
2329
|
}
|
|
2325
|
-
/* 상태·종류는 도메인이 소유한다 — 닫지 않는다. */
|
|
2326
2330
|
},
|
|
2327
2331
|
quality: {
|
|
2328
2332
|
eventType: OP_EVENT.quality,
|
|
@@ -3904,6 +3908,17 @@ var ObservedReducer = class {
|
|
|
3904
3908
|
this.corrections = (cp?.corrections ?? []).map((c) => ({ ...c }));
|
|
3905
3909
|
this.unhandled = new Map((cp?.unhandled ?? []).map(({ eventType, ...v }) => [eventType, { ...v }]));
|
|
3906
3910
|
}
|
|
3911
|
+
/**
|
|
3912
|
+
* **이어받은 접힌 쪽을 앉힌다**(ADR-0092) — 이어가기 씨앗으로 뜨는 미러가 부른다(§`FlowEngine.hydrateContinuity`).
|
|
3913
|
+
*
|
|
3914
|
+
* 이미 접힌 것이 있으면 **건드리지 않는다.** 재개점(체크포인트)이 먼저 되세웠다면 그것이 정본이고, 같은 값을 또 더하면 세는
|
|
3915
|
+
* 수가 두 번 는다. 비어 있을 때만 이어받는다. 이어받았으면 참을 돌려준다.
|
|
3916
|
+
*/
|
|
3917
|
+
adoptFoldedOrders(folded) {
|
|
3918
|
+
if (foldedOrderCount(this.foldedOrders)) return false;
|
|
3919
|
+
this.foldedOrders = structuredClone(folded);
|
|
3920
|
+
return true;
|
|
3921
|
+
}
|
|
3907
3922
|
/**
|
|
3908
3923
|
* **끝난 오더를 접는다**(ADR-0092) — 접은 수를 돌려준다.
|
|
3909
3924
|
*
|
|
@@ -4878,6 +4893,14 @@ var FlowEngine = class {
|
|
|
4878
4893
|
hydrateContinuity(snap) {
|
|
4879
4894
|
for (const id of snap?.acked ?? []) this._acked.add(id);
|
|
4880
4895
|
for (const e of snap?.attentionSince ?? []) if (e?.id && e.since) this._attentionSince.set(e.id, e.since);
|
|
4896
|
+
if (snap?.foldedOrders && foldedOrderCount(snap.foldedOrders)) {
|
|
4897
|
+
if (this.observeMode) {
|
|
4898
|
+
if (!this.observer) this.observer = new ObservedReducer(this.boardDef ?? { locations: [], equipment: [] });
|
|
4899
|
+
if (this.observer.adoptFoldedOrders(snap.foldedOrders)) this.observedDirty = true;
|
|
4900
|
+
} else if (!foldedOrderCount(this.foldedOrders)) {
|
|
4901
|
+
this.foldedOrders = structuredClone(snap.foldedOrders);
|
|
4902
|
+
}
|
|
4903
|
+
}
|
|
4881
4904
|
}
|
|
4882
4905
|
/**
|
|
4883
4906
|
* 씨앗의 확보분 중 **이 트윈에 실제로 있는 것만** 남긴다 — 없는 것은 세고 버린다.
|
package/package.json
CHANGED