@rsconcept/rstool 1.2.2 → 1.4.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 +4 -4
- package/dist/{agent-workflow-Gk0Vfnv1.d.ts → agent-workflow-D22FeODL.d.ts} +6 -6
- package/dist/{analysis-LLnPhmGa.d.ts → analysis-DA44pfgA.d.ts} +4 -3
- package/dist/common-D6TFl6l_.d.ts +11 -0
- package/dist/{constituenta-DnGR6bnM.d.ts → constituenta-QY5w1x91.d.ts} +7 -7
- package/dist/diagnostic-C6TRoBgt.d.ts +38 -0
- package/dist/diagnostic-assembly-DRunIcKQ.js +54 -0
- package/dist/diagnostic-assembly-DRunIcKQ.js.map +1 -0
- package/dist/{evaluation-Cns8BFm4.d.ts → evaluation-Cd4S7-3t.d.ts} +4 -3
- package/dist/index.d.ts +12 -12
- package/dist/index.js +4 -3
- package/dist/mappers/model-adapter.d.ts +3 -3
- package/dist/mappers/model-adapter.js +1 -199
- package/dist/mappers/schema-adapter.d.ts +5 -5
- package/dist/mappers/schema-adapter.js +8 -8
- package/dist/mappers/schema-adapter.js.map +1 -1
- package/dist/mappers/types.d.ts +6 -6
- package/dist/mappers/types.js +6 -10
- package/dist/mappers/types.js.map +1 -1
- package/dist/model-adapter-D-YmIvQW.js +225 -0
- package/dist/model-adapter-D-YmIvQW.js.map +1 -0
- package/dist/{model-value-BbonPzMz.d.ts → model-value-BUhr2IjA.d.ts} +2 -2
- package/dist/models/agent-workflow.d.ts +1 -1
- package/dist/models/analysis.d.ts +1 -1
- package/dist/models/common.d.ts +2 -2
- package/dist/models/common.js +1 -1
- package/dist/models/constituenta.d.ts +1 -1
- package/dist/models/diagnostic.d.ts +2 -2
- package/dist/models/diagnostic.js +3 -1
- package/dist/models/evaluation.d.ts +1 -1
- package/dist/models/index.d.ts +11 -11
- package/dist/models/index.js +3 -2
- 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-9G6ur_pg.js → models-DTLctDmB.js} +72 -15
- package/dist/models-DTLctDmB.js.map +1 -0
- package/dist/{rstool-agent-D2cQze_b.d.ts → rstool-agent-BMVAyMAG.d.ts} +11 -10
- package/dist/session/session-store.d.ts +6 -6
- package/dist/session/session-store.js +1 -1
- package/dist/{session-ChexW8i7.d.ts → session-CI4rLYby.d.ts} +3 -3
- package/dist/{tool-contract-0uRGhEfW.d.ts → tool-contract-sQfr-DYD.d.ts} +12 -12
- package/dist/wrapper/stdio-wrapper.js +1 -1
- package/docs/BASE-SELECTION.md +92 -0
- package/docs/CONCEPTUAL-SCHEMA.md +20 -15
- package/docs/CONSTITUENTA.md +3 -3
- package/docs/DIAGNOSTICS.md +63 -20
- package/docs/DOMAIN.md +27 -21
- package/docs/README.md +1 -0
- package/docs/SYNTAX.md +3 -2
- package/docs/TYPIFICATION.md +3 -9
- package/examples/README.md +2 -0
- package/examples/agent-client.ts +15 -3
- package/examples/audit-diagnostics.ts +40 -0
- package/examples/chocolate-nim/build-rsform.ts +15 -0
- package/examples/chocolate-nim/build-rsmodel.ts +15 -22
- package/examples/chocolate-nim/model-demo.ts +11 -0
- package/examples/chocolate-nim/rsform-session.json +329 -310
- package/examples/chocolate-nim/rsmodel-session.json +311 -311
- package/examples/diagnostics-utils.ts +25 -0
- package/examples/expression-bank/bank-constituents.ts +10 -10
- package/examples/expression-bank/build-rsform.ts +8 -0
- package/examples/expression-bank/rsform-session.json +1501 -1501
- package/examples/kinship/build-rsform.ts +16 -1
- package/examples/kinship/build-rsmodel.ts +15 -56
- package/examples/kinship/model-demo.ts +35 -0
- package/examples/kinship/rsform-session.json +300 -215
- package/examples/kinship/rsmodel-session.json +216 -216
- package/examples/movd/build-rsform.ts +15 -0
- package/examples/movd/build-rsmodel.ts +15 -46
- package/examples/movd/model-demo.ts +31 -0
- package/examples/movd/rsform-session.json +359 -270
- package/examples/movd/rsmodel-session.json +263 -263
- package/examples/sample/build-rsform.ts +43 -3
- package/examples/sample/build-rsmodel.ts +26 -2
- package/examples/sample/rsform-session.json +41 -12
- package/examples/sample/rsmodel-session.json +37 -37
- package/examples/template-apply/build-rsform.ts +26 -9
- package/examples/template-apply/rsform-session.json +100 -45
- package/package.json +3 -2
- package/skills/rstool-helper/EXAMPLES.md +22 -1
- package/skills/rstool-helper/GUIDE.md +23 -28
- package/skills/rstool-helper/REFERENCE.md +28 -23
- package/src/index.ts +7 -4
- package/src/mappers/diagnostic-assembly.ts +96 -0
- package/src/mappers/diagnostics-collector.test.ts +63 -0
- package/src/mappers/diagnostics-collector.ts +73 -0
- package/src/mappers/model-adapter.ts +28 -99
- package/src/mappers/rsform-builder.ts +127 -0
- package/src/mappers/schema-adapter.ts +19 -15
- package/src/mappers/types.ts +12 -12
- package/src/models/agent-workflow.ts +2 -2
- package/src/models/analysis.ts +3 -2
- package/src/models/common.ts +0 -12
- package/src/models/constituenta.ts +4 -4
- package/src/models/diagnostic.ts +15 -10
- package/src/models/evaluation.ts +3 -8
- package/src/models/index.ts +8 -2
- package/src/models/rstool-agent.test.ts +66 -5
- package/src/models/rstool-agent.ts +22 -10
- package/src/models/tool-contract.ts +4 -4
- package/src/session/persistence.ts +2 -2
- package/src/session/session-store.ts +14 -7
- package/dist/common-DHJalS-Q.d.ts +0 -22
- package/dist/diagnostic-D9yl_mEL.d.ts +0 -19
- package/dist/mappers/model-adapter.js.map +0 -1
- package/dist/models-9G6ur_pg.js.map +0 -1
package/docs/DOMAIN.md
CHANGED
|
@@ -20,23 +20,29 @@
|
|
|
20
20
|
- **Тело КС** — остальные конституенты схемы, не входящие в ядро.
|
|
21
21
|
- **Конвенция** — текстовое соглашение о том, как неопределяемое понятие соотносится с сущностями предметной области. В данных схемы хранится в поле `convention` конституенты. Конвенция не заменяет формальное определение и не проходит формальную проверку RSLang. Она фиксирует предметный смысл, который нельзя вывести из формулы: что именно считается элементом множества, как читать компоненты кортежа, какой порядок в паре отношения, какие константы или операции подразумеваются. В конвенции используется предметный язык и термины, которые могут быть не выражены в концептуальной схеме.
|
|
22
22
|
- **Интерпретация** — соотнесение понятий КС с сущностями предметной области. В концептуальной модели задаётся значениями неопределяемых конституент и вычислением производных.
|
|
23
|
+
- **Биективная переносимость** — независимость значения формального определения от биективной замены интерпретаций неопределяемых понятий. Для `X#` опирается на несравнимость элементов; анализатор RSLang отсекает формулы, нарушающие переносимость.
|
|
23
24
|
|
|
24
25
|
## Конституенты
|
|
25
26
|
|
|
26
|
-
**Конституента** — часть КС.
|
|
27
|
+
**Конституента** — часть КС. Поля и правила валидации см. в [CONSTITUENTA.md](CONSTITUENTA.md); здесь только предметные роли.
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
| Обозначение | Роль |
|
|
30
|
+
| :---------- | :-------------------------------------------------------------------------------------- |
|
|
31
|
+
| `N#` | **Номиноид**: словарная сущность вне родоструктурной экспликации |
|
|
32
|
+
| `X#` | **Базисное множество**: неопределяемые предметные объекты без порядка и арифметики |
|
|
33
|
+
| `C#` | **Константное множество**: неопределяемый конечный домен с порядком и арифметикой языка |
|
|
34
|
+
| `S#` | **Родовая структура**: неопределяемое структурное понятие; формула задаёт типизацию |
|
|
35
|
+
| `D#` | **Терм**: производное понятие, вычисляемое по формуле |
|
|
36
|
+
| `F#` | **Терм-функция**: параметризованный терм |
|
|
37
|
+
| `P#` | **Предикат-функция**: параметризованное логическое выражение |
|
|
38
|
+
| `A#` | **Аксиома**: логическое требование к модели |
|
|
39
|
+
| `T#` | **Высказывание**: логическое утверждение о модели |
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
`Z` — встроенная ступень целых в RSLang, **не конституента**. Для выбора между `X#`, `C#` и `Z` — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
42
|
+
|
|
43
|
+
`R#` — **радикал**, шаблонная ступень в доменах параметров `F#` / `P#`. Это тоже **не конституента**: в схеме нет записи с `alias` `R1`, `R2`, … и добавлять её не нужно ([SYNTAX.md](SYNTAX.md), раздел «Радикалы»).
|
|
44
|
+
|
|
45
|
+
Правило: `X#`, `C#`, `S#` задаются конвенцией и интерпретацией; `D#`, `F#`, `P#`, `A#`, `T#` выводятся по формуле. Поставщики должны идти раньше потребителей.
|
|
40
46
|
|
|
41
47
|
Не путай `S#` и `D#`: `S1: ℬ(X1×X1)` — интерпретируемое отношение из пар; `D1 := X1×X1` — декартово произведение.
|
|
42
48
|
|
|
@@ -62,15 +68,15 @@
|
|
|
62
68
|
|
|
63
69
|
В ответах пользователю и в конвенциях КС используй только термины из этого файла. Не вводи собственные ярлыки («базис», «базисный слой», «каркас схемы») — они не закреплены в Portal и размывают различия ниже.
|
|
64
70
|
|
|
65
|
-
| Не используй | Используй | Почему
|
|
66
|
-
| :------------------------------------------------------ | :------------------------------------------------------------------------------------------ |
|
|
67
|
-
| «базис», «базисный слой», «первый слой» (без уточнения) | **неопределяемые понятия** — `X#`, `C#`, `S#` | Общий термин для всего неопределяемого слоя
|
|
68
|
-
| «базис» / «базисное» про `C#` или `S#` | **константное множество** (`C#`), **родовая структура** (`S#`) | **Базисное множество** — только про `X#`
|
|
69
|
-
| «базисные множества» как синоним неопределяемых понятий | **базисные множества** — только несколько `X#`; для всего слоя — **неопределяемые понятия** | `C#` и `S#` базисными множествами не называются
|
|
70
|
-
| «ядро» = неопределяемые понятия» | **ядро КС** — неопределяемые понятия плюс аксиомы и производные, нужные для аксиом | Ядро шире, чем только `X#` / `C#` / `S#`
|
|
71
|
-
| теорема про `T#` | **высказывание** — производное логическое выражение `T#` | тип теорема на Portal отсутствует и вводит в заблуждение
|
|
72
|
-
| «пропущенная конституента `R1`» в списке схемы | **радикал** `R#` — параметр шаблона в домене `F#` / `P#`
|
|
73
|
-
| «добавить `R1` как базисное / структурное понятие» | оставить `R#` только в `[…]` у параметризованных `F#` / `P#` | иначе смешиваются шаблон и предметная КС
|
|
71
|
+
| Не используй | Используй | Почему |
|
|
72
|
+
| :------------------------------------------------------ | :------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- |
|
|
73
|
+
| «базис», «базисный слой», «первый слой» (без уточнения) | **неопределяемые понятия** — `X#`, `C#`, `S#` | Общий термин для всего неопределяемого слоя |
|
|
74
|
+
| «базис» / «базисное» про `C#` или `S#` | **константное множество** (`C#`), **родовая структура** (`S#`) | **Базисное множество** — только про `X#` |
|
|
75
|
+
| «базисные множества» как синоним неопределяемых понятий | **базисные множества** — только несколько `X#`; для всего слоя — **неопределяемые понятия** | `C#` и `S#` базисными множествами не называются |
|
|
76
|
+
| «ядро» = неопределяемые понятия» | **ядро КС** — неопределяемые понятия плюс аксиомы и производные, нужные для аксиом | Ядро шире, чем только `X#` / `C#` / `S#` |
|
|
77
|
+
| теорема про `T#` | **высказывание** — производное логическое выражение `T#` | тип теорема на Portal отсутствует и вводит в заблуждение |
|
|
78
|
+
| «пропущенная конституента `R1`» в списке схемы | **радикал** `R#` — параметр шаблона в домене `F#` / `P#` | `R#` не объявляется; при ревью КС отсутствие `R1` среди конституент — норма |
|
|
79
|
+
| «добавить `R1` как базисное / структурное понятие» | оставить `R#` только в `[…]` у параметризованных `F#` / `P#` | иначе смешиваются шаблон и предметная КС |
|
|
74
80
|
|
|
75
81
|
## Статусы выражений
|
|
76
82
|
|
package/docs/README.md
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
- **DOMAIN.md** — термины Portal: конституента, неопределяемые и производные понятия, ядро/тело КС, интерпретация, ОСС, синтез.
|
|
10
10
|
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем.
|
|
11
11
|
- **CONSTITUENTA.md** — структура и правила конституент.
|
|
12
|
+
- **BASE-SELECTION.md** — выбор основания: `X#`, `C#` или `Z`.
|
|
12
13
|
- **SYNTAX.md** — синтаксис RSLang: операторы, генераторы `D{}`/`I{}`/`R{}`, кванторы, `F#`/`P#`.
|
|
13
14
|
- **TYPIFICATION.md** — типизация (`AnalysisResult.type`, `valueClass`).
|
|
14
15
|
- **MODEL-TESTING.md** — проверка семантики определений на маленьких концептуальных моделях.
|
package/docs/SYNTAX.md
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
- Радикалы: `R1`, `R2` — шаблонные ступени **только в доменах параметров** `[…]` у `F#` / `P#`; не конституенты и не путать с префиксом рекурсии `R{…}`.
|
|
9
9
|
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
10
|
- Целые: `0`, `42`; отрицательного литерала нет, пиши `0 - 5`.
|
|
11
|
-
- `Z` —
|
|
11
|
+
- `Z` — встроенная ступень целых (не конституента; отдельной записи `C#` для «целых» не нужно). Сравнение с `C#` — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
12
|
+
- `∅` — пустое множество с типизацией `ℬ(R0)`.
|
|
12
13
|
- Скобки и разделители: `()`, `[]`, `{}`, `,`, `;`, `|`.
|
|
13
14
|
- Комментариев в формальных выражениях нет.
|
|
14
15
|
|
|
@@ -161,7 +162,7 @@ F2 ::= [α1∈R1×R2, α2∈R1] α2 = pr1(α1)
|
|
|
161
162
|
## Корректность
|
|
162
163
|
|
|
163
164
|
- Анализ идет в глобальном контексте: все алиасы **конституент** (`X#`, `C#`, `S#`, `D#`, `F#`, `P#`, …) должны быть известны и типизированы. `R#` в доменах параметров — радикалы, не конституенты (см. выше).
|
|
164
|
-
- Формальные определения должны быть
|
|
165
|
+
- Формальные определения должны быть **биективно переносимыми** (гарантируется семантическим анализатором): значение не зависит от переименования элементов неопределяемых понятий при согласованной замене интерпретаций. Для `X#` это запрещает порядок и арифметику над элементами; подробно — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
165
166
|
- Логическая непротиворечивость проверяется примером интерпретации в модели.
|
|
166
167
|
|
|
167
168
|
## Приоритеты операторов
|
package/docs/TYPIFICATION.md
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
Выражение типизировано, если его значения принадлежат ступени `H`.
|
|
8
8
|
|
|
9
|
-
- `Xi`, `Ci` — элемент базисного или константного
|
|
10
|
-
- `Z` — целое
|
|
9
|
+
- `Xi`, `Ci` — элемент базисного или константного множества (`Ci` — с арифметикой и порядком).
|
|
10
|
+
- `Z` — целое число (встроенная ступень, не конституента). См. [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
11
11
|
- `(H1 × H2 × ... × Hn)` — кортеж.
|
|
12
12
|
- `ℬ(H)` — множество значений ступени `H`.
|
|
13
13
|
|
|
@@ -20,13 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
## Радикалы
|
|
22
22
|
|
|
23
|
-
`R1`, `R2`, ... — шаблонные ступени в доменах параметров `F#` / `P
|
|
24
|
-
|
|
25
|
-
- Значение `R#` выводится по аргументам в месте вызова `F#[…]` / `P#[…]`.
|
|
26
|
-
- Все вхождения одного `R#` в одном определении должны дать одну ступень.
|
|
27
|
-
- Разные `R#` независимы.
|
|
28
|
-
- Радикалы можно писать только в доменах параметров (в `[…]`); в теле результата будет `radicalUsage`.
|
|
29
|
-
- При ревью схемы отсутствие `R1` среди конституент при наличии `R1` в формулах `F#` / `P#` — ожидаемое состояние, а не пробел ядра КС.
|
|
23
|
+
`R1`, `R2`, ... — шаблонные ступени в доменах параметров `F#` / `P#`; **не конституенты**. Ступень `R#` выводится по аргументам в месте вызова; все вхождения одного `R#` в определении дают одну ступень, разные `R#` независимы. Правила и примеры — [SYNTAX.md](SYNTAX.md), раздел «Радикалы».
|
|
30
24
|
|
|
31
25
|
## `AnalysisResult.type`
|
|
32
26
|
|
package/examples/README.md
CHANGED
|
@@ -24,6 +24,8 @@ npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
|
|
|
24
24
|
|
|
25
25
|
Готовые `*-session.json` — снимки `exportSession` для `importData` и тестов. Пересобрать: соответствующий `build-*.ts` перезапишет файл рядом с собой.
|
|
26
26
|
|
|
27
|
+
Перед экспортом каждый `build-*.ts` вызывает [`diagnostics-utils.ts`](diagnostics-utils.ts) (`assertCleanDiagnostics`): expression + schema + model должны быть пусты, иначе скрипт падает. Проверить все снимки: `pnpm run example:audit-diagnostics` ([`audit-diagnostics.ts`](audit-diagnostics.ts)).
|
|
28
|
+
|
|
27
29
|
## Темы и npm-скрипты
|
|
28
30
|
|
|
29
31
|
- **[`sample/`](sample/):**
|
package/examples/agent-client.ts
CHANGED
|
@@ -14,7 +14,10 @@ async function runExample() {
|
|
|
14
14
|
console.log('Session created:', session);
|
|
15
15
|
|
|
16
16
|
await client.call('applySchemaPatch', {
|
|
17
|
-
items: [
|
|
17
|
+
items: [
|
|
18
|
+
{ alias: 'X1', term: 'element', convention: 'people' },
|
|
19
|
+
{ alias: 'D1', definitionFormal: '1+2' }
|
|
20
|
+
]
|
|
18
21
|
});
|
|
19
22
|
|
|
20
23
|
await client.call('setModelValues', {
|
|
@@ -33,8 +36,17 @@ async function runExample() {
|
|
|
33
36
|
const analysis = await client.call<{ diagnostics: unknown[] }>('analyzeExpression', analyzeInput);
|
|
34
37
|
console.log('Scratch analysis diagnostics:', analysis.diagnostics.length);
|
|
35
38
|
|
|
36
|
-
const sessionDiagnostics = await client.call<
|
|
37
|
-
|
|
39
|
+
const sessionDiagnostics = await client.call<Array<{ kind: string }>>('listDiagnostics', {});
|
|
40
|
+
const counts = { expression: 0, schema: 0, model: 0 };
|
|
41
|
+
for (const record of sessionDiagnostics) {
|
|
42
|
+
if (record.kind in counts) {
|
|
43
|
+
counts[record.kind as keyof typeof counts] += 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
console.log('Session diagnostics:', {
|
|
47
|
+
total: sessionDiagnostics.length,
|
|
48
|
+
...counts
|
|
49
|
+
});
|
|
38
50
|
} finally {
|
|
39
51
|
await client.close();
|
|
40
52
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { RSToolAgent } from '../src';
|
|
5
|
+
|
|
6
|
+
const sessions = [
|
|
7
|
+
'examples/sample/rsform-session.json',
|
|
8
|
+
'examples/sample/rsmodel-session.json',
|
|
9
|
+
'examples/kinship/rsform-session.json',
|
|
10
|
+
'examples/kinship/rsmodel-session.json',
|
|
11
|
+
'examples/chocolate-nim/rsform-session.json',
|
|
12
|
+
'examples/chocolate-nim/rsmodel-session.json',
|
|
13
|
+
'examples/movd/rsform-session.json',
|
|
14
|
+
'examples/movd/rsmodel-session.json',
|
|
15
|
+
'examples/expression-bank/rsform-session.json',
|
|
16
|
+
'examples/template-apply/rsform-session.json'
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
let total = 0;
|
|
20
|
+
for (const rel of sessions) {
|
|
21
|
+
const path = resolve(process.cwd(), rel);
|
|
22
|
+
const tool = new RSToolAgent();
|
|
23
|
+
const payload = JSON.parse(readFileSync(path, 'utf8')) as {
|
|
24
|
+
state: { items: Array<{ id: number; alias: string }> };
|
|
25
|
+
};
|
|
26
|
+
tool.importData(payload, 'session');
|
|
27
|
+
const diags = tool.listDiagnostics();
|
|
28
|
+
total += diags.length;
|
|
29
|
+
console.log(`\n=== ${rel} (${diags.length}) ===`);
|
|
30
|
+
for (const d of diags) {
|
|
31
|
+
const alias =
|
|
32
|
+
d.alias ??
|
|
33
|
+
(d.constituentId !== undefined
|
|
34
|
+
? (payload.state.items.find(item => item.id === d.constituentId)?.alias ?? '?')
|
|
35
|
+
: '(scratch)');
|
|
36
|
+
console.log(` [${d.kind}] ${alias} ${d.name} ${JSON.stringify(d.params ?? [])}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
console.log(`\nTotal: ${total}`);
|
|
40
|
+
process.exit(total > 0 ? 1 : 0);
|
|
@@ -6,6 +6,8 @@ import { CstType, RSToolWrapperClient, type AgentConstituentaPatch } from '../..
|
|
|
6
6
|
type DraftBatch = { draft: AgentConstituentaPatch };
|
|
7
7
|
|
|
8
8
|
import { DEFAULT_RSFORM_SESSION_PATH } from './constants';
|
|
9
|
+
import { CHOCOLATE_MODEL_SET } from './model-demo';
|
|
10
|
+
import { assertCleanDiagnostics } from '../diagnostics-utils';
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* Учебная RSForm «шоколадный Ним» (ОШК-НИМ) по Portal rsforms/825.
|
|
@@ -294,6 +296,19 @@ async function run() {
|
|
|
294
296
|
throw new Error(`${failedAlias}: analysis failed`);
|
|
295
297
|
}
|
|
296
298
|
|
|
299
|
+
await client.call('setModelValues', {
|
|
300
|
+
sessionId: session.sessionId,
|
|
301
|
+
set: [...CHOCOLATE_MODEL_SET]
|
|
302
|
+
});
|
|
303
|
+
await client.call('recalculateModel', { sessionId: session.sessionId });
|
|
304
|
+
|
|
305
|
+
await assertCleanDiagnostics(
|
|
306
|
+
client,
|
|
307
|
+
session.sessionId,
|
|
308
|
+
new Map(drafts.map(entry => [entry.draft.id!, entry.draft.alias])),
|
|
309
|
+
'chocolate-nim RSForm'
|
|
310
|
+
);
|
|
311
|
+
|
|
297
312
|
await client.call('commitStep', {
|
|
298
313
|
sessionId: session.sessionId,
|
|
299
314
|
message: 'КС «шоколадный Ним» (rsforms/825): Z×Z, pr, P#, T#, арифметика, радикал R1'
|
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
|
|
4
|
-
import { TUPLE_ID } from '@rsconcept/domain';
|
|
5
|
-
|
|
6
4
|
import { EvalStatus, RSToolWrapperClient } from '../../src';
|
|
7
5
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
DEFAULT_RSFORM_SESSION_PATH,
|
|
12
|
-
DEFAULT_RSMODEL_SESSION_PATH,
|
|
13
|
-
S1_ID,
|
|
14
|
-
S2_ID,
|
|
15
|
-
T1_ID
|
|
16
|
-
} from './constants';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Демо-позиция: шоколадка 4×6, отравленная долька в (2, 3).
|
|
20
|
-
* Кучки Ним: 1, 2, 2, 3 камня; игра не окончена.
|
|
21
|
-
*/
|
|
22
|
-
const S1_VALUE = [TUPLE_ID, 4, 6] as const;
|
|
23
|
-
const S2_VALUE = [TUPLE_ID, 2, 3] as const;
|
|
6
|
+
import { A1_ID, D6_ID, DEFAULT_RSFORM_SESSION_PATH, DEFAULT_RSMODEL_SESSION_PATH, T1_ID } from './constants';
|
|
7
|
+
import { CHOCOLATE_MODEL_SET } from './model-demo';
|
|
8
|
+
import { assertCleanDiagnostics } from '../diagnostics-utils';
|
|
24
9
|
|
|
25
10
|
async function run() {
|
|
26
11
|
const client = new RSToolWrapperClient({
|
|
@@ -38,10 +23,7 @@ async function run() {
|
|
|
38
23
|
|
|
39
24
|
await client.call('setModelValues', {
|
|
40
25
|
sessionId: imported.sessionId,
|
|
41
|
-
set: [
|
|
42
|
-
{ target: S1_ID, value: S1_VALUE },
|
|
43
|
-
{ target: S2_ID, value: S2_VALUE }
|
|
44
|
-
]
|
|
26
|
+
set: [...CHOCOLATE_MODEL_SET]
|
|
45
27
|
});
|
|
46
28
|
|
|
47
29
|
const recalculated = await client.call<{
|
|
@@ -76,6 +58,17 @@ async function run() {
|
|
|
76
58
|
throw new Error(`Expected D6=4 piles; got ${JSON.stringify(d6)}`);
|
|
77
59
|
}
|
|
78
60
|
|
|
61
|
+
const state = await client.call<{ items: Array<{ id: number; alias: string }> }>('getSessionState', {
|
|
62
|
+
sessionId: imported.sessionId,
|
|
63
|
+
detail: 'full'
|
|
64
|
+
});
|
|
65
|
+
await assertCleanDiagnostics(
|
|
66
|
+
client,
|
|
67
|
+
imported.sessionId,
|
|
68
|
+
new Map(state.items.map(item => [item.id, item.alias])),
|
|
69
|
+
'chocolate-nim RSModel'
|
|
70
|
+
);
|
|
71
|
+
|
|
79
72
|
await client.call('commitStep', {
|
|
80
73
|
sessionId: imported.sessionId,
|
|
81
74
|
message: 'Модель шоколадного Нима: 4×6, долька (2,3), четыре кучки, A1 выполняется'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TUPLE_ID } from '@rsconcept/domain';
|
|
2
|
+
|
|
3
|
+
import { S1_ID, S2_ID } from './constants';
|
|
4
|
+
|
|
5
|
+
export const CHOCOLATE_S1_VALUE = [TUPLE_ID, 4, 6] as const;
|
|
6
|
+
export const CHOCOLATE_S2_VALUE = [TUPLE_ID, 2, 3] as const;
|
|
7
|
+
|
|
8
|
+
export const CHOCOLATE_MODEL_SET = [
|
|
9
|
+
{ target: S1_ID, value: CHOCOLATE_S1_VALUE },
|
|
10
|
+
{ target: S2_ID, value: CHOCOLATE_S2_VALUE }
|
|
11
|
+
] as const;
|