@things-factory/headless-twin 10.1.7 → 10.1.10
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/README.md +19 -0
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.d.ts +5 -0
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js +44 -0
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js.map +1 -0
- package/dist-server/migrations/index.js +3 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.js +4 -1
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +4 -2
- package/dist-server/service/index.js +2 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/attention-lane.d.ts +12 -0
- package/dist-server/service/reference/attention-lane.js +15 -0
- package/dist-server/service/reference/attention-lane.js.map +1 -0
- package/dist-server/service/reference/index.d.ts +5 -2
- package/dist-server/service/reference/index.js +5 -2
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +6 -0
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-fill-run.js +13 -0
- package/dist-server/service/reference/reference-fill-run.js.map +1 -1
- package/dist-server/service/reference/reference-hook.d.ts +2 -1
- package/dist-server/service/reference/reference-hook.js +8 -1
- package/dist-server/service/reference/reference-hook.js.map +1 -1
- package/dist-server/service/reference/reference-reconciliation-query.d.ts +5 -0
- package/dist-server/service/reference/reference-reconciliation-query.js +42 -0
- package/dist-server/service/reference/reference-reconciliation-query.js.map +1 -0
- package/dist-server/service/reference/reference-reconciliation-writer.d.ts +10 -0
- package/dist-server/service/reference/reference-reconciliation-writer.js +33 -0
- package/dist-server/service/reference/reference-reconciliation-writer.js.map +1 -0
- package/dist-server/service/reference/reference-reconciliation.d.ts +19 -0
- package/dist-server/service/reference/reference-reconciliation.js +33 -0
- package/dist-server/service/reference/reference-reconciliation.js.map +1 -0
- package/dist-server/service/reference/twin-reference-reconciliation.d.ts +19 -0
- package/dist-server/service/reference/twin-reference-reconciliation.js +95 -0
- package/dist-server/service/reference/twin-reference-reconciliation.js.map +1 -0
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +13 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +45 -3
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/package.json +2 -2
- package/server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts +39 -0
- package/server/migrations/index.ts +3 -1
- package/server/routes.ts +4 -1
- package/server/service/index.ts +2 -0
- package/server/service/reference/attention-lane.ts +21 -0
- package/server/service/reference/index.ts +5 -2
- package/server/service/reference/reference-adapter.ts +6 -0
- package/server/service/reference/reference-fill-run.ts +15 -1
- package/server/service/reference/reference-hook.ts +11 -3
- package/server/service/reference/reference-reconciliation-query.ts +28 -0
- package/server/service/reference/reference-reconciliation-writer.ts +38 -0
- package/server/service/reference/reference-reconciliation.ts +55 -0
- package/server/service/reference/twin-reference-reconciliation.ts +27 -0
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +43 -2
- package/test/reference-reconciliation.test.ts +39 -0
- package/tsconfig.tsbuildinfo +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ State 를 GraphQL subscription 으로 스트리밍하고, 이벤트를 append-on
|
|
|
17
17
|
- `spec-coverage.ts` · `model-basis.ts` — 예측이 무엇에 근거했는지(`relative`/`partial`/`absolute-capable`/`calibrated`)와 근거가 바뀌었는지(보정 신선도).
|
|
18
18
|
- `kpi-fold.ts` · `kpi-query.ts` · `oee-accumulator.ts` — 저널을 접어 성과를 낸다(순수 폴드, 사실만).
|
|
19
19
|
- `entity-delta.ts` · `live-attentions.ts` · `warm-start.ts` — 화면용 엔티티 델타, 라이브 주목 신호, 재기동 복구.
|
|
20
|
+
- `service/reference/attention-lane.ts` — webhook의 `ATTENTIONS` lane을 제품이 등록한 inbox handler로 전달한다. 커널은 운반만 하며 attention을 사실 저널에 섞지 않는다.
|
|
20
21
|
|
|
21
22
|
### service — 바깥으로 낸 면
|
|
22
23
|
`twin-state`(구독) · `twin-event`(저널) · `twin-control`(command/scenario) · `twin-instance` · `twin-lifecycle` · `twin-forecast` · `twin-metrics` · `twin-journal` · `twin-attention` · `twin-space` · `reference`(마스터·커넥터).
|
|
@@ -31,6 +32,24 @@ State 를 GraphQL subscription 으로 스트리밍하고, 이벤트를 append-on
|
|
|
31
32
|
- 명세·추정기가 라이브에도 붙어 **예측 자격이 트윈 종류를 가리지 않는다.**
|
|
32
33
|
- 저널 중복 기록은 **구조적으로 불가능**하다 — 기록은 `ingestLive` 한 곳뿐이고, `startLive` 는 커널 방출을 구독하지 않는다.
|
|
33
34
|
|
|
35
|
+
## Webhook: 사실과 AI 분석 입력의 분리
|
|
36
|
+
|
|
37
|
+
연결은 계속 하나의 주소 `POST /domain/{domain}/twin/hook/{source}/{instanceId}`를 쓴다. `lane`을 생략하면
|
|
38
|
+
기존과 동일한 `FACTS`이고 canonical ingest로 들어간다. `lane: 'ATTENTIONS'`는 같은 인증·서명·순번 검증을
|
|
39
|
+
거친 뒤 `deliverAttention`으로 보낸다.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
connector outbox
|
|
43
|
+
└─ webhook (FACTS | ATTENTIONS)
|
|
44
|
+
├─ FACTS → canonical ingest → journal → live kernel
|
|
45
|
+
└─ ATTENTIONS → product inbox → product-owned persistence / analysis
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`headless-twin`은 attention의 업무 의미·DB 스키마·AI 판단을 소유하지 않는다. 앱이
|
|
49
|
+
`registerAttentionHandler`로 수신기를 등록해야 하며, 등록되지 않은 ATTENTIONS 요청은 성공한 것처럼
|
|
50
|
+
처리하지 않고 실패한다. 현재 operato-twin 앱은 이를 별도 inbox 테이블에 저장한다. 저장된 외부 attention을
|
|
51
|
+
어떤 Twin 분석에 어떤 방식으로 결합할지는 앱의 명시적 분석 정책이며, 커널이 자동으로 인과관계를 만들지 않는다.
|
|
52
|
+
|
|
34
53
|
## 커널 연동
|
|
35
54
|
- 커널은 ESM+CJS 이중배포. 이 모듈(CommonJS)은 **CJS 번들을 `require`** 로 로드(require(ESM) 회피). 타입은 `import type` 로 `.d.ts` 참조. 양쪽 다 패키지명 `@operato/twin-kernel`.
|
|
36
55
|
- **0.x semver 함정**: `^0.2.0` 은 0.2.1 을 집지 않는다. 커널을 올릴 때 **루트와 소비 패키지 둘 다** 범위를 올려야 하고, 안 그러면 호이스팅된 옛 사본이 이긴다(중첩 `node_modules` 잔여 사본도 확인).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateTwinReferenceReconciliations1786800000000 = void 0;
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
/* 번호 대사는 원본 범위를 실제로 읽은 뒤의 최신 상태를 재기동 뒤에도 보존한다. */
|
|
6
|
+
const TABLE = 'twin_reference_reconciliations';
|
|
7
|
+
class CreateTwinReferenceReconciliations1786800000000 {
|
|
8
|
+
async up(queryRunner) {
|
|
9
|
+
if (await queryRunner.hasTable(TABLE))
|
|
10
|
+
return;
|
|
11
|
+
const dateType = queryRunner.connection.driver.mappedDataTypes.createDate;
|
|
12
|
+
await queryRunner.createTable(new typeorm_1.Table({
|
|
13
|
+
name: TABLE,
|
|
14
|
+
columns: [
|
|
15
|
+
{ name: 'id', type: 'varchar', length: '36', isPrimary: true },
|
|
16
|
+
{ name: 'domain_id', type: 'varchar', length: '36', isNullable: true },
|
|
17
|
+
{ name: 'instance_id', type: 'varchar', isNullable: false },
|
|
18
|
+
{ name: 'scope', type: 'varchar', isNullable: false },
|
|
19
|
+
{ name: 'status', type: 'varchar', isNullable: false },
|
|
20
|
+
{ name: 'source_first', type: 'int', isNullable: true },
|
|
21
|
+
{ name: 'source_last', type: 'int', isNullable: true },
|
|
22
|
+
{ name: 'cursor_seq', type: 'int', isNullable: true },
|
|
23
|
+
{ name: 'first_seq_seen', type: 'int', isNullable: true },
|
|
24
|
+
{ name: 'head_missing', type: 'int', isNullable: true },
|
|
25
|
+
{ name: 'behind', type: 'int', isNullable: true },
|
|
26
|
+
{ name: 'reason', type: 'varchar', isNullable: true },
|
|
27
|
+
{ name: 'checked_at', type: dateType, isNullable: false },
|
|
28
|
+
{ name: 'created_at', type: dateType, isNullable: true },
|
|
29
|
+
{ name: 'updated_at', type: dateType, isNullable: true }
|
|
30
|
+
]
|
|
31
|
+
}), true);
|
|
32
|
+
const table = await queryRunner.getTable(TABLE);
|
|
33
|
+
if (!table)
|
|
34
|
+
return;
|
|
35
|
+
await queryRunner.createIndex(table, new typeorm_1.TableIndex({ name: 'uq_twin_reference_reconciliation_0', columnNames: ['domain_id', 'instance_id', 'scope'], isUnique: true }));
|
|
36
|
+
await queryRunner.createIndex(table, new typeorm_1.TableIndex({ name: 'ix_twin_reference_reconciliation_0', columnNames: ['domain_id', 'instance_id', 'checked_at'] }));
|
|
37
|
+
}
|
|
38
|
+
async down(queryRunner) {
|
|
39
|
+
if (await queryRunner.hasTable(TABLE))
|
|
40
|
+
await queryRunner.dropTable(TABLE);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.CreateTwinReferenceReconciliations1786800000000 = CreateTwinReferenceReconciliations1786800000000;
|
|
44
|
+
//# sourceMappingURL=1786800000000-CreateTwinReferenceReconciliations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1786800000000-CreateTwinReferenceReconciliations.js","sourceRoot":"","sources":["../../server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts"],"names":[],"mappings":";;;AAAA,qCAA4E;AAE5E,kDAAkD;AAClD,MAAM,KAAK,GAAG,gCAAgC,CAAA;AAE9C,MAAa,+CAA+C;IACnD,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAM;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,UAAoB,CAAA;QACnF,MAAM,WAAW,CAAC,WAAW,CAAC,IAAI,eAAK,CAAC;YACtC,IAAI,EAAE,KAAK;YACX,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;gBAC9D,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;gBACtE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE;gBAC3D,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE;gBACrD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE;gBACtD,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACvD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACtD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACrD,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACzD,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;gBACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;gBACrD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE;gBACzD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;gBACxD,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;aACzD;SACF,CAAC,EAAE,IAAI,CAAC,CAAA;QACT,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,oBAAU,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACxK,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,oBAAU,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/J,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC3E,CAAC;CACF;AAjCD,0GAiCC","sourcesContent":["import { MigrationInterface, QueryRunner, Table, TableIndex } from 'typeorm'\n\n/* 번호 대사는 원본 범위를 실제로 읽은 뒤의 최신 상태를 재기동 뒤에도 보존한다. */\nconst TABLE = 'twin_reference_reconciliations'\n\nexport class CreateTwinReferenceReconciliations1786800000000 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n if (await queryRunner.hasTable(TABLE)) return\n const dateType = queryRunner.connection.driver.mappedDataTypes.createDate as string\n await queryRunner.createTable(new Table({\n name: TABLE,\n columns: [\n { name: 'id', type: 'varchar', length: '36', isPrimary: true },\n { name: 'domain_id', type: 'varchar', length: '36', isNullable: true },\n { name: 'instance_id', type: 'varchar', isNullable: false },\n { name: 'scope', type: 'varchar', isNullable: false },\n { name: 'status', type: 'varchar', isNullable: false },\n { name: 'source_first', type: 'int', isNullable: true },\n { name: 'source_last', type: 'int', isNullable: true },\n { name: 'cursor_seq', type: 'int', isNullable: true },\n { name: 'first_seq_seen', type: 'int', isNullable: true },\n { name: 'head_missing', type: 'int', isNullable: true },\n { name: 'behind', type: 'int', isNullable: true },\n { name: 'reason', type: 'varchar', isNullable: true },\n { name: 'checked_at', type: dateType, isNullable: false },\n { name: 'created_at', type: dateType, isNullable: true },\n { name: 'updated_at', type: dateType, isNullable: true }\n ]\n }), true)\n const table = await queryRunner.getTable(TABLE)\n if (!table) return\n await queryRunner.createIndex(table, new TableIndex({ name: 'uq_twin_reference_reconciliation_0', columnNames: ['domain_id', 'instance_id', 'scope'], isUnique: true }))\n await queryRunner.createIndex(table, new TableIndex({ name: 'ix_twin_reference_reconciliation_0', columnNames: ['domain_id', 'instance_id', 'checked_at'] }))\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n if (await queryRunner.hasTable(TABLE)) await queryRunner.dropTable(TABLE)\n }\n}\n"]}
|
|
@@ -12,6 +12,7 @@ const _1786300000000_IndexEventTypeByTime_js_1 = require("./1786300000000-IndexE
|
|
|
12
12
|
const _1786400000000_IndexEventCreatedAt_js_1 = require("./1786400000000-IndexEventCreatedAt.js");
|
|
13
13
|
const _1786500000000_CreateTwinSubjectEvents_js_1 = require("./1786500000000-CreateTwinSubjectEvents.js");
|
|
14
14
|
const _1786700000000_AddDispatchRetryColumns_js_1 = require("./1786700000000-AddDispatchRetryColumns.js");
|
|
15
|
+
const _1786800000000_CreateTwinReferenceReconciliations_js_1 = require("./1786800000000-CreateTwinReferenceReconciliations.js");
|
|
15
16
|
const _1786600000000_RenameOperatoMesAdapterType_js_1 = require("./1786600000000-RenameOperatoMesAdapterType.js");
|
|
16
17
|
exports.migrations = [
|
|
17
18
|
_1786000000000_RenameTwinInstanceBoardToModel_js_1.RenameTwinInstanceBoardToModel1786000000000,
|
|
@@ -21,6 +22,7 @@ exports.migrations = [
|
|
|
21
22
|
_1786400000000_IndexEventCreatedAt_js_1.IndexEventCreatedAt1786400000000,
|
|
22
23
|
_1786500000000_CreateTwinSubjectEvents_js_1.CreateTwinSubjectEvents1786500000000,
|
|
23
24
|
_1786600000000_RenameOperatoMesAdapterType_js_1.RenameOperatoMesAdapterType1786600000000,
|
|
24
|
-
_1786700000000_AddDispatchRetryColumns_js_1.AddDispatchRetryColumns1786700000000
|
|
25
|
+
_1786700000000_AddDispatchRetryColumns_js_1.AddDispatchRetryColumns1786700000000,
|
|
26
|
+
_1786800000000_CreateTwinReferenceReconciliations_js_1.CreateTwinReferenceReconciliations1786800000000
|
|
25
27
|
];
|
|
26
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/migrations/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,wHAA+G;AAC/G,8HAAqH;AACrH,kGAAyF;AACzF,oGAA2F;AAC3F,kGAAyF;AACzF,0GAAiG;AACjG,0GAAiG;AACjG,kHAAyG;AAE5F,QAAA,UAAU,GAAG;IACxB,8FAA2C;IAC3C,oGAA8C;IAC9C,wEAAgC;IAChC,0EAAiC;IACjC,wEAAgC;IAChC,gFAAoC;IACpC,wFAAwC;IACxC,gFAAoC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/migrations/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,wHAA+G;AAC/G,8HAAqH;AACrH,kGAAyF;AACzF,oGAA2F;AAC3F,kGAAyF;AACzF,0GAAiG;AACjG,0GAAiG;AACjG,gIAAuH;AACvH,kHAAyG;AAE5F,QAAA,UAAU,GAAG;IACxB,8FAA2C;IAC3C,oGAA8C;IAC9C,wEAAgC;IAChC,0EAAiC;IACjC,wEAAgC;IAChC,gFAAoC;IACpC,wFAAwC;IACxC,gFAAoC;IACpC,sGAA+C;CAChD,CAAA","sourcesContent":["/*\n * 마이그레이션 묶음 — 프레임워크 규약(`@things-factory/shell` · `auth-base` 와 같은 방식).\n * 파일마다 하나씩 export 하고 여기서 모아 `server/index.ts` 가 내보낸다.\n */\nimport { RenameTwinInstanceBoardToModel1786000000000 } from './1786000000000-RenameTwinInstanceBoardToModel.js'\nimport { PromoteEventActionAndSyncWarnings1786100000000 } from './1786100000000-PromoteEventActionAndSyncWarnings.js'\nimport { CarryLiveFeedCursor1786200000000 } from './1786200000000-CarryLiveFeedCursor.js'\nimport { IndexEventTypeByTime1786300000000 } from './1786300000000-IndexEventTypeByTime.js'\nimport { IndexEventCreatedAt1786400000000 } from './1786400000000-IndexEventCreatedAt.js'\nimport { CreateTwinSubjectEvents1786500000000 } from './1786500000000-CreateTwinSubjectEvents.js'\nimport { AddDispatchRetryColumns1786700000000 } from './1786700000000-AddDispatchRetryColumns.js'\nimport { CreateTwinReferenceReconciliations1786800000000 } from './1786800000000-CreateTwinReferenceReconciliations.js'\nimport { RenameOperatoMesAdapterType1786600000000 } from './1786600000000-RenameOperatoMesAdapterType.js'\n\nexport const migrations = [\n RenameTwinInstanceBoardToModel1786000000000,\n PromoteEventActionAndSyncWarnings1786100000000,\n CarryLiveFeedCursor1786200000000,\n IndexEventTypeByTime1786300000000,\n IndexEventCreatedAt1786400000000,\n CreateTwinSubjectEvents1786500000000,\n RenameOperatoMesAdapterType1786600000000,\n AddDispatchRetryColumns1786700000000,\n CreateTwinReferenceReconciliations1786800000000\n]\n"]}
|
package/dist-server/routes.js
CHANGED
|
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
20
20
|
const live_ingest_js_1 = require("./service/reference/live-ingest.js");
|
|
21
21
|
const fill_loop_js_1 = require("./service/reference/fill-loop.js");
|
|
22
22
|
const reference_hook_js_1 = require("./service/reference/reference-hook.js");
|
|
23
|
+
const attention_lane_js_1 = require("./service/reference/attention-lane.js");
|
|
23
24
|
const hook_store_js_1 = require("./service/reference/hook-store.js");
|
|
24
25
|
process.on('bootstrap-module-domain-public-route', (_app, router) => {
|
|
25
26
|
/*
|
|
@@ -55,7 +56,9 @@ process.on('bootstrap-module-domain-public-route', (_app, router) => {
|
|
|
55
56
|
* 유입 몸통은 `live-ingest.ts` 한 곳에 있다 — backfill 이 같은 것을 쓴다. 여기에 두면 두 길이
|
|
56
57
|
* 서로 다른 규칙으로 받게 되고, 한쪽만 수정되는 날이 온다.
|
|
57
58
|
*/
|
|
58
|
-
ingest: (instanceId, records) =>
|
|
59
|
+
ingest: (instanceId, records, lane) => lane === 'FACTS'
|
|
60
|
+
? (0, live_ingest_js_1.liveIngest)(domain.id, instanceId, records, 'hook')
|
|
61
|
+
: (0, attention_lane_js_1.deliverAttention)({ domainId: domain.id, source: String(ctx.params.source ?? ''), instanceId, records }),
|
|
59
62
|
/*
|
|
60
63
|
* 구멍을 본 그 자리에서 바로 받는다 — 번호가 비었다는 것을 아는 가장 이른 순간이다.
|
|
61
64
|
* 기다리지 않는다(§`requestFill`): 훅의 응답이 늦으면 보내는 쪽이 되풀이한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,uEAA+D;AAC/D,mEAA8D;AAC9D,6EAAkE;AAClE,qEAAiE;AAEjE,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,MAAW,EAAE,EAAE;IACnF;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAA;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,GAAG,GAAG,CAAA;YAChB,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;YACpD,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAU,EAAC;YAC/B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAA4B;YAChE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI;YACvB;;;eAGG;YACH,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACnF,KAAK,EAAE,IAAA,6BAAa,GAAE;YACtB;;;eAGG;YACH;;;eAGG;YACH,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,2BAAU,EAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,uEAA+D;AAC/D,mEAA8D;AAC9D,6EAAkE;AAClE,6EAAwE;AACxE,qEAAiE;AAEjE,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,MAAW,EAAE,EAAE;IACnF;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAA;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,GAAG,GAAG,CAAA;YAChB,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;YACpD,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAU,EAAC;YAC/B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAA4B;YAChE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI;YACvB;;;eAGG;YACH,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACnF,KAAK,EAAE,IAAA,6BAAa,GAAE;YACtB;;;eAGG;YACH;;;eAGG;YACH,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO;gBACrD,CAAC,CAAC,IAAA,2BAAU,EAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;gBACpD,CAAC,CAAC,IAAA,oCAAgB,EAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;YAC3G;;;eAGG;YACH,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;SACnF,CAAC,CAAA;QACF,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC3B,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,2DAA2D;AAC3D,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;AAC1F,OAAO,CAAC,EAAE,CAAC,uCAA8C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;AAC3F,OAAO,CAAC,EAAE,CAAC,uCAA8C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA","sourcesContent":["/*\n * 이 패키지가 여는 HTTP 자리 — 지금은 웹훅 하나다.\n *\n * ── 왜 여기인가 ─────────────────────────────────────────────────────────────\n * 커넥터는 주소를 만들 수 없다. 어댑터 계약에 주소를 등록하는 자리가 없고, 있어서도 안 된다 — 주소는\n * 앱의 것이고 커넥터마다 제각기 열면 인증도 제각기가 된다.\n *\n * 그래서 입구는 **하나**다. 어느 연결의 것인지는 주소의 이름으로 가려내고, 본문을 우리 어휘로 옮기는\n * 것은 그 연결의 커넥터가 한다(§`reference-hook`).\n *\n * ── 왜 도메인 공개 라우터인가 ───────────────────────────────────────────────\n * 밀어 주는 쪽은 사람이 아니다. 사람 인증(JWT)을 요구하면 연결된 시스템이 우리 토큰을 발급받아\n * 갱신하며 관리해야 하고, 대부분의 현장에서 그것 때문에 연동이 서지 않는다.\n *\n * 대신 **연결마다 비밀값**을 두고 그것으로 확인한다. 비밀값을 선언하지 않은 연결은 훅을 받지 않는다 —\n * 인증 없는 입구를 열어 두는 것보다 훅을 못 쓰는 것이 낫다.\n */\nimport { liveIngest } from './service/reference/live-ingest.js'\nimport { requestFill } from './service/reference/fill-loop.js'\nimport { handleHook } from './service/reference/reference-hook.js'\nimport { deliverAttention } from './service/reference/attention-lane.js'\nimport { databaseStore } from './service/reference/hook-store.js'\n\nprocess.on('bootstrap-module-domain-public-route' as any, (_app: any, router: any) => {\n /*\n * 주소에 트윈까지 적는다 — 어느 트윈에 넣을지 짐작하지 않는다.\n *\n * 한 연결이 여러 사이트를 만들면 트윈도 여럿이다. 본문을 보고 고르게 하면 그 판단이 커넥터마다\n * 달라지고, 틀리면 다른 공장의 사실이 이 공장에 들어간다. 주소가 말하게 하면 그 일이 없다.\n */\n router.post('/twin/hook/:source/:instanceId', async (ctx: any) => {\n const domain = ctx.state?.domain\n if (!domain) {\n ctx.status = 400\n ctx.body = { ok: false, error: 'no domain context' }\n return\n }\n const outcome = await handleHook({\n domainId: domain.id,\n source: String(ctx.params.source ?? ''),\n instanceId: String(ctx.params.instanceId ?? ''),\n headers: (ctx.request?.headers ?? {}) as Record<string, unknown>,\n body: ctx.request?.body,\n /*\n * 받은 바이트 그대로 — 서명을 확인하려면 이것이 있어야 한다. `koa-bodyparser` 가 파싱한 본문과\n * 함께 남겨 준다. 파싱본을 다시 문자열로 만들면 키 순서와 공백이 달라져 서명이 맞지 않는다.\n */\n rawBody: typeof ctx.request?.rawBody === 'string' ? ctx.request.rawBody : undefined,\n store: databaseStore(),\n /*\n * 폴링이 쓰는 길을 그대로 쓴다 — 검증도 유입도 같은 자리다. 그래서 트윈 쪽에서는 물어서 받은\n * 것과 밀어 받은 것이 구별되지 않는다. 구별되는 것은 유입 장부의 `sources` 한 줄뿐이다.\n */\n /*\n * 유입 몸통은 `live-ingest.ts` 한 곳에 있다 — backfill 이 같은 것을 쓴다. 여기에 두면 두 길이\n * 서로 다른 규칙으로 받게 되고, 한쪽만 수정되는 날이 온다.\n */\n ingest: (instanceId, records, lane) => lane === 'FACTS'\n ? liveIngest(domain.id, instanceId, records, 'hook')\n : deliverAttention({ domainId: domain.id, source: String(ctx.params.source ?? ''), instanceId, records }),\n /*\n * 구멍을 본 그 자리에서 바로 받는다 — 번호가 비었다는 것을 아는 가장 이른 순간이다.\n * 기다리지 않는다(§`requestFill`): 훅의 응답이 늦으면 보내는 쪽이 되풀이한다.\n */\n onGap: scope => requestFill(domain.id, String(ctx.params.instanceId ?? ''), scope)\n })\n ctx.status = outcome.status\n ctx.body = outcome.body\n })\n})\n\n/* 나머지 셋은 이 패키지가 쓰지 않는다 — 자리는 남겨 둔다(다른 모듈이 같은 신호를 기다린다). */\nprocess.on('bootstrap-module-global-public-route' as any, (_app: any, _router: any) => {})\nprocess.on('bootstrap-module-global-private-route' as any, (_app: any, _router: any) => {})\nprocess.on('bootstrap-module-domain-private-route' as any, (_app: any, _router: any) => {})\n"]}
|
|
@@ -14,16 +14,18 @@ export * from './reference/reference-adapter.js';
|
|
|
14
14
|
export * from './reference/live-cadence.js';
|
|
15
15
|
export * from './reference/reference-live.js';
|
|
16
16
|
export * from './reference/twin-reference.js';
|
|
17
|
+
export * from './reference/twin-reference-reconciliation.js';
|
|
18
|
+
export * from './reference/reference-reconciliation.js';
|
|
17
19
|
export * from './reference/connection-portability.js';
|
|
18
20
|
export * from './reference/template-registry.js';
|
|
19
21
|
export * from './reference/reference-probe.js';
|
|
20
22
|
export * from './reference/reference-assessment.js';
|
|
21
23
|
export * from './twin-lifecycle/domain-catalog.js';
|
|
22
24
|
export * from './actuation/index.js';
|
|
23
|
-
export declare const entities: (typeof import("./twin-event/twin-event.js").TwinEvent | typeof import("./twin-subject/twin-subject-event.js").TwinSubjectEvent | typeof import("./twin-instance/twin-instance.js").TwinInstance | typeof import("./reference/twin-reference.js").TwinReference | typeof import("./twin-structure/twin-structure.js").TwinStructure | typeof import("./twin-space/twin-space.js").TwinSpace | typeof import("./twin-space/twin-space-representation.js").TwinSpaceRepresentation | typeof import("./twin-space/twin-space-area.js").TwinSpaceArea | typeof import("./twin-space/twin-area.js").TwinArea | typeof import("./twin-model/twin-location.js").TwinLocation | typeof import("./twin-model/twin-equipment.js").TwinEquipment | typeof import("./twin-model/twin-operation.js").TwinOperation | typeof import("./twin-target/twin-target.js").TwinTarget | typeof import("./twin-audit/twin-audit-event.js").TwinAuditEvent | typeof import("./twin-ingest-window/twin-ingest-window.js").TwinIngestWindow | typeof import("./actuation/twin-command.js").TwinCommandRecord | typeof import("./actuation/actuation-rule.js").TwinActuationRule)[];
|
|
25
|
+
export declare const entities: (typeof import("./twin-event/twin-event.js").TwinEvent | typeof import("./twin-subject/twin-subject-event.js").TwinSubjectEvent | typeof import("./twin-instance/twin-instance.js").TwinInstance | typeof import("./reference/twin-reference.js").TwinReference | typeof import("./twin-structure/twin-structure.js").TwinStructure | typeof import("./twin-space/twin-space.js").TwinSpace | typeof import("./twin-space/twin-space-representation.js").TwinSpaceRepresentation | typeof import("./twin-space/twin-space-area.js").TwinSpaceArea | typeof import("./twin-space/twin-area.js").TwinArea | typeof import("./twin-model/twin-location.js").TwinLocation | typeof import("./twin-model/twin-equipment.js").TwinEquipment | typeof import("./twin-model/twin-operation.js").TwinOperation | typeof import("./twin-target/twin-target.js").TwinTarget | typeof import("./twin-audit/twin-audit-event.js").TwinAuditEvent | typeof import("./twin-ingest-window/twin-ingest-window.js").TwinIngestWindow | typeof import("./actuation/twin-command.js").TwinCommandRecord | typeof import("./reference/twin-reference-reconciliation.js").TwinReferenceReconciliation | typeof import("./actuation/actuation-rule.js").TwinActuationRule)[];
|
|
24
26
|
export declare const subscribers: any[];
|
|
25
27
|
export declare const schema: {
|
|
26
28
|
typeDefs: {};
|
|
27
|
-
resolverClasses: (typeof import("./twin-state/twin-state-subscription.js").TwinStateSubscription | typeof import("./actuation/actuation-rule-resolver.js").TwinActuationRuleResolver | typeof import("./actuation/twin-command-resolver.js").TwinCommandResolver | typeof import("./twin-subject/twin-subject-query.js").TwinSubjectQuery | typeof import("./twin-subject/twin-subject-query.js").TwinSubjectMutation | typeof import("./twin-audit/twin-audit-query.js").TwinAuditQuery | typeof import("./twin-space/twin-space-resolver.js").TwinSpaceResolver | typeof import("./twin-target/twin-target-resolver.js").TwinTargetResolver | typeof import("./reference/connection-portability-resolver.js").ConnectionPortabilityResolver | typeof import("./reference/reference-resolver.js").TwinReferenceResolver | typeof import("./reference/reference-progress-subscription.js").TwinReferenceProgressSubscription | typeof import("./twin-control/twin-control-mutation.js").TwinControlMutation | typeof import("./twin-model/twin-model-query.js").TwinModelQuery | typeof import("./twin-model/twin-model-item-query.js").TwinModelItemQuery | typeof import("./twin-model/twin-model-tree-query.js").TwinModelTreeQuery | typeof import("./twin-model/twin-model-mutation.js").TwinModelMutation | typeof import("./twin-model/twin-lineage-query.js").TwinLineageQuery | typeof import("./twin-ingest-window/twin-ingest-window-query.js").TwinIngestWindowQuery | typeof import("./twin-lifecycle/twin-lifecycle-mutation.js").TwinLifecycleMutation | typeof import("./twin-journal/twin-journal-query.js").TwinJournalQuery | typeof import("./twin-forecast/twin-forecast-query.js").TwinForecastQuery | typeof import("./twin-attention/twin-attention-query.js").TwinAttentionQuery | typeof import("./twin-metrics/twin-metrics-query.js").TwinMetricsQuery | typeof import("./twin-readiness/twin-readiness-query.js").TwinReadinessQuery | typeof import("./twin-backfill/twin-backfill-resolver.js").TwinBackfillResolver)[];
|
|
29
|
+
resolverClasses: (typeof import("./twin-state/twin-state-subscription.js").TwinStateSubscription | typeof import("./actuation/actuation-rule-resolver.js").TwinActuationRuleResolver | typeof import("./actuation/twin-command-resolver.js").TwinCommandResolver | typeof import("./twin-subject/twin-subject-query.js").TwinSubjectQuery | typeof import("./twin-subject/twin-subject-query.js").TwinSubjectMutation | typeof import("./twin-audit/twin-audit-query.js").TwinAuditQuery | typeof import("./twin-space/twin-space-resolver.js").TwinSpaceResolver | typeof import("./twin-target/twin-target-resolver.js").TwinTargetResolver | typeof import("./reference/connection-portability-resolver.js").ConnectionPortabilityResolver | typeof import("./reference/reference-resolver.js").TwinReferenceResolver | typeof import("./reference/reference-progress-subscription.js").TwinReferenceProgressSubscription | typeof import("./reference/reference-reconciliation-query.js").TwinReferenceReconciliationQuery | typeof import("./twin-control/twin-control-mutation.js").TwinControlMutation | typeof import("./twin-model/twin-model-query.js").TwinModelQuery | typeof import("./twin-model/twin-model-item-query.js").TwinModelItemQuery | typeof import("./twin-model/twin-model-tree-query.js").TwinModelTreeQuery | typeof import("./twin-model/twin-model-mutation.js").TwinModelMutation | typeof import("./twin-model/twin-lineage-query.js").TwinLineageQuery | typeof import("./twin-ingest-window/twin-ingest-window-query.js").TwinIngestWindowQuery | typeof import("./twin-lifecycle/twin-lifecycle-mutation.js").TwinLifecycleMutation | typeof import("./twin-journal/twin-journal-query.js").TwinJournalQuery | typeof import("./twin-forecast/twin-forecast-query.js").TwinForecastQuery | typeof import("./twin-attention/twin-attention-query.js").TwinAttentionQuery | typeof import("./twin-metrics/twin-metrics-query.js").TwinMetricsQuery | typeof import("./twin-readiness/twin-readiness-query.js").TwinReadinessQuery | typeof import("./twin-backfill/twin-backfill-resolver.js").TwinBackfillResolver)[];
|
|
28
30
|
directives: {};
|
|
29
31
|
};
|
|
@@ -19,6 +19,8 @@ tslib_1.__exportStar(require("./reference/reference-adapter.js"), exports);
|
|
|
19
19
|
tslib_1.__exportStar(require("./reference/live-cadence.js"), exports);
|
|
20
20
|
tslib_1.__exportStar(require("./reference/reference-live.js"), exports);
|
|
21
21
|
tslib_1.__exportStar(require("./reference/twin-reference.js"), exports);
|
|
22
|
+
tslib_1.__exportStar(require("./reference/twin-reference-reconciliation.js"), exports);
|
|
23
|
+
tslib_1.__exportStar(require("./reference/reference-reconciliation.js"), exports);
|
|
22
24
|
tslib_1.__exportStar(require("./reference/connection-portability.js"), exports);
|
|
23
25
|
tslib_1.__exportStar(require("./reference/template-registry.js"), exports);
|
|
24
26
|
/* 커넥터 점검 하네스 — 실 원본에 붙여 무엇이 채워지고 무엇이 비는지 센다(앱을 띄우지 않는다). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,qEAA0C;AAC1C,2EAAgD;AAChD,qFAA0D;AAC1D,2EAAgD;AAChD,qEAA0C;AAC1C,oFAAyD;AACzD,0EAA+C;AAC/C,uEAA4C;AAC5C,6EAAkD;AAClD,kFAAuD;AACvD,0EAA+C;AAC/C,4EAAiD;AACjD,2EAAgD;AAChD,sEAA2C;AAC3C,wEAA6C;AAC7C,wEAA6C;AAC7C,gFAAqD;AACrD,2EAAgD;AAChD,4DAA4D;AAC5D,yEAA8C;AAC9C,iEAAiE;AACjE,8EAAmD;AACnD,sEAAsE;AACtE,6EAAkD;AAClD;;;GAGG;AACH,+DAAoC;AAEpC,mCAAmC;AACnC,oDAAqE;AACrE,sDAA4G;AAC5G,oDAAsG;AACtG,uDAA2E;AAC3E,wDAA6E;AAC7E,oDAAsG;AACtG,qDAAyG;AACzG,mDAA6G;AAC7G,2EAA2E;AAC3E,mDAA6G;AAC7G,qDAAuE;AACvE,uDAA2E;AAC3E,qDAAsG;AACtG,mEAAmE;AACnE,6DAA4H;AAC5H,yDAA+E;AAC/E,uDAA2E;AAC3E,wDAA6E;AAC7E,yDAA+E;AAC/E,uDAA2E;AAC3E,yDAA+E;AAC/E,qDAAqD;AACrD,wDAA6E;AAEhE,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAiB;IACpB,GAAG,mBAAmB;IACtB,GAAG,oBAAwB;IAC3B,GAAG,mBAAiB;IACpB,GAAG,mBAAoB;IACvB,GAAG,mBAAqB;IACxB,GAAG,mBAAiB;IACpB,GAAG,mBAAkB;IACrB,GAAG,mBAAqB;IACxB,GAAG,mBAAqB;IACxB,4DAA4D;IAC5D,GAAG,oBAAiB;CACrB,CAAA;AAEY,QAAA,WAAW,GAAG,EAAE,CAAA;AAEhB,QAAA,MAAM,GAAG;IACpB,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,qBAAkB;QACrB,GAAG,qBAAoB;QACvB,GAAG,qBAAsB;QACzB,GAAG,qBAAoB;QACvB,GAAG,oBAAkB;QACrB,GAAG,qBAAqB;QACxB,GAAG,qBAAsB;QACzB,GAAG,qBAAoB;QACvB,GAAG,qBAAsB;QACzB,GAAG,qBAAqB;QACxB,GAAG,qBAAyB;QAC5B,GAAG,qBAAkB;QACrB,GAAG,oBAAkB;QACrB,GAAG,oBAAmB;QACtB,GAAG,oBAAsB;QACzB,GAAG,oBAAsB;QACzB,GAAG,oBAAoB;KACxB;IACD,UAAU,EAAE,EAAE;CACf,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './twin-event/twin-event.js'\nexport * from './twin-audit/twin-audit-event.js'\nexport * from './twin-ingest-window/twin-ingest-window.js'\nexport * from './twin-instance/twin-instance.js'\nexport * from './twin-space/twin-space.js'\nexport * from './twin-space/twin-space-representation.js'\nexport * from './twin-space/twin-space-area.js'\nexport * from './twin-target/twin-target.js'\nexport * from './twin-structure/twin-structure.js'\nexport * from './twin-state/twin-state-subscription.js'\nexport * from './reference/reference-master.js'\nexport * from './reference/reference-registry.js'\nexport * from './reference/reference-adapter.js'\nexport * from './reference/live-cadence.js'\nexport * from './reference/reference-live.js'\nexport * from './reference/twin-reference.js'\nexport * from './reference/connection-portability.js'\nexport * from './reference/template-registry.js'\n/* 커넥터 점검 하네스 — 실 원본에 붙여 무엇이 채워지고 무엇이 비는지 센다(앱을 띄우지 않는다). */\nexport * from './reference/reference-probe.js'\n/* 읽은 뒤의 총평(사실 층) — 화면이 표로 그리고, 더 알고 싶을 때 AI 가 이 사실만 근거로 서술한다. */\nexport * from './reference/reference-assessment.js'\n/* 도메인 어휘 카탈로그 조합(커널 SSOT 노출) — 서버측 소비자(board-ai 도구 등)가 같은 형태를 쓰도록. */\nexport * from './twin-lifecycle/domain-catalog.js'\n/*\n * 조치 — 앱이 결재선을 채우고(§`setApprovalGateway`) 판정을 옮긴다(§`settleByApproval`). 이 줄이 없으면\n * 자리는 있는데 앱이 닿을 길이 없다.\n */\nexport * from './actuation/index.js'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as TwinEventEntities } from './twin-event/index.js'\nimport { entities as TwinSubjectEntities, resolvers as TwinSubjectResolvers } from './twin-subject/index.js'\nimport { entities as TwinAuditEntities, resolvers as TwinAuditResolvers } from './twin-audit/index.js'\nimport { entities as TwinInstanceEntities } from './twin-instance/index.js'\nimport { entities as TwinStructureEntities } from './twin-structure/index.js'\nimport { entities as TwinSpaceEntities, resolvers as TwinSpaceResolvers } from './twin-space/index.js'\nimport { entities as TwinTargetEntities, resolvers as TwinTargetResolvers } from './twin-target/index.js'\nimport { entities as TwinReferenceEntities, resolvers as TwinReferenceResolvers } from './reference/index.js'\n/* 현장에 내리는 조치 — 승인이 재기동을 넘어 살아야 하므로 표로 든다(§`actuation/twin-command.ts`). */\nimport { entities as TwinActuationEntities, resolvers as TwinActuationResolvers } from './actuation/index.js'\nimport { resolvers as TwinStateResolvers } from './twin-state/index.js'\nimport { resolvers as TwinControlResolvers } from './twin-control/index.js'\nimport { entities as TwinModelEntities, resolvers as TwinModelResolvers } from './twin-model/index.js'\n/* 인제스트 창 — 동기화 추이를 재기동 뒤에도 이어 보기 위한 행(리졸버 없음: 메모리 장부가 조회를 답한다). */\nimport { entities as TwinIngestWindowEntities, resolvers as TwinIngestWindowResolvers } from './twin-ingest-window/index.js'\nimport { resolvers as TwinLifecycleResolvers } from './twin-lifecycle/index.js'\nimport { resolvers as TwinJournalResolvers } from './twin-journal/index.js'\nimport { resolvers as TwinForecastResolvers } from './twin-forecast/index.js'\nimport { resolvers as TwinAttentionResolvers } from './twin-attention/index.js'\nimport { resolvers as TwinMetricsResolvers } from './twin-metrics/index.js'\nimport { resolvers as TwinReadinessResolvers } from './twin-readiness/index.js'\n/* 지난 기록 채우기 — 저널에만 쓰는 문. 라이브 유입과 판단이 달라 문을 따로 둔다. */\nimport { resolvers as TwinBackfillResolvers } from './twin-backfill/index.js'\n\nexport const entities = [\n /* ENTITIES */\n ...TwinEventEntities,\n ...TwinSubjectEntities,\n ...TwinIngestWindowEntities,\n ...TwinAuditEntities,\n ...TwinInstanceEntities,\n ...TwinStructureEntities,\n ...TwinSpaceEntities,\n ...TwinTargetEntities,\n ...TwinReferenceEntities,\n ...TwinActuationEntities,\n /* 구조 투영 — model JSON 에서 풀어낸 표준 엔티티(ADR-0032). 원본에서 온 캐시. */\n ...TwinModelEntities\n]\n\nexport const subscribers = []\n\nexport const schema = {\n typeDefs: {},\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...TwinStateResolvers,\n ...TwinControlResolvers,\n ...TwinLifecycleResolvers,\n ...TwinJournalResolvers,\n ...TwinAuditResolvers,\n ...TwinForecastResolvers,\n ...TwinAttentionResolvers,\n ...TwinMetricsResolvers,\n ...TwinReadinessResolvers,\n ...TwinBackfillResolvers,\n ...TwinIngestWindowResolvers,\n ...TwinModelResolvers,\n ...TwinSpaceResolvers,\n ...TwinTargetResolvers,\n ...TwinReferenceResolvers,\n ...TwinActuationResolvers,\n ...TwinSubjectResolvers\n ],\n directives: {}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,qEAA0C;AAC1C,2EAAgD;AAChD,qFAA0D;AAC1D,2EAAgD;AAChD,qEAA0C;AAC1C,oFAAyD;AACzD,0EAA+C;AAC/C,uEAA4C;AAC5C,6EAAkD;AAClD,kFAAuD;AACvD,0EAA+C;AAC/C,4EAAiD;AACjD,2EAAgD;AAChD,sEAA2C;AAC3C,wEAA6C;AAC7C,wEAA6C;AAC7C,uFAA4D;AAC5D,kFAAuD;AACvD,gFAAqD;AACrD,2EAAgD;AAChD,4DAA4D;AAC5D,yEAA8C;AAC9C,iEAAiE;AACjE,8EAAmD;AACnD,sEAAsE;AACtE,6EAAkD;AAClD;;;GAGG;AACH,+DAAoC;AAEpC,mCAAmC;AACnC,oDAAqE;AACrE,sDAA4G;AAC5G,oDAAsG;AACtG,uDAA2E;AAC3E,wDAA6E;AAC7E,oDAAsG;AACtG,qDAAyG;AACzG,mDAA6G;AAC7G,2EAA2E;AAC3E,mDAA6G;AAC7G,qDAAuE;AACvE,uDAA2E;AAC3E,qDAAsG;AACtG,mEAAmE;AACnE,6DAA4H;AAC5H,yDAA+E;AAC/E,uDAA2E;AAC3E,wDAA6E;AAC7E,yDAA+E;AAC/E,uDAA2E;AAC3E,yDAA+E;AAC/E,qDAAqD;AACrD,wDAA6E;AAEhE,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,mBAAiB;IACpB,GAAG,mBAAmB;IACtB,GAAG,oBAAwB;IAC3B,GAAG,mBAAiB;IACpB,GAAG,mBAAoB;IACvB,GAAG,mBAAqB;IACxB,GAAG,mBAAiB;IACpB,GAAG,mBAAkB;IACrB,GAAG,mBAAqB;IACxB,GAAG,mBAAqB;IACxB,4DAA4D;IAC5D,GAAG,oBAAiB;CACrB,CAAA;AAEY,QAAA,WAAW,GAAG,EAAE,CAAA;AAEhB,QAAA,MAAM,GAAG;IACpB,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,qBAAkB;QACrB,GAAG,qBAAoB;QACvB,GAAG,qBAAsB;QACzB,GAAG,qBAAoB;QACvB,GAAG,oBAAkB;QACrB,GAAG,qBAAqB;QACxB,GAAG,qBAAsB;QACzB,GAAG,qBAAoB;QACvB,GAAG,qBAAsB;QACzB,GAAG,qBAAqB;QACxB,GAAG,qBAAyB;QAC5B,GAAG,qBAAkB;QACrB,GAAG,oBAAkB;QACrB,GAAG,oBAAmB;QACtB,GAAG,oBAAsB;QACzB,GAAG,oBAAsB;QACzB,GAAG,oBAAoB;KACxB;IACD,UAAU,EAAE,EAAE;CACf,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './twin-event/twin-event.js'\nexport * from './twin-audit/twin-audit-event.js'\nexport * from './twin-ingest-window/twin-ingest-window.js'\nexport * from './twin-instance/twin-instance.js'\nexport * from './twin-space/twin-space.js'\nexport * from './twin-space/twin-space-representation.js'\nexport * from './twin-space/twin-space-area.js'\nexport * from './twin-target/twin-target.js'\nexport * from './twin-structure/twin-structure.js'\nexport * from './twin-state/twin-state-subscription.js'\nexport * from './reference/reference-master.js'\nexport * from './reference/reference-registry.js'\nexport * from './reference/reference-adapter.js'\nexport * from './reference/live-cadence.js'\nexport * from './reference/reference-live.js'\nexport * from './reference/twin-reference.js'\nexport * from './reference/twin-reference-reconciliation.js'\nexport * from './reference/reference-reconciliation.js'\nexport * from './reference/connection-portability.js'\nexport * from './reference/template-registry.js'\n/* 커넥터 점검 하네스 — 실 원본에 붙여 무엇이 채워지고 무엇이 비는지 센다(앱을 띄우지 않는다). */\nexport * from './reference/reference-probe.js'\n/* 읽은 뒤의 총평(사실 층) — 화면이 표로 그리고, 더 알고 싶을 때 AI 가 이 사실만 근거로 서술한다. */\nexport * from './reference/reference-assessment.js'\n/* 도메인 어휘 카탈로그 조합(커널 SSOT 노출) — 서버측 소비자(board-ai 도구 등)가 같은 형태를 쓰도록. */\nexport * from './twin-lifecycle/domain-catalog.js'\n/*\n * 조치 — 앱이 결재선을 채우고(§`setApprovalGateway`) 판정을 옮긴다(§`settleByApproval`). 이 줄이 없으면\n * 자리는 있는데 앱이 닿을 길이 없다.\n */\nexport * from './actuation/index.js'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as TwinEventEntities } from './twin-event/index.js'\nimport { entities as TwinSubjectEntities, resolvers as TwinSubjectResolvers } from './twin-subject/index.js'\nimport { entities as TwinAuditEntities, resolvers as TwinAuditResolvers } from './twin-audit/index.js'\nimport { entities as TwinInstanceEntities } from './twin-instance/index.js'\nimport { entities as TwinStructureEntities } from './twin-structure/index.js'\nimport { entities as TwinSpaceEntities, resolvers as TwinSpaceResolvers } from './twin-space/index.js'\nimport { entities as TwinTargetEntities, resolvers as TwinTargetResolvers } from './twin-target/index.js'\nimport { entities as TwinReferenceEntities, resolvers as TwinReferenceResolvers } from './reference/index.js'\n/* 현장에 내리는 조치 — 승인이 재기동을 넘어 살아야 하므로 표로 든다(§`actuation/twin-command.ts`). */\nimport { entities as TwinActuationEntities, resolvers as TwinActuationResolvers } from './actuation/index.js'\nimport { resolvers as TwinStateResolvers } from './twin-state/index.js'\nimport { resolvers as TwinControlResolvers } from './twin-control/index.js'\nimport { entities as TwinModelEntities, resolvers as TwinModelResolvers } from './twin-model/index.js'\n/* 인제스트 창 — 동기화 추이를 재기동 뒤에도 이어 보기 위한 행(리졸버 없음: 메모리 장부가 조회를 답한다). */\nimport { entities as TwinIngestWindowEntities, resolvers as TwinIngestWindowResolvers } from './twin-ingest-window/index.js'\nimport { resolvers as TwinLifecycleResolvers } from './twin-lifecycle/index.js'\nimport { resolvers as TwinJournalResolvers } from './twin-journal/index.js'\nimport { resolvers as TwinForecastResolvers } from './twin-forecast/index.js'\nimport { resolvers as TwinAttentionResolvers } from './twin-attention/index.js'\nimport { resolvers as TwinMetricsResolvers } from './twin-metrics/index.js'\nimport { resolvers as TwinReadinessResolvers } from './twin-readiness/index.js'\n/* 지난 기록 채우기 — 저널에만 쓰는 문. 라이브 유입과 판단이 달라 문을 따로 둔다. */\nimport { resolvers as TwinBackfillResolvers } from './twin-backfill/index.js'\n\nexport const entities = [\n /* ENTITIES */\n ...TwinEventEntities,\n ...TwinSubjectEntities,\n ...TwinIngestWindowEntities,\n ...TwinAuditEntities,\n ...TwinInstanceEntities,\n ...TwinStructureEntities,\n ...TwinSpaceEntities,\n ...TwinTargetEntities,\n ...TwinReferenceEntities,\n ...TwinActuationEntities,\n /* 구조 투영 — model JSON 에서 풀어낸 표준 엔티티(ADR-0032). 원본에서 온 캐시. */\n ...TwinModelEntities\n]\n\nexport const subscribers = []\n\nexport const schema = {\n typeDefs: {},\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...TwinStateResolvers,\n ...TwinControlResolvers,\n ...TwinLifecycleResolvers,\n ...TwinJournalResolvers,\n ...TwinAuditResolvers,\n ...TwinForecastResolvers,\n ...TwinAttentionResolvers,\n ...TwinMetricsResolvers,\n ...TwinReadinessResolvers,\n ...TwinBackfillResolvers,\n ...TwinIngestWindowResolvers,\n ...TwinModelResolvers,\n ...TwinSpaceResolvers,\n ...TwinTargetResolvers,\n ...TwinReferenceResolvers,\n ...TwinActuationResolvers,\n ...TwinSubjectResolvers\n ],\n directives: {}\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IngestResult } from './reference-hook.js';
|
|
2
|
+
export interface AttentionDelivery {
|
|
3
|
+
domainId: string;
|
|
4
|
+
source: string;
|
|
5
|
+
instanceId: string;
|
|
6
|
+
records: unknown[];
|
|
7
|
+
}
|
|
8
|
+
type AttentionHandler = (delivery: AttentionDelivery) => IngestResult | Promise<IngestResult>;
|
|
9
|
+
/** Product modules opt into the ATTENTIONS lane; core owns only transport routing. */
|
|
10
|
+
export declare function registerAttentionHandler(next: AttentionHandler): void;
|
|
11
|
+
export declare function deliverAttention(delivery: AttentionDelivery): Promise<IngestResult>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAttentionHandler = registerAttentionHandler;
|
|
4
|
+
exports.deliverAttention = deliverAttention;
|
|
5
|
+
let handler;
|
|
6
|
+
/** Product modules opt into the ATTENTIONS lane; core owns only transport routing. */
|
|
7
|
+
function registerAttentionHandler(next) {
|
|
8
|
+
handler = next;
|
|
9
|
+
}
|
|
10
|
+
async function deliverAttention(delivery) {
|
|
11
|
+
if (!handler)
|
|
12
|
+
throw new Error('ATTENTIONS lane has no registered product handler');
|
|
13
|
+
return await handler(delivery);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=attention-lane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention-lane.js","sourceRoot":"","sources":["../../../server/service/reference/attention-lane.ts"],"names":[],"mappings":";;AAaA,4DAEC;AAED,4CAGC;AAVD,IAAI,OAAqC,CAAA;AAEzC,sFAAsF;AACtF,SAAgB,wBAAwB,CAAC,IAAsB;IAC7D,OAAO,GAAG,IAAI,CAAA;AAChB,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,QAA2B;IAChE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IAClF,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC","sourcesContent":["import type { IngestResult } from './reference-hook.js'\n\nexport interface AttentionDelivery {\n domainId: string\n source: string\n instanceId: string\n records: unknown[]\n}\n\ntype AttentionHandler = (delivery: AttentionDelivery) => IngestResult | Promise<IngestResult>\nlet handler: AttentionHandler | undefined\n\n/** Product modules opt into the ATTENTIONS lane; core owns only transport routing. */\nexport function registerAttentionHandler(next: AttentionHandler): void {\n handler = next\n}\n\nexport async function deliverAttention(delivery: AttentionDelivery): Promise<IngestResult> {\n if (!handler) throw new Error('ATTENTIONS lane has no registered product handler')\n return await handler(delivery)\n}\n"]}
|
|
@@ -2,10 +2,13 @@ import { ConnectionPortabilityResolver } from './connection-portability-resolver
|
|
|
2
2
|
import { TwinReferenceResolver } from './reference-resolver.js';
|
|
3
3
|
import { TwinReferenceProgressSubscription } from './reference-progress-subscription.js';
|
|
4
4
|
import { TwinReference } from './twin-reference.js';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import { TwinReferenceReconciliation } from './twin-reference-reconciliation.js';
|
|
6
|
+
import { TwinReferenceReconciliationQuery } from './reference-reconciliation-query.js';
|
|
7
|
+
export declare const entities: (typeof TwinReference | typeof TwinReferenceReconciliation)[];
|
|
8
|
+
export declare const resolvers: (typeof ConnectionPortabilityResolver | typeof TwinReferenceResolver | typeof TwinReferenceProgressSubscription | typeof TwinReferenceReconciliationQuery)[];
|
|
7
9
|
export * from './control-routing.js';
|
|
8
10
|
export * from './reference-progress.js';
|
|
9
11
|
export * from './reference-probe.js';
|
|
10
12
|
export * from './reference-fill.js';
|
|
13
|
+
export * from './reference-reconciliation.js';
|
|
11
14
|
export * from './connection-portability.js';
|
|
@@ -6,8 +6,10 @@ const connection_portability_resolver_js_1 = require("./connection-portability-r
|
|
|
6
6
|
const reference_resolver_js_1 = require("./reference-resolver.js");
|
|
7
7
|
const reference_progress_subscription_js_1 = require("./reference-progress-subscription.js");
|
|
8
8
|
const twin_reference_js_1 = require("./twin-reference.js");
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const twin_reference_reconciliation_js_1 = require("./twin-reference-reconciliation.js");
|
|
10
|
+
const reference_reconciliation_query_js_1 = require("./reference-reconciliation-query.js");
|
|
11
|
+
exports.entities = [twin_reference_js_1.TwinReference, twin_reference_reconciliation_js_1.TwinReferenceReconciliation];
|
|
12
|
+
exports.resolvers = [reference_resolver_js_1.TwinReferenceResolver, reference_progress_subscription_js_1.TwinReferenceProgressSubscription, connection_portability_resolver_js_1.ConnectionPortabilityResolver, reference_reconciliation_query_js_1.TwinReferenceReconciliationQuery];
|
|
11
13
|
tslib_1.__exportStar(require("./control-routing.js"), exports);
|
|
12
14
|
/* 진행 단계 어휘 — **모든 커넥터가 같은 낱말로 말한다.** 화면은 단계마다 번역 하나만 두면 된다. */
|
|
13
15
|
tslib_1.__exportStar(require("./reference-progress.js"), exports);
|
|
@@ -15,5 +17,6 @@ tslib_1.__exportStar(require("./reference-progress.js"), exports);
|
|
|
15
17
|
tslib_1.__exportStar(require("./reference-probe.js"), exports);
|
|
16
18
|
/* 놓친 구간을 backfill 해 채우는 길 — 밀어 받는 길과 같은 번호 검사를 지난다. */
|
|
17
19
|
tslib_1.__exportStar(require("./reference-fill.js"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./reference-reconciliation.js"), exports);
|
|
18
21
|
tslib_1.__exportStar(require("./connection-portability.js"), exports);
|
|
19
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/reference/index.ts"],"names":[],"mappings":";;;;AAAA,6FAAoF;AACpF,mEAA+D;AAC/D,6FAAwF;AACxF,2DAAmD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/reference/index.ts"],"names":[],"mappings":";;;;AAAA,6FAAoF;AACpF,mEAA+D;AAC/D,6FAAwF;AACxF,2DAAmD;AACnD,yFAAgF;AAChF,2FAAsF;AAEzE,QAAA,QAAQ,GAAG,CAAC,iCAAa,EAAE,8DAA2B,CAAC,CAAA;AACvD,QAAA,SAAS,GAAG,CAAC,6CAAqB,EAAE,sEAAiC,EAAE,kEAA6B,EAAE,oEAAgC,CAAC,CAAA;AACpJ,+DAAoC;AACpC,+DAA+D;AAC/D,kEAAuC;AACvC,4DAA4D;AAC5D,+DAAoC;AACpC,uDAAuD;AACvD,8DAAmC;AACnC,wEAA6C;AAC7C,sEAA2C","sourcesContent":["import { ConnectionPortabilityResolver } from './connection-portability-resolver.js'\nimport { TwinReferenceResolver } from './reference-resolver.js'\nimport { TwinReferenceProgressSubscription } from './reference-progress-subscription.js'\nimport { TwinReference } from './twin-reference.js'\nimport { TwinReferenceReconciliation } from './twin-reference-reconciliation.js'\nimport { TwinReferenceReconciliationQuery } from './reference-reconciliation-query.js'\n\nexport const entities = [TwinReference, TwinReferenceReconciliation]\nexport const resolvers = [TwinReferenceResolver, TwinReferenceProgressSubscription, ConnectionPortabilityResolver, TwinReferenceReconciliationQuery]\nexport * from './control-routing.js'\n/* 진행 단계 어휘 — **모든 커넥터가 같은 낱말로 말한다.** 화면은 단계마다 번역 하나만 두면 된다. */\nexport * from './reference-progress.js'\n/* 커넥터 점검 하네스 — 실 원본에 붙여 무엇이 채워지고 무엇이 비는지 센다(앱을 띄우지 않는다). */\nexport * from './reference-probe.js'\n/* 놓친 구간을 backfill 해 채우는 길 — 밀어 받는 길과 같은 번호 검사를 지난다. */\nexport * from './reference-fill.js'\nexport * from './reference-reconciliation.js'\nexport * from './connection-portability.js'\n"]}
|
|
@@ -187,6 +187,12 @@ export interface SeqReport {
|
|
|
187
187
|
truncated?: boolean;
|
|
188
188
|
}
|
|
189
189
|
export interface InboundBatch {
|
|
190
|
+
/**
|
|
191
|
+
* Receiver path for this batch. Omitted is FACTS, preserving every existing
|
|
192
|
+
* connector; ATTENTIONS is a product-level analysis input and must not be
|
|
193
|
+
* folded as a canonical fact.
|
|
194
|
+
*/
|
|
195
|
+
lane?: 'FACTS' | 'ATTENTIONS';
|
|
190
196
|
/**
|
|
191
197
|
* 옮긴 것들. 우리와 무관한 본문이면 빈 배열이다.
|
|
192
198
|
*
|