@rsconcept/rstool 0.5.2 → 0.6.1
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 +1 -1
- package/docs/PORTAL-API.md +84 -6
- package/examples/README.md +59 -0
- package/examples/agent-client.ts +76 -0
- package/examples/build-kinship-rsform.ts +466 -0
- package/examples/build-kinship-rsmodel.ts +125 -0
- package/examples/build-sample-rsform.ts +90 -0
- package/examples/build-sample-rsmodel.ts +106 -0
- package/examples/kinship/cli.ts +247 -0
- package/examples/kinship/constants.ts +12 -0
- package/examples/kinship/session.ts +190 -0
- package/examples/kinship/x1-actions.test.ts +136 -0
- package/examples/kinship/x1-actions.ts +371 -0
- package/examples/kinship-rsform-session.json +1221 -0
- package/examples/kinship-rsmodel-session.json +1263 -0
- package/examples/sample-rsform-session.json +134 -0
- package/examples/sample-rsmodel-session.json +163 -0
- package/package.json +3 -1
- package/skills/rstool-helper/EXAMPLES.md +1 -1
- package/skills/rstool-helper/GUIDE.md +15 -0
- package/skills/rstool-helper/REFERENCE.md +4 -0
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { EvalStatus, RSToolWrapperClient } from '../src';
|
|
5
|
+
|
|
6
|
+
import { A1_ID, D3_ID, S2_ID, S3_ID } from './kinship/constants';
|
|
7
|
+
|
|
8
|
+
/** Tuple marker in structured values. */
|
|
9
|
+
const TUPLE_ID = -111;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Minimal family so D3 (внучатые племянники) is non-empty:
|
|
13
|
+
* - 0,1 Иван/Мария — общие родители 2,3
|
|
14
|
+
* - 2 Пётр, 3 Анна — сиблинги
|
|
15
|
+
* - 4 Олег — сын Петра
|
|
16
|
+
* - 5 Дарья — дочь Анны (племянница Петра)
|
|
17
|
+
* - 6 Семён — сын Дарьи (внучатый племянник Петра)
|
|
18
|
+
*/
|
|
19
|
+
const X1_BINDING = {
|
|
20
|
+
0: 'Иван',
|
|
21
|
+
1: 'Мария',
|
|
22
|
+
2: 'Пётр',
|
|
23
|
+
3: 'Анна',
|
|
24
|
+
4: 'Олег',
|
|
25
|
+
5: 'Дарья',
|
|
26
|
+
6: 'Семён'
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
/** S1: (parent, child) pairs — numeric indices into X1. */
|
|
30
|
+
const S1_VALUE = [
|
|
31
|
+
[TUPLE_ID, 0, 2],
|
|
32
|
+
[TUPLE_ID, 1, 2],
|
|
33
|
+
[TUPLE_ID, 0, 3],
|
|
34
|
+
[TUPLE_ID, 1, 3],
|
|
35
|
+
[TUPLE_ID, 2, 4],
|
|
36
|
+
[TUPLE_ID, 3, 5],
|
|
37
|
+
[TUPLE_ID, 5, 6]
|
|
38
|
+
] as const;
|
|
39
|
+
|
|
40
|
+
/** Indices of men and women in the sample family (Иван, Пётр, Олег, Семён — м; остальные — ж). */
|
|
41
|
+
const S2_VALUE = [0, 2, 4, 6] as const;
|
|
42
|
+
const S3_VALUE = [1, 3, 5] as const;
|
|
43
|
+
|
|
44
|
+
async function run() {
|
|
45
|
+
const client = new RSToolWrapperClient({
|
|
46
|
+
cwd: resolve(process.cwd())
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
await client.waitUntilReady();
|
|
51
|
+
const kinshipPath = resolve(process.cwd(), 'examples', 'kinship-rsform-session.json');
|
|
52
|
+
const kinshipJson = await readFile(kinshipPath, 'utf8');
|
|
53
|
+
|
|
54
|
+
const imported = await client.call<{ sessionId: string }>('importSession', {
|
|
55
|
+
payload: kinshipJson
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await client.call('setConstituentaValues', {
|
|
59
|
+
sessionId: imported.sessionId,
|
|
60
|
+
input: {
|
|
61
|
+
items: [
|
|
62
|
+
{ target: 1, value: X1_BINDING },
|
|
63
|
+
{ target: 2, value: S1_VALUE },
|
|
64
|
+
{ target: S2_ID, value: S2_VALUE },
|
|
65
|
+
{ target: S3_ID, value: S3_VALUE }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const recalculated = await client.call<{
|
|
71
|
+
items: { id: number; alias: string; value: unknown; status: number }[];
|
|
72
|
+
}>('recalculateModel', {
|
|
73
|
+
sessionId: imported.sessionId
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const d3 = recalculated.items.find(item => item.id === D3_ID);
|
|
77
|
+
const d3Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
|
|
78
|
+
sessionId: imported.sessionId,
|
|
79
|
+
input: { constituentId: D3_ID }
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const a1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
|
|
83
|
+
sessionId: imported.sessionId,
|
|
84
|
+
input: { constituentId: A1_ID }
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
console.log('D3 recalculate:', d3);
|
|
88
|
+
console.log('D3 evaluate:', d3Eval);
|
|
89
|
+
console.log('A1 evaluate:', a1Eval);
|
|
90
|
+
|
|
91
|
+
if (
|
|
92
|
+
!d3Eval.success ||
|
|
93
|
+
d3Eval.status !== EvalStatus.HAS_DATA ||
|
|
94
|
+
!Array.isArray(d3Eval.value) ||
|
|
95
|
+
d3Eval.value.length === 0
|
|
96
|
+
) {
|
|
97
|
+
console.error('Expected non-empty D3; got', d3Eval);
|
|
98
|
+
throw new Error(`Expected non-empty D3; got ${JSON.stringify(d3Eval)}`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (!a1Eval.success || a1Eval.status === EvalStatus.AXIOM_FALSE || a1Eval.value !== 1) {
|
|
102
|
+
console.error('Expected A1 card(X1)≤10 to hold; got', a1Eval);
|
|
103
|
+
throw new Error(`Expected A1 card(X1)≤10 to hold; got ${JSON.stringify(a1Eval)}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
await client.call('commitStep', {
|
|
107
|
+
sessionId: imported.sessionId,
|
|
108
|
+
message: 'Модель kinship: D3 непуст; A1 card(X1)≤10 выполняется'
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const exported = await client.call<string>('exportSession', {
|
|
112
|
+
sessionId: imported.sessionId
|
|
113
|
+
});
|
|
114
|
+
const outputPath = resolve(process.cwd(), 'examples', 'kinship-rsmodel-session.json');
|
|
115
|
+
await writeFile(outputPath, exported, 'utf8');
|
|
116
|
+
console.log(`Exported: ${outputPath}`);
|
|
117
|
+
} finally {
|
|
118
|
+
await client.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
run().catch(error => {
|
|
123
|
+
console.error(error);
|
|
124
|
+
process.exit(1);
|
|
125
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
draft: {
|
|
26
|
+
id: 2,
|
|
27
|
+
alias: 'C1',
|
|
28
|
+
cstType: CstType.CONSTANT,
|
|
29
|
+
definitionFormal: ''
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
draft: {
|
|
34
|
+
id: 3,
|
|
35
|
+
alias: 'S1',
|
|
36
|
+
cstType: CstType.STRUCTURED,
|
|
37
|
+
definitionFormal: 'ℬ(X1×X1)',
|
|
38
|
+
convention: 'Pairs (parent, child) over X1.'
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
draft: {
|
|
43
|
+
id: 4,
|
|
44
|
+
alias: 'D1',
|
|
45
|
+
cstType: CstType.TERM,
|
|
46
|
+
definitionFormal: 'Pr1(S1)'
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
draft: {
|
|
51
|
+
id: 5,
|
|
52
|
+
alias: 'A1',
|
|
53
|
+
cstType: CstType.AXIOM,
|
|
54
|
+
definitionFormal: '1=1'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
for (const input of drafts) {
|
|
60
|
+
const result = await client.call('addOrUpdateConstituenta', {
|
|
61
|
+
sessionId: session.sessionId,
|
|
62
|
+
input
|
|
63
|
+
});
|
|
64
|
+
console.log(
|
|
65
|
+
`Added ${input.draft.alias}:`,
|
|
66
|
+
(result as { diagnostics?: unknown[] }).diagnostics?.length ?? 0,
|
|
67
|
+
'diagnostics'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await client.call('commitStep', {
|
|
72
|
+
sessionId: session.sessionId,
|
|
73
|
+
message: 'Built sample RSForm'
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const exported = await client.call<string>('exportSession', {
|
|
77
|
+
sessionId: session.sessionId
|
|
78
|
+
});
|
|
79
|
+
const outputPath = resolve(process.cwd(), 'examples', 'sample-rsform-session.json');
|
|
80
|
+
await writeFile(outputPath, exported, 'utf8');
|
|
81
|
+
console.log(`Sample RSForm exported: ${outputPath}`);
|
|
82
|
+
} finally {
|
|
83
|
+
await client.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
run().catch(error => {
|
|
88
|
+
console.error(error);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
});
|