@rsconcept/rstool 1.7.1 → 2.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 (126) hide show
  1. package/README.md +7 -7
  2. package/dist/index.js +1 -1
  3. package/dist/mappers/model-adapter.d.ts +6 -2
  4. package/dist/mappers/model-adapter.js +28 -3
  5. package/dist/mappers/model-adapter.js.map +1 -1
  6. package/dist/mappers/schema-adapter.d.ts +1 -2
  7. package/dist/mappers/schema-adapter.js +1 -1
  8. package/dist/mappers/types.d.ts +4 -5
  9. package/dist/models/index.js +1 -1
  10. package/dist/models/rstool-agent.js +1 -2
  11. package/dist/{models-DG2uTaV_.js → models-D06g8LId.js} +6 -5
  12. package/dist/{models-DG2uTaV_.js.map → models-D06g8LId.js.map} +1 -1
  13. package/dist/{rsform-builder-DKwZfJvN.js → rsform-builder-BlXEe5Ow.js} +2 -2
  14. package/dist/{rsform-builder-DKwZfJvN.js.map → rsform-builder-BlXEe5Ow.js.map} +1 -1
  15. package/dist/session/session-store.d.ts +3 -3
  16. package/dist/session/session-store.js +1 -2
  17. package/dist/wrapper/client.d.ts +15 -9
  18. package/dist/wrapper/client.js +79 -12
  19. package/dist/wrapper/client.js.map +1 -1
  20. package/dist/wrapper/stdio-wrapper.d.ts +1 -1
  21. package/dist/wrapper/stdio-wrapper.js +18 -10
  22. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  23. package/docs/BRIEF.md +93 -0
  24. package/docs/CONCEPTUAL-SCHEMA.md +17 -2
  25. package/docs/CONSTRUCTIONS.md +384 -0
  26. package/docs/DIAGNOSTICS.md +9 -8
  27. package/docs/DOMAIN.md +12 -0
  28. package/docs/METHOD.md +208 -0
  29. package/docs/MODEL-TESTING.md +48 -0
  30. package/docs/PORTAL-API.md +38 -285
  31. package/docs/PORTAL-MODELS.md +24 -0
  32. package/docs/PORTAL-OSS.md +56 -0
  33. package/docs/PORTAL-PUBLISH.md +39 -0
  34. package/docs/PORTAL-READ.md +301 -0
  35. package/docs/README.md +8 -4
  36. package/docs/REQUIREMENTS.md +61 -0
  37. package/docs/SYNTAX.md +5 -4
  38. package/docs/TYPIFICATION.md +12 -3
  39. package/docs/brief.schema.json +173 -0
  40. package/examples/README.md +16 -2
  41. package/examples/access-control/NOTES.md +23 -0
  42. package/examples/access-control/anti/collapsed.json +439 -0
  43. package/examples/access-control/anti/weakened.json +439 -0
  44. package/examples/access-control/brief-v1.json +231 -0
  45. package/examples/access-control/brief.json +310 -0
  46. package/examples/access-control/build-rsform.ts +151 -0
  47. package/examples/access-control/requirements-v1.md +9 -0
  48. package/examples/access-control/requirements-v2.md +4 -0
  49. package/examples/access-control/rsform-session-v1.json +439 -0
  50. package/examples/access-control/rsform-session.json +523 -0
  51. package/examples/audit-diagnostics.ts +9 -1
  52. package/examples/briefs.test.ts +126 -0
  53. package/examples/clinic-booking/NOTES.md +24 -0
  54. package/examples/clinic-booking/anti/collapsed.json +615 -0
  55. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  56. package/examples/clinic-booking/brief-v1.json +332 -0
  57. package/examples/clinic-booking/brief.json +405 -0
  58. package/examples/clinic-booking/build-rsform.ts +174 -0
  59. package/examples/clinic-booking/requirements-v1.md +9 -0
  60. package/examples/clinic-booking/requirements-v2.md +4 -0
  61. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  62. package/examples/clinic-booking/rsform-session.json +700 -0
  63. package/examples/diagnostics-utils.ts +26 -0
  64. package/examples/kinship/brief.json +337 -0
  65. package/examples/kinship/build-rsform.ts +7 -4
  66. package/examples/kinship/rsform-session.json +20 -63
  67. package/examples/kinship/rsmodel-session.json +14 -14
  68. package/examples/kinship-subordination/NOTES.md +49 -0
  69. package/examples/kinship-subordination/brief.json +161 -0
  70. package/examples/kinship-subordination/build-rsform.ts +100 -0
  71. package/examples/kinship-subordination/rsform-session.json +795 -0
  72. package/examples/library-loans/NOTES.md +46 -0
  73. package/examples/library-loans/anti/collapsed.json +481 -0
  74. package/examples/library-loans/anti/species-as-genus.json +334 -0
  75. package/examples/library-loans/anti/uncovered.json +406 -0
  76. package/examples/library-loans/anti/weakened.json +464 -0
  77. package/examples/library-loans/brief-v1.json +340 -0
  78. package/examples/library-loans/brief.json +502 -0
  79. package/examples/library-loans/build-rsform.ts +239 -0
  80. package/examples/library-loans/requirements-v1.md +11 -0
  81. package/examples/library-loans/requirements-v2.md +5 -0
  82. package/examples/library-loans/rsform-session-v1.json +481 -0
  83. package/examples/library-loans/rsform-session.json +652 -0
  84. package/examples/library-loans/source-markup.md +18 -0
  85. package/examples/movd/brief.json +220 -0
  86. package/examples/movd/build-rsform.ts +5 -2
  87. package/examples/movd/rsform-session.json +14 -46
  88. package/examples/subordination/NOTES.md +59 -0
  89. package/examples/subordination/anti/collapsed.json +556 -0
  90. package/examples/subordination/anti/single-relation.json +125 -0
  91. package/examples/subordination/anti/transitive.json +573 -0
  92. package/examples/subordination/anti/weakened.json +539 -0
  93. package/examples/subordination/brief.json +386 -0
  94. package/examples/subordination/build-rsform.ts +63 -0
  95. package/examples/subordination/constants.ts +115 -0
  96. package/examples/subordination/rsform-session.json +556 -0
  97. package/examples/subordination/source-markup.md +19 -0
  98. package/examples/subordination/source.md +40 -0
  99. package/package.json +29 -20
  100. package/skills/INSTALL.md +28 -29
  101. package/skills/README.md +25 -10
  102. package/skills/rs-core/SKILL.md +56 -0
  103. package/skills/rs-explain/SKILL.md +28 -0
  104. package/skills/rs-explicate/SKILL.md +71 -0
  105. package/skills/rs-interpret/SKILL.md +67 -0
  106. package/skills/rs-portal/SKILL.md +51 -0
  107. package/skills/rs-review/SKILL.md +79 -0
  108. package/skills/rs-scope/SKILL.md +67 -0
  109. package/skills/rs-synthesis/SKILL.md +52 -0
  110. package/skills/rstool/SKILL.md +70 -0
  111. package/skills/rstool-helper/GUIDE.md +18 -272
  112. package/skills/rstool-helper/SKILL.md +8 -55
  113. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +40 -12
  114. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +28 -7
  115. package/skills/rstool-runtime/SKILL.md +96 -0
  116. package/skills/scripts/brief-check.test.ts +165 -0
  117. package/skills/scripts/brief-check.ts +826 -0
  118. package/skills/scripts/check-brief.ts +94 -0
  119. package/skills/scripts/rstool-skills.mjs +119 -0
  120. package/skills/scripts/skill-stubs.test.ts +48 -0
  121. package/src/mappers/model-adapter.ts +34 -1
  122. package/src/models/rstool-agent.test.ts +95 -0
  123. package/src/wrapper/client.test.ts +43 -4
  124. package/src/wrapper/client.ts +95 -16
  125. package/src/wrapper/stdio-handler.test.ts +43 -0
  126. package/src/wrapper/stdio-handler.ts +19 -5
@@ -1,287 +1,40 @@
1
1
  # Portal REST API
2
2
 
3
- Справка для чтения существующих КС, ОСС и RSModel из Portal и переноса КС в `rstool`.
4
- `rstool` сам не ходит в REST API: он работает с in-memory сессиями.
5
- Агент получает JSON Portal отдельно, затем переносит конституенты через контракт `rstool`.
6
-
7
- ## Хосты
8
-
9
- - UI: `https://portal.acconcept.ru/`
10
- - REST API: `https://api.portal.acconcept.ru/`
11
-
12
- ## Пути
13
-
14
- - `/rsforms/:id` в UI → `GET /api/rsforms/:id` для метаданных.
15
- - Полная КС → `GET /api/rsforms/:id/details`.
16
- - Версия КС → `GET /api/library/:id/versions/:version`.
17
- - Список доступных объектов → `GET /api/library/active`.
18
- - Поиск по тексту в схемах/ОСС/моделях → `GET /api/library/context-search?q=...`.
19
- - Метаданные объектов по id → `GET /api/library/by-ids?ids=856,1203`.
20
- - ОСС → `GET /api/oss/:id` и соседние routes viewset.
21
- - Модель → `GET /api/models/:id`.
22
- - OpenAPI JSON → `GET https://api.portal.acconcept.ru/schema`.
23
-
24
- Для UI-ссылки `https://portal.acconcept.ru/rsforms/856` агент должен ходить на:
25
-
26
- ```text
27
- GET https://api.portal.acconcept.ru/api/rsforms/856
28
- GET https://api.portal.acconcept.ru/api/rsforms/856/details
29
- ```
30
-
31
- Не переноси UI query/hash вроде `?tab=editor`.
32
-
33
- ## Доступ
34
-
35
- **Для агентов через REST/curl** отдельного API-токена нет. Запросы без авторизации
36
- видят только объекты с `access_policy: "public"` в общих разделах (`/S`, `/L`).
37
- Это касается `context-search`, `by-ids`, `GET /api/rsforms/:id` и `/details`.
38
-
39
- - Недоступная схема → `403` на прямой запрос; в `by-ids` такой id **пропускается**.
40
- - Личные (`/U`) и проектные (`/P`) объекты через анонимный API **не читаются**, даже если
41
- пользователь дал UI-ссылку.
42
- - Если нужны только `title`, `alias`, `description`, `owner`, `access_policy`, не запрашивай `/details`.
43
-
44
- В браузере Portal использует Django session (`SessionAuthentication`). **Не предлагай
45
- пользователю передавать session cookie агенту** — для curl/скриптов это нерабочий путь
46
- (cookie привязан к браузеру, истекает, не предназначен для машинного доступа).
47
-
48
- Если КС не публичная, варианты для агента:
49
-
50
- 1. Пользователь временно делает схему публичной (`access_policy: public`).
51
- 2. Пользователь экспортирует JSON (`GET /api/rsforms/:id/details` из своей сессии в UI
52
- или экспорт из Portal) и передаёт JSON в чат или файл — агент переносит в `rstool`.
53
- 3. Работа с личной библиотекой остаётся в UI Portal; агент помогает с публичными схемами
54
- и с JSON, который пользователь явно предоставил.
55
-
56
- ## Список и контекстный поиск в библиотеке
57
-
58
- Чтобы найти схему по термину, формуле или названию, не перебирай все id подряд.
59
- Бэкенд и UI используют контекстный поиск по вложенным текстовым полям.
60
-
61
- ### Полный список доступных объектов
62
-
63
- ```text
64
- GET /api/library/active
65
- ```
66
-
67
- Возвращает массив метаданных (`id`, `item_type`, `title`, `alias`, `description`, `location`,
68
- `access_policy`, `visible`, …) для объектов, доступных текущему пользователю: публичные в `/S` и
69
- `/L`, собственные и те, где пользователь редактор. Анониму — только публичные в общих разделах.
70
-
71
- Для агентов обычно достаточно `context-search`; полный `active` нужен, если требуется обойти
72
- все объекты без текстового фильтра.
73
-
74
- ### Контекстный поиск
75
-
76
- ```text
77
- GET /api/library/context-search?q=<текст>&search_fields=<поля>&location=<путь>&subfolders=0|1&item_type=<тип>&admin=0|1
78
- ```
79
-
80
- Ответ: `{ "ids": [856, 1203, ...] }` — id объектов библиотеки (КС, ОСС, RSModel), у которых
81
- совпал хотя бы один из запрошенных текстовых фрагментов. Пустой или пробельный `q` → `ids: []`.
82
- Регистр не важен; кириллица поддерживается.
83
-
84
- | Параметр | Обязателен | Описание |
85
- | --------------- | ---------- | ------------------------------------------------------- |
86
- | `q` | да\* | Подстрока для поиска (\*пустой → пустой ответ) |
87
- | `search_fields` | нет | Список полей через запятую; по умолчанию — все |
88
- | `location` | нет | Путь папки (`/S`, `/U/Проект`, …); см. ниже |
89
- | `subfolders` | нет | `1`/`true` — включать вложенные папки; по умолчанию `0` |
90
- | `item_type` | нет | `rsform`, `oss` или `rsmodel` — ограничить тип объекта |
91
- | `admin` | нет | `1`/`true` — искать по всей библиотеке (только staff) |
92
-
93
- Допустимые значения `search_fields`:
94
-
95
- | Поле | Где ищет |
96
- | ------------------- | ------------------------------------------------- |
97
- | `alias` | Шифр объекта и конституент |
98
- | `title` | Название объекта |
99
- | `description` | Описание объекта |
100
- | `term` | Термин конституенты (`term_raw`, `term_resolved`) |
101
- | `definition_formal` | Формальное определение, ручная типизация |
102
- | `definition_text` | Текстовое определение конституенты |
103
- | `convention` | Соглашение конституенты |
104
- | `operation` | Операции ОСС (alias, title, description) |
105
- | `block` | Блоки ОСС (title, description) |
106
-
107
- Для КС по термину или формуле обычно не указывай `search_fields` (все поля) или явно:
108
- `search_fields=term,definition_formal,title`.
109
-
110
- ### Префиксы `location`
111
-
112
- Путь хранится в поле `location` каждого объекта. Корневые префиксы:
113
-
114
- | Префикс | Значение |
115
- | ------- | -------------------------------------------- |
116
- | `/S` | Общие (COMMON), публичные схемы для анонимов |
117
- | `/L` | Библиотека (LIBRARY), staff |
118
- | `/U` | Личное пространство пользователя |
119
- | `/P` | Проекты |
120
-
121
- Вложенные папки: `/U/Мой проект/Подпапка`.
122
-
123
- - без `subfolders` (по умолчанию) — только объекты с точным совпадением `location`;
124
- - с `subfolders=1` — объекты в папке и во всех вложенных (`/U/Проект`, `/U/Проект/Подпапка`, …).
125
-
126
- Параметр `item_type` сужает поиск до КС (`rsform`), ОСС (`oss`) или моделей (`rsmodel`).
127
- Для поиска только концептуальных схем удобно: `item_type=rsform`.
128
-
129
- ### Метаданные по списку id
130
-
131
- После `context-search` не нужно запрашивать всю библиотеку (`/active`) или каждый объект отдельно.
132
-
133
- ```text
134
- GET /api/library/by-ids?ids=<id1>,<id2>,...
135
- ```
136
-
137
- Ответ — массив метаданных в том же формате, что и `GET /api/library/active`:
138
- `id`, `item_type`, `title`, `alias`, `description`, `location`, `access_policy`, `visible`, …
139
-
140
- | Параметр | Описание |
141
- | -------- | ----------------------- |
142
- | `ids` | Список id через запятую |
143
-
144
- Правила доступа те же, что у `context-search` и `active`: недоступные id **пропускаются**
145
- (не ошибка, не `403` на весь запрос). Порядок элементов в ответе совпадает с порядком id
146
- в запросе. Пустой `ids` → `[]`.
147
-
148
- Для одной КС по-прежнему можно `GET /api/rsforms/:id`; для нескольких результатов поиска
149
- удобнее `by-ids`, затем `GET /api/rsforms/:id/details` только для выбранных КС.
150
-
151
- ### Примеры curl
152
-
153
- Публичный поиск по термину (без авторизации):
154
-
155
- ```bash
156
- curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество"
157
- ```
158
-
159
- Только в названиях и шифрах:
160
-
161
- ```bash
162
- curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=логика&search_fields=title,alias"
163
- ```
164
-
165
- Только КС в общем разделе и подпапках:
166
-
167
- ```bash
168
- curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество&location=/S&subfolders=1&item_type=rsform"
169
- ```
170
-
171
- Типичный пайплайн агента — найти id, затем метаданные и при необходимости полную КС:
172
-
173
- ```bash
174
- # 1. Поиск
175
- curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество"
176
-
177
- # 2. Метаданные найденных объектов (подставь ids из шага 1)
178
- curl.exe -s "https://api.portal.acconcept.ru/api/library/by-ids?ids=856,1203"
179
-
180
- # 3. Полная КС для переноса в rstool (только для выбранной схемы)
181
- curl.exe -s "https://api.portal.acconcept.ru/api/rsforms/856/details"
182
- ```
183
-
184
- ## Формат `GET /api/rsforms/:id/details`
185
-
186
- Ответ содержит метаданные объекта библиотеки и массив `items[]` с конституентами.
187
- Для анализа КС обычно нужны только корневые `title`, `alias`, `description` и поля каждой конституенты.
188
-
189
- | Portal JSON | `rstool` | Примечание |
190
- | --------------------- | ------------------------ | ----------------------------------------------------- |
191
- | `id` | `draft.id` | Стабильный id внутри сессии |
192
- | `alias` | `draft.alias` | `X1`, `C1`, `S1`, `D1`, `F1`, `P1`, `A1`, `T1` |
193
- | `cst_type` | `draft.cstType` | Значения совпадают с `CstType` |
194
- | `definition_formal` | `draft.definitionFormal` | Пустая строка допустима только для `basic`/`constant` |
195
- | `term_raw` | `draft.term` | Для редактирования сохраняй raw, не resolved |
196
- | `definition_raw` | `draft.definitionText` | Для редактирования сохраняй raw, не resolved |
197
- | `convention` | `draft.convention` | Соглашение, не формальная проверка |
198
- | `term_resolved` | не переносить | Только отображение после resolver |
199
- | `definition_resolved` | не переносить | Только отображение после resolver |
200
- | `typification_manual` | обычно не переносить | Переопределение типизации |
201
- | `term_forms` | обычно не переносить | Словоформы термина |
202
- | `crucial` | обычно не переносить | UI/Portal-флаг |
203
- | `value_is_property` | обычно не переносить | Переопределение класса интерпретируемости |
204
-
205
- `inheritance`, `attribution`, `oss`, `models`, `versions`, `editors` полезны для контекста Portal, но не нужны для базовой проверки ЯРЭ в `rstool`.
206
-
207
- ## Как перенести КС в rstool
208
-
209
- 1. Получи `GET /api/rsforms/:id/details`.
210
- 2. Вызови `importData(JSON.stringify(payload))` — auto определит `portal-details`; для Load from JSON — `importData(payload, 'portal-schema')`.
211
- 3. Проверь `listDiagnostics()` (после `importData` сессия уже текущая).
212
- 4. Работай локально: анализ, правки, вычисления, маленькая КМ.
213
- 5. Для сохранения рабочей сессии используй `exportSession`.
214
- 6. Для загрузки схемы обратно в Portal используй `exportPortal({ kind: 'schema' })`.
215
-
216
- Альтернатива: `createSession` + `applySchemaPatch` с массивом `items`.
217
-
218
- Portal JSON из `/details` **не является** форматом `exportSession`; используй `importData`, не передавай его как session export.
219
-
220
- Минимальный импорт:
221
-
222
- ```ts
223
- const session = tool.importData(JSON.stringify(portal));
224
- tool.listDiagnostics();
225
- ```
226
-
227
- Пакетный маппинг через `applySchemaPatch`:
228
-
229
- ```ts
230
- const session = tool.createSession({
231
- title: portal.title,
232
- alias: portal.alias,
233
- comment: portal.description
234
- });
235
-
236
- tool.applySchemaPatch(
237
- {
238
- items: portal.items.map(item => ({
239
- id: item.id,
240
- alias: item.alias,
241
- cstType: item.cst_type,
242
- definitionFormal: item.definition_formal ?? '',
243
- term: item.term_raw ?? '',
244
- definitionText: item.definition_raw ?? '',
245
- convention: item.convention ?? ''
246
- }))
247
- },
248
- session.sessionId
249
- );
250
- ```
251
-
252
- ## Практика для агентов
253
-
254
- - Запрашивай API host, а не UI host: `https://api.portal.acconcept.ru/api/...`.
255
- - Считай, что REST без авторизации = только **публичные** схемы в `/S` и `/L`.
256
- - Для непубличной КС проси у пользователя JSON (`/details`) или публикацию схемы — не cookie.
257
- - Для больших схем используй увеличенный таймаут. В PowerShell вызывай `curl.exe`,
258
- а не alias `curl` (`Invoke-WebRequest`), если нужен CLI-синтаксис curl.
259
- - Сначала бери метаданные, если нужно только название или доступность схемы.
260
-
261
- ### Windows: кодировка в скриптах пайплайна
262
-
263
- На Windows консоль по умолчанию часто **cp1251**; Python `print` падает с `UnicodeEncodeError`
264
- на символах вне этой таблицы (стрелки `→`, математика в логах и т.п.). Если `print` стоит
265
- **до** следующего шага пайплайна (например вызова `npx tsx`), скрипт оборвётся и артефакт
266
- не обновится.
267
-
268
- - **Запись JSON** — всегда UTF-8; для символов ЯРЭ в формулах не экранируй Unicode в JSON:
269
-
270
- ```python
271
- path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding='utf-8')
272
- ```
273
-
274
- - **Чтение** — `encoding='utf-8'`; для fetch API предпочитай `urllib` / `requests`, не
275
- `Out-File` без явной UTF-8 в PowerShell.
276
- - **Логи в `print`** — ASCII (`->`, `...`) или только id/alias без математики; не полагайся
277
- на то, что консоль UTF-8.
278
- - При необходимости Unicode в stdout: `PYTHONIOENCODING=utf-8` или `sys.stdout.reconfigure(encoding='utf-8')`
279
- (Python 3.7+), но для агентских скриптов проще держать вывод в ASCII.
280
-
281
- ## Не делай
282
-
283
- - Не парси HTML SPA.
284
- - Не запрашивай UI напрямую, используй преобразованные API запросы.
285
- - Не предлагай авторизацию через session cookie или `sessionid` в curl.
286
- - Не передавай `/details` JSON в `importData` с `kind: 'session'`.
287
- - Не запрашивай `/details`, если нужны только метаданные.
3
+ Указатель. Portal — веб-приложение для КС, ОСС и моделей; `rstool` с REST не работает, агент получает JSON отдельно.
4
+
5
+ | Задача | Файл |
6
+ | :------------------------------------------------------------- | :------------------------------------- |
7
+ | Ссылка Portal → API, доступ и ключи, поиск, `/details`, импорт | [PORTAL-READ.md](PORTAL-READ.md) |
8
+ | Создать / заменить КС, версии, протокол публикации, лимиты | [PORTAL-PUBLISH.md](PORTAL-PUBLISH.md) |
9
+ | Интерпретации концептуальной модели | [PORTAL-MODELS.md](PORTAL-MODELS.md) |
10
+ | Граф ОСС: загрузки, синтезы, блоки | [PORTAL-OSS.md](PORTAL-OSS.md) |
11
+
12
+ Хосты: UI `https://portal.acconcept.ru/`, REST `https://api.portal.acconcept.ru/`. OpenAPI — `GET https://api.portal.acconcept.ru/schema`.
13
+
14
+ ## Маршруты агентов (`/api/agents`, Bearer API-ключ)
15
+
16
+ | Метод | Путь | Назначение |
17
+ | ----- | ---------------------------------------------- | ------------------------------------------------ |
18
+ | GET | `/api/agents/library/active` | Метаданные доступных объектов |
19
+ | GET | `/api/agents/library/context-search` | Поиск (те же query-параметры) |
20
+ | GET | `/api/agents/library/by-ids` | Метаданные по id |
21
+ | POST | `/api/agents/rsforms` | Создать КС |
22
+ | GET | `/api/agents/rsforms/:id/details` | Полная КС |
23
+ | PATCH | `/api/agents/rsforms/:id/replace` | Заменить содержимое (`exportPortal` / load-json) |
24
+ | POST | `/api/agents/rsforms/:id/create-version` | Снимок версии (owner/staff) |
25
+ | POST | `/api/agents/rsforms/:id/constituents` | Создать конституенту |
26
+ | PATCH | `/api/agents/rsforms/:id/constituents/:cst_id` | Обновить конституенту |
27
+ | POST | `/api/agents/rsforms/:id/constituents/delete` | Удалить список конституент |
28
+ | POST | `/api/agents/rsforms/:id/substitute` | Подстановка |
29
+ | PATCH | `/api/agents/rsforms/:id/move-cst` | Перемещение |
30
+ | GET | `/api/agents/models/:id/details` | Модель и текущие интерпретации |
31
+ | POST | `/api/agents/models/:id/set-value` | Записать интерпретации конституент |
32
+ | POST | `/api/agents/models/:id/clear-values` | Сбросить интерпретации списка конституент |
33
+ | POST | `/api/agents/models/:id/reset-all` | Сбросить все интерпретации модели |
34
+ | POST | `/api/agents/oss` | Создать пустую ОСС |
35
+ | GET | `/api/agents/oss/:id/details` | Граф ОСС: операции, блоки, аргументы, раскладка |
36
+ | \* | `/api/agents/oss/:id/<действие>` | Правка ОСС, см. [PORTAL-OSS.md](PORTAL-OSS.md) |
37
+
38
+ ## Репозиторий Portal
39
+
40
+ Исходники: [github.com/IRBorisov/ConceptPortal](https://github.com/IRBorisov/ConceptPortal) — backend `rsconcept/backend` (`apps.agents` — ключи и маршруты `/api/agents`), frontend `rsconcept/frontend`.
@@ -0,0 +1,24 @@
1
+ # Portal: интерпретации модели
2
+
3
+ Чтение и правка концептуальной модели (RSModel) на Portal через API-ключ. Карта маршрутов — [PORTAL-API.md](PORTAL-API.md).
4
+
5
+ ## Интерпретации модели
6
+
7
+ Тело совпадает с сессионными `/api/models/:id/set-value`, `clear-values` и `reset-all`.
8
+ Ответ — та же модель, что у `GET /api/agents/models/:id/details`: метаданные, `schema`
9
+ (id связанной КС) и `items[]` с полями `id`, `type`, `value`.
10
+
11
+ `target` и элементы `items` — id конституент **связанной** КС, не шифры. Чужая конституента
12
+ или модель без схемы → `400`. КС, переданная как id модели → `404`. Правка требует права
13
+ редактора; чтение — права читателя. Необязательный заголовок `X-Expected-Time-Update`
14
+ (значение `time_update` из предыдущего ответа) отклоняет устаревшую запись с `409`.
15
+
16
+ ```bash
17
+ curl.exe -s -H "Authorization: Bearer rcp_...." -H "Content-Type: application/json" ^
18
+ -d "[{\"target\": 1201, \"type\": \"basic\", \"data\": {\"1\": \"a\"}}]" ^
19
+ -X POST "https://api.portal.acconcept.ru/api/agents/models/900/set-value"
20
+ ```
21
+
22
+ `clear-values` принимает `{ "items": [1201, 1202] }`. `reset-all` — `POST` без тела.
23
+
24
+ Сначала прочитай `GET /api/agents/models/:id/details`, чтобы взять id связанной КС и id конституент. Проверку смысла схемы на данных удобнее делать локально в `rstool` (сценарии брифа); на Portal пиши уже проверенные интерпретации.
@@ -0,0 +1,56 @@
1
+ # Portal: правка ОСС
2
+
3
+ Граф операционной схемы синтеза (ОСС) через API-ключ. Карта маршрутов — [PORTAL-API.md](PORTAL-API.md); когда делить схему на микротеории и как отождествлять — [METHOD.md](METHOD.md) §«Синтез микротеорий».
4
+
5
+ ## Правка ОСС
6
+
7
+ Тела и HTTP-методы совпадают с сессионными `/api/oss/:id/<действие>`. Отличия:
8
+
9
+ - `layout` (раскладка графа) **необязателен**. Без него сервер берёт сохранённую раскладку,
10
+ а новые и перемещённые узлы ставит по тем же правилам, что UI.
11
+ - `position` новой операции или блока необязателен; можно передать только `{x, y}` —
12
+ размер узла подставится. Координаты абсолютные.
13
+ - В `create-block` можно опустить `children_operations` / `children_blocks`,
14
+ в `create-synthesis` — `substitutions` (по умолчанию пустые списки).
15
+ - `relocate-constituents` отвечает графом ОСС (сессионный маршрут — пустым `200`).
16
+
17
+ Все id в телах — числовые id, не шифры. Id операций и блоков бери из
18
+ `GET /api/agents/oss/:id/details` (`operations[].id`, `blocks[].id`), id КС-результатов —
19
+ из `operations[].result`. Id конституент для `relocate-constituents` и новых отождествлений
20
+ в `create-synthesis` бери из `GET /api/agents/rsforms/:id/details` нужной КС (`items[].id`);
21
+ уже заданные отождествления видны в `substitutions[]` деталей ОСС. Правка требует права
22
+ редактора ОСС; чтение — права читателя. Заголовок `X-Expected-Time-Update` отклоняет устаревшую запись с `409`.
23
+
24
+ | Метод | Действие | Тело (главное) | Ответ |
25
+ | ----- | ----------------------- | ---------------------------------------------------------------------------------------- | ---------------------- |
26
+ | PATCH | `update-layout` | `{ data: [{nodeID, x, y, width, height}] }` | ОСС |
27
+ | POST | `create-block` | `item_data{title, description, parent}`, `children_operations`, `children_blocks` | `{new_block, oss}` |
28
+ | PATCH | `update-block` | `target`, `item_data{title, description, parent}` | ОСС |
29
+ | PATCH | `delete-block` | `target` | ОСС |
30
+ | PATCH | `move-items` | `operations`, `blocks`, `destination` (id блока или `null`) | ОСС |
31
+ | POST | `create-schema` | `item_data{alias, title, description, parent}` — загрузка с новой пустой КС | `{new_operation, oss}` |
32
+ | POST | `import-schema` | `item_data`, `source` (id КС), `clone_source` (`true` — копия, `false` — ссылка) | `{new_operation, oss}` |
33
+ | POST | `clone-schema` | `source_operation` | `{new_operation, oss}` |
34
+ | POST | `create-replica` | `target` | `{new_operation, oss}` |
35
+ | POST | `create-synthesis` | `item_data`, `arguments` (id операций), `substitutions[{original, substitution}]` | `{new_operation, oss}` |
36
+ | PATCH | `update-operation` | `target`, `item_data{alias, title, description, parent}`, `arguments?`, `substitutions?` | ОСС |
37
+ | PATCH | `delete-operation` | `target`, `keep_constituents?`, `delete_schema?` | ОСС |
38
+ | PATCH | `delete-replica` | `target`, `keep_connections?`, `keep_constituents?` | ОСС |
39
+ | PATCH | `create-input` | `target` — пустая КС для загрузки без схемы | `{new_schema, oss}` |
40
+ | PATCH | `set-input` | `target`, `input` (id КС или `null`) | ОСС |
41
+ | POST | `execute-operation` | `target` — построить КС синтеза | ОСС |
42
+ | POST | `relocate-constituents` | `destination` (id КС), `items` (id конституент одной КС) | ОСС |
43
+
44
+ `create-synthesis` сразу строит КС синтеза. Отождествления — пары id конституент из КС
45
+ операций-аргументов: `original` удаляется, `substitution` остаётся. `import-schema` требует
46
+ права чтения исходной КС. `delete_schema: true` удаляет и КС-результат, если она лежит
47
+ в той же папке и у того же владельца, что ОСС.
48
+
49
+ ```bash
50
+ # Синтез из двух загрузок без раскладки: сервер поставит узел под аргументами
51
+ curl.exe -s -H "Authorization: Bearer rcp_...." -H "Content-Type: application/json" ^
52
+ -d "{\"item_data\": {\"alias\": \"S1\", \"title\": \"Синтез\", \"description\": \"\", \"parent\": null}, \"arguments\": [41, 42], \"substitutions\": [{\"original\": 1201, \"substitution\": 1305}]}" ^
53
+ -X POST "https://api.portal.acconcept.ru/api/agents/oss/77/create-synthesis"
54
+ ```
55
+
56
+ Сначала прочитай `GET /api/agents/oss/:id/details`: там id операций, блоков и КС-результатов (`result`). Раскладку не передавай, если не нужно ставить узлы в конкретные координаты.
@@ -0,0 +1,39 @@
1
+ # Portal: публикация схемы
2
+
3
+ Как записать КС из `rstool` в Portal от имени пользователя: создать, заменить содержимое, снять версию, править конституенты. Нужен API-ключ — [PORTAL-READ.md](PORTAL-READ.md) §«API-ключи». Карта маршрутов — [PORTAL-API.md](PORTAL-API.md).
4
+
5
+ ## Протокол публикации
6
+
7
+ 1. Прочитай текущую схему: `GET /api/agents/rsforms/:id/details` → `importData` (сессия-база) и запомни `time_update`.
8
+ 2. Сделай работу в отдельной сессии; проверь бриф (`check-brief` с `--base` на сессию-базу).
9
+ 3. Покажи пользователю сводку изменений относительно базы (добавлено, изменено, удалено, затронутые требования и решения) и получи подтверждение.
10
+ 4. Если есть права — `POST /api/agents/rsforms/:id/create-version`: снимок до замены.
11
+ 5. `PATCH /api/agents/rsforms/:id/replace` с JSON `exportPortal({ kind: 'schema' })`.
12
+ 6. Повторно прочитай `/details`, импортируй и сверь: число конституент, формулы, диагностики. Отчёт со ссылкой на схему в UI.
13
+
14
+ Гранулярные правки (`/constituents`, `substitute`, `move-cst`) уместны для одной-двух конституент; для пакета правок — `replace`.
15
+
16
+ ## Лимиты
17
+
18
+ Все ключи одного пользователя делят один бюджет. Счётчик лежит в базе, поэтому три воркера gunicorn не умножают лимит.
19
+
20
+ - Чтение (`GET`): 120 запросов в минуту. В журнал не пишется.
21
+ - Правки: 30 в минуту и 300 в час. Успех и ошибка `400` пишутся в журнал.
22
+ - Создание КС, `replace` и `create-version`: дополнительно не больше 15 раз в час.
23
+ Сюда же входят правки ОСС, которые создают КС: `POST /api/agents/oss`, `create-schema`,
24
+ `import-schema`, `clone-schema`, `create-synthesis`, `create-input`, `execute-operation`.
25
+ - Активных ключей у пользователя: не больше 5.
26
+ - `last_used_at` обновляется не чаще раза в минуту.
27
+
28
+ `429` значит, что бюджет этого окна кончился. Повторять тот же запрос в цикле бессмысленно: новые строки в базе от этого не появятся.
29
+
30
+ Управление ключами и журналом — только из сессии UI: `GET/POST /api/agents/keys`,
31
+ `PATCH /api/agents/keys/:id` (переименовать), `DELETE /api/agents/keys/:id`.
32
+ `GET /api/agents/logs?limit=&offset=` возвращает `{count, results}` (`limit` по умолчанию 50,
33
+ не больше 200). В строке есть `request_text`. Ключ этот маршрут не открывает.
34
+
35
+ ## Не делай
36
+
37
+ - Не заменяй схему без подтверждения пользователя и без сводки изменений.
38
+ - Не повторяй запрос в цикле после `429`.
39
+ - Не публикуй схему с блокерами `check-brief`, не сказав об этом пользователю.