@rsconcept/rstool 0.10.3 → 1.0.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.
Files changed (112) hide show
  1. package/README.md +41 -31
  2. package/dist/agent-workflow-D-PSIb-m.d.ts +70 -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 -1
  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/rstool-agent-_8bplZnb.d.ts +71 -0
  33. package/dist/rstool-agent-kijHA9ML.js +476 -0
  34. package/dist/rstool-agent-kijHA9ML.js.map +1 -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/session-store-C3jyOSqI.js +142 -0
  39. package/dist/session-store-C3jyOSqI.js.map +1 -0
  40. package/dist/tool-contract-5_Q44DGE.d.ts +164 -0
  41. package/dist/wrapper/client.d.ts +23 -0
  42. package/dist/wrapper/client.js +17 -0
  43. package/dist/wrapper/client.js.map +1 -1
  44. package/dist/wrapper/stdio-wrapper.js +62 -52
  45. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  46. package/docs/CONSTITUENTA.md +2 -2
  47. package/docs/DIAGNOSTICS.md +6 -5
  48. package/docs/MODEL-TESTING.md +3 -3
  49. package/docs/PORTAL-API.md +24 -18
  50. package/examples/README.md +1 -1
  51. package/examples/agent-client.ts +11 -41
  52. package/examples/build-chocolate-nim-rsform.ts +23 -18
  53. package/examples/chocolate-nim/build-rsform.ts +23 -18
  54. package/examples/chocolate-nim/build-rsmodel.ts +10 -12
  55. package/examples/chocolate-nim/rsform-session.json +290 -290
  56. package/examples/chocolate-nim/rsmodel-session.json +291 -291
  57. package/examples/expression-bank/bank-constituents.ts +304 -53
  58. package/examples/expression-bank/build-rsform.ts +19 -16
  59. package/examples/expression-bank/rsform-session.json +1551 -1551
  60. package/examples/kinship/build-rsform.ts +23 -18
  61. package/examples/kinship/build-rsmodel.ts +13 -15
  62. package/examples/kinship/rsform-session.json +219 -219
  63. package/examples/kinship/rsmodel-session.json +221 -221
  64. package/examples/kinship/session.ts +19 -21
  65. package/examples/movd/build-rsform.ts +23 -18
  66. package/examples/movd/build-rsmodel.ts +18 -20
  67. package/examples/movd/rsform-session.json +262 -262
  68. package/examples/movd/rsmodel-session.json +264 -264
  69. package/examples/sample/build-rsform.ts +19 -50
  70. package/examples/sample/build-rsmodel.ts +25 -44
  71. package/examples/sample/rsform-session.json +36 -33
  72. package/examples/sample/rsmodel-session.json +36 -33
  73. package/examples/template-apply/build-rsform.ts +27 -24
  74. package/examples/template-apply/rsform-session.json +48 -48
  75. package/package.json +2 -2
  76. package/skills/rstool-helper/EXAMPLES.md +44 -116
  77. package/skills/rstool-helper/GUIDE.md +40 -25
  78. package/skills/rstool-helper/REFERENCE.md +40 -177
  79. package/src/index.ts +24 -17
  80. package/src/mappers/portal-adapter.ts +43 -0
  81. package/src/mappers/types.ts +4 -0
  82. package/src/models/agent-workflow.ts +78 -0
  83. package/src/models/analysis.ts +7 -0
  84. package/src/models/common.ts +7 -0
  85. package/src/models/constituenta.ts +24 -6
  86. package/src/models/diagnostic.ts +4 -0
  87. package/src/models/evaluation.ts +11 -0
  88. package/src/models/import-detect.ts +39 -0
  89. package/src/models/import-export.ts +24 -0
  90. package/src/models/index.ts +22 -14
  91. package/src/models/model-value.ts +12 -0
  92. package/src/models/portal-json.ts +44 -0
  93. package/src/models/rstool-agent.test.ts +300 -147
  94. package/src/models/rstool-agent.ts +350 -93
  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 +28 -0
  98. package/src/session/batch-apply.ts +47 -0
  99. package/src/session/persistence.ts +56 -0
  100. package/src/session/session-store.ts +67 -4
  101. package/src/wrapper/client.ts +23 -0
  102. package/src/wrapper/stdio-wrapper.ts +59 -49
  103. package/dist/analysis-JiwOYDKx.d.ts +0 -16
  104. package/dist/constituenta-Dnd6iToB.d.ts +0 -36
  105. package/dist/diagnostic-BMYvciz8.d.ts +0 -15
  106. package/dist/evaluation-CCVYH0wA.d.ts +0 -21
  107. package/dist/index-uhkmwruf.d.ts +0 -46
  108. package/dist/rstool-agent-BZi5jO1y.js +0 -158
  109. package/dist/rstool-agent-BZi5jO1y.js.map +0 -1
  110. package/dist/rstool-agent-pRaPnZay.d.ts +0 -35
  111. package/dist/session/session-store.js.map +0 -1
  112. package/dist/tool-contract-n1ghUOrK.d.ts +0 -32
@@ -1,43 +1,26 @@
1
1
  {
2
- "contractVersion": "1.4.0",
2
+ "contractVersion": "2.0.0",
3
3
  "state": {
4
- "sessionId": "04678669-0343-4a1c-8238-3f0de2fc12f7",
4
+ "sessionId": "b72f75c0-4f17-4bef-9ff3-913ea16191db",
5
5
  "alias": "",
6
6
  "title": "",
7
7
  "comment": "",
8
- "createdAt": "2026-06-22T11:29:09.607Z",
9
- "updatedAt": "2026-06-22T11:29:09.628Z",
8
+ "createdAt": "2026-07-01T17:12:54.696Z",
9
+ "updatedAt": "2026-07-01T17:12:54.714Z",
10
10
  "revisions": [
11
11
  {
12
- "revisionId": "b577a24d-20ff-4056-992e-7662cb2e56cf",
13
- "at": "2026-06-22T11:29:09.628Z",
12
+ "revisionId": "e85ad551-0aa0-42d9-b55d-01719aed6533",
13
+ "at": "2026-07-01T17:12:54.714Z",
14
14
  "message": "Применение шаблонов БВ: сотрудники, проекты, F6/F9/F20/P5"
15
15
  }
16
16
  ],
17
17
  "items": [
18
18
  {
19
- "id": 1,
20
- "alias": "T1",
21
- "cstType": "statement",
22
- "definitionFormal": "1=1",
23
- "term": "Применение шаблонов банка выражений",
24
- "convention": "Подстановка радикалов БВ: R1→X1, R2→X2. Отношение σ→S1 или S2. Примеры: БВ F6→F_IMAGE, БВ F20→F_SOURCES, БВ P5→P_FUNCTION",
25
- "definitionText": "",
26
- "analysis": {
27
- "success": true,
28
- "type": {
29
- "typeID": 6
30
- },
31
- "valueClass": "value",
32
- "diagnostics": []
33
- }
34
- },
35
- {
36
- "id": 2,
37
- "alias": "X1",
19
+ "id": 3,
20
+ "alias": "X2",
38
21
  "cstType": "basic",
39
22
  "definitionFormal": "",
40
- "term": "сотрудники",
23
+ "term": "проекты",
41
24
  "definitionText": "",
42
25
  "convention": "",
43
26
  "analysis": {
@@ -46,7 +29,7 @@
46
29
  "typeID": 5,
47
30
  "base": {
48
31
  "typeID": 3,
49
- "baseID": "X1"
32
+ "baseID": "X2"
50
33
  }
51
34
  },
52
35
  "valueClass": "value",
@@ -54,11 +37,11 @@
54
37
  }
55
38
  },
56
39
  {
57
- "id": 3,
58
- "alias": "X2",
40
+ "id": 2,
41
+ "alias": "X1",
59
42
  "cstType": "basic",
60
43
  "definitionFormal": "",
61
- "term": "проекты",
44
+ "term": "сотрудники",
62
45
  "definitionText": "",
63
46
  "convention": "",
64
47
  "analysis": {
@@ -67,7 +50,7 @@
67
50
  "typeID": 5,
68
51
  "base": {
69
52
  "typeID": 3,
70
- "baseID": "X2"
53
+ "baseID": "X1"
71
54
  }
72
55
  },
73
56
  "valueClass": "value",
@@ -80,8 +63,8 @@
80
63
  "cstType": "structure",
81
64
  "definitionFormal": "ℬ(X1×X2)",
82
65
  "term": "назначение на проект",
83
- "convention": "σ в шаблонах БВ для бинарных отношений двух множеств",
84
66
  "definitionText": "",
67
+ "convention": "σ в шаблонах БВ для бинарных отношений двух множеств",
85
68
  "analysis": {
86
69
  "success": true,
87
70
  "type": {
@@ -110,8 +93,8 @@
110
93
  "cstType": "structure",
111
94
  "definitionFormal": "ℬ(X1×X1)",
112
95
  "term": "подчинённость",
113
- "convention": "σ в шаблонах БВ для бинарных отношений на одном множестве",
114
96
  "definitionText": "",
97
+ "convention": "σ в шаблонах БВ для бинарных отношений на одном множестве",
115
98
  "analysis": {
116
99
  "success": true,
117
100
  "type": {
@@ -134,14 +117,35 @@
134
117
  "diagnostics": []
135
118
  }
136
119
  },
120
+ {
121
+ "id": 10,
122
+ "alias": "D2",
123
+ "cstType": "term",
124
+ "definitionFormal": "Pr1(S2) \\ Pr2(S2)",
125
+ "term": "глава иерархии",
126
+ "definitionText": "",
127
+ "convention": "БВ F20: применение к S2 (развёрнуто в D2, т.к. вызов F# в терме не анализируется)",
128
+ "analysis": {
129
+ "success": true,
130
+ "type": {
131
+ "typeID": 5,
132
+ "base": {
133
+ "typeID": 3,
134
+ "baseID": "X1"
135
+ }
136
+ },
137
+ "valueClass": "value",
138
+ "diagnostics": []
139
+ }
140
+ },
137
141
  {
138
142
  "id": 6,
139
143
  "alias": "F_IMAGE",
140
144
  "cstType": "function",
141
145
  "definitionFormal": "[α∈X1, σ∈ℬ(X1×X2)] Pr2(Fi1[{α}](σ))",
142
146
  "term": "проекты сотрудника",
143
- "convention": "БВ F6: R1→X1, R2→X2",
144
147
  "definitionText": "",
148
+ "convention": "БВ F6: R1→X1, R2→X2",
145
149
  "analysis": {
146
150
  "success": true,
147
151
  "type": {
@@ -192,8 +196,8 @@
192
196
  "cstType": "function",
193
197
  "definitionFormal": "[σ∈ℬ(X1×X1)] Pr1(σ) \\ Pr2(σ)",
194
198
  "term": "вершины без предшественников",
195
- "convention": "БВ F20 (истоки графа подчинённости)",
196
199
  "definitionText": "",
200
+ "convention": "БВ F20 (истоки графа подчинённости)",
197
201
  "analysis": {
198
202
  "success": true,
199
203
  "type": {
@@ -237,8 +241,8 @@
237
241
  "cstType": "predicate",
238
242
  "definitionFormal": "[α∈ℬ(X1), σ∈ℬ(X1×X2)] card(Pr1(σ)) = card(σ) & Pr1(σ) = α",
239
243
  "term": "тотальная функция X1→X2",
240
- "convention": "БВ P5",
241
244
  "definitionText": "",
245
+ "convention": "БВ P5",
242
246
  "analysis": {
243
247
  "success": true,
244
248
  "type": {
@@ -288,8 +292,8 @@
288
292
  "cstType": "term",
289
293
  "definitionFormal": "Pr2(Fi1[X1](S1))",
290
294
  "term": "все назначенные проекты",
291
- "convention": "БВ F9: образ множества X1 по S1",
292
295
  "definitionText": "",
296
+ "convention": "БВ F9: образ множества X1 по S1",
293
297
  "analysis": {
294
298
  "success": true,
295
299
  "type": {
@@ -304,21 +308,17 @@
304
308
  }
305
309
  },
306
310
  {
307
- "id": 10,
308
- "alias": "D2",
309
- "cstType": "term",
310
- "definitionFormal": "Pr1(S2) \\ Pr2(S2)",
311
- "term": "глава иерархии",
312
- "convention": "БВ F20: применение к S2 (развёрнуто в D2, т.к. вызов F# в терме не анализируется)",
311
+ "id": 1,
312
+ "alias": "T1",
313
+ "cstType": "statement",
314
+ "definitionFormal": "1=1",
315
+ "term": "Применение шаблонов банка выражений",
313
316
  "definitionText": "",
317
+ "convention": "Подстановка радикалов БВ: R1→X1, R2→X2. Отношение σ→S1 или S2. Примеры: БВ F6→F_IMAGE, БВ F20→F_SOURCES, БВ P5→P_FUNCTION",
314
318
  "analysis": {
315
319
  "success": true,
316
320
  "type": {
317
- "typeID": 5,
318
- "base": {
319
- "typeID": 3,
320
- "baseID": "X1"
321
- }
321
+ "typeID": 6
322
322
  },
323
323
  "valueClass": "value",
324
324
  "diagnostics": []
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rsconcept/rstool",
3
- "version": "0.10.3",
4
- "description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract and stdio wrapper.",
3
+ "version": "1.0.0",
4
+ "description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract.",
5
5
  "license": "MIT",
6
6
  "author": "IRBorisov",
7
7
  "repository": {
@@ -1,161 +1,89 @@
1
- # Примеры rstool
1
+ # RSLang и rstool — примеры (контракт 2.0)
2
2
 
3
- Короткие примеры для агентов. Полные скрипты и JSON-сессии — `../../examples/` ([README](../../examples/README.md)). Воркфлоу — [GUIDE.md](GUIDE.md).
4
-
5
- ## Минимальная сессия
3
+ ## Схема: batch patch
6
4
 
7
5
  ```ts
8
6
  import { CstType, RSToolAgent } from '@rsconcept/rstool';
9
7
 
10
8
  const tool = new RSToolAgent();
11
- const { sessionId } = tool.createSession();
12
-
13
- tool.addOrUpdateConstituenta(sessionId, {
14
- draft: { id: 1, alias: 'X1', cstType: CstType.BASE, definitionFormal: '' }
15
- });
16
9
 
17
- tool.addOrUpdateConstituenta(sessionId, {
18
- draft: {
19
- id: 2,
20
- alias: 'S1',
21
- cstType: CstType.STRUCTURED,
22
- definitionFormal: 'ℬ(X1×X1)',
23
- convention: 'Множество пар: родитель и его ребёнок из людей. Порядок в паре задаётся конвенцией.'
24
- }
10
+ const result = tool.applySchemaPatch({
11
+ initial: { title: 'Example' },
12
+ commitMessage: 'initial',
13
+ items: [{ alias: 'X1' }, { alias: 'S1', definitionFormal: 'ℬ(X1×X1)' }, { alias: 'D1', definitionFormal: 'Pr1(S1)' }]
25
14
  });
26
15
 
27
- const { state, diagnostics } = tool.addOrUpdateConstituenta(sessionId, {
28
- draft: { id: 3, alias: 'D1', cstType: CstType.TERM, definitionFormal: 'Pr1(S1)' }
29
- });
30
-
31
- console.log(state.analysis.success, diagnostics.length);
16
+ console.log(result.summary.itemCount, result.success);
32
17
  ```
33
18
 
34
- ## Анализ перед upsert
35
-
36
- Черновой анализ, когда синтаксис или `cstType` под вопросом.
19
+ ## Анализ без сохранения
37
20
 
38
21
  ```ts
39
- const analysis = tool.analyzeExpression(sessionId, {
22
+ const analysis = tool.analyzeExpression({
40
23
  expression: 'Pr1(S1)',
41
24
  cstType: CstType.TERM
42
25
  });
43
-
44
- if (!analysis.success) {
45
- console.log(analysis.diagnostics.map(({ code, from, to }) => ({ code, from, to })));
46
- }
47
26
  ```
48
27
 
49
- Исправь диапазон `from` / `to` из отчёта и повтори анализ. При необходимости пересмотри определение целиком или разбей на несколько конституент.
50
-
51
- ## Вычисление
28
+ ## Состояние сессии
52
29
 
53
30
  ```ts
54
- tool.setConstituentaValue(sessionId, {
55
- target: 1,
56
- value: { 0: 'zero', 1: 'one' }
57
- });
58
-
59
- const scratch = tool.evaluateExpression(sessionId, {
60
- expression: '1+2',
61
- cstType: CstType.TERM
62
- });
63
-
64
- console.log(scratch.success, scratch.value); // true, 3
31
+ const summary = tool.getSessionState(); // compact
32
+ const full = tool.getSessionState('full'); // SessionState clone
33
+ const diags = tool.listDiagnostics();
65
34
  ```
66
35
 
67
- Для сохранённых определений задай значения `basic`, `constant` и `structure`, затем вызови `evaluateConstituenta` или `recalculateModel`.
68
-
69
- ## Семантический smoke-тест
70
-
71
- Синтаксис верен, но смысл неочевиден — собери маленькую модель и проверь значение.
36
+ ## Модель и вычисление
72
37
 
73
38
  ```ts
74
- import { TUPLE_ID } from '@rsconcept/domain';
75
- import { CstType, EvalStatus, RSToolAgent } from '@rsconcept/rstool';
39
+ await tool.setModelValues({
40
+ set: [{ target: 1, value: { '0': 'alice', '1': 'bob' } }]
41
+ });
76
42
 
77
- const tool = new RSToolAgent();
78
- const { sessionId } = tool.createSession();
43
+ const evalResult = tool.evaluate({ constituentId: 2 });
44
+ const scratch = tool.evaluate({ expression: '1+2', cstType: CstType.TERM });
45
+ const recalc = tool.recalculateModel();
46
+ ```
79
47
 
80
- tool.addOrUpdateConstituenta(sessionId, {
81
- draft: { id: 1, alias: 'X1', cstType: CstType.BASE, definitionFormal: '' }
82
- });
83
- tool.addOrUpdateConstituenta(sessionId, {
84
- draft: { id: 2, alias: 'S1', cstType: CstType.STRUCTURED, definitionFormal: 'ℬ(X1×X1)' }
85
- });
86
- tool.addOrUpdateConstituenta(sessionId, {
87
- draft: { id: 3, alias: 'D1', cstType: CstType.TERM, definitionFormal: 'Pr1(S1)' }
88
- });
48
+ ## Экспорт / импорт
89
49
 
90
- tool.setConstituentaValues(sessionId, {
91
- items: [
92
- { target: 1, value: { 0: 'ann', 1: 'bob', 2: 'cat' } },
93
- {
94
- target: 2,
95
- value: [
96
- [TUPLE_ID, 0, 1],
97
- [TUPLE_ID, 0, 2]
98
- ]
99
- }
100
- ]
101
- });
50
+ ```ts
51
+ const payload = tool.exportSession();
52
+ const restored = tool.importData(payload, 'session');
102
53
 
103
- const result = tool.evaluateConstituenta(sessionId, { constituentId: 3 });
54
+ const schemaJson = tool.exportPortal({ kind: 'schema' });
55
+ const modelObj = tool.exportPortal({ kind: 'model', format: 'object' });
104
56
 
105
- if (!result.success || result.status !== EvalStatus.HAS_DATA || JSON.stringify(result.value) !== '[0]') {
106
- throw new Error(`Ожидалось Pr1(S1) = первая координата; получено ${JSON.stringify(result)}`);
107
- }
57
+ // Portal GET /api/rsforms/:id/details
58
+ const session = tool.importData(portalDetailsJsonString);
108
59
  ```
109
60
 
110
- Подробнее: `../../docs/MODEL-TESTING.md`.
61
+ ## Stdio (плоские params)
111
62
 
112
- ## Клиент обёртки
63
+ ```json
64
+ { "id": "1", "method": "applySchemaPatch", "params": { "items": [{ "alias": "X1" }] } }
65
+ { "id": "2", "method": "setModelValues", "params": { "set": [{ "target": 1, "value": { "0": "a" } }] } }
66
+ { "id": "3", "method": "evaluate", "params": { "constituentId": 2 } }
67
+ ```
113
68
 
114
- Когда агент общается с отдельным процессом `rstool-wrapper`.
69
+ ## Node-клиент
115
70
 
116
71
  ```ts
117
- import { CstType } from '@rsconcept/rstool';
118
72
  import { RSToolWrapperClient } from '@rsconcept/rstool/wrapper';
119
73
 
74
+ // Из checkout rstool: по умолчанию запускает `npm run wrapper` в текущем cwd.
75
+ // Для установленного пакета: new RSToolWrapperClient({ command: 'npx', args: ['rstool-wrapper'] }).
120
76
  const client = new RSToolWrapperClient();
121
77
  await client.waitUntilReady();
122
78
 
123
- const { sessionId } = await client.call<{ sessionId: string }>('createSession');
124
-
125
- await client.call('addOrUpdateConstituenta', {
126
- sessionId,
127
- input: {
128
- draft: { id: 1, alias: 'X1', cstType: CstType.BASE, definitionFormal: '' }
129
- }
79
+ await client.call('applySchemaPatch', {
80
+ items: [{ alias: 'X1' }, { alias: 'D1', definitionFormal: '1+2' }]
130
81
  });
131
82
 
132
- const diagnostics = await client.call('listDiagnostics', { sessionId });
133
- console.log(diagnostics);
83
+ await client.call('setModelValues', {
84
+ set: [{ target: 1, value: { 0: 'zero', 1: 'one' } }]
85
+ });
134
86
 
87
+ const evalResult = await client.call('evaluate', { constituentId: 2 });
135
88
  await client.close();
136
89
  ```
137
-
138
- Ручной stdio — один JSON-запрос на строку:
139
-
140
- ```jsonl
141
- { "id": "1", "method": "createSession", "params": {} }
142
- { "id": "2", "method": "addOrUpdateConstituenta", "params": { "sessionId": "...", "input": { "draft": { "id": 1, "alias": "X1", "cstType": "basic", "definitionFormal": "" } } } }
143
- ```
144
-
145
- ## Экспорт / импорт
146
-
147
- ```ts
148
- const payload = tool.exportSession(sessionId);
149
- const restored = tool.importSession(payload);
150
- ```
151
-
152
- Экспорт включает состояние сессии и значения модели.
153
-
154
- Файлы для загрузки пользователем в существующий объект Portal:
155
-
156
- ```ts
157
- const schemaJson = tool.exportPortalSchema(sessionId);
158
- const modelJson = tool.exportPortalModel(sessionId);
159
- ```
160
-
161
- `schemaJson` — на странице схемы, `modelJson` — на странице модели, через **Load from JSON**.
@@ -4,18 +4,27 @@
4
4
 
5
5
  **RSLang** — формальная нотация концептуальных схем: понятия, отношения, операции, утверждения. Основа: принадлежность `x∈y`, теоретико-множественные и логические выражения, типизация.
6
6
 
7
- **rstool** — API агента для сессий, upsert, анализа, диагностик, значений модели, вычисления, экспорта/импорта.
7
+ **rstool** — API агента для сессий, редактирования схемы, анализа, диагностик, значений модели, вычисления, экспорта/импорта.
8
8
 
9
9
  - Библиотека: `@rsconcept/rstool`.
10
10
  - Анализатор: `@rsconcept/domain`.
11
11
  - Stdio-обёртка: `npx rstool-wrapper`, JSON построчно.
12
12
  - Node-клиент: `RSToolWrapperClient`.
13
13
 
14
+ ## Быстрый контракт для агента
15
+
16
+ - Library API: `tool.applySchemaPatch(input, sessionId?)` — единственный путь правки схемы.
17
+ - Stdio/MCP: **плоские** `params` — поля метода и optional `sessionId` на одном уровне (без `params.input`).
18
+ - Состояние: `getSessionState()` (summary) или `getSessionState('full')`.
19
+ - Импорт/экспорт Portal: `importData`, `exportPortal({ kind })`.
20
+ - Модель: `setModelValues`, `evaluate`, `recalculateModel`.
21
+ - Перед сохранением сомнительной формулы — `analyzeExpression`.
22
+
14
23
  ## Что читать
15
24
 
16
25
  Пути — относительно этого файла.
17
26
 
18
- - API, методы, stdio, коды ошибок: [REFERENCE.md](REFERENCE.md).
27
+ - API, методы, stdio: [REFERENCE.md](REFERENCE.md).
19
28
  - Примеры: [EXAMPLES.md](EXAMPLES.md).
20
29
  - Термины предметной области: [../../docs/DOMAIN.md](../../docs/DOMAIN.md).
21
30
  - Концептуализация, создание схемы: [../../docs/CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
@@ -36,16 +45,16 @@
36
45
 
37
46
  Когда схема уже есть и нужны точечные правки, новые конституенты или проверка формул.
38
47
 
39
- 1. `createSession` (или продолжить существующую сессию).
40
- 2. Развивай схему добавляй конституенты с корректным `cstType` и атрибутами.
41
- 3. Добавляй поставщиков раньше потребителей (см. [порядок объявления](#порядок-объявления-конституент)).
42
- 4. Перед upsert при сомнении вызывай `analyzeExpression`.
48
+ 1. Продолжи текущую сессию или вызови `ensureSession`; большинство методов создают сессию лениво.
49
+ 2. Развивай схему через `applySchemaPatch`: можно опускать `id` и `cstType` для стандартных alias `X/C/S/D/A/F/P`.
50
+ 3. Для пачки конституент передавай все элементы вместе — `applySchemaPatch` упорядочит поставщиков раньше потребителей.
51
+ 4. Перед patch в `applySchemaPatch` при сомнении вызывай `analyzeExpression`.
43
52
  5. Исправляй диагностики по диапазону `from` / `to` в `definitionFormal` ([DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)).
44
53
  6. При сомнении в семантике собери маленькую КМ и проверь тестовые данные ([цикл КМ](#проверка-на-маленькой-км)).
45
- 7. Задай базовые/модельные значения: `setConstituentaValue(s)`; вычисли: `evaluateExpression`, `evaluateConstituenta`, `recalculateModel`.
46
- 8. `commitStep`, когда состояние согласовано.
47
- 9. Сохрани: `exportSession` / `importSession`.
48
- 10. Для загрузки в Portal: `exportPortalSchema` (схема) или `exportPortalModel` (модель).
54
+ 7. Задай значения модели: `setModelValues`; вычисли: `evaluate`, `recalculateModel`.
55
+ 8. `commitStep` или `commitMessage` в `applySchemaPatch`, когда состояние согласовано.
56
+ 9. Сохрани: `exportSession` / `importData`.
57
+ 10. Для загрузки в Portal: `exportPortal({ kind: 'schema' })` или `{ kind: 'model' }`.
49
58
 
50
59
  ### Оценка или правка КС из Portal
51
60
 
@@ -56,13 +65,8 @@
56
65
  Если id неизвестен — контекстный поиск `GET /api/library/context-search?q=...`, затем
57
66
  метаданные по найденным id: `GET /api/library/by-ids?ids=...` (curl и поля поиска — в том же файле).
58
67
 
59
- Portal JSON из `/details` не является форматом `exportSession` и не передаётся в
60
- `importSession` напрямую. Создай `createSession({ title, alias, comment: description })`
61
- и перенеси `items[]` через `addOrUpdateConstituenta`, сохраняя raw-поля:
62
- `cst_type → cstType`, `definition_formal → definitionFormal`,
63
- `term_raw → term`, `definition_raw → definitionText`, `convention → convention`.
64
- После переноса запусти `listDiagnostics`; для результата в Portal используй
65
- `exportPortalSchema`, а для локального снапшота — `exportSession`.
68
+ Portal JSON из `/details` не является форматом `exportSession`. Используй `importData(payload)`
69
+ auto определит `portal-details` или `portal-schema`. Явный kind: `'portal-details'`, `'portal-schema'`, `'session'`.
66
70
 
67
71
  ### Концептуализация (КС из содержания источника)
68
72
 
@@ -75,7 +79,7 @@ Portal JSON из `/details` не является форматом `exportSessio
75
79
  5. Добавь `A#` на структуры: `card`, покрытие `Pr1,2(S#)=…`, принадлежность выбора.
76
80
  6. Введи `F#` для типовых запросов.
77
81
  7. Производные понятия строй через `Pr*`, `Fi*`, `F#` от центрального `D#` и базовых `S#`.
78
- 8. Перед каждым upsert — `analyzeExpression`; при ошибках — [цикл диагностик](#цикл-диагностик).
82
+ 8. Перед каждым patch — `analyzeExpression`; при ошибках — [цикл диагностик](#цикл-диагностик).
79
83
  9. Сомнительную семантику проверь на маленькой КМ ([цикл КМ](#проверка-на-маленькой-км), [MODEL-TESTING.md](../../docs/MODEL-TESTING.md)).
80
84
  10. Перед показом результата пройди [чеклист ревью КС](#ревью-концептуальной-схемы).
81
85
 
@@ -90,7 +94,7 @@ Portal JSON из `/details` не является форматом `exportSessio
90
94
  3. Сопоставь `code` с исправлением в [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md).
91
95
  4. Исправь именно диапазон в `definitionFormal`.
92
96
  5. Не повторяй вызов без изменения ввода.
93
- 6. После успеха — `addOrUpdateConstituenta`.
97
+ 6. После успеха — ещё один `applySchemaPatch` с исправленным элементом.
94
98
 
95
99
  ### Проверка на маленькой КМ
96
100
 
@@ -98,9 +102,9 @@ Portal JSON из `/details` не является форматом `exportSessio
98
102
 
99
103
  1. Отдельная `createSession` или изолированная копия текущей сессии.
100
104
  2. Только нужные поставщики: `X#`, `C#`, `S#` и проверяемые `D#` / `F#` / `P#` / `A#`.
101
- 3. `analyzeExpression` и `addOrUpdateConstituenta`.
102
- 4. Значения базовых понятий: `setConstituentaValue` / `setConstituentaValues`.
103
- 5. `evaluateExpression` или `evaluateConstituenta`; сравни с ожидаемым `value`.
105
+ 3. `analyzeExpression` и `applySchemaPatch`.
106
+ 4. Значения: `setModelValues`.
107
+ 5. `evaluate`; сравни с ожидаемым `value`.
104
108
  6. При нескольких зависимых определениях — `recalculateModel`.
105
109
 
106
110
  Для регрессий вынеси проверку в скрипт или colocated `*.test.ts` (см. [MODEL-TESTING.md](../../docs/MODEL-TESTING.md)).
@@ -114,13 +118,24 @@ Portal JSON из `/details` не является форматом `exportSessio
114
118
 
115
119
  Правила валидации по типам — [CONSTITUENTA.md](../../docs/CONSTITUENTA.md).
116
120
 
121
+ ## Формат ответа агента
122
+
123
+ В конце работы сообщи:
124
+
125
+ - что изменено в схеме или модели;
126
+ - есть ли активные диагностики;
127
+ - какой экспорт получен: session / Portal schema / Portal model;
128
+ - какие проверки выполнены: analyze / evaluate / recalculate / tests.
129
+
130
+ Не вставляй большой JSON в чат без запроса пользователя.
131
+
117
132
  ## Чеклисты
118
133
 
119
134
  ### Сессия и rstool
120
135
 
121
- - [ ] Отслеживается `sessionId`.
122
- - [ ] `cstType` соответствует роли конституенты.
123
- - [ ] Поставщики добавлены раньше потребителей.
136
+ - [ ] Используется текущая сессия (`getSessionState`) или явный `sessionId`, если сессий несколько.
137
+ - [ ] Для стандартных alias `X/C/S/D/A/F/P` можно доверить `cstType` `applySchemaPatch`; нестандартные alias передаются с явным `cstType`.
138
+ - [ ] Для пачки конституент предпочитай один `applySchemaPatch` с массивом `items`.
124
139
 
125
140
  ### Перед показом, commit и export
126
141