@rsconcept/rstool 0.10.2 → 1.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.
- package/README.md +41 -31
- package/dist/agent-workflow-D-PSIb-m.d.ts +70 -0
- package/dist/analysis-LLnPhmGa.d.ts +23 -0
- package/dist/{common-DxLg3eXX.d.ts → common-DHJalS-Q.d.ts} +6 -1
- package/dist/constituenta-DnGR6bnM.d.ts +54 -0
- package/dist/diagnostic-D9yl_mEL.d.ts +19 -0
- package/dist/evaluation-Cns8BFm4.d.ts +31 -0
- package/dist/index.d.ts +11 -11
- package/dist/index.js +1 -1
- package/dist/mappers/model-adapter.d.ts +3 -3
- package/dist/mappers/schema-adapter.d.ts +4 -4
- package/dist/mappers/types.d.ts +6 -2
- package/dist/mappers/types.js +2 -0
- package/dist/mappers/types.js.map +1 -1
- package/dist/{model-value-SFAVj0dw.d.ts → model-value-BbonPzMz.d.ts} +14 -3
- package/dist/models/agent-workflow.d.ts +2 -0
- package/dist/models/agent-workflow.js +1 -0
- package/dist/models/analysis.d.ts +1 -1
- package/dist/models/common.d.ts +1 -1
- package/dist/models/constituenta.d.ts +2 -2
- package/dist/models/diagnostic.d.ts +1 -1
- package/dist/models/evaluation.d.ts +2 -2
- package/dist/models/index.d.ts +11 -11
- package/dist/models/index.js +2 -2
- package/dist/models/model-value.d.ts +2 -2
- package/dist/models/rstool-agent.d.ts +1 -1
- package/dist/models/rstool-agent.js +1 -1
- package/dist/models/session.d.ts +1 -1
- package/dist/models/tool-contract.d.ts +2 -2
- package/dist/models/tool-contract.js +2 -1
- package/dist/models/tool-contract.js.map +1 -1
- package/dist/rstool-agent-_8bplZnb.d.ts +71 -0
- package/dist/rstool-agent-kijHA9ML.js +476 -0
- package/dist/rstool-agent-kijHA9ML.js.map +1 -0
- package/dist/session/session-store.d.ts +18 -5
- package/dist/session/session-store.js +1 -64
- package/dist/{session-BPgsE80c.d.ts → session-ChexW8i7.d.ts} +11 -8
- package/dist/session-store-C3jyOSqI.js +142 -0
- package/dist/session-store-C3jyOSqI.js.map +1 -0
- package/dist/tool-contract-5_Q44DGE.d.ts +164 -0
- package/dist/wrapper/client.d.ts +23 -0
- package/dist/wrapper/client.js +17 -0
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/stdio-wrapper.js +62 -52
- package/dist/wrapper/stdio-wrapper.js.map +1 -1
- package/docs/CONSTITUENTA.md +2 -2
- package/docs/DIAGNOSTICS.md +20 -18
- package/docs/MODEL-TESTING.md +3 -3
- package/docs/PORTAL-API.md +24 -18
- package/examples/README.md +1 -1
- package/examples/agent-client.ts +11 -41
- package/examples/build-chocolate-nim-rsform.ts +23 -18
- package/examples/chocolate-nim/build-rsform.ts +23 -18
- package/examples/chocolate-nim/build-rsmodel.ts +10 -12
- package/examples/chocolate-nim/rsform-session.json +290 -290
- package/examples/chocolate-nim/rsmodel-session.json +291 -291
- package/examples/expression-bank/bank-constituents.ts +304 -53
- package/examples/expression-bank/build-rsform.ts +19 -16
- package/examples/expression-bank/rsform-session.json +1551 -1551
- package/examples/kinship/build-rsform.ts +23 -18
- package/examples/kinship/build-rsmodel.ts +13 -15
- package/examples/kinship/rsform-session.json +219 -219
- package/examples/kinship/rsmodel-session.json +221 -221
- package/examples/kinship/session.ts +19 -21
- package/examples/movd/build-rsform.ts +23 -18
- package/examples/movd/build-rsmodel.ts +18 -20
- package/examples/movd/rsform-session.json +262 -262
- package/examples/movd/rsmodel-session.json +264 -264
- package/examples/sample/build-rsform.ts +19 -50
- package/examples/sample/build-rsmodel.ts +25 -44
- package/examples/sample/rsform-session.json +36 -33
- package/examples/sample/rsmodel-session.json +36 -33
- package/examples/template-apply/build-rsform.ts +27 -24
- package/examples/template-apply/rsform-session.json +48 -48
- package/package.json +3 -3
- package/skills/rstool-helper/EXAMPLES.md +44 -116
- package/skills/rstool-helper/GUIDE.md +40 -25
- package/skills/rstool-helper/REFERENCE.md +40 -177
- package/src/index.ts +24 -17
- package/src/mappers/portal-adapter.ts +43 -0
- package/src/mappers/types.ts +4 -0
- package/src/models/agent-workflow.ts +78 -0
- package/src/models/analysis.ts +7 -0
- package/src/models/common.ts +7 -0
- package/src/models/constituenta.ts +24 -6
- package/src/models/diagnostic.ts +4 -0
- package/src/models/evaluation.ts +11 -0
- package/src/models/import-detect.ts +39 -0
- package/src/models/import-export.ts +24 -0
- package/src/models/index.ts +22 -14
- package/src/models/model-value.ts +12 -0
- package/src/models/portal-json.ts +44 -0
- package/src/models/rstool-agent.test.ts +300 -147
- package/src/models/rstool-agent.ts +350 -93
- package/src/models/session.ts +8 -5
- package/src/models/tool-contract.ts +81 -42
- package/src/session/batch-apply.test.ts +28 -0
- package/src/session/batch-apply.ts +47 -0
- package/src/session/persistence.ts +56 -0
- package/src/session/session-store.ts +67 -4
- package/src/wrapper/client.ts +23 -0
- package/src/wrapper/stdio-wrapper.ts +59 -49
- package/dist/analysis-JiwOYDKx.d.ts +0 -16
- package/dist/constituenta-Dnd6iToB.d.ts +0 -36
- package/dist/diagnostic-BMYvciz8.d.ts +0 -15
- package/dist/evaluation-CCVYH0wA.d.ts +0 -21
- package/dist/index-uhkmwruf.d.ts +0 -46
- package/dist/rstool-agent-BZi5jO1y.js +0 -158
- package/dist/rstool-agent-BZi5jO1y.js.map +0 -1
- package/dist/rstool-agent-pRaPnZay.d.ts +0 -35
- package/dist/session/session-store.js.map +0 -1
- package/dist/tool-contract-n1ghUOrK.d.ts +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-contract.js","names":[],"sources":["../../src/models/tool-contract.ts"],"sourcesContent":["import { type
|
|
1
|
+
{"version":3,"file":"tool-contract.js","names":[],"sources":["../../src/models/tool-contract.ts"],"sourcesContent":["import {\n type ApplySchemaPatchInput,\n type ApplySchemaPatchResult,\n type SessionStateDetail,\n type SessionStateResult\n} from './agent-workflow';\nimport { type AnalysisResult, type AnalyzeExpressionInput } from './analysis';\nimport { type DiagnosticRecord, type ListDiagnosticsFilters } from './diagnostic';\nimport { type EvaluateInput, type EvaluationResult } from './evaluation';\nimport { type ExportPortalInput, type ExportPortalResult, type ImportDataKind } from './import-export';\nimport { type RecalculateModelResult, type SessionModelState, type SetModelValuesInput } from './model-value';\nimport { type SessionHandle, type SessionRevision, type SessionState } from './session';\n\n/** Agent-visible contract version; bump on breaking API changes. */\nexport const CONTRACT_VERSION = '2.0.0';\n\n/** Options for constructing an {@link RSToolAgent}. */\nexport interface RSToolAgentOptions {\n /** When set, sessions are persisted to this directory and survive process restarts. */\n persistenceDir?: string;\n}\n\n/**\n * Public method surface of {@link RSToolAgent}.\n *\n * Each method accepts an optional `sessionId`; when omitted, the current session is used\n * (or a new one is created where noted).\n */\nexport interface RSToolAgentContract {\n /** Current contract version string (same as {@link CONTRACT_VERSION}). */\n readonly contractVersion: string;\n\n /** Return the current session, or create one with optional `initial` metadata. */\n ensureSession(initial?: Partial<SessionState>): SessionHandle;\n\n /** Create a new session and make it current. */\n createSession(initial?: Partial<SessionState>): SessionHandle;\n\n /** Return the current session handle, or `null` when none is active. */\n getCurrentSession(): SessionHandle | null;\n\n /** Switch the active session; throws when `sessionId` is unknown. */\n setCurrentSession(sessionId: string): SessionHandle;\n\n /** Apply constituent patches to the schema (analyze, merge, optionally commit). */\n applySchemaPatch(input: ApplySchemaPatchInput, sessionId?: string): ApplySchemaPatchResult;\n\n /** Return session summary (default) or full cloned state when `detail` is `'full'`. */\n getSessionState(detail?: SessionStateDetail, sessionId?: string): SessionStateResult;\n\n /** List diagnostics for the session, optionally filtered by constituent. */\n listDiagnostics(filters?: ListDiagnosticsFilters, sessionId?: string): DiagnosticRecord[];\n\n /** Parse and type-check an RSLang expression against the current schema context. */\n analyzeExpression(input: AnalyzeExpressionInput, sessionId?: string): AnalysisResult;\n\n /** Record a revision checkpoint with an optional message. */\n commitStep(message?: string, sessionId?: string): SessionRevision;\n\n /** Export the session as a JSON string (state + diagnostics). */\n exportSession(sessionId?: string): string;\n\n /** Export schema or model payload in Portal JSON format. */\n exportPortal(input: ExportPortalInput, sessionId?: string): ExportPortalResult;\n\n /**\n * Import a session export or Portal JSON payload and make the new session current.\n *\n * When `kind` is `'auto'`, the payload shape is detected automatically.\n */\n importData(payload: string | object, kind?: ImportDataKind): SessionHandle;\n\n /** Set or clear model values for constituents; returns the updated model state. */\n setModelValues(input: SetModelValuesInput, sessionId?: string): Promise<SessionModelState>;\n\n /** Return a deep clone of the session model state. */\n getModelState(sessionId?: string): SessionModelState;\n\n /**\n * Evaluate a stored constituent or a scratch expression.\n *\n * Provide `constituentId`, or both `expression` and `cstType`.\n */\n evaluate(input: EvaluateInput, sessionId?: string): EvaluationResult;\n\n /** Recompute derived model values for all constituents. */\n recalculateModel(sessionId?: string): RecalculateModelResult;\n}\n"],"mappings":";;AAcA,MAAa,mBAAmB"}
|
|
@@ -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 SessionStateDetail, n as ApplySchemaPatchInput, o as SessionStateResult, r as ApplySchemaPatchResult } from "./agent-workflow-D-PSIb-m.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-5_Q44DGE.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-_8bplZnb.d.ts.map
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { CstType } from "./models/common.js";
|
|
2
|
+
import { ModelAdapter } from "./mappers/model-adapter.js";
|
|
3
|
+
import { SchemaAdapter } from "./mappers/schema-adapter.js";
|
|
4
|
+
import { t as SessionStore } from "./session-store-C3jyOSqI.js";
|
|
5
|
+
import { CONTRACT_VERSION } from "./models/tool-contract.js";
|
|
6
|
+
import { Graph } from "@rsconcept/domain/graph/graph";
|
|
7
|
+
import { extractGlobals } from "@rsconcept/domain/rslang/api";
|
|
8
|
+
//#region src/models/portal-json.ts
|
|
9
|
+
/** Portal JSON import/export format version (schema and model files). */
|
|
10
|
+
const PORTAL_JSON_CONTRACT_VERSION = "1.0.0";
|
|
11
|
+
/** Map a Portal API or JSON schema item to an agent {@link ConstituentaDraft}. */
|
|
12
|
+
function portalItemToDraft(item) {
|
|
13
|
+
return {
|
|
14
|
+
id: item.id,
|
|
15
|
+
alias: item.alias,
|
|
16
|
+
cstType: item.cst_type,
|
|
17
|
+
definitionFormal: item.definition_formal ?? "",
|
|
18
|
+
term: item.term_raw ?? "",
|
|
19
|
+
definitionText: item.definition_raw ?? "",
|
|
20
|
+
convention: item.convention ?? ""
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/mappers/portal-adapter.ts
|
|
25
|
+
function portalSchemaToSessionSeed(data) {
|
|
26
|
+
return {
|
|
27
|
+
alias: data.alias ?? "",
|
|
28
|
+
title: data.title ?? "",
|
|
29
|
+
comment: data.description ?? "",
|
|
30
|
+
items: []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function portalDetailsToSessionSeed(data) {
|
|
34
|
+
return {
|
|
35
|
+
alias: data.alias ?? "",
|
|
36
|
+
title: data.title ?? "",
|
|
37
|
+
comment: data.description ?? "",
|
|
38
|
+
items: []
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function portalItemsToDrafts(items) {
|
|
42
|
+
return items.map((item) => portalItemToDraft(item));
|
|
43
|
+
}
|
|
44
|
+
function portalSchemaToDrafts(data) {
|
|
45
|
+
return portalItemsToDrafts(data.items);
|
|
46
|
+
}
|
|
47
|
+
function portalDetailsToDrafts(data) {
|
|
48
|
+
return portalItemsToDrafts(data.items);
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/session/batch-apply.ts
|
|
52
|
+
/** Order drafts so suppliers are applied before dependents. */
|
|
53
|
+
function orderDrafts(sessionItems, drafts) {
|
|
54
|
+
const merged = /* @__PURE__ */ new Map();
|
|
55
|
+
for (const item of sessionItems) merged.set(item.id, {
|
|
56
|
+
id: item.id,
|
|
57
|
+
alias: item.alias,
|
|
58
|
+
cstType: item.cstType,
|
|
59
|
+
definitionFormal: item.definitionFormal
|
|
60
|
+
});
|
|
61
|
+
for (const draft of drafts) merged.set(draft.id, draft);
|
|
62
|
+
const graph = new Graph();
|
|
63
|
+
const aliasToId = /* @__PURE__ */ new Map();
|
|
64
|
+
for (const [id, draft] of merged) {
|
|
65
|
+
graph.addNode(id);
|
|
66
|
+
aliasToId.set(draft.alias, id);
|
|
67
|
+
}
|
|
68
|
+
for (const [id, draft] of merged) {
|
|
69
|
+
if (!draft.definitionFormal) continue;
|
|
70
|
+
for (const alias of extractGlobals(draft.definitionFormal)) {
|
|
71
|
+
const depId = aliasToId.get(alias);
|
|
72
|
+
if (depId !== void 0 && depId !== id) graph.addEdge(depId, id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const draftIds = new Set(drafts.map((draft) => draft.id));
|
|
76
|
+
const topoIds = graph.topologicalOrder().filter((id) => draftIds.has(id));
|
|
77
|
+
const seen = new Set(topoIds);
|
|
78
|
+
const missing = drafts.filter((draft) => !seen.has(draft.id)).map((draft) => draft.id);
|
|
79
|
+
return [...topoIds, ...missing].map((id) => drafts.find((draft) => draft.id === id)).filter(Boolean);
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/models/import-detect.ts
|
|
83
|
+
function isRecord(value) {
|
|
84
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
85
|
+
}
|
|
86
|
+
function parseImportPayload(payload) {
|
|
87
|
+
if (typeof payload === "string") return JSON.parse(payload);
|
|
88
|
+
return payload;
|
|
89
|
+
}
|
|
90
|
+
function detectImportKind(data) {
|
|
91
|
+
if (!isRecord(data)) throw new Error("Invalid import payload");
|
|
92
|
+
if ("contractVersion" in data && "state" in data) return "session";
|
|
93
|
+
if ("contract_version" in data && Array.isArray(data.items)) {
|
|
94
|
+
const items = data.items;
|
|
95
|
+
if (items.length > 0 && isRecord(items[0]) && "cst_type" in items[0]) return "portal-schema";
|
|
96
|
+
throw new Error("Portal model JSON cannot be imported as a schema session");
|
|
97
|
+
}
|
|
98
|
+
if (Array.isArray(data.items) && data.items.length > 0) {
|
|
99
|
+
const first = data.items[0];
|
|
100
|
+
if (isRecord(first) && "cst_type" in first) return "portal-details";
|
|
101
|
+
}
|
|
102
|
+
throw new Error("Cannot detect import kind; pass kind explicitly");
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/models/rstool-agent.ts
|
|
106
|
+
function normalizeImportedState(state) {
|
|
107
|
+
return {
|
|
108
|
+
...state,
|
|
109
|
+
alias: state.alias ?? "",
|
|
110
|
+
title: state.title ?? "",
|
|
111
|
+
comment: state.comment ?? "",
|
|
112
|
+
model: state.model ?? { items: [] }
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function portalImportMetadata(session, kind) {
|
|
116
|
+
const defaults = kind === "schema" ? {
|
|
117
|
+
title: "Conceptual schema",
|
|
118
|
+
alias: "SCHEMA"
|
|
119
|
+
} : {
|
|
120
|
+
title: "Conceptual model",
|
|
121
|
+
alias: "MODEL"
|
|
122
|
+
};
|
|
123
|
+
const title = session.title.trim();
|
|
124
|
+
const alias = session.alias.trim();
|
|
125
|
+
return {
|
|
126
|
+
title: title.length > 0 ? title : defaults.title,
|
|
127
|
+
alias: alias.length > 0 ? alias : defaults.alias,
|
|
128
|
+
description: session.comment.trim()
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function inferCstType(alias) {
|
|
132
|
+
switch (alias.trim().charAt(0).toUpperCase()) {
|
|
133
|
+
case "X": return CstType.BASE;
|
|
134
|
+
case "C": return CstType.CONSTANT;
|
|
135
|
+
case "S": return CstType.STRUCTURED;
|
|
136
|
+
case "D": return CstType.TERM;
|
|
137
|
+
case "A": return CstType.AXIOM;
|
|
138
|
+
case "F": return CstType.FUNCTION;
|
|
139
|
+
case "P": return CstType.PREDICATE;
|
|
140
|
+
default: throw new Error(`Cannot infer cstType from alias "${alias}"; pass cstType explicitly`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Agent-facing entry point for incremental RSForm editing, analysis, diagnostics,
|
|
145
|
+
* modeling, and evaluation.
|
|
146
|
+
*
|
|
147
|
+
* Holds in-memory (optionally persisted) sessions and delegates language work
|
|
148
|
+
* to internal schema and model adapters.
|
|
149
|
+
*/
|
|
150
|
+
var RSToolAgent = class {
|
|
151
|
+
contractVersion = CONTRACT_VERSION;
|
|
152
|
+
sessions;
|
|
153
|
+
adapter = new SchemaAdapter();
|
|
154
|
+
evaluation = new ModelAdapter();
|
|
155
|
+
currentSessionId;
|
|
156
|
+
/** @param options - Optional persistence directory for session storage. */
|
|
157
|
+
constructor(options = {}) {
|
|
158
|
+
this.sessions = new SessionStore({ persistenceDir: options.persistenceDir });
|
|
159
|
+
this.currentSessionId = this.sessions.loadCurrentSessionId();
|
|
160
|
+
}
|
|
161
|
+
/** @inheritdoc */
|
|
162
|
+
ensureSession(initial) {
|
|
163
|
+
return this.getCurrentSession() ?? this.createSession(initial);
|
|
164
|
+
}
|
|
165
|
+
/** @inheritdoc */
|
|
166
|
+
createSession(initial) {
|
|
167
|
+
return this.trackSession(this.sessions.create(initial, this.contractVersion));
|
|
168
|
+
}
|
|
169
|
+
/** @inheritdoc */
|
|
170
|
+
getCurrentSession() {
|
|
171
|
+
if (!this.currentSessionId) return null;
|
|
172
|
+
if (!this.sessions.has(this.currentSessionId)) {
|
|
173
|
+
this.currentSessionId = null;
|
|
174
|
+
this.sessions.saveCurrentSessionId(null);
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
sessionId: this.currentSessionId,
|
|
179
|
+
contractVersion: this.contractVersion
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** @inheritdoc */
|
|
183
|
+
setCurrentSession(sessionId) {
|
|
184
|
+
if (!this.sessions.has(sessionId)) throw new Error(`Unknown session: ${sessionId}`);
|
|
185
|
+
return this.trackSession({
|
|
186
|
+
sessionId,
|
|
187
|
+
contractVersion: this.contractVersion
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/** @inheritdoc */
|
|
191
|
+
applySchemaPatch(input, sessionId) {
|
|
192
|
+
const session = sessionId ? this.setCurrentSession(sessionId) : this.ensureSession(input.initial);
|
|
193
|
+
const drafts = this.resolveAgentPatches(session.sessionId, input.items);
|
|
194
|
+
const result = this.applyConstituents({
|
|
195
|
+
drafts,
|
|
196
|
+
mode: input.mode
|
|
197
|
+
}, session.sessionId);
|
|
198
|
+
const revision = result.success && input.commitMessage ? this.commitStep(input.commitMessage, session.sessionId) : void 0;
|
|
199
|
+
return {
|
|
200
|
+
...result,
|
|
201
|
+
session,
|
|
202
|
+
summary: this.buildSessionSummary(session.sessionId),
|
|
203
|
+
revision
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/** @inheritdoc */
|
|
207
|
+
getSessionState(detail = "summary", sessionId) {
|
|
208
|
+
if (detail === "full") {
|
|
209
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
210
|
+
return structuredClone(envelope.state);
|
|
211
|
+
}
|
|
212
|
+
return this.buildSessionSummary(sessionId);
|
|
213
|
+
}
|
|
214
|
+
/** @inheritdoc */
|
|
215
|
+
listDiagnostics(filters, sessionId) {
|
|
216
|
+
return this.sessions.listDiagnostics(this.resolveSessionId(sessionId), filters);
|
|
217
|
+
}
|
|
218
|
+
/** @inheritdoc */
|
|
219
|
+
analyzeExpression(input, sessionId) {
|
|
220
|
+
const id = this.resolveSessionId(sessionId);
|
|
221
|
+
const envelope = this.sessions.get(id);
|
|
222
|
+
const { result, diagnostics } = this.adapter.analyzeAgainstSession(envelope.state, {
|
|
223
|
+
id: -1,
|
|
224
|
+
alias: "_analysis",
|
|
225
|
+
cstType: input.cstType,
|
|
226
|
+
definitionFormal: input.expression
|
|
227
|
+
});
|
|
228
|
+
if (input.recordDiagnostics) this.sessions.replaceDiagnosticsForConstituent(id, void 0, diagnostics.map((item) => ({
|
|
229
|
+
...item,
|
|
230
|
+
constituentId: void 0
|
|
231
|
+
})));
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/** @inheritdoc */
|
|
235
|
+
commitStep(message, sessionId) {
|
|
236
|
+
return this.sessions.addRevision(this.resolveSessionId(sessionId), message);
|
|
237
|
+
}
|
|
238
|
+
/** @inheritdoc */
|
|
239
|
+
exportSession(sessionId) {
|
|
240
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
241
|
+
return JSON.stringify({
|
|
242
|
+
contractVersion: this.contractVersion,
|
|
243
|
+
state: envelope.state,
|
|
244
|
+
diagnostics: envelope.diagnostics
|
|
245
|
+
}, null, 2);
|
|
246
|
+
}
|
|
247
|
+
/** @inheritdoc */
|
|
248
|
+
exportPortal(input, sessionId) {
|
|
249
|
+
const format = input.format ?? "json";
|
|
250
|
+
const object = input.kind === "schema" ? this.buildPortalSchemaObject(sessionId) : this.buildPortalModelObject(sessionId);
|
|
251
|
+
return format === "object" ? object : JSON.stringify(object, null, 2);
|
|
252
|
+
}
|
|
253
|
+
/** @inheritdoc */
|
|
254
|
+
importData(payload, kind = "auto") {
|
|
255
|
+
const parsed = parseImportPayload(payload);
|
|
256
|
+
const resolvedKind = kind === "auto" ? detectImportKind(parsed) : kind;
|
|
257
|
+
switch (resolvedKind) {
|
|
258
|
+
case "session": return this.importSessionExport(parsed);
|
|
259
|
+
case "portal-schema": return this.importPortalSchemaData(parsed);
|
|
260
|
+
case "portal-details": return this.importPortalDetailsData(parsed);
|
|
261
|
+
default: throw new Error(`Unsupported import kind: ${resolvedKind}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** @inheritdoc */
|
|
265
|
+
async setModelValues(input, sessionId) {
|
|
266
|
+
const id = this.resolveSessionId(sessionId);
|
|
267
|
+
let state = this.sessions.get(id).state;
|
|
268
|
+
if (input.clear?.length) {
|
|
269
|
+
const model = await this.evaluation.clearConstituentaValues(state, input.clear);
|
|
270
|
+
state = {
|
|
271
|
+
...state,
|
|
272
|
+
model
|
|
273
|
+
};
|
|
274
|
+
this.sessions.replaceState(id, state);
|
|
275
|
+
}
|
|
276
|
+
if (input.set?.length) {
|
|
277
|
+
state = this.sessions.get(id).state;
|
|
278
|
+
const model = await this.evaluation.setConstituentaValues(state, { items: input.set });
|
|
279
|
+
state = {
|
|
280
|
+
...state,
|
|
281
|
+
model
|
|
282
|
+
};
|
|
283
|
+
this.sessions.replaceState(id, state);
|
|
284
|
+
return model;
|
|
285
|
+
}
|
|
286
|
+
return structuredClone(this.sessions.get(id).state.model);
|
|
287
|
+
}
|
|
288
|
+
/** @inheritdoc */
|
|
289
|
+
getModelState(sessionId) {
|
|
290
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
291
|
+
return structuredClone(envelope.state.model);
|
|
292
|
+
}
|
|
293
|
+
/** @inheritdoc */
|
|
294
|
+
evaluate(input, sessionId) {
|
|
295
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
296
|
+
if (input.constituentId !== void 0) return this.evaluation.evaluateConstituenta(envelope.state, input.constituentId);
|
|
297
|
+
if (input.expression !== void 0 && input.cstType !== void 0) return this.evaluation.evaluateExpression(envelope.state, input.expression, input.cstType);
|
|
298
|
+
throw new Error("evaluate requires constituentId or expression with cstType");
|
|
299
|
+
}
|
|
300
|
+
/** @inheritdoc */
|
|
301
|
+
recalculateModel(sessionId) {
|
|
302
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
303
|
+
return this.evaluation.recalculateModel(envelope.state);
|
|
304
|
+
}
|
|
305
|
+
addOrUpdateConstituenta(input, sessionId) {
|
|
306
|
+
const id = this.resolveSessionId(sessionId);
|
|
307
|
+
const envelope = this.sessions.get(id);
|
|
308
|
+
const { result, diagnostics } = this.adapter.analyzeAgainstSession(envelope.state, input.draft);
|
|
309
|
+
const state = this.adapter.mergeStateWithDraft(envelope.state, input.draft, result);
|
|
310
|
+
this.sessions.replaceDiagnosticsForConstituent(id, input.draft.id, diagnostics);
|
|
311
|
+
return {
|
|
312
|
+
state,
|
|
313
|
+
diagnostics
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
applyConstituents(input, sessionId) {
|
|
317
|
+
const id = this.resolveSessionId(sessionId);
|
|
318
|
+
const mode = input.mode ?? "atomic";
|
|
319
|
+
const ordered = orderDrafts(this.sessions.get(id).state.items, input.drafts);
|
|
320
|
+
const snapshot = this.sessions.snapshot(id);
|
|
321
|
+
const applied = [];
|
|
322
|
+
const failed = [];
|
|
323
|
+
for (const draft of ordered) {
|
|
324
|
+
const result = this.addOrUpdateConstituenta({ draft }, id);
|
|
325
|
+
if (result.state.analysis.success) {
|
|
326
|
+
applied.push(result.state);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
failed.push({
|
|
330
|
+
draft,
|
|
331
|
+
diagnostics: result.diagnostics
|
|
332
|
+
});
|
|
333
|
+
if (mode === "atomic") {
|
|
334
|
+
this.sessions.restore(id, snapshot);
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
applied: [],
|
|
338
|
+
failed,
|
|
339
|
+
diagnostics: this.sessions.listDiagnostics(id)
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
success: failed.length === 0,
|
|
345
|
+
applied,
|
|
346
|
+
failed,
|
|
347
|
+
diagnostics: this.sessions.listDiagnostics(id)
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
buildSessionSummary(sessionId) {
|
|
351
|
+
const id = this.resolveSessionId(sessionId);
|
|
352
|
+
const envelope = this.sessions.get(id);
|
|
353
|
+
const diagnostics = this.sessions.listDiagnostics(id);
|
|
354
|
+
return {
|
|
355
|
+
sessionId: id,
|
|
356
|
+
contractVersion: this.contractVersion,
|
|
357
|
+
alias: envelope.state.alias,
|
|
358
|
+
title: envelope.state.title,
|
|
359
|
+
comment: envelope.state.comment,
|
|
360
|
+
itemCount: envelope.state.items.length,
|
|
361
|
+
modelItemCount: envelope.state.model.items.length,
|
|
362
|
+
diagnosticsCount: diagnostics.length,
|
|
363
|
+
items: envelope.state.items.map((item) => ({
|
|
364
|
+
id: item.id,
|
|
365
|
+
alias: item.alias,
|
|
366
|
+
cstType: item.cstType,
|
|
367
|
+
analysisSuccess: item.analysis.success
|
|
368
|
+
})),
|
|
369
|
+
diagnostics,
|
|
370
|
+
lastRevision: envelope.state.revisions.at(-1)
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
buildPortalSchemaObject(sessionId) {
|
|
374
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
375
|
+
return {
|
|
376
|
+
contract_version: PORTAL_JSON_CONTRACT_VERSION,
|
|
377
|
+
...portalImportMetadata(envelope.state, "schema"),
|
|
378
|
+
items: envelope.state.items.map((item) => ({
|
|
379
|
+
id: item.id,
|
|
380
|
+
alias: item.alias,
|
|
381
|
+
convention: item.convention,
|
|
382
|
+
crucial: false,
|
|
383
|
+
cst_type: item.cstType,
|
|
384
|
+
definition_formal: item.definitionFormal,
|
|
385
|
+
typification_manual: "",
|
|
386
|
+
value_is_property: false,
|
|
387
|
+
definition_raw: item.definitionText,
|
|
388
|
+
definition_resolved: item.definitionText,
|
|
389
|
+
term_raw: item.term,
|
|
390
|
+
term_resolved: item.term,
|
|
391
|
+
term_forms: []
|
|
392
|
+
})),
|
|
393
|
+
attribution: []
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
buildPortalModelObject(sessionId) {
|
|
397
|
+
const envelope = this.sessions.get(this.resolveSessionId(sessionId));
|
|
398
|
+
return {
|
|
399
|
+
contract_version: PORTAL_JSON_CONTRACT_VERSION,
|
|
400
|
+
...portalImportMetadata(envelope.state, "model"),
|
|
401
|
+
items: envelope.state.model.items.map((item) => ({
|
|
402
|
+
id: item.id,
|
|
403
|
+
type: item.type,
|
|
404
|
+
value: item.value
|
|
405
|
+
}))
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
importSessionExport(parsed) {
|
|
409
|
+
if (!parsed || typeof parsed !== "object" || !("state" in parsed)) throw new Error("Invalid session export payload");
|
|
410
|
+
const data = parsed;
|
|
411
|
+
const handle = this.sessions.create(normalizeImportedState(data.state), this.contractVersion);
|
|
412
|
+
if (data.diagnostics?.length) this.sessions.setDiagnostics(handle.sessionId, data.diagnostics);
|
|
413
|
+
return this.trackSession(handle);
|
|
414
|
+
}
|
|
415
|
+
importPortalSchemaData(data) {
|
|
416
|
+
const handle = this.createSession(portalSchemaToSessionSeed(data));
|
|
417
|
+
this.applyConstituents({
|
|
418
|
+
drafts: portalSchemaToDrafts(data),
|
|
419
|
+
mode: "best_effort"
|
|
420
|
+
}, handle.sessionId);
|
|
421
|
+
return handle;
|
|
422
|
+
}
|
|
423
|
+
importPortalDetailsData(data) {
|
|
424
|
+
const handle = this.createSession(portalDetailsToSessionSeed(data));
|
|
425
|
+
this.applyConstituents({
|
|
426
|
+
drafts: portalDetailsToDrafts(data),
|
|
427
|
+
mode: "best_effort"
|
|
428
|
+
}, handle.sessionId);
|
|
429
|
+
return handle;
|
|
430
|
+
}
|
|
431
|
+
resolveAgentPatches(sessionId, patches) {
|
|
432
|
+
const items = this.sessions.get(sessionId).state.items;
|
|
433
|
+
const existingByAlias = new Map(items.map((item) => [item.alias, item]));
|
|
434
|
+
let nextId = items.reduce((max, item) => Math.max(max, item.id), 0) + 1;
|
|
435
|
+
return patches.map((patch) => {
|
|
436
|
+
const existing = existingByAlias.get(patch.alias);
|
|
437
|
+
const draft = {
|
|
438
|
+
id: patch.id ?? existing?.id ?? nextId++,
|
|
439
|
+
alias: patch.alias,
|
|
440
|
+
cstType: patch.cstType ?? existing?.cstType ?? inferCstType(patch.alias),
|
|
441
|
+
definitionFormal: patch.definitionFormal ?? existing?.definitionFormal ?? "",
|
|
442
|
+
term: patch.term ?? existing?.term ?? "",
|
|
443
|
+
definitionText: patch.definitionText ?? existing?.definitionText ?? "",
|
|
444
|
+
convention: patch.convention ?? existing?.convention ?? ""
|
|
445
|
+
};
|
|
446
|
+
existingByAlias.set(patch.alias, {
|
|
447
|
+
...draft,
|
|
448
|
+
analysis: existing?.analysis ?? {
|
|
449
|
+
success: true,
|
|
450
|
+
type: null,
|
|
451
|
+
valueClass: "value",
|
|
452
|
+
diagnostics: []
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
return draft;
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
resolveSessionId(sessionId) {
|
|
459
|
+
const id = sessionId ?? this.currentSessionId;
|
|
460
|
+
if (!id) return this.createSession().sessionId;
|
|
461
|
+
if (!this.sessions.has(id)) {
|
|
462
|
+
if (sessionId) throw new Error(`Unknown session: ${sessionId}`);
|
|
463
|
+
return this.createSession().sessionId;
|
|
464
|
+
}
|
|
465
|
+
return id;
|
|
466
|
+
}
|
|
467
|
+
trackSession(handle) {
|
|
468
|
+
this.currentSessionId = handle.sessionId;
|
|
469
|
+
this.sessions.saveCurrentSessionId(handle.sessionId);
|
|
470
|
+
return handle;
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
//#endregion
|
|
474
|
+
export { PORTAL_JSON_CONTRACT_VERSION as n, portalItemToDraft as r, RSToolAgent as t };
|
|
475
|
+
|
|
476
|
+
//# sourceMappingURL=rstool-agent-kijHA9ML.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rstool-agent-kijHA9ML.js","names":[],"sources":["../src/models/portal-json.ts","../src/mappers/portal-adapter.ts","../src/session/batch-apply.ts","../src/models/import-detect.ts","../src/models/rstool-agent.ts"],"sourcesContent":["import { type BasicBinding, type RSToolValue } from './common';\nimport { type ConstituentaDraft } from './constituenta';\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: item.cst_type as ConstituentaDraft['cstType'],\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 { type PortalRsformDetails, type PortalSchemaImportData, portalItemToDraft } from '../models/portal-json';\nimport { type SessionState } from '../models/session';\n\nexport function portalSchemaToSessionSeed(data: PortalSchemaImportData): Partial<SessionState> {\n return {\n alias: data.alias ?? '',\n title: data.title ?? '',\n comment: data.description ?? '',\n items: []\n };\n}\n\nexport function portalDetailsToSessionSeed(data: PortalRsformDetails): Partial<SessionState> {\n return {\n alias: data.alias ?? '',\n title: data.title ?? '',\n comment: data.description ?? '',\n items: []\n };\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","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 && isRecord(items[0]) && 'cst_type' in items[0]) {\n return 'portal-schema';\n }\n throw new Error('Portal model JSON cannot be imported as a schema session');\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 } 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 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 ? this.setCurrentSession(sessionId) : 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 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 }\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 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 let nextId = items.reduce((max, item) => Math.max(max, item.id), 0) + 1;\n\n return patches.map(patch => {\n const existing = existingByAlias.get(patch.alias);\n const id = patch.id ?? existing?.id ?? nextId++;\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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"}
|