@rsconcept/rstool 1.7.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.
Files changed (52) hide show
  1. package/dist/{agent-workflow-DY-hfAap.d.ts → agent-workflow-BqEC_Foh.d.ts} +5 -6
  2. package/dist/{analysis-ktWFu4BY.d.ts → analysis-C7GrmB17.d.ts} +3 -4
  3. package/dist/{common-D6TFl6l_.d.ts → common-oafVB-wX.d.ts} +1 -2
  4. package/dist/{constituenta-HTnFtmxt.d.ts → constituenta-CwJogNKY.d.ts} +4 -5
  5. package/dist/{diagnostic-CODFUU-Q.d.ts → diagnostic-CtxXifJY.d.ts} +4 -3
  6. package/dist/{diagnostic-assembly-B-6vIA5I.js → diagnostic-assembly-B-r0NyHL.js} +3 -2
  7. package/dist/diagnostic-assembly-B-r0NyHL.js.map +1 -0
  8. package/dist/{evaluation-6A7rK4t7.d.ts → evaluation-BHv2xNwf.d.ts} +3 -4
  9. package/dist/index.d.ts +11 -10
  10. package/dist/index.js +1 -1
  11. package/dist/mappers/model-adapter.d.ts +4 -4
  12. package/dist/mappers/model-adapter.js +1 -1
  13. package/dist/mappers/schema-adapter.d.ts +5 -5
  14. package/dist/mappers/types.d.ts +5 -4
  15. package/dist/mappers/types.js +1 -1
  16. package/dist/mappers/types.js.map +1 -1
  17. package/dist/{model-value-BUhr2IjA.d.ts → model-value-C0QA-ji2.d.ts} +2 -3
  18. package/dist/models/agent-workflow.d.ts +1 -1
  19. package/dist/models/analysis.d.ts +1 -1
  20. package/dist/models/common.d.ts +1 -1
  21. package/dist/models/constituenta.d.ts +1 -1
  22. package/dist/models/diagnostic.d.ts +1 -1
  23. package/dist/models/diagnostic.js +1 -1
  24. package/dist/models/evaluation.d.ts +1 -1
  25. package/dist/models/index.d.ts +10 -10
  26. package/dist/models/index.js +1 -1
  27. package/dist/models/model-value.d.ts +1 -1
  28. package/dist/models/rstool-agent.d.ts +1 -1
  29. package/dist/models/rstool-agent.js +1 -1
  30. package/dist/models/session.d.ts +1 -1
  31. package/dist/models/tool-contract.d.ts +1 -1
  32. package/dist/models/tool-contract.js +1 -1
  33. package/dist/models/tool-contract.js.map +1 -1
  34. package/dist/{models-BKmWx92e.js → models-DG2uTaV_.js} +3 -3
  35. package/dist/{models-BKmWx92e.js.map → models-DG2uTaV_.js.map} +1 -1
  36. package/dist/{rstool-agent-D-w4DlEo.d.ts → rstool-agent-DLq0mtym.d.ts} +9 -10
  37. package/dist/session/session-store.d.ts +3 -2
  38. package/dist/session/session-store.js +1 -1
  39. package/dist/{session-Uc_vHrq9.d.ts → session-OaLqLq0H.d.ts} +3 -4
  40. package/dist/{tool-contract-i0v2gbWs.d.ts → tool-contract-ZVyh7hhp.d.ts} +10 -11
  41. package/dist/wrapper/stdio-wrapper.js +1 -1
  42. package/docs/DIAGNOSTICS.md +64 -22
  43. package/docs/DOMAIN.md +7 -2
  44. package/examples/diagnostics-utils.ts +3 -4
  45. package/package.json +6 -6
  46. package/skills/rstool-helper/GUIDE.md +3 -3
  47. package/skills/rstool-helper/REFERENCE.md +2 -2
  48. package/skills/rstool-helper/SKILL.md +1 -1
  49. package/src/mappers/diagnostic-assembly.ts +5 -2
  50. package/src/mappers/types.ts +1 -0
  51. package/src/models/tool-contract.ts +1 -1
  52. package/dist/diagnostic-assembly-B-6vIA5I.js.map +0 -1
@@ -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
- d.alias ??
10
- (d.constituentId !== undefined ? (aliasById?.get(d.constituentId) ?? '?') : '(scratch)');
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.7.0",
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.0",
79
- "@vitest/coverage-v8": "^4.1.9",
80
- "tsdown": "^0.22.3",
81
- "tsx": "^4.22.5",
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.9"
84
+ "vitest": "^4.1.10"
85
85
  },
86
86
  "publishConfig": {
87
87
  "access": "public"
@@ -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` с исправлением.
@@ -252,7 +252,7 @@ kind `auto` (default) определит `portal-details` или `portal-schema`
252
252
  - [ ] Схема проверена; ошибки исправлены.
253
253
  - [ ] Диагностики обработаны до фиксации шага и экспорта.
254
254
  - [ ] В тексте ответа нет английских имён полей и методов API — использованы термины из раздела [Язык ответа](#язык-ответа).
255
- - [ ] Нет неофициальных ярлыков («базис», «базисный слой») — термины КС из [DOMAIN.md](../../docs/DOMAIN.md).
255
+ - [ ] Нет неофициальных ярлыков («базис», «базисы», «базисный слой», «базовые понятия») — термины КС из [DOMAIN.md](../../docs/DOMAIN.md), раздел **«Термины: не путать»**. Для `X#` говори **базисное множество**, не «базис».
256
256
 
257
257
  ### Ревью концептуальной схемы
258
258
 
@@ -5,7 +5,7 @@
5
5
  ## Контракт rstool
6
6
 
7
7
  - Пакет: `@rsconcept/rstool`
8
- - Версия контракта: `3.2.0` (`CONTRACT_VERSION`)
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`)
@@ -116,7 +116,7 @@ tool.listDiagnostics({ kind: 'schema', constituentId: 3, severity: 'error' });
116
116
 
117
117
  Фильтры: `kind?: 'expression' | 'schema' | 'model'`, `constituentId?`, `severity?: 'error' | 'warning'`.
118
118
 
119
- Элемент диагностики (агентский вид): `kind`, `code`, `name`, `severity`, `alias?`, `expression`, `from`, `to`, `params?`. Ключ для поиска исправления — `name` ([DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)).
119
+ Элемент диагностики (агентский вид): `kind`, `code`, `name`, `severity`, `alias?`, `expression`, `from`, `to`, `params?`, `stack?` (цепочка вызовов при ошибке внутри `F#`/`P#`). Ключ для поиска исправления — `name` ([DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md)).
120
120
 
121
121
  ## `analyzeExpression`
122
122
 
@@ -51,7 +51,7 @@ description: >-
51
51
 
52
52
  ## Язык ответа пользователю
53
53
 
54
- В тексте для пользователя используй термины предметной области («формальное определение», «конституента», «диагностики»), а не английские имена полей и методов API (`definitionFormal`, `applySchemaPatch`). Идентификаторы API — только в коде, patch-ах и JSON. Словарь API → текст: раздел «Язык ответа» в GUIDE.md. Термины КС (базовые понятия, базисное множество, ядро) — только из `docs/DOMAIN.md`, раздел **«Термины: не путать»**.
54
+ В тексте для пользователя используй термины предметной области («формальное определение», «конституента», «диагностики»), а не английские имена полей и методов API (`definitionFormal`, `applySchemaPatch`). Идентификаторы API — только в коде, patch-ах и JSON. Словарь API → текст: раздел «Язык ответа» в GUIDE.md. Термины КС (**неопределяемые понятия**, **базисное множество**, ядро) — только из `docs/DOMAIN.md`, раздел **«Термины: не путать»**. Не сокращай «базисное множество» до «базис» / «базисы».
55
55
 
56
56
  ## Portal (приложение)
57
57
 
@@ -6,7 +6,7 @@ import {
6
6
  } from '@rsconcept/domain/library';
7
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. */
@@ -72,7 +74,8 @@ 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
 
@@ -9,6 +9,7 @@ export interface DomainErrorLike {
9
9
  from: number;
10
10
  to: number;
11
11
  params?: readonly string[];
12
+ stack?: RSErrorDescription['stack'];
12
13
  }
13
14
 
14
15
  /** Minimal domain analysis shape before mapping to {@link AnalysisResult}. */
@@ -15,7 +15,7 @@ import { type RecalculateModelResult, type SessionModelState, type SetModelValue
15
15
  import { type SessionHandle, type SessionRevision, type SessionState } from './session';
16
16
 
17
17
  /** Agent-visible contract version; bump on breaking API changes. */
18
- export const CONTRACT_VERSION = '3.2.0';
18
+ export const CONTRACT_VERSION = '3.3.0';
19
19
 
20
20
  /** Options for constructing an {@link RSToolAgent}. */
21
21
  export interface RSToolAgentOptions {
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostic-assembly-B-6vIA5I.js","names":[],"sources":["../src/mappers/diagnostic-assembly.ts"],"sourcesContent":["import {\n type CstDiagnostic,\n DiagnosticKind,\n modelStatusCstDiagnostic,\n RSDiagnosticCode\n} from '@rsconcept/domain/library';\nimport { type DiagnosticSourceFields } from '@rsconcept/domain/library/rsform-api';\nimport { EvalStatus } from '@rsconcept/domain/library/rsmodel';\nimport { isCritical, RSErrorCode, type RSErrorDescription } from '@rsconcept/domain/rslang/error';\n\nexport { DiagnosticKind, RSDiagnosticCode };\n\n/** Severity of a {@link Diagnostic}. */\nexport type DiagnosticSeverity = 'error' | 'warning';\n\n/** Agent-facing diagnostic with redundant fields for autonomous repair. */\nexport interface Diagnostic extends CstDiagnostic {\n name: string;\n severity: DiagnosticSeverity;\n constituentId?: number;\n alias?: string;\n expression: string;\n from: number;\n to: number;\n}\n\n/** Context for attributing a {@link Diagnostic} to a constituent. */\nexport interface DiagnosticTarget {\n constituentId?: number;\n alias?: string;\n}\n\nconst DIAGNOSTIC_NAMES: ReadonlyMap<number, string> = new Map([\n ...Object.entries(RSErrorCode).map(([name, code]) => [code, name] as const),\n ...Object.entries(RSDiagnosticCode).map(([name, code]) => [code, name] as const)\n]);\n\nexport function getDiagnosticName(code: number): string {\n return DIAGNOSTIC_NAMES.get(code) ?? `0x${code.toString(16).toUpperCase()}`;\n}\n\nexport function getDiagnosticSeverity(code: number): DiagnosticSeverity {\n return isCritical(code as RSErrorCode) ? 'error' : 'warning';\n}\n\nexport function expandCstDiagnostic(cst: DiagnosticSourceFields, diagnostic: CstDiagnostic): Diagnostic {\n const expression = expressionForCstDiagnostic(cst, diagnostic);\n return {\n ...diagnostic,\n name: getDiagnosticName(diagnostic.code),\n severity: getDiagnosticSeverity(diagnostic.code),\n constituentId: cst.id,\n alias: cst.alias,\n expression,\n from: 0,\n to: diagnostic.kind === DiagnosticKind.MODEL ? 0 : Math.max(expression.length, 1)\n };\n}\n\nexport function expressionDiagnostic(\n error: RSErrorDescription,\n expression: string,\n target?: DiagnosticTarget\n): Diagnostic {\n return {\n kind: DiagnosticKind.EXPRESSION,\n code: error.code,\n name: getDiagnosticName(error.code),\n severity: getDiagnosticSeverity(error.code),\n constituentId: target?.constituentId,\n alias: target?.alias,\n expression,\n from: error.from,\n to: error.to,\n ...(error.params ? { params: error.params } : {})\n };\n}\n\nexport function modelStatusDiagnostic(status: EvalStatus, cst: DiagnosticSourceFields): Diagnostic | null {\n const base = modelStatusCstDiagnostic(status, cst.cst_type);\n return base ? expandCstDiagnostic(cst, base) : null;\n}\n\nfunction expressionForCstDiagnostic(cst: DiagnosticSourceFields, diagnostic: CstDiagnostic): string {\n switch (diagnostic.code) {\n case RSDiagnosticCode.schemaHomonym:\n case RSDiagnosticCode.schemaMissingTerm:\n return cst.term_resolved;\n case RSDiagnosticCode.schemaMissingConvention:\n return cst.convention;\n case RSDiagnosticCode.schemaTypeMismatch:\n return cst.typification_manual;\n case RSDiagnosticCode.schemaDependencyCycle:\n case RSDiagnosticCode.schemaFormalDuplicate:\n return cst.definition_formal;\n default:\n return cst.definition_formal;\n }\n}\n"],"mappings":";;;AAgCA,MAAM,mBAAgD,IAAI,IAAI,CAC5D,GAAG,OAAO,QAAQ,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAI,CAAU,GAC1E,GAAG,OAAO,QAAQ,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,IAAI,CAAU,CACjF,CAAC;AAED,SAAgB,kBAAkB,MAAsB;CACtD,OAAO,iBAAiB,IAAI,IAAI,KAAK,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY;AAC1E;AAEA,SAAgB,sBAAsB,MAAkC;CACtE,OAAO,WAAW,IAAmB,IAAI,UAAU;AACrD;AAEA,SAAgB,oBAAoB,KAA6B,YAAuC;CACtG,MAAM,aAAa,2BAA2B,KAAK,UAAU;CAC7D,OAAO;EACL,GAAG;EACH,MAAM,kBAAkB,WAAW,IAAI;EACvC,UAAU,sBAAsB,WAAW,IAAI;EAC/C,eAAe,IAAI;EACnB,OAAO,IAAI;EACX;EACA,MAAM;EACN,IAAI,WAAW,SAAS,eAAe,QAAQ,IAAI,KAAK,IAAI,WAAW,QAAQ,CAAC;CAClF;AACF;AAEA,SAAgB,qBACd,OACA,YACA,QACY;CACZ,OAAO;EACL,MAAM,eAAe;EACrB,MAAM,MAAM;EACZ,MAAM,kBAAkB,MAAM,IAAI;EAClC,UAAU,sBAAsB,MAAM,IAAI;EAC1C,eAAe,QAAQ;EACvB,OAAO,QAAQ;EACf;EACA,MAAM,MAAM;EACZ,IAAI,MAAM;EACV,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;CACjD;AACF;AAEA,SAAgB,sBAAsB,QAAoB,KAAgD;CACxG,MAAM,OAAO,yBAAyB,QAAQ,IAAI,QAAQ;CAC1D,OAAO,OAAO,oBAAoB,KAAK,IAAI,IAAI;AACjD;AAEA,SAAS,2BAA2B,KAA6B,YAAmC;CAClG,QAAQ,WAAW,MAAnB;EACE,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,mBACpB,OAAO,IAAI;EACb,KAAK,iBAAiB,yBACpB,OAAO,IAAI;EACb,KAAK,iBAAiB,oBACpB,OAAO,IAAI;EACb,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,uBACpB,OAAO,IAAI;EACb,SACE,OAAO,IAAI;CACf;AACF"}