@rsconcept/rstool 1.0.0 → 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.
- package/README.md +22 -4
- package/dist/{agent-workflow-D-PSIb-m.d.ts → agent-workflow-Gk0Vfnv1.d.ts} +3 -9
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -2
- package/dist/models/agent-workflow.d.ts +2 -2
- package/dist/models/index.d.ts +3 -3
- package/dist/models/index.js +1 -1
- package/dist/models/rstool-agent.d.ts +1 -1
- package/dist/models/rstool-agent.js +1 -1
- package/dist/models/tool-contract.d.ts +1 -1
- package/dist/{rstool-agent-kijHA9ML.js → models-Bw6Uum8i.js} +243 -34
- package/dist/models-Bw6Uum8i.js.map +1 -0
- package/dist/{rstool-agent-_8bplZnb.d.ts → rstool-agent-D2cQze_b.d.ts} +3 -3
- package/dist/session/session-store.js +1 -1
- package/dist/{tool-contract-5_Q44DGE.d.ts → tool-contract-0uRGhEfW.d.ts} +2 -2
- package/dist/wrapper/stdio-wrapper.js +16 -14
- package/dist/wrapper/stdio-wrapper.js.map +1 -1
- package/examples/build-chocolate-nim-rsform.ts +2 -56
- package/examples/kinship/build-rsmodel.ts +5 -3
- package/examples/sample/build-rsform.ts +7 -9
- package/examples/sample/rsform-session.json +31 -31
- package/package.json +3 -1
- package/src/mappers/portal-adapter.ts +14 -8
- package/src/models/agent-workflow.ts +1 -13
- package/src/models/import-detect.test.ts +66 -0
- package/src/models/import-detect.ts +6 -3
- package/src/models/portal-json.test.ts +38 -0
- package/src/models/portal-json.ts +11 -2
- package/src/models/rstool-agent.test.ts +402 -3
- package/src/models/rstool-agent.ts +60 -17
- package/src/session/batch-apply.test.ts +103 -8
- package/src/session/batch-apply.ts +35 -0
- package/src/session/persistence.test.ts +63 -0
- package/src/session/persistence.ts +14 -1
- package/src/session/session-store.ts +10 -3
- package/src/wrapper/client.test.ts +58 -0
- package/src/wrapper/stdio-handler.test.ts +101 -0
- package/src/wrapper/stdio-handler.ts +195 -0
- package/src/wrapper/stdio-wrapper.ts +2 -195
- package/dist/rstool-agent-kijHA9ML.js.map +0 -1
- package/dist/session-store-C3jyOSqI.js +0 -142
- package/dist/session-store-C3jyOSqI.js.map +0 -1
package/README.md
CHANGED
|
@@ -113,13 +113,23 @@ Supported methods (contract `2.0.0`):
|
|
|
113
113
|
|
|
114
114
|
Params are **flat** at the top level (no `params.input` wrapper). Optional `sessionId` sits alongside method fields.
|
|
115
115
|
|
|
116
|
-
Example
|
|
116
|
+
Example `createSession`:
|
|
117
|
+
|
|
118
|
+
Request:
|
|
117
119
|
|
|
118
120
|
```json
|
|
119
121
|
{ "id": "1", "method": "createSession", "params": {} }
|
|
120
122
|
```
|
|
121
123
|
|
|
122
|
-
|
|
124
|
+
Response:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{ "id": "1", "ok": true, "result": { "sessionId": "...", "contractVersion": "2.0.0" } }
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Example `applySchemaPatch`:
|
|
131
|
+
|
|
132
|
+
Request:
|
|
123
133
|
|
|
124
134
|
```json
|
|
125
135
|
{
|
|
@@ -135,10 +145,18 @@ Example schema patch:
|
|
|
135
145
|
}
|
|
136
146
|
```
|
|
137
147
|
|
|
138
|
-
|
|
148
|
+
Response:
|
|
139
149
|
|
|
140
150
|
```json
|
|
141
|
-
{
|
|
151
|
+
{
|
|
152
|
+
"id": "2",
|
|
153
|
+
"ok": true,
|
|
154
|
+
"result": {
|
|
155
|
+
"success": true,
|
|
156
|
+
"session": { "sessionId": "...", "contractVersion": "2.0.0" },
|
|
157
|
+
"summary": { "itemCount": 3 }
|
|
158
|
+
}
|
|
159
|
+
}
|
|
142
160
|
```
|
|
143
161
|
|
|
144
162
|
## Typed client example
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as CstType } from "./common-DHJalS-Q.js";
|
|
2
2
|
import { t as DiagnosticRecord } from "./diagnostic-D9yl_mEL.js";
|
|
3
|
-
import { a as ApplyConstituentsResult, i as ApplyConstituentsMode, o as ConstituentaDraft
|
|
3
|
+
import { a as ApplyConstituentsResult, i as ApplyConstituentsMode, o as ConstituentaDraft } from "./constituenta-DnGR6bnM.js";
|
|
4
4
|
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-ChexW8i7.js";
|
|
5
5
|
|
|
6
6
|
//#region src/models/agent-workflow.d.ts
|
|
@@ -59,12 +59,6 @@ interface ApplySchemaPatchResult extends ApplyConstituentsResult {
|
|
|
59
59
|
summary: SessionSummary;
|
|
60
60
|
revision?: SessionRevision;
|
|
61
61
|
}
|
|
62
|
-
/** Internal: resolved patch with previous state for undo bookkeeping. */
|
|
63
|
-
interface ResolvedAgentPatch {
|
|
64
|
-
patch: AgentConstituentaPatch;
|
|
65
|
-
draft: ConstituentaDraft;
|
|
66
|
-
previous?: ConstituentaState;
|
|
67
|
-
}
|
|
68
62
|
//#endregion
|
|
69
|
-
export {
|
|
70
|
-
//# sourceMappingURL=agent-workflow-
|
|
63
|
+
export { SessionStateResult as a, SessionStateDetail as i, ApplySchemaPatchInput as n, SessionSummary as o, ApplySchemaPatchResult as r, SessionSummaryItem as s, AgentConstituentaPatch as t };
|
|
64
|
+
//# sourceMappingURL=agent-workflow-Gk0Vfnv1.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "./diagnostic
|
|
|
4
4
|
import { o as ConstituentaDraft, s as ConstituentaState } from "./constituenta-DnGR6bnM.js";
|
|
5
5
|
import { a as SetConstituentaValueInput, i as SessionModelState, n as ModelValueState, r as RecalculateModelResult, s as SetModelValuesInput } from "./model-value-BbonPzMz.js";
|
|
6
6
|
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "./session-ChexW8i7.js";
|
|
7
|
-
import { a as
|
|
7
|
+
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, o as SessionSummary, r as ApplySchemaPatchResult, s as SessionSummaryItem, t as AgentConstituentaPatch } from "./agent-workflow-Gk0Vfnv1.js";
|
|
8
8
|
import { i as EvaluationResult, r as EvaluateInput } from "./evaluation-Cns8BFm4.js";
|
|
9
|
-
import { a as ExportPortalInput, c as PortalExportKind, d as PortalModelImportData, f as PortalRsformDetails, h as PortalTermForm, i as ExportFormat, l as PORTAL_JSON_CONTRACT_VERSION, m as PortalSchemaImportData, n as RSToolAgentContract, o as ExportPortalResult, p as PortalSchemaConstituenta, r as RSToolAgentOptions, s as ImportDataKind, t as CONTRACT_VERSION, u as PortalImportMetadata } from "./tool-contract-
|
|
10
|
-
import { t as RSToolAgent } from "./rstool-agent-
|
|
9
|
+
import { a as ExportPortalInput, c as PortalExportKind, d as PortalModelImportData, f as PortalRsformDetails, h as PortalTermForm, i as ExportFormat, l as PORTAL_JSON_CONTRACT_VERSION, m as PortalSchemaImportData, n as RSToolAgentContract, o as ExportPortalResult, p as PortalSchemaConstituenta, r as RSToolAgentOptions, s as ImportDataKind, t as CONTRACT_VERSION, u as PortalImportMetadata } from "./tool-contract-0uRGhEfW.js";
|
|
10
|
+
import { t as RSToolAgent } from "./rstool-agent-D2cQze_b.js";
|
|
11
11
|
import { DomainAnalysisLike, DomainErrorLike, toPublicAnalysis, toPublicError } from "./mappers/types.js";
|
|
12
12
|
import { RSToolWrapperClient, RSToolWrapperClientOptions, WrapperResponse } from "./wrapper/client.js";
|
|
13
13
|
export { type AgentConstituentaPatch, type AnalysisResult, type AnalyzeExpressionInput, type ApplySchemaPatchInput, type ApplySchemaPatchResult, type BasicBinding, CONTRACT_VERSION, type ConstituentaDraft, type ConstituentaState, CstType, type DiagnosticRecord, type DomainAnalysisLike, type DomainErrorLike, EvalStatus, type EvaluateInput, type EvaluationResult, type ExportFormat, type ExportPortalInput, type ExportPortalResult, type ImportDataKind, type ListDiagnosticsFilters, type ModelValueState, PORTAL_JSON_CONTRACT_VERSION, type PortalExportKind, type PortalImportMetadata, type PortalModelImportData, type PortalRsformDetails, type PortalSchemaConstituenta, type PortalSchemaImportData, type PortalTermForm, RSErrorCode, RSToolAgent, type RSToolAgentContract, type RSToolAgentOptions, type RSToolErrorDescription, type RSToolValue, RSToolWrapperClient, type RSToolWrapperClientOptions, type RecalculateModelResult, type SessionHandle, type SessionModelState, type SessionRevision, type SessionState, type SessionStateDetail, type SessionStateResult, type SessionSummary, type SessionSummaryItem, type SetConstituentaValueInput, type SetModelValuesInput, ValueClass, type WrapperResponse, toPublicAnalysis, toPublicError };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { toPublicAnalysis, toPublicError } from "./mappers/types.js";
|
|
2
2
|
import { CstType, EvalStatus, RSErrorCode, ValueClass } from "./models/common.js";
|
|
3
|
-
import {
|
|
3
|
+
import { r as PORTAL_JSON_CONTRACT_VERSION, t as RSToolAgent } from "./models-Bw6Uum8i.js";
|
|
4
4
|
import { CONTRACT_VERSION } from "./models/tool-contract.js";
|
|
5
|
-
import "./models/index.js";
|
|
6
5
|
import { RSToolWrapperClient } from "./wrapper/client.js";
|
|
7
6
|
export { CONTRACT_VERSION, CstType, EvalStatus, PORTAL_JSON_CONTRACT_VERSION, RSErrorCode, RSToolAgent, RSToolWrapperClient, ValueClass, toPublicAnalysis, toPublicError };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { AgentConstituentaPatch, ApplySchemaPatchInput, ApplySchemaPatchResult,
|
|
1
|
+
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, o as SessionSummary, r as ApplySchemaPatchResult, s as SessionSummaryItem, t as AgentConstituentaPatch } from "../agent-workflow-Gk0Vfnv1.js";
|
|
2
|
+
export { AgentConstituentaPatch, ApplySchemaPatchInput, ApplySchemaPatchResult, SessionStateDetail, SessionStateResult, SessionSummary, SessionSummaryItem };
|
package/dist/models/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ import { n as ListDiagnosticsFilters, t as DiagnosticRecord } from "../diagnosti
|
|
|
4
4
|
import { i as ApplyConstituentsMode, o as ConstituentaDraft, s as ConstituentaState } from "../constituenta-DnGR6bnM.js";
|
|
5
5
|
import { a as SetConstituentaValueInput, i as SessionModelState, n as ModelValueState, r as RecalculateModelResult, s as SetModelValuesInput } from "../model-value-BbonPzMz.js";
|
|
6
6
|
import { n as SessionRevision, r as SessionState, t as SessionHandle } from "../session-ChexW8i7.js";
|
|
7
|
-
import { a as
|
|
7
|
+
import { a as SessionStateResult, i as SessionStateDetail, n as ApplySchemaPatchInput, o as SessionSummary, r as ApplySchemaPatchResult, s as SessionSummaryItem, t as AgentConstituentaPatch } from "../agent-workflow-Gk0Vfnv1.js";
|
|
8
8
|
import { i as EvaluationResult, r as EvaluateInput } from "../evaluation-Cns8BFm4.js";
|
|
9
|
-
import { a as ExportPortalInput, c as PortalExportKind, d as PortalModelImportData, f as PortalRsformDetails, g as portalItemToDraft, h as PortalTermForm, i as ExportFormat, l as PORTAL_JSON_CONTRACT_VERSION, m as PortalSchemaImportData, n as RSToolAgentContract, o as ExportPortalResult, p as PortalSchemaConstituenta, r as RSToolAgentOptions, s as ImportDataKind, t as CONTRACT_VERSION, u as PortalImportMetadata } from "../tool-contract-
|
|
10
|
-
import { t as RSToolAgent } from "../rstool-agent-
|
|
9
|
+
import { a as ExportPortalInput, c as PortalExportKind, d as PortalModelImportData, f as PortalRsformDetails, g as portalItemToDraft, h as PortalTermForm, i as ExportFormat, l as PORTAL_JSON_CONTRACT_VERSION, m as PortalSchemaImportData, n as RSToolAgentContract, o as ExportPortalResult, p as PortalSchemaConstituenta, r as RSToolAgentOptions, s as ImportDataKind, t as CONTRACT_VERSION, u as PortalImportMetadata } from "../tool-contract-0uRGhEfW.js";
|
|
10
|
+
import { t as RSToolAgent } from "../rstool-agent-D2cQze_b.js";
|
|
11
11
|
export { type AgentConstituentaPatch, type AnalysisResult, type AnalyzeExpressionInput, type ApplyConstituentsMode, type ApplySchemaPatchInput, type ApplySchemaPatchResult, type BasicBinding, CONTRACT_VERSION, type ConstituentaDraft, type ConstituentaState, CstType, type DiagnosticRecord, EvalStatus, type EvaluateInput, type EvaluationResult, type ExportFormat, type ExportPortalInput, type ExportPortalResult, type ImportDataKind, type ListDiagnosticsFilters, type ModelValueState, PORTAL_JSON_CONTRACT_VERSION, type PortalExportKind, type PortalImportMetadata, type PortalModelImportData, type PortalRsformDetails, type PortalSchemaConstituenta, type PortalSchemaImportData, type PortalTermForm, RSErrorCode, RSToolAgent, type RSToolAgentContract, type RSToolAgentOptions, type RSToolErrorDescription, type RSToolValue, type RecalculateModelResult, type SessionHandle, type SessionModelState, type SessionRevision, type SessionState, type SessionStateDetail, type SessionStateResult, type SessionSummary, type SessionSummaryItem, type SetConstituentaValueInput, type SetModelValuesInput, ValueClass, portalItemToDraft };
|
package/dist/models/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { CstType, EvalStatus, RSErrorCode, ValueClass } from "./common.js";
|
|
2
|
-
import {
|
|
2
|
+
import { i as portalItemToDraft, r as PORTAL_JSON_CONTRACT_VERSION, t as RSToolAgent } from "../models-Bw6Uum8i.js";
|
|
3
3
|
import { CONTRACT_VERSION } from "./tool-contract.js";
|
|
4
4
|
export { CONTRACT_VERSION, CstType, EvalStatus, PORTAL_JSON_CONTRACT_VERSION, RSErrorCode, RSToolAgent, ValueClass, portalItemToDraft };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as RSToolAgent } from "../rstool-agent-
|
|
1
|
+
import { t as RSToolAgent } from "../rstool-agent-D2cQze_b.js";
|
|
2
2
|
export { RSToolAgent };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as RSToolAgent } from "../
|
|
1
|
+
import { t as RSToolAgent } from "../models-Bw6Uum8i.js";
|
|
2
2
|
export { RSToolAgent };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as RSToolAgentContract, r as RSToolAgentOptions, t as CONTRACT_VERSION } from "../tool-contract-
|
|
1
|
+
import { n as RSToolAgentContract, r as RSToolAgentOptions, t as CONTRACT_VERSION } from "../tool-contract-0uRGhEfW.js";
|
|
2
2
|
export { CONTRACT_VERSION, RSToolAgentContract, RSToolAgentOptions };
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import { CstType } from "./models/common.js";
|
|
2
2
|
import { ModelAdapter } from "./mappers/model-adapter.js";
|
|
3
3
|
import { SchemaAdapter } from "./mappers/schema-adapter.js";
|
|
4
|
-
import { t as SessionStore } from "./session-store-C3jyOSqI.js";
|
|
5
4
|
import { CONTRACT_VERSION } from "./models/tool-contract.js";
|
|
6
5
|
import { Graph } from "@rsconcept/domain/graph/graph";
|
|
7
6
|
import { extractGlobals } from "@rsconcept/domain/rslang/api";
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
8
10
|
//#region src/models/portal-json.ts
|
|
11
|
+
const CST_TYPE_VALUES = new Set(Object.values(CstType));
|
|
12
|
+
function parsePortalCstType(value, alias) {
|
|
13
|
+
if (!CST_TYPE_VALUES.has(value)) throw new Error(`Invalid cst_type "${value}" for constituent "${alias}"`);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
9
16
|
/** Portal JSON import/export format version (schema and model files). */
|
|
10
17
|
const PORTAL_JSON_CONTRACT_VERSION = "1.0.0";
|
|
11
18
|
/** Map a Portal API or JSON schema item to an agent {@link ConstituentaDraft}. */
|
|
@@ -13,7 +20,7 @@ function portalItemToDraft(item) {
|
|
|
13
20
|
return {
|
|
14
21
|
id: item.id,
|
|
15
22
|
alias: item.alias,
|
|
16
|
-
cstType: item.cst_type,
|
|
23
|
+
cstType: parsePortalCstType(item.cst_type, item.alias),
|
|
17
24
|
definitionFormal: item.definition_formal ?? "",
|
|
18
25
|
term: item.term_raw ?? "",
|
|
19
26
|
definitionText: item.definition_raw ?? "",
|
|
@@ -22,7 +29,7 @@ function portalItemToDraft(item) {
|
|
|
22
29
|
}
|
|
23
30
|
//#endregion
|
|
24
31
|
//#region src/mappers/portal-adapter.ts
|
|
25
|
-
function
|
|
32
|
+
function portalMetadataToSessionSeed(data) {
|
|
26
33
|
return {
|
|
27
34
|
alias: data.alias ?? "",
|
|
28
35
|
title: data.title ?? "",
|
|
@@ -30,13 +37,11 @@ function portalSchemaToSessionSeed(data) {
|
|
|
30
37
|
items: []
|
|
31
38
|
};
|
|
32
39
|
}
|
|
40
|
+
function portalSchemaToSessionSeed(data) {
|
|
41
|
+
return portalMetadataToSessionSeed(data);
|
|
42
|
+
}
|
|
33
43
|
function portalDetailsToSessionSeed(data) {
|
|
34
|
-
return
|
|
35
|
-
alias: data.alias ?? "",
|
|
36
|
-
title: data.title ?? "",
|
|
37
|
-
comment: data.description ?? "",
|
|
38
|
-
items: []
|
|
39
|
-
};
|
|
44
|
+
return portalMetadataToSessionSeed(data);
|
|
40
45
|
}
|
|
41
46
|
function portalItemsToDrafts(items) {
|
|
42
47
|
return items.map((item) => portalItemToDraft(item));
|
|
@@ -78,6 +83,175 @@ function orderDrafts(sessionItems, drafts) {
|
|
|
78
83
|
const missing = drafts.filter((draft) => !seen.has(draft.id)).map((draft) => draft.id);
|
|
79
84
|
return [...topoIds, ...missing].map((id) => drafts.find((draft) => draft.id === id)).filter(Boolean);
|
|
80
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Restore declaration order in session items after a batch apply.
|
|
88
|
+
* Topological apply order is only needed for analysis; Portal JSON uses array order.
|
|
89
|
+
*/
|
|
90
|
+
function reorderSessionItemsByDrafts(items, drafts) {
|
|
91
|
+
if (drafts.length === 0 || items.length === 0) return;
|
|
92
|
+
const draftIds = drafts.map((draft) => draft.id);
|
|
93
|
+
const draftIdSet = new Set(draftIds);
|
|
94
|
+
if (items.filter((item) => draftIdSet.has(item.id)).length === 0) return;
|
|
95
|
+
const unmentioned = items.filter((item) => !draftIdSet.has(item.id));
|
|
96
|
+
if (unmentioned.length === 0) {
|
|
97
|
+
const byId = new Map(items.map((item) => [item.id, item]));
|
|
98
|
+
items.splice(0, items.length, ...draftIds.map((id) => byId.get(id)));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const existingIds = new Set(unmentioned.map((item) => item.id));
|
|
102
|
+
const newDrafts = drafts.filter((draft) => !existingIds.has(draft.id));
|
|
103
|
+
if (newDrafts.length === 0) return;
|
|
104
|
+
const newIds = new Set(newDrafts.map((draft) => draft.id));
|
|
105
|
+
const kept = items.filter((item) => !newIds.has(item.id));
|
|
106
|
+
const byId = new Map(items.map((item) => [item.id, item]));
|
|
107
|
+
items.splice(0, items.length, ...kept, ...newDrafts.map((draft) => byId.get(draft.id)));
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region src/session/persistence.ts
|
|
111
|
+
const CURRENT_SESSION_FILE = "_current.json";
|
|
112
|
+
const UNSAFE_SESSION_ID = /[/\\]|\.\./;
|
|
113
|
+
function assertSafeSessionId(sessionId) {
|
|
114
|
+
if (!sessionId || UNSAFE_SESSION_ID.test(sessionId)) throw new Error(`Invalid session ID: ${sessionId}`);
|
|
115
|
+
}
|
|
116
|
+
var SessionPersistence = class {
|
|
117
|
+
dir;
|
|
118
|
+
constructor(dir) {
|
|
119
|
+
this.dir = dir;
|
|
120
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
121
|
+
}
|
|
122
|
+
save(sessionId, envelope) {
|
|
123
|
+
fs.writeFileSync(this.filePath(sessionId), JSON.stringify(envelope, null, 2), "utf-8");
|
|
124
|
+
}
|
|
125
|
+
load(sessionId) {
|
|
126
|
+
const file = this.filePath(sessionId);
|
|
127
|
+
if (!fs.existsSync(file)) return null;
|
|
128
|
+
return JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
129
|
+
}
|
|
130
|
+
delete(sessionId) {
|
|
131
|
+
const file = this.filePath(sessionId);
|
|
132
|
+
if (fs.existsSync(file)) fs.unlinkSync(file);
|
|
133
|
+
}
|
|
134
|
+
saveCurrentSessionId(sessionId) {
|
|
135
|
+
fs.writeFileSync(path.join(this.dir, CURRENT_SESSION_FILE), JSON.stringify({ sessionId }, null, 2), "utf-8");
|
|
136
|
+
}
|
|
137
|
+
loadCurrentSessionId() {
|
|
138
|
+
const file = path.join(this.dir, CURRENT_SESSION_FILE);
|
|
139
|
+
if (!fs.existsSync(file)) return null;
|
|
140
|
+
return JSON.parse(fs.readFileSync(file, "utf-8")).sessionId ?? null;
|
|
141
|
+
}
|
|
142
|
+
filePath(sessionId) {
|
|
143
|
+
assertSafeSessionId(sessionId);
|
|
144
|
+
const file = path.resolve(this.dir, `${sessionId}.json`);
|
|
145
|
+
const relative = path.relative(path.resolve(this.dir), file);
|
|
146
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) throw new Error(`Invalid session ID: ${sessionId}`);
|
|
147
|
+
return file;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/session/session-store.ts
|
|
152
|
+
var SessionStore = class {
|
|
153
|
+
sessions = /* @__PURE__ */ new Map();
|
|
154
|
+
persistence;
|
|
155
|
+
constructor(options = {}) {
|
|
156
|
+
this.persistence = options.persistenceDir ? new SessionPersistence(options.persistenceDir) : null;
|
|
157
|
+
}
|
|
158
|
+
create(initial, contractVersion) {
|
|
159
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
160
|
+
const sessionId = initial?.sessionId ?? randomUUID();
|
|
161
|
+
const envelope = {
|
|
162
|
+
state: {
|
|
163
|
+
sessionId,
|
|
164
|
+
alias: initial?.alias ?? "",
|
|
165
|
+
title: initial?.title ?? "",
|
|
166
|
+
comment: initial?.comment ?? "",
|
|
167
|
+
createdAt: initial?.createdAt ?? now,
|
|
168
|
+
updatedAt: now,
|
|
169
|
+
revisions: initial?.revisions ?? [],
|
|
170
|
+
items: initial?.items ?? [],
|
|
171
|
+
model: initial?.model ?? { items: [] }
|
|
172
|
+
},
|
|
173
|
+
diagnostics: []
|
|
174
|
+
};
|
|
175
|
+
this.sessions.set(sessionId, envelope);
|
|
176
|
+
this.persist(sessionId, envelope);
|
|
177
|
+
return {
|
|
178
|
+
sessionId,
|
|
179
|
+
contractVersion: contractVersion ?? "2.0.0"
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
get(sessionId) {
|
|
183
|
+
const found = this.sessions.get(sessionId) ?? this.loadFromDisk(sessionId);
|
|
184
|
+
if (!found) throw new Error(`Unknown session: ${sessionId}`);
|
|
185
|
+
return found;
|
|
186
|
+
}
|
|
187
|
+
has(sessionId) {
|
|
188
|
+
if (this.sessions.has(sessionId)) return true;
|
|
189
|
+
if (!this.persistence) return false;
|
|
190
|
+
return this.persistence.load(sessionId) !== null;
|
|
191
|
+
}
|
|
192
|
+
replaceState(sessionId, nextState) {
|
|
193
|
+
const found = this.get(sessionId);
|
|
194
|
+
found.state = {
|
|
195
|
+
...nextState,
|
|
196
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
197
|
+
};
|
|
198
|
+
this.persist(sessionId, found);
|
|
199
|
+
}
|
|
200
|
+
addRevision(sessionId, message) {
|
|
201
|
+
const found = this.get(sessionId);
|
|
202
|
+
const revision = {
|
|
203
|
+
revisionId: randomUUID(),
|
|
204
|
+
at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
205
|
+
message
|
|
206
|
+
};
|
|
207
|
+
found.state.revisions.push(revision);
|
|
208
|
+
found.state.updatedAt = revision.at;
|
|
209
|
+
this.persist(sessionId, found);
|
|
210
|
+
return revision;
|
|
211
|
+
}
|
|
212
|
+
/** Replace active diagnostics for one constituent (or scratch when constituentId is undefined). */
|
|
213
|
+
replaceDiagnosticsForConstituent(sessionId, constituentId, records) {
|
|
214
|
+
const found = this.get(sessionId);
|
|
215
|
+
found.diagnostics = found.diagnostics.filter((record) => record.constituentId !== constituentId);
|
|
216
|
+
found.diagnostics.push(...records);
|
|
217
|
+
found.state.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
218
|
+
this.persist(sessionId, found);
|
|
219
|
+
}
|
|
220
|
+
setDiagnostics(sessionId, records) {
|
|
221
|
+
const found = this.get(sessionId);
|
|
222
|
+
found.diagnostics = [...records];
|
|
223
|
+
found.state.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
224
|
+
this.persist(sessionId, found);
|
|
225
|
+
}
|
|
226
|
+
listDiagnostics(sessionId, filters) {
|
|
227
|
+
const found = this.get(sessionId);
|
|
228
|
+
if (filters?.constituentId === void 0) return [...found.diagnostics];
|
|
229
|
+
return found.diagnostics.filter((record) => record.constituentId === filters.constituentId);
|
|
230
|
+
}
|
|
231
|
+
snapshot(sessionId) {
|
|
232
|
+
const found = this.get(sessionId);
|
|
233
|
+
return structuredClone(found);
|
|
234
|
+
}
|
|
235
|
+
restore(sessionId, snapshot) {
|
|
236
|
+
this.sessions.set(sessionId, structuredClone(snapshot));
|
|
237
|
+
this.persist(sessionId, this.sessions.get(sessionId));
|
|
238
|
+
}
|
|
239
|
+
saveCurrentSessionId(sessionId) {
|
|
240
|
+
this.persistence?.saveCurrentSessionId(sessionId);
|
|
241
|
+
}
|
|
242
|
+
loadCurrentSessionId() {
|
|
243
|
+
return this.persistence?.loadCurrentSessionId() ?? null;
|
|
244
|
+
}
|
|
245
|
+
loadFromDisk(sessionId) {
|
|
246
|
+
const loaded = this.persistence?.load(sessionId);
|
|
247
|
+
if (!loaded) return null;
|
|
248
|
+
this.sessions.set(sessionId, loaded);
|
|
249
|
+
return loaded;
|
|
250
|
+
}
|
|
251
|
+
persist(sessionId, envelope) {
|
|
252
|
+
this.persistence?.save(sessionId, envelope);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
81
255
|
//#endregion
|
|
82
256
|
//#region src/models/import-detect.ts
|
|
83
257
|
function isRecord(value) {
|
|
@@ -92,8 +266,11 @@ function detectImportKind(data) {
|
|
|
92
266
|
if ("contractVersion" in data && "state" in data) return "session";
|
|
93
267
|
if ("contract_version" in data && Array.isArray(data.items)) {
|
|
94
268
|
const items = data.items;
|
|
95
|
-
if (items.length > 0
|
|
96
|
-
|
|
269
|
+
if (items.length > 0) {
|
|
270
|
+
const first = items[0];
|
|
271
|
+
if (isRecord(first) && "cst_type" in first) return "portal-schema";
|
|
272
|
+
throw new Error("Portal model JSON cannot be imported as a schema session");
|
|
273
|
+
}
|
|
97
274
|
}
|
|
98
275
|
if (Array.isArray(data.items) && data.items.length > 0) {
|
|
99
276
|
const first = data.items[0];
|
|
@@ -137,6 +314,8 @@ function inferCstType(alias) {
|
|
|
137
314
|
case "A": return CstType.AXIOM;
|
|
138
315
|
case "F": return CstType.FUNCTION;
|
|
139
316
|
case "P": return CstType.PREDICATE;
|
|
317
|
+
case "N": return CstType.NOMINAL;
|
|
318
|
+
case "T": return CstType.STATEMENT;
|
|
140
319
|
default: throw new Error(`Cannot infer cstType from alias "${alias}"; pass cstType explicitly`);
|
|
141
320
|
}
|
|
142
321
|
}
|
|
@@ -189,7 +368,10 @@ var RSToolAgent = class {
|
|
|
189
368
|
}
|
|
190
369
|
/** @inheritdoc */
|
|
191
370
|
applySchemaPatch(input, sessionId) {
|
|
192
|
-
const session = sessionId ?
|
|
371
|
+
const session = sessionId ? {
|
|
372
|
+
sessionId: this.resolveSessionId(sessionId),
|
|
373
|
+
contractVersion: this.contractVersion
|
|
374
|
+
} : this.ensureSession(input.initial);
|
|
193
375
|
const drafts = this.resolveAgentPatches(session.sessionId, input.items);
|
|
194
376
|
const result = this.applyConstituents({
|
|
195
377
|
drafts,
|
|
@@ -264,26 +446,32 @@ var RSToolAgent = class {
|
|
|
264
446
|
/** @inheritdoc */
|
|
265
447
|
async setModelValues(input, sessionId) {
|
|
266
448
|
const id = this.resolveSessionId(sessionId);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
449
|
+
const snapshot = this.sessions.snapshot(id);
|
|
450
|
+
try {
|
|
451
|
+
let state = this.sessions.get(id).state;
|
|
452
|
+
if (input.clear?.length) {
|
|
453
|
+
const model = await this.evaluation.clearConstituentaValues(state, input.clear);
|
|
454
|
+
state = {
|
|
455
|
+
...state,
|
|
456
|
+
model
|
|
457
|
+
};
|
|
458
|
+
this.sessions.replaceState(id, state);
|
|
459
|
+
}
|
|
460
|
+
if (input.set?.length) {
|
|
461
|
+
state = this.sessions.get(id).state;
|
|
462
|
+
const model = await this.evaluation.setConstituentaValues(state, { items: input.set });
|
|
463
|
+
state = {
|
|
464
|
+
...state,
|
|
465
|
+
model
|
|
466
|
+
};
|
|
467
|
+
this.sessions.replaceState(id, state);
|
|
468
|
+
return model;
|
|
469
|
+
}
|
|
470
|
+
return structuredClone(this.sessions.get(id).state.model);
|
|
471
|
+
} catch (error) {
|
|
472
|
+
this.sessions.restore(id, snapshot);
|
|
473
|
+
throw error;
|
|
285
474
|
}
|
|
286
|
-
return structuredClone(this.sessions.get(id).state.model);
|
|
287
475
|
}
|
|
288
476
|
/** @inheritdoc */
|
|
289
477
|
getModelState(sessionId) {
|
|
@@ -340,6 +528,9 @@ var RSToolAgent = class {
|
|
|
340
528
|
};
|
|
341
529
|
}
|
|
342
530
|
}
|
|
531
|
+
const envelope = this.sessions.get(id);
|
|
532
|
+
reorderSessionItemsByDrafts(envelope.state.items, input.drafts);
|
|
533
|
+
this.sessions.replaceState(id, envelope.state);
|
|
343
534
|
return {
|
|
344
535
|
success: failed.length === 0,
|
|
345
536
|
applied,
|
|
@@ -431,11 +622,29 @@ var RSToolAgent = class {
|
|
|
431
622
|
resolveAgentPatches(sessionId, patches) {
|
|
432
623
|
const items = this.sessions.get(sessionId).state.items;
|
|
433
624
|
const existingByAlias = new Map(items.map((item) => [item.alias, item]));
|
|
625
|
+
const usedIds = new Set(items.map((item) => item.id));
|
|
434
626
|
let nextId = items.reduce((max, item) => Math.max(max, item.id), 0) + 1;
|
|
627
|
+
const reserveId = (id) => {
|
|
628
|
+
usedIds.add(id);
|
|
629
|
+
if (id >= nextId) nextId = id + 1;
|
|
630
|
+
};
|
|
631
|
+
const allocateId = () => {
|
|
632
|
+
while (usedIds.has(nextId)) nextId += 1;
|
|
633
|
+
const id = nextId;
|
|
634
|
+
nextId += 1;
|
|
635
|
+
usedIds.add(id);
|
|
636
|
+
return id;
|
|
637
|
+
};
|
|
435
638
|
return patches.map((patch) => {
|
|
436
639
|
const existing = existingByAlias.get(patch.alias);
|
|
640
|
+
let id;
|
|
641
|
+
if (patch.id !== void 0) {
|
|
642
|
+
id = patch.id;
|
|
643
|
+
reserveId(id);
|
|
644
|
+
} else if (existing !== void 0) id = existing.id;
|
|
645
|
+
else id = allocateId();
|
|
437
646
|
const draft = {
|
|
438
|
-
id
|
|
647
|
+
id,
|
|
439
648
|
alias: patch.alias,
|
|
440
649
|
cstType: patch.cstType ?? existing?.cstType ?? inferCstType(patch.alias),
|
|
441
650
|
definitionFormal: patch.definitionFormal ?? existing?.definitionFormal ?? "",
|
|
@@ -471,6 +680,6 @@ var RSToolAgent = class {
|
|
|
471
680
|
}
|
|
472
681
|
};
|
|
473
682
|
//#endregion
|
|
474
|
-
export {
|
|
683
|
+
export { portalItemToDraft as i, SessionStore as n, PORTAL_JSON_CONTRACT_VERSION as r, RSToolAgent as t };
|
|
475
684
|
|
|
476
|
-
//# sourceMappingURL=
|
|
685
|
+
//# sourceMappingURL=models-Bw6Uum8i.js.map
|
|
@@ -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":";;;;;;;;;;AAGA,MAAM,kBAAkB,IAAI,IAAY,OAAO,OAAO,OAAO,CAAC;AAE9D,SAAS,mBAAmB,OAAe,OAA6C;CACtF,IAAI,CAAC,gBAAgB,IAAI,KAAK,GAC5B,MAAM,IAAI,MAAM,qBAAqB,MAAM,qBAAqB,MAAM,EAAE;CAE1E,OAAO;AACT;;AAGA,MAAa,+BAA+B;;AAkE5C,SAAgB,kBAAkB,MAQZ;CACpB,OAAO;EACL,IAAI,KAAK;EACT,OAAO,KAAK;EACZ,SAAS,mBAAmB,KAAK,UAAU,KAAK,KAAK;EACrD,kBAAkB,KAAK,qBAAqB;EAC5C,MAAM,KAAK,YAAY;EACvB,gBAAgB,KAAK,kBAAkB;EACvC,YAAY,KAAK,cAAc;CACjC;AACF;;;ACtFA,SAAS,4BAA4B,MAAqD;CACxF,OAAO;EACL,OAAO,KAAK,SAAS;EACrB,OAAO,KAAK,SAAS;EACrB,SAAS,KAAK,eAAe;EAC7B,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,0BAA0B,MAAqD;CAC7F,OAAO,4BAA4B,IAAI;AACzC;AAEA,SAAgB,2BAA2B,MAAkD;CAC3F,OAAO,4BAA4B,IAAI;AACzC;AAEA,SAAgB,oBACd,OASqB;CACrB,OAAO,MAAM,KAAI,SAAQ,kBAAkB,IAAI,CAAC;AAClD;AAEA,SAAgB,qBAAqB,MAAmD;CACtF,OAAO,oBAAoB,KAAK,KAAK;AACvC;AAEA,SAAgB,sBAAsB,MAAgD;CACpF,OAAO,oBAAoB,KAAK,KAAK;AACvC;;;;AC1CA,SAAgB,YAAY,cAAmC,QAAkD;CAC/G,MAAM,yBAAS,IAAI,IAA+B;CAClD,KAAK,MAAM,QAAQ,cACjB,OAAO,IAAI,KAAK,IAAI;EAClB,IAAI,KAAK;EACT,OAAO,KAAK;EACZ,SAAS,KAAK;EACd,kBAAkB,KAAK;CACzB,CAAC;CAEH,KAAK,MAAM,SAAS,QAClB,OAAO,IAAI,MAAM,IAAI,KAAK;CAG5B,MAAM,QAAQ,IAAI,MAAc;CAChC,MAAM,4BAAY,IAAI,IAAoB;CAC1C,KAAK,MAAM,CAAC,IAAI,UAAU,QAAQ;EAChC,MAAM,QAAQ,EAAE;EAChB,UAAU,IAAI,MAAM,OAAO,EAAE;CAC/B;CAEA,KAAK,MAAM,CAAC,IAAI,UAAU,QAAQ;EAChC,IAAI,CAAC,MAAM,kBACT;EAEF,KAAK,MAAM,SAAS,eAAe,MAAM,gBAAgB,GAAG;GAC1D,MAAM,QAAQ,UAAU,IAAI,KAAK;GACjC,IAAI,UAAU,UAAa,UAAU,IACnC,MAAM,QAAQ,OAAO,EAAE;EAE3B;CACF;CAEA,MAAM,WAAW,IAAI,IAAI,OAAO,KAAI,UAAS,MAAM,EAAE,CAAC;CACtD,MAAM,UAAU,MAAM,iBAAiB,CAAC,CAAC,QAAO,OAAM,SAAS,IAAI,EAAE,CAAC;CACtE,MAAM,OAAO,IAAI,IAAI,OAAO;CAC5B,MAAM,UAAU,OAAO,QAAO,UAAS,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,KAAI,UAAS,MAAM,EAAE;CAGjF,OAAO,CADa,GAAG,SAAS,GAAG,OAC5B,CAAA,CAAW,KAAI,OAAM,OAAO,MAAK,UAAS,MAAM,OAAO,EAAE,CAAE,CAAC,CAAC,OAAO,OAAO;AACpF;;;;;AAMA,SAAgB,4BAA4B,OAA4B,QAAmC;CACzG,IAAI,OAAO,WAAW,KAAK,MAAM,WAAW,GAC1C;CAGF,MAAM,WAAW,OAAO,KAAI,UAAS,MAAM,EAAE;CAC7C,MAAM,aAAa,IAAI,IAAI,QAAQ;CAEnC,IADkB,MAAM,QAAO,SAAQ,WAAW,IAAI,KAAK,EAAE,CACzD,CAAA,CAAU,WAAW,GACvB;CAGF,MAAM,cAAc,MAAM,QAAO,SAAQ,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC;CACjE,IAAI,YAAY,WAAW,GAAG;EAC5B,MAAM,OAAO,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;EACvD,MAAM,OAAO,GAAG,MAAM,QAAQ,GAAG,SAAS,KAAI,OAAM,KAAK,IAAI,EAAE,CAAE,CAAC;EAClE;CACF;CAEA,MAAM,cAAc,IAAI,IAAI,YAAY,KAAI,SAAQ,KAAK,EAAE,CAAC;CAC5D,MAAM,YAAY,OAAO,QAAO,UAAS,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC;CACnE,IAAI,UAAU,WAAW,GACvB;CAGF,MAAM,SAAS,IAAI,IAAI,UAAU,KAAI,UAAS,MAAM,EAAE,CAAC;CACvD,MAAM,OAAO,MAAM,QAAO,SAAQ,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;CACtD,MAAM,OAAO,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;CACvD,MAAM,OAAO,GAAG,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,KAAI,UAAS,KAAK,IAAI,MAAM,EAAE,CAAE,CAAC;AACvF;;;ACvEA,MAAM,uBAAuB;AAC7B,MAAM,oBAAoB;AAE1B,SAAS,oBAAoB,WAAyB;CACpD,IAAI,CAAC,aAAa,kBAAkB,KAAK,SAAS,GAChD,MAAM,IAAI,MAAM,uBAAuB,WAAW;AAEtD;AAEA,IAAa,qBAAb,MAAgC;CAC9B;CAEA,YAAmB,KAAa;EAC9B,KAAK,MAAM;EACX,GAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;CACvC;CAEA,KAAY,WAAmB,UAA0C;EACvE,GAAG,cAAc,KAAK,SAAS,SAAS,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;CACvF;CAEA,KAAY,WAAoD;EAC9D,MAAM,OAAO,KAAK,SAAS,SAAS;EACpC,IAAI,CAAC,GAAG,WAAW,IAAI,GACrB,OAAO;EAET,OAAO,KAAK,MAAM,GAAG,aAAa,MAAM,OAAO,CAAC;CAClD;CAEA,OAAc,WAAyB;EACrC,MAAM,OAAO,KAAK,SAAS,SAAS;EACpC,IAAI,GAAG,WAAW,IAAI,GACpB,GAAG,WAAW,IAAI;CAEtB;CAEA,qBAA4B,WAAgC;EAC1D,GAAG,cAAc,KAAK,KAAK,KAAK,KAAK,oBAAoB,GAAG,KAAK,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG,OAAO;CAC7G;CAEA,uBAA6C;EAC3C,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,oBAAoB;EACrD,IAAI,CAAC,GAAG,WAAW,IAAI,GACrB,OAAO;EAGT,OADe,KAAK,MAAM,GAAG,aAAa,MAAM,OAAO,CAChD,CAAA,CAAO,aAAa;CAC7B;CAEA,SAAiB,WAA2B;EAC1C,oBAAoB,SAAS;EAC7B,MAAM,OAAO,KAAK,QAAQ,KAAK,KAAK,GAAG,UAAU,MAAM;EACvD,MAAM,WAAW,KAAK,SAAS,KAAK,QAAQ,KAAK,GAAG,GAAG,IAAI;EAC3D,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,WAAW,QAAQ,GACvD,MAAM,IAAI,MAAM,uBAAuB,WAAW;EAEpD,OAAO;CACT;AACF;;;AC/CA,IAAa,eAAb,MAA0B;CACxB,2BAAmB,IAAI,IAA6B;CACpD;CAEA,YAAmB,UAA+B,CAAC,GAAG;EACpD,KAAK,cAAc,QAAQ,iBAAiB,IAAI,mBAAmB,QAAQ,cAAc,IAAI;CAC/F;CAEA,OAAc,SAAiC,iBAAyC;EACtF,MAAM,uBAAM,IAAI,KAAK,EAAC,CAAC,YAAY;EACnC,MAAM,YAAY,SAAS,aAAa,WAAW;EAYnD,MAAM,WAA4B;GAChC;IAXA;IACA,OAAO,SAAS,SAAS;IACzB,OAAO,SAAS,SAAS;IACzB,SAAS,SAAS,WAAW;IAC7B,WAAW,SAAS,aAAa;IACjC,WAAW;IACX,WAAW,SAAS,aAAa,CAAC;IAClC,OAAO,SAAS,SAAS,CAAC;IAC1B,OAAO,SAAS,SAAS,EAAE,OAAO,CAAC,EAAE;GAGrC;GACA,aAAa,CAAC;EAChB;EACA,KAAK,SAAS,IAAI,WAAW,QAAQ;EACrC,KAAK,QAAQ,WAAW,QAAQ;EAChC,OAAO;GACL;GACA,iBAAiB,mBAAA;EACnB;CACF;CAEA,IAAW,WAAoC;EAC7C,MAAM,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,aAAa,SAAS;EACzE,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,oBAAoB,WAAW;EAEjD,OAAO;CACT;CAEA,IAAW,WAA4B;EACrC,IAAI,KAAK,SAAS,IAAI,SAAS,GAC7B,OAAO;EAET,IAAI,CAAC,KAAK,aACR,OAAO;EAET,OAAO,KAAK,YAAY,KAAK,SAAS,MAAM;CAC9C;CAEA,aAAoB,WAAmB,WAA+B;EACpE,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,MAAM,QAAQ;GACZ,GAAG;GACH,4BAAW,IAAI,KAAK,EAAC,CAAC,YAAY;EACpC;EACA,KAAK,QAAQ,WAAW,KAAK;CAC/B;CAEA,YAAmB,WAAmB,SAAmC;EACvE,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,MAAM,WAA4B;GAChC,YAAY,WAAW;GACvB,qBAAI,IAAI,KAAK,EAAC,CAAC,YAAY;GAC3B;EACF;EACA,MAAM,MAAM,UAAU,KAAK,QAAQ;EACnC,MAAM,MAAM,YAAY,SAAS;EACjC,KAAK,QAAQ,WAAW,KAAK;EAC7B,OAAO;CACT;;CAGA,iCACE,WACA,eACA,SACM;EACN,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,MAAM,cAAc,MAAM,YAAY,QAAO,WAAU,OAAO,kBAAkB,aAAa;EAC7F,MAAM,YAAY,KAAK,GAAG,OAAO;EACjC,MAAM,MAAM,6BAAY,IAAI,KAAK,EAAC,CAAC,YAAY;EAC/C,KAAK,QAAQ,WAAW,KAAK;CAC/B;CAEA,eAAsB,WAAmB,SAAmC;EAC1E,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,MAAM,cAAc,CAAC,GAAG,OAAO;EAC/B,MAAM,MAAM,6BAAY,IAAI,KAAK,EAAC,CAAC,YAAY;EAC/C,KAAK,QAAQ,WAAW,KAAK;CAC/B;CAEA,gBAAuB,WAAmB,SAAsD;EAC9F,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,IAAI,SAAS,kBAAkB,QAC7B,OAAO,CAAC,GAAG,MAAM,WAAW;EAE9B,OAAO,MAAM,YAAY,QAAO,WAAU,OAAO,kBAAkB,QAAQ,aAAa;CAC1F;CAEA,SAAgB,WAAoC;EAClD,MAAM,QAAQ,KAAK,IAAI,SAAS;EAChC,OAAO,gBAAgB,KAAK;CAC9B;CAEA,QAAe,WAAmB,UAAiC;EACjE,KAAK,SAAS,IAAI,WAAW,gBAAgB,QAAQ,CAAC;EACtD,KAAK,QAAQ,WAAW,KAAK,SAAS,IAAI,SAAS,CAAE;CACvD;CAEA,qBAA4B,WAAgC;EAC1D,KAAK,aAAa,qBAAqB,SAAS;CAClD;CAEA,uBAA6C;EAC3C,OAAO,KAAK,aAAa,qBAAqB,KAAK;CACrD;CAEA,aAAqB,WAA2C;EAC9D,MAAM,SAAS,KAAK,aAAa,KAAK,SAAS;EAC/C,IAAI,CAAC,QACH,OAAO;EAET,KAAK,SAAS,IAAI,WAAW,MAAM;EACnC,OAAO;CACT;CAEA,QAAgB,WAAmB,UAAiC;EAClE,KAAK,aAAa,KAAK,WAAW,QAAoC;CACxE;AACF;;;ACvJA,SAAS,SAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAgB,mBAAmB,SAAmC;CACpE,IAAI,OAAO,YAAY,UACrB,OAAO,KAAK,MAAM,OAAO;CAE3B,OAAO;AACT;AAEA,SAAgB,iBAAiB,MAAgD;CAC/E,IAAI,CAAC,SAAS,IAAI,GAChB,MAAM,IAAI,MAAM,wBAAwB;CAG1C,IAAI,qBAAqB,QAAQ,WAAW,MAC1C,OAAO;CAGT,IAAI,sBAAsB,QAAQ,MAAM,QAAQ,KAAK,KAAK,GAAG;EAC3D,MAAM,QAAQ,KAAK;EACnB,IAAI,MAAM,SAAS,GAAG;GACpB,MAAM,QAAQ,MAAM;GACpB,IAAI,SAAS,KAAK,KAAK,cAAc,OACnC,OAAO;GAET,MAAM,IAAI,MAAM,0DAA0D;EAC5E;CACF;CAEA,IAAI,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG;EACtD,MAAM,QAAQ,KAAK,MAAM;EACzB,IAAI,SAAS,KAAK,KAAK,cAAc,OACnC,OAAO;CAEX;CAEA,MAAM,IAAI,MAAM,iDAAiD;AACnE;;;ACCA,SAAS,uBAAuB,OAAmC;CACjE,OAAO;EACL,GAAG;EACH,OAAO,MAAM,SAAS;EACtB,OAAO,MAAM,SAAS;EACtB,SAAS,MAAM,WAAW;EAC1B,OAAO,MAAM,SAAS,EAAE,OAAO,CAAC,EAAE;CACpC;AACF;AAEA,SAAS,qBACP,SACA,MACiE;CACjE,MAAM,WACJ,SAAS,WAAW;EAAE,OAAO;EAAqB,OAAO;CAAS,IAAI;EAAE,OAAO;EAAoB,OAAO;CAAQ;CACpH,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,OAAO;EACL,OAAO,MAAM,SAAS,IAAI,QAAQ,SAAS;EAC3C,OAAO,MAAM,SAAS,IAAI,QAAQ,SAAS;EAC3C,aAAa,QAAQ,QAAQ,KAAK;CACpC;AACF;AAEA,SAAS,aAAa,OAAwB;CAE5C,QADe,MAAM,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAC9B,GAAR;EACE,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,KAAK,KACH,OAAO,QAAQ;EACjB,SACE,MAAM,IAAI,MAAM,oCAAoC,MAAM,2BAA2B;CACzF;AACF;;;;;;;;AASA,IAAa,cAAb,MAAwD;CACtD,kBAAkC;CAClC;CACA,UAA2B,IAAI,cAAc;CAC7C,aAA8B,IAAI,aAAa;CAC/C;;CAGA,YAAmB,UAA8B,CAAC,GAAG;EACnD,KAAK,WAAW,IAAI,aAAa,EAAE,gBAAgB,QAAQ,eAAe,CAAC;EAC3E,KAAK,mBAAmB,KAAK,SAAS,qBAAqB;CAC7D;;CAGA,cAAqB,SAAgD;EAEnE,OADgB,KAAK,kBACd,KAAW,KAAK,cAAc,OAAO;CAC9C;;CAGA,cAAqB,SAAgD;EACnE,OAAO,KAAK,aAAa,KAAK,SAAS,OAAO,SAAS,KAAK,eAAe,CAAC;CAC9E;;CAGA,oBAAiD;EAC/C,IAAI,CAAC,KAAK,kBACR,OAAO;EAET,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,gBAAgB,GAAG;GAC7C,KAAK,mBAAmB;GACxB,KAAK,SAAS,qBAAqB,IAAI;GACvC,OAAO;EACT;EACA,OAAO;GAAE,WAAW,KAAK;GAAkB,iBAAiB,KAAK;EAAgB;CACnF;;CAGA,kBAAyB,WAAkC;EACzD,IAAI,CAAC,KAAK,SAAS,IAAI,SAAS,GAC9B,MAAM,IAAI,MAAM,oBAAoB,WAAW;EAEjD,OAAO,KAAK,aAAa;GAAE;GAAW,iBAAiB,KAAK;EAAgB,CAAC;CAC/E;;CAGA,iBAAwB,OAA8B,WAA4C;EAChG,MAAM,UAAU,YACZ;GAAE,WAAW,KAAK,iBAAiB,SAAS;GAAG,iBAAiB,KAAK;EAAgB,IACrF,KAAK,cAAc,MAAM,OAAO;EACpC,MAAM,SAAS,KAAK,oBAAoB,QAAQ,WAAW,MAAM,KAAK;EACtE,MAAM,SAAS,KAAK,kBAClB;GACE;GACA,MAAM,MAAM;EACd,GACA,QAAQ,SACV;EACA,MAAM,WACJ,OAAO,WAAW,MAAM,gBAAgB,KAAK,WAAW,MAAM,eAAe,QAAQ,SAAS,IAAI;EACpG,OAAO;GACL,GAAG;GACH;GACA,SAAS,KAAK,oBAAoB,QAAQ,SAAS;GACnD;EACF;CACF;;CAGA,gBAAuB,SAA6B,WAAW,WAAwC;EACrG,IAAI,WAAW,QAAQ;GACrB,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;GACnE,OAAO,gBAAgB,SAAS,KAAK;EACvC;EACA,OAAO,KAAK,oBAAoB,SAAS;CAC3C;;CAGA,gBAAuB,SAAkC,WAAoB;EAC3E,OAAO,KAAK,SAAS,gBAAgB,KAAK,iBAAiB,SAAS,GAAG,OAAO;CAChF;;CAGA,kBAAyB,OAA+B,WAAoC;EAC1F,MAAM,KAAK,KAAK,iBAAiB,SAAS;EAC1C,MAAM,WAAW,KAAK,SAAS,IAAI,EAAE;EACrC,MAAM,EAAE,QAAQ,gBAAgB,KAAK,QAAQ,sBAAsB,SAAS,OAAO;GACjF,IAAI;GACJ,OAAO;GACP,SAAS,MAAM;GACf,kBAAkB,MAAM;EAC1B,CAAC;EACD,IAAI,MAAM,mBACR,KAAK,SAAS,iCACZ,IACA,QACA,YAAY,KAAI,UAAS;GAAE,GAAG;GAAM,eAAe;EAAU,EAAE,CACjE;EAEF,OAAO;CACT;;CAGA,WAAkB,SAAkB,WAAqC;EACvE,OAAO,KAAK,SAAS,YAAY,KAAK,iBAAiB,SAAS,GAAG,OAAO;CAC5E;;CAGA,cAAqB,WAA4B;EAC/C,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EACnE,OAAO,KAAK,UACV;GACE,iBAAiB,KAAK;GACtB,OAAO,SAAS;GAChB,aAAa,SAAS;EACxB,GACA,MACA,CACF;CACF;;CAGA,aAAoB,OAA0B,WAAwC;EACpF,MAAM,SAAS,MAAM,UAAU;EAC/B,MAAM,SACJ,MAAM,SAAS,WAAW,KAAK,wBAAwB,SAAS,IAAI,KAAK,uBAAuB,SAAS;EAC3G,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC;CACtE;;CAGA,WAAkB,SAA0B,OAAuB,QAAuB;EACxF,MAAM,SAAS,mBAAmB,OAAO;EACzC,MAAM,eAAe,SAAS,SAAS,iBAAiB,MAAM,IAAI;EAElE,QAAQ,cAAR;GACE,KAAK,WACH,OAAO,KAAK,oBAAoB,MAAM;GACxC,KAAK,iBACH,OAAO,KAAK,uBAAuB,MAAgC;GACrE,KAAK,kBACH,OAAO,KAAK,wBAAwB,MAA6B;GACnE,SACE,MAAM,IAAI,MAAM,4BAA4B,cAAwB;EACxE;CACF;;CAGA,MAAa,eAAe,OAA4B,WAAgD;EACtG,MAAM,KAAK,KAAK,iBAAiB,SAAS;EAC1C,MAAM,WAAW,KAAK,SAAS,SAAS,EAAE;EAE1C,IAAI;GACF,IAAI,QAAQ,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC;GAElC,IAAI,MAAM,OAAO,QAAQ;IACvB,MAAM,QAAQ,MAAM,KAAK,WAAW,wBAAwB,OAAO,MAAM,KAAK;IAC9E,QAAQ;KAAE,GAAG;KAAO;IAAM;IAC1B,KAAK,SAAS,aAAa,IAAI,KAAK;GACtC;GAEA,IAAI,MAAM,KAAK,QAAQ;IACrB,QAAQ,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9B,MAAM,QAAQ,MAAM,KAAK,WAAW,sBAAsB,OAAO,EAAE,OAAO,MAAM,IAAI,CAAC;IACrF,QAAQ;KAAE,GAAG;KAAO;IAAM;IAC1B,KAAK,SAAS,aAAa,IAAI,KAAK;IACpC,OAAO;GACT;GAEA,OAAO,gBAAgB,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK;EAC1D,SAAS,OAAO;GACd,KAAK,SAAS,QAAQ,IAAI,QAAQ;GAClC,MAAM;EACR;CACF;;CAGA,cAAqB,WAAuC;EAC1D,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EACnE,OAAO,gBAAgB,SAAS,MAAM,KAAK;CAC7C;;CAGA,SAAgB,OAAsB,WAAsC;EAC1E,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EAEnE,IAAI,MAAM,kBAAkB,QAC1B,OAAO,KAAK,WAAW,qBAAqB,SAAS,OAAO,MAAM,aAAa;EAGjF,IAAI,MAAM,eAAe,UAAa,MAAM,YAAY,QACtD,OAAO,KAAK,WAAW,mBAAmB,SAAS,OAAO,MAAM,YAAY,MAAM,OAAO;EAG3F,MAAM,IAAI,MAAM,4DAA4D;CAC9E;;CAGA,iBAAwB,WAA4C;EAClE,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EACnE,OAAO,KAAK,WAAW,iBAAiB,SAAS,KAAK;CACxD;CAEA,wBACE,OACA,WAC+B;EAC/B,MAAM,KAAK,KAAK,iBAAiB,SAAS;EAC1C,MAAM,WAAW,KAAK,SAAS,IAAI,EAAE;EACrC,MAAM,EAAE,QAAQ,gBAAgB,KAAK,QAAQ,sBAAsB,SAAS,OAAO,MAAM,KAAK;EAC9F,MAAM,QAAQ,KAAK,QAAQ,oBAAoB,SAAS,OAAO,MAAM,OAAO,MAAM;EAClF,KAAK,SAAS,iCAAiC,IAAI,MAAM,MAAM,IAAI,WAAW;EAC9E,OAAO;GAAE;GAAO;EAAY;CAC9B;CAEA,kBAA0B,OAA+B,WAA6C;EACpG,MAAM,KAAK,KAAK,iBAAiB,SAAS;EAC1C,MAAM,OAAO,MAAM,QAAQ;EAC3B,MAAM,UAAU,YAAY,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,OAAO,MAAM,MAAM;EAC3E,MAAM,WAAW,KAAK,SAAS,SAAS,EAAE;EAC1C,MAAM,UAA+B,CAAC;EACtC,MAAM,SAA4C,CAAC;EAEnD,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,SAAS,KAAK,wBAAwB,EAAE,MAAM,GAAG,EAAE;GACzD,IAAI,OAAO,MAAM,SAAS,SAAS;IACjC,QAAQ,KAAK,OAAO,KAAK;IACzB;GACF;GACA,OAAO,KAAK;IAAE;IAAO,aAAa,OAAO;GAAY,CAAC;GACtD,IAAI,SAAS,UAAU;IACrB,KAAK,SAAS,QAAQ,IAAI,QAAQ;IAClC,OAAO;KACL,SAAS;KACT,SAAS,CAAC;KACV;KACA,aAAa,KAAK,SAAS,gBAAgB,EAAE;IAC/C;GACF;EACF;EAEA,MAAM,WAAW,KAAK,SAAS,IAAI,EAAE;EACrC,4BAA4B,SAAS,MAAM,OAAO,MAAM,MAAM;EAC9D,KAAK,SAAS,aAAa,IAAI,SAAS,KAAK;EAE7C,OAAO;GACL,SAAS,OAAO,WAAW;GAC3B;GACA;GACA,aAAa,KAAK,SAAS,gBAAgB,EAAE;EAC/C;CACF;CAEA,oBAA4B,WAAoC;EAC9D,MAAM,KAAK,KAAK,iBAAiB,SAAS;EAC1C,MAAM,WAAW,KAAK,SAAS,IAAI,EAAE;EACrC,MAAM,cAAc,KAAK,SAAS,gBAAgB,EAAE;EACpD,OAAO;GACL,WAAW;GACX,iBAAiB,KAAK;GACtB,OAAO,SAAS,MAAM;GACtB,OAAO,SAAS,MAAM;GACtB,SAAS,SAAS,MAAM;GACxB,WAAW,SAAS,MAAM,MAAM;GAChC,gBAAgB,SAAS,MAAM,MAAM,MAAM;GAC3C,kBAAkB,YAAY;GAC9B,OAAO,SAAS,MAAM,MAAM,KAAI,UAAS;IACvC,IAAI,KAAK;IACT,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,iBAAiB,KAAK,SAAS;GACjC,EAAE;GACF;GACA,cAAc,SAAS,MAAM,UAAU,GAAG,EAAE;EAC9C;CACF;CAEA,wBAAgC,WAA4C;EAC1E,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EACnE,OAAO;GACL,kBAAkB;GAClB,GAAG,qBAAqB,SAAS,OAAO,QAAQ;GAChD,OAAO,SAAS,MAAM,MAAM,KAAI,UAAS;IACvC,IAAI,KAAK;IACT,OAAO,KAAK;IACZ,YAAY,KAAK;IACjB,SAAS;IACT,UAAU,KAAK;IACf,mBAAmB,KAAK;IACxB,qBAAqB;IACrB,mBAAmB;IACnB,gBAAgB,KAAK;IACrB,qBAAqB,KAAK;IAC1B,UAAU,KAAK;IACf,eAAe,KAAK;IACpB,YAAY,CAAC;GACf,EAAE;GACF,aAAa,CAAC;EAChB;CACF;CAEA,uBAA+B,WAA2C;EACxE,MAAM,WAAW,KAAK,SAAS,IAAI,KAAK,iBAAiB,SAAS,CAAC;EACnE,OAAO;GACL,kBAAkB;GAClB,GAAG,qBAAqB,SAAS,OAAO,OAAO;GAC/C,OAAO,SAAS,MAAM,MAAM,MAAM,KAAI,UAAS;IAC7C,IAAI,KAAK;IACT,MAAM,KAAK;IACX,OAAO,KAAK;GACd,EAAE;EACJ;CACF;CAEA,oBAA4B,QAAgC;EAC1D,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,WAAW,SACxD,MAAM,IAAI,MAAM,gCAAgC;EAElD,MAAM,OAAO;EAIb,MAAM,SAAS,KAAK,SAAS,OAAO,uBAAuB,KAAK,KAAK,GAAG,KAAK,eAAe;EAC5F,IAAI,KAAK,aAAa,QACpB,KAAK,SAAS,eAAe,OAAO,WAAW,KAAK,WAAW;EAEjE,OAAO,KAAK,aAAa,MAAM;CACjC;CAEA,uBAA+B,MAA6C;EAC1E,MAAM,SAAS,KAAK,cAAc,0BAA0B,IAAI,CAAC;EACjE,KAAK,kBAAkB;GAAE,QAAQ,qBAAqB,IAAI;GAAG,MAAM;EAAc,GAAG,OAAO,SAAS;EACpG,OAAO;CACT;CAEA,wBAAgC,MAA0C;EACxE,MAAM,SAAS,KAAK,cAAc,2BAA2B,IAAI,CAAC;EAClE,KAAK,kBAAkB;GAAE,QAAQ,sBAAsB,IAAI;GAAG,MAAM;EAAc,GAAG,OAAO,SAAS;EACrG,OAAO;CACT;CAEA,oBAA4B,WAAmB,SAAwD;EACrG,MAAM,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,MAAM;EACjD,MAAM,kBAAkB,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;EACrE,MAAM,UAAU,IAAI,IAAI,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC;EAClD,IAAI,SAAS,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,EAAE,GAAG,CAAC,IAAI;EAEtE,MAAM,aAAa,OAAqB;GACtC,QAAQ,IAAI,EAAE;GACd,IAAI,MAAM,QACR,SAAS,KAAK;EAElB;EAEA,MAAM,mBAA2B;GAC/B,OAAO,QAAQ,IAAI,MAAM,GACvB,UAAU;GAEZ,MAAM,KAAK;GACX,UAAU;GACV,QAAQ,IAAI,EAAE;GACd,OAAO;EACT;EAEA,OAAO,QAAQ,KAAI,UAAS;GAC1B,MAAM,WAAW,gBAAgB,IAAI,MAAM,KAAK;GAChD,IAAI;GACJ,IAAI,MAAM,OAAO,QAAW;IAC1B,KAAK,MAAM;IACX,UAAU,EAAE;GACd,OAAO,IAAI,aAAa,QACtB,KAAK,SAAS;QAEd,KAAK,WAAW;GAElB,MAAM,QAAQ;IACZ;IACA,OAAO,MAAM;IACb,SAAS,MAAM,WAAW,UAAU,WAAW,aAAa,MAAM,KAAK;IACvE,kBAAkB,MAAM,oBAAoB,UAAU,oBAAoB;IAC1E,MAAM,MAAM,QAAQ,UAAU,QAAQ;IACtC,gBAAgB,MAAM,kBAAkB,UAAU,kBAAkB;IACpE,YAAY,MAAM,cAAc,UAAU,cAAc;GAC1D;GACA,gBAAgB,IAAI,MAAM,OAAO;IAC/B,GAAG;IACH,UAAU,UAAU,YAAY;KAAE,SAAS;KAAM,MAAM;KAAM,YAAY;KAAS,aAAa,CAAC;IAAE;GACpG,CAAC;GACD,OAAO;EACT,CAAC;CACH;CAEA,iBAAyB,WAA4B;EACnD,MAAM,KAAK,aAAa,KAAK;EAC7B,IAAI,CAAC,IACH,OAAO,KAAK,cAAc,CAAC,CAAC;EAE9B,IAAI,CAAC,KAAK,SAAS,IAAI,EAAE,GAAG;GAC1B,IAAI,WACF,MAAM,IAAI,MAAM,oBAAoB,WAAW;GAEjD,OAAO,KAAK,cAAc,CAAC,CAAC;EAC9B;EACA,OAAO;CACT;CAEA,aAAqB,QAAsC;EACzD,KAAK,mBAAmB,OAAO;EAC/B,KAAK,SAAS,qBAAqB,OAAO,SAAS;EACnD,OAAO;CACT;AACF"}
|