@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-DTLctDmB.js","names":[],"sources":["../src/models/portal-json.ts","../src/mappers/portal-adapter.ts","../src/mappers/diagnostics-collector.ts","../src/session/batch-apply.ts","../src/session/persistence.ts","../src/session/session-store.ts","../src/models/import-detect.ts","../src/models/rstool-agent.ts"],"sourcesContent":["import { CstType, type BasicBinding, type RSToolValue } from './common';\nimport { type ConstituentaDraft } from './constituenta';\n\nconst CST_TYPE_VALUES = new Set<string>(Object.values(CstType));\n\nfunction parsePortalCstType(value: string, alias: string): ConstituentaDraft['cstType'] {\n if (!CST_TYPE_VALUES.has(value)) {\n throw new Error(`Invalid cst_type \"${value}\" for constituent \"${alias}\"`);\n }\n return value as ConstituentaDraft['cstType'];\n}\n\n/** Portal JSON import/export format version (schema and model files). */\nexport const PORTAL_JSON_CONTRACT_VERSION = '1.0.0';\n\n/** Shared metadata block in Portal schema and model JSON files. */\nexport interface PortalImportMetadata {\n contract_version: string;\n title: string;\n alias: string;\n description: string;\n}\n\n/** Inflected or tagged surface form of a term. */\nexport interface PortalTermForm {\n text: string;\n tags: string;\n}\n\n/** One constituent in Portal schema JSON (`cst_type`, snake_case fields). */\nexport interface PortalSchemaConstituenta {\n id: number;\n alias: string;\n convention: string;\n crucial: boolean;\n cst_type: string;\n definition_formal: string;\n typification_manual: string;\n value_is_property: boolean;\n definition_raw: string;\n definition_resolved: string;\n term_raw: string;\n term_resolved: string;\n term_forms: PortalTermForm[];\n}\n\n/** Full Portal conceptual schema import/export document. */\nexport interface PortalSchemaImportData extends PortalImportMetadata {\n items: PortalSchemaConstituenta[];\n attribution: Array<{ container: number; attribute: number }>;\n}\n\n/** `GET /api/rsforms/:id/details` response (schema payload only). */\nexport interface PortalRsformDetails {\n id?: number;\n title?: string;\n alias?: string;\n description?: string;\n items: Array<{\n id: number;\n alias: string;\n cst_type: string;\n definition_formal?: string;\n term_raw?: string;\n definition_raw?: string;\n convention?: string;\n }>;\n}\n\n/** Full Portal conceptual model import/export document. */\nexport interface PortalModelImportData extends PortalImportMetadata {\n items: Array<{\n id: number;\n type: string;\n value: RSToolValue | BasicBinding;\n }>;\n}\n\n/** Map a Portal API or JSON schema item to an agent {@link ConstituentaDraft}. */\nexport function portalItemToDraft(item: {\n id: number;\n alias: string;\n cst_type: string;\n definition_formal?: string;\n term_raw?: string;\n definition_raw?: string;\n convention?: string;\n}): ConstituentaDraft {\n return {\n id: item.id,\n alias: item.alias,\n cstType: parsePortalCstType(item.cst_type, item.alias),\n definitionFormal: item.definition_formal ?? '',\n term: item.term_raw ?? '',\n definitionText: item.definition_raw ?? '',\n convention: item.convention ?? ''\n };\n}\n","import { type ConstituentaDraft } from '../models/constituenta';\nimport {\n type PortalImportMetadata,\n type PortalRsformDetails,\n type PortalSchemaImportData,\n portalItemToDraft\n} from '../models/portal-json';\nimport { type SessionState } from '../models/session';\n\ntype PortalSessionSeedInput = Partial<Pick<PortalImportMetadata, 'alias' | 'title' | 'description'>>;\n\nfunction portalMetadataToSessionSeed(data: PortalSessionSeedInput): Partial<SessionState> {\n return {\n alias: data.alias ?? '',\n title: data.title ?? '',\n comment: data.description ?? '',\n items: []\n };\n}\n\nexport function portalSchemaToSessionSeed(data: PortalSchemaImportData): Partial<SessionState> {\n return portalMetadataToSessionSeed(data);\n}\n\nexport function portalDetailsToSessionSeed(data: PortalRsformDetails): Partial<SessionState> {\n return portalMetadataToSessionSeed(data);\n}\n\nexport function portalItemsToDrafts(\n items: Array<{\n id: number;\n alias: string;\n cst_type: string;\n definition_formal?: string;\n term_raw?: string;\n definition_raw?: string;\n convention?: string;\n }>\n): ConstituentaDraft[] {\n return items.map(item => portalItemToDraft(item));\n}\n\nexport function portalSchemaToDrafts(data: PortalSchemaImportData): ConstituentaDraft[] {\n return portalItemsToDrafts(data.items);\n}\n\nexport function portalDetailsToDrafts(data: PortalRsformDetails): ConstituentaDraft[] {\n return portalItemsToDrafts(data.items);\n}\n","import { isModelIssue } from '@rsconcept/domain/library/rsmodel-api';\nimport { type RSErrorDescription } from '@rsconcept/domain/rslang';\n\nimport { type SessionState } from '../models';\nimport {\n DiagnosticKind,\n expandCstDiagnostic,\n expressionDiagnostic,\n modelStatusDiagnostic,\n type Diagnostic\n} from './diagnostic-assembly';\nimport { ModelAdapter } from './model-adapter';\nimport { enrichSessionConstituents } from './rsform-builder';\n\nconst modelAdapter = new ModelAdapter();\n\n/** Collect expression, schema, and model diagnostics for a session (Portal parity). */\nexport function collectSessionDiagnostics(session: SessionState): Diagnostic[] {\n const records: Diagnostic[] = [];\n\n for (const item of session.items) {\n for (const diagnostic of item.analysis.diagnostics) {\n const base = diagnostic.name\n ? diagnostic\n : expressionDiagnostic(\n {\n code: diagnostic.code,\n from: diagnostic.from,\n to: diagnostic.to,\n params: diagnostic.params\n } as RSErrorDescription,\n item.definitionFormal,\n {\n constituentId: item.id,\n alias: item.alias\n }\n );\n records.push({\n ...base,\n kind: DiagnosticKind.EXPRESSION,\n constituentId: base.constituentId ?? item.id,\n alias: base.alias ?? item.alias\n });\n }\n }\n\n const enriched = enrichSessionConstituents(session);\n for (const { cst } of enriched) {\n for (const diagnostic of cst.diagnostics) {\n if (diagnostic.kind !== DiagnosticKind.SCHEMA) {\n continue;\n }\n records.push(expandCstDiagnostic(cst, diagnostic));\n }\n }\n\n if (session.items.length > 0) {\n const schema = enriched.map(entry => entry.cst);\n const engine = modelAdapter.createEngine(session);\n engine.recalculateAll();\n for (const cst of schema) {\n if (!isModelIssue(engine, cst)) {\n continue;\n }\n const diagnostic = modelStatusDiagnostic(engine.getCstStatus(cst.id), cst);\n if (diagnostic) {\n records.push(diagnostic);\n }\n }\n }\n\n return records;\n}\n","import { Graph } from '@rsconcept/domain/graph/graph';\nimport { extractGlobals } from '@rsconcept/domain/rslang/api';\n\nimport { type ConstituentaDraft, type ConstituentaState } from '../models';\n\n/** Order drafts so suppliers are applied before dependents. */\nexport function orderDrafts(sessionItems: ConstituentaState[], drafts: ConstituentaDraft[]): ConstituentaDraft[] {\n const merged = new Map<number, ConstituentaDraft>();\n for (const item of sessionItems) {\n merged.set(item.id, {\n id: item.id,\n alias: item.alias,\n cstType: item.cstType,\n definitionFormal: item.definitionFormal\n });\n }\n for (const draft of drafts) {\n merged.set(draft.id, draft);\n }\n\n const graph = new Graph<number>();\n const aliasToId = new Map<string, number>();\n for (const [id, draft] of merged) {\n graph.addNode(id);\n aliasToId.set(draft.alias, id);\n }\n\n for (const [id, draft] of merged) {\n if (!draft.definitionFormal) {\n continue;\n }\n for (const alias of extractGlobals(draft.definitionFormal)) {\n const depId = aliasToId.get(alias);\n if (depId !== undefined && depId !== id) {\n graph.addEdge(depId, id);\n }\n }\n }\n\n const draftIds = new Set(drafts.map(draft => draft.id));\n const topoIds = graph.topologicalOrder().filter(id => draftIds.has(id));\n const seen = new Set(topoIds);\n const missing = drafts.filter(draft => !seen.has(draft.id)).map(draft => draft.id);\n\n const orderedIds = [...topoIds, ...missing];\n return orderedIds.map(id => drafts.find(draft => draft.id === id)!).filter(Boolean);\n}\n\n/**\n * Restore declaration order in session items after a batch apply.\n * Topological apply order is only needed for analysis; Portal JSON uses array order.\n */\nexport function reorderSessionItemsByDrafts(\n items: ConstituentaState[],\n drafts: ConstituentaDraft[],\n preBatchItemIds: ReadonlySet<number>\n): void {\n if (drafts.length === 0 || items.length === 0) {\n return;\n }\n\n const draftIds = drafts.map(draft => draft.id);\n const draftIdSet = new Set(draftIds);\n const mentioned = items.filter(item => draftIdSet.has(item.id));\n if (mentioned.length === 0) {\n return;\n }\n\n const unmentioned = items.filter(item => !draftIdSet.has(item.id));\n if (unmentioned.length === 0) {\n const byId = new Map(items.map(item => [item.id, item]));\n items.splice(0, items.length, ...draftIds.map(id => byId.get(id)!));\n return;\n }\n\n const newDrafts = drafts.filter(draft => !preBatchItemIds.has(draft.id));\n if (newDrafts.length === 0) {\n return;\n }\n\n const newIds = new Set(newDrafts.map(draft => draft.id));\n const kept = items.filter(item => !newIds.has(item.id));\n const byId = new Map(items.map(item => [item.id, item]));\n items.splice(0, items.length, ...kept, ...newDrafts.map(draft => byId.get(draft.id)!));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type Diagnostic, type SessionState } from '../models';\n\nexport interface PersistedSessionEnvelope {\n state: SessionState;\n diagnostics: Diagnostic[];\n}\n\nconst CURRENT_SESSION_FILE = '_current.json';\nconst UNSAFE_SESSION_ID = /[/\\\\]|\\.\\./;\n\nfunction assertSafeSessionId(sessionId: string): void {\n if (!sessionId || UNSAFE_SESSION_ID.test(sessionId)) {\n throw new Error(`Invalid session ID: ${sessionId}`);\n }\n}\n\nexport class SessionPersistence {\n private readonly dir: string;\n\n public constructor(dir: string) {\n this.dir = dir;\n fs.mkdirSync(dir, { recursive: true });\n }\n\n public save(sessionId: string, envelope: PersistedSessionEnvelope): void {\n fs.writeFileSync(this.filePath(sessionId), JSON.stringify(envelope, null, 2), 'utf-8');\n }\n\n public load(sessionId: string): PersistedSessionEnvelope | null {\n const file = this.filePath(sessionId);\n if (!fs.existsSync(file)) {\n return null;\n }\n return JSON.parse(fs.readFileSync(file, 'utf-8')) as PersistedSessionEnvelope;\n }\n\n public delete(sessionId: string): void {\n const file = this.filePath(sessionId);\n if (fs.existsSync(file)) {\n fs.unlinkSync(file);\n }\n }\n\n public saveCurrentSessionId(sessionId: string | null): void {\n fs.writeFileSync(path.join(this.dir, CURRENT_SESSION_FILE), JSON.stringify({ sessionId }, null, 2), 'utf-8');\n }\n\n public loadCurrentSessionId(): string | null {\n const file = path.join(this.dir, CURRENT_SESSION_FILE);\n if (!fs.existsSync(file)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(file, 'utf-8')) as { sessionId?: string | null };\n return parsed.sessionId ?? null;\n }\n\n private filePath(sessionId: string): string {\n assertSafeSessionId(sessionId);\n const file = path.resolve(this.dir, `${sessionId}.json`);\n const relative = path.relative(path.resolve(this.dir), file);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Invalid session ID: ${sessionId}`);\n }\n return file;\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport {\n CONTRACT_VERSION,\n type Diagnostic,\n type ListDiagnosticsFilters,\n type SessionHandle,\n type SessionRevision,\n type SessionState\n} from '../models';\nimport { SessionPersistence, type PersistedSessionEnvelope } from './persistence';\n\nexport interface SessionStoreOptions {\n persistenceDir?: string;\n}\n\ninterface SessionEnvelope {\n state: SessionState;\n diagnostics: Diagnostic[];\n}\n\nexport class SessionStore {\n private sessions = new Map<string, SessionEnvelope>();\n private readonly persistence: SessionPersistence | null;\n\n public constructor(options: SessionStoreOptions = {}) {\n this.persistence = options.persistenceDir ? new SessionPersistence(options.persistenceDir) : null;\n }\n\n public create(initial?: Partial<SessionState>, contractVersion?: string): SessionHandle {\n const now = new Date().toISOString();\n const sessionId = initial?.sessionId ?? randomUUID();\n const state: SessionState = {\n sessionId,\n alias: initial?.alias ?? '',\n title: initial?.title ?? '',\n comment: initial?.comment ?? '',\n createdAt: initial?.createdAt ?? now,\n updatedAt: now,\n revisions: initial?.revisions ?? [],\n items: initial?.items ?? [],\n model: initial?.model ?? { items: [] }\n };\n const envelope: SessionEnvelope = {\n state,\n diagnostics: []\n };\n this.sessions.set(sessionId, envelope);\n this.persist(sessionId, envelope);\n return {\n sessionId,\n contractVersion: contractVersion ?? CONTRACT_VERSION\n };\n }\n\n public get(sessionId: string): SessionEnvelope {\n const found = this.sessions.get(sessionId) ?? this.loadFromDisk(sessionId);\n if (!found) {\n throw new Error(`Unknown session: ${sessionId}`);\n }\n return found;\n }\n\n public has(sessionId: string): boolean {\n if (this.sessions.has(sessionId)) {\n return true;\n }\n if (!this.persistence) {\n return false;\n }\n return this.persistence.load(sessionId) !== null;\n }\n\n public replaceState(sessionId: string, nextState: SessionState): void {\n const found = this.get(sessionId);\n found.state = {\n ...nextState,\n updatedAt: new Date().toISOString()\n };\n this.persist(sessionId, found);\n }\n\n public addRevision(sessionId: string, message?: string): SessionRevision {\n const found = this.get(sessionId);\n const revision: SessionRevision = {\n revisionId: randomUUID(),\n at: new Date().toISOString(),\n message\n };\n found.state.revisions.push(revision);\n found.state.updatedAt = revision.at;\n this.persist(sessionId, found);\n return revision;\n }\n\n /** Replace active diagnostics for one constituent (or scratch when constituentId is undefined). */\n public replaceDiagnosticsForConstituent(\n sessionId: string,\n constituentId: number | undefined,\n records: Diagnostic[]\n ): void {\n const found = this.get(sessionId);\n found.diagnostics = found.diagnostics.filter(record => record.constituentId !== constituentId);\n found.diagnostics.push(...records);\n found.state.updatedAt = new Date().toISOString();\n this.persist(sessionId, found);\n }\n\n public setDiagnostics(sessionId: string, records: Diagnostic[]): void {\n const found = this.get(sessionId);\n found.diagnostics = [...records];\n found.state.updatedAt = new Date().toISOString();\n this.persist(sessionId, found);\n }\n\n public listDiagnostics(sessionId: string, filters?: ListDiagnosticsFilters): Diagnostic[] {\n const found = this.get(sessionId);\n let records = found.diagnostics;\n if (filters?.kind !== undefined) {\n records = records.filter(record => record.kind === filters.kind);\n }\n if (filters?.severity !== undefined) {\n records = records.filter(record => record.severity === filters.severity);\n }\n if (filters?.constituentId === undefined) {\n return [...records];\n }\n return records.filter(record => record.constituentId === filters.constituentId);\n }\n\n public snapshot(sessionId: string): SessionEnvelope {\n const found = this.get(sessionId);\n return structuredClone(found);\n }\n\n public restore(sessionId: string, snapshot: SessionEnvelope): void {\n this.sessions.set(sessionId, structuredClone(snapshot));\n this.persist(sessionId, this.sessions.get(sessionId)!);\n }\n\n public saveCurrentSessionId(sessionId: string | null): void {\n this.persistence?.saveCurrentSessionId(sessionId);\n }\n\n public loadCurrentSessionId(): string | null {\n return this.persistence?.loadCurrentSessionId() ?? null;\n }\n\n private loadFromDisk(sessionId: string): SessionEnvelope | null {\n const loaded = this.persistence?.load(sessionId);\n if (!loaded) {\n return null;\n }\n this.sessions.set(sessionId, loaded);\n return loaded;\n }\n\n private persist(sessionId: string, envelope: SessionEnvelope): void {\n this.persistence?.save(sessionId, envelope as PersistedSessionEnvelope);\n }\n}\n","import { type ImportDataKind } from './import-export';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function parseImportPayload(payload: string | object): unknown {\n if (typeof payload === 'string') {\n return JSON.parse(payload) as unknown;\n }\n return payload;\n}\n\nexport function detectImportKind(data: unknown): Exclude<ImportDataKind, 'auto'> {\n if (!isRecord(data)) {\n throw new Error('Invalid import payload');\n }\n\n if ('contractVersion' in data && 'state' in data) {\n return 'session';\n }\n\n if ('contract_version' in data && Array.isArray(data.items)) {\n const items = data.items as unknown[];\n if (items.length > 0) {\n const first = items[0];\n if (isRecord(first) && 'cst_type' in first) {\n return 'portal-schema';\n }\n throw new Error('Portal model JSON cannot be imported as a schema session');\n }\n }\n\n if (Array.isArray(data.items) && data.items.length > 0) {\n const first = data.items[0];\n if (isRecord(first) && 'cst_type' in first) {\n return 'portal-details';\n }\n }\n\n throw new Error('Cannot detect import kind; pass kind explicitly');\n}\n","import {\n portalDetailsToDrafts,\n portalDetailsToSessionSeed,\n portalSchemaToDrafts,\n portalSchemaToSessionSeed\n} from '../mappers/portal-adapter';\nimport { collectSessionDiagnostics } from '../mappers/diagnostics-collector';\nimport { ModelAdapter } from '../mappers/model-adapter';\nimport { SchemaAdapter } from '../mappers/schema-adapter';\nimport { orderDrafts, reorderSessionItemsByDrafts } from '../session/batch-apply';\nimport { SessionStore } from '../session/session-store';\nimport {\n type AgentConstituentaPatch,\n type ApplySchemaPatchInput,\n type ApplySchemaPatchResult,\n type SessionStateDetail,\n type SessionStateResult,\n type SessionSummary\n} from './agent-workflow';\nimport { type AnalysisResult, type AnalyzeExpressionInput } from './analysis';\nimport { CstType } from './common';\nimport {\n type AddOrUpdateConstituentaInput,\n type AddOrUpdateConstituentaResult,\n type ApplyConstituentsInput,\n type ApplyConstituentsResult,\n type ConstituentaDraft,\n type ConstituentaState\n} from './constituenta';\nimport { type Diagnostic, type ListDiagnosticsFilters } from './diagnostic';\nimport { type EvaluateInput, type EvaluationResult } from './evaluation';\nimport { detectImportKind, parseImportPayload } from './import-detect';\nimport { type ExportPortalInput, type ExportPortalResult, type ImportDataKind } from './import-export';\nimport { type RecalculateModelResult, type SessionModelState, type SetModelValuesInput } from './model-value';\nimport {\n PORTAL_JSON_CONTRACT_VERSION,\n type PortalModelImportData,\n type PortalRsformDetails,\n type PortalSchemaImportData\n} from './portal-json';\nimport { type SessionHandle, type SessionRevision, type SessionState } from './session';\nimport { CONTRACT_VERSION, type RSToolAgentContract, type RSToolAgentOptions } from './tool-contract';\n\nfunction normalizeImportedState(state: SessionState): SessionState {\n return {\n ...state,\n alias: state.alias ?? '',\n title: state.title ?? '',\n comment: state.comment ?? '',\n model: state.model ?? { items: [] }\n };\n}\n\nfunction portalImportMetadata(\n session: SessionState,\n kind: 'schema' | 'model'\n): Pick<PortalSchemaImportData, 'title' | 'alias' | 'description'> {\n const defaults =\n kind === 'schema' ? { title: 'Conceptual schema', alias: 'SCHEMA' } : { title: 'Conceptual model', alias: 'MODEL' };\n const title = session.title.trim();\n const alias = session.alias.trim();\n return {\n title: title.length > 0 ? title : defaults.title,\n alias: alias.length > 0 ? alias : defaults.alias,\n description: session.comment.trim()\n };\n}\n\nfunction inferCstType(alias: string): CstType {\n const prefix = alias.trim().charAt(0).toUpperCase();\n switch (prefix) {\n case 'X':\n return CstType.BASE;\n case 'C':\n return CstType.CONSTANT;\n case 'S':\n return CstType.STRUCTURED;\n case 'D':\n return CstType.TERM;\n case 'A':\n return CstType.AXIOM;\n case 'F':\n return CstType.FUNCTION;\n case 'P':\n return CstType.PREDICATE;\n case 'N':\n return CstType.NOMINAL;\n case 'T':\n return CstType.STATEMENT;\n default:\n throw new Error(`Cannot infer cstType from alias \"${alias}\"; pass cstType explicitly`);\n }\n}\n\n/**\n * Agent-facing entry point for incremental RSForm editing, analysis, diagnostics,\n * modeling, and evaluation.\n *\n * Holds in-memory (optionally persisted) sessions and delegates language work\n * to internal schema and model adapters.\n */\nexport class RSToolAgent implements RSToolAgentContract {\n public readonly contractVersion = CONTRACT_VERSION;\n private readonly sessions: SessionStore;\n private readonly adapter = new SchemaAdapter();\n private readonly evaluation = new ModelAdapter();\n private currentSessionId: string | null;\n\n /** @param options - Optional persistence directory for session storage. */\n public constructor(options: RSToolAgentOptions = {}) {\n this.sessions = new SessionStore({ persistenceDir: options.persistenceDir });\n this.currentSessionId = this.sessions.loadCurrentSessionId();\n }\n\n /** @inheritdoc */\n public ensureSession(initial?: Partial<SessionState>): SessionHandle {\n const current = this.getCurrentSession();\n return current ?? this.createSession(initial);\n }\n\n /** @inheritdoc */\n public createSession(initial?: Partial<SessionState>): SessionHandle {\n return this.trackSession(this.sessions.create(initial, this.contractVersion));\n }\n\n /** @inheritdoc */\n public getCurrentSession(): SessionHandle | null {\n if (!this.currentSessionId) {\n return null;\n }\n if (!this.sessions.has(this.currentSessionId)) {\n this.currentSessionId = null;\n this.sessions.saveCurrentSessionId(null);\n return null;\n }\n return { sessionId: this.currentSessionId, contractVersion: this.contractVersion };\n }\n\n /** @inheritdoc */\n public setCurrentSession(sessionId: string): SessionHandle {\n if (!this.sessions.has(sessionId)) {\n throw new Error(`Unknown session: ${sessionId}`);\n }\n return this.trackSession({ sessionId, contractVersion: this.contractVersion });\n }\n\n /** @inheritdoc */\n public applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult {\n const session = sessionId\n ? { sessionId: this.resolveSessionId(sessionId), contractVersion: this.contractVersion }\n : this.ensureSession(input.initial);\n const drafts = this.resolveAgentPatches(session.sessionId, input.items);\n const result = this.applyConstituents(\n {\n drafts,\n mode: input.mode\n },\n session.sessionId\n );\n const revision =\n result.success && input.commitMessage ? this.commitStep(input.commitMessage, session.sessionId) : undefined;\n return {\n ...result,\n session,\n summary: this.buildSessionSummary(session.sessionId),\n revision\n };\n }\n\n /** @inheritdoc */\n public getSessionState(detail: SessionStateDetail = 'summary', sessionId?: string): SessionStateResult {\n if (detail === 'full') {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return structuredClone(envelope.state);\n }\n return this.buildSessionSummary(sessionId);\n }\n\n /** @inheritdoc */\n public listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string) {\n return this.sessions.listDiagnostics(this.resolveSessionId(sessionId), filters);\n }\n\n /** @inheritdoc */\n public analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const { result, diagnostics } = this.adapter.analyzeAgainstSession(envelope.state, {\n id: -1,\n alias: '_analysis',\n cstType: input.cstType,\n definitionFormal: input.expression\n });\n if (input.recordDiagnostics) {\n const refreshed = collectSessionDiagnostics(envelope.state);\n this.sessions.setDiagnostics(id, [\n ...refreshed,\n ...diagnostics.map(item => ({ ...item, constituentId: undefined }))\n ]);\n }\n return result;\n }\n\n /** @inheritdoc */\n public commitStep(message?: string, sessionId?: string): SessionRevision {\n return this.sessions.addRevision(this.resolveSessionId(sessionId), message);\n }\n\n /** @inheritdoc */\n public exportSession(sessionId?: string): string {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return JSON.stringify(\n {\n contractVersion: this.contractVersion,\n state: envelope.state,\n diagnostics: envelope.diagnostics\n },\n null,\n 2\n );\n }\n\n /** @inheritdoc */\n public exportPortal(input: ExportPortalInput, sessionId?: string): ExportPortalResult {\n const format = input.format ?? 'json';\n const object =\n input.kind === 'schema' ? this.buildPortalSchemaObject(sessionId) : this.buildPortalModelObject(sessionId);\n return format === 'object' ? object : JSON.stringify(object, null, 2);\n }\n\n /** @inheritdoc */\n public importData(payload: string | object, kind: ImportDataKind = 'auto'): SessionHandle {\n const parsed = parseImportPayload(payload);\n const resolvedKind = kind === 'auto' ? detectImportKind(parsed) : kind;\n\n switch (resolvedKind) {\n case 'session':\n return this.importSessionExport(parsed);\n case 'portal-schema':\n return this.importPortalSchemaData(parsed as PortalSchemaImportData);\n case 'portal-details':\n return this.importPortalDetailsData(parsed as PortalRsformDetails);\n default:\n throw new Error(`Unsupported import kind: ${resolvedKind as string}`);\n }\n }\n\n /** @inheritdoc */\n public async setModelValues(input: SetModelValuesInput, sessionId?: string): Promise<SessionModelState> {\n const id = this.resolveSessionId(sessionId);\n const snapshot = this.sessions.snapshot(id);\n\n try {\n let state = this.sessions.get(id).state;\n\n if (input.clear?.length) {\n const model = await this.evaluation.clearConstituentaValues(state, input.clear);\n state = { ...state, model };\n this.sessions.replaceState(id, state);\n }\n\n if (input.set?.length) {\n state = this.sessions.get(id).state;\n const model = await this.evaluation.setConstituentaValues(state, { items: input.set });\n state = { ...state, model };\n this.sessions.replaceState(id, state);\n this.refreshDiagnostics(id);\n return model;\n }\n\n this.refreshDiagnostics(id);\n return structuredClone(this.sessions.get(id).state.model);\n } catch (error) {\n this.sessions.restore(id, snapshot);\n throw error;\n }\n }\n\n /** @inheritdoc */\n public getModelState(sessionId?: string): SessionModelState {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return structuredClone(envelope.state.model);\n }\n\n /** @inheritdoc */\n public evaluate(input: EvaluateInput, sessionId?: string): EvaluationResult {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n\n if (input.constituentId !== undefined) {\n return this.evaluation.evaluateConstituenta(envelope.state, input.constituentId);\n }\n\n if (input.expression !== undefined && input.cstType !== undefined) {\n return this.evaluation.evaluateExpression(envelope.state, input.expression, input.cstType);\n }\n\n throw new Error('evaluate requires constituentId or expression with cstType');\n }\n\n /** @inheritdoc */\n public recalculateModel(sessionId?: string): RecalculateModelResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const result = this.evaluation.recalculateModel(envelope.state);\n this.refreshDiagnostics(id);\n return result;\n }\n\n private addOrUpdateConstituenta(\n input: AddOrUpdateConstituentaInput,\n sessionId?: string\n ): AddOrUpdateConstituentaResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const { result, diagnostics } = this.adapter.analyzeAgainstSession(envelope.state, input.draft);\n const state = this.adapter.mergeStateWithDraft(envelope.state, input.draft, result);\n return { state, diagnostics };\n }\n\n private applyConstituents(input: ApplyConstituentsInput, sessionId?: string): ApplyConstituentsResult {\n const id = this.resolveSessionId(sessionId);\n const mode = input.mode ?? 'atomic';\n const ordered = orderDrafts(this.sessions.get(id).state.items, input.drafts);\n const preBatchItemIds = new Set(this.sessions.get(id).state.items.map(item => item.id));\n const snapshot = this.sessions.snapshot(id);\n const applied: ConstituentaState[] = [];\n const failed: ApplyConstituentsResult['failed'] = [];\n\n for (const draft of ordered) {\n const result = this.addOrUpdateConstituenta({ draft }, id);\n if (result.state.analysis.success) {\n applied.push(result.state);\n continue;\n }\n failed.push({ draft, diagnostics: result.diagnostics });\n if (mode === 'atomic') {\n this.sessions.restore(id, snapshot);\n return {\n success: false,\n applied: [],\n failed,\n diagnostics: this.sessions.listDiagnostics(id)\n };\n }\n }\n\n const envelope = this.sessions.get(id);\n reorderSessionItemsByDrafts(envelope.state.items, input.drafts, preBatchItemIds);\n this.sessions.replaceState(id, envelope.state);\n this.refreshDiagnostics(id);\n\n return {\n success: failed.length === 0,\n applied,\n failed,\n diagnostics: this.sessions.listDiagnostics(id)\n };\n }\n\n private buildSessionSummary(sessionId?: string): SessionSummary {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const diagnostics = this.sessions.listDiagnostics(id);\n return {\n sessionId: id,\n contractVersion: this.contractVersion,\n alias: envelope.state.alias,\n title: envelope.state.title,\n comment: envelope.state.comment,\n itemCount: envelope.state.items.length,\n modelItemCount: envelope.state.model.items.length,\n diagnosticsCount: diagnostics.length,\n items: envelope.state.items.map(item => ({\n id: item.id,\n alias: item.alias,\n cstType: item.cstType,\n analysisSuccess: item.analysis.success\n })),\n diagnostics,\n lastRevision: envelope.state.revisions.at(-1)\n };\n }\n\n private buildPortalSchemaObject(sessionId?: string): PortalSchemaImportData {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return {\n contract_version: PORTAL_JSON_CONTRACT_VERSION,\n ...portalImportMetadata(envelope.state, 'schema'),\n items: envelope.state.items.map(item => ({\n id: item.id,\n alias: item.alias,\n convention: item.convention,\n crucial: false,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal,\n typification_manual: '',\n value_is_property: false,\n definition_raw: item.definitionText,\n definition_resolved: item.definitionText,\n term_raw: item.term,\n term_resolved: item.term,\n term_forms: []\n })),\n attribution: []\n };\n }\n\n private buildPortalModelObject(sessionId?: string): PortalModelImportData {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return {\n contract_version: PORTAL_JSON_CONTRACT_VERSION,\n ...portalImportMetadata(envelope.state, 'model'),\n items: envelope.state.model.items.map(item => ({\n id: item.id,\n type: item.type,\n value: item.value\n }))\n };\n }\n\n private importSessionExport(parsed: unknown): SessionHandle {\n if (!parsed || typeof parsed !== 'object' || !('state' in parsed)) {\n throw new Error('Invalid session export payload');\n }\n const data = parsed as {\n state: SessionState;\n diagnostics?: Diagnostic[];\n };\n const handle = this.sessions.create(normalizeImportedState(data.state), this.contractVersion);\n if (data.diagnostics?.length) {\n this.sessions.setDiagnostics(handle.sessionId, data.diagnostics);\n }\n this.refreshDiagnostics(handle.sessionId);\n return this.trackSession(handle);\n }\n\n private importPortalSchemaData(data: PortalSchemaImportData): SessionHandle {\n const handle = this.createSession(portalSchemaToSessionSeed(data));\n this.applyConstituents({ drafts: portalSchemaToDrafts(data), mode: 'best_effort' }, handle.sessionId);\n return handle;\n }\n\n private importPortalDetailsData(data: PortalRsformDetails): SessionHandle {\n const handle = this.createSession(portalDetailsToSessionSeed(data));\n this.applyConstituents({ drafts: portalDetailsToDrafts(data), mode: 'best_effort' }, handle.sessionId);\n return handle;\n }\n\n private resolveAgentPatches(sessionId: string, patches: AgentConstituentaPatch[]): ConstituentaDraft[] {\n const items = this.sessions.get(sessionId).state.items;\n const existingByAlias = new Map(items.map(item => [item.alias, item]));\n const usedIds = new Set(items.map(item => item.id));\n let nextId = items.reduce((max, item) => Math.max(max, item.id), 0) + 1;\n\n const reserveId = (id: number): void => {\n usedIds.add(id);\n if (id >= nextId) {\n nextId = id + 1;\n }\n };\n\n const allocateId = (): number => {\n while (usedIds.has(nextId)) {\n nextId += 1;\n }\n const id = nextId;\n nextId += 1;\n usedIds.add(id);\n return id;\n };\n\n return patches.map(patch => {\n const existing = existingByAlias.get(patch.alias);\n let id: number;\n if (patch.id !== undefined) {\n id = patch.id;\n reserveId(id);\n } else if (existing !== undefined) {\n id = existing.id;\n } else {\n id = allocateId();\n }\n const draft = {\n id,\n alias: patch.alias,\n cstType: patch.cstType ?? existing?.cstType ?? inferCstType(patch.alias),\n definitionFormal: patch.definitionFormal ?? existing?.definitionFormal ?? '',\n term: patch.term ?? existing?.term ?? '',\n definitionText: patch.definitionText ?? existing?.definitionText ?? '',\n convention: patch.convention ?? existing?.convention ?? ''\n };\n existingByAlias.set(patch.alias, {\n ...draft,\n analysis: existing?.analysis ?? { success: true, type: null, valueClass: 'value', diagnostics: [] }\n });\n return draft;\n });\n }\n\n private resolveSessionId(sessionId?: string): string {\n const id = sessionId ?? this.currentSessionId;\n if (!id) {\n return this.createSession().sessionId;\n }\n if (!this.sessions.has(id)) {\n if (sessionId) {\n throw new Error(`Unknown session: ${sessionId}`);\n }\n return this.createSession().sessionId;\n }\n return id;\n }\n\n private trackSession(handle: SessionHandle): SessionHandle {\n this.currentSessionId = handle.sessionId;\n this.sessions.saveCurrentSessionId(handle.sessionId);\n return handle;\n }\n\n private refreshDiagnostics(sessionId: string): void {\n const envelope = this.sessions.get(sessionId);\n this.sessions.setDiagnostics(sessionId, collectSessionDiagnostics(envelope.state));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
3
|
-
import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-
|
|
4
|
-
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-
|
|
5
|
-
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-
|
|
6
|
-
import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-
|
|
7
|
-
import { a as ExportPortalInput, n as RSToolAgentContract, o as ExportPortalResult, r as RSToolAgentOptions, s as ImportDataKind } from "./tool-contract-
|
|
1
|
+
import { a as Diagnostic, r as ListDiagnosticsFilters } from "./diagnostic-C6TRoBgt.js";
|
|
2
|
+
import { n as AnalyzeExpressionInput, t as AnalysisResult } from "./analysis-DA44pfgA.js";
|
|
3
|
+
import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-BUhr2IjA.js";
|
|
4
|
+
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-CI4rLYby.js";
|
|
5
|
+
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-D22FeODL.js";
|
|
6
|
+
import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-Cd4S7-3t.js";
|
|
7
|
+
import { a as ExportPortalInput, n as RSToolAgentContract, o as ExportPortalResult, r as RSToolAgentOptions, s as ImportDataKind } from "./tool-contract-sQfr-DYD.js";
|
|
8
8
|
|
|
9
9
|
//#region src/models/rstool-agent.d.ts
|
|
10
10
|
/**
|
|
@@ -15,7 +15,7 @@ import { a as ExportPortalInput, n as RSToolAgentContract, o as ExportPortalResu
|
|
|
15
15
|
* to internal schema and model adapters.
|
|
16
16
|
*/
|
|
17
17
|
declare class RSToolAgent implements RSToolAgentContract {
|
|
18
|
-
readonly contractVersion = "
|
|
18
|
+
readonly contractVersion = "3.0.0";
|
|
19
19
|
private readonly sessions;
|
|
20
20
|
private readonly adapter;
|
|
21
21
|
private readonly evaluation;
|
|
@@ -35,7 +35,7 @@ declare class RSToolAgent implements RSToolAgentContract {
|
|
|
35
35
|
/** @inheritdoc */
|
|
36
36
|
getSessionState(detail?: SessionStateDetail, sessionId?: string): SessionStateResult;
|
|
37
37
|
/** @inheritdoc */
|
|
38
|
-
listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string):
|
|
38
|
+
listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string): Diagnostic[];
|
|
39
39
|
/** @inheritdoc */
|
|
40
40
|
analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult;
|
|
41
41
|
/** @inheritdoc */
|
|
@@ -65,7 +65,8 @@ declare class RSToolAgent implements RSToolAgentContract {
|
|
|
65
65
|
private resolveAgentPatches;
|
|
66
66
|
private resolveSessionId;
|
|
67
67
|
private trackSession;
|
|
68
|
+
private refreshDiagnostics;
|
|
68
69
|
}
|
|
69
70
|
//#endregion
|
|
70
71
|
export { RSToolAgent as t };
|
|
71
|
-
//# sourceMappingURL=rstool-agent-
|
|
72
|
+
//# sourceMappingURL=rstool-agent-BMVAyMAG.d.ts.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-
|
|
1
|
+
import { a as Diagnostic, r as ListDiagnosticsFilters } from "../diagnostic-C6TRoBgt.js";
|
|
2
|
+
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-CI4rLYby.js";
|
|
3
3
|
//#region src/session/session-store.d.ts
|
|
4
4
|
interface SessionStoreOptions {
|
|
5
5
|
persistenceDir?: string;
|
|
6
6
|
}
|
|
7
7
|
interface SessionEnvelope {
|
|
8
8
|
state: SessionState;
|
|
9
|
-
diagnostics:
|
|
9
|
+
diagnostics: Diagnostic[];
|
|
10
10
|
}
|
|
11
11
|
declare class SessionStore {
|
|
12
12
|
private sessions;
|
|
@@ -18,9 +18,9 @@ declare class SessionStore {
|
|
|
18
18
|
replaceState(sessionId: string, nextState: SessionState): void;
|
|
19
19
|
addRevision(sessionId: string, message?: string): SessionRevision;
|
|
20
20
|
/** Replace active diagnostics for one constituent (or scratch when constituentId is undefined). */
|
|
21
|
-
replaceDiagnosticsForConstituent(sessionId: string, constituentId: number | undefined, records:
|
|
22
|
-
setDiagnostics(sessionId: string, records:
|
|
23
|
-
listDiagnostics(sessionId: string, filters?: ListDiagnosticsFilters):
|
|
21
|
+
replaceDiagnosticsForConstituent(sessionId: string, constituentId: number | undefined, records: Diagnostic[]): void;
|
|
22
|
+
setDiagnostics(sessionId: string, records: Diagnostic[]): void;
|
|
23
|
+
listDiagnostics(sessionId: string, filters?: ListDiagnosticsFilters): Diagnostic[];
|
|
24
24
|
snapshot(sessionId: string): SessionEnvelope;
|
|
25
25
|
restore(sessionId: string, snapshot: SessionEnvelope): void;
|
|
26
26
|
saveCurrentSessionId(sessionId: string | null): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SessionStore } from "../models-
|
|
1
|
+
import { n as SessionStore } from "../models-DTLctDmB.js";
|
|
2
2
|
export { SessionStore };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { s as ConstituentaState } from "./constituenta-
|
|
2
|
-
import { i as SessionModelState } from "./model-value-
|
|
1
|
+
import { s as ConstituentaState } from "./constituenta-QY5w1x91.js";
|
|
2
|
+
import { i as SessionModelState } from "./model-value-BUhr2IjA.js";
|
|
3
3
|
|
|
4
4
|
//#region src/models/session.d.ts
|
|
5
5
|
/** Opaque session reference returned by create/import operations. */
|
|
@@ -35,4 +35,4 @@ interface SessionState {
|
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
37
|
export { SessionRevision as n, SessionState as r, SessionHandle as t };
|
|
38
|
-
//# sourceMappingURL=session-
|
|
38
|
+
//# sourceMappingURL=session-CI4rLYby.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as
|
|
4
|
-
import { o as ConstituentaDraft } from "./constituenta-
|
|
5
|
-
import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-
|
|
6
|
-
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-
|
|
7
|
-
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-
|
|
8
|
-
import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-
|
|
1
|
+
import { a as Diagnostic, r as ListDiagnosticsFilters } from "./diagnostic-C6TRoBgt.js";
|
|
2
|
+
import { a as RSToolValue, t as BasicBinding } from "./common-D6TFl6l_.js";
|
|
3
|
+
import { n as AnalyzeExpressionInput, t as AnalysisResult } from "./analysis-DA44pfgA.js";
|
|
4
|
+
import { o as ConstituentaDraft } from "./constituenta-QY5w1x91.js";
|
|
5
|
+
import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-BUhr2IjA.js";
|
|
6
|
+
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-CI4rLYby.js";
|
|
7
|
+
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-D22FeODL.js";
|
|
8
|
+
import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-Cd4S7-3t.js";
|
|
9
9
|
|
|
10
10
|
//#region src/models/portal-json.d.ts
|
|
11
11
|
/** Portal JSON import/export format version (schema and model files). */
|
|
@@ -103,7 +103,7 @@ type ExportPortalResult = string | PortalSchemaImportData | PortalModelImportDat
|
|
|
103
103
|
//#endregion
|
|
104
104
|
//#region src/models/tool-contract.d.ts
|
|
105
105
|
/** Agent-visible contract version; bump on breaking API changes. */
|
|
106
|
-
declare const CONTRACT_VERSION = "
|
|
106
|
+
declare const CONTRACT_VERSION = "3.0.0";
|
|
107
107
|
/** Options for constructing an {@link RSToolAgent}. */
|
|
108
108
|
interface RSToolAgentOptions {
|
|
109
109
|
/** When set, sessions are persisted to this directory and survive process restarts. */
|
|
@@ -130,8 +130,8 @@ interface RSToolAgentContract {
|
|
|
130
130
|
applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult;
|
|
131
131
|
/** Return session summary (default) or full cloned state when `detail` is `'full'`. */
|
|
132
132
|
getSessionState(detail?: SessionStateDetail, sessionId?: string): SessionStateResult;
|
|
133
|
-
/** List diagnostics for the session, optionally filtered by constituent. */
|
|
134
|
-
listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string):
|
|
133
|
+
/** List diagnostics for the session, optionally filtered by constituent or kind. */
|
|
134
|
+
listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string): Diagnostic[];
|
|
135
135
|
/** Parse and type-check an RSLang expression against the current schema context. */
|
|
136
136
|
analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult;
|
|
137
137
|
/** Record a revision checkpoint with an optional message. */
|
|
@@ -161,4 +161,4 @@ interface RSToolAgentContract {
|
|
|
161
161
|
}
|
|
162
162
|
//#endregion
|
|
163
163
|
export { ExportPortalInput as a, PortalExportKind as c, PortalModelImportData as d, PortalRsformDetails as f, portalItemToDraft as g, PortalTermForm as h, ExportFormat as i, PORTAL_JSON_CONTRACT_VERSION as l, PortalSchemaImportData as m, RSToolAgentContract as n, ExportPortalResult as o, PortalSchemaConstituenta as p, RSToolAgentOptions as r, ImportDataKind as s, CONTRACT_VERSION as t, PortalImportMetadata as u };
|
|
164
|
-
//# sourceMappingURL=tool-contract-
|
|
164
|
+
//# sourceMappingURL=tool-contract-sQfr-DYD.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Выбор основания
|
|
2
|
+
|
|
3
|
+
Краткий справочник для агентов: когда вводить `X#`, `C#` или использовать встроенную ступень `Z`. Термины — [DOMAIN.md](DOMAIN.md); поля конституент — [CONSTITUENTA.md](CONSTITUENTA.md).
|
|
4
|
+
|
|
5
|
+
## Выбор основания
|
|
6
|
+
|
|
7
|
+
| Что нужно выразить | Выбор | Почему |
|
|
8
|
+
| :---------------------------------------------------------------------- | :---- | :--------------------------------------------------------------------------- |
|
|
9
|
+
| Предметные объекты без числового смысла: люди, документы, ситуации | `X#` | Элементы задаются интерпретацией и различаются только как элементы множества |
|
|
10
|
+
| Конечный именованный набор, где в формулах нужны порядок или арифметика | `C#` | Элементы интерпретируются в КМ, но поддерживают сравнение и арифметику языка |
|
|
11
|
+
| Чистые целые: размеры, счётчики, индексы, `card`, рекурсия над числами | `Z` | Это встроенная ступень RSLang; отдельная конституента не нужна |
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
Нужно неопределяемое понятие?
|
|
15
|
+
├─ Сущности предметной области (люди, документы, ситуации) → X#
|
|
16
|
+
└─ Числа / ранги / уровни
|
|
17
|
+
├─ Конечный именованный набор, интерпретируется в КМ → C#
|
|
18
|
+
└─ Абстрактные целые, только вычисления (Z×Z, card, R{…}) → Z
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Практическое правило: если число является свойством объекта, не кодируй объект через `C#`. Введи объект как `X#`, связь или атрибут как `S#`, а вычислимые выборки и проверки — как `D#` / `F#` / `P#`.
|
|
22
|
+
|
|
23
|
+
## Биективная переносимость
|
|
24
|
+
|
|
25
|
+
**Биективная переносимость** — независимость значения формального определения от биективной замены интерпретаций неопределяемых понятий: если согласованно переименовать все элементы `X1`, `C1`, `S1` (без слияний и потерь), результат вычисления зависит только от структуры, не от «имён». Семантический анализатор отсекает формулы, нарушающие переносимость; логическую непротиворечивость подтверждают отдельно — примером интерпретации в КМ.
|
|
26
|
+
|
|
27
|
+
Элементы **базисных множеств** принципиально несравнимы: нет встроенного порядка и арифметики. Допустимы только принадлежность (`ξ ∈ X1`), равенство внутри одной ступени (`a = b` при `a, b ∈ X1` — «тот же элемент», не порядок) и построения над множествами/кортежами. Запреты анализатора:
|
|
28
|
+
|
|
29
|
+
- `ξ < η` для `ξ, η ∈ X1` → `orderingNotSupported`;
|
|
30
|
+
- `X1 + 1`, `debool(X1) * 2` → `arithmeticNotSupported`;
|
|
31
|
+
- `debool(X1) = 1` → несовместимые ступени (`X1` и `Z`).
|
|
32
|
+
|
|
33
|
+
Необходимое условие переносимости — согласованная **типизация** всех идентификаторов ([TYPIFICATION.md](TYPIFICATION.md)): нарушение (`ξ ∈ X1` при `ξ : Z`, `S1 = S2` при разных ступенях) — ошибка ещё до вычисления.
|
|
34
|
+
|
|
35
|
+
Следствия для агента:
|
|
36
|
+
|
|
37
|
+
1. Предметные объекты без числового смысла — **`X#`**; числовые ограничения на них выражай через **`S#`**, **`F#`**, **`P#`**, а не через `<` на элементах `X#`.
|
|
38
|
+
2. Если формула «узнаёт» конкретные элементы базисного множества по способу, не заданному в схеме (скрытый порядок, кодирование атрибута константами) — вероятное нарушение переносимости или лишняя конституента.
|
|
39
|
+
3. Перед сохранением сомнительной формулы — `analyzeExpression`.
|
|
40
|
+
|
|
41
|
+
**Иллюстрация (родство):** при `X1 = {alice, bob, carol}` биективная замена на `{p1, p2, p3}` не меняет, кто чей родитель в `S1: ℬ(X1×X1)`, если пары переименованы согласованно. Формула `∀a,b∈X1 a < b` некорректна — порядок на людях в RSLang не задан.
|
|
42
|
+
|
|
43
|
+
## Детали по вариантам
|
|
44
|
+
|
|
45
|
+
**`X#` — базисное множество.** Формальное определение пустое; конвенция фиксирует, что считается элементом. В КМ значения задаются явным перечислением. Элементы можно проверять на принадлежность и равенство внутри одной ступени, но нельзя упорядочивать или использовать в арифметике.
|
|
46
|
+
|
|
47
|
+
**`C#` — константное множество.** Формальное определение тоже пустое; значения задаются в КМ. В формулах допустимы сравнения и арифметика языка, включая согласованное смешивание с целочисленными литералами (`C1 ∪ {1}`, `ξ + 1`, `α < β`). Используй для шкал оценок, уровней допуска, номеров фаз процесса — когда эти значения являются частью модели.
|
|
48
|
+
|
|
49
|
+
**`Z` — встроенная ступень целых.** В схеме нет записи с `alias` для целых; `Z` используется прямо в типизациях и формулах (`Z×Z`, `[α∈Z]`, `ℬ(Z)`). В КМ `Z` отдельно не заполняется.
|
|
50
|
+
|
|
51
|
+
### `Z` и `C#`
|
|
52
|
+
|
|
53
|
+
| Вопрос | `C#` | `Z` |
|
|
54
|
+
| :------------------------------------- | :-------------------------------------------- | :----------------------------------------------------- |
|
|
55
|
+
| Есть ли конституента в списке схемы? | да | нет |
|
|
56
|
+
| Нужна ли интерпретация элементов в КМ? | да (`setModelValues`) | нет |
|
|
57
|
+
| Домен | конечный именованный набор предметной области | бесконечные целые |
|
|
58
|
+
| Типичная мотивация | «оценки 1–5», «уровни 0–3» как объекты модели | размеры, координаты, остатки, `card`, чистые алгоритмы |
|
|
59
|
+
|
|
60
|
+
Учебный пример **без** `X#` и `C#`: `examples/chocolate-nim/` — ширина и длина шоколадки как `Z×Z`, арифметика и `R{…}` только над `Z`.
|
|
61
|
+
|
|
62
|
+
## Минимальные примеры
|
|
63
|
+
|
|
64
|
+
**Базисное + отношение** (родство):
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
X1 — люди (конвенция)
|
|
68
|
+
S1: ℬ(X1×X1) — родитель–ребёнок
|
|
69
|
+
D1 := Pr1(S1) — родители
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Константное** (шкала; элементы интерпретируются в модели):
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
C1 — оценки 1…5 (конвенция)
|
|
76
|
+
P1 ::= [ξ∈C1] ξ ≥ 3
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Целые без конституенты** (размеры):
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
S1: Z×Z — пара (ширина, длина)
|
|
83
|
+
D1 := pr1(S1) — ширина
|
|
84
|
+
F1 ::= [α∈Z] α - 1
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## См. также
|
|
88
|
+
|
|
89
|
+
- [CONCEPTUAL-SCHEMA.md](CONCEPTUAL-SCHEMA.md) — независимость неопределяемых понятий, атрибуты vs отношения.
|
|
90
|
+
- [TYPIFICATION.md](TYPIFICATION.md) — ступени `Xi`, `Ci`, `Z`.
|
|
91
|
+
- [SYNTAX.md](SYNTAX.md) — арифметика и предикаты над `Z`; биективная переносимость в разделе «Корректность».
|
|
92
|
+
- [MODEL-TESTING.md](MODEL-TESTING.md) — проверка выбора на маленькой КМ.
|
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
- Добавляй конституенту, если есть новый критерий выбора, роль, отношение, инвариант или правило.
|
|
10
10
|
- Если одно различие постоянно переформулируется, выдели отдельную конституенту.
|
|
11
11
|
- Не копируй источник дословно. Строй предметную модель.
|
|
12
|
-
-
|
|
12
|
+
- Разрабатывай КС итеративно: вводи понятия, раскрывай определения, проверяй формулы и уточняй предметную область.
|
|
13
13
|
|
|
14
14
|
## Предметная редукция
|
|
15
15
|
|
|
16
16
|
Концептуализация решает задачу, не переписывает весь источник.
|
|
17
17
|
|
|
18
18
|
- Рассматривай только нужный аспект определения.
|
|
19
|
-
-
|
|
20
|
-
-
|
|
19
|
+
- Опускай отношения, которые не влияют на задачу.
|
|
20
|
+
- Не различай предметные термины, если задача не требует этого различия.
|
|
21
21
|
- Если различение влияет на критерий, вывод или проверку, введи его явно.
|
|
22
22
|
|
|
23
23
|
## Номиноиды и атрибутирование
|
|
@@ -30,9 +30,11 @@
|
|
|
30
30
|
|
|
31
31
|
## Неопределяемые понятия
|
|
32
32
|
|
|
33
|
-
`X#`, `C#`, и `S#` — это **неопределяемые понятия** (см. [DOMAIN.md](DOMAIN.md))
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
`X#`, `C#`, и `S#` — это **неопределяемые понятия** (см. [DOMAIN.md](DOMAIN.md)). Выбор между `X#`, `C#` и встроенным `Z` — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
34
|
+
|
|
35
|
+
Не вводи новое неопределяемое понятие, если оно однозначно выводится из уже введённых. В таком случае обычно не хватает производной конституенты `D#` / `F#` / `P#` или явно заданного отношения `S#`.
|
|
36
|
+
|
|
37
|
+
Если интерпретации разных **базисных множеств** `X#` пересекаются, проверь предметное различие: возможно, это одно множество с отношениями ролей. Если `C#` используется как код атрибута объекта (пол, цвет, статус), замени кодирование на отношение `S#` или производное понятие.
|
|
36
38
|
|
|
37
39
|
Не вводи `S#` для отношения, которое предметно зависит от уже заданных структур и должно вычисляться из них. Такое отношение оформляй как `D#`, `F#` или `P#`. Если нужная операция не выражается текущим синтаксисом, фиксируй это как ограничение языка или модели, а не подменяй производное отношение новой независимой структурой.
|
|
38
40
|
|
|
@@ -50,13 +52,19 @@
|
|
|
50
52
|
|
|
51
53
|
## Разворачивание понятий
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
Вводи понятия по зависимостям:
|
|
56
|
+
|
|
57
|
+
1. Неопределяемые понятия: `X#`, `C#`, независимые `S#`.
|
|
58
|
+
2. Производные термы и функции: `D#`, `F#`, `P#`.
|
|
59
|
+
3. Ограничения и проверяемые утверждения: `A#`, `T#`.
|
|
60
|
+
|
|
61
|
+
Каждый шаг должен опираться только на уже введённые конституенты. Если аксиоме нужен промежуточный термин, сначала введи этот термин, затем аксиому.
|
|
54
62
|
|
|
55
63
|
Не обязательно сводить схему к одному «центральному» отношению. Зачастую нужны разные понятия на пересечении нескольких аспектов — структур, ролей, ограничений, сценариев. Каждый аспект может дать свои `S#` и `F#`; производные термы выражают их сочетания.
|
|
56
64
|
|
|
57
|
-
Если
|
|
65
|
+
Если сценарий вычисляется из уже введённых `F#` и `S#`, оформи его как `D#`; если он задаётся независимой интерпретацией, используй `S#`. Части кортежа именуй через `D# := Pr#(…)`.
|
|
58
66
|
|
|
59
|
-
##
|
|
67
|
+
## Аксиомы
|
|
60
68
|
|
|
61
69
|
Для функциональности отношения предпочитай `card`:
|
|
62
70
|
|
|
@@ -80,12 +88,9 @@ card(S1) = card(Pr1,2(S1))
|
|
|
80
88
|
|
|
81
89
|
## Параметризованные определения и радикалы
|
|
82
90
|
|
|
83
|
-
Терм-функция (`F#`) и предикат-функция (`P#`) могут быть
|
|
91
|
+
Терм-функция (`F#`) и предикат-функция (`P#`) могут быть шаблонными: одно формальное определение применяется к разным структурам через радикалы `R#` в доменах параметров (синтаксис — [SYNTAX.md](SYNTAX.md), раздел «Радикалы»).
|
|
84
92
|
|
|
85
|
-
|
|
93
|
+
Правила проектирования:
|
|
86
94
|
|
|
87
|
-
Правила:
|
|
88
|
-
|
|
89
|
-
- Не добавляй в схему конституенту с `alias` `R1` (или другим `R#`) «для полноты» — это смешивает шаблон с предметной КС.
|
|
90
95
|
- Если одна и та же конструкция нужна для нескольких родовых структур, предпочитай один параметризованный `F#` / `P#` с радикалами вместо дублирования определений.
|
|
91
|
-
-
|
|
96
|
+
- Не добавляй в схему конституенту с `alias` `R1` (или другим `R#`) «для полноты» — это смешивает шаблон с предметной КС.
|
package/docs/CONSTITUENTA.md
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
## `cstType`
|
|
20
20
|
|
|
21
21
|
- `nominal` / `N#` — номиноид. В родоструктурной экспликации и формальных определениях не используется.
|
|
22
|
-
- `basic` / `X#` — базисное множество; формула пустая.
|
|
23
|
-
- `constant` / `C#` — константное множество; формула пустая.
|
|
22
|
+
- `basic` / `X#` — базисное множество; формула пустая. Без арифметики и порядка над элементами.
|
|
23
|
+
- `constant` / `C#` — константное множество; формула пустая. С арифметикой и порядком; интерпретация в КМ. См. [BASE-SELECTION.md](BASE-SELECTION.md) (отличие от `X#` и встроенного `Z`).
|
|
24
24
|
- `structure` / `S#` — родовая структура; `definitionFormal` задает область определения (типизацию).
|
|
25
25
|
- `term` / `D#` — терм; формальное определение задает вычисляемое значение.
|
|
26
26
|
- `function` / `F#` — терм-функция.
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
|
|
35
35
|
1. Префикс `alias` соответствует `cstType`.
|
|
36
36
|
2. У `basic` и `constant` пустая формула, иначе `definitionNotAllowed` (`0x8862`).
|
|
37
|
-
3. Все глобальные ссылки на **конституенты** (`X#`, `C#`, `S#`, `D#`, `F#`, `P#`, …) уже есть в сессии.
|
|
37
|
+
3. Все глобальные ссылки на **конституенты** (`X#`, `C#`, `S#`, `D#`, `F#`, `P#`, …) уже есть в сессии. `R#` — радикалы, не конституенты; записи с `alias` `R1`, `R2`, … в схеме быть не должно ([SYNTAX.md](SYNTAX.md), раздел «Радикалы»).
|
|
38
38
|
4. `axiom` и `statement` имеют типизацию `Logic`, иначе `expectedLogic`.
|
|
39
39
|
5. Выводимая конституента с пустой формулой дает `cstEmptyDerived`.
|
package/docs/DIAGNOSTICS.md
CHANGED
|
@@ -1,23 +1,66 @@
|
|
|
1
1
|
# Диагностика
|
|
2
2
|
|
|
3
3
|
Читай, когда `analyzeExpression`, `applySchemaPatch`, `listDiagnostics` или `evaluate`
|
|
4
|
-
вернули диагностику. Коды ошибок
|
|
4
|
+
вернули диагностику. Коды ошибок RSLang — `RSErrorCode` в `@rsconcept/domain`; коды схемы
|
|
5
|
+
и модели — `RSDiagnosticCode` в том же пакете (числовой формат совпадает).
|
|
6
|
+
|
|
7
|
+
## Формы диагностики
|
|
8
|
+
|
|
9
|
+
**`CstDiagnostic`** (`@rsconcept/domain`, на `Constituenta` после загрузки схемы Portal) — только:
|
|
10
|
+
|
|
11
|
+
| Поле | Смысл |
|
|
12
|
+
| --------- | ------------------------------------------ |
|
|
13
|
+
| `kind` | `schema` (пока только схема) |
|
|
14
|
+
| `code` | `RSDiagnosticCode` |
|
|
15
|
+
| `params?` | аргументы; омонимы/дубликаты — `[aliases]` |
|
|
16
|
+
|
|
17
|
+
**`Diagnostic`** (`@rsconcept/rstool`, `analyzeExpression`, `listDiagnostics`) — расширяет `CstDiagnostic` полями, удобными агенту:
|
|
18
|
+
|
|
19
|
+
| Поле | Смысл |
|
|
20
|
+
| ------------ | ---------------------------------------------------------------------- |
|
|
21
|
+
| `name` | символьное имя (`typesNotEqual`, `schemaHomonym`, …) — ключ для агента |
|
|
22
|
+
| `severity` | `error` \| `warning` |
|
|
23
|
+
| `alias?` | обозначение конституенты |
|
|
24
|
+
| `expression` | текст формулы или затронутого поля |
|
|
25
|
+
| `from`, `to` | полуинтервал `[from, to)` в `expression` |
|
|
26
|
+
|
|
27
|
+
Фильтры `listDiagnostics({ kind, constituentId, severity })`.
|
|
5
28
|
|
|
6
29
|
## Где лежит диагностика
|
|
7
30
|
|
|
8
|
-
|
|
31
|
+
Три категории (`kind`), собранные в `listDiagnostics` после `applySchemaPatch`,
|
|
32
|
+
`setModelValues` и `recalculateModel`:
|
|
33
|
+
|
|
34
|
+
| `kind` | Источник (как в Portal) |
|
|
35
|
+
| ------------ | ---------------------------------------------------------------------------------------------------- |
|
|
36
|
+
| `expression` | разбор и семантика формулы (`definitionFormal`) |
|
|
37
|
+
| `schema` | омонимы, дубликаты формул, пустой термин/конвенция у неопределяемых, расхождение типизации |
|
|
38
|
+
| `model` | статус интерпретации (`EvalStatus`): пустая база, ложная аксиома, неверные данные, ошибка вычисления |
|
|
39
|
+
|
|
40
|
+
## Схема (Portal)
|
|
41
|
+
|
|
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
|
+
|
|
50
|
+
Поле `params` для омонимов/дубликатов — `[aliases]` (строка с alias через запятую).
|
|
51
|
+
|
|
52
|
+
## Модель (Portal)
|
|
53
|
+
|
|
54
|
+
Статусы соответствуют фильтру «проблемы модели» в UI (`isModelIssue`).
|
|
55
|
+
|
|
56
|
+
| Код | Имя | `params` | Исправление |
|
|
57
|
+
| -------- | ------------------ | ---------- | -------------------------------------------------------------------- |
|
|
58
|
+
| `0x8910` | `modelEmpty` | `[status]` | У базового/константного/структурного понятия нет данных в модели. |
|
|
59
|
+
| `0x8911` | `modelAxiomFalse` | `[status]` | Аксиома ложна на текущих данных — проверь формулу или интерпретацию. |
|
|
60
|
+
| `0x8912` | `modelInvalidData` | `[status]` | Данные не соответствуют типу (напр. элемент вне базы). |
|
|
61
|
+
| `0x8913` | `modelEvalFail` | `[status]` | Ошибка вычисления производного значения. |
|
|
9
62
|
|
|
10
|
-
|
|
11
|
-
и анализа конституент после `applySchemaPatch`) и в `EvaluationResult.diagnostics`:
|
|
12
|
-
- `code` — числовой `RSErrorCode`.
|
|
13
|
-
- `from`, `to` — полуинтервал `[from, to)` в `definitionFormal` (или в выражении вычисления).
|
|
14
|
-
- `params?` — позиционный массив строк-аргументов сообщения (см. таблицы ниже).
|
|
15
|
-
- **Обёрнутое** `DiagnosticRecord` — только из `listDiagnostics`:
|
|
16
|
-
- `sessionId`, `expression` — исходное выражение.
|
|
17
|
-
- `error` — то же `RSToolErrorDescription` (`code`/`from`/`to`/`params`) **вложено**, читай `record.error.code`.
|
|
18
|
-
- `constituentId?` — id конституенты. У диагностик сохранённых конституент он есть;
|
|
19
|
-
у черновиков `analyzeExpression` он `undefined`. Фильтруй `listDiagnostics({ constituentId })`
|
|
20
|
-
или `listDiagnostics({ constituentId }, sessionId)`.
|
|
63
|
+
Диагностики модели пересчитываются после `setModelValues` и `recalculateModel` (и при каждом `applySchemaPatch` для пустых баз).
|
|
21
64
|
|
|
22
65
|
## Класс и префикс кода
|
|
23
66
|
|
|
@@ -114,13 +157,13 @@
|
|
|
114
157
|
|
|
115
158
|
## Фильтр `Fi`
|
|
116
159
|
|
|
117
|
-
| Код | Имя | `params` | Исправление
|
|
118
|
-
| -------- | ----------------------------- | ------------------------------------ |
|
|
119
|
-
| `0x8822` | `invalidFilterArgumentType` | `[operator, actual, expected]` | Аргумент `Fi` имеет тип `actual`, ожидался `expected` (обычно `ℬ(…)`).
|
|
120
|
-
| `0x8823` | `invalidFilterArity` | `[indexCount, paramCount, operator]` | Число индексов `indexCount` ≠ числу параметров `paramCount` у `operator`.
|
|
121
|
-
| `0x882B` | `invalidFilterParameterType` | `[param, expected, operator]` | Тип параметра `param` не совпадает с компонентом аргумента `expected` для `operator`.
|
|
122
|
-
| `0x882C` | `invalidFilterIndex` | `[operator, actual, index, arity]` | Индекс проекции `index` превышает арность кортежа `arity` аргумента `actual`.
|
|
123
|
-
| `0x882D` | `invalidFilterBooleanEchelon` | `[operator, actual
|
|
160
|
+
| Код | Имя | `params` | Исправление |
|
|
161
|
+
| -------- | ----------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
162
|
+
| `0x8822` | `invalidFilterArgumentType` | `[operator, actual, expected]` | Аргумент `Fi` имеет тип `actual`, ожидался `expected` (обычно `ℬ(…)`). |
|
|
163
|
+
| `0x8823` | `invalidFilterArity` | `[indexCount, paramCount, operator]` | Число индексов `indexCount` ≠ числу параметров `paramCount` у `operator`. |
|
|
164
|
+
| `0x882B` | `invalidFilterParameterType` | `[param, expected, operator]` | Тип параметра `param` не совпадает с компонентом аргумента `expected` для `operator`. |
|
|
165
|
+
| `0x882C` | `invalidFilterIndex` | `[operator, actual, index, arity]` | Индекс проекции `index` превышает арность кортежа `arity` аргумента `actual`. |
|
|
166
|
+
| `0x882D` | `invalidFilterBooleanEchelon` | `[operator, actual]` | Ступень параметра `Fi` на один ℬ ниже (`actual`; `bool(actual)` совпал бы с ожидаемым): элемент — в `{…}`, иначе множество нужной ступени или проверка семантики. |
|
|
124
167
|
|
|
125
168
|
## Значение и схема
|
|
126
169
|
|