@rsconcept/rstool 0.10.3 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +61 -33
  2. package/dist/agent-workflow-Gk0Vfnv1.d.ts +64 -0
  3. package/dist/analysis-LLnPhmGa.d.ts +23 -0
  4. package/dist/{common-DxLg3eXX.d.ts → common-DHJalS-Q.d.ts} +6 -1
  5. package/dist/constituenta-DnGR6bnM.d.ts +54 -0
  6. package/dist/diagnostic-D9yl_mEL.d.ts +19 -0
  7. package/dist/evaluation-Cns8BFm4.d.ts +31 -0
  8. package/dist/index.d.ts +11 -11
  9. package/dist/index.js +1 -2
  10. package/dist/mappers/model-adapter.d.ts +3 -3
  11. package/dist/mappers/schema-adapter.d.ts +4 -4
  12. package/dist/mappers/types.d.ts +6 -2
  13. package/dist/mappers/types.js +2 -0
  14. package/dist/mappers/types.js.map +1 -1
  15. package/dist/{model-value-SFAVj0dw.d.ts → model-value-BbonPzMz.d.ts} +14 -3
  16. package/dist/models/agent-workflow.d.ts +2 -0
  17. package/dist/models/agent-workflow.js +1 -0
  18. package/dist/models/analysis.d.ts +1 -1
  19. package/dist/models/common.d.ts +1 -1
  20. package/dist/models/constituenta.d.ts +2 -2
  21. package/dist/models/diagnostic.d.ts +1 -1
  22. package/dist/models/evaluation.d.ts +2 -2
  23. package/dist/models/index.d.ts +11 -11
  24. package/dist/models/index.js +2 -2
  25. package/dist/models/model-value.d.ts +2 -2
  26. package/dist/models/rstool-agent.d.ts +1 -1
  27. package/dist/models/rstool-agent.js +1 -1
  28. package/dist/models/session.d.ts +1 -1
  29. package/dist/models/tool-contract.d.ts +2 -2
  30. package/dist/models/tool-contract.js +2 -1
  31. package/dist/models/tool-contract.js.map +1 -1
  32. package/dist/models-Bw6Uum8i.js +685 -0
  33. package/dist/models-Bw6Uum8i.js.map +1 -0
  34. package/dist/rstool-agent-D2cQze_b.d.ts +71 -0
  35. package/dist/session/session-store.d.ts +18 -5
  36. package/dist/session/session-store.js +1 -64
  37. package/dist/{session-BPgsE80c.d.ts → session-ChexW8i7.d.ts} +11 -8
  38. package/dist/tool-contract-0uRGhEfW.d.ts +164 -0
  39. package/dist/wrapper/client.d.ts +23 -0
  40. package/dist/wrapper/client.js +17 -0
  41. package/dist/wrapper/client.js.map +1 -1
  42. package/dist/wrapper/stdio-wrapper.js +75 -63
  43. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  44. package/docs/CONSTITUENTA.md +2 -2
  45. package/docs/DIAGNOSTICS.md +6 -5
  46. package/docs/MODEL-TESTING.md +3 -3
  47. package/docs/PORTAL-API.md +24 -18
  48. package/examples/README.md +1 -1
  49. package/examples/agent-client.ts +11 -41
  50. package/examples/build-chocolate-nim-rsform.ts +21 -70
  51. package/examples/chocolate-nim/build-rsform.ts +23 -18
  52. package/examples/chocolate-nim/build-rsmodel.ts +10 -12
  53. package/examples/chocolate-nim/rsform-session.json +290 -290
  54. package/examples/chocolate-nim/rsmodel-session.json +291 -291
  55. package/examples/expression-bank/bank-constituents.ts +304 -53
  56. package/examples/expression-bank/build-rsform.ts +19 -16
  57. package/examples/expression-bank/rsform-session.json +1551 -1551
  58. package/examples/kinship/build-rsform.ts +23 -18
  59. package/examples/kinship/build-rsmodel.ts +16 -16
  60. package/examples/kinship/rsform-session.json +219 -219
  61. package/examples/kinship/rsmodel-session.json +221 -221
  62. package/examples/kinship/session.ts +19 -21
  63. package/examples/movd/build-rsform.ts +23 -18
  64. package/examples/movd/build-rsmodel.ts +18 -20
  65. package/examples/movd/rsform-session.json +262 -262
  66. package/examples/movd/rsmodel-session.json +264 -264
  67. package/examples/sample/build-rsform.ts +18 -51
  68. package/examples/sample/build-rsmodel.ts +25 -44
  69. package/examples/sample/rsform-session.json +10 -7
  70. package/examples/sample/rsmodel-session.json +36 -33
  71. package/examples/template-apply/build-rsform.ts +27 -24
  72. package/examples/template-apply/rsform-session.json +48 -48
  73. package/package.json +4 -2
  74. package/skills/rstool-helper/EXAMPLES.md +44 -116
  75. package/skills/rstool-helper/GUIDE.md +40 -25
  76. package/skills/rstool-helper/REFERENCE.md +40 -177
  77. package/src/index.ts +24 -17
  78. package/src/mappers/portal-adapter.ts +49 -0
  79. package/src/mappers/types.ts +4 -0
  80. package/src/models/agent-workflow.ts +66 -0
  81. package/src/models/analysis.ts +7 -0
  82. package/src/models/common.ts +7 -0
  83. package/src/models/constituenta.ts +24 -6
  84. package/src/models/diagnostic.ts +4 -0
  85. package/src/models/evaluation.ts +11 -0
  86. package/src/models/import-detect.test.ts +66 -0
  87. package/src/models/import-detect.ts +42 -0
  88. package/src/models/import-export.ts +24 -0
  89. package/src/models/index.ts +22 -14
  90. package/src/models/model-value.ts +12 -0
  91. package/src/models/portal-json.test.ts +38 -0
  92. package/src/models/portal-json.ts +54 -1
  93. package/src/models/rstool-agent.test.ts +698 -146
  94. package/src/models/rstool-agent.ts +392 -92
  95. package/src/models/session.ts +8 -5
  96. package/src/models/tool-contract.ts +81 -42
  97. package/src/session/batch-apply.test.ts +123 -0
  98. package/src/session/batch-apply.ts +82 -0
  99. package/src/session/persistence.test.ts +63 -0
  100. package/src/session/persistence.ts +69 -0
  101. package/src/session/session-store.ts +76 -6
  102. package/src/wrapper/client.test.ts +58 -0
  103. package/src/wrapper/client.ts +23 -0
  104. package/src/wrapper/stdio-handler.test.ts +101 -0
  105. package/src/wrapper/stdio-handler.ts +195 -0
  106. package/src/wrapper/stdio-wrapper.ts +4 -187
  107. package/dist/analysis-JiwOYDKx.d.ts +0 -16
  108. package/dist/constituenta-Dnd6iToB.d.ts +0 -36
  109. package/dist/diagnostic-BMYvciz8.d.ts +0 -15
  110. package/dist/evaluation-CCVYH0wA.d.ts +0 -21
  111. package/dist/index-uhkmwruf.d.ts +0 -46
  112. package/dist/rstool-agent-BZi5jO1y.js +0 -158
  113. package/dist/rstool-agent-BZi5jO1y.js.map +0 -1
  114. package/dist/rstool-agent-pRaPnZay.d.ts +0 -35
  115. package/dist/session/session-store.js.map +0 -1
  116. package/dist/tool-contract-n1ghUOrK.d.ts +0 -32
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-Bw6Uum8i.js","names":[],"sources":["../src/models/portal-json.ts","../src/mappers/portal-adapter.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 { 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(items: ConstituentaState[], drafts: ConstituentaDraft[]): 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 existingIds = new Set(unmentioned.map(item => item.id));\n const newDrafts = drafts.filter(draft => !existingIds.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 DiagnosticRecord, type SessionState } from '../models';\n\nexport interface PersistedSessionEnvelope {\n state: SessionState;\n diagnostics: DiagnosticRecord[];\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 DiagnosticRecord,\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: DiagnosticRecord[];\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: DiagnosticRecord[]\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: DiagnosticRecord[]): 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): DiagnosticRecord[] {\n const found = this.get(sessionId);\n if (filters?.constituentId === undefined) {\n return [...found.diagnostics];\n }\n return found.diagnostics.filter(record => record.constituentId === filters.constituentId);\n }\n\n public snapshot(sessionId: string): SessionEnvelope {\n const found = this.get(sessionId);\n return structuredClone(found);\n }\n\n public restore(sessionId: string, snapshot: SessionEnvelope): void {\n this.sessions.set(sessionId, structuredClone(snapshot));\n this.persist(sessionId, this.sessions.get(sessionId)!);\n }\n\n public saveCurrentSessionId(sessionId: string | null): void {\n this.persistence?.saveCurrentSessionId(sessionId);\n }\n\n public loadCurrentSessionId(): string | null {\n return this.persistence?.loadCurrentSessionId() ?? null;\n }\n\n private loadFromDisk(sessionId: string): SessionEnvelope | null {\n const loaded = this.persistence?.load(sessionId);\n if (!loaded) {\n return null;\n }\n this.sessions.set(sessionId, loaded);\n return loaded;\n }\n\n private persist(sessionId: string, envelope: SessionEnvelope): void {\n this.persistence?.save(sessionId, envelope as PersistedSessionEnvelope);\n }\n}\n","import { type ImportDataKind } from './import-export';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function parseImportPayload(payload: string | object): unknown {\n if (typeof payload === 'string') {\n return JSON.parse(payload) as unknown;\n }\n return payload;\n}\n\nexport function detectImportKind(data: unknown): Exclude<ImportDataKind, 'auto'> {\n if (!isRecord(data)) {\n throw new Error('Invalid import payload');\n }\n\n if ('contractVersion' in data && 'state' in data) {\n return 'session';\n }\n\n if ('contract_version' in data && Array.isArray(data.items)) {\n const items = data.items as unknown[];\n if (items.length > 0) {\n const first = items[0];\n if (isRecord(first) && 'cst_type' in first) {\n return 'portal-schema';\n }\n throw new Error('Portal model JSON cannot be imported as a schema session');\n }\n }\n\n if (Array.isArray(data.items) && data.items.length > 0) {\n const first = data.items[0];\n if (isRecord(first) && 'cst_type' in first) {\n return 'portal-details';\n }\n }\n\n throw new Error('Cannot detect import kind; pass kind explicitly');\n}\n","import {\n portalDetailsToDrafts,\n portalDetailsToSessionSeed,\n portalSchemaToDrafts,\n portalSchemaToSessionSeed\n} from '../mappers/portal-adapter';\nimport { ModelAdapter } from '../mappers/model-adapter';\nimport { SchemaAdapter } from '../mappers/schema-adapter';\nimport { orderDrafts, reorderSessionItemsByDrafts } from '../session/batch-apply';\nimport { SessionStore } from '../session/session-store';\nimport {\n type AgentConstituentaPatch,\n type ApplySchemaPatchInput,\n type ApplySchemaPatchResult,\n type SessionStateDetail,\n type SessionStateResult,\n type SessionSummary\n} from './agent-workflow';\nimport { type AnalysisResult, type AnalyzeExpressionInput } from './analysis';\nimport { CstType } from './common';\nimport {\n type AddOrUpdateConstituentaInput,\n type AddOrUpdateConstituentaResult,\n type ApplyConstituentsInput,\n type ApplyConstituentsResult,\n type ConstituentaDraft,\n type ConstituentaState\n} from './constituenta';\nimport { type DiagnosticRecord, type ListDiagnosticsFilters } from './diagnostic';\nimport { type EvaluateInput, type EvaluationResult } from './evaluation';\nimport { detectImportKind, parseImportPayload } from './import-detect';\nimport { type ExportPortalInput, type ExportPortalResult, type ImportDataKind } from './import-export';\nimport { type RecalculateModelResult, type SessionModelState, type SetModelValuesInput } from './model-value';\nimport {\n PORTAL_JSON_CONTRACT_VERSION,\n type PortalModelImportData,\n type PortalRsformDetails,\n type PortalSchemaImportData\n} from './portal-json';\nimport { type SessionHandle, type SessionRevision, type SessionState } from './session';\nimport { CONTRACT_VERSION, type RSToolAgentContract, type RSToolAgentOptions } from './tool-contract';\n\nfunction normalizeImportedState(state: SessionState): SessionState {\n return {\n ...state,\n alias: state.alias ?? '',\n title: state.title ?? '',\n comment: state.comment ?? '',\n model: state.model ?? { items: [] }\n };\n}\n\nfunction portalImportMetadata(\n session: SessionState,\n kind: 'schema' | 'model'\n): Pick<PortalSchemaImportData, 'title' | 'alias' | 'description'> {\n const defaults =\n kind === 'schema' ? { title: 'Conceptual schema', alias: 'SCHEMA' } : { title: 'Conceptual model', alias: 'MODEL' };\n const title = session.title.trim();\n const alias = session.alias.trim();\n return {\n title: title.length > 0 ? title : defaults.title,\n alias: alias.length > 0 ? alias : defaults.alias,\n description: session.comment.trim()\n };\n}\n\nfunction inferCstType(alias: string): CstType {\n const prefix = alias.trim().charAt(0).toUpperCase();\n switch (prefix) {\n case 'X':\n return CstType.BASE;\n case 'C':\n return CstType.CONSTANT;\n case 'S':\n return CstType.STRUCTURED;\n case 'D':\n return CstType.TERM;\n case 'A':\n return CstType.AXIOM;\n case 'F':\n return CstType.FUNCTION;\n case 'P':\n return CstType.PREDICATE;\n case 'N':\n return CstType.NOMINAL;\n case 'T':\n return CstType.STATEMENT;\n default:\n throw new Error(`Cannot infer cstType from alias \"${alias}\"; pass cstType explicitly`);\n }\n}\n\n/**\n * Agent-facing entry point for incremental RSForm editing, analysis, diagnostics,\n * modeling, and evaluation.\n *\n * Holds in-memory (optionally persisted) sessions and delegates language work\n * to internal schema and model adapters.\n */\nexport class RSToolAgent implements RSToolAgentContract {\n public readonly contractVersion = CONTRACT_VERSION;\n private readonly sessions: SessionStore;\n private readonly adapter = new SchemaAdapter();\n private readonly evaluation = new ModelAdapter();\n private currentSessionId: string | null;\n\n /** @param options - Optional persistence directory for session storage. */\n public constructor(options: RSToolAgentOptions = {}) {\n this.sessions = new SessionStore({ persistenceDir: options.persistenceDir });\n this.currentSessionId = this.sessions.loadCurrentSessionId();\n }\n\n /** @inheritdoc */\n public ensureSession(initial?: Partial<SessionState>): SessionHandle {\n const current = this.getCurrentSession();\n return current ?? this.createSession(initial);\n }\n\n /** @inheritdoc */\n public createSession(initial?: Partial<SessionState>): SessionHandle {\n return this.trackSession(this.sessions.create(initial, this.contractVersion));\n }\n\n /** @inheritdoc */\n public getCurrentSession(): SessionHandle | null {\n if (!this.currentSessionId) {\n return null;\n }\n if (!this.sessions.has(this.currentSessionId)) {\n this.currentSessionId = null;\n this.sessions.saveCurrentSessionId(null);\n return null;\n }\n return { sessionId: this.currentSessionId, contractVersion: this.contractVersion };\n }\n\n /** @inheritdoc */\n public setCurrentSession(sessionId: string): SessionHandle {\n if (!this.sessions.has(sessionId)) {\n throw new Error(`Unknown session: ${sessionId}`);\n }\n return this.trackSession({ sessionId, contractVersion: this.contractVersion });\n }\n\n /** @inheritdoc */\n public applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult {\n const session = sessionId\n ? { sessionId: this.resolveSessionId(sessionId), contractVersion: this.contractVersion }\n : this.ensureSession(input.initial);\n const drafts = this.resolveAgentPatches(session.sessionId, input.items);\n const result = this.applyConstituents(\n {\n drafts,\n mode: input.mode\n },\n session.sessionId\n );\n const revision =\n result.success && input.commitMessage ? this.commitStep(input.commitMessage, session.sessionId) : undefined;\n return {\n ...result,\n session,\n summary: this.buildSessionSummary(session.sessionId),\n revision\n };\n }\n\n /** @inheritdoc */\n public getSessionState(detail: SessionStateDetail = 'summary', sessionId?: string): SessionStateResult {\n if (detail === 'full') {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return structuredClone(envelope.state);\n }\n return this.buildSessionSummary(sessionId);\n }\n\n /** @inheritdoc */\n public listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string) {\n return this.sessions.listDiagnostics(this.resolveSessionId(sessionId), filters);\n }\n\n /** @inheritdoc */\n public analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult {\n const id = this.resolveSessionId(sessionId);\n const envelope = this.sessions.get(id);\n const { result, diagnostics } = this.adapter.analyzeAgainstSession(envelope.state, {\n id: -1,\n alias: '_analysis',\n cstType: input.cstType,\n definitionFormal: input.expression\n });\n if (input.recordDiagnostics) {\n this.sessions.replaceDiagnosticsForConstituent(\n id,\n undefined,\n diagnostics.map(item => ({ ...item, constituentId: undefined }))\n );\n }\n return result;\n }\n\n /** @inheritdoc */\n public commitStep(message?: string, sessionId?: string): SessionRevision {\n return this.sessions.addRevision(this.resolveSessionId(sessionId), message);\n }\n\n /** @inheritdoc */\n public exportSession(sessionId?: string): string {\n const envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return JSON.stringify(\n {\n contractVersion: this.contractVersion,\n state: envelope.state,\n diagnostics: envelope.diagnostics\n },\n null,\n 2\n );\n }\n\n /** @inheritdoc */\n public exportPortal(input: ExportPortalInput, sessionId?: string): ExportPortalResult {\n const format = input.format ?? 'json';\n const object =\n input.kind === 'schema' ? this.buildPortalSchemaObject(sessionId) : this.buildPortalModelObject(sessionId);\n return format === 'object' ? object : JSON.stringify(object, null, 2);\n }\n\n /** @inheritdoc */\n public importData(payload: string | object, kind: ImportDataKind = 'auto'): SessionHandle {\n const parsed = parseImportPayload(payload);\n const resolvedKind = kind === 'auto' ? detectImportKind(parsed) : kind;\n\n switch (resolvedKind) {\n case 'session':\n return this.importSessionExport(parsed);\n case 'portal-schema':\n return this.importPortalSchemaData(parsed as PortalSchemaImportData);\n case 'portal-details':\n return this.importPortalDetailsData(parsed as PortalRsformDetails);\n default:\n throw new Error(`Unsupported import kind: ${resolvedKind as string}`);\n }\n }\n\n /** @inheritdoc */\n public async setModelValues(input: SetModelValuesInput, sessionId?: string): Promise<SessionModelState> {\n const id = this.resolveSessionId(sessionId);\n const snapshot = this.sessions.snapshot(id);\n\n try {\n let state = this.sessions.get(id).state;\n\n if (input.clear?.length) {\n const model = await this.evaluation.clearConstituentaValues(state, input.clear);\n state = { ...state, model };\n this.sessions.replaceState(id, state);\n }\n\n if (input.set?.length) {\n state = this.sessions.get(id).state;\n const model = await this.evaluation.setConstituentaValues(state, { items: input.set });\n state = { ...state, model };\n this.sessions.replaceState(id, state);\n return model;\n }\n\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 envelope = this.sessions.get(this.resolveSessionId(sessionId));\n return this.evaluation.recalculateModel(envelope.state);\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 this.sessions.replaceDiagnosticsForConstituent(id, input.draft.id, diagnostics);\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 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);\n this.sessions.replaceState(id, envelope.state);\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?: DiagnosticRecord[];\n };\n const handle = this.sessions.create(normalizeImportedState(data.state), this.contractVersion);\n if (data.diagnostics?.length) {\n this.sessions.setDiagnostics(handle.sessionId, data.diagnostics);\n }\n 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"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { n as AnalyzeExpressionInput, t as AnalysisResult } from "./analysis-LLnPhmGa.js";
2
+ import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "./diagnostic-D9yl_mEL.js";
3
+ import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-BbonPzMz.js";
4
+ import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-ChexW8i7.js";
5
+ import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-Gk0Vfnv1.js";
6
+ import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-Cns8BFm4.js";
7
+ import { a as ExportPortalInput, n as RSToolAgentContract, o as ExportPortalResult, r as RSToolAgentOptions, s as ImportDataKind } from "./tool-contract-0uRGhEfW.js";
8
+
9
+ //#region src/models/rstool-agent.d.ts
10
+ /**
11
+ * Agent-facing entry point for incremental RSForm editing, analysis, diagnostics,
12
+ * modeling, and evaluation.
13
+ *
14
+ * Holds in-memory (optionally persisted) sessions and delegates language work
15
+ * to internal schema and model adapters.
16
+ */
17
+ declare class RSToolAgent implements RSToolAgentContract {
18
+ readonly contractVersion = "2.0.0";
19
+ private readonly sessions;
20
+ private readonly adapter;
21
+ private readonly evaluation;
22
+ private currentSessionId;
23
+ /** @param options - Optional persistence directory for session storage. */
24
+ constructor(options?: RSToolAgentOptions);
25
+ /** @inheritdoc */
26
+ ensureSession(initial?: Partial<SessionState>): SessionHandle;
27
+ /** @inheritdoc */
28
+ createSession(initial?: Partial<SessionState>): SessionHandle;
29
+ /** @inheritdoc */
30
+ getCurrentSession(): SessionHandle | null;
31
+ /** @inheritdoc */
32
+ setCurrentSession(sessionId: string): SessionHandle;
33
+ /** @inheritdoc */
34
+ applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult;
35
+ /** @inheritdoc */
36
+ getSessionState(detail?: SessionStateDetail, sessionId?: string): SessionStateResult;
37
+ /** @inheritdoc */
38
+ listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string): DiagnosticRecord[];
39
+ /** @inheritdoc */
40
+ analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult;
41
+ /** @inheritdoc */
42
+ commitStep(message?: string, sessionId?: string): SessionRevision;
43
+ /** @inheritdoc */
44
+ exportSession(sessionId?: string): string;
45
+ /** @inheritdoc */
46
+ exportPortal(input: ExportPortalInput, sessionId?: string): ExportPortalResult;
47
+ /** @inheritdoc */
48
+ importData(payload: string | object, kind?: ImportDataKind): SessionHandle;
49
+ /** @inheritdoc */
50
+ setModelValues(input: SetModelValuesInput, sessionId?: string): Promise<SessionModelState>;
51
+ /** @inheritdoc */
52
+ getModelState(sessionId?: string): SessionModelState;
53
+ /** @inheritdoc */
54
+ evaluate(input: EvaluateInput, sessionId?: string): EvaluationResult;
55
+ /** @inheritdoc */
56
+ recalculateModel(sessionId?: string): RecalculateModelResult;
57
+ private addOrUpdateConstituenta;
58
+ private applyConstituents;
59
+ private buildSessionSummary;
60
+ private buildPortalSchemaObject;
61
+ private buildPortalModelObject;
62
+ private importSessionExport;
63
+ private importPortalSchemaData;
64
+ private importPortalDetailsData;
65
+ private resolveAgentPatches;
66
+ private resolveSessionId;
67
+ private trackSession;
68
+ }
69
+ //#endregion
70
+ export { RSToolAgent as t };
71
+ //# sourceMappingURL=rstool-agent-D2cQze_b.d.ts.map
@@ -1,20 +1,33 @@
1
- import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "../diagnostic-BMYvciz8.js";
2
- import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-BPgsE80c.js";
3
-
1
+ import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "../diagnostic-D9yl_mEL.js";
2
+ import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-ChexW8i7.js";
4
3
  //#region src/session/session-store.d.ts
4
+ interface SessionStoreOptions {
5
+ persistenceDir?: string;
6
+ }
5
7
  interface SessionEnvelope {
6
8
  state: SessionState;
7
9
  diagnostics: DiagnosticRecord[];
8
10
  }
9
11
  declare class SessionStore {
10
12
  private sessions;
13
+ private readonly persistence;
14
+ constructor(options?: SessionStoreOptions);
11
15
  create(initial?: Partial<SessionState>, contractVersion?: string): SessionHandle;
12
16
  get(sessionId: string): SessionEnvelope;
17
+ has(sessionId: string): boolean;
13
18
  replaceState(sessionId: string, nextState: SessionState): void;
14
19
  addRevision(sessionId: string, message?: string): SessionRevision;
15
- appendDiagnostics(sessionId: string, records: DiagnosticRecord[]): void;
20
+ /** Replace active diagnostics for one constituent (or scratch when constituentId is undefined). */
21
+ replaceDiagnosticsForConstituent(sessionId: string, constituentId: number | undefined, records: DiagnosticRecord[]): void;
22
+ setDiagnostics(sessionId: string, records: DiagnosticRecord[]): void;
16
23
  listDiagnostics(sessionId: string, filters?: ListDiagnosticsFilters): DiagnosticRecord[];
24
+ snapshot(sessionId: string): SessionEnvelope;
25
+ restore(sessionId: string, snapshot: SessionEnvelope): void;
26
+ saveCurrentSessionId(sessionId: string | null): void;
27
+ loadCurrentSessionId(): string | null;
28
+ private loadFromDisk;
29
+ private persist;
17
30
  }
18
31
  //#endregion
19
- export { SessionStore };
32
+ export { SessionStore, SessionStoreOptions };
20
33
  //# sourceMappingURL=session-store.d.ts.map
@@ -1,65 +1,2 @@
1
- import { randomUUID } from "node:crypto";
2
- //#region src/session/session-store.ts
3
- var SessionStore = class {
4
- sessions = /* @__PURE__ */ new Map();
5
- create(initial, contractVersion) {
6
- const now = (/* @__PURE__ */ new Date()).toISOString();
7
- const sessionId = initial?.sessionId ?? randomUUID();
8
- const state = {
9
- sessionId,
10
- alias: initial?.alias ?? "",
11
- title: initial?.title ?? "",
12
- comment: initial?.comment ?? "",
13
- createdAt: initial?.createdAt ?? now,
14
- updatedAt: now,
15
- revisions: initial?.revisions ?? [],
16
- items: initial?.items ?? [],
17
- model: initial?.model ?? { items: [] }
18
- };
19
- this.sessions.set(sessionId, {
20
- state,
21
- diagnostics: []
22
- });
23
- return {
24
- sessionId,
25
- contractVersion: contractVersion ?? "1.0.0"
26
- };
27
- }
28
- get(sessionId) {
29
- const found = this.sessions.get(sessionId);
30
- if (!found) throw new Error(`Unknown session: ${sessionId}`);
31
- return found;
32
- }
33
- replaceState(sessionId, nextState) {
34
- const found = this.get(sessionId);
35
- found.state = {
36
- ...nextState,
37
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
38
- };
39
- }
40
- addRevision(sessionId, message) {
41
- const found = this.get(sessionId);
42
- const revision = {
43
- revisionId: randomUUID(),
44
- at: (/* @__PURE__ */ new Date()).toISOString(),
45
- message
46
- };
47
- found.state.revisions.push(revision);
48
- found.state.updatedAt = revision.at;
49
- return revision;
50
- }
51
- appendDiagnostics(sessionId, records) {
52
- const found = this.get(sessionId);
53
- found.diagnostics.push(...records);
54
- found.state.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
55
- }
56
- listDiagnostics(sessionId, filters) {
57
- const found = this.get(sessionId);
58
- if (!filters?.constituentId) return [...found.diagnostics];
59
- return found.diagnostics.filter((record) => record.constituentId === filters.constituentId);
60
- }
61
- };
62
- //#endregion
1
+ import { n as SessionStore } from "../models-Bw6Uum8i.js";
63
2
  export { SessionStore };
64
-
65
- //# sourceMappingURL=session-store.js.map
@@ -1,16 +1,19 @@
1
- import { i as ConstituentaState } from "./constituenta-Dnd6iToB.js";
2
- import { i as SessionModelState } from "./model-value-SFAVj0dw.js";
1
+ import { s as ConstituentaState } from "./constituenta-DnGR6bnM.js";
2
+ import { i as SessionModelState } from "./model-value-BbonPzMz.js";
3
3
 
4
4
  //#region src/models/session.d.ts
5
+ /** Opaque session reference returned by create/import operations. */
5
6
  interface SessionHandle {
6
7
  sessionId: string;
7
8
  contractVersion: string;
8
9
  }
10
+ /** Recorded checkpoint in session revision history. */
9
11
  interface SessionRevision {
10
12
  revisionId: string;
11
13
  at: string;
12
14
  message?: string;
13
15
  }
16
+ /** Full in-memory session state. */
14
17
  interface SessionState {
15
18
  sessionId: string;
16
19
  /** Library item alias for the conceptual schema or model. */
@@ -19,17 +22,17 @@ interface SessionState {
19
22
  title: string;
20
23
  /** Developer comment (Portal JSON `description` on export). */
21
24
  comment: string;
22
- /** Date of creation. */
25
+ /** ISO timestamp of session creation. */
23
26
  createdAt: string;
24
- /** Date of last update. */
27
+ /** ISO timestamp of last mutation. */
25
28
  updatedAt: string;
26
- /** List of revisions. */
29
+ /** Revision checkpoints recorded via {@link RSToolAgent.commitStep}. */
27
30
  revisions: SessionRevision[];
28
- /** List of constituents in the session. */
31
+ /** Analyzed constituents in the conceptual schema. */
29
32
  items: ConstituentaState[];
30
- /** Model state. */
33
+ /** Evaluated model values. */
31
34
  model: SessionModelState;
32
35
  }
33
36
  //#endregion
34
37
  export { SessionRevision as n, SessionState as r, SessionHandle as t };
35
- //# sourceMappingURL=session-BPgsE80c.d.ts.map
38
+ //# sourceMappingURL=session-ChexW8i7.d.ts.map
@@ -0,0 +1,164 @@
1
+ import { o as RSToolValue, t as BasicBinding } from "./common-DHJalS-Q.js";
2
+ import { n as AnalyzeExpressionInput, t as AnalysisResult } from "./analysis-LLnPhmGa.js";
3
+ import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "./diagnostic-D9yl_mEL.js";
4
+ import { o as ConstituentaDraft } from "./constituenta-DnGR6bnM.js";
5
+ import { i as SessionModelState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-BbonPzMz.js";
6
+ import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-ChexW8i7.js";
7
+ import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, r as ApplySchemaPatchResult } from "./agent-workflow-Gk0Vfnv1.js";
8
+ import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-Cns8BFm4.js";
9
+
10
+ //#region src/models/portal-json.d.ts
11
+ /** Portal JSON import/export format version (schema and model files). */
12
+ declare const PORTAL_JSON_CONTRACT_VERSION = "1.0.0";
13
+ /** Shared metadata block in Portal schema and model JSON files. */
14
+ interface PortalImportMetadata {
15
+ contract_version: string;
16
+ title: string;
17
+ alias: string;
18
+ description: string;
19
+ }
20
+ /** Inflected or tagged surface form of a term. */
21
+ interface PortalTermForm {
22
+ text: string;
23
+ tags: string;
24
+ }
25
+ /** One constituent in Portal schema JSON (`cst_type`, snake_case fields). */
26
+ interface PortalSchemaConstituenta {
27
+ id: number;
28
+ alias: string;
29
+ convention: string;
30
+ crucial: boolean;
31
+ cst_type: string;
32
+ definition_formal: string;
33
+ typification_manual: string;
34
+ value_is_property: boolean;
35
+ definition_raw: string;
36
+ definition_resolved: string;
37
+ term_raw: string;
38
+ term_resolved: string;
39
+ term_forms: PortalTermForm[];
40
+ }
41
+ /** Full Portal conceptual schema import/export document. */
42
+ interface PortalSchemaImportData extends PortalImportMetadata {
43
+ items: PortalSchemaConstituenta[];
44
+ attribution: Array<{
45
+ container: number;
46
+ attribute: number;
47
+ }>;
48
+ }
49
+ /** `GET /api/rsforms/:id/details` response (schema payload only). */
50
+ interface PortalRsformDetails {
51
+ id?: number;
52
+ title?: string;
53
+ alias?: string;
54
+ description?: string;
55
+ items: Array<{
56
+ id: number;
57
+ alias: string;
58
+ cst_type: string;
59
+ definition_formal?: string;
60
+ term_raw?: string;
61
+ definition_raw?: string;
62
+ convention?: string;
63
+ }>;
64
+ }
65
+ /** Full Portal conceptual model import/export document. */
66
+ interface PortalModelImportData extends PortalImportMetadata {
67
+ items: Array<{
68
+ id: number;
69
+ type: string;
70
+ value: RSToolValue | BasicBinding;
71
+ }>;
72
+ }
73
+ /** Map a Portal API or JSON schema item to an agent {@link ConstituentaDraft}. */
74
+ declare function portalItemToDraft(item: {
75
+ id: number;
76
+ alias: string;
77
+ cst_type: string;
78
+ definition_formal?: string;
79
+ term_raw?: string;
80
+ definition_raw?: string;
81
+ convention?: string;
82
+ }): ConstituentaDraft;
83
+ //#endregion
84
+ //#region src/models/import-export.d.ts
85
+ /** Portal export target: conceptual schema or model values. */
86
+ type PortalExportKind = 'schema' | 'model';
87
+ /** Serialized JSON string or parsed object for export helpers. */
88
+ type ExportFormat = 'json' | 'object';
89
+ /** Input for {@link RSToolAgent.exportPortal}. */
90
+ interface ExportPortalInput {
91
+ kind: PortalExportKind;
92
+ /** Default: `json` (string). Use `object` for structured data. */
93
+ format?: ExportFormat;
94
+ }
95
+ /**
96
+ * Import payload discriminator.
97
+ *
98
+ * Use `'auto'` to detect from JSON shape, or pass an explicit kind when ambiguous.
99
+ */
100
+ type ImportDataKind = 'auto' | 'session' | 'portal-schema' | 'portal-details';
101
+ /** JSON string or Portal import object, depending on {@link ExportFormat}. */
102
+ type ExportPortalResult = string | PortalSchemaImportData | PortalModelImportData;
103
+ //#endregion
104
+ //#region src/models/tool-contract.d.ts
105
+ /** Agent-visible contract version; bump on breaking API changes. */
106
+ declare const CONTRACT_VERSION = "2.0.0";
107
+ /** Options for constructing an {@link RSToolAgent}. */
108
+ interface RSToolAgentOptions {
109
+ /** When set, sessions are persisted to this directory and survive process restarts. */
110
+ persistenceDir?: string;
111
+ }
112
+ /**
113
+ * Public method surface of {@link RSToolAgent}.
114
+ *
115
+ * Each method accepts an optional `sessionId`; when omitted, the current session is used
116
+ * (or a new one is created where noted).
117
+ */
118
+ interface RSToolAgentContract {
119
+ /** Current contract version string (same as {@link CONTRACT_VERSION}). */
120
+ readonly contractVersion: string;
121
+ /** Return the current session, or create one with optional `initial` metadata. */
122
+ ensureSession(initial?: Partial<SessionState>): SessionHandle;
123
+ /** Create a new session and make it current. */
124
+ createSession(initial?: Partial<SessionState>): SessionHandle;
125
+ /** Return the current session handle, or `null` when none is active. */
126
+ getCurrentSession(): SessionHandle | null;
127
+ /** Switch the active session; throws when `sessionId` is unknown. */
128
+ setCurrentSession(sessionId: string): SessionHandle;
129
+ /** Apply constituent patches to the schema (analyze, merge, optionally commit). */
130
+ applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult;
131
+ /** Return session summary (default) or full cloned state when `detail` is `'full'`. */
132
+ getSessionState(detail?: SessionStateDetail, sessionId?: string): SessionStateResult;
133
+ /** List diagnostics for the session, optionally filtered by constituent. */
134
+ listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string): DiagnosticRecord[];
135
+ /** Parse and type-check an RSLang expression against the current schema context. */
136
+ analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult;
137
+ /** Record a revision checkpoint with an optional message. */
138
+ commitStep(message?: string, sessionId?: string): SessionRevision;
139
+ /** Export the session as a JSON string (state + diagnostics). */
140
+ exportSession(sessionId?: string): string;
141
+ /** Export schema or model payload in Portal JSON format. */
142
+ exportPortal(input: ExportPortalInput, sessionId?: string): ExportPortalResult;
143
+ /**
144
+ * Import a session export or Portal JSON payload and make the new session current.
145
+ *
146
+ * When `kind` is `'auto'`, the payload shape is detected automatically.
147
+ */
148
+ importData(payload: string | object, kind?: ImportDataKind): SessionHandle;
149
+ /** Set or clear model values for constituents; returns the updated model state. */
150
+ setModelValues(input: SetModelValuesInput, sessionId?: string): Promise<SessionModelState>;
151
+ /** Return a deep clone of the session model state. */
152
+ getModelState(sessionId?: string): SessionModelState;
153
+ /**
154
+ * Evaluate a stored constituent or a scratch expression.
155
+ *
156
+ * Provide `constituentId`, or both `expression` and `cstType`.
157
+ */
158
+ evaluate(input: EvaluateInput, sessionId?: string): EvaluationResult;
159
+ /** Recompute derived model values for all constituents. */
160
+ recalculateModel(sessionId?: string): RecalculateModelResult;
161
+ }
162
+ //#endregion
163
+ export { ExportPortalInput as a, PortalExportKind as c, PortalModelImportData as d, PortalRsformDetails as f, portalItemToDraft as g, PortalTermForm as h, ExportFormat as i, PORTAL_JSON_CONTRACT_VERSION as l, PortalSchemaImportData as m, RSToolAgentContract as n, ExportPortalResult as o, PortalSchemaConstituenta as p, RSToolAgentOptions as r, ImportDataKind as s, CONTRACT_VERSION as t, PortalImportMetadata as u };
164
+ //# sourceMappingURL=tool-contract-0uRGhEfW.d.ts.map
@@ -1,4 +1,5 @@
1
1
  //#region src/wrapper/client.d.ts
2
+ /** One JSON line emitted by the stdio wrapper (request response or ready event). */
2
3
  interface WrapperResponse<T = unknown> {
3
4
  id: string | number | null;
4
5
  ok: boolean;
@@ -9,20 +10,42 @@ interface WrapperResponse<T = unknown> {
9
10
  details?: unknown;
10
11
  };
11
12
  }
13
+ /** Options for spawning the `rstool-wrapper` child process. */
12
14
  interface RSToolWrapperClientOptions {
15
+ /** Executable to spawn. Default: `npm`. */
13
16
  command?: string;
17
+ /** Arguments passed to `command`. Default: `['run', 'wrapper']`. */
14
18
  args?: string[];
19
+ /** Working directory for the child process. Default: `process.cwd()`. */
15
20
  cwd?: string;
21
+ /** Whether to run the command in a shell. Default: `true`. */
16
22
  shell?: boolean;
17
23
  }
24
+ /**
25
+ * JSON-RPC client for the `rstool-wrapper` stdio process.
26
+ *
27
+ * Sends one JSON request per line on stdin and reads one JSON response per line from stdout.
28
+ */
18
29
  declare class RSToolWrapperClient {
19
30
  private process;
20
31
  private input;
21
32
  private pending;
22
33
  private requestCounter;
34
+ /**
35
+ * @param options - Spawn configuration; defaults run `npm run wrapper` in the current directory.
36
+ */
23
37
  constructor(options?: RSToolWrapperClientOptions);
38
+ /** Block until the wrapper emits its initial `{ ready: true }` event. */
24
39
  waitUntilReady(): Promise<void>;
40
+ /**
41
+ * Invoke a wrapper method and return its `result` field.
42
+ *
43
+ * @param method - Stdio method name (matches {@link RSToolAgentContract} operations).
44
+ * @param params - Method parameters object.
45
+ * @throws When the wrapper responds with `ok: false`.
46
+ */
25
47
  call<T>(method: string, params?: unknown): Promise<T>;
48
+ /** Close stdin and terminate the wrapper process. */
26
49
  close(): Promise<void>;
27
50
  private readOneEvent;
28
51
  private handleLine;
@@ -1,11 +1,19 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import readline from "node:readline";
3
3
  //#region src/wrapper/client.ts
4
+ /**
5
+ * JSON-RPC client for the `rstool-wrapper` stdio process.
6
+ *
7
+ * Sends one JSON request per line on stdin and reads one JSON response per line from stdout.
8
+ */
4
9
  var RSToolWrapperClient = class {
5
10
  process;
6
11
  input;
7
12
  pending = /* @__PURE__ */ new Map();
8
13
  requestCounter = 1;
14
+ /**
15
+ * @param options - Spawn configuration; defaults run `npm run wrapper` in the current directory.
16
+ */
9
17
  constructor(options = {}) {
10
18
  this.process = spawn(options.command ?? "npm", options.args ?? ["run", "wrapper"], {
11
19
  cwd: options.cwd ?? process.cwd(),
@@ -22,6 +30,7 @@ var RSToolWrapperClient = class {
22
30
  });
23
31
  this.input.on("line", (line) => this.handleLine(line));
24
32
  }
33
+ /** Block until the wrapper emits its initial `{ ready: true }` event. */
25
34
  async waitUntilReady() {
26
35
  for (;;) {
27
36
  const line = await this.readOneEvent();
@@ -34,6 +43,13 @@ var RSToolWrapperClient = class {
34
43
  if (response.ok && response.result?.ready) return;
35
44
  }
36
45
  }
46
+ /**
47
+ * Invoke a wrapper method and return its `result` field.
48
+ *
49
+ * @param method - Stdio method name (matches {@link RSToolAgentContract} operations).
50
+ * @param params - Method parameters object.
51
+ * @throws When the wrapper responds with `ok: false`.
52
+ */
37
53
  async call(method, params = {}) {
38
54
  const id = String(this.requestCounter++);
39
55
  const payload = JSON.stringify({
@@ -49,6 +65,7 @@ var RSToolWrapperClient = class {
49
65
  if (!response.ok) throw new Error(`${response.error?.code ?? "UNKNOWN"}: ${response.error?.message ?? "Request failed"}`);
50
66
  return response.result;
51
67
  }
68
+ /** Close stdin and terminate the wrapper process. */
52
69
  async close() {
53
70
  this.input.close();
54
71
  this.process.stdin.end();
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../src/wrapper/client.ts"],"sourcesContent":["import { spawn, type ChildProcessByStdio } from 'node:child_process';\nimport readline from 'node:readline';\nimport { type Readable, type Writable } from 'node:stream';\n\nexport interface WrapperResponse<T = unknown> {\n id: string | number | null;\n ok: boolean;\n result?: T;\n error?: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\nexport interface RSToolWrapperClientOptions {\n command?: string;\n args?: string[];\n cwd?: string;\n shell?: boolean;\n}\n\nexport class RSToolWrapperClient {\n private process: ChildProcessByStdio<Writable, Readable, null>;\n private input: readline.Interface;\n private pending = new Map<string, (value: WrapperResponse) => void>();\n private requestCounter = 1;\n\n public constructor(options: RSToolWrapperClientOptions = {}) {\n this.process = spawn(options.command ?? 'npm', options.args ?? ['run', 'wrapper'], {\n cwd: options.cwd ?? process.cwd(),\n shell: options.shell ?? true,\n stdio: ['pipe', 'pipe', 'inherit']\n });\n this.input = readline.createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity\n });\n this.input.on('line', line => this.handleLine(line));\n }\n\n public async waitUntilReady(): Promise<void> {\n for (;;) {\n const line = await this.readOneEvent();\n let response: WrapperResponse<{ ready: boolean }> | null = null;\n try {\n response = JSON.parse(line) as WrapperResponse<{ ready: boolean }>;\n } catch {\n continue;\n }\n if (response.ok && response.result?.ready) {\n return;\n }\n }\n }\n\n public async call<T>(method: string, params: unknown = {}): Promise<T> {\n const id = String(this.requestCounter++);\n const payload = JSON.stringify({ id, method, params });\n const responsePromise = new Promise<WrapperResponse>(resolve => {\n this.pending.set(id, resolve);\n });\n this.process.stdin.write(`${payload}\\n`);\n const response = await responsePromise;\n if (!response.ok) {\n throw new Error(`${response.error?.code ?? 'UNKNOWN'}: ${response.error?.message ?? 'Request failed'}`);\n }\n return response.result as T;\n }\n\n public async close(): Promise<void> {\n this.input.close();\n this.process.stdin.end();\n if (!this.process.killed) {\n this.process.kill();\n }\n }\n\n private async readOneEvent(): Promise<string> {\n return new Promise((resolve, reject) => {\n const onLine = (line: string) => {\n cleanup();\n resolve(line);\n };\n const onExit = () => {\n cleanup();\n reject(new Error('Wrapper exited before ready'));\n };\n const cleanup = () => {\n this.input.off('line', onLine);\n this.process.off('exit', onExit);\n };\n this.input.on('line', onLine);\n this.process.on('exit', onExit);\n });\n }\n\n private handleLine(line: string): void {\n let parsed: WrapperResponse;\n try {\n parsed = JSON.parse(line) as WrapperResponse;\n } catch {\n return;\n }\n if (parsed.id === null || parsed.id === undefined) {\n return;\n }\n const id = String(parsed.id);\n const resolver = this.pending.get(id);\n if (!resolver) {\n return;\n }\n this.pending.delete(id);\n resolver(parsed);\n }\n}\n"],"mappings":";;;AAsBA,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA,0BAAkB,IAAI,IAA8C;CACpE,iBAAyB;CAEzB,YAAmB,UAAsC,CAAC,GAAG;EAC3D,KAAK,UAAU,MAAM,QAAQ,WAAW,OAAO,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG;GACjF,KAAK,QAAQ,OAAO,QAAQ,IAAI;GAChC,OAAO,QAAQ,SAAS;GACxB,OAAO;IAAC;IAAQ;IAAQ;GAAS;EACnC,CAAC;EACD,KAAK,QAAQ,SAAS,gBAAgB;GACpC,OAAO,KAAK,QAAQ;GACpB,WAAW;EACb,CAAC;EACD,KAAK,MAAM,GAAG,SAAQ,SAAQ,KAAK,WAAW,IAAI,CAAC;CACrD;CAEA,MAAa,iBAAgC;EAC3C,SAAS;GACP,MAAM,OAAO,MAAM,KAAK,aAAa;GACrC,IAAI,WAAuD;GAC3D,IAAI;IACF,WAAW,KAAK,MAAM,IAAI;GAC5B,QAAQ;IACN;GACF;GACA,IAAI,SAAS,MAAM,SAAS,QAAQ,OAClC;EAEJ;CACF;CAEA,MAAa,KAAQ,QAAgB,SAAkB,CAAC,GAAe;EACrE,MAAM,KAAK,OAAO,KAAK,gBAAgB;EACvC,MAAM,UAAU,KAAK,UAAU;GAAE;GAAI;GAAQ;EAAO,CAAC;EACrD,MAAM,kBAAkB,IAAI,SAAyB,YAAW;GAC9D,KAAK,QAAQ,IAAI,IAAI,OAAO;EAC9B,CAAC;EACD,KAAK,QAAQ,MAAM,MAAM,GAAG,QAAQ,GAAG;EACvC,MAAM,WAAW,MAAM;EACvB,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,GAAG,SAAS,OAAO,QAAQ,UAAU,IAAI,SAAS,OAAO,WAAW,kBAAkB;EAExG,OAAO,SAAS;CAClB;CAEA,MAAa,QAAuB;EAClC,KAAK,MAAM,MAAM;EACjB,KAAK,QAAQ,MAAM,IAAI;EACvB,IAAI,CAAC,KAAK,QAAQ,QAChB,KAAK,QAAQ,KAAK;CAEtB;CAEA,MAAc,eAAgC;EAC5C,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,UAAU,SAAiB;IAC/B,QAAQ;IACR,QAAQ,IAAI;GACd;GACA,MAAM,eAAe;IACnB,QAAQ;IACR,uBAAO,IAAI,MAAM,6BAA6B,CAAC;GACjD;GACA,MAAM,gBAAgB;IACpB,KAAK,MAAM,IAAI,QAAQ,MAAM;IAC7B,KAAK,QAAQ,IAAI,QAAQ,MAAM;GACjC;GACA,KAAK,MAAM,GAAG,QAAQ,MAAM;GAC5B,KAAK,QAAQ,GAAG,QAAQ,MAAM;EAChC,CAAC;CACH;CAEA,WAAmB,MAAoB;EACrC,IAAI;EACJ,IAAI;GACF,SAAS,KAAK,MAAM,IAAI;EAC1B,QAAQ;GACN;EACF;EACA,IAAI,OAAO,OAAO,QAAQ,OAAO,OAAO,QACtC;EAEF,MAAM,KAAK,OAAO,OAAO,EAAE;EAC3B,MAAM,WAAW,KAAK,QAAQ,IAAI,EAAE;EACpC,IAAI,CAAC,UACH;EAEF,KAAK,QAAQ,OAAO,EAAE;EACtB,SAAS,MAAM;CACjB;AACF"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../src/wrapper/client.ts"],"sourcesContent":["import { spawn, type ChildProcessByStdio } from 'node:child_process';\nimport readline from 'node:readline';\nimport { type Readable, type Writable } from 'node:stream';\n\n/** One JSON line emitted by the stdio wrapper (request response or ready event). */\nexport interface WrapperResponse<T = unknown> {\n id: string | number | null;\n ok: boolean;\n result?: T;\n error?: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\n/** Options for spawning the `rstool-wrapper` child process. */\nexport interface RSToolWrapperClientOptions {\n /** Executable to spawn. Default: `npm`. */\n command?: string;\n /** Arguments passed to `command`. Default: `['run', 'wrapper']`. */\n args?: string[];\n /** Working directory for the child process. Default: `process.cwd()`. */\n cwd?: string;\n /** Whether to run the command in a shell. Default: `true`. */\n shell?: boolean;\n}\n\n/**\n * JSON-RPC client for the `rstool-wrapper` stdio process.\n *\n * Sends one JSON request per line on stdin and reads one JSON response per line from stdout.\n */\nexport class RSToolWrapperClient {\n private process: ChildProcessByStdio<Writable, Readable, null>;\n private input: readline.Interface;\n private pending = new Map<string, (value: WrapperResponse) => void>();\n private requestCounter = 1;\n\n /**\n * @param options - Spawn configuration; defaults run `npm run wrapper` in the current directory.\n */\n public constructor(options: RSToolWrapperClientOptions = {}) {\n this.process = spawn(options.command ?? 'npm', options.args ?? ['run', 'wrapper'], {\n cwd: options.cwd ?? process.cwd(),\n shell: options.shell ?? true,\n stdio: ['pipe', 'pipe', 'inherit']\n });\n this.input = readline.createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity\n });\n this.input.on('line', line => this.handleLine(line));\n }\n\n /** Block until the wrapper emits its initial `{ ready: true }` event. */\n public async waitUntilReady(): Promise<void> {\n for (;;) {\n const line = await this.readOneEvent();\n let response: WrapperResponse<{ ready: boolean }> | null = null;\n try {\n response = JSON.parse(line) as WrapperResponse<{ ready: boolean }>;\n } catch {\n continue;\n }\n if (response.ok && response.result?.ready) {\n return;\n }\n }\n }\n\n /**\n * Invoke a wrapper method and return its `result` field.\n *\n * @param method - Stdio method name (matches {@link RSToolAgentContract} operations).\n * @param params - Method parameters object.\n * @throws When the wrapper responds with `ok: false`.\n */\n public async call<T>(method: string, params: unknown = {}): Promise<T> {\n const id = String(this.requestCounter++);\n const payload = JSON.stringify({ id, method, params });\n const responsePromise = new Promise<WrapperResponse>(resolve => {\n this.pending.set(id, resolve);\n });\n this.process.stdin.write(`${payload}\\n`);\n const response = await responsePromise;\n if (!response.ok) {\n throw new Error(`${response.error?.code ?? 'UNKNOWN'}: ${response.error?.message ?? 'Request failed'}`);\n }\n return response.result as T;\n }\n\n /** Close stdin and terminate the wrapper process. */\n public async close(): Promise<void> {\n this.input.close();\n this.process.stdin.end();\n if (!this.process.killed) {\n this.process.kill();\n }\n }\n\n private async readOneEvent(): Promise<string> {\n return new Promise((resolve, reject) => {\n const onLine = (line: string) => {\n cleanup();\n resolve(line);\n };\n const onExit = () => {\n cleanup();\n reject(new Error('Wrapper exited before ready'));\n };\n const cleanup = () => {\n this.input.off('line', onLine);\n this.process.off('exit', onExit);\n };\n this.input.on('line', onLine);\n this.process.on('exit', onExit);\n });\n }\n\n private handleLine(line: string): void {\n let parsed: WrapperResponse;\n try {\n parsed = JSON.parse(line) as WrapperResponse;\n } catch {\n return;\n }\n if (parsed.id === null || parsed.id === undefined) {\n return;\n }\n const id = String(parsed.id);\n const resolver = this.pending.get(id);\n if (!resolver) {\n return;\n }\n this.pending.delete(id);\n resolver(parsed);\n }\n}\n"],"mappings":";;;;;;;;AAiCA,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA,0BAAkB,IAAI,IAA8C;CACpE,iBAAyB;;;;CAKzB,YAAmB,UAAsC,CAAC,GAAG;EAC3D,KAAK,UAAU,MAAM,QAAQ,WAAW,OAAO,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG;GACjF,KAAK,QAAQ,OAAO,QAAQ,IAAI;GAChC,OAAO,QAAQ,SAAS;GACxB,OAAO;IAAC;IAAQ;IAAQ;GAAS;EACnC,CAAC;EACD,KAAK,QAAQ,SAAS,gBAAgB;GACpC,OAAO,KAAK,QAAQ;GACpB,WAAW;EACb,CAAC;EACD,KAAK,MAAM,GAAG,SAAQ,SAAQ,KAAK,WAAW,IAAI,CAAC;CACrD;;CAGA,MAAa,iBAAgC;EAC3C,SAAS;GACP,MAAM,OAAO,MAAM,KAAK,aAAa;GACrC,IAAI,WAAuD;GAC3D,IAAI;IACF,WAAW,KAAK,MAAM,IAAI;GAC5B,QAAQ;IACN;GACF;GACA,IAAI,SAAS,MAAM,SAAS,QAAQ,OAClC;EAEJ;CACF;;;;;;;;CASA,MAAa,KAAQ,QAAgB,SAAkB,CAAC,GAAe;EACrE,MAAM,KAAK,OAAO,KAAK,gBAAgB;EACvC,MAAM,UAAU,KAAK,UAAU;GAAE;GAAI;GAAQ;EAAO,CAAC;EACrD,MAAM,kBAAkB,IAAI,SAAyB,YAAW;GAC9D,KAAK,QAAQ,IAAI,IAAI,OAAO;EAC9B,CAAC;EACD,KAAK,QAAQ,MAAM,MAAM,GAAG,QAAQ,GAAG;EACvC,MAAM,WAAW,MAAM;EACvB,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,GAAG,SAAS,OAAO,QAAQ,UAAU,IAAI,SAAS,OAAO,WAAW,kBAAkB;EAExG,OAAO,SAAS;CAClB;;CAGA,MAAa,QAAuB;EAClC,KAAK,MAAM,MAAM;EACjB,KAAK,QAAQ,MAAM,IAAI;EACvB,IAAI,CAAC,KAAK,QAAQ,QAChB,KAAK,QAAQ,KAAK;CAEtB;CAEA,MAAc,eAAgC;EAC5C,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,UAAU,SAAiB;IAC/B,QAAQ;IACR,QAAQ,IAAI;GACd;GACA,MAAM,eAAe;IACnB,QAAQ;IACR,uBAAO,IAAI,MAAM,6BAA6B,CAAC;GACjD;GACA,MAAM,gBAAgB;IACpB,KAAK,MAAM,IAAI,QAAQ,MAAM;IAC7B,KAAK,QAAQ,IAAI,QAAQ,MAAM;GACjC;GACA,KAAK,MAAM,GAAG,QAAQ,MAAM;GAC5B,KAAK,QAAQ,GAAG,QAAQ,MAAM;EAChC,CAAC;CACH;CAEA,WAAmB,MAAoB;EACrC,IAAI;EACJ,IAAI;GACF,SAAS,KAAK,MAAM,IAAI;EAC1B,QAAQ;GACN;EACF;EACA,IAAI,OAAO,OAAO,QAAQ,OAAO,OAAO,QACtC;EAEF,MAAM,KAAK,OAAO,OAAO,EAAE;EAC3B,MAAM,WAAW,KAAK,QAAQ,IAAI,EAAE;EACpC,IAAI,CAAC,UACH;EAEF,KAAK,QAAQ,OAAO,EAAE;EACtB,SAAS,MAAM;CACjB;AACF"}