@rsconcept/rstool 0.7.2 → 0.8.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 +1 -1
- package/docs/CONSTITUENTA.md +1 -1
- package/docs/MODEL-TESTING.md +1 -1
- package/examples/README.md +52 -29
- package/examples/build-chocolate-nim-rsform.ts +311 -0
- package/examples/chocolate-nim/build-rsform.ts +311 -0
- package/examples/chocolate-nim/build-rsmodel.ts +100 -0
- package/examples/chocolate-nim/constants.ts +10 -0
- package/examples/chocolate-nim/rsform-session.json +778 -0
- package/examples/chocolate-nim/rsmodel-session.json +802 -0
- package/examples/expression-bank/bank-constituents.ts +370 -0
- package/examples/expression-bank/build-rsform.ts +59 -0
- package/examples/expression-bank/constants.ts +1 -0
- package/examples/expression-bank/rsform-session.json +4006 -0
- package/examples/{build-kinship-rsform.ts → kinship/build-rsform.ts} +276 -54
- package/examples/{build-kinship-rsmodel.ts → kinship/build-rsmodel.ts} +18 -7
- package/examples/kinship/constants.ts +5 -3
- package/examples/{kinship-rsmodel-session.json → kinship/rsform-session.json} +614 -92
- package/examples/{kinship-rsform-session.json → kinship/rsmodel-session.json} +704 -50
- package/examples/kinship/x1-actions.test.ts +2 -1
- package/examples/movd/build-rsform.ts +325 -0
- package/examples/movd/build-rsmodel.ts +159 -0
- package/examples/movd/constants.ts +18 -0
- package/examples/movd/rsform-session.json +738 -0
- package/examples/movd/rsmodel-session.json +832 -0
- package/examples/{build-sample-rsform.ts → sample/build-rsform.ts} +2 -2
- package/examples/{build-sample-rsmodel.ts → sample/build-rsmodel.ts} +3 -4
- package/examples/template-apply/build-rsform.ts +236 -0
- package/examples/template-apply/constants.ts +13 -0
- package/examples/template-apply/rsform-session.json +333 -0
- package/package.json +12 -6
- package/skills/rstool-helper/EXAMPLES.md +2 -2
- /package/examples/{sample-rsform-session.json → sample/rsform-session.json} +0 -0
- /package/examples/{sample-rsmodel-session.json → sample/rsmodel-session.json} +0 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput } from '../../src';
|
|
5
|
+
|
|
6
|
+
import { DEFAULT_RSFORM_SESSION_PATH } from './constants';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Учебная RSForm «МОВД» по Portal rsforms/838 (сокращённо).
|
|
10
|
+
* Фокус: мультипроекции Pr*,* и мультифильтры Fi*,* на отношениях арности 3.
|
|
11
|
+
*/
|
|
12
|
+
async function run() {
|
|
13
|
+
const client = new RSToolWrapperClient({
|
|
14
|
+
cwd: resolve(process.cwd())
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
await client.waitUntilReady();
|
|
19
|
+
const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession');
|
|
20
|
+
|
|
21
|
+
const drafts: AddOrUpdateConstituentaInput[] = [
|
|
22
|
+
{
|
|
23
|
+
draft: {
|
|
24
|
+
id: 1,
|
|
25
|
+
alias: 'X1',
|
|
26
|
+
cstType: CstType.BASE,
|
|
27
|
+
definitionFormal: '',
|
|
28
|
+
term: 'ситуации',
|
|
29
|
+
convention: 'Различимые ситуации, рассматриваемые как единицы анализа'
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
draft: {
|
|
34
|
+
id: 2,
|
|
35
|
+
alias: 'X2',
|
|
36
|
+
cstType: CstType.BASE,
|
|
37
|
+
definitionFormal: '',
|
|
38
|
+
term: 'элементы ситуации',
|
|
39
|
+
convention: 'Различимые элементы, которые могут входить в состав ситуаций'
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
draft: {
|
|
44
|
+
id: 3,
|
|
45
|
+
alias: 'X3',
|
|
46
|
+
cstType: CstType.BASE,
|
|
47
|
+
definitionFormal: '',
|
|
48
|
+
term: 'субъекты',
|
|
49
|
+
convention: 'Различимые субъекты, осуществляющие ориентировку в ситуации'
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
draft: {
|
|
54
|
+
id: 4,
|
|
55
|
+
alias: 'X4',
|
|
56
|
+
cstType: CstType.BASE,
|
|
57
|
+
definitionFormal: '',
|
|
58
|
+
term: 'действия',
|
|
59
|
+
convention: 'Различимые действия, рассматриваемые субъектом как возможные в ситуации'
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
draft: {
|
|
64
|
+
id: 5,
|
|
65
|
+
alias: 'S1',
|
|
66
|
+
cstType: CstType.STRUCTURED,
|
|
67
|
+
definitionFormal: 'ℬ(X1×X2)',
|
|
68
|
+
term: 'состав ситуации',
|
|
69
|
+
convention: 'Соотносит ситуацию с элементами, входящими в её состав'
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
draft: {
|
|
74
|
+
id: 6,
|
|
75
|
+
alias: 'S2',
|
|
76
|
+
cstType: CstType.STRUCTURED,
|
|
77
|
+
definitionFormal: 'ℬ(X3×X1×X2)',
|
|
78
|
+
term: 'выделение значимого',
|
|
79
|
+
convention: 'Соотносит субъекта, ситуацию и элемент ситуации, выделяемый субъектом как значимый'
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
draft: {
|
|
84
|
+
id: 7,
|
|
85
|
+
alias: 'S3',
|
|
86
|
+
cstType: CstType.STRUCTURED,
|
|
87
|
+
definitionFormal: 'ℬ(X3×X1×X4)',
|
|
88
|
+
term: 'рассмотрение действия',
|
|
89
|
+
convention: 'Соотносит субъекта, ситуацию и действие, рассматриваемое как возможное'
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
draft: {
|
|
94
|
+
id: 8,
|
|
95
|
+
alias: 'S4',
|
|
96
|
+
cstType: CstType.STRUCTURED,
|
|
97
|
+
definitionFormal: 'ℬ(X3×X1×X4)',
|
|
98
|
+
term: 'выбор действия',
|
|
99
|
+
convention: 'Соотносит субъекта, ситуацию и действие, выбранное субъектом'
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
draft: {
|
|
104
|
+
id: 9,
|
|
105
|
+
alias: 'D1',
|
|
106
|
+
cstType: CstType.TERM,
|
|
107
|
+
definitionFormal: 'Pr1(S1)',
|
|
108
|
+
term: 'структурированные ситуации',
|
|
109
|
+
definitionText: 'Ситуации, для которых задан хотя бы один элемент состава'
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
draft: {
|
|
114
|
+
id: 10,
|
|
115
|
+
alias: 'D2',
|
|
116
|
+
cstType: CstType.TERM,
|
|
117
|
+
definitionFormal: 'Pr2(S1)',
|
|
118
|
+
term: 'элементы состава ситуации',
|
|
119
|
+
definitionText: 'Элементы, входящие в состав хотя бы одной ситуации'
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
draft: {
|
|
124
|
+
id: 11,
|
|
125
|
+
alias: 'F1',
|
|
126
|
+
cstType: CstType.FUNCTION,
|
|
127
|
+
definitionFormal: '[α∈X1] Pr2(Fi1[{α}](S1))',
|
|
128
|
+
term: 'состав заданной ситуации',
|
|
129
|
+
definitionText: 'Элементы, входящие в состав заданной ситуации'
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
draft: {
|
|
134
|
+
id: 12,
|
|
135
|
+
alias: 'D3',
|
|
136
|
+
cstType: CstType.TERM,
|
|
137
|
+
definitionFormal: 'Pr1(S2)',
|
|
138
|
+
term: 'ориентирующиеся субъекты'
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
draft: {
|
|
143
|
+
id: 13,
|
|
144
|
+
alias: 'D4',
|
|
145
|
+
cstType: CstType.TERM,
|
|
146
|
+
definitionFormal: 'Pr2(S2)',
|
|
147
|
+
term: 'ситуации ориентировки'
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
draft: {
|
|
152
|
+
id: 14,
|
|
153
|
+
alias: 'D5',
|
|
154
|
+
cstType: CstType.TERM,
|
|
155
|
+
definitionFormal: 'Pr3(S2)',
|
|
156
|
+
term: 'значимые элементы'
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
draft: {
|
|
161
|
+
id: 15,
|
|
162
|
+
alias: 'D6',
|
|
163
|
+
cstType: CstType.TERM,
|
|
164
|
+
definitionFormal: 'Pr1,2(S2)',
|
|
165
|
+
term: 'эпизоды ориентировки',
|
|
166
|
+
definitionText: 'Пары субъект — ситуация, в которых субъект выделяет значимый элемент'
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
draft: {
|
|
171
|
+
id: 16,
|
|
172
|
+
alias: 'F2',
|
|
173
|
+
cstType: CstType.FUNCTION,
|
|
174
|
+
definitionFormal: '[α∈X3, β∈X1] Pr3(Fi2,1[{(β,α)}](S2))',
|
|
175
|
+
term: 'значимые элементы субъекта в ситуации',
|
|
176
|
+
definitionText: 'Элементы, выделяемые субъектом как значимые в заданной ситуации'
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
draft: {
|
|
181
|
+
id: 17,
|
|
182
|
+
alias: 'A1',
|
|
183
|
+
cstType: CstType.AXIOM,
|
|
184
|
+
definitionFormal: '∀α∈X3 ∀β∈X1 F2[α,β]⊆F1[β]',
|
|
185
|
+
term: 'значимые элементы входят в состав ситуации',
|
|
186
|
+
definitionText: 'Элементы, выделяемые субъектом как значимые, входят в состав этой ситуации'
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
draft: {
|
|
191
|
+
id: 18,
|
|
192
|
+
alias: 'D7',
|
|
193
|
+
cstType: CstType.TERM,
|
|
194
|
+
definitionFormal: 'Pr1(S3)',
|
|
195
|
+
term: 'рассматривающие субъекты'
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
draft: {
|
|
200
|
+
id: 19,
|
|
201
|
+
alias: 'D8',
|
|
202
|
+
cstType: CstType.TERM,
|
|
203
|
+
definitionFormal: 'Pr2(S3)',
|
|
204
|
+
term: 'ситуации рассмотрения действий'
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
draft: {
|
|
209
|
+
id: 20,
|
|
210
|
+
alias: 'D9',
|
|
211
|
+
cstType: CstType.TERM,
|
|
212
|
+
definitionFormal: 'Pr3(S3)',
|
|
213
|
+
term: 'рассматриваемые действия'
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
draft: {
|
|
218
|
+
id: 21,
|
|
219
|
+
alias: 'F3',
|
|
220
|
+
cstType: CstType.FUNCTION,
|
|
221
|
+
definitionFormal: '[α∈X3, β∈X1] Pr3(Fi2[{β}](Fi1[{α}](S3)))',
|
|
222
|
+
term: 'пространство действий субъекта в ситуации',
|
|
223
|
+
definitionText: 'Действия, рассматриваемые субъектом как возможные в ситуации'
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
draft: {
|
|
228
|
+
id: 22,
|
|
229
|
+
alias: 'A2',
|
|
230
|
+
cstType: CstType.AXIOM,
|
|
231
|
+
definitionFormal: '∀α∈X3 ∀β∈X1 (F3[α,β]≠∅ ⇒ F2[α,β]≠∅)',
|
|
232
|
+
term: 'пространство действий требует ориентировки',
|
|
233
|
+
definitionText: 'Если субъект рассматривает действия в ситуации, у него есть значимые элементы'
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
draft: {
|
|
238
|
+
id: 23,
|
|
239
|
+
alias: 'D10',
|
|
240
|
+
cstType: CstType.TERM,
|
|
241
|
+
definitionFormal: 'Pr1,2(S3)',
|
|
242
|
+
term: 'эпизоды рассмотрения',
|
|
243
|
+
definitionText: 'Пары субъект — ситуация, в которых рассматриваются действия'
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
draft: {
|
|
248
|
+
id: 24,
|
|
249
|
+
alias: 'F5',
|
|
250
|
+
cstType: CstType.FUNCTION,
|
|
251
|
+
definitionFormal: '[ρ∈S3] pr1,2(ρ)',
|
|
252
|
+
term: 'субъект и ситуация рассмотрения',
|
|
253
|
+
definitionText: 'Пара субъект — ситуация для эпизода рассмотрения действия'
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
draft: {
|
|
258
|
+
id: 25,
|
|
259
|
+
alias: 'F4',
|
|
260
|
+
cstType: CstType.FUNCTION,
|
|
261
|
+
definitionFormal: '[α∈X3, β∈X1] debool(Pr3(Fi2[{β}](Fi1[{α}](S4))))',
|
|
262
|
+
term: 'выбранное действие субъекта в ситуации',
|
|
263
|
+
definitionText: 'Действие, выбранное субъектом в ситуации'
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
draft: {
|
|
268
|
+
id: 26,
|
|
269
|
+
alias: 'A3',
|
|
270
|
+
cstType: CstType.AXIOM,
|
|
271
|
+
definitionFormal: '∀(α,β)∈Pr1,2(S4) card(Pr3(Fi2[{β}](Fi1[{α}](S4))))=1',
|
|
272
|
+
term: 'единственность выбранного действия',
|
|
273
|
+
definitionText: 'У каждой пары субъект — ситуация в структуре выбора ровно одно действие'
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
draft: {
|
|
278
|
+
id: 27,
|
|
279
|
+
alias: 'A4',
|
|
280
|
+
cstType: CstType.AXIOM,
|
|
281
|
+
definitionFormal: '∀(α,β)∈Pr1,2(S4) F4[α,β]∈F3[α,β]',
|
|
282
|
+
term: 'выбранное действие принадлежит пространству действий',
|
|
283
|
+
definitionText: 'Выбранное действие входит в число рассматриваемых субъектом в этой ситуации'
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
];
|
|
287
|
+
|
|
288
|
+
for (const input of drafts) {
|
|
289
|
+
const result = await client.call<{
|
|
290
|
+
state: { alias: string; analysis: { success: boolean } };
|
|
291
|
+
diagnostics: unknown[];
|
|
292
|
+
}>('addOrUpdateConstituenta', {
|
|
293
|
+
sessionId: session.sessionId,
|
|
294
|
+
input
|
|
295
|
+
});
|
|
296
|
+
const ok = result.state.analysis.success;
|
|
297
|
+
const diagCount = result.diagnostics?.length ?? 0;
|
|
298
|
+
console.log(`${input.draft.alias}: ${ok ? 'OK' : 'FAIL'} (${diagCount} diagnostics)`);
|
|
299
|
+
if (!ok) {
|
|
300
|
+
const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
|
|
301
|
+
console.log(JSON.stringify(diags, null, 2));
|
|
302
|
+
throw new Error(`${input.draft.alias}: analysis failed (${diagCount} diagnostics)`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
await client.call('commitStep', {
|
|
307
|
+
sessionId: session.sessionId,
|
|
308
|
+
message: 'КС «МОВД» (rsforms/838): Pr1,2, Fi1,2, pr1,2 на ℬ(X3×X1×X2) и ℬ(X3×X1×X4)'
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
const exported = await client.call<string>('exportSession', {
|
|
312
|
+
sessionId: session.sessionId
|
|
313
|
+
});
|
|
314
|
+
const outputPath = resolve(process.cwd(), DEFAULT_RSFORM_SESSION_PATH);
|
|
315
|
+
await writeFile(outputPath, exported, 'utf8');
|
|
316
|
+
console.log(`Exported: ${outputPath}`);
|
|
317
|
+
} finally {
|
|
318
|
+
await client.close();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
run().catch(error => {
|
|
323
|
+
console.error(error);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { TUPLE_ID } from '@rsconcept/domain';
|
|
5
|
+
|
|
6
|
+
import { EvalStatus, RSToolWrapperClient } from '../../src';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
A1_ID,
|
|
10
|
+
A3_ID,
|
|
11
|
+
A4_ID,
|
|
12
|
+
D5_ID,
|
|
13
|
+
D6_ID,
|
|
14
|
+
D10_ID,
|
|
15
|
+
DEFAULT_RSFORM_SESSION_PATH,
|
|
16
|
+
DEFAULT_RSMODEL_SESSION_PATH,
|
|
17
|
+
S1_ID,
|
|
18
|
+
S2_ID,
|
|
19
|
+
S3_ID,
|
|
20
|
+
S4_ID,
|
|
21
|
+
X1_ID,
|
|
22
|
+
X2_ID,
|
|
23
|
+
X3_ID,
|
|
24
|
+
X4_ID
|
|
25
|
+
} from './constants';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Демо-эпизод: Алиса в ситуации «переговоры» выделяет «стол»,
|
|
29
|
+
* рассматривает «выйти» и «остаться», выбирает «выйти».
|
|
30
|
+
*/
|
|
31
|
+
const X1_BINDING = { 0: 'переговоры' } as const;
|
|
32
|
+
const X2_BINDING = { 0: 'стол', 1: 'дверь' } as const;
|
|
33
|
+
const X3_BINDING = { 0: 'Алиса' } as const;
|
|
34
|
+
const X4_BINDING = { 0: 'выйти', 1: 'остаться' } as const;
|
|
35
|
+
|
|
36
|
+
/** S1: состав ситуации — стол и дверь в переговорах. */
|
|
37
|
+
const S1_VALUE = [
|
|
38
|
+
[TUPLE_ID, 0, 0],
|
|
39
|
+
[TUPLE_ID, 0, 1]
|
|
40
|
+
] as const;
|
|
41
|
+
|
|
42
|
+
/** S2: Алиса выделяет стол в переговорах. */
|
|
43
|
+
const S2_VALUE = [[TUPLE_ID, 0, 0, 0]] as const;
|
|
44
|
+
|
|
45
|
+
/** S3: Алиса рассматривает оба действия. */
|
|
46
|
+
const S3_VALUE = [
|
|
47
|
+
[TUPLE_ID, 0, 0, 0],
|
|
48
|
+
[TUPLE_ID, 0, 0, 1]
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
/** S4: Алиса выбирает «выйти». */
|
|
52
|
+
const S4_VALUE = [[TUPLE_ID, 0, 0, 0]] as const;
|
|
53
|
+
|
|
54
|
+
async function run() {
|
|
55
|
+
const client = new RSToolWrapperClient({
|
|
56
|
+
cwd: resolve(process.cwd())
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
await client.waitUntilReady();
|
|
61
|
+
const schemaPath = resolve(process.cwd(), DEFAULT_RSFORM_SESSION_PATH);
|
|
62
|
+
const schemaJson = await readFile(schemaPath, 'utf8');
|
|
63
|
+
|
|
64
|
+
const imported = await client.call<{ sessionId: string }>('importSession', {
|
|
65
|
+
payload: schemaJson
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await client.call('setConstituentaValues', {
|
|
69
|
+
sessionId: imported.sessionId,
|
|
70
|
+
input: {
|
|
71
|
+
items: [
|
|
72
|
+
{ target: X1_ID, value: X1_BINDING },
|
|
73
|
+
{ target: X2_ID, value: X2_BINDING },
|
|
74
|
+
{ target: X3_ID, value: X3_BINDING },
|
|
75
|
+
{ target: X4_ID, value: X4_BINDING },
|
|
76
|
+
{ target: S1_ID, value: S1_VALUE },
|
|
77
|
+
{ target: S2_ID, value: S2_VALUE },
|
|
78
|
+
{ target: S3_ID, value: S3_VALUE },
|
|
79
|
+
{ target: S4_ID, value: S4_VALUE }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const recalculated = await client.call<{
|
|
85
|
+
items: { id: number; alias: string; value: unknown; status: number }[];
|
|
86
|
+
}>('recalculateModel', {
|
|
87
|
+
sessionId: imported.sessionId
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const d5 = recalculated.items.find(item => item.id === D5_ID);
|
|
91
|
+
const d6 = recalculated.items.find(item => item.id === D6_ID);
|
|
92
|
+
const d10 = recalculated.items.find(item => item.id === D10_ID);
|
|
93
|
+
const a1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
|
|
94
|
+
sessionId: imported.sessionId,
|
|
95
|
+
input: { constituentId: A1_ID }
|
|
96
|
+
});
|
|
97
|
+
const a3Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
|
|
98
|
+
sessionId: imported.sessionId,
|
|
99
|
+
input: { constituentId: A3_ID }
|
|
100
|
+
});
|
|
101
|
+
const a4Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
|
|
102
|
+
sessionId: imported.sessionId,
|
|
103
|
+
input: { constituentId: A4_ID }
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
console.log('D5 Pr3(S2):', d5);
|
|
107
|
+
console.log('D6 Pr1,2(S2):', d6);
|
|
108
|
+
console.log('D10 Pr1,2(S3):', d10);
|
|
109
|
+
console.log('A1:', a1Eval);
|
|
110
|
+
console.log('A3:', a3Eval);
|
|
111
|
+
console.log('A4:', a4Eval);
|
|
112
|
+
|
|
113
|
+
if (!Array.isArray(d5?.value) || !d5.value.includes(0)) {
|
|
114
|
+
throw new Error(`Expected D5 to include element 0 (стол); got ${JSON.stringify(d5)}`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (
|
|
118
|
+
!Array.isArray(d6?.value) ||
|
|
119
|
+
d6.value.length !== 1 ||
|
|
120
|
+
!Array.isArray(d6.value[0]) ||
|
|
121
|
+
d6.value[0][0] !== TUPLE_ID ||
|
|
122
|
+
d6.value[0][1] !== 0 ||
|
|
123
|
+
d6.value[0][2] !== 0
|
|
124
|
+
) {
|
|
125
|
+
throw new Error(`Expected D6 = {(0,0)}; got ${JSON.stringify(d6)}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (!a1Eval.success || a1Eval.status === EvalStatus.AXIOM_FALSE || a1Eval.value !== 1) {
|
|
129
|
+
throw new Error(`Expected A1 to hold; got ${JSON.stringify(a1Eval)}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!a3Eval.success || a3Eval.status === EvalStatus.AXIOM_FALSE || a3Eval.value !== 1) {
|
|
133
|
+
throw new Error(`Expected A3 to hold; got ${JSON.stringify(a3Eval)}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!a4Eval.success || a4Eval.status === EvalStatus.AXIOM_FALSE || a4Eval.value !== 1) {
|
|
137
|
+
throw new Error(`Expected A4 to hold; got ${JSON.stringify(a4Eval)}`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
await client.call('commitStep', {
|
|
141
|
+
sessionId: imported.sessionId,
|
|
142
|
+
message: 'Модель МОВД: Алиса, переговоры, стол значим, выбор «выйти»'
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const exported = await client.call<string>('exportSession', {
|
|
146
|
+
sessionId: imported.sessionId
|
|
147
|
+
});
|
|
148
|
+
const outputPath = resolve(process.cwd(), DEFAULT_RSMODEL_SESSION_PATH);
|
|
149
|
+
await writeFile(outputPath, exported, 'utf8');
|
|
150
|
+
console.log(`Exported: ${outputPath}`);
|
|
151
|
+
} finally {
|
|
152
|
+
await client.close();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
run().catch(error => {
|
|
157
|
+
console.error(error);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Constituent ids in movd RSForm / RSModel sessions (based on Portal rsforms/838). */
|
|
2
|
+
export const X1_ID = 1;
|
|
3
|
+
export const X2_ID = 2;
|
|
4
|
+
export const X3_ID = 3;
|
|
5
|
+
export const X4_ID = 4;
|
|
6
|
+
export const S1_ID = 5;
|
|
7
|
+
export const S2_ID = 6;
|
|
8
|
+
export const S3_ID = 7;
|
|
9
|
+
export const S4_ID = 8;
|
|
10
|
+
export const D5_ID = 14;
|
|
11
|
+
export const D6_ID = 15;
|
|
12
|
+
export const D10_ID = 23;
|
|
13
|
+
export const A1_ID = 17;
|
|
14
|
+
export const A3_ID = 26;
|
|
15
|
+
export const A4_ID = 27;
|
|
16
|
+
|
|
17
|
+
export const DEFAULT_RSFORM_SESSION_PATH = 'examples/movd/rsform-session.json';
|
|
18
|
+
export const DEFAULT_RSMODEL_SESSION_PATH = 'examples/movd/rsmodel-session.json';
|