@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,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
 
@@ -3,199 +3,62 @@
3
3
  ## Контракт rstool
4
4
 
5
5
  - Пакет: `@rsconcept/rstool`
6
- - Версия контракта: `1.4.0` (`CONTRACT_VERSION`)
6
+ - Версия контракта: `2.0.0` (`CONTRACT_VERSION`)
7
7
  - Основной класс: `RSToolAgent`
8
8
  - Публичные импорты: `@rsconcept/rstool` и `@rsconcept/rstool/wrapper`
9
9
 
10
- ### Методы
11
-
12
- | Метод | Назначение |
13
- | ----------------------------------------------------------- | ----------------------------------------------------------------------------- |
14
- | `createSession(initial?)` | Новая in-memory сессия `{ sessionId, contractVersion }` |
15
- | `addOrUpdateConstituenta(sessionId, { draft })` | Слияние черновика; анализ в контексте сессии → `{ state, diagnostics }` |
16
- | `analyzeExpression(sessionId, { expression, cstType })` | Разбор/типизация фрагмента без сохранения конституенты |
17
- | `getFormState(sessionId)` | Клон полного состояния сессии |
18
- | `listDiagnostics(sessionId, filters?)` | Накопленные диагностики; опциональный фильтр `constituentId` |
19
- | `commitStep(sessionId, message?)` | Зафиксировать контрольную точку ревизии |
20
- | `exportSession(sessionId)` | JSON-строка `{ contractVersion, state, diagnostics }` |
21
- | `exportPortalSchema(sessionId)` | JSON импорта схемы Portal |
22
- | `exportPortalModel(sessionId)` | JSON импорта модели Portal |
23
- | `importSession(payload)` | Новая сессия из экспорта |
24
- | `setConstituentaValue(sessionId, { target, type?, value })` | Одна привязка базового понятия или структурное значение → `SessionModelState` |
25
- | `setConstituentaValues(sessionId, { items })` | Пакетная установка значений → `SessionModelState` |
26
- | `clearConstituentaValues(sessionId, { items })` | Очистка значений по id конституент → `SessionModelState` |
27
- | `getModelState(sessionId)` | Клон состояния интерпретации сессии |
28
- | `evaluateExpression(sessionId, { expression, cstType })` | Вычисление фрагмента в контексте сессии → `EvaluationResult` |
29
- | `evaluateConstituenta(sessionId, { constituentId })` | Вычисление сохранённого определения → `EvaluationResult` |
30
- | `recalculateModel(sessionId)` | Пересчёт всех выводимых конституент → `{ items[] }` |
31
-
32
- ### `ConstituentaDraft`
33
-
34
- ```ts
35
- {
36
- id: number; // стабильный id внутри сессии
37
- alias: string;
38
- cstType: CstType;
39
- definitionFormal: string;
40
- term?: string;
41
- definitionText?: string;
42
- convention?: string;
43
- }
44
- ```
45
-
46
- Пропущенные текстовые поля в сохранённом состоянии по умолчанию `''`.
47
-
48
- ### Метаданные `SessionState`
49
-
50
- Задаются в `createSession(initial?)` или через `importSession`:
51
-
52
- ```ts
53
- {
54
- alias: string; // alias объекта библиотеки
55
- title: string; // отображаемое название
56
- comment: string; // заметки разработчика
57
- }
58
- ```
59
-
60
- При опускании все поля по умолчанию `''`.
61
-
62
- ### Типы модели и вычисления
10
+ ### Методы library API
11
+
12
+ | Метод | Назначение |
13
+ | ---------------------------------------------- | -------------------------------------------- |
14
+ | `ensureSession(initial?)` | Вернуть текущую сессию или создать новую |
15
+ | `createSession(initial?)` | Новая in-memory сессия |
16
+ | `getCurrentSession()` | Текущая активная сессия или `null` |
17
+ | `setCurrentSession(sessionId)` | Сделать сессию текущей |
18
+ | `applySchemaPatch(input, sessionId?)` | Единственный путь правки схемы |
19
+ | `getSessionState(detail?, sessionId?)` | `summary` (default) или `full` |
20
+ | `listDiagnostics(filters?, sessionId?)` | Активные диагностики |
21
+ | `analyzeExpression(input, sessionId?)` | Разбор без сохранения (`recordDiagnostics?`) |
22
+ | `commitStep(message?, sessionId?)` | Ревизия |
23
+ | `exportSession(sessionId?)` | JSON сессии |
24
+ | `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON |
25
+ | `importData(payload, kind?)` | Импорт сессии / Portal |
26
+ | `setModelValues({ set?, clear? }, sessionId?)` | Значения модели |
27
+ | `getModelState(sessionId?)` | Состояние интерпретации |
28
+ | `evaluate(input, sessionId?)` | Scratch или конституента |
29
+ | `recalculateModel(sessionId?)` | Пересчёт |
30
+
31
+ ### `applySchemaPatch`
63
32
 
64
33
  ```ts
65
- type RSToolValue = number | RSToolValue[]; // значение во время выполнения
66
- type BasicBinding = Record<number, string>; // подписи элементов базового множества
67
-
68
- interface SessionModelState {
69
- items: { id: number; type: string; value: RSToolValue | BasicBinding }[];
70
- }
71
-
72
- interface EvaluationResult {
73
- success: boolean;
74
- value: RSToolValue | BasicBinding | null;
75
- status: EvalStatus; // 1=NO_EVAL … 7=HAS_DATA
76
- iterations: number;
77
- cacheHits: number;
78
- diagnostics: { code: number; from: number; to: number; params?: string[] }[];
79
- }
34
+ tool.applySchemaPatch({
35
+ initial: { title: 'Kinship' },
36
+ commitMessage: 'initial schema',
37
+ items: [{ alias: 'X1' }, { alias: 'S1', definitionFormal: 'ℬ(X1×X1)' }, { alias: 'D1', definitionFormal: 'Pr1(S1)' }]
38
+ });
80
39
  ```
81
40
 
82
- Привязки `basic`/`constant` используют `type: "basic"` и `value: { "0": "label", … }`. Структурные значения — нормализованная типизация в `type` и вложенные массивы для множеств/кортежей.
83
-
84
41
  ### Протокол stdio
85
42
 
86
- Процесс: `npx rstool-wrapper`
87
-
88
- 1. **Ready** (без запроса): `{"id":null,"ok":true,"result":{"ready":true,"wrapper":"rstool-stdio","contractVersion":"1.4.0"}}`
89
- 2. **Запрос**: `{"id":"<unique>","method":"<name>","params":{...}}`
90
- 3. **Ответ**: `{"id":"<same>","ok":true,"result":...}` или `{"id":"...","ok":false,"error":{"code":"...","message":"..."}}`
43
+ Плоские `params` (без `input`). Опционально: переменная окружения `RSTOOL_PERSISTENCE_DIR` — каталог для сохранения сессий между перезапусками обёртки (в library API — `new RSToolAgent({ persistenceDir })`).
91
44
 
92
- Дополнительные методы: `ping`, `methods`.
45
+ Служебные методы:
93
46
 
94
- Пример цепочки:
47
+ - `ping` — liveness и `contractVersion`.
48
+ - `methods` — список доступных stdio-методов.
95
49
 
96
50
  ```json
97
- {"id":"1","method":"createSession","params":{}}
98
- {"id":"2","method":"addOrUpdateConstituenta","params":{"sessionId":"…","input":{"draft":{"id":2,"alias":"S1","cstType":"structure","definitionFormal":"ℬ(X1×X1)"}}}}
99
- {"id":"2b","method":"addOrUpdateConstituenta","params":{"sessionId":"…","input":{"draft":{"id":3,"alias":"D1","cstType":"term","definitionFormal":"Pr1(S1)"}}}}
100
- {"id":"3","method":"analyzeExpression","params":{"sessionId":"","input":{"expression":"1+2","cstType":"term"}}}
101
- {"id":"4","method":"listDiagnostics","params":{"sessionId":""}}
102
- {"id":"5","method":"commitStep","params":{"sessionId":"…","message":"checkpoint"}}
103
- {"id":"6","method":"exportSession","params":{"sessionId":"…"}}
104
- {"id":"6a","method":"exportPortalSchema","params":{"sessionId":"…"}}
105
- {"id":"6b","method":"exportPortalModel","params":{"sessionId":"…"}}
106
- {"id":"7","method":"setConstituentaValue","params":{"sessionId":"…","input":{"target":1,"value":{"0":"a","1":"b"}}}}
107
- {"id":"8","method":"evaluateExpression","params":{"sessionId":"…","input":{"expression":"1+2","cstType":"term"}}}
108
- {"id":"9","method":"evaluateConstituenta","params":{"sessionId":"…","input":{"constituentId":3}}}
109
- ```
110
-
111
- `RSToolWrapperClient`: по умолчанию запускает `rstool-wrapper`; методы `waitUntilReady()`, `call(method, params)`, `close()`.
112
-
113
- ### Результат анализа
114
-
115
- ```ts
116
- interface AnalysisResult {
117
- success: boolean;
118
- type: Record<string, unknown> | null;
119
- valueClass: 'value' | 'property' | null;
120
- diagnostics: { code: number; from: number; to: number; params?: string[] }[];
121
- }
51
+ {"id":"2","method":"applySchemaPatch","params":{"items":[{"alias":"X1"}]}}
52
+ {"id":"7","method":"setModelValues","params":{"set":[{"target":1,"value":{"0":"a"}}]}}
53
+ {"id":"8","method":"evaluate","params":{"constituentId":3}}
54
+ {"id":"9","method":"exportPortal","params":{"kind":"schema"}}
55
+ {"id":"10","method":"importData","params":{"payload":"..."}}
122
56
  ```
123
57
 
124
- ## RSLang
125
-
126
- Кратко: язык на базе логики первого порядка; разделение множественных и логических выражений; параметризованные шаблоны для функций и предикатов.
127
-
128
- - **Типизация**: структурный тип выражения; ступени включают элементы (`Xi`, `Ci`), `Z`, кортежи `(H1×…×Hn)`, множества `ℬ(H)`, логику `Logic`, параметризованные `Hr 🠔 [H1,…,Hi]`. У `structure` (`S#`) поле `definitionFormal` **задаёт** типизацию. У `term` (`D#`) типизация **выводится** из определения.
129
-
130
- ## Токены грамматики
58
+ ### MCP tools
131
59
 
132
- Из `rslang.grammar`:
133
-
134
- | Категория | Токены / формы |
135
- | ------------------- | ------------------------------------------------------- |
136
- | Глобальные | `X`, `C`, `S`, `D`, `A`, `T` + цифры (правило `Global`) |
137
- | Функции / предикаты | `F<n>`, `P<n>` |
138
- | Радикалы | `R<n>` |
139
- | Локальные | `_a-zα-ω` + опциональные цифры |
140
- | Логика | `¬` `∀` `∃` `⇔` `⇒` `∨` `&` |
141
- | Множества | `ℬ` `∪` `\` `∆` `∩` `×` `∈` `∉` `⊆` `⊂` … |
142
- | Операции | `Pr`, `pr`, `Fi`, `card`, `bool`, `debool`, `red` |
143
- | Литералы | цифры, `Z`, `∅` |
144
-
145
- Полная грамматика и приоритеты: `docs/GRAMMAR-REF.md`.
60
+ 17 tools — см. `rstool-mcp/README.md`.
146
61
 
147
62
  ## Документация
148
63
 
149
- | Тема | Документ |
150
- | ---------------------------------------- | ------------------------------------------------------------ |
151
- | Идентификаторы, литералы | `docs/SYNTAX.md` § «Имена и литералы» |
152
- | Ступени, `Logic`, параметризованные типы | `docs/TYPIFICATION.md` § «Ступени» |
153
- | Логические выражения | `docs/SYNTAX.md` § «Логические выражения (LE)» |
154
- | Операторы над множествами | `docs/SYNTAX.md` § «Теоретико-множественные выражения (STE)» |
155
- | Целочисленная арифметика | `docs/SYNTAX.md` § «Арифметика» |
156
- | Дополнительные и производные типизации | `docs/TYPIFICATION.md` § «Дополнительные типизации» |
157
- | Кванторы | `docs/SYNTAX.md` § «Кванторы» |
158
- | Параметризованные функции, шаблоны | `docs/SYNTAX.md` § «Параметризованные выражения» |
159
- | Модель корректности / валидация | `docs/SYNTAX.md` § «Корректность» |
160
- | Семантические тесты определений | `docs/MODEL-TESTING.md` |
161
- | Словарь предметной области | `docs/DOMAIN.md` |
162
- | Поля конституент и порядок | `docs/CONSTITUENTA.md` |
163
- | REST API Portal | `docs/PORTAL-API.md` |
164
- | Токены грамматики / приоритеты | `docs/GRAMMAR-REF.md` |
165
-
166
- Воркфлоу и чеклисты — `skills/rstool-helper/GUIDE.md`.
167
-
168
- ## Коды ошибок
169
-
170
- Категории и исправления по коду: `docs/DIAGNOSTICS.md`.
171
-
172
- Категории:
173
-
174
- - `0x84xx` — синтаксис / разбор
175
- - `0x28xx` — предупреждения локальных объявлений
176
- - `0x88xx` — семантика / типы
177
- - `0x886x` — уровень конституент (пустая производная, запрещённое определение)
178
- - `0x81xx` — вычисление (runtime; из `evaluateExpression` / `evaluateConstituenta`)
179
-
180
- ## Форма экспорта сессии
181
-
182
- `exportSession(sessionId)` возвращает JSON-строку `{ contractVersion, state, diagnostics }`.
183
-
184
- - `state.alias`, `state.title`, `state.comment` — метаданные объекта библиотеки для экспорта в Portal (`comment` → JSON `description`).
185
- - `state.items[]` — каждая конституента с `id`, `alias`, `cstType`, `definitionFormal`, опциональными текстовыми полями и вложенным результатом анализа.
186
- - `state.model.items[]` — присутствует, если заданы значения интерпретации.
187
- - `diagnostics[]` — накопленные диагностики со смещениями и кодами.
188
-
189
- `importSession(payload)` принимает только этот формат `exportSession`. JSON Portal из
190
- `GET /api/rsforms/:id/details` сначала переноси в сессию через `createSession` и
191
- `addOrUpdateConstituenta`; поля и REST-пути описаны в `docs/PORTAL-API.md`.
192
-
193
- ## JSON импорта Portal
194
-
195
- Для **Load from JSON** на существующей схеме или модели Portal:
196
-
197
- - `exportPortalSchema(sessionId)` — файл схемы
198
- - `exportPortalModel(sessionId)` — файл модели
199
-
200
- - Схема `items[]`: поля конституент (`cst_type`, `definition_formal`, `term_raw`, …).
201
- - Модель `items[]`: `{ id, type, value }` на каждую привязку.
64
+ Воркфлоу: `GUIDE.md`. Примеры: `EXAMPLES.md`. Язык: `docs/*.md`.