@rsconcept/rstool 1.9.0 → 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.
- package/README.md +3 -3
- package/dist/mappers/model-adapter.d.ts +1 -2
- package/dist/mappers/schema-adapter.d.ts +1 -2
- package/dist/mappers/types.d.ts +4 -5
- package/dist/models/rstool-agent.js +1 -2
- package/dist/session/session-store.d.ts +3 -3
- package/dist/session/session-store.js +1 -2
- package/dist/wrapper/client.d.ts +3 -4
- package/docs/BRIEF.md +93 -0
- package/docs/CONCEPTUAL-SCHEMA.md +16 -1
- package/docs/CONSTRUCTIONS.md +14 -2
- package/docs/DIAGNOSTICS.md +3 -2
- package/docs/DOMAIN.md +12 -0
- package/docs/METHOD.md +208 -0
- package/docs/PORTAL-API.md +38 -285
- package/docs/PORTAL-MODELS.md +24 -0
- package/docs/PORTAL-OSS.md +56 -0
- package/docs/PORTAL-PUBLISH.md +39 -0
- package/docs/PORTAL-READ.md +301 -0
- package/docs/README.md +7 -4
- package/docs/REQUIREMENTS.md +61 -0
- package/docs/SYNTAX.md +4 -3
- package/docs/TYPIFICATION.md +1 -1
- package/docs/brief.schema.json +173 -0
- package/examples/README.md +16 -2
- package/examples/access-control/NOTES.md +23 -0
- package/examples/access-control/anti/collapsed.json +439 -0
- package/examples/access-control/anti/weakened.json +439 -0
- package/examples/access-control/brief-v1.json +231 -0
- package/examples/access-control/brief.json +310 -0
- package/examples/access-control/build-rsform.ts +151 -0
- package/examples/access-control/requirements-v1.md +9 -0
- package/examples/access-control/requirements-v2.md +4 -0
- package/examples/access-control/rsform-session-v1.json +439 -0
- package/examples/access-control/rsform-session.json +523 -0
- package/examples/audit-diagnostics.ts +9 -1
- package/examples/briefs.test.ts +126 -0
- package/examples/clinic-booking/NOTES.md +24 -0
- package/examples/clinic-booking/anti/collapsed.json +615 -0
- package/examples/clinic-booking/anti/species-as-genus.json +568 -0
- package/examples/clinic-booking/brief-v1.json +332 -0
- package/examples/clinic-booking/brief.json +405 -0
- package/examples/clinic-booking/build-rsform.ts +174 -0
- package/examples/clinic-booking/requirements-v1.md +9 -0
- package/examples/clinic-booking/requirements-v2.md +4 -0
- package/examples/clinic-booking/rsform-session-v1.json +615 -0
- package/examples/clinic-booking/rsform-session.json +700 -0
- package/examples/diagnostics-utils.ts +26 -0
- package/examples/kinship/brief.json +337 -0
- package/examples/kinship/build-rsform.ts +7 -4
- package/examples/kinship/rsform-session.json +20 -63
- package/examples/kinship/rsmodel-session.json +14 -14
- package/examples/kinship-subordination/NOTES.md +49 -0
- package/examples/kinship-subordination/brief.json +161 -0
- package/examples/kinship-subordination/build-rsform.ts +100 -0
- package/examples/kinship-subordination/rsform-session.json +795 -0
- package/examples/library-loans/NOTES.md +46 -0
- package/examples/library-loans/anti/collapsed.json +481 -0
- package/examples/library-loans/anti/species-as-genus.json +334 -0
- package/examples/library-loans/anti/uncovered.json +406 -0
- package/examples/library-loans/anti/weakened.json +464 -0
- package/examples/library-loans/brief-v1.json +340 -0
- package/examples/library-loans/brief.json +502 -0
- package/examples/library-loans/build-rsform.ts +239 -0
- package/examples/library-loans/requirements-v1.md +11 -0
- package/examples/library-loans/requirements-v2.md +5 -0
- package/examples/library-loans/rsform-session-v1.json +481 -0
- package/examples/library-loans/rsform-session.json +652 -0
- package/examples/library-loans/source-markup.md +18 -0
- package/examples/movd/brief.json +220 -0
- package/examples/movd/build-rsform.ts +5 -2
- package/examples/movd/rsform-session.json +14 -46
- package/examples/subordination/NOTES.md +59 -0
- package/examples/subordination/anti/collapsed.json +556 -0
- package/examples/subordination/anti/single-relation.json +125 -0
- package/examples/subordination/anti/transitive.json +573 -0
- package/examples/subordination/anti/weakened.json +539 -0
- package/examples/subordination/brief.json +386 -0
- package/examples/subordination/build-rsform.ts +63 -0
- package/examples/subordination/constants.ts +115 -0
- package/examples/subordination/rsform-session.json +556 -0
- package/examples/subordination/source-markup.md +19 -0
- package/examples/subordination/source.md +40 -0
- package/package.json +18 -10
- package/skills/INSTALL.md +28 -29
- package/skills/README.md +25 -10
- package/skills/rs-core/SKILL.md +56 -0
- package/skills/rs-explain/SKILL.md +28 -0
- package/skills/rs-explicate/SKILL.md +71 -0
- package/skills/rs-interpret/SKILL.md +67 -0
- package/skills/rs-portal/SKILL.md +51 -0
- package/skills/rs-review/SKILL.md +79 -0
- package/skills/rs-scope/SKILL.md +67 -0
- package/skills/rs-synthesis/SKILL.md +52 -0
- package/skills/rstool/SKILL.md +70 -0
- package/skills/rstool-helper/GUIDE.md +18 -299
- package/skills/rstool-helper/SKILL.md +8 -58
- package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +16 -12
- package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +7 -5
- package/skills/rstool-runtime/SKILL.md +96 -0
- package/skills/scripts/brief-check.test.ts +165 -0
- package/skills/scripts/brief-check.ts +826 -0
- package/skills/scripts/check-brief.ts +94 -0
- package/skills/scripts/rstool-skills.mjs +119 -0
- package/skills/scripts/skill-stubs.test.ts +48 -0
package/docs/PORTAL-API.md
CHANGED
|
@@ -1,287 +1,40 @@
|
|
|
1
1
|
# Portal REST API
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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`, не сказав об этом пользователю.
|