@rsconcept/rstool 1.7.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +7 -7
  2. package/dist/index.js +1 -1
  3. package/dist/mappers/model-adapter.d.ts +6 -2
  4. package/dist/mappers/model-adapter.js +28 -3
  5. package/dist/mappers/model-adapter.js.map +1 -1
  6. package/dist/mappers/schema-adapter.d.ts +1 -2
  7. package/dist/mappers/schema-adapter.js +1 -1
  8. package/dist/mappers/types.d.ts +4 -5
  9. package/dist/models/index.js +1 -1
  10. package/dist/models/rstool-agent.js +1 -2
  11. package/dist/{models-DG2uTaV_.js → models-D06g8LId.js} +6 -5
  12. package/dist/{models-DG2uTaV_.js.map → models-D06g8LId.js.map} +1 -1
  13. package/dist/{rsform-builder-DKwZfJvN.js → rsform-builder-BlXEe5Ow.js} +2 -2
  14. package/dist/{rsform-builder-DKwZfJvN.js.map → rsform-builder-BlXEe5Ow.js.map} +1 -1
  15. package/dist/session/session-store.d.ts +3 -3
  16. package/dist/session/session-store.js +1 -2
  17. package/dist/wrapper/client.d.ts +15 -9
  18. package/dist/wrapper/client.js +79 -12
  19. package/dist/wrapper/client.js.map +1 -1
  20. package/dist/wrapper/stdio-wrapper.d.ts +1 -1
  21. package/dist/wrapper/stdio-wrapper.js +18 -10
  22. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  23. package/docs/BRIEF.md +93 -0
  24. package/docs/CONCEPTUAL-SCHEMA.md +17 -2
  25. package/docs/CONSTRUCTIONS.md +384 -0
  26. package/docs/DIAGNOSTICS.md +9 -8
  27. package/docs/DOMAIN.md +12 -0
  28. package/docs/METHOD.md +208 -0
  29. package/docs/MODEL-TESTING.md +48 -0
  30. package/docs/PORTAL-API.md +38 -285
  31. package/docs/PORTAL-MODELS.md +24 -0
  32. package/docs/PORTAL-OSS.md +56 -0
  33. package/docs/PORTAL-PUBLISH.md +39 -0
  34. package/docs/PORTAL-READ.md +301 -0
  35. package/docs/README.md +8 -4
  36. package/docs/REQUIREMENTS.md +61 -0
  37. package/docs/SYNTAX.md +5 -4
  38. package/docs/TYPIFICATION.md +12 -3
  39. package/docs/brief.schema.json +173 -0
  40. package/examples/README.md +16 -2
  41. package/examples/access-control/NOTES.md +23 -0
  42. package/examples/access-control/anti/collapsed.json +439 -0
  43. package/examples/access-control/anti/weakened.json +439 -0
  44. package/examples/access-control/brief-v1.json +231 -0
  45. package/examples/access-control/brief.json +310 -0
  46. package/examples/access-control/build-rsform.ts +151 -0
  47. package/examples/access-control/requirements-v1.md +9 -0
  48. package/examples/access-control/requirements-v2.md +4 -0
  49. package/examples/access-control/rsform-session-v1.json +439 -0
  50. package/examples/access-control/rsform-session.json +523 -0
  51. package/examples/audit-diagnostics.ts +9 -1
  52. package/examples/briefs.test.ts +126 -0
  53. package/examples/clinic-booking/NOTES.md +24 -0
  54. package/examples/clinic-booking/anti/collapsed.json +615 -0
  55. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  56. package/examples/clinic-booking/brief-v1.json +332 -0
  57. package/examples/clinic-booking/brief.json +405 -0
  58. package/examples/clinic-booking/build-rsform.ts +174 -0
  59. package/examples/clinic-booking/requirements-v1.md +9 -0
  60. package/examples/clinic-booking/requirements-v2.md +4 -0
  61. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  62. package/examples/clinic-booking/rsform-session.json +700 -0
  63. package/examples/diagnostics-utils.ts +26 -0
  64. package/examples/kinship/brief.json +337 -0
  65. package/examples/kinship/build-rsform.ts +7 -4
  66. package/examples/kinship/rsform-session.json +20 -63
  67. package/examples/kinship/rsmodel-session.json +14 -14
  68. package/examples/kinship-subordination/NOTES.md +49 -0
  69. package/examples/kinship-subordination/brief.json +161 -0
  70. package/examples/kinship-subordination/build-rsform.ts +100 -0
  71. package/examples/kinship-subordination/rsform-session.json +795 -0
  72. package/examples/library-loans/NOTES.md +46 -0
  73. package/examples/library-loans/anti/collapsed.json +481 -0
  74. package/examples/library-loans/anti/species-as-genus.json +334 -0
  75. package/examples/library-loans/anti/uncovered.json +406 -0
  76. package/examples/library-loans/anti/weakened.json +464 -0
  77. package/examples/library-loans/brief-v1.json +340 -0
  78. package/examples/library-loans/brief.json +502 -0
  79. package/examples/library-loans/build-rsform.ts +239 -0
  80. package/examples/library-loans/requirements-v1.md +11 -0
  81. package/examples/library-loans/requirements-v2.md +5 -0
  82. package/examples/library-loans/rsform-session-v1.json +481 -0
  83. package/examples/library-loans/rsform-session.json +652 -0
  84. package/examples/library-loans/source-markup.md +18 -0
  85. package/examples/movd/brief.json +220 -0
  86. package/examples/movd/build-rsform.ts +5 -2
  87. package/examples/movd/rsform-session.json +14 -46
  88. package/examples/subordination/NOTES.md +59 -0
  89. package/examples/subordination/anti/collapsed.json +556 -0
  90. package/examples/subordination/anti/single-relation.json +125 -0
  91. package/examples/subordination/anti/transitive.json +573 -0
  92. package/examples/subordination/anti/weakened.json +539 -0
  93. package/examples/subordination/brief.json +386 -0
  94. package/examples/subordination/build-rsform.ts +63 -0
  95. package/examples/subordination/constants.ts +115 -0
  96. package/examples/subordination/rsform-session.json +556 -0
  97. package/examples/subordination/source-markup.md +19 -0
  98. package/examples/subordination/source.md +40 -0
  99. package/package.json +29 -20
  100. package/skills/INSTALL.md +28 -29
  101. package/skills/README.md +25 -10
  102. package/skills/rs-core/SKILL.md +56 -0
  103. package/skills/rs-explain/SKILL.md +28 -0
  104. package/skills/rs-explicate/SKILL.md +71 -0
  105. package/skills/rs-interpret/SKILL.md +67 -0
  106. package/skills/rs-portal/SKILL.md +51 -0
  107. package/skills/rs-review/SKILL.md +79 -0
  108. package/skills/rs-scope/SKILL.md +67 -0
  109. package/skills/rs-synthesis/SKILL.md +52 -0
  110. package/skills/rstool/SKILL.md +70 -0
  111. package/skills/rstool-helper/GUIDE.md +18 -272
  112. package/skills/rstool-helper/SKILL.md +8 -55
  113. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +40 -12
  114. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +28 -7
  115. package/skills/rstool-runtime/SKILL.md +96 -0
  116. package/skills/scripts/brief-check.test.ts +165 -0
  117. package/skills/scripts/brief-check.ts +826 -0
  118. package/skills/scripts/check-brief.ts +94 -0
  119. package/skills/scripts/rstool-skills.mjs +119 -0
  120. package/skills/scripts/skill-stubs.test.ts +48 -0
  121. package/src/mappers/model-adapter.ts +34 -1
  122. package/src/models/rstool-agent.test.ts +95 -0
  123. package/src/wrapper/client.test.ts +43 -4
  124. package/src/wrapper/client.ts +95 -16
  125. package/src/wrapper/stdio-handler.test.ts +43 -0
  126. package/src/wrapper/stdio-handler.ts +19 -5
@@ -1 +1 @@
1
- {"version":3,"file":"models-DG2uTaV_.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';\n\nimport { type SessionState } from '../models';\nimport {\n DiagnosticKind,\n expandCstDiagnostic,\n modelStatusDiagnostic,\n type Diagnostic\n} from './diagnostic-assembly';\nimport { ModelAdapter } from './model-adapter';\nimport { enrichSessionConstituents } from './rsform-builder';\nimport { toDiagnostic } from './types';\n\nconst modelAdapter = new ModelAdapter();\n\n/** Collect expression and schema diagnostics for a session. */\nexport function collectSchemaDiagnostics(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 : toDiagnostic(diagnostic, item.definitionFormal, {\n constituentId: item.id,\n alias: item.alias\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 return records;\n}\n\n/** Collect model diagnostics for a session (requires schema items). */\nexport function collectModelDiagnostics(session: SessionState): Diagnostic[] {\n if (session.items.length === 0) {\n return [];\n }\n\n const records: Diagnostic[] = [];\n const enriched = enrichSessionConstituents(session);\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 return records;\n}\n\n/** Collect expression, schema, and model diagnostics for a session. */\nexport function collectSessionDiagnostics(session: SessionState): Diagnostic[] {\n return [...collectSchemaDiagnostics(session), ...collectModelDiagnostics(session)];\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 inlineSynthesis,\n restoreConstituentOrder,\n type SynthesizableFields\n} from '@rsconcept/domain/library/rsform-api';\nimport { type Substitution } from '@rsconcept/domain/library/rsform';\nimport {\n portalDetailsToDrafts,\n portalDetailsToSessionSeed,\n portalSchemaToDrafts,\n portalSchemaToSessionSeed\n} from '../mappers/portal-adapter';\nimport { collectModelDiagnostics, collectSchemaDiagnostics } 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 RestoreOrderResult,\n type SessionStateDetail,\n type SessionStateResult,\n type SessionSummary,\n type SynthesizeInput,\n type SynthesizeResult\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 const sanitizedDiagnostics = diagnostics.map(item => ({ ...item, constituentId: undefined }));\n if (input.recordDiagnostics) {\n this.sessions.setDiagnostics(id, [...collectSchemaDiagnostics(envelope.state), ...sanitizedDiagnostics]);\n }\n return { ...result, diagnostics: sanitizedDiagnostics };\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.refreshModelDiagnostics(id);\n return model;\n }\n\n this.refreshModelDiagnostics(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.refreshModelDiagnostics(id);\n return result;\n }\n\n /** @inheritdoc */\n public restoreOrder(sessionId?: string): RestoreOrderResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const orderable = envelope.state.items.map(item => ({\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal\n }));\n const ordered = restoreConstituentOrder(orderable);\n const byId = new Map(envelope.state.items.map(item => [item.id, item]));\n envelope.state.items = ordered.map(item => byId.get(item.id)!);\n envelope.state.updatedAt = new Date().toISOString();\n this.sessions.replaceState(id, envelope.state);\n return {\n orderedIds: ordered.map(item => item.id),\n orderedAliases: ordered.map(item => item.alias)\n };\n }\n\n /** @inheritdoc */\n public synthesize(input: SynthesizeInput, sessionId?: string): SynthesizeResult {\n const receiverHandle = sessionId\n ? { sessionId: this.resolveSessionId(sessionId), contractVersion: this.contractVersion }\n : this.ensureSession();\n const receiverId = receiverHandle.sessionId;\n const sourceId = this.resolveSessionId(input.sourceSessionId);\n\n if (sourceId === receiverId) {\n throw new Error('synthesize: sourceSessionId must differ from the receiver session');\n }\n\n const receiverEnvelope = this.sessions.get(receiverId);\n const sourceEnvelope = this.sessions.get(sourceId);\n const snapshot = this.sessions.snapshot(receiverId);\n\n try {\n const sourceItems = this.selectSourceItems(sourceEnvelope.state.items, input.items);\n const substitutions = this.resolveSynthesisSubstitutions(\n receiverEnvelope.state.items,\n sourceItems,\n input.substitutions ?? []\n );\n\n const nextId = receiverEnvelope.state.items.reduce((max, item) => Math.max(max, item.id), 0) + 1;\n const result = inlineSynthesis({\n receiverItems: receiverEnvelope.state.items.map(toSynthesizableSessionItem),\n sourceItems: sourceItems.map(toSynthesizableSessionItem),\n substitutions,\n nextId\n });\n\n const drafts: ConstituentaDraft[] = result.items.map(item => ({\n id: item.id,\n alias: item.alias,\n cstType: item.cst_type,\n definitionFormal: item.definition_formal,\n term: item.term_resolved || item.term_raw,\n definitionText: item.definition_resolved || item.definition_raw,\n convention: item.convention\n }));\n\n receiverEnvelope.state.items = [];\n receiverEnvelope.state.model = {\n items: receiverEnvelope.state.model.items.filter(value => !result.deletedIds.has(value.id))\n };\n this.sessions.replaceState(receiverId, receiverEnvelope.state);\n\n const applied = this.applyConstituents({ drafts, mode: 'best_effort' }, receiverId);\n\n const revision = input.commitMessage ? this.commitStep(input.commitMessage, receiverId) : undefined;\n return {\n session: receiverHandle,\n summary: this.buildSessionSummary(receiverId),\n success: applied.success,\n failed: applied.failed,\n idMap: result.idMap,\n aliasMapping: result.aliasMapping,\n deletedIds: [...result.deletedIds],\n insertedIds: result.insertedIds,\n revision\n };\n } catch (error) {\n this.sessions.restore(receiverId, snapshot);\n throw error;\n }\n }\n\n private selectSourceItems(sourceItems: ConstituentaState[], aliases?: string[]): ConstituentaState[] {\n if (!aliases || aliases.length === 0) {\n return [...sourceItems];\n }\n const byAlias = new Map(sourceItems.map(item => [item.alias, item]));\n const selected: ConstituentaState[] = [];\n for (const alias of aliases) {\n const item = byAlias.get(alias);\n if (!item) {\n throw new Error(`synthesize: unknown source alias \"${alias}\"`);\n }\n selected.push(item);\n }\n return selected;\n }\n\n private resolveSynthesisSubstitutions(\n receiverItems: ConstituentaState[],\n sourceItems: ConstituentaState[],\n substitutions: SynthesizeInput['substitutions']\n ): Substitution[] {\n if (!substitutions || substitutions.length === 0) {\n return [];\n }\n\n const receiverByAlias = new Map(receiverItems.map(item => [item.alias, item]));\n const sourceByAlias = new Map(sourceItems.map(item => [item.alias, item]));\n const deletedKeys = new Set<string>();\n const resolved: Substitution[] = [];\n\n for (const row of substitutions) {\n const originalSource = sourceByAlias.get(row.original);\n const originalReceiver = receiverByAlias.get(row.original);\n const substitutionSource = sourceByAlias.get(row.substitution);\n const substitutionReceiver = receiverByAlias.get(row.substitution);\n\n let originalId: number;\n let substitutionId: number;\n let originalKey: string;\n\n // Prefer source→receiver when both sides share the same alias (typical base identification).\n // Session ids are independent, so do not compare numeric ids across sessions.\n if (originalSource && substitutionReceiver) {\n originalId = originalSource.id;\n substitutionId = substitutionReceiver.id;\n originalKey = `s:${originalId}`;\n } else if (originalReceiver && substitutionSource) {\n originalId = originalReceiver.id;\n substitutionId = substitutionSource.id;\n originalKey = `r:${originalId}`;\n } else {\n throw new Error(\n `synthesize: substitution \"${row.original}\" → \"${row.substitution}\" must pair one source alias with one receiver alias`\n );\n }\n\n if (deletedKeys.has(originalKey)) {\n throw new Error(`synthesize: constituenta \"${row.original}\" is substituted more than once`);\n }\n deletedKeys.add(originalKey);\n\n resolved.push({ original: originalId, substitution: substitutionId });\n }\n\n return resolved;\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 } else {\n this.refreshDiagnostics(handle.sessionId);\n }\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, collectSchemaDiagnostics(envelope.state));\n }\n\n private refreshModelDiagnostics(sessionId: string): void {\n const envelope = this.sessions.get(sessionId);\n this.sessions.setDiagnostics(sessionId, [\n ...collectSchemaDiagnostics(envelope.state),\n ...collectModelDiagnostics(envelope.state)\n ]);\n }\n}\n\nfunction toSynthesizableSessionItem(item: ConstituentaState): SynthesizableFields & { convention: string } {\n return {\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal,\n typification_manual: '',\n term_raw: item.term,\n term_resolved: item.term,\n term_forms: [],\n definition_raw: item.definitionText,\n definition_resolved: item.definitionText,\n convention: item.convention\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"models-D06g8LId.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';\n\nimport { type SessionState } from '../models';\nimport {\n DiagnosticKind,\n expandCstDiagnostic,\n modelStatusDiagnostic,\n type Diagnostic\n} from './diagnostic-assembly';\nimport { ModelAdapter } from './model-adapter';\nimport { enrichSessionConstituents } from './rsform-builder';\nimport { toDiagnostic } from './types';\n\nconst modelAdapter = new ModelAdapter();\n\n/** Collect expression and schema diagnostics for a session. */\nexport function collectSchemaDiagnostics(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 : toDiagnostic(diagnostic, item.definitionFormal, {\n constituentId: item.id,\n alias: item.alias\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 return records;\n}\n\n/** Collect model diagnostics for a session (requires schema items). */\nexport function collectModelDiagnostics(session: SessionState): Diagnostic[] {\n if (session.items.length === 0) {\n return [];\n }\n\n const records: Diagnostic[] = [];\n const enriched = enrichSessionConstituents(session);\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 return records;\n}\n\n/** Collect expression, schema, and model diagnostics for a session. */\nexport function collectSessionDiagnostics(session: SessionState): Diagnostic[] {\n return [...collectSchemaDiagnostics(session), ...collectModelDiagnostics(session)];\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 inlineSynthesis,\n restoreConstituentOrder,\n type SynthesizableFields\n} from '@rsconcept/domain/library/rsform-api';\nimport { type Substitution } from '@rsconcept/domain/library/rsform';\nimport {\n portalDetailsToDrafts,\n portalDetailsToSessionSeed,\n portalSchemaToDrafts,\n portalSchemaToSessionSeed\n} from '../mappers/portal-adapter';\nimport { collectModelDiagnostics, collectSchemaDiagnostics } 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 RestoreOrderResult,\n type SessionStateDetail,\n type SessionStateResult,\n type SessionSummary,\n type SynthesizeInput,\n type SynthesizeResult\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 const sanitizedDiagnostics = diagnostics.map(item => ({ ...item, constituentId: undefined }));\n if (input.recordDiagnostics) {\n this.sessions.setDiagnostics(id, [...collectSchemaDiagnostics(envelope.state), ...sanitizedDiagnostics]);\n }\n return { ...result, diagnostics: sanitizedDiagnostics };\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.refreshModelDiagnostics(id);\n return model;\n }\n\n this.refreshModelDiagnostics(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.refreshModelDiagnostics(id);\n return result;\n }\n\n /** @inheritdoc */\n public restoreOrder(sessionId?: string): RestoreOrderResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const orderable = envelope.state.items.map(item => ({\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal\n }));\n const ordered = restoreConstituentOrder(orderable);\n const byId = new Map(envelope.state.items.map(item => [item.id, item]));\n envelope.state.items = ordered.map(item => byId.get(item.id)!);\n envelope.state.updatedAt = new Date().toISOString();\n this.sessions.replaceState(id, envelope.state);\n return {\n orderedIds: ordered.map(item => item.id),\n orderedAliases: ordered.map(item => item.alias)\n };\n }\n\n /** @inheritdoc */\n public synthesize(input: SynthesizeInput, sessionId?: string): SynthesizeResult {\n const receiverHandle = sessionId\n ? { sessionId: this.resolveSessionId(sessionId), contractVersion: this.contractVersion }\n : this.ensureSession();\n const receiverId = receiverHandle.sessionId;\n const sourceId = this.resolveSessionId(input.sourceSessionId);\n\n if (sourceId === receiverId) {\n throw new Error('synthesize: sourceSessionId must differ from the receiver session');\n }\n\n const receiverEnvelope = this.sessions.get(receiverId);\n const sourceEnvelope = this.sessions.get(sourceId);\n const snapshot = this.sessions.snapshot(receiverId);\n\n try {\n const sourceItems = this.selectSourceItems(sourceEnvelope.state.items, input.items);\n const substitutions = this.resolveSynthesisSubstitutions(\n receiverEnvelope.state.items,\n sourceItems,\n input.substitutions ?? []\n );\n\n const nextId = receiverEnvelope.state.items.reduce((max, item) => Math.max(max, item.id), 0) + 1;\n const result = inlineSynthesis({\n receiverItems: receiverEnvelope.state.items.map(toSynthesizableSessionItem),\n sourceItems: sourceItems.map(toSynthesizableSessionItem),\n substitutions,\n nextId\n });\n\n const drafts: ConstituentaDraft[] = result.items.map(item => ({\n id: item.id,\n alias: item.alias,\n cstType: item.cst_type,\n definitionFormal: item.definition_formal,\n term: item.term_resolved || item.term_raw,\n definitionText: item.definition_resolved || item.definition_raw,\n convention: item.convention\n }));\n\n receiverEnvelope.state.items = [];\n receiverEnvelope.state.model = {\n items: receiverEnvelope.state.model.items.filter(value => !result.deletedIds.has(value.id))\n };\n this.sessions.replaceState(receiverId, receiverEnvelope.state);\n\n const applied = this.applyConstituents({ drafts, mode: 'best_effort' }, receiverId);\n\n const revision = input.commitMessage ? this.commitStep(input.commitMessage, receiverId) : undefined;\n return {\n session: receiverHandle,\n summary: this.buildSessionSummary(receiverId),\n success: applied.success,\n failed: applied.failed,\n idMap: result.idMap,\n aliasMapping: result.aliasMapping,\n deletedIds: [...result.deletedIds],\n insertedIds: result.insertedIds,\n revision\n };\n } catch (error) {\n this.sessions.restore(receiverId, snapshot);\n throw error;\n }\n }\n\n private selectSourceItems(sourceItems: ConstituentaState[], aliases?: string[]): ConstituentaState[] {\n if (!aliases || aliases.length === 0) {\n return [...sourceItems];\n }\n const byAlias = new Map(sourceItems.map(item => [item.alias, item]));\n const selected: ConstituentaState[] = [];\n for (const alias of aliases) {\n const item = byAlias.get(alias);\n if (!item) {\n throw new Error(`synthesize: unknown source alias \"${alias}\"`);\n }\n selected.push(item);\n }\n return selected;\n }\n\n private resolveSynthesisSubstitutions(\n receiverItems: ConstituentaState[],\n sourceItems: ConstituentaState[],\n substitutions: SynthesizeInput['substitutions']\n ): Substitution[] {\n if (!substitutions || substitutions.length === 0) {\n return [];\n }\n\n const receiverByAlias = new Map(receiverItems.map(item => [item.alias, item]));\n const sourceByAlias = new Map(sourceItems.map(item => [item.alias, item]));\n const deletedKeys = new Set<string>();\n const resolved: Substitution[] = [];\n\n for (const row of substitutions) {\n const originalSource = sourceByAlias.get(row.original);\n const originalReceiver = receiverByAlias.get(row.original);\n const substitutionSource = sourceByAlias.get(row.substitution);\n const substitutionReceiver = receiverByAlias.get(row.substitution);\n\n let originalId: number;\n let substitutionId: number;\n let originalKey: string;\n\n // Prefer source→receiver when both sides share the same alias (typical base identification).\n // Session ids are independent, so do not compare numeric ids across sessions.\n if (originalSource && substitutionReceiver) {\n originalId = originalSource.id;\n substitutionId = substitutionReceiver.id;\n originalKey = `s:${originalId}`;\n } else if (originalReceiver && substitutionSource) {\n originalId = originalReceiver.id;\n substitutionId = substitutionSource.id;\n originalKey = `r:${originalId}`;\n } else {\n throw new Error(\n `synthesize: substitution \"${row.original}\" → \"${row.substitution}\" must pair one source alias with one receiver alias`\n );\n }\n\n if (deletedKeys.has(originalKey)) {\n throw new Error(`synthesize: constituenta \"${row.original}\" is substituted more than once`);\n }\n deletedKeys.add(originalKey);\n\n resolved.push({ original: originalId, substitution: substitutionId });\n }\n\n return resolved;\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 } else {\n this.refreshDiagnostics(handle.sessionId);\n }\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, collectSchemaDiagnostics(envelope.state));\n }\n\n private refreshModelDiagnostics(sessionId: string): void {\n const envelope = this.sessions.get(sessionId);\n this.sessions.setDiagnostics(sessionId, [\n ...collectSchemaDiagnostics(envelope.state),\n ...collectModelDiagnostics(envelope.state)\n ]);\n }\n}\n\nfunction toSynthesizableSessionItem(item: ConstituentaState): SynthesizableFields & { convention: string } {\n return {\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal,\n typification_manual: '',\n term_raw: item.term,\n term_resolved: item.term,\n term_forms: [],\n definition_raw: item.definitionText,\n definition_resolved: item.definitionText,\n convention: item.convention\n };\n}\n"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { assignSchemaDiagnostics } from "@rsconcept/domain/library";
2
2
  import { CstType } from "@rsconcept/domain/library/rsform";
3
3
  import { RSLangAnalyzer } from "@rsconcept/domain/rslang";
4
4
  import { normalizeExpression } from "@rsconcept/domain/library/rsform-api";
5
- import { Graph } from "@rsconcept/domain/graph/graph";
6
5
  import { extractGlobals } from "@rsconcept/domain/rslang/api";
6
+ import { Graph } from "@rsconcept/domain/graph/graph";
7
7
  //#region src/mappers/rsform-builder.ts
8
8
  /** Build a domain {@link RSForm} view from session state (same shape as Portal loader output). */
9
9
  function buildRSFormFromSession(session) {
@@ -99,4 +99,4 @@ function toFrontendConstituenta(item) {
99
99
  //#endregion
100
100
  export { enrichSessionConstituents as n, buildRSFormFromSession as t };
101
101
 
102
- //# sourceMappingURL=rsform-builder-DKwZfJvN.js.map
102
+ //# sourceMappingURL=rsform-builder-BlXEe5Ow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rsform-builder-DKwZfJvN.js","names":[],"sources":["../src/mappers/rsform-builder.ts"],"sourcesContent":["import { Graph } from '@rsconcept/domain/graph/graph';\nimport { extractGlobals } from '@rsconcept/domain/rslang/api';\nimport { type ExpressionType, RSLangAnalyzer, type ValueClass } from '@rsconcept/domain/rslang';\nimport { assignSchemaDiagnostics } from '@rsconcept/domain/library';\nimport { isBasicConcept, isLogical, normalizeExpression } from '@rsconcept/domain/library/rsform-api';\nimport { type Constituenta, CstType, type RSForm } from '@rsconcept/domain/library/rsform';\n\nimport { type ConstituentaState, type SessionState } from '../models';\n\nexport interface EnrichedConstituenta {\n item: ConstituentaState;\n cst: Constituenta;\n}\n\n/** Build a domain {@link RSForm} view from session state (same shape as Portal loader output). */\nexport function buildRSFormFromSession(session: SessionState): RSForm {\n const graph = new Graph<number>();\n const cstByAlias = new Map<string, Constituenta>();\n const cstByID = new Map<number, Constituenta>();\n const analyzer = new RSLangAnalyzer();\n\n const items = session.items.map(item => {\n const cst = toFrontendConstituenta(item);\n cstByAlias.set(cst.alias, cst);\n cstByID.set(cst.id, cst);\n graph.addNode(cst.id);\n if (item.cstType === CstType.BASE) {\n analyzer.addBase(cst.alias);\n }\n if (cst.effectiveType) {\n analyzer.setGlobal(cst.alias, cst.effectiveType, cst.analysis.valueClass as ValueClass | null);\n }\n return cst;\n });\n\n for (const cst of items) {\n for (const alias of extractGlobals(cst.definition_formal)) {\n const source = cstByAlias.get(alias);\n if (source) {\n graph.addEdge(source.id, cst.id);\n }\n }\n }\n\n return {\n id: 0,\n items,\n cstByAlias,\n cstByID,\n graph,\n analyzer,\n inheritance: [],\n attribution: [],\n attribution_graph: graph.clone(),\n oss: [],\n models: [],\n editors: [],\n versions: [],\n is_produced: false,\n is_attributive: false,\n version: 'latest'\n } as unknown as RSForm;\n}\n\n/** Enrich session constituents with Portal-style schema metadata used for diagnostics. */\nexport function enrichSessionConstituents(session: SessionState): EnrichedConstituenta[] {\n const schema = buildRSFormFromSession(session);\n const normalizedDefinitions = new Map<number, string>();\n const resolveAlias = (id: number) => schema.cstByID.get(id)?.alias ?? String(id);\n\n for (const item of session.items) {\n const normalized = normalizeExpression(item.definitionFormal, item.cstType);\n if (normalized) {\n normalizedDefinitions.set(item.id, normalized);\n }\n }\n\n assignSchemaDiagnostics(schema.items, resolveAlias, normalizedDefinitions, schema.graph);\n\n return session.items.map(item => ({\n item,\n cst: schema.cstByID.get(item.id)!\n }));\n}\n\nfunction toFrontendConstituenta(item: ConstituentaState): Constituenta {\n const effectiveType = (item.analysis.type ?? null) as ExpressionType | null;\n return {\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal,\n definition_raw: item.definitionFormal,\n definition_resolved: item.definitionFormal,\n term_raw: item.term,\n term_resolved: item.term,\n term_forms: [],\n convention: item.convention,\n typification_manual: '',\n value_is_property: false,\n crucial: false,\n attributes: [],\n diagnostics: [],\n analysis: {\n success: item.analysis.success,\n type: effectiveType,\n valueClass: item.analysis.valueClass\n },\n effectiveType,\n is_type_mismatch: false,\n schema: 0,\n cst_class: 'derived',\n status: item.analysis.success ? 'verified' : 'incorrect',\n is_template: false,\n is_simple_expression: true,\n parent_schema_index: 0,\n parent_schema: null,\n is_inherited: false,\n has_inherited_children: false,\n spawn: [],\n spawn_alias: []\n } as unknown as Constituenta;\n}\n\nexport function needsBasicMetadata(item: ConstituentaState): boolean {\n return isBasicConcept(item.cstType) && !isLogical(item.cstType);\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,uBAAuB,SAA+B;CACpE,MAAM,QAAQ,IAAI,MAAc;CAChC,MAAM,6BAAa,IAAI,IAA0B;CACjD,MAAM,0BAAU,IAAI,IAA0B;CAC9C,MAAM,WAAW,IAAI,eAAe;CAEpC,MAAM,QAAQ,QAAQ,MAAM,KAAI,SAAQ;EACtC,MAAM,MAAM,uBAAuB,IAAI;EACvC,WAAW,IAAI,IAAI,OAAO,GAAG;EAC7B,QAAQ,IAAI,IAAI,IAAI,GAAG;EACvB,MAAM,QAAQ,IAAI,EAAE;EACpB,IAAI,KAAK,YAAY,QAAQ,MAC3B,SAAS,QAAQ,IAAI,KAAK;EAE5B,IAAI,IAAI,eACN,SAAS,UAAU,IAAI,OAAO,IAAI,eAAe,IAAI,SAAS,UAA+B;EAE/F,OAAO;CACT,CAAC;CAED,KAAK,MAAM,OAAO,OAChB,KAAK,MAAM,SAAS,eAAe,IAAI,iBAAiB,GAAG;EACzD,MAAM,SAAS,WAAW,IAAI,KAAK;EACnC,IAAI,QACF,MAAM,QAAQ,OAAO,IAAI,IAAI,EAAE;CAEnC;CAGF,OAAO;EACL,IAAI;EACJ;EACA;EACA;EACA;EACA;EACA,aAAa,CAAC;EACd,aAAa,CAAC;EACd,mBAAmB,MAAM,MAAM;EAC/B,KAAK,CAAC;EACN,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,UAAU,CAAC;EACX,aAAa;EACb,gBAAgB;EAChB,SAAS;CACX;AACF;;AAGA,SAAgB,0BAA0B,SAA+C;CACvF,MAAM,SAAS,uBAAuB,OAAO;CAC7C,MAAM,wCAAwB,IAAI,IAAoB;CACtD,MAAM,gBAAgB,OAAe,OAAO,QAAQ,IAAI,EAAE,CAAC,EAAE,SAAS,OAAO,EAAE;CAE/E,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAChC,MAAM,aAAa,oBAAoB,KAAK,kBAAkB,KAAK,OAAO;EAC1E,IAAI,YACF,sBAAsB,IAAI,KAAK,IAAI,UAAU;CAEjD;CAEA,wBAAwB,OAAO,OAAO,cAAc,uBAAuB,OAAO,KAAK;CAEvF,OAAO,QAAQ,MAAM,KAAI,UAAS;EAChC;EACA,KAAK,OAAO,QAAQ,IAAI,KAAK,EAAE;CACjC,EAAE;AACJ;AAEA,SAAS,uBAAuB,MAAuC;CACrE,MAAM,gBAAiB,KAAK,SAAS,QAAQ;CAC7C,OAAO;EACL,IAAI,KAAK;EACT,OAAO,KAAK;EACZ,UAAU,KAAK;EACf,mBAAmB,KAAK;EACxB,gBAAgB,KAAK;EACrB,qBAAqB,KAAK;EAC1B,UAAU,KAAK;EACf,eAAe,KAAK;EACpB,YAAY,CAAC;EACb,YAAY,KAAK;EACjB,qBAAqB;EACrB,mBAAmB;EACnB,SAAS;EACT,YAAY,CAAC;EACb,aAAa,CAAC;EACd,UAAU;GACR,SAAS,KAAK,SAAS;GACvB,MAAM;GACN,YAAY,KAAK,SAAS;EAC5B;EACA;EACA,kBAAkB;EAClB,QAAQ;EACR,WAAW;EACX,QAAQ,KAAK,SAAS,UAAU,aAAa;EAC7C,aAAa;EACb,sBAAsB;EACtB,qBAAqB;EACrB,eAAe;EACf,cAAc;EACd,wBAAwB;EACxB,OAAO,CAAC;EACR,aAAa,CAAC;CAChB;AACF"}
1
+ {"version":3,"file":"rsform-builder-BlXEe5Ow.js","names":[],"sources":["../src/mappers/rsform-builder.ts"],"sourcesContent":["import { Graph } from '@rsconcept/domain/graph/graph';\nimport { extractGlobals } from '@rsconcept/domain/rslang/api';\nimport { type ExpressionType, RSLangAnalyzer, type ValueClass } from '@rsconcept/domain/rslang';\nimport { assignSchemaDiagnostics } from '@rsconcept/domain/library';\nimport { isBasicConcept, isLogical, normalizeExpression } from '@rsconcept/domain/library/rsform-api';\nimport { type Constituenta, CstType, type RSForm } from '@rsconcept/domain/library/rsform';\n\nimport { type ConstituentaState, type SessionState } from '../models';\n\nexport interface EnrichedConstituenta {\n item: ConstituentaState;\n cst: Constituenta;\n}\n\n/** Build a domain {@link RSForm} view from session state (same shape as Portal loader output). */\nexport function buildRSFormFromSession(session: SessionState): RSForm {\n const graph = new Graph<number>();\n const cstByAlias = new Map<string, Constituenta>();\n const cstByID = new Map<number, Constituenta>();\n const analyzer = new RSLangAnalyzer();\n\n const items = session.items.map(item => {\n const cst = toFrontendConstituenta(item);\n cstByAlias.set(cst.alias, cst);\n cstByID.set(cst.id, cst);\n graph.addNode(cst.id);\n if (item.cstType === CstType.BASE) {\n analyzer.addBase(cst.alias);\n }\n if (cst.effectiveType) {\n analyzer.setGlobal(cst.alias, cst.effectiveType, cst.analysis.valueClass as ValueClass | null);\n }\n return cst;\n });\n\n for (const cst of items) {\n for (const alias of extractGlobals(cst.definition_formal)) {\n const source = cstByAlias.get(alias);\n if (source) {\n graph.addEdge(source.id, cst.id);\n }\n }\n }\n\n return {\n id: 0,\n items,\n cstByAlias,\n cstByID,\n graph,\n analyzer,\n inheritance: [],\n attribution: [],\n attribution_graph: graph.clone(),\n oss: [],\n models: [],\n editors: [],\n versions: [],\n is_produced: false,\n is_attributive: false,\n version: 'latest'\n } as unknown as RSForm;\n}\n\n/** Enrich session constituents with Portal-style schema metadata used for diagnostics. */\nexport function enrichSessionConstituents(session: SessionState): EnrichedConstituenta[] {\n const schema = buildRSFormFromSession(session);\n const normalizedDefinitions = new Map<number, string>();\n const resolveAlias = (id: number) => schema.cstByID.get(id)?.alias ?? String(id);\n\n for (const item of session.items) {\n const normalized = normalizeExpression(item.definitionFormal, item.cstType);\n if (normalized) {\n normalizedDefinitions.set(item.id, normalized);\n }\n }\n\n assignSchemaDiagnostics(schema.items, resolveAlias, normalizedDefinitions, schema.graph);\n\n return session.items.map(item => ({\n item,\n cst: schema.cstByID.get(item.id)!\n }));\n}\n\nfunction toFrontendConstituenta(item: ConstituentaState): Constituenta {\n const effectiveType = (item.analysis.type ?? null) as ExpressionType | null;\n return {\n id: item.id,\n alias: item.alias,\n cst_type: item.cstType,\n definition_formal: item.definitionFormal,\n definition_raw: item.definitionFormal,\n definition_resolved: item.definitionFormal,\n term_raw: item.term,\n term_resolved: item.term,\n term_forms: [],\n convention: item.convention,\n typification_manual: '',\n value_is_property: false,\n crucial: false,\n attributes: [],\n diagnostics: [],\n analysis: {\n success: item.analysis.success,\n type: effectiveType,\n valueClass: item.analysis.valueClass\n },\n effectiveType,\n is_type_mismatch: false,\n schema: 0,\n cst_class: 'derived',\n status: item.analysis.success ? 'verified' : 'incorrect',\n is_template: false,\n is_simple_expression: true,\n parent_schema_index: 0,\n parent_schema: null,\n is_inherited: false,\n has_inherited_children: false,\n spawn: [],\n spawn_alias: []\n } as unknown as Constituenta;\n}\n\nexport function needsBasicMetadata(item: ConstituentaState): boolean {\n return isBasicConcept(item.cstType) && !isLogical(item.cstType);\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,uBAAuB,SAA+B;CACpE,MAAM,QAAQ,IAAI,MAAc;CAChC,MAAM,6BAAa,IAAI,IAA0B;CACjD,MAAM,0BAAU,IAAI,IAA0B;CAC9C,MAAM,WAAW,IAAI,eAAe;CAEpC,MAAM,QAAQ,QAAQ,MAAM,KAAI,SAAQ;EACtC,MAAM,MAAM,uBAAuB,IAAI;EACvC,WAAW,IAAI,IAAI,OAAO,GAAG;EAC7B,QAAQ,IAAI,IAAI,IAAI,GAAG;EACvB,MAAM,QAAQ,IAAI,EAAE;EACpB,IAAI,KAAK,YAAY,QAAQ,MAC3B,SAAS,QAAQ,IAAI,KAAK;EAE5B,IAAI,IAAI,eACN,SAAS,UAAU,IAAI,OAAO,IAAI,eAAe,IAAI,SAAS,UAA+B;EAE/F,OAAO;CACT,CAAC;CAED,KAAK,MAAM,OAAO,OAChB,KAAK,MAAM,SAAS,eAAe,IAAI,iBAAiB,GAAG;EACzD,MAAM,SAAS,WAAW,IAAI,KAAK;EACnC,IAAI,QACF,MAAM,QAAQ,OAAO,IAAI,IAAI,EAAE;CAEnC;CAGF,OAAO;EACL,IAAI;EACJ;EACA;EACA;EACA;EACA;EACA,aAAa,CAAC;EACd,aAAa,CAAC;EACd,mBAAmB,MAAM,MAAM;EAC/B,KAAK,CAAC;EACN,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,UAAU,CAAC;EACX,aAAa;EACb,gBAAgB;EAChB,SAAS;CACX;AACF;;AAGA,SAAgB,0BAA0B,SAA+C;CACvF,MAAM,SAAS,uBAAuB,OAAO;CAC7C,MAAM,wCAAwB,IAAI,IAAoB;CACtD,MAAM,gBAAgB,OAAe,OAAO,QAAQ,IAAI,EAAE,CAAC,EAAE,SAAS,OAAO,EAAE;CAE/E,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAChC,MAAM,aAAa,oBAAoB,KAAK,kBAAkB,KAAK,OAAO;EAC1E,IAAI,YACF,sBAAsB,IAAI,KAAK,IAAI,UAAU;CAEjD;CAEA,wBAAwB,OAAO,OAAO,cAAc,uBAAuB,OAAO,KAAK;CAEvF,OAAO,QAAQ,MAAM,KAAI,UAAS;EAChC;EACA,KAAK,OAAO,QAAQ,IAAI,KAAK,EAAE;CACjC,EAAE;AACJ;AAEA,SAAS,uBAAuB,MAAuC;CACrE,MAAM,gBAAiB,KAAK,SAAS,QAAQ;CAC7C,OAAO;EACL,IAAI,KAAK;EACT,OAAO,KAAK;EACZ,UAAU,KAAK;EACf,mBAAmB,KAAK;EACxB,gBAAgB,KAAK;EACrB,qBAAqB,KAAK;EAC1B,UAAU,KAAK;EACf,eAAe,KAAK;EACpB,YAAY,CAAC;EACb,YAAY,KAAK;EACjB,qBAAqB;EACrB,mBAAmB;EACnB,SAAS;EACT,YAAY,CAAC;EACb,aAAa,CAAC;EACd,UAAU;GACR,SAAS,KAAK,SAAS;GACvB,MAAM;GACN,YAAY,KAAK,SAAS;EAC5B;EACA;EACA,kBAAkB;EAClB,QAAQ;EACR,WAAW;EACX,QAAQ,KAAK,SAAS,UAAU,aAAa;EAC7C,aAAa;EACb,sBAAsB;EACtB,qBAAqB;EACrB,eAAe;EACf,cAAc;EACd,wBAAwB;EACxB,OAAO,CAAC;EACR,aAAa,CAAC;CAChB;AACF"}
@@ -2,14 +2,14 @@ import { a as Diagnostic, r as ListDiagnosticsFilters } from "../diagnostic-CtxX
2
2
  import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-OaLqLq0H.js";
3
3
  import "../models/index.js";
4
4
  //#region src/session/session-store.d.ts
5
- interface SessionStoreOptions {
5
+ export interface SessionStoreOptions {
6
6
  persistenceDir?: string;
7
7
  }
8
8
  interface SessionEnvelope {
9
9
  state: SessionState;
10
10
  diagnostics: Diagnostic[];
11
11
  }
12
- declare class SessionStore {
12
+ export declare class SessionStore {
13
13
  private sessions;
14
14
  private readonly persistence;
15
15
  constructor(options?: SessionStoreOptions);
@@ -30,5 +30,5 @@ declare class SessionStore {
30
30
  private persist;
31
31
  }
32
32
  //#endregion
33
- export { SessionStore, SessionStoreOptions };
33
+ export {};
34
34
  //# sourceMappingURL=session-store.d.ts.map
@@ -1,2 +1 @@
1
- import { n as SessionStore } from "../models-DG2uTaV_.js";
2
- export { SessionStore };
1
+ export { n as SessionStore } from "../models-D06g8LId.js";
@@ -1,6 +1,6 @@
1
1
  //#region src/wrapper/client.d.ts
2
2
  /** One JSON line emitted by the stdio wrapper (request response or ready event). */
3
- interface WrapperResponse<T = unknown> {
3
+ export interface WrapperResponse<T = unknown> {
4
4
  id: string | number | null;
5
5
  ok: boolean;
6
6
  result?: T;
@@ -11,45 +11,51 @@ interface WrapperResponse<T = unknown> {
11
11
  };
12
12
  }
13
13
  /** Options for spawning the `rstool-wrapper` child process. */
14
- interface RSToolWrapperClientOptions {
15
- /** Executable to spawn. Default: `npm`. */
14
+ export interface RSToolWrapperClientOptions {
15
+ /** Executable to spawn. Default: `npm`. Passed as argv, not a shell string. */
16
16
  command?: string;
17
17
  /** Arguments passed to `command`. Default: `['run', 'wrapper']`. */
18
18
  args?: string[];
19
19
  /** Working directory for the child process. Default: `process.cwd()`. */
20
20
  cwd?: string;
21
- /** Whether to run the command in a shell. Default: `true`. */
22
- shell?: boolean;
23
21
  }
24
22
  /**
25
23
  * JSON-RPC client for the `rstool-wrapper` stdio process.
26
24
  *
27
25
  * Sends one JSON request per line on stdin and reads one JSON response per line from stdout.
28
26
  */
29
- declare class RSToolWrapperClient {
27
+ export declare class RSToolWrapperClient {
30
28
  private process;
31
29
  private input;
32
30
  private pending;
33
31
  private requestCounter;
32
+ /** Set once the child cannot start or has exited; every later request fails with this error. */
33
+ private failure;
34
+ private closing;
34
35
  /**
35
36
  * @param options - Spawn configuration; defaults run `npm run wrapper` in the current directory.
36
37
  */
37
38
  constructor(options?: RSToolWrapperClientOptions);
38
- /** Block until the wrapper emits its initial `{ ready: true }` event. */
39
+ /**
40
+ * Block until the wrapper emits its initial `{ ready: true }` event.
41
+ *
42
+ * @throws When the wrapper process cannot be started or exits before becoming ready.
43
+ */
39
44
  waitUntilReady(): Promise<void>;
40
45
  /**
41
46
  * Invoke a wrapper method and return its `result` field.
42
47
  *
43
48
  * @param method - Stdio method name (matches {@link RSToolAgentContract} operations).
44
49
  * @param params - Method parameters object.
45
- * @throws When the wrapper responds with `ok: false`.
50
+ * @throws When the wrapper responds with `ok: false`, cannot be started, or exits before responding.
46
51
  */
47
52
  call<T>(method: string, params?: unknown): Promise<T>;
48
53
  /** Close stdin and terminate the wrapper process. */
49
54
  close(): Promise<void>;
50
55
  private readOneEvent;
56
+ /** Records the terminal failure and rejects every outstanding request. */
57
+ private fail;
51
58
  private handleLine;
52
59
  }
53
60
  //#endregion
54
- export { RSToolWrapperClient, RSToolWrapperClientOptions, WrapperResponse };
55
61
  //# sourceMappingURL=client.d.ts.map
@@ -1,7 +1,37 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
1
3
  import { spawn } from "node:child_process";
2
4
  import readline from "node:readline";
3
5
  //#region src/wrapper/client.ts
4
6
  /**
7
+ * Rewrite Windows npm/npx shims to `node <npm-cli.js>` so spawn() never needs a shell.
8
+ * Node 20+ refuses to exec `.cmd` files without `shell: true` (CVE-2024-27980).
9
+ */
10
+ function resolveSpawn(command, args) {
11
+ if (process.platform !== "win32") return {
12
+ command,
13
+ args
14
+ };
15
+ const base = (command.replaceAll("\\", "/").split("/").pop() ?? command).toLowerCase();
16
+ if (base === "npm" || base === "npm.cmd") return {
17
+ command: process.execPath,
18
+ args: [bundledNpmBin("npm-cli.js"), ...args]
19
+ };
20
+ if (base === "npx" || base === "npx.cmd") return {
21
+ command: process.execPath,
22
+ args: [bundledNpmBin("npx-cli.js"), ...args]
23
+ };
24
+ return {
25
+ command,
26
+ args
27
+ };
28
+ }
29
+ function bundledNpmBin(bin) {
30
+ const cli = join(dirname(process.execPath), "node_modules", "npm", "bin", bin);
31
+ if (!existsSync(cli)) throw new Error(`Cannot resolve ${bin} next to Node at ${process.execPath}`);
32
+ return cli;
33
+ }
34
+ /**
5
35
  * JSON-RPC client for the `rstool-wrapper` stdio process.
6
36
  *
7
37
  * Sends one JSON request per line on stdin and reads one JSON response per line from stdout.
@@ -11,13 +41,17 @@ var RSToolWrapperClient = class {
11
41
  input;
12
42
  pending = /* @__PURE__ */ new Map();
13
43
  requestCounter = 1;
44
+ /** Set once the child cannot start or has exited; every later request fails with this error. */
45
+ failure = null;
46
+ closing = false;
14
47
  /**
15
48
  * @param options - Spawn configuration; defaults run `npm run wrapper` in the current directory.
16
49
  */
17
50
  constructor(options = {}) {
18
- this.process = spawn(options.command ?? "npm", options.args ?? ["run", "wrapper"], {
51
+ const resolved = resolveSpawn(options.command ?? "npm", options.args ?? ["run", "wrapper"]);
52
+ this.process = spawn(resolved.command, resolved.args, {
19
53
  cwd: options.cwd ?? process.cwd(),
20
- shell: options.shell ?? true,
54
+ windowsHide: true,
21
55
  stdio: [
22
56
  "pipe",
23
57
  "pipe",
@@ -29,8 +63,21 @@ var RSToolWrapperClient = class {
29
63
  crlfDelay: Infinity
30
64
  });
31
65
  this.input.on("line", (line) => this.handleLine(line));
66
+ this.process.on("error", (error) => this.fail(error));
67
+ this.process.stdin.on("error", (error) => this.fail(error));
68
+ this.process.on("exit", (code, signal) => {
69
+ if (this.closing) {
70
+ this.fail(/* @__PURE__ */ new Error("Wrapper closed"));
71
+ return;
72
+ }
73
+ this.fail(/* @__PURE__ */ new Error(`Wrapper exited before responding (code ${code ?? "null"}, signal ${signal ?? "null"})`));
74
+ });
32
75
  }
33
- /** Block until the wrapper emits its initial `{ ready: true }` event. */
76
+ /**
77
+ * Block until the wrapper emits its initial `{ ready: true }` event.
78
+ *
79
+ * @throws When the wrapper process cannot be started or exits before becoming ready.
80
+ */
34
81
  async waitUntilReady() {
35
82
  for (;;) {
36
83
  const line = await this.readOneEvent();
@@ -48,17 +95,21 @@ var RSToolWrapperClient = class {
48
95
  *
49
96
  * @param method - Stdio method name (matches {@link RSToolAgentContract} operations).
50
97
  * @param params - Method parameters object.
51
- * @throws When the wrapper responds with `ok: false`.
98
+ * @throws When the wrapper responds with `ok: false`, cannot be started, or exits before responding.
52
99
  */
53
100
  async call(method, params = {}) {
101
+ if (this.failure) throw this.failure;
54
102
  const id = String(this.requestCounter++);
55
103
  const payload = JSON.stringify({
56
104
  id,
57
105
  method,
58
106
  params
59
107
  });
60
- const responsePromise = new Promise((resolve) => {
61
- this.pending.set(id, resolve);
108
+ const responsePromise = new Promise((resolve, reject) => {
109
+ this.pending.set(id, {
110
+ resolve,
111
+ reject
112
+ });
62
113
  });
63
114
  this.process.stdin.write(`${payload}\n`);
64
115
  const response = await responsePromise;
@@ -67,11 +118,13 @@ var RSToolWrapperClient = class {
67
118
  }
68
119
  /** Close stdin and terminate the wrapper process. */
69
120
  async close() {
121
+ this.closing = true;
70
122
  this.input.close();
71
- this.process.stdin.end();
72
- if (!this.process.killed) this.process.kill();
123
+ if (!this.process.stdin.destroyed) this.process.stdin.end();
124
+ if (this.process.exitCode === null && !this.process.killed) this.process.kill();
73
125
  }
74
126
  async readOneEvent() {
127
+ if (this.failure) throw this.failure;
75
128
  return new Promise((resolve, reject) => {
76
129
  const onLine = (line) => {
77
130
  cleanup();
@@ -79,16 +132,30 @@ var RSToolWrapperClient = class {
79
132
  };
80
133
  const onExit = () => {
81
134
  cleanup();
82
- reject(/* @__PURE__ */ new Error("Wrapper exited before ready"));
135
+ reject(this.failure ?? /* @__PURE__ */ new Error("Wrapper exited before ready"));
136
+ };
137
+ const onError = (error) => {
138
+ cleanup();
139
+ reject(error);
83
140
  };
84
141
  const cleanup = () => {
85
142
  this.input.off("line", onLine);
86
143
  this.process.off("exit", onExit);
144
+ this.process.off("error", onError);
87
145
  };
88
146
  this.input.on("line", onLine);
89
147
  this.process.on("exit", onExit);
148
+ this.process.on("error", onError);
90
149
  });
91
150
  }
151
+ /** Records the terminal failure and rejects every outstanding request. */
152
+ fail(error) {
153
+ if (this.failure) return;
154
+ this.failure = error;
155
+ const outstanding = [...this.pending.values()];
156
+ this.pending.clear();
157
+ for (const entry of outstanding) entry.reject(error);
158
+ }
92
159
  handleLine(line) {
93
160
  let parsed;
94
161
  try {
@@ -98,10 +165,10 @@ var RSToolWrapperClient = class {
98
165
  }
99
166
  if (parsed.id === null || parsed.id === void 0) return;
100
167
  const id = String(parsed.id);
101
- const resolver = this.pending.get(id);
102
- if (!resolver) return;
168
+ const entry = this.pending.get(id);
169
+ if (!entry) return;
103
170
  this.pending.delete(id);
104
- resolver(parsed);
171
+ entry.resolve(parsed);
105
172
  }
106
173
  };
107
174
  //#endregion