@rsconcept/rstool 0.5.2 → 0.6.0

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 CHANGED
@@ -78,7 +78,7 @@ From `rsconcept/rstool` (or run `powershell -File scripts/dev/LocalDevSetup.ps1`
78
78
  - `npm test`
79
79
  - `npm run build` — produce `dist/` via tsdown
80
80
  - `npm run wrapper` — dev stdio wrapper via `tsx`
81
- - `npm run example:client`, `npm run example:build-schema`, `npm run example:build-rsmodel`
81
+ - `npm run example:client`, `npm run example:build-schema`, `npm run example:build-rsmodel` — see [`examples/README.md`](examples/README.md) for the full list (kinship scripts, session JSON)
82
82
 
83
83
  ## Stdio protocol
84
84
 
@@ -0,0 +1,59 @@
1
+ # Примеры rstool
2
+
3
+ Полные исполняемые сценарии поверх `RSToolWrapperClient` (stdio-обёртка) и готовые JSON-сессии для импорта. Короткие фрагменты кода для агентов — в [`../skills/rstool-helper/EXAMPLES.md`](../skills/rstool-helper/EXAMPLES.md); воркфлоу — [`../skills/rstool-helper/GUIDE.md`](../skills/rstool-helper/GUIDE.md).
4
+
5
+ ## Как запускать
6
+
7
+ **Из checkout репозитория** (`rsconcept/rstool`):
8
+
9
+ ```bash
10
+ npm install
11
+ npm run build # обёртка для скриптов
12
+ npm run example:client # и остальные example:* / kinship:cli — см. ниже
13
+ ```
14
+
15
+ **После `npm install @rsconcept/rstool`** (нужен `tsx` или аналог):
16
+
17
+ ```bash
18
+ npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
19
+ ```
20
+
21
+ Скрипты пишут JSON рядом с собой в `examples/`; запускайте из корня пакета (каталог, где лежит `package.json` rstool).
22
+
23
+ ## Скрипты
24
+
25
+ | Файл | npm-скрипт | Назначение |
26
+ |------|------------|------------|
27
+ | [`agent-client.ts`](agent-client.ts) | `example:client` | Минимальный цикл: сессия, upsert, анализ, значения, диагностики через stdio |
28
+ | [`build-sample-rsform.ts`](build-sample-rsform.ts) | `example:build-schema` | Собрать учебную RSForm (X1, S1, D1) и сохранить сессию |
29
+ | [`build-sample-rsmodel.ts`](build-sample-rsmodel.ts) | `example:build-rsmodel` | RSForm + привязки + вычисления → учебная RSModel |
30
+ | [`build-kinship-rsform.ts`](build-kinship-rsform.ts) | `example:build-kinship-schema` | Полная концептуальная схема «родственные отношения» (много конституент) |
31
+ | [`build-kinship-rsmodel.ts`](build-kinship-rsmodel.ts) | `example:build-kinship-rsmodel` | Загрузить kinship RSForm, задать семью, вычислить модель (в т.ч. D3) |
32
+ | [`kinship/cli.ts`](kinship/cli.ts) | `kinship:cli` | Интерактивное редактирование людей (X1) и связей (S1) в kinship-модели |
33
+
34
+ ## JSON-сессии
35
+
36
+ Готовые снимки `exportSession` — для `importSession`, тестов и CLI:
37
+
38
+ | Файл | Содержимое |
39
+ |------|------------|
40
+ | [`sample-rsform-session.json`](sample-rsform-session.json) | Учебная RSForm (результат `build-sample-rsform`) |
41
+ | [`sample-rsmodel-session.json`](sample-rsmodel-session.json) | Учебная RSModel с вычисленными значениями |
42
+ | [`kinship-rsform-session.json`](kinship-rsform-session.json) | Схема родства без привязок |
43
+ | [`kinship-rsmodel-session.json`](kinship-rsmodel-session.json) | Kinship-модель с примерной семьёй (по умолчанию для `kinship:cli`) |
44
+
45
+ Пересобрать JSON: соответствующий `build-*.ts` перезапишет файл в `examples/`.
46
+
47
+ ## Папка `kinship/`
48
+
49
+ Вспомогательный код для сценария «родственные отношения», не отдельный пакет:
50
+
51
+ | Файл | Роль |
52
+ |------|------|
53
+ | [`constants.ts`](kinship/constants.ts) | Id конституент (X1, S1, D3, A1, …) и путь сессии по умолчанию |
54
+ | [`session.ts`](kinship/session.ts) | Обёртка над сессией: загрузка/сохранение, команды над X1 и S1 |
55
+ | [`x1-actions.ts`](kinship/x1-actions.ts) | Парсинг и применение изменений списка людей |
56
+ | [`x1-actions.test.ts`](kinship/x1-actions.test.ts) | Тесты логики X1 (`npm test`) |
57
+ | [`cli.ts`](kinship/cli.ts) | REPL: `list`, `add`, `remove`, `rename`, `set`, `save`, … |
58
+
59
+ См. также [`../docs/CONSTITUENTA.md`](../docs/CONSTITUENTA.md) (разбор kinship-схемы) и [`../docs/MODEL-TESTING.md`](../docs/MODEL-TESTING.md).
@@ -0,0 +1,76 @@
1
+ import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput, type AnalyzeExpressionInput } from '../src';
2
+
3
+ interface CreateSessionResult {
4
+ sessionId: string;
5
+ contractVersion: string;
6
+ }
7
+
8
+ async function runExample() {
9
+ const client = new RSToolWrapperClient();
10
+ try {
11
+ await client.waitUntilReady();
12
+
13
+ const session = await client.call<CreateSessionResult>('createSession');
14
+ console.log('Session created:', session);
15
+
16
+ const baseInput: AddOrUpdateConstituentaInput = {
17
+ draft: {
18
+ id: 1,
19
+ alias: 'X1',
20
+ cstType: CstType.BASE,
21
+ definitionFormal: ''
22
+ }
23
+ };
24
+ await client.call('addOrUpdateConstituenta', {
25
+ sessionId: session.sessionId,
26
+ input: baseInput
27
+ });
28
+
29
+ const upsertInput: AddOrUpdateConstituentaInput = {
30
+ draft: {
31
+ id: 2,
32
+ alias: 'D1',
33
+ cstType: CstType.TERM,
34
+ definitionFormal: '1+2'
35
+ }
36
+ };
37
+ const upsert = await client.call('addOrUpdateConstituenta', {
38
+ sessionId: session.sessionId,
39
+ input: upsertInput
40
+ });
41
+ console.log('Upsert result:', upsert);
42
+
43
+ await client.call('setConstituentaValue', {
44
+ sessionId: session.sessionId,
45
+ input: { target: 1, value: { 0: 'zero', 1: 'one' } }
46
+ });
47
+
48
+ const evalResult = await client.call('evaluateConstituenta', {
49
+ sessionId: session.sessionId,
50
+ input: { constituentId: 2 }
51
+ });
52
+ console.log('Evaluation result:', evalResult);
53
+
54
+ const analyzeInput: AnalyzeExpressionInput = {
55
+ expression: '(',
56
+ cstType: CstType.TERM
57
+ };
58
+ const analysis = await client.call('analyzeExpression', {
59
+ sessionId: session.sessionId,
60
+ input: analyzeInput
61
+ });
62
+ console.log('Analysis result:', analysis);
63
+
64
+ const diagnostics = await client.call('listDiagnostics', {
65
+ sessionId: session.sessionId
66
+ });
67
+ console.log('Diagnostics count:', Array.isArray(diagnostics) ? diagnostics.length : diagnostics);
68
+ } finally {
69
+ await client.close();
70
+ }
71
+ }
72
+
73
+ runExample().catch(error => {
74
+ console.error(error);
75
+ process.exit(1);
76
+ });
@@ -0,0 +1,466 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+
4
+ import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput } from '../src';
5
+
6
+ async function run() {
7
+ const client = new RSToolWrapperClient({
8
+ cwd: resolve(process.cwd())
9
+ });
10
+
11
+ try {
12
+ await client.waitUntilReady();
13
+ const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession');
14
+
15
+ const drafts: AddOrUpdateConstituentaInput[] = [
16
+ {
17
+ draft: {
18
+ id: 1,
19
+ alias: 'X1',
20
+ cstType: CstType.BASE,
21
+ definitionFormal: '',
22
+ term: 'люди',
23
+ convention: 'Базисное множество людей предметной области «родственные отношения».'
24
+ }
25
+ },
26
+ {
27
+ draft: {
28
+ id: 2,
29
+ alias: 'S1',
30
+ cstType: CstType.STRUCTURED,
31
+ definitionFormal: 'ℬ(X1×X1)',
32
+ term: 'родитель-ребенок',
33
+ convention:
34
+ 'Элементы — пары (p, c): p — родитель, c — ребёнок; p, c ∈ X1. Отношение задаётся конвенцией на предметной области.'
35
+ }
36
+ },
37
+ {
38
+ draft: {
39
+ id: 3,
40
+ alias: 'D1',
41
+ cstType: CstType.TERM,
42
+ definitionFormal: 'Pr1(S1)',
43
+ term: 'родители',
44
+ definitionText: 'Множество людей, выступающих в роли родителя хотя бы для одного ребёнка.'
45
+ }
46
+ },
47
+ {
48
+ draft: {
49
+ id: 4,
50
+ alias: 'F1',
51
+ cstType: CstType.FUNCTION,
52
+ definitionFormal: '[ξ∈X1] Pr1(Fi2[{ξ}](S1))',
53
+ term: 'родители данного человека',
54
+ definitionText:
55
+ 'Для человека ξ — множество его родителей (первая проекция пар из S1, у которых вторая проекция равна ξ).'
56
+ }
57
+ },
58
+ {
59
+ draft: {
60
+ id: 10,
61
+ alias: 'F6',
62
+ cstType: CstType.FUNCTION,
63
+ definitionFormal: '[σ∈ℬ(X1)] Pr2(Fi1[σ](S1))',
64
+ term: 'дети',
65
+ definitionText:
66
+ 'Прямые дети людей из σ: вторая проекция пар из S1, у которых родитель (первая проекция) лежит в σ. Для одного человека ξ используют F6[{ξ}].'
67
+ }
68
+ },
69
+ {
70
+ draft: {
71
+ id: 5,
72
+ alias: 'D2',
73
+ cstType: CstType.TERM,
74
+ definitionFormal: 'Pr2(S1)',
75
+ term: 'потомки',
76
+ definitionText:
77
+ 'Множество людей, выступающих ребёнком хотя бы в одной паре из S1 (симметрично терму «родители»).'
78
+ }
79
+ },
80
+ {
81
+ draft: {
82
+ id: 6,
83
+ alias: 'F2',
84
+ cstType: CstType.FUNCTION,
85
+ definitionFormal: '[ξ∈X1] R{ρ:=F6[{ξ}] | ρ≠∅ | ρ∪F6[ρ]}',
86
+ term: 'потомки данного человека',
87
+ definitionText:
88
+ 'Для человека ξ — транзитивное замыкание отношения «ребёнок»: прямые дети, внуки и все последующие поколения.'
89
+ }
90
+ },
91
+ {
92
+ draft: {
93
+ id: 7,
94
+ alias: 'F3',
95
+ cstType: CstType.FUNCTION,
96
+ definitionFormal: '[ξ∈X1] D{μ∈X1 | ∃p∈F1[ξ] μ∈F1[p] & μ≠ξ}',
97
+ term: 'братья и сестры данного человека',
98
+ definitionText:
99
+ 'Люди μ ≠ ξ, у которых есть общий с ξ родитель (в т.ч. сводные братья и сестры при одном общем родителе).'
100
+ }
101
+ },
102
+ {
103
+ draft: {
104
+ id: 8,
105
+ alias: 'F4',
106
+ cstType: CstType.FUNCTION,
107
+ definitionFormal: '[ξ∈X1] D{κ∈X1 | ∃μ∈F3[ξ] κ∈F6[{μ}] & κ∉F2[ξ]}',
108
+ term: 'племянники данного человека',
109
+ definitionText: 'Прямые дети братьев и сестёр ξ, не входящие в множество потомков самого ξ.'
110
+ }
111
+ },
112
+ {
113
+ draft: {
114
+ id: 9,
115
+ alias: 'F5',
116
+ cstType: CstType.FUNCTION,
117
+ definitionFormal: '[ξ∈X1] D{ν∈X1 | ∃κ∈F4[ξ] ν∈F6[{κ}]}',
118
+ term: 'внучатые племянники данного человека',
119
+ definitionText:
120
+ 'Прямые дети племянников ξ: потомки братьев/сестёр на два поколения ниже (ребёнок племянника или племянницы).'
121
+ }
122
+ },
123
+ {
124
+ draft: {
125
+ id: 11,
126
+ alias: 'D3',
127
+ cstType: CstType.TERM,
128
+ definitionFormal: 'D{ν∈X1 | ∃ξ∈X1 ν∈F5[ξ]}',
129
+ term: 'внучатые племянники',
130
+ definitionText:
131
+ 'Множество людей, являющихся внучатыми племянниками или племянницами хотя бы одного человека из X1 (объединение значений F5 по всем ξ).'
132
+ }
133
+ },
134
+ {
135
+ draft: {
136
+ id: 13,
137
+ alias: 'S2',
138
+ cstType: CstType.STRUCTURED,
139
+ definitionFormal: 'ℬ(X1)',
140
+ term: 'мужчины',
141
+ convention:
142
+ 'Пол устанавливается по документам; каждый индивид из X1 входит ровно в одно из множеств S2 или S3.'
143
+ }
144
+ },
145
+ {
146
+ draft: {
147
+ id: 14,
148
+ alias: 'S3',
149
+ cstType: CstType.STRUCTURED,
150
+ definitionFormal: 'ℬ(X1)',
151
+ term: 'женщины',
152
+ convention:
153
+ 'Пол устанавливается по документам; каждый индивид из X1 входит ровно в одно из множеств S2 или S3.'
154
+ }
155
+ },
156
+ {
157
+ draft: {
158
+ id: 15,
159
+ alias: 'A2',
160
+ cstType: CstType.AXIOM,
161
+ definitionFormal: 'S2∪S3=X1 & S2∩S3=∅',
162
+ term: 'разбиение людей по полу',
163
+ definitionText: 'Каждый человек — мужчина или женщина, но не оба сразу: S2 и S3 образуют разбиение X1.'
164
+ }
165
+ },
166
+ {
167
+ draft: {
168
+ id: 16,
169
+ alias: 'F7',
170
+ cstType: CstType.FUNCTION,
171
+ definitionFormal: '[ξ∈X1] F1[ξ]∩S2',
172
+ term: 'отцы данного человека',
173
+ definitionText: 'Родители ξ, являющиеся мужчинами.'
174
+ }
175
+ },
176
+ {
177
+ draft: {
178
+ id: 17,
179
+ alias: 'F8',
180
+ cstType: CstType.FUNCTION,
181
+ definitionFormal: '[ξ∈X1] F1[ξ]∩S3',
182
+ term: 'матери данного человека',
183
+ definitionText: 'Родители ξ, являющиеся женщинами.'
184
+ }
185
+ },
186
+ {
187
+ draft: {
188
+ id: 18,
189
+ alias: 'A3',
190
+ cstType: CstType.AXIOM,
191
+ definitionFormal: '∀ξ∈X1 (card(F7[ξ])≤1 & card(F8[ξ])≤1)',
192
+ term: 'не более одного отца и одной матери',
193
+ definitionText: 'У каждого человека не более одного отца и не более одной матери.'
194
+ }
195
+ },
196
+ {
197
+ draft: {
198
+ id: 19,
199
+ alias: 'F9',
200
+ cstType: CstType.FUNCTION,
201
+ definitionFormal: '[ξ∈X1] F3[ξ]∩S2',
202
+ term: 'братья данного человека',
203
+ definitionText: 'Братья и сёстры ξ (F3), являющиеся мужчинами.'
204
+ }
205
+ },
206
+ {
207
+ draft: {
208
+ id: 20,
209
+ alias: 'F10',
210
+ cstType: CstType.FUNCTION,
211
+ definitionFormal: '[ξ∈X1] F3[ξ]∩S3',
212
+ term: 'сёстры данного человека',
213
+ definitionText: 'Братья и сёстры ξ (F3), являющиеся женщинами.'
214
+ }
215
+ },
216
+ {
217
+ draft: {
218
+ id: 21,
219
+ alias: 'F11',
220
+ cstType: CstType.FUNCTION,
221
+ definitionFormal: '[ξ∈X1] D{μ∈F3[ξ] | F1[ξ]=F1[μ]}',
222
+ term: 'полнородные братья и сёстры',
223
+ definitionText: 'Сиблинги с полностью совпадающими множествами родителей.'
224
+ }
225
+ },
226
+ {
227
+ draft: {
228
+ id: 22,
229
+ alias: 'F12',
230
+ cstType: CstType.FUNCTION,
231
+ definitionFormal: '[ξ∈X1] F11[ξ]∩S2',
232
+ term: 'полнородные братья',
233
+ definitionText: 'Полнородные сиблинги ξ, являющиеся мужчинами.'
234
+ }
235
+ },
236
+ {
237
+ draft: {
238
+ id: 23,
239
+ alias: 'F13',
240
+ cstType: CstType.FUNCTION,
241
+ definitionFormal: '[ξ∈X1] F11[ξ]∩S3',
242
+ term: 'полнородные сёстры',
243
+ definitionText: 'Полнородные сиблинги ξ, являющиеся женщинами.'
244
+ }
245
+ },
246
+ {
247
+ draft: {
248
+ id: 24,
249
+ alias: 'F14',
250
+ cstType: CstType.FUNCTION,
251
+ definitionFormal: '[ξ∈X1] D{μ∈F3[ξ] | F7[ξ]=F7[μ] & F8[ξ]≠F8[μ]}',
252
+ term: 'единокровные братья и сёстры',
253
+ definitionText: 'Сиблинги с общим отцом и разными матерями.'
254
+ }
255
+ },
256
+ {
257
+ draft: {
258
+ id: 25,
259
+ alias: 'F15',
260
+ cstType: CstType.FUNCTION,
261
+ definitionFormal: '[ξ∈X1] F14[ξ]∩S2',
262
+ term: 'единокровные братья',
263
+ definitionText: 'Единокровные сиблинги ξ, являющиеся мужчинами.'
264
+ }
265
+ },
266
+ {
267
+ draft: {
268
+ id: 26,
269
+ alias: 'F16',
270
+ cstType: CstType.FUNCTION,
271
+ definitionFormal: '[ξ∈X1] F14[ξ]∩S3',
272
+ term: 'единокровные сёстры',
273
+ definitionText: 'Единокровные сиблинги ξ, являющиеся женщинами.'
274
+ }
275
+ },
276
+ {
277
+ draft: {
278
+ id: 27,
279
+ alias: 'F17',
280
+ cstType: CstType.FUNCTION,
281
+ definitionFormal: '[ξ∈X1] D{μ∈F3[ξ] | F7[ξ]≠F7[μ] & F8[ξ]=F8[μ]}',
282
+ term: 'единоутробные братья и сёстры',
283
+ definitionText: 'Сиблинги с общей матерью и разными отцами.'
284
+ }
285
+ },
286
+ {
287
+ draft: {
288
+ id: 28,
289
+ alias: 'F18',
290
+ cstType: CstType.FUNCTION,
291
+ definitionFormal: '[ξ∈X1] F17[ξ]∩S2',
292
+ term: 'единоутробные братья',
293
+ definitionText: 'Единоутробные сиблинги ξ, являющиеся мужчинами.'
294
+ }
295
+ },
296
+ {
297
+ draft: {
298
+ id: 29,
299
+ alias: 'F19',
300
+ cstType: CstType.FUNCTION,
301
+ definitionFormal: '[ξ∈X1] F17[ξ]∩S3',
302
+ term: 'единоутробные сёстры',
303
+ definitionText: 'Единоутробные сиблинги ξ, являющиеся женщинами.'
304
+ }
305
+ },
306
+ {
307
+ draft: {
308
+ id: 30,
309
+ alias: 'F20',
310
+ cstType: CstType.FUNCTION,
311
+ definitionFormal: '[ξ∈X1] F6[{ξ}]∩S2',
312
+ term: 'сыновья данного человека',
313
+ definitionText: 'Прямые дети ξ, являющиеся мужчинами.'
314
+ }
315
+ },
316
+ {
317
+ draft: {
318
+ id: 31,
319
+ alias: 'F21',
320
+ cstType: CstType.FUNCTION,
321
+ definitionFormal: '[ξ∈X1] F6[{ξ}]∩S3',
322
+ term: 'дочери данного человека',
323
+ definitionText: 'Прямые дети ξ, являющиеся женщинами.'
324
+ }
325
+ },
326
+ {
327
+ draft: {
328
+ id: 32,
329
+ alias: 'F22',
330
+ cstType: CstType.FUNCTION,
331
+ definitionFormal: '[ξ∈X1] F6[F6[{ξ}]]∩S2',
332
+ term: 'внуки данного человека',
333
+ definitionText: 'Внуки-мужчины: мужчины среди детей детей ξ.'
334
+ }
335
+ },
336
+ {
337
+ draft: {
338
+ id: 33,
339
+ alias: 'F23',
340
+ cstType: CstType.FUNCTION,
341
+ definitionFormal: '[ξ∈X1] F6[F6[{ξ}]]∩S3',
342
+ term: 'внучки данного человека',
343
+ definitionText: 'Внучки: женщины среди детей детей ξ.'
344
+ }
345
+ },
346
+ {
347
+ draft: {
348
+ id: 34,
349
+ alias: 'F24',
350
+ cstType: CstType.FUNCTION,
351
+ definitionFormal: '[ξ∈X1] D{μ∈X1 | ∃p∈F1[ξ] μ∈F7[p]}',
352
+ term: 'дедушки данного человека',
353
+ definitionText: 'Отцы родителей ξ.'
354
+ }
355
+ },
356
+ {
357
+ draft: {
358
+ id: 35,
359
+ alias: 'F25',
360
+ cstType: CstType.FUNCTION,
361
+ definitionFormal: '[ξ∈X1] D{μ∈X1 | ∃p∈F1[ξ] μ∈F8[p]}',
362
+ term: 'бабушки данного человека',
363
+ definitionText: 'Матери родителей ξ.'
364
+ }
365
+ },
366
+ {
367
+ draft: {
368
+ id: 36,
369
+ alias: 'F26',
370
+ cstType: CstType.FUNCTION,
371
+ definitionFormal: '[ξ∈X1] F4[ξ]∩S2',
372
+ term: 'племянники данного человека (мужчины)',
373
+ definitionText: 'Племянники ξ (F4), являющиеся мужчинами.'
374
+ }
375
+ },
376
+ {
377
+ draft: {
378
+ id: 37,
379
+ alias: 'F27',
380
+ cstType: CstType.FUNCTION,
381
+ definitionFormal: '[ξ∈X1] F4[ξ]∩S3',
382
+ term: 'племянницы данного человека',
383
+ definitionText: 'Племянники ξ (F4), являющиеся женщинами.'
384
+ }
385
+ },
386
+ {
387
+ draft: {
388
+ id: 38,
389
+ alias: 'F28',
390
+ cstType: CstType.FUNCTION,
391
+ definitionFormal: '[ξ∈X1] D{ν∈X1 | ∃p∈F1[ξ] ∃κ∈F3[p] ν∈F6[{κ}]}',
392
+ term: 'двоюродные братья и сёстры',
393
+ definitionText: 'Дети братьев и сестёр родителей ξ.'
394
+ }
395
+ },
396
+ {
397
+ draft: {
398
+ id: 39,
399
+ alias: 'F29',
400
+ cstType: CstType.FUNCTION,
401
+ definitionFormal: '[ξ∈X1] F28[ξ]∩S2',
402
+ term: 'двоюродные братья',
403
+ definitionText: 'Двоюродные сиблинги ξ, являющиеся мужчинами.'
404
+ }
405
+ },
406
+ {
407
+ draft: {
408
+ id: 40,
409
+ alias: 'F30',
410
+ cstType: CstType.FUNCTION,
411
+ definitionFormal: '[ξ∈X1] F28[ξ]∩S3',
412
+ term: 'двоюродные сёстры',
413
+ definitionText: 'Двоюродные сиблинги ξ, являющиеся женщинами.'
414
+ }
415
+ },
416
+ {
417
+ draft: {
418
+ id: 12,
419
+ alias: 'A1',
420
+ cstType: CstType.AXIOM,
421
+ definitionFormal: 'card(X1)≤10',
422
+ term: 'не более десяти человек',
423
+ definitionText: 'В предметной области не более десяти человек: мощность X1 не превышает 10.'
424
+ }
425
+ }
426
+ ];
427
+
428
+ for (const input of drafts) {
429
+ const result = await client.call<{
430
+ state: { alias: string; analysis: { success: boolean } };
431
+ diagnostics: unknown[];
432
+ }>('addOrUpdateConstituenta', {
433
+ sessionId: session.sessionId,
434
+ input
435
+ });
436
+ const ok = result.state.analysis.success;
437
+ const diagCount = result.diagnostics?.length ?? 0;
438
+ console.log(`${input.draft.alias}: ${ok ? 'OK' : 'FAIL'} (${diagCount} diagnostics)`);
439
+ if (!ok) {
440
+ const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
441
+ console.log(JSON.stringify(diags, null, 2));
442
+ throw new Error(`${input.draft.alias}: analysis failed (${diagCount} diagnostics): ${JSON.stringify(diags)}`);
443
+ }
444
+ }
445
+
446
+ await client.call('commitStep', {
447
+ sessionId: session.sessionId,
448
+ message:
449
+ 'КС «родственные отношения»: пол (S2/S3), отцы/матери, разновидности сиблингов, внуки, дедушки/бабушки, двоюродные'
450
+ });
451
+
452
+ const exported = await client.call<string>('exportSession', {
453
+ sessionId: session.sessionId
454
+ });
455
+ const outputPath = resolve(process.cwd(), 'examples', 'kinship-rsform-session.json');
456
+ await writeFile(outputPath, exported, 'utf8');
457
+ console.log(`Exported: ${outputPath}`);
458
+ } finally {
459
+ await client.close();
460
+ }
461
+ }
462
+
463
+ run().catch(error => {
464
+ console.error(error);
465
+ process.exit(1);
466
+ });