@rsconcept/rstool 0.10.3 → 1.0.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.
Files changed (116) hide show
  1. package/README.md +61 -33
  2. package/dist/agent-workflow-Gk0Vfnv1.d.ts +64 -0
  3. package/dist/analysis-LLnPhmGa.d.ts +23 -0
  4. package/dist/{common-DxLg3eXX.d.ts → common-DHJalS-Q.d.ts} +6 -1
  5. package/dist/constituenta-DnGR6bnM.d.ts +54 -0
  6. package/dist/diagnostic-D9yl_mEL.d.ts +19 -0
  7. package/dist/evaluation-Cns8BFm4.d.ts +31 -0
  8. package/dist/index.d.ts +11 -11
  9. package/dist/index.js +1 -2
  10. package/dist/mappers/model-adapter.d.ts +3 -3
  11. package/dist/mappers/schema-adapter.d.ts +4 -4
  12. package/dist/mappers/types.d.ts +6 -2
  13. package/dist/mappers/types.js +2 -0
  14. package/dist/mappers/types.js.map +1 -1
  15. package/dist/{model-value-SFAVj0dw.d.ts → model-value-BbonPzMz.d.ts} +14 -3
  16. package/dist/models/agent-workflow.d.ts +2 -0
  17. package/dist/models/agent-workflow.js +1 -0
  18. package/dist/models/analysis.d.ts +1 -1
  19. package/dist/models/common.d.ts +1 -1
  20. package/dist/models/constituenta.d.ts +2 -2
  21. package/dist/models/diagnostic.d.ts +1 -1
  22. package/dist/models/evaluation.d.ts +2 -2
  23. package/dist/models/index.d.ts +11 -11
  24. package/dist/models/index.js +2 -2
  25. package/dist/models/model-value.d.ts +2 -2
  26. package/dist/models/rstool-agent.d.ts +1 -1
  27. package/dist/models/rstool-agent.js +1 -1
  28. package/dist/models/session.d.ts +1 -1
  29. package/dist/models/tool-contract.d.ts +2 -2
  30. package/dist/models/tool-contract.js +2 -1
  31. package/dist/models/tool-contract.js.map +1 -1
  32. package/dist/models-Bw6Uum8i.js +685 -0
  33. package/dist/models-Bw6Uum8i.js.map +1 -0
  34. package/dist/rstool-agent-D2cQze_b.d.ts +71 -0
  35. package/dist/session/session-store.d.ts +18 -5
  36. package/dist/session/session-store.js +1 -64
  37. package/dist/{session-BPgsE80c.d.ts → session-ChexW8i7.d.ts} +11 -8
  38. package/dist/tool-contract-0uRGhEfW.d.ts +164 -0
  39. package/dist/wrapper/client.d.ts +23 -0
  40. package/dist/wrapper/client.js +17 -0
  41. package/dist/wrapper/client.js.map +1 -1
  42. package/dist/wrapper/stdio-wrapper.js +75 -63
  43. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  44. package/docs/CONSTITUENTA.md +2 -2
  45. package/docs/DIAGNOSTICS.md +6 -5
  46. package/docs/MODEL-TESTING.md +3 -3
  47. package/docs/PORTAL-API.md +24 -18
  48. package/examples/README.md +1 -1
  49. package/examples/agent-client.ts +11 -41
  50. package/examples/build-chocolate-nim-rsform.ts +21 -70
  51. package/examples/chocolate-nim/build-rsform.ts +23 -18
  52. package/examples/chocolate-nim/build-rsmodel.ts +10 -12
  53. package/examples/chocolate-nim/rsform-session.json +290 -290
  54. package/examples/chocolate-nim/rsmodel-session.json +291 -291
  55. package/examples/expression-bank/bank-constituents.ts +304 -53
  56. package/examples/expression-bank/build-rsform.ts +19 -16
  57. package/examples/expression-bank/rsform-session.json +1551 -1551
  58. package/examples/kinship/build-rsform.ts +23 -18
  59. package/examples/kinship/build-rsmodel.ts +16 -16
  60. package/examples/kinship/rsform-session.json +219 -219
  61. package/examples/kinship/rsmodel-session.json +221 -221
  62. package/examples/kinship/session.ts +19 -21
  63. package/examples/movd/build-rsform.ts +23 -18
  64. package/examples/movd/build-rsmodel.ts +18 -20
  65. package/examples/movd/rsform-session.json +262 -262
  66. package/examples/movd/rsmodel-session.json +264 -264
  67. package/examples/sample/build-rsform.ts +18 -51
  68. package/examples/sample/build-rsmodel.ts +25 -44
  69. package/examples/sample/rsform-session.json +10 -7
  70. package/examples/sample/rsmodel-session.json +36 -33
  71. package/examples/template-apply/build-rsform.ts +27 -24
  72. package/examples/template-apply/rsform-session.json +48 -48
  73. package/package.json +4 -2
  74. package/skills/rstool-helper/EXAMPLES.md +44 -116
  75. package/skills/rstool-helper/GUIDE.md +40 -25
  76. package/skills/rstool-helper/REFERENCE.md +40 -177
  77. package/src/index.ts +24 -17
  78. package/src/mappers/portal-adapter.ts +49 -0
  79. package/src/mappers/types.ts +4 -0
  80. package/src/models/agent-workflow.ts +66 -0
  81. package/src/models/analysis.ts +7 -0
  82. package/src/models/common.ts +7 -0
  83. package/src/models/constituenta.ts +24 -6
  84. package/src/models/diagnostic.ts +4 -0
  85. package/src/models/evaluation.ts +11 -0
  86. package/src/models/import-detect.test.ts +66 -0
  87. package/src/models/import-detect.ts +42 -0
  88. package/src/models/import-export.ts +24 -0
  89. package/src/models/index.ts +22 -14
  90. package/src/models/model-value.ts +12 -0
  91. package/src/models/portal-json.test.ts +38 -0
  92. package/src/models/portal-json.ts +54 -1
  93. package/src/models/rstool-agent.test.ts +698 -146
  94. package/src/models/rstool-agent.ts +392 -92
  95. package/src/models/session.ts +8 -5
  96. package/src/models/tool-contract.ts +81 -42
  97. package/src/session/batch-apply.test.ts +123 -0
  98. package/src/session/batch-apply.ts +82 -0
  99. package/src/session/persistence.test.ts +63 -0
  100. package/src/session/persistence.ts +69 -0
  101. package/src/session/session-store.ts +76 -6
  102. package/src/wrapper/client.test.ts +58 -0
  103. package/src/wrapper/client.ts +23 -0
  104. package/src/wrapper/stdio-handler.test.ts +101 -0
  105. package/src/wrapper/stdio-handler.ts +195 -0
  106. package/src/wrapper/stdio-wrapper.ts +4 -187
  107. package/dist/analysis-JiwOYDKx.d.ts +0 -16
  108. package/dist/constituenta-Dnd6iToB.d.ts +0 -36
  109. package/dist/diagnostic-BMYvciz8.d.ts +0 -15
  110. package/dist/evaluation-CCVYH0wA.d.ts +0 -21
  111. package/dist/index-uhkmwruf.d.ts +0 -46
  112. package/dist/rstool-agent-BZi5jO1y.js +0 -158
  113. package/dist/rstool-agent-BZi5jO1y.js.map +0 -1
  114. package/dist/rstool-agent-pRaPnZay.d.ts +0 -35
  115. package/dist/session/session-store.js.map +0 -1
  116. package/dist/tool-contract-n1ghUOrK.d.ts +0 -32
@@ -1,7 +1,7 @@
1
1
  import { writeFile } from 'node:fs/promises';
2
2
  import { resolve } from 'node:path';
3
3
 
4
- import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput } from '../src';
4
+ import { CstType, RSToolWrapperClient, type AgentConstituentaPatch } from '../src';
5
5
 
6
6
  import { DEFAULT_RSFORM_SESSION_PATH } from './chocolate-nim/constants';
7
7
 
@@ -18,248 +18,197 @@ async function run() {
18
18
  await client.waitUntilReady();
19
19
  const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession');
20
20
 
21
- const drafts: AddOrUpdateConstituentaInput[] = [
21
+ const items: AgentConstituentaPatch[] = [
22
22
  {
23
- draft: {
24
23
  id: 1,
25
24
  alias: 'S1',
26
25
  cstType: CstType.STRUCTURED,
27
26
  definitionFormal: 'Z×Z',
28
27
  term: 'шоколадка',
29
28
  convention: 'Первая проекция — ширина, вторая — длина'
30
- }
31
29
  },
32
30
  {
33
- draft: {
34
31
  id: 2,
35
32
  alias: 'D1',
36
33
  cstType: CstType.TERM,
37
34
  definitionFormal: 'pr1(S1)',
38
35
  term: 'ширина шоколадки'
39
- }
40
36
  },
41
37
  {
42
- draft: {
43
38
  id: 3,
44
39
  alias: 'D2',
45
40
  cstType: CstType.TERM,
46
41
  definitionFormal: 'pr2(S1)',
47
42
  term: 'длина шоколадки'
48
- }
49
43
  },
50
44
  {
51
- draft: {
52
45
  id: 4,
53
46
  alias: 'S2',
54
47
  cstType: CstType.STRUCTURED,
55
48
  definitionFormal: 'Z×Z',
56
49
  term: 'отравленная долька',
57
50
  convention: 'Координаты отравленной дольки: первая проекция по ширине, вторая — по длине'
58
- }
59
51
  },
60
52
  {
61
- draft: {
62
53
  id: 5,
63
54
  alias: 'D3',
64
55
  cstType: CstType.TERM,
65
56
  definitionFormal: 'pr1(S2)',
66
57
  term: 'расположение отравленной дольки по ширине'
67
- }
68
58
  },
69
59
  {
70
- draft: {
71
60
  id: 6,
72
61
  alias: 'D4',
73
62
  cstType: CstType.TERM,
74
63
  definitionFormal: 'pr2(S2)',
75
64
  term: 'расположение отравленной дольки по длине'
76
- }
77
65
  },
78
66
  {
79
- draft: {
80
67
  id: 7,
81
68
  alias: 'A1',
82
69
  cstType: CstType.AXIOM,
83
70
  definitionFormal: '(1≤D3)&(D3≤D1)&(1≤D4)&(D4≤D2)',
84
71
  term: 'отравленная долька в шоколадке',
85
72
  definitionText: 'Координаты отравленной дольки лежат в пределах шоколадки'
86
- }
87
73
  },
88
74
  {
89
- draft: {
90
75
  id: 8,
91
76
  alias: 'P1',
92
77
  cstType: CstType.PREDICATE,
93
78
  definitionFormal: '[α∈Z] R{ξ:=α | ξ≥2 | ξ-2}=0',
94
79
  term: 'чётное?',
95
80
  convention: 'Для малых аргументов — прямое вычитание двойки; для больших нужно двоичное представление'
96
- }
97
81
  },
98
82
  {
99
- draft: {
100
83
  id: 9,
101
84
  alias: 'F1',
102
85
  cstType: CstType.FUNCTION,
103
86
  definitionFormal: '[α∈Z, σ∈ℬ(Z×R1)] debool(Pr2(Fi1[{α}](σ)))',
104
87
  term: 'значение элемента последовательности с данным номером',
105
88
  definitionText: 'Значение пары с заданным номером в последовательности пар'
106
- }
107
89
  },
108
90
  {
109
- draft: {
110
91
  id: 10,
111
92
  alias: 'F2',
112
93
  cstType: CstType.FUNCTION,
113
94
  definitionFormal: '[σ∈ℬ(Z)] debool(D{ξ∈σ | ∀α∈σ α≤ξ})',
114
95
  term: 'максимум набора чисел'
115
- }
116
96
  },
117
97
  {
118
- draft: {
119
98
  id: 11,
120
99
  alias: 'F4',
121
100
  cstType: CstType.FUNCTION,
122
101
  definitionFormal: '[σ∈ℬ(Z)] D{ξ∈σ | ∀α∈σ α≤ξ}',
123
102
  term: 'верхние границы набора чисел',
124
103
  definitionText: 'Множество элементов набора, не меньших всех остальных'
125
- }
126
104
  },
127
105
  {
128
- draft: {
129
106
  id: 12,
130
107
  alias: 'F5',
131
108
  cstType: CstType.FUNCTION,
132
109
  definitionFormal: '[α∈Z, β∈Z] debool(I{(α,0) | α<β} ∪ I{(α-β,1) | α≥β})',
133
110
  term: 'деление с остатком на степень двойки',
134
111
  convention: 'Предполагается, что удвоенный делитель больше делимого'
135
- }
136
112
  },
137
113
  {
138
- draft: {
139
114
  id: 13,
140
115
  alias: 'F6',
141
116
  cstType: CstType.FUNCTION,
142
117
  definitionFormal: '[α∈Z, β∈Z] pr1(F5[α, β])',
143
118
  term: 'остаток'
144
- }
145
119
  },
146
120
  {
147
- draft: {
148
121
  id: 14,
149
122
  alias: 'F7',
150
123
  cstType: CstType.FUNCTION,
151
124
  definitionFormal: '[α∈Z, β∈Z] pr2(F5[α, β])',
152
125
  term: 'целая часть'
153
- }
154
126
  },
155
127
  {
156
- draft: {
157
128
  id: 15,
158
129
  alias: 'D5',
159
130
  cstType: CstType.TERM,
160
131
  definitionFormal: '{(0, D3-1), (1, D4-1), (2, D1-D3), (3, D2-D4)}',
161
132
  term: 'шоколадка как кучки Ним',
162
133
  definitionText: 'Четыре кучки камней после разреза по отравленной дольке: слева, сверху, справа и снизу'
163
- }
164
134
  },
165
135
  {
166
- draft: {
167
136
  id: 16,
168
137
  alias: 'D6',
169
138
  cstType: CstType.TERM,
170
139
  definitionFormal: 'card(D5)',
171
140
  term: 'количество кучек'
172
- }
173
141
  },
174
142
  {
175
- draft: {
176
143
  id: 17,
177
144
  alias: 'D7',
178
145
  cstType: CstType.TERM,
179
146
  definitionFormal: 'Pr1(D5)',
180
147
  term: 'номера кучек'
181
- }
182
148
  },
183
149
  {
184
- draft: {
185
150
  id: 18,
186
151
  alias: 'D8',
187
152
  cstType: CstType.TERM,
188
153
  definitionFormal: 'Pr2(D5)',
189
154
  term: 'размеры кучек'
190
- }
191
155
  },
192
156
  {
193
- draft: {
194
157
  id: 19,
195
158
  alias: 'A2',
196
159
  cstType: CstType.AXIOM,
197
160
  definitionFormal: 'card(D5)=card(D7)',
198
161
  term: 'однозначность количества камней в кучках',
199
162
  definitionText: 'У каждой кучки ровно один номер'
200
- }
201
163
  },
202
164
  {
203
- draft: {
204
165
  id: 20,
205
166
  alias: 'A3',
206
167
  cstType: CstType.AXIOM,
207
168
  definitionFormal: '∀α∈D5 (pr1(α)<D6 & pr1(α)≥0)',
208
169
  term: 'последовательная нумерация кучек',
209
170
  definitionText: 'Номера кучек — целые от нуля до количества кучек минус один'
210
- }
211
171
  },
212
172
  {
213
- draft: {
214
173
  id: 21,
215
174
  alias: 'F8',
216
175
  cstType: CstType.FUNCTION,
217
176
  definitionFormal: '[α∈Z] F1[α,D5]',
218
177
  term: 'количество камней в данной кучке'
219
- }
220
178
  },
221
179
  {
222
- draft: {
223
180
  id: 22,
224
181
  alias: 'D9',
225
182
  cstType: CstType.TERM,
226
183
  definitionFormal: 'Pr1(Fi2[{0}](D5))',
227
184
  term: 'пустые кучки',
228
185
  definitionText: 'Номера кучек с нулевым размером'
229
- }
230
186
  },
231
187
  {
232
- draft: {
233
188
  id: 23,
234
189
  alias: 'D10',
235
190
  cstType: CstType.TERM,
236
191
  definitionFormal: 'D7\\D9',
237
192
  term: 'непустые кучки',
238
193
  definitionText: 'Номера кучек с положительным размером'
239
- }
240
194
  },
241
195
  {
242
- draft: {
243
196
  id: 24,
244
197
  alias: 'T1',
245
198
  cstType: CstType.STATEMENT,
246
199
  definitionFormal: 'D8={0}',
247
200
  term: 'игра закончена',
248
201
  definitionText: 'Во всех кучках не осталось камней'
249
- }
250
202
  },
251
203
  {
252
- draft: {
253
204
  id: 25,
254
205
  alias: 'T2',
255
206
  cstType: CstType.STATEMENT,
256
207
  definitionFormal: 'card(D10)=1',
257
208
  term: 'существует выигрышный ход',
258
209
  definitionText: 'Осталась ровно одна непустая кучка'
259
- }
260
210
  },
261
211
  {
262
- draft: {
263
212
  id: 26,
264
213
  alias: 'F10',
265
214
  cstType: CstType.FUNCTION,
@@ -267,26 +216,28 @@ async function run() {
267
216
  term: 'оценка хода Ним',
268
217
  definitionText:
269
218
  'Стоимость хода в дольках шоколадки: для чётного номера кучки — размер, умноженный на длину, иначе — на ширину'
270
- }
271
219
  }
272
220
  ];
273
221
 
274
- for (const input of drafts) {
275
- const result = await client.call<{
276
- state: { alias: string; analysis: { success: boolean } };
277
- diagnostics: unknown[];
278
- }>('addOrUpdateConstituenta', {
279
- sessionId: session.sessionId,
280
- input
281
- });
282
- const ok = result.state.analysis.success;
283
- const diagCount = result.diagnostics?.length ?? 0;
284
- console.log(`${input.draft.alias}: ${ok ? 'OK' : 'FAIL'} (${diagCount} diagnostics)`);
285
- if (!ok) {
286
- const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
287
- console.log(JSON.stringify(diags, null, 2));
288
- throw new Error(`${input.draft.alias}: analysis failed (${diagCount} diagnostics)`);
289
- }
222
+ const patch = await client.call<{
223
+ success: boolean;
224
+ diagnostics: unknown[];
225
+ failed: Array<{ draft: { alias: string }; diagnostics: unknown[] }>;
226
+ summary: { items: Array<{ alias: string; analysisSuccess: boolean }> };
227
+ }>('applySchemaPatch', {
228
+ sessionId: session.sessionId,
229
+ mode: 'atomic',
230
+ items
231
+ });
232
+
233
+ for (const item of patch.summary.items) {
234
+ console.log(`${item.alias}: ${item.analysisSuccess ? 'OK' : 'FAIL'}`);
235
+ }
236
+ if (!patch.success) {
237
+ const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
238
+ console.log(JSON.stringify(diags, null, 2));
239
+ const failedAlias = patch.failed[0]?.draft.alias ?? 'unknown';
240
+ throw new Error(`${failedAlias}: analysis failed`);
290
241
  }
291
242
 
292
243
  await client.call('commitStep', {
@@ -1,7 +1,9 @@
1
1
  import { writeFile } from 'node:fs/promises';
2
2
  import { resolve } from 'node:path';
3
3
 
4
- import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput } from '../../src';
4
+ import { CstType, RSToolWrapperClient, type AgentConstituentaPatch } from '../../src';
5
+
6
+ type DraftBatch = { draft: AgentConstituentaPatch };
5
7
 
6
8
  import { DEFAULT_RSFORM_SESSION_PATH } from './constants';
7
9
 
@@ -18,7 +20,7 @@ async function run() {
18
20
  await client.waitUntilReady();
19
21
  const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession');
20
22
 
21
- const drafts: AddOrUpdateConstituentaInput[] = [
23
+ const drafts: DraftBatch[] = [
22
24
  {
23
25
  draft: {
24
26
  id: 1,
@@ -271,22 +273,25 @@ async function run() {
271
273
  }
272
274
  ];
273
275
 
274
- for (const input of drafts) {
275
- const result = await client.call<{
276
- state: { alias: string; analysis: { success: boolean } };
277
- diagnostics: unknown[];
278
- }>('addOrUpdateConstituenta', {
279
- sessionId: session.sessionId,
280
- input
281
- });
282
- const ok = result.state.analysis.success;
283
- const diagCount = result.diagnostics?.length ?? 0;
284
- console.log(`${input.draft.alias}: ${ok ? 'OK' : 'FAIL'} (${diagCount} diagnostics)`);
285
- if (!ok) {
286
- const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
287
- console.log(JSON.stringify(diags, null, 2));
288
- throw new Error(`${input.draft.alias}: analysis failed (${diagCount} diagnostics)`);
289
- }
276
+ const patch = await client.call<{
277
+ success: boolean;
278
+ diagnostics: unknown[];
279
+ failed: Array<{ draft: { alias: string }; diagnostics: unknown[] }>;
280
+ summary: { items: Array<{ alias: string; analysisSuccess: boolean }> };
281
+ }>('applySchemaPatch', {
282
+ sessionId: session.sessionId,
283
+ mode: 'atomic',
284
+ items: drafts.map(entry => entry.draft)
285
+ });
286
+
287
+ for (const item of patch.summary.items) {
288
+ console.log(`${item.alias}: ${item.analysisSuccess ? 'OK' : 'FAIL'}`);
289
+ }
290
+ if (!patch.success) {
291
+ const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
292
+ console.log(JSON.stringify(diags, null, 2));
293
+ const failedAlias = patch.failed[0]?.draft.alias ?? 'unknown';
294
+ throw new Error(`${failedAlias}: analysis failed`);
290
295
  }
291
296
 
292
297
  await client.call('commitStep', {
@@ -32,18 +32,16 @@ async function run() {
32
32
  const schemaPath = resolve(process.cwd(), DEFAULT_RSFORM_SESSION_PATH);
33
33
  const schemaJson = await readFile(schemaPath, 'utf8');
34
34
 
35
- const imported = await client.call<{ sessionId: string }>('importSession', {
35
+ const imported = await client.call<{ sessionId: string }>('importData', {
36
36
  payload: schemaJson
37
37
  });
38
38
 
39
- await client.call('setConstituentaValues', {
39
+ await client.call('setModelValues', {
40
40
  sessionId: imported.sessionId,
41
- input: {
42
- items: [
43
- { target: S1_ID, value: S1_VALUE },
44
- { target: S2_ID, value: S2_VALUE }
45
- ]
46
- }
41
+ set: [
42
+ { target: S1_ID, value: S1_VALUE },
43
+ { target: S2_ID, value: S2_VALUE }
44
+ ]
47
45
  });
48
46
 
49
47
  const recalculated = await client.call<{
@@ -53,13 +51,13 @@ async function run() {
53
51
  });
54
52
 
55
53
  const d6 = recalculated.items.find(item => item.id === D6_ID);
56
- const a1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
54
+ const a1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluate', {
57
55
  sessionId: imported.sessionId,
58
- input: { constituentId: A1_ID }
56
+ constituentId: A1_ID
59
57
  });
60
- const t1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluateConstituenta', {
58
+ const t1Eval = await client.call<{ success: boolean; value: unknown; status: number }>('evaluate', {
61
59
  sessionId: imported.sessionId,
62
- input: { constituentId: T1_ID }
60
+ constituentId: T1_ID
63
61
  });
64
62
 
65
63
  console.log('D6 recalculate:', d6);