@things-factory/headless-twin 10.1.206 → 10.1.208
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-server/service/actuation/rule-runner.js +6 -6
- package/dist-server/service/actuation/rule-runner.js.map +1 -1
- package/dist-server/service/reference/connection-portability-resolver.d.ts +3 -3
- package/dist-server/service/reference/connection-portability-resolver.js +7 -7
- package/dist-server/service/reference/connection-portability-resolver.js.map +1 -1
- package/dist-server/service/reference/connection-portability.d.ts +3 -3
- package/dist-server/service/reference/connection-portability.js +4 -4
- package/dist-server/service/reference/connection-portability.js.map +1 -1
- package/package.json +6 -6
- package/server/service/actuation/rule-runner.ts +6 -6
- package/server/service/reference/connection-portability-resolver.ts +7 -7
- package/server/service/reference/connection-portability.ts +5 -5
- package/test/actuation-rule-runner.test.ts +3 -3
- package/test/connection-portability-doors.test.ts +6 -6
- package/test/save-intake-collision.test.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -134,7 +134,7 @@ test('★ 시뮬 트윈에는 조치를 내지 않는다 — 지어낸 조건이
|
|
|
134
134
|
|
|
135
135
|
assert.equal(out[0]!.proposed, 0)
|
|
136
136
|
assert.equal(store.rows.size, 0)
|
|
137
|
-
assert.match(out[0]!.skips[0]!.reason,
|
|
137
|
+
assert.match(out[0]!.skips[0]!.reason, /시뮬레이션 모드.*현장 지시를 생성하지 않습니다/)
|
|
138
138
|
})
|
|
139
139
|
|
|
140
140
|
test('★ 모드를 모르면 내지 않는다 — 모름을 「관측이다」로 읽지 않는다', async () => {
|
|
@@ -142,7 +142,7 @@ test('★ 모드를 모르면 내지 않는다 — 모름을 「관측이다」
|
|
|
142
142
|
const out = await runRulesOnce(deps({ store, modeOf: () => undefined }))
|
|
143
143
|
|
|
144
144
|
assert.equal(out[0]!.proposed, 0)
|
|
145
|
-
assert.match(out[0]!.skips[0]!.reason,
|
|
145
|
+
assert.match(out[0]!.skips[0]!.reason, /실행 모드를 확인할 수 없/)
|
|
146
146
|
})
|
|
147
147
|
|
|
148
148
|
/* ── 두 번 올리지 않는다 ─────────────────────────────────────────────────── */
|
|
@@ -200,7 +200,7 @@ test('★ 근거를 읽을 길이 없으면 아무것도 올리지 않고 말한
|
|
|
200
200
|
test('★ 스냅샷이 없는 트윈은 「주의 0건」이 아니다 — 멈춘 트윈을 조건 없음으로 읽지 않는다', async () => {
|
|
201
201
|
const out = await runRulesOnce(deps({ attentionsOf: () => undefined }))
|
|
202
202
|
assert.equal(out[0]!.proposed, 0)
|
|
203
|
-
assert.match(out[0]!.skips[0]!.reason,
|
|
203
|
+
assert.match(out[0]!.skips[0]!.reason, /실행이 중지되었거나 아직 시작되지 않았을 수 있습니다/)
|
|
204
204
|
})
|
|
205
205
|
|
|
206
206
|
test('주의가 정말 0건이면 이유를 만들지 않는다 — 정상이다', async () => {
|
|
@@ -23,12 +23,12 @@ const row = (over: any = {}) => ({
|
|
|
23
23
|
...over
|
|
24
24
|
})
|
|
25
25
|
|
|
26
|
-
test('★ 비밀값이
|
|
26
|
+
test('★ 비밀값이 패키지에 안 나간다 — 이름만 나간다', () => {
|
|
27
27
|
const b = exportConnections([row()], { at: '2026-09-05T00:00:00.000Z' })
|
|
28
28
|
const text = JSON.stringify(b)
|
|
29
29
|
|
|
30
|
-
assert.ok(!text.includes('SECRET-VALUE'), '토큰이
|
|
31
|
-
assert.ok(!text.includes('ALSO-SECRET'), '훅 비밀값이
|
|
30
|
+
assert.ok(!text.includes('SECRET-VALUE'), '토큰이 패키지에 실렸다')
|
|
31
|
+
assert.ok(!text.includes('ALSO-SECRET'), '훅 비밀값이 패키지에 실렸다')
|
|
32
32
|
assert.deepEqual(b.connections[0].secretsRequired.sort(), ['hookSecret', 'token'], '무엇을 채워야 하는지 말하지 않는다')
|
|
33
33
|
})
|
|
34
34
|
|
|
@@ -62,7 +62,7 @@ test('★ 없는 비밀값을 지어내지 않는다 — 이름을 대고 사람
|
|
|
62
62
|
assert.deepEqual(needs!.keys.sort(), ['hookSecret', 'token'])
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
test('★ 이미 있는 연결의 비밀값을
|
|
65
|
+
test('★ 이미 있는 연결의 비밀값을 패키지가 안 지운다', () => {
|
|
66
66
|
const b = exportConnections([row()], { at: '2026-09-05T00:00:00.000Z' })
|
|
67
67
|
const existing = [{ source: 'mes-miratek', connectionConfig: { token: 'LIVE-TOKEN' } }]
|
|
68
68
|
const plan = planImport(b, existing, () => false)
|
|
@@ -72,7 +72,7 @@ test('★ 이미 있는 연결의 비밀값을 꾸러미가 안 지운다', () =
|
|
|
72
72
|
assert.ok(a.keptSecrets?.includes('token'), '이미 있는 토큰을 지킨다고 말하지 않는다')
|
|
73
73
|
})
|
|
74
74
|
|
|
75
|
-
test('★
|
|
75
|
+
test('★ 패키지가 아닌 것을 받으면 아무것도 하지 않는다', () => {
|
|
76
76
|
for (const bad of [null, {}, { kind: 'something-else' }, 'text']) {
|
|
77
77
|
const plan = planImport(bad, [], () => false)
|
|
78
78
|
assert.equal(plan.actions.length, 0, `${JSON.stringify(bad)} 로 무언가를 하려 했다`)
|
|
@@ -82,6 +82,6 @@ test('★ 꾸러미가 아닌 것을 받으면 아무것도 하지 않는다', (
|
|
|
82
82
|
|
|
83
83
|
test('★ 이 검사가 실제로 무언가를 잰다 — 견준 것이 0이면 빨강', () => {
|
|
84
84
|
const b = exportConnections([row()], { at: '2026-09-05T00:00:00.000Z' })
|
|
85
|
-
assert.equal(b.connections.length, 1, '
|
|
85
|
+
assert.equal(b.connections.length, 1, '패키지가 비었다 — 이 검사가 아무것도 안 잰다')
|
|
86
86
|
assert.ok(planImport(b, [], () => true).actions.length > 0, '계획이 비었다')
|
|
87
87
|
})
|
|
@@ -54,7 +54,7 @@ test('★ 저장의 문이 그 판정을 부르고, 거부하면 쓰기 전에
|
|
|
54
54
|
/*
|
|
55
55
|
* ★ **같은 충돌을 두 모양으로 건다** (ADR-0053 ②, 2026-09-16).
|
|
56
56
|
*
|
|
57
|
-
*
|
|
57
|
+
* 패키지는 `config`, `TwinReference` 행은 `connectionConfig` 다. 전에는 `config` 만 읽어서 행을 그대로
|
|
58
58
|
* 넘기면 `[]` 였다 — 오류도 경고도 없이 저장이 통과했다. 부르는 둘이 마침 옮겨서 부른 덕에 멀쩡했는데,
|
|
59
59
|
* 그건 계약이 아니라 우연이다(이 함수는 화면이 쓰라고 리졸버에서 다시 내보내진다).
|
|
60
60
|
*
|
|
@@ -80,7 +80,7 @@ test('★ 두 모양이 같은 답을 낸다 — 옮기기가 갈리면 여기
|
|
|
80
80
|
assert.deepEqual(asRow, asConfig)
|
|
81
81
|
})
|
|
82
82
|
|
|
83
|
-
test('섞여 들어와도 한 충돌로 본다 — 들여오기는 실제로 행과
|
|
83
|
+
test('섞여 들어와도 한 충돌로 본다 — 들여오기는 실제로 행과 패키지를 함께 넘긴다', () => {
|
|
84
84
|
const mixed = intakeCollisions([
|
|
85
85
|
{ source: 'mes-line-a', connectionConfig: { ...intake } },
|
|
86
86
|
{ source: 'mes-line-b', config: { ...intake } }
|