@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.
@@ -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
  * 씨앗의 확보분 중 **이 트윈에 실제로 있는 것만** 남긴다 — 없는 것은 세고 버린다.
@@ -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
  *
@@ -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
  *
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/twin-kernel",
3
- "version": "0.11.27",
3
+ "version": "0.11.28",
4
4
  "type": "module",
5
5
  "description": "Twin Domain Kernel — framework-agnostic, zero-dep (domain + sim + 3-channel contract). WMS/YMS/MES, EPCIS 2.0 · ISA-95.",
6
6
  "publishConfig": {