@rsconcept/rstool 1.6.0 → 1.7.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.
- package/README.md +5 -4
- package/dist/{agent-workflow-BTwrxOoX.d.ts → agent-workflow-BqEC_Foh.d.ts} +51 -7
- package/dist/{analysis-DA44pfgA.d.ts → analysis-C7GrmB17.d.ts} +3 -4
- package/dist/{common-D6TFl6l_.d.ts → common-oafVB-wX.d.ts} +1 -2
- package/dist/{constituenta-QY5w1x91.d.ts → constituenta-CwJogNKY.d.ts} +4 -5
- package/dist/{diagnostic-C6TRoBgt.d.ts → diagnostic-CtxXifJY.d.ts} +8 -6
- package/dist/{diagnostic-assembly-B-6vIA5I.js → diagnostic-assembly-B-r0NyHL.js} +3 -2
- package/dist/diagnostic-assembly-B-r0NyHL.js.map +1 -0
- package/dist/{evaluation-Cd4S7-3t.d.ts → evaluation-BHv2xNwf.d.ts} +3 -4
- package/dist/index.d.ts +12 -11
- package/dist/index.js +1 -1
- package/dist/mappers/model-adapter.d.ts +4 -4
- package/dist/mappers/model-adapter.js +1 -1
- package/dist/mappers/schema-adapter.d.ts +5 -5
- package/dist/mappers/types.d.ts +5 -4
- package/dist/mappers/types.js +1 -1
- package/dist/mappers/types.js.map +1 -1
- package/dist/{model-value-BUhr2IjA.d.ts → model-value-C0QA-ji2.d.ts} +2 -3
- package/dist/models/agent-workflow.d.ts +2 -2
- package/dist/models/analysis.d.ts +1 -1
- package/dist/models/common.d.ts +1 -1
- package/dist/models/constituenta.d.ts +1 -1
- package/dist/models/diagnostic.d.ts +1 -1
- package/dist/models/diagnostic.js +1 -1
- package/dist/models/evaluation.d.ts +1 -1
- package/dist/models/index.d.ts +11 -11
- package/dist/models/index.js +1 -1
- package/dist/models/model-value.d.ts +1 -1
- package/dist/models/rstool-agent.d.ts +1 -1
- package/dist/models/rstool-agent.js +1 -1
- package/dist/models/session.d.ts +1 -1
- package/dist/models/tool-contract.d.ts +1 -1
- package/dist/models/tool-contract.js +1 -1
- package/dist/models/tool-contract.js.map +1 -1
- package/dist/{models-LMyDB0md.js → models-DG2uTaV_.js} +117 -4
- package/dist/models-DG2uTaV_.js.map +1 -0
- package/dist/{rstool-agent-BrAFJcoE.d.ts → rstool-agent-DLq0mtym.d.ts} +13 -10
- package/dist/session/session-store.d.ts +3 -2
- package/dist/session/session-store.js +1 -1
- package/dist/{session-CI4rLYby.d.ts → session-OaLqLq0H.d.ts} +3 -4
- package/dist/{tool-contract-BUaDRHoO.d.ts → tool-contract-ZVyh7hhp.d.ts} +15 -11
- package/dist/wrapper/stdio-wrapper.js +8 -2
- package/dist/wrapper/stdio-wrapper.js.map +1 -1
- package/docs/DIAGNOSTICS.md +64 -22
- package/docs/DOMAIN.md +16 -4
- package/docs/README.md +1 -1
- package/examples/diagnostics-utils.ts +3 -4
- package/package.json +6 -6
- package/skills/rstool-helper/EXAMPLES.md +25 -0
- package/skills/rstool-helper/GUIDE.md +5 -4
- package/skills/rstool-helper/REFERENCE.md +52 -21
- package/skills/rstool-helper/SKILL.md +1 -1
- package/src/index.ts +4 -1
- package/src/mappers/diagnostic-assembly.ts +9 -6
- package/src/mappers/types.ts +1 -0
- package/src/models/agent-workflow.ts +45 -0
- package/src/models/index.ts +5 -9
- package/src/models/rstool-agent.test.ts +62 -0
- package/src/models/rstool-agent.ts +160 -2
- package/src/models/tool-contract.ts +10 -2
- package/src/wrapper/stdio-handler.ts +8 -1
- package/dist/diagnostic-assembly-B-6vIA5I.js.map +0 -1
- package/dist/models-LMyDB0md.js.map +0 -1
package/docs/DIAGNOSTICS.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Диагностика
|
|
2
2
|
|
|
3
3
|
Читай, когда `analyzeExpression`, `applySchemaPatch`, `listDiagnostics` или `evaluate`
|
|
4
|
-
вернули диагностику. Коды ошибок ЯРЭ — `RSErrorCode` в `@rsconcept/domain`; коды
|
|
5
|
-
и
|
|
4
|
+
вернули диагностику. Коды ошибок ЯРЭ — `RSErrorCode` в `@rsconcept/domain`; коды схемы,
|
|
5
|
+
модели и таблицы отождествлений — `RSDiagnosticCode` в том же пакете (числовой формат совпадает;
|
|
6
|
+
`SubstitutionErrorType` — алиасы кодов отождествлений).
|
|
6
7
|
|
|
7
8
|
## Формы диагностики
|
|
8
9
|
|
|
@@ -23,9 +24,30 @@
|
|
|
23
24
|
| `alias?` | обозначение конституенты |
|
|
24
25
|
| `expression` | текст формулы или затронутого поля |
|
|
25
26
|
| `from`, `to` | полуинтервал `[from, to)` в `expression` |
|
|
27
|
+
| `stack?` | цепочка вызовов при ошибке внутри тела `F#`/`P#` (см. ниже) |
|
|
26
28
|
|
|
27
29
|
Фильтры `listDiagnostics({ kind, constituentId, severity })`.
|
|
28
30
|
|
|
31
|
+
### Стек вызовов (`stack`)
|
|
32
|
+
|
|
33
|
+
При вычислении ошибки внутри вызванной терм-/предикат-функции (`E81xx` и любые
|
|
34
|
+
runtime-ошибки в теле `F#`/`P#`) диагностика несёт `stack` — кадры от места сбоя
|
|
35
|
+
наружу. Если ошибки нет в вызове (сбой в самом корневом выражении) — `stack`
|
|
36
|
+
отсутствует:
|
|
37
|
+
|
|
38
|
+
| Поле | Смысл |
|
|
39
|
+
| ------------ | ---------------------------------------- |
|
|
40
|
+
| `alias` | конституента, в чьей формуле лежит span |
|
|
41
|
+
| `from`, `to` | полуинтервал в формуле этой конституенты |
|
|
42
|
+
|
|
43
|
+
Порядок: **сначала место ошибки**, затем call site во внешнем вызывающем, …
|
|
44
|
+
Корневое выражение в стек не входит: его call site — в `from`/`to` самой
|
|
45
|
+
диагностики (подсветка в редакторе). Пример `F7[X1]` → `F8[…]` → `debool`:
|
|
46
|
+
`stack[0] = { alias: 'F8', … }`, `stack[1] = { alias: 'F7', … }`, а
|
|
47
|
+
корневой `F7[X1]` — только в `from`/`to`.
|
|
48
|
+
|
|
49
|
+
Форматирование для людей: `formatEvalCallStack` из `@rsconcept/domain` → `F7 → F8`.
|
|
50
|
+
|
|
29
51
|
## Где лежит диагностика
|
|
30
52
|
|
|
31
53
|
Три категории (`kind`), собранные в `listDiagnostics` после `applySchemaPatch`,
|
|
@@ -39,17 +61,36 @@
|
|
|
39
61
|
|
|
40
62
|
## Схема (Portal)
|
|
41
63
|
|
|
42
|
-
| Код | Имя | `params` | Исправление
|
|
43
|
-
| -------- | ------------------------- | -------------------- |
|
|
44
|
-
| `0x8901` | `schemaHomonym` | `[aliases]` | Термин совпадает с другими конституентами (`aliases` через запятую). Переименуй термин.
|
|
45
|
-
| `0x8902` | `schemaFormalDuplicate` | `[aliases]` | Нормализованная формула совпадает с `aliases`. Объедини или различай определения.
|
|
46
|
-
| `0x8903` | `schemaMissingConvention` | — | У `basic`/`constant`/`structure` нужна конвенция.
|
|
47
|
-
| `0x8904` | `schemaMissingTerm` | — | У неопределяемого понятия нужен термин.
|
|
48
|
-
| `0x8905` | `schemaTypeMismatch` | `[manual, computed]` | расхождение ручной и вычисленной типизации.
|
|
49
|
-
| `0x8906` | `schemaDependencyCycle` | `[cycle]` | Круг в графе определений (`F3 → P1 → F3`). Разорви цикл: убери взаимные ссылки.
|
|
64
|
+
| Код | Имя | `params` | Исправление |
|
|
65
|
+
| -------- | ------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
66
|
+
| `0x8901` | `schemaHomonym` | `[aliases]` | Термин совпадает с другими конституентами (`aliases` через запятую). Переименуй термин. |
|
|
67
|
+
| `0x8902` | `schemaFormalDuplicate` | `[aliases]` | Нормализованная формула совпадает с `aliases`. Объедини или различай определения. |
|
|
68
|
+
| `0x8903` | `schemaMissingConvention` | — | У `basic`/`constant`/`structure` нужна конвенция. |
|
|
69
|
+
| `0x8904` | `schemaMissingTerm` | — | У неопределяемого понятия нужен термин. |
|
|
70
|
+
| `0x8905` | `schemaTypeMismatch` | `[manual, computed]` | расхождение ручной и вычисленной типизации. |
|
|
71
|
+
| `0x8906` | `schemaDependencyCycle` | `[cycle]` | Круг в графе определений (`F3 → P1 → F3`). Разорви цикл: убери взаимные ссылки. Тот же код — у таблицы отождествлений после применения подстановок. |
|
|
50
72
|
|
|
51
73
|
Поле `params` для омонимов/дубликатов — `[aliases]` (строка с alias через запятую).
|
|
52
74
|
|
|
75
|
+
## Таблица отождествлений
|
|
76
|
+
|
|
77
|
+
Коды в том же пространстве, что `RSDiagnosticCode` / `RSErrorCode`. Короткие имена `SubstitutionErrorType.*` — алиасы. Логический круг в определениях — **`schemaDependencyCycle` (`0x8906`)**, не отдельный код.
|
|
78
|
+
|
|
79
|
+
| Код | Имя | `params` | Исправление |
|
|
80
|
+
| -------- | --------------------------------- | -------------- | ------------------------------------------------------------------ |
|
|
81
|
+
| `0x8920` | `substitutionInvalidIDs` | — | Некорректные id схем/конституент в таблице. |
|
|
82
|
+
| `0x8921` | `substitutionIncorrectCst` | `[from, to]` | У одной из пары некорректное выражение. |
|
|
83
|
+
| `0x8922` | `substitutionInvalidClasses` | `[from, to]` | Классы конституент несовместимы для отождествления. |
|
|
84
|
+
| `0x8923` | `substitutionInvalidBasic` | `[from, to]` | Нельзя заменять структурное понятие базисным множеством. |
|
|
85
|
+
| `0x8924` | `substitutionInvalidConstant` | `[from, to]` | Константное множество только вместо другого константного. |
|
|
86
|
+
| `0x8925` | `substitutionTypificationCycle` | `[detail]` | Цикл подстановок в типизациях. |
|
|
87
|
+
| `0x8926` | `substitutionBaseNotSet` | `[from, type]` | Типизация замещающей не задаёт множество. |
|
|
88
|
+
| `0x8927` | `substitutionUnequalTypification` | `[from, to]` | Типизации операндов не совпадают с учётом таблицы. |
|
|
89
|
+
| `0x2928` | `substitutionUnequalExpressions` | `[from, to]` | Предупреждение: формальные определения различаются (не блокирует). |
|
|
90
|
+
| `0x8929` | `substitutionUnequalArgsCount` | `[from, to]` | Число аргументов параметризованных конституент не совпадает. |
|
|
91
|
+
| `0x892A` | `substitutionUnequalArgs` | `[from, to]` | Типизации аргументов не совпадают. |
|
|
92
|
+
| `0x892B` | `substitutionInvalidNominal` | `[from, to]` | Номиноид только вместо другого номиноида. |
|
|
93
|
+
|
|
53
94
|
## Модель (Portal)
|
|
54
95
|
|
|
55
96
|
Статусы соответствуют фильтру «проблемы модели» в UI (`isModelIssue`).
|
|
@@ -77,7 +118,8 @@
|
|
|
77
118
|
|
|
78
119
|
- Диапазоны: `0x84xx` — parser (синтаксис, скобки), `0x88xx` — semantic (типизация, область
|
|
79
120
|
видимости, структура, схема, отсутствие значения), `0x81xx` — evaluation (вычисление КМ),
|
|
80
|
-
|
|
121
|
+
`0x89xx` — schema / model / substitution diagnostics (`RSDiagnosticCode`),
|
|
122
|
+
- `0x2xxx` — предупреждения (не блокируют, `isCritical` возвращает `false`; в т.ч. `0x2928` unequalExpressions).
|
|
81
123
|
|
|
82
124
|
## Parser
|
|
83
125
|
|
|
@@ -177,17 +219,17 @@
|
|
|
177
219
|
|
|
178
220
|
## Вычисление КМ
|
|
179
221
|
|
|
180
|
-
| Код | Имя | `params` | Исправление
|
|
181
|
-
| -------- | ------------------------- | ------------------ |
|
|
182
|
-
| `0x8100` | `calcUnknownError` | — | Непредвиденная ошибка вычисления.
|
|
183
|
-
| `0x8101` | `setOverflow` | `[limit]` | Превышен предел числа элементов `limit`: упрости выражение или данные.
|
|
184
|
-
| `0x8102` | `booleanBaseLimit` | `[limit]` | Превышен предел базы степенного множества `limit`.
|
|
185
|
-
| `0x8103` | `calcGlobalMissing` | `[name]` | Нет значения для `name`: задай через `setModelValues`.
|
|
186
|
-
| `0x8104` | `iterationsLimit` | `[limit]` | Превышен предел итераций `limit`.
|
|
187
|
-
| `0x8105` | `calcInvalidDebool` | — | `debool` получил не синглетон.
|
|
188
|
-
| `0x8106` | `iterateInfinity` | — | Итерация по бесконечному множеству.
|
|
189
|
-
| `0x8107` | `calculationNotSupported` | — | Объявление функции не подразумевает вычисления.
|
|
190
|
-
| `0x8108` | `calcInvalidData` | `[a, b, operator]` | Несовместимые значения `a` и `b` для `operator` в runtime.
|
|
222
|
+
| Код | Имя | `params` | Исправление |
|
|
223
|
+
| -------- | ------------------------- | ------------------ | -------------------------------------------------------------------------------------- |
|
|
224
|
+
| `0x8100` | `calcUnknownError` | — | Непредвиденная ошибка вычисления. |
|
|
225
|
+
| `0x8101` | `setOverflow` | `[limit]` | Превышен предел числа элементов `limit`: упрости выражение или данные. |
|
|
226
|
+
| `0x8102` | `booleanBaseLimit` | `[limit]` | Превышен предел базы степенного множества `limit`. |
|
|
227
|
+
| `0x8103` | `calcGlobalMissing` | `[name]` | Нет значения для `name`: задай через `setModelValues`. |
|
|
228
|
+
| `0x8104` | `iterationsLimit` | `[limit]` | Превышен предел итераций `limit`. |
|
|
229
|
+
| `0x8105` | `calcInvalidDebool` | — | `debool` получил не синглетон. Смотри `stack`, если в исходном выражении нет `debool`. |
|
|
230
|
+
| `0x8106` | `iterateInfinity` | — | Итерация по бесконечному множеству. |
|
|
231
|
+
| `0x8107` | `calculationNotSupported` | — | Объявление функции не подразумевает вычисления. |
|
|
232
|
+
| `0x8108` | `calcInvalidData` | `[a, b, operator]` | Несовместимые значения `a` и `b` для `operator` в runtime. |
|
|
191
233
|
|
|
192
234
|
## Цикл исправления
|
|
193
235
|
|
package/docs/DOMAIN.md
CHANGED
|
@@ -55,10 +55,18 @@
|
|
|
55
55
|
- **Основание** — конституента, из которой формально порождают новые термы.
|
|
56
56
|
- **Порожденная конституента** — построена из основания без новой предметной договоренности.
|
|
57
57
|
|
|
58
|
-
##
|
|
58
|
+
## Синтез
|
|
59
59
|
|
|
60
|
+
- **Синтез** — общее название операций объединения концептуальных схем через таблицу отождествлений.
|
|
61
|
+
- **Встраивание** — вставка конституент одной КС в другую (с опциональной таблицей отождествлений). В Portal UI — «Встраивание схемы»; в rstool — метод `synthesize`.
|
|
62
|
+
- **Отождествление** — замена одной конституенты другой по таблице отождествлений.
|
|
63
|
+
- Валидация таблицы отождествлений (`SubstitutionValidator`) проверяет, среди прочего: совместимость классов/типизаций, **цикл подстановок в типизациях** (через **базисные** и **константные множества** в типизациях конституент, **отличных от** базисных/константных), и **логический круг в формальных определениях** после применения таблицы.
|
|
64
|
+
|
|
65
|
+
## ОСС
|
|
66
|
+
|
|
67
|
+
- **Операционная схема синтеза (`ОСС`)** — граф загрузок и синтезов КС.
|
|
60
68
|
- **Загрузка** добавляет внешнюю или собственную КС в ОСС.
|
|
61
|
-
-
|
|
69
|
+
- **Синтез (операция ОСС)** строит новую КС из операций-аргументов через таблицу отождествлений.
|
|
62
70
|
- **Наследованные конституенты** пришли из исходных схем; их определения обычно read-only.
|
|
63
71
|
- **Сквозные изменения** идут от исходной конституенты к наследникам.
|
|
64
72
|
- **Ромбовидный синтез** использует КС с общими предками; чаще требует ручного отождествления дублей.
|
|
@@ -66,13 +74,17 @@
|
|
|
66
74
|
|
|
67
75
|
### Термины: не путать (для агентов)
|
|
68
76
|
|
|
69
|
-
В ответах пользователю и в конвенциях КС используй только термины из этого файла. Не вводи собственные ярлыки («базис», «базисный слой», «каркас схемы») — они не закреплены в Portal и размывают различия ниже.
|
|
77
|
+
В ответах пользователю и в конвенциях КС используй только термины из этого файла. Не вводи собственные ярлыки («базис», «базисы», «базисный слой», «базовые понятия», «каркас схемы») — они не закреплены в Portal и размывают различия ниже.
|
|
78
|
+
|
|
79
|
+
Источник термина **«базисное множество»** — строка типа `X#` в таблице конституент ниже и в [CONSTITUENTA.md](CONSTITUENTA.md) / [BASE-SELECTION.md](BASE-SELECTION.md). Не сокращай до «базис» / «базисы».
|
|
70
80
|
|
|
71
81
|
| Не используй | Используй | Почему |
|
|
72
82
|
| :------------------------------------------------------ | :------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- |
|
|
73
|
-
| «базис», «базисный слой», «первый слой»
|
|
83
|
+
| «базис», «базисы», «базисный слой», «первый слой» | **неопределяемые понятия** — `X#`, `C#`, `S#` | Общий термин для всего неопределяемого слоя |
|
|
84
|
+
| «базовые понятия» | **неопределяемые понятия** | «базовые» смешивается с базисными множествами |
|
|
74
85
|
| «базис» / «базисное» про `C#` или `S#` | **константное множество** (`C#`), **родовая структура** (`S#`) | **Базисное множество** — только про `X#` |
|
|
75
86
|
| «базисные множества» как синоним неопределяемых понятий | **базисные множества** — только несколько `X#`; для всего слоя — **неопределяемые понятия** | `C#` и `S#` базисными множествами не называются |
|
|
87
|
+
| «не базисные» без уточнения | **конституенты, отличные от базисных и константных множеств** (или тип: терм, `F#`, …) | Иначе путается с «не базисные множества» как классом vs отрицанием |
|
|
76
88
|
| «ядро» = неопределяемые понятия» | **ядро КС** — неопределяемые понятия плюс аксиомы и производные, нужные для аксиом | Ядро шире, чем только `X#` / `C#` / `S#` |
|
|
77
89
|
| теорема про `T#` | **высказывание** — производное логическое выражение `T#` | тип теорема на Portal отсутствует и вводит в заблуждение |
|
|
78
90
|
| «пропущенная конституента `R1`» в списке схемы | **радикал** `R#` — параметр шаблона в домене `F#` / `P#` | `R#` не объявляется; при ревью КС отсутствие `R1` среди конституент — норма |
|
package/docs/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## Какой файл читать
|
|
8
8
|
|
|
9
|
-
- **DOMAIN.md** — термины Portal: конституента, неопределяемые и производные понятия, ядро/тело КС, интерпретация,
|
|
9
|
+
- **DOMAIN.md** — термины Portal: конституента, неопределяемые и производные понятия, ядро/тело КС, интерпретация, синтез / встраивание, ОСС.
|
|
10
10
|
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем (в т.ч. терм-функция вместо множества пар).
|
|
11
11
|
- **CONSTITUENTA.md** — структура и правила конституент.
|
|
12
12
|
- **BASE-SELECTION.md** — выбор основания: `X#`, `C#` или `Z`.
|
|
@@ -5,10 +5,9 @@ export type ExampleDiagnostic = Diagnostic;
|
|
|
5
5
|
export function formatDiagnostics(diags: ExampleDiagnostic[], aliasById?: ReadonlyMap<number, string>): string {
|
|
6
6
|
return diags
|
|
7
7
|
.map(d => {
|
|
8
|
-
const alias =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return `[${d.kind}] ${alias} ${d.name} ${JSON.stringify(d.params ?? [])}`;
|
|
8
|
+
const alias = d.alias ?? (d.constituentId !== undefined ? (aliasById?.get(d.constituentId) ?? '?') : '(scratch)');
|
|
9
|
+
const stack = d.stack && d.stack.length > 0 ? ` stack=${d.stack.map(frame => frame.alias).join('←')}` : '';
|
|
10
|
+
return `[${d.kind}] ${alias} ${d.name} ${JSON.stringify(d.params ?? [])}${stack}`;
|
|
12
11
|
})
|
|
13
12
|
.join('\n');
|
|
14
13
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/rstool",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "IRBorisov",
|
|
@@ -75,13 +75,13 @@
|
|
|
75
75
|
"@rsconcept/domain": "workspace:*"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@types/node": "^26.1.
|
|
79
|
-
"@vitest/coverage-v8": "^4.1.
|
|
80
|
-
"tsdown": "^0.22.
|
|
81
|
-
"tsx": "^4.
|
|
78
|
+
"@types/node": "^26.1.1",
|
|
79
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
80
|
+
"tsdown": "^0.22.4",
|
|
81
|
+
"tsx": "^4.23.0",
|
|
82
82
|
"typescript": "^6.0.3",
|
|
83
83
|
"unrun": "^0.3.1",
|
|
84
|
-
"vitest": "^4.1.
|
|
84
|
+
"vitest": "^4.1.10"
|
|
85
85
|
},
|
|
86
86
|
"publishConfig": {
|
|
87
87
|
"access": "public"
|
|
@@ -255,6 +255,31 @@ const forPortal = tool.exportPortal({ kind: 'schema' });
|
|
|
255
255
|
|
|
256
256
|
Не передавай `/details` с `kind: 'session'`. REST и curl — [PORTAL-API.md](../../docs/PORTAL-API.md).
|
|
257
257
|
|
|
258
|
+
## Встраивание схемы (синтез)
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
const receiver = tool.createSession({ title: 'Base' });
|
|
262
|
+
tool.applySchemaPatch({ items: [{ alias: 'X1', term: 'человек' }] }, receiver.sessionId);
|
|
263
|
+
|
|
264
|
+
const source = tool.createSession({ title: 'Donor' });
|
|
265
|
+
tool.applySchemaPatch(
|
|
266
|
+
{
|
|
267
|
+
items: [
|
|
268
|
+
{ alias: 'X1', term: 'персона' },
|
|
269
|
+
{ alias: 'S1', definitionFormal: 'ℬ(X1)' }
|
|
270
|
+
]
|
|
271
|
+
},
|
|
272
|
+
source.sessionId
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
tool.setCurrentSession(receiver.sessionId);
|
|
276
|
+
tool.synthesize({
|
|
277
|
+
sourceSessionId: source.sessionId,
|
|
278
|
+
substitutions: [{ original: 'X1', substitution: 'X1' }] // source X1 → receiver X1
|
|
279
|
+
});
|
|
280
|
+
// receiver: X1 (человек), S1 = ℬ(X1) — импортированный X1 отождествлён и удалён
|
|
281
|
+
```
|
|
282
|
+
|
|
258
283
|
## Образец текста ревью (не код)
|
|
259
284
|
|
|
260
285
|
После [воркфлоу ревью](GUIDE.md#ревью--оценка-готовой-кс) ответ может выглядеть так:
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
## Быстрый контракт для агента
|
|
16
16
|
|
|
17
|
-
- Library API: `tool.applySchemaPatch(input, sessionId?)` —
|
|
17
|
+
- Library API: `tool.applySchemaPatch(input, sessionId?)` — основной путь правки схемы; `synthesize` — встраивание конституент из другой сессии (синтез с таблицей отождествлений).
|
|
18
18
|
- Stdio/MCP: **плоские** `params` — поля метода и optional `sessionId` на одном уровне (без `params.input`).
|
|
19
19
|
- Состояние: `getSessionState()` (summary) или `getSessionState('full')`.
|
|
20
20
|
- Импорт/экспорт Portal: `importData`, `exportPortal({ kind })`.
|
|
@@ -150,8 +150,8 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
|
|
|
150
150
|
|
|
151
151
|
1. Вызови `listDiagnostics()` — смотри `kind`: `expression` (формула), `schema` (омонимы, дубликаты, термин/конвенция), `model` (интерпретация).
|
|
152
152
|
2. Для черновика формулы — `analyzeExpression` (без сохранения).
|
|
153
|
-
3. Прочитай `name`, `severity`, `alias`, `from`, `to`, `params` в `analysis.diagnostics` или через `listDiagnostics({ kind })`.
|
|
154
|
-
4. Сопоставь `name` (или `code`) с исправлением в [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md).
|
|
153
|
+
3. Прочитай `name`, `severity`, `alias`, `from`, `to`, `params`, при вычислении — ещё `stack` (цепочка `F#`/`P#`, см. [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)), в `analysis.diagnostics` или через `listDiagnostics({ kind })`.
|
|
154
|
+
4. Сопоставь `name` (или `code`) с исправлением в [DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md). Для runtime-ошибок внутри вызова смотри `stack[0]` — там реальный locus, а не только call site в корневом выражении.
|
|
155
155
|
5. Исправь именно диапазон в `definitionFormal` (expression) или метаданные/данные модели (schema/model).
|
|
156
156
|
6. Не повторяй вызов без изменения ввода.
|
|
157
157
|
7. После успеха — ещё один `applySchemaPatch` / `setModelValues` с исправлением.
|
|
@@ -225,6 +225,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
|
|
|
225
225
|
| `convention` | конвенция |
|
|
226
226
|
| `comment` | комментарий |
|
|
227
227
|
| `applySchemaPatch` | правка схемы |
|
|
228
|
+
| `synthesize` | встраивание / синтез схем |
|
|
228
229
|
| `analyzeExpression` | проверка / анализ выражения |
|
|
229
230
|
| `listDiagnostics`, `diagnostics` | диагностики |
|
|
230
231
|
| `setModelValues`, `getModelState` | интерпретация, значения модели |
|
|
@@ -251,7 +252,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
|
|
|
251
252
|
- [ ] Схема проверена; ошибки исправлены.
|
|
252
253
|
- [ ] Диагностики обработаны до фиксации шага и экспорта.
|
|
253
254
|
- [ ] В тексте ответа нет английских имён полей и методов API — использованы термины из раздела [Язык ответа](#язык-ответа).
|
|
254
|
-
- [ ] Нет неофициальных ярлыков («базис», «базисный
|
|
255
|
+
- [ ] Нет неофициальных ярлыков («базис», «базисы», «базисный слой», «базовые понятия») — термины КС из [DOMAIN.md](../../docs/DOMAIN.md), раздел **«Термины: не путать»**. Для `X#` говори **базисное множество**, не «базис».
|
|
255
256
|
|
|
256
257
|
### Ревью концептуальной схемы
|
|
257
258
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
## Контракт rstool
|
|
6
6
|
|
|
7
7
|
- Пакет: `@rsconcept/rstool`
|
|
8
|
-
- Версия контракта: `3.
|
|
8
|
+
- Версия контракта: `3.3.0` (`CONTRACT_VERSION`)
|
|
9
9
|
- Основной класс: `RSToolAgent`
|
|
10
10
|
- Публичные импорты: `@rsconcept/rstool` и `@rsconcept/rstool/wrapper`
|
|
11
11
|
- Опции: `new RSToolAgent({ persistenceDir? })` — каталог для сохранения сессий между перезапусками (stdio/MCP: `RSTOOL_PERSISTENCE_DIR`)
|
|
@@ -14,25 +14,26 @@
|
|
|
14
14
|
|
|
15
15
|
### Методы library API
|
|
16
16
|
|
|
17
|
-
| Метод | Назначение
|
|
18
|
-
| ---------------------------------------------- |
|
|
19
|
-
| `ensureSession(initial?)` | Вернуть текущую сессию или создать новую
|
|
20
|
-
| `createSession(initial?)` | Новая in-memory сессия (становится текущей)
|
|
21
|
-
| `getCurrentSession()` | Текущая активная сессия или `null`
|
|
22
|
-
| `setCurrentSession(sessionId)` | Сделать сессию текущей
|
|
23
|
-
| `applySchemaPatch(input, sessionId?)` | Единственный путь правки схемы
|
|
24
|
-
| `getSessionState(detail?, sessionId?)` | `summary` (default) или `full`
|
|
25
|
-
| `listDiagnostics(filters?, sessionId?)` | Активные диагностики
|
|
26
|
-
| `analyzeExpression(input, sessionId?)` | Разбор без сохранения
|
|
27
|
-
| `commitStep(message?, sessionId?)` | Ревизия
|
|
28
|
-
| `exportSession(sessionId?)` | JSON-строка сессии
|
|
29
|
-
| `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON
|
|
30
|
-
| `importData(payload, kind?)` | Импорт сессии / Portal
|
|
31
|
-
| `setModelValues({ set?, clear? }, sessionId?)` | Значения модели (**async** — `await`)
|
|
32
|
-
| `getModelState(sessionId?)` | Состояние интерпретации
|
|
33
|
-
| `evaluate(input, sessionId?)` | Scratch или конституента
|
|
34
|
-
| `recalculateModel(sessionId?)` | Пересчёт производных
|
|
35
|
-
| `restoreOrder(sessionId?)` | Упорядочить конституенты (топология + семантика)
|
|
17
|
+
| Метод | Назначение |
|
|
18
|
+
| ---------------------------------------------- | ------------------------------------------------------------------ |
|
|
19
|
+
| `ensureSession(initial?)` | Вернуть текущую сессию или создать новую |
|
|
20
|
+
| `createSession(initial?)` | Новая in-memory сессия (становится текущей) |
|
|
21
|
+
| `getCurrentSession()` | Текущая активная сессия или `null` |
|
|
22
|
+
| `setCurrentSession(sessionId)` | Сделать сессию текущей |
|
|
23
|
+
| `applySchemaPatch(input, sessionId?)` | Единственный путь правки схемы |
|
|
24
|
+
| `getSessionState(detail?, sessionId?)` | `summary` (default) или `full` |
|
|
25
|
+
| `listDiagnostics(filters?, sessionId?)` | Активные диагностики |
|
|
26
|
+
| `analyzeExpression(input, sessionId?)` | Разбор без сохранения |
|
|
27
|
+
| `commitStep(message?, sessionId?)` | Ревизия |
|
|
28
|
+
| `exportSession(sessionId?)` | JSON-строка сессии |
|
|
29
|
+
| `exportPortal({ kind, format? }, sessionId?)` | Portal Load from JSON |
|
|
30
|
+
| `importData(payload, kind?)` | Импорт сессии / Portal |
|
|
31
|
+
| `setModelValues({ set?, clear? }, sessionId?)` | Значения модели (**async** — `await`) |
|
|
32
|
+
| `getModelState(sessionId?)` | Состояние интерпретации |
|
|
33
|
+
| `evaluate(input, sessionId?)` | Scratch или конституента |
|
|
34
|
+
| `recalculateModel(sessionId?)` | Пересчёт производных |
|
|
35
|
+
| `restoreOrder(sessionId?)` | Упорядочить конституенты (топология + семантика) |
|
|
36
|
+
| `synthesize(input, sessionId?)` | Синтез (встраивание): слить другую сессию + таблица отождествлений |
|
|
36
37
|
|
|
37
38
|
Служебные (stdio / MCP): `ping` / `pong`+`contractVersion`; `methods` / `list_methods`.
|
|
38
39
|
|
|
@@ -61,6 +62,7 @@ Stdio использует **camelCase** имён методов (как library
|
|
|
61
62
|
| `evaluate` | `evaluate` |
|
|
62
63
|
| `recalculateModel` | `recalculate_model` |
|
|
63
64
|
| `restoreOrder` | `restore_order` |
|
|
65
|
+
| `synthesize` | `synthesize` |
|
|
64
66
|
|
|
65
67
|
## `applySchemaPatch`
|
|
66
68
|
|
|
@@ -114,7 +116,7 @@ tool.listDiagnostics({ kind: 'schema', constituentId: 3, severity: 'error' });
|
|
|
114
116
|
|
|
115
117
|
Фильтры: `kind?: 'expression' | 'schema' | 'model'`, `constituentId?`, `severity?: 'error' | 'warning'`.
|
|
116
118
|
|
|
117
|
-
Элемент диагностики (агентский вид): `kind`, `code`, `name`, `severity`, `alias?`, `expression`, `from`, `to`, `params
|
|
119
|
+
Элемент диагностики (агентский вид): `kind`, `code`, `name`, `severity`, `alias?`, `expression`, `from`, `to`, `params?`, `stack?` (цепочка вызовов при ошибке внутри `F#`/`P#`). Ключ для поиска исправления — `name` ([DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)).
|
|
118
120
|
|
|
119
121
|
## `analyzeExpression`
|
|
120
122
|
|
|
@@ -171,6 +173,35 @@ const { orderedAliases } = tool.restoreOrder();
|
|
|
171
173
|
// → { orderedIds: number[], orderedAliases: string[] }
|
|
172
174
|
```
|
|
173
175
|
|
|
176
|
+
## `synthesize`
|
|
177
|
+
|
|
178
|
+
**Синтез** в rstool сейчас — это **встраивание** схемы: вставка конституент из другой сессии в текущую с опциональной таблицей отождествлений (как «Встраивание схемы» в Portal UI).
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
const receiver = tool.createSession();
|
|
182
|
+
const source = tool.createSession();
|
|
183
|
+
tool.applySchemaPatch({ items: [{ alias: 'X1' }] }, source.sessionId);
|
|
184
|
+
|
|
185
|
+
tool.setCurrentSession(receiver.sessionId);
|
|
186
|
+
tool.synthesize({
|
|
187
|
+
sourceSessionId: source.sessionId,
|
|
188
|
+
// items?: ['X1'], // optional subset of source aliases
|
|
189
|
+
substitutions: [{ original: 'X1', substitution: 'X1' }], // source → receiver
|
|
190
|
+
commitMessage: 'merge'
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Вход**
|
|
195
|
+
|
|
196
|
+
| Поле | Смысл |
|
|
197
|
+
| ----------------- | --------------------------------------------------------------------------------------------- |
|
|
198
|
+
| `sourceSessionId` | Сессия-источник (не должна совпадать с receiver) |
|
|
199
|
+
| `items?` | Алиасы конституент источника; пусто / omit — все |
|
|
200
|
+
| `substitutions?` | Таблица отождествлений по алиасам: в каждой строке один алиас источника и один алиас receiver |
|
|
201
|
+
| `commitMessage?` | Ревизия после успеха |
|
|
202
|
+
|
|
203
|
+
Алиасы импорта перенумеровываются при непустом receiver (`X1` → `X2`, …). Формулы и текстовые ссылки обновляются. Результат: `summary`, `idMap`, `aliasMapping`, `deletedIds`, `insertedIds`, и опционально `revision` (если был `commitMessage`). Также `success` / `failed` — как у `applySchemaPatch` (режим best-effort после встраивания).
|
|
204
|
+
|
|
174
205
|
## `importData` / `exportSession` / `exportPortal`
|
|
175
206
|
|
|
176
207
|
### `importData(payload, kind?)`
|
|
@@ -51,7 +51,7 @@ description: >-
|
|
|
51
51
|
|
|
52
52
|
## Язык ответа пользователю
|
|
53
53
|
|
|
54
|
-
В тексте для пользователя используй термины предметной области («формальное определение», «конституента», «диагностики»), а не английские имена полей и методов API (`definitionFormal`, `applySchemaPatch`). Идентификаторы API — только в коде, patch-ах и JSON. Словарь API → текст: раздел «Язык ответа» в GUIDE.md. Термины КС (
|
|
54
|
+
В тексте для пользователя используй термины предметной области («формальное определение», «конституента», «диагностики»), а не английские имена полей и методов API (`definitionFormal`, `applySchemaPatch`). Идентификаторы API — только в коде, patch-ах и JSON. Словарь API → текст: раздел «Язык ответа» в GUIDE.md. Термины КС (**неопределяемые понятия**, **базисное множество**, ядро) — только из `docs/DOMAIN.md`, раздел **«Термины: не путать»**. Не сокращай «базисное множество» до «базис» / «базисы».
|
|
55
55
|
|
|
56
56
|
## Portal (приложение)
|
|
57
57
|
|
package/src/index.ts
CHANGED
|
@@ -54,6 +54,9 @@ export {
|
|
|
54
54
|
type SessionSummaryItem,
|
|
55
55
|
type SessionState,
|
|
56
56
|
type SetConstituentaValueInput,
|
|
57
|
-
type SetModelValuesInput
|
|
57
|
+
type SetModelValuesInput,
|
|
58
|
+
type SynthesisSubstitution,
|
|
59
|
+
type SynthesizeInput,
|
|
60
|
+
type SynthesizeResult
|
|
58
61
|
} from './models';
|
|
59
62
|
export { RSToolWrapperClient, type RSToolWrapperClientOptions, type WrapperResponse } from './wrapper/client';
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
type Constituenta,
|
|
3
2
|
type CstDiagnostic,
|
|
4
3
|
DiagnosticKind,
|
|
5
4
|
modelStatusCstDiagnostic,
|
|
6
5
|
RSDiagnosticCode
|
|
7
6
|
} from '@rsconcept/domain/library';
|
|
7
|
+
import { type DiagnosticSourceFields } from '@rsconcept/domain/library/rsform-api';
|
|
8
8
|
import { EvalStatus } from '@rsconcept/domain/library/rsmodel';
|
|
9
|
-
import { isCritical, RSErrorCode, type RSErrorDescription } from '@rsconcept/domain/rslang/error';
|
|
9
|
+
import { isCritical, RSErrorCode, type EvalStackFrame, type RSErrorDescription } from '@rsconcept/domain/rslang/error';
|
|
10
10
|
|
|
11
11
|
export { DiagnosticKind, RSDiagnosticCode };
|
|
12
12
|
|
|
@@ -22,6 +22,8 @@ export interface Diagnostic extends CstDiagnostic {
|
|
|
22
22
|
expression: string;
|
|
23
23
|
from: number;
|
|
24
24
|
to: number;
|
|
25
|
+
/** Evaluation call chain when the fault is inside a called `F#`/`P#` body. */
|
|
26
|
+
stack?: readonly EvalStackFrame[];
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
/** Context for attributing a {@link Diagnostic} to a constituent. */
|
|
@@ -43,7 +45,7 @@ export function getDiagnosticSeverity(code: number): DiagnosticSeverity {
|
|
|
43
45
|
return isCritical(code as RSErrorCode) ? 'error' : 'warning';
|
|
44
46
|
}
|
|
45
47
|
|
|
46
|
-
export function expandCstDiagnostic(cst:
|
|
48
|
+
export function expandCstDiagnostic(cst: DiagnosticSourceFields, diagnostic: CstDiagnostic): Diagnostic {
|
|
47
49
|
const expression = expressionForCstDiagnostic(cst, diagnostic);
|
|
48
50
|
return {
|
|
49
51
|
...diagnostic,
|
|
@@ -72,16 +74,17 @@ export function expressionDiagnostic(
|
|
|
72
74
|
expression,
|
|
73
75
|
from: error.from,
|
|
74
76
|
to: error.to,
|
|
75
|
-
...(error.params ? { params: error.params } : {})
|
|
77
|
+
...(error.params ? { params: error.params } : {}),
|
|
78
|
+
...(error.stack ? { stack: error.stack } : {})
|
|
76
79
|
};
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
export function modelStatusDiagnostic(status: EvalStatus, cst:
|
|
82
|
+
export function modelStatusDiagnostic(status: EvalStatus, cst: DiagnosticSourceFields): Diagnostic | null {
|
|
80
83
|
const base = modelStatusCstDiagnostic(status, cst.cst_type);
|
|
81
84
|
return base ? expandCstDiagnostic(cst, base) : null;
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
function expressionForCstDiagnostic(cst:
|
|
87
|
+
function expressionForCstDiagnostic(cst: DiagnosticSourceFields, diagnostic: CstDiagnostic): string {
|
|
85
88
|
switch (diagnostic.code) {
|
|
86
89
|
case RSDiagnosticCode.schemaHomonym:
|
|
87
90
|
case RSDiagnosticCode.schemaMissingTerm:
|
package/src/mappers/types.ts
CHANGED
|
@@ -43,6 +43,51 @@ export interface RestoreOrderResult {
|
|
|
43
43
|
orderedAliases: string[];
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/** One row of an identification (substitution) table, by alias. */
|
|
47
|
+
export interface SynthesisSubstitution {
|
|
48
|
+
/** Alias of the constituenta being replaced (deleted). */
|
|
49
|
+
original: string;
|
|
50
|
+
/** Alias of the surviving constituenta. */
|
|
51
|
+
substitution: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Input for {@link RSToolAgent.synthesize}. */
|
|
55
|
+
export interface SynthesizeInput {
|
|
56
|
+
/** Session whose constituents are merged into the receiver. */
|
|
57
|
+
sourceSessionId: string;
|
|
58
|
+
/**
|
|
59
|
+
* Optional subset of source aliases to import.
|
|
60
|
+
* Omit or pass an empty array to import all source constituents.
|
|
61
|
+
*/
|
|
62
|
+
items?: string[];
|
|
63
|
+
/**
|
|
64
|
+
* Identification table: one endpoint is a source alias, the other a receiver alias
|
|
65
|
+
* (same rules as Portal schema embedding / «Встраивание схемы»).
|
|
66
|
+
*/
|
|
67
|
+
substitutions?: SynthesisSubstitution[];
|
|
68
|
+
/** When set, a revision is recorded after a successful synthesis. */
|
|
69
|
+
commitMessage?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Result of {@link RSToolAgent.synthesize}. */
|
|
73
|
+
export interface SynthesizeResult {
|
|
74
|
+
session: SessionHandle;
|
|
75
|
+
summary: SessionSummary;
|
|
76
|
+
/** False when some constituents failed re-analysis after embedding (best-effort). */
|
|
77
|
+
success: boolean;
|
|
78
|
+
/** Drafts that failed analysis after embedding; empty when {@link success} is true. */
|
|
79
|
+
failed: Array<{ draft: ConstituentaDraft; diagnostics: Diagnostic[] }>;
|
|
80
|
+
/** Source constituent id → inserted id in the receiver (before substitutions). */
|
|
81
|
+
idMap: Record<number, number>;
|
|
82
|
+
/** Alias remapping applied to imported constituents. */
|
|
83
|
+
aliasMapping: Record<string, string>;
|
|
84
|
+
/** Ids removed by substitutions. */
|
|
85
|
+
deletedIds: number[];
|
|
86
|
+
/** Ids of constituents inserted from the source (may include later-deleted ones). */
|
|
87
|
+
insertedIds: number[];
|
|
88
|
+
revision?: SessionRevision;
|
|
89
|
+
}
|
|
90
|
+
|
|
46
91
|
/** Compact view of one constituent in a session summary. */
|
|
47
92
|
export interface SessionSummaryItem {
|
|
48
93
|
id: number;
|
package/src/models/index.ts
CHANGED
|
@@ -6,17 +6,13 @@ export {
|
|
|
6
6
|
type SessionStateDetail,
|
|
7
7
|
type SessionStateResult,
|
|
8
8
|
type SessionSummary,
|
|
9
|
-
type SessionSummaryItem
|
|
9
|
+
type SessionSummaryItem,
|
|
10
|
+
type SynthesisSubstitution,
|
|
11
|
+
type SynthesizeInput,
|
|
12
|
+
type SynthesizeResult
|
|
10
13
|
} from './agent-workflow';
|
|
11
14
|
export { type AnalysisResult, type AnalyzeExpressionInput } from './analysis';
|
|
12
|
-
export {
|
|
13
|
-
CstType,
|
|
14
|
-
EvalStatus,
|
|
15
|
-
RSErrorCode,
|
|
16
|
-
ValueClass,
|
|
17
|
-
type BasicBinding,
|
|
18
|
-
type RSToolValue
|
|
19
|
-
} from './common';
|
|
15
|
+
export { CstType, EvalStatus, RSErrorCode, ValueClass, type BasicBinding, type RSToolValue } from './common';
|
|
20
16
|
export { type ApplyConstituentsMode, type ConstituentaDraft, type ConstituentaState } from './constituenta';
|
|
21
17
|
export {
|
|
22
18
|
type CstDiagnostic,
|