wadi-mcp 0.1.7 → 0.1.9
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/dist/server.mjs +1321 -474
- package/package.json +1 -1
package/dist/server.mjs
CHANGED
|
@@ -192891,8 +192891,8 @@ var require_chevrotain = __commonJS({
|
|
|
192891
192891
|
}
|
|
192892
192892
|
var freeExports3 = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2;
|
|
192893
192893
|
var freeModule3 = freeExports3 && typeof module2 == "object" && module2 && !module2.nodeType && module2;
|
|
192894
|
-
var
|
|
192895
|
-
var Buffer3 =
|
|
192894
|
+
var moduleExports4 = freeModule3 && freeModule3.exports === freeExports3;
|
|
192895
|
+
var Buffer3 = moduleExports4 ? root$1.Buffer : void 0, allocUnsafe = Buffer3 ? Buffer3.allocUnsafe : void 0;
|
|
192896
192896
|
function cloneBuffer(buffer, isDeep) {
|
|
192897
192897
|
if (isDeep) {
|
|
192898
192898
|
return buffer.slice();
|
|
@@ -369198,6 +369198,11 @@ var StdioServerTransport = class {
|
|
|
369198
369198
|
}
|
|
369199
369199
|
};
|
|
369200
369200
|
|
|
369201
|
+
// src/server.ts
|
|
369202
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
369203
|
+
import { tmpdir } from "node:os";
|
|
369204
|
+
import { join } from "node:path";
|
|
369205
|
+
|
|
369201
369206
|
// ../wadi-dsl/node_modules/langium/lib/syntax-tree.js
|
|
369202
369207
|
function isAstNode(obj) {
|
|
369203
369208
|
return typeof obj === "object" && obj !== null && typeof obj.$type === "string";
|
|
@@ -387112,6 +387117,21 @@ var Asset = {
|
|
|
387112
387117
|
name: "name",
|
|
387113
387118
|
src: "src"
|
|
387114
387119
|
};
|
|
387120
|
+
var AssetDecl = {
|
|
387121
|
+
$type: "AssetDecl",
|
|
387122
|
+
assetName: "assetName",
|
|
387123
|
+
category: "category",
|
|
387124
|
+
dx: "dx",
|
|
387125
|
+
dy: "dy",
|
|
387126
|
+
dz: "dz",
|
|
387127
|
+
id: "id",
|
|
387128
|
+
src: "src"
|
|
387129
|
+
};
|
|
387130
|
+
var AssetRef = {
|
|
387131
|
+
$type: "AssetRef",
|
|
387132
|
+
id: "id",
|
|
387133
|
+
ns: "ns"
|
|
387134
|
+
};
|
|
387115
387135
|
var Beam = {
|
|
387116
387136
|
$type: "Beam",
|
|
387117
387137
|
enabled: "enabled",
|
|
@@ -387147,6 +387167,7 @@ var Component = {
|
|
|
387147
387167
|
enabled: "enabled",
|
|
387148
387168
|
layer: "layer",
|
|
387149
387169
|
name: "name",
|
|
387170
|
+
ns: "ns",
|
|
387150
387171
|
ref: "ref",
|
|
387151
387172
|
x: "x",
|
|
387152
387173
|
y: "y",
|
|
@@ -387159,6 +387180,7 @@ var ComponentArg = {
|
|
|
387159
387180
|
};
|
|
387160
387181
|
var ComponentDef = {
|
|
387161
387182
|
$type: "ComponentDef",
|
|
387183
|
+
goal: "goal",
|
|
387162
387184
|
name: "name",
|
|
387163
387185
|
objects: "objects",
|
|
387164
387186
|
params: "params",
|
|
@@ -387238,11 +387260,17 @@ var Ground = {
|
|
|
387238
387260
|
y: "y",
|
|
387239
387261
|
z_offset: "z_offset"
|
|
387240
387262
|
};
|
|
387263
|
+
var Import = {
|
|
387264
|
+
$type: "Import",
|
|
387265
|
+
ns: "ns",
|
|
387266
|
+
ref: "ref"
|
|
387267
|
+
};
|
|
387241
387268
|
var Item = {
|
|
387242
387269
|
$type: "Item",
|
|
387243
387270
|
anchor: "anchor",
|
|
387244
387271
|
anchor_to: "anchor_to",
|
|
387245
387272
|
asset: "asset",
|
|
387273
|
+
assetRef: "assetRef",
|
|
387246
387274
|
enabled: "enabled",
|
|
387247
387275
|
gap_x: "gap_x",
|
|
387248
387276
|
gap_y: "gap_y",
|
|
@@ -387326,12 +387354,14 @@ var LayerDecl = {
|
|
|
387326
387354
|
};
|
|
387327
387355
|
var Model = {
|
|
387328
387356
|
$type: "Model",
|
|
387357
|
+
assets: "assets",
|
|
387329
387358
|
components: "components",
|
|
387330
387359
|
configurators: "configurators",
|
|
387331
387360
|
convention: "convention",
|
|
387332
387361
|
defaults: "defaults",
|
|
387333
387362
|
floors: "floors",
|
|
387334
387363
|
grids: "grids",
|
|
387364
|
+
imports: "imports",
|
|
387335
387365
|
layers: "layers",
|
|
387336
387366
|
name: "name",
|
|
387337
387367
|
points: "points",
|
|
@@ -387454,6 +387484,7 @@ var RoomItem = {
|
|
|
387454
387484
|
$type: "RoomItem",
|
|
387455
387485
|
anchor: "anchor",
|
|
387456
387486
|
asset: "asset",
|
|
387487
|
+
assetRef: "assetRef",
|
|
387457
387488
|
enabled: "enabled",
|
|
387458
387489
|
gap_x: "gap_x",
|
|
387459
387490
|
gap_y: "gap_y",
|
|
@@ -387616,6 +387647,48 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
387616
387647
|
},
|
|
387617
387648
|
superTypes: []
|
|
387618
387649
|
},
|
|
387650
|
+
AssetDecl: {
|
|
387651
|
+
name: AssetDecl.$type,
|
|
387652
|
+
properties: {
|
|
387653
|
+
assetName: {
|
|
387654
|
+
name: AssetDecl.assetName,
|
|
387655
|
+
optional: true
|
|
387656
|
+
},
|
|
387657
|
+
category: {
|
|
387658
|
+
name: AssetDecl.category,
|
|
387659
|
+
optional: true
|
|
387660
|
+
},
|
|
387661
|
+
dx: {
|
|
387662
|
+
name: AssetDecl.dx
|
|
387663
|
+
},
|
|
387664
|
+
dy: {
|
|
387665
|
+
name: AssetDecl.dy
|
|
387666
|
+
},
|
|
387667
|
+
dz: {
|
|
387668
|
+
name: AssetDecl.dz
|
|
387669
|
+
},
|
|
387670
|
+
id: {
|
|
387671
|
+
name: AssetDecl.id
|
|
387672
|
+
},
|
|
387673
|
+
src: {
|
|
387674
|
+
name: AssetDecl.src
|
|
387675
|
+
}
|
|
387676
|
+
},
|
|
387677
|
+
superTypes: []
|
|
387678
|
+
},
|
|
387679
|
+
AssetRef: {
|
|
387680
|
+
name: AssetRef.$type,
|
|
387681
|
+
properties: {
|
|
387682
|
+
id: {
|
|
387683
|
+
name: AssetRef.id
|
|
387684
|
+
},
|
|
387685
|
+
ns: {
|
|
387686
|
+
name: AssetRef.ns,
|
|
387687
|
+
optional: true
|
|
387688
|
+
}
|
|
387689
|
+
},
|
|
387690
|
+
superTypes: []
|
|
387691
|
+
},
|
|
387619
387692
|
Beam: {
|
|
387620
387693
|
name: Beam.$type,
|
|
387621
387694
|
properties: {
|
|
@@ -387703,6 +387776,10 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
387703
387776
|
name: Component.name,
|
|
387704
387777
|
optional: true
|
|
387705
387778
|
},
|
|
387779
|
+
ns: {
|
|
387780
|
+
name: Component.ns,
|
|
387781
|
+
optional: true
|
|
387782
|
+
},
|
|
387706
387783
|
ref: {
|
|
387707
387784
|
name: Component.ref
|
|
387708
387785
|
},
|
|
@@ -387734,6 +387811,10 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
387734
387811
|
ComponentDef: {
|
|
387735
387812
|
name: ComponentDef.$type,
|
|
387736
387813
|
properties: {
|
|
387814
|
+
goal: {
|
|
387815
|
+
name: ComponentDef.goal,
|
|
387816
|
+
optional: true
|
|
387817
|
+
},
|
|
387737
387818
|
name: {
|
|
387738
387819
|
name: ComponentDef.name
|
|
387739
387820
|
},
|
|
@@ -387970,6 +388051,19 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
387970
388051
|
},
|
|
387971
388052
|
superTypes: [FloorObject.$type]
|
|
387972
388053
|
},
|
|
388054
|
+
Import: {
|
|
388055
|
+
name: Import.$type,
|
|
388056
|
+
properties: {
|
|
388057
|
+
ns: {
|
|
388058
|
+
name: Import.ns,
|
|
388059
|
+
optional: true
|
|
388060
|
+
},
|
|
388061
|
+
ref: {
|
|
388062
|
+
name: Import.ref
|
|
388063
|
+
}
|
|
388064
|
+
},
|
|
388065
|
+
superTypes: []
|
|
388066
|
+
},
|
|
387973
388067
|
Item: {
|
|
387974
388068
|
name: Item.$type,
|
|
387975
388069
|
properties: {
|
|
@@ -387982,7 +388076,12 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
387982
388076
|
optional: true
|
|
387983
388077
|
},
|
|
387984
388078
|
asset: {
|
|
387985
|
-
name: Item.asset
|
|
388079
|
+
name: Item.asset,
|
|
388080
|
+
optional: true
|
|
388081
|
+
},
|
|
388082
|
+
assetRef: {
|
|
388083
|
+
name: Item.assetRef,
|
|
388084
|
+
optional: true
|
|
387986
388085
|
},
|
|
387987
388086
|
enabled: {
|
|
387988
388087
|
name: Item.enabled,
|
|
@@ -388167,6 +388266,11 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
388167
388266
|
Model: {
|
|
388168
388267
|
name: Model.$type,
|
|
388169
388268
|
properties: {
|
|
388269
|
+
assets: {
|
|
388270
|
+
name: Model.assets,
|
|
388271
|
+
defaultValue: [],
|
|
388272
|
+
optional: true
|
|
388273
|
+
},
|
|
388170
388274
|
components: {
|
|
388171
388275
|
name: Model.components,
|
|
388172
388276
|
defaultValue: [],
|
|
@@ -388195,13 +388299,19 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
388195
388299
|
defaultValue: [],
|
|
388196
388300
|
optional: true
|
|
388197
388301
|
},
|
|
388302
|
+
imports: {
|
|
388303
|
+
name: Model.imports,
|
|
388304
|
+
defaultValue: [],
|
|
388305
|
+
optional: true
|
|
388306
|
+
},
|
|
388198
388307
|
layers: {
|
|
388199
388308
|
name: Model.layers,
|
|
388200
388309
|
defaultValue: [],
|
|
388201
388310
|
optional: true
|
|
388202
388311
|
},
|
|
388203
388312
|
name: {
|
|
388204
|
-
name: Model.name
|
|
388313
|
+
name: Model.name,
|
|
388314
|
+
optional: true
|
|
388205
388315
|
},
|
|
388206
388316
|
points: {
|
|
388207
388317
|
name: Model.points,
|
|
@@ -388541,7 +388651,12 @@ var WadiAstReflection = class extends AbstractAstReflection {
|
|
|
388541
388651
|
optional: true
|
|
388542
388652
|
},
|
|
388543
388653
|
asset: {
|
|
388544
|
-
name: RoomItem.asset
|
|
388654
|
+
name: RoomItem.asset,
|
|
388655
|
+
optional: true
|
|
388656
|
+
},
|
|
388657
|
+
assetRef: {
|
|
388658
|
+
name: RoomItem.assetRef,
|
|
388659
|
+
optional: true
|
|
388545
388660
|
},
|
|
388546
388661
|
enabled: {
|
|
388547
388662
|
name: RoomItem.enabled,
|
|
@@ -388973,95 +389088,32 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
388973
389088
|
"$type": "Group",
|
|
388974
389089
|
"elements": [
|
|
388975
389090
|
{
|
|
388976
|
-
"$type": "
|
|
388977
|
-
"value": "house"
|
|
388978
|
-
},
|
|
388979
|
-
{
|
|
388980
|
-
"$type": "Assignment",
|
|
388981
|
-
"feature": "name",
|
|
388982
|
-
"operator": "=",
|
|
388983
|
-
"terminal": {
|
|
388984
|
-
"$type": "RuleCall",
|
|
388985
|
-
"rule": {
|
|
388986
|
-
"$ref": "#/rules@56"
|
|
388987
|
-
},
|
|
388988
|
-
"arguments": []
|
|
388989
|
-
}
|
|
388990
|
-
},
|
|
388991
|
-
{
|
|
388992
|
-
"$type": "Keyword",
|
|
388993
|
-
"value": "{"
|
|
388994
|
-
},
|
|
388995
|
-
{
|
|
388996
|
-
"$type": "Group",
|
|
389091
|
+
"$type": "Alternatives",
|
|
388997
389092
|
"elements": [
|
|
388998
389093
|
{
|
|
388999
|
-
"$type": "
|
|
389000
|
-
"
|
|
389094
|
+
"$type": "Assignment",
|
|
389095
|
+
"feature": "imports",
|
|
389096
|
+
"operator": "+=",
|
|
389097
|
+
"terminal": {
|
|
389098
|
+
"$type": "RuleCall",
|
|
389099
|
+
"rule": {
|
|
389100
|
+
"$ref": "#/rules@1"
|
|
389101
|
+
},
|
|
389102
|
+
"arguments": []
|
|
389103
|
+
}
|
|
389001
389104
|
},
|
|
389002
389105
|
{
|
|
389003
389106
|
"$type": "Assignment",
|
|
389004
|
-
"feature": "
|
|
389005
|
-
"operator": "
|
|
389107
|
+
"feature": "assets",
|
|
389108
|
+
"operator": "+=",
|
|
389006
389109
|
"terminal": {
|
|
389007
|
-
"$type": "
|
|
389008
|
-
"
|
|
389009
|
-
|
|
389010
|
-
|
|
389011
|
-
|
|
389012
|
-
},
|
|
389013
|
-
{
|
|
389014
|
-
"$type": "Keyword",
|
|
389015
|
-
"value": "outer"
|
|
389016
|
-
}
|
|
389017
|
-
]
|
|
389110
|
+
"$type": "RuleCall",
|
|
389111
|
+
"rule": {
|
|
389112
|
+
"$ref": "#/rules@2"
|
|
389113
|
+
},
|
|
389114
|
+
"arguments": []
|
|
389018
389115
|
}
|
|
389019
|
-
}
|
|
389020
|
-
],
|
|
389021
|
-
"cardinality": "?"
|
|
389022
|
-
},
|
|
389023
|
-
{
|
|
389024
|
-
"$type": "Assignment",
|
|
389025
|
-
"feature": "units",
|
|
389026
|
-
"operator": "=",
|
|
389027
|
-
"terminal": {
|
|
389028
|
-
"$type": "RuleCall",
|
|
389029
|
-
"rule": {
|
|
389030
|
-
"$ref": "#/rules@21"
|
|
389031
|
-
},
|
|
389032
|
-
"arguments": []
|
|
389033
|
-
},
|
|
389034
|
-
"cardinality": "?"
|
|
389035
|
-
},
|
|
389036
|
-
{
|
|
389037
|
-
"$type": "Assignment",
|
|
389038
|
-
"feature": "site",
|
|
389039
|
-
"operator": "=",
|
|
389040
|
-
"terminal": {
|
|
389041
|
-
"$type": "RuleCall",
|
|
389042
|
-
"rule": {
|
|
389043
|
-
"$ref": "#/rules@22"
|
|
389044
|
-
},
|
|
389045
|
-
"arguments": []
|
|
389046
|
-
},
|
|
389047
|
-
"cardinality": "?"
|
|
389048
|
-
},
|
|
389049
|
-
{
|
|
389050
|
-
"$type": "Assignment",
|
|
389051
|
-
"feature": "defaults",
|
|
389052
|
-
"operator": "=",
|
|
389053
|
-
"terminal": {
|
|
389054
|
-
"$type": "RuleCall",
|
|
389055
|
-
"rule": {
|
|
389056
|
-
"$ref": "#/rules@23"
|
|
389057
389116
|
},
|
|
389058
|
-
"arguments": []
|
|
389059
|
-
},
|
|
389060
|
-
"cardinality": "?"
|
|
389061
|
-
},
|
|
389062
|
-
{
|
|
389063
|
-
"$type": "Alternatives",
|
|
389064
|
-
"elements": [
|
|
389065
389117
|
{
|
|
389066
389118
|
"$type": "Assignment",
|
|
389067
389119
|
"feature": "vars",
|
|
@@ -389069,7 +389121,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389069
389121
|
"terminal": {
|
|
389070
389122
|
"$type": "RuleCall",
|
|
389071
389123
|
"rule": {
|
|
389072
|
-
"$ref": "#/rules@
|
|
389124
|
+
"$ref": "#/rules@3"
|
|
389073
389125
|
},
|
|
389074
389126
|
"arguments": []
|
|
389075
389127
|
}
|
|
@@ -389081,7 +389133,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389081
389133
|
"terminal": {
|
|
389082
389134
|
"$type": "RuleCall",
|
|
389083
389135
|
"rule": {
|
|
389084
|
-
"$ref": "#/rules@
|
|
389136
|
+
"$ref": "#/rules@4"
|
|
389085
389137
|
},
|
|
389086
389138
|
"arguments": []
|
|
389087
389139
|
}
|
|
@@ -389093,7 +389145,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389093
389145
|
"terminal": {
|
|
389094
389146
|
"$type": "RuleCall",
|
|
389095
389147
|
"rule": {
|
|
389096
|
-
"$ref": "#/rules@
|
|
389148
|
+
"$ref": "#/rules@5"
|
|
389097
389149
|
},
|
|
389098
389150
|
"arguments": []
|
|
389099
389151
|
}
|
|
@@ -389105,7 +389157,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389105
389157
|
"terminal": {
|
|
389106
389158
|
"$type": "RuleCall",
|
|
389107
389159
|
"rule": {
|
|
389108
|
-
"$ref": "#/rules@
|
|
389160
|
+
"$ref": "#/rules@7"
|
|
389109
389161
|
},
|
|
389110
389162
|
"arguments": []
|
|
389111
389163
|
}
|
|
@@ -389117,7 +389169,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389117
389169
|
"terminal": {
|
|
389118
389170
|
"$type": "RuleCall",
|
|
389119
389171
|
"rule": {
|
|
389120
|
-
"$ref": "#/rules@
|
|
389172
|
+
"$ref": "#/rules@26"
|
|
389121
389173
|
},
|
|
389122
389174
|
"arguments": []
|
|
389123
389175
|
}
|
|
@@ -389129,32 +389181,421 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389129
389181
|
"terminal": {
|
|
389130
389182
|
"$type": "RuleCall",
|
|
389131
389183
|
"rule": {
|
|
389132
|
-
"$ref": "#/rules@
|
|
389184
|
+
"$ref": "#/rules@27"
|
|
389133
389185
|
},
|
|
389134
389186
|
"arguments": []
|
|
389135
389187
|
}
|
|
389188
|
+
}
|
|
389189
|
+
],
|
|
389190
|
+
"cardinality": "*"
|
|
389191
|
+
},
|
|
389192
|
+
{
|
|
389193
|
+
"$type": "Group",
|
|
389194
|
+
"elements": [
|
|
389195
|
+
{
|
|
389196
|
+
"$type": "Keyword",
|
|
389197
|
+
"value": "house"
|
|
389136
389198
|
},
|
|
389137
389199
|
{
|
|
389138
389200
|
"$type": "Assignment",
|
|
389139
|
-
"feature": "
|
|
389140
|
-
"operator": "
|
|
389201
|
+
"feature": "name",
|
|
389202
|
+
"operator": "=",
|
|
389141
389203
|
"terminal": {
|
|
389142
389204
|
"$type": "RuleCall",
|
|
389143
389205
|
"rule": {
|
|
389144
|
-
"$ref": "#/rules@
|
|
389206
|
+
"$ref": "#/rules@59"
|
|
389145
389207
|
},
|
|
389146
389208
|
"arguments": []
|
|
389147
389209
|
}
|
|
389210
|
+
},
|
|
389211
|
+
{
|
|
389212
|
+
"$type": "Keyword",
|
|
389213
|
+
"value": "{"
|
|
389214
|
+
},
|
|
389215
|
+
{
|
|
389216
|
+
"$type": "Group",
|
|
389217
|
+
"elements": [
|
|
389218
|
+
{
|
|
389219
|
+
"$type": "Keyword",
|
|
389220
|
+
"value": "convention"
|
|
389221
|
+
},
|
|
389222
|
+
{
|
|
389223
|
+
"$type": "Assignment",
|
|
389224
|
+
"feature": "convention",
|
|
389225
|
+
"operator": "=",
|
|
389226
|
+
"terminal": {
|
|
389227
|
+
"$type": "Alternatives",
|
|
389228
|
+
"elements": [
|
|
389229
|
+
{
|
|
389230
|
+
"$type": "Keyword",
|
|
389231
|
+
"value": "center"
|
|
389232
|
+
},
|
|
389233
|
+
{
|
|
389234
|
+
"$type": "Keyword",
|
|
389235
|
+
"value": "outer"
|
|
389236
|
+
}
|
|
389237
|
+
]
|
|
389238
|
+
}
|
|
389239
|
+
}
|
|
389240
|
+
],
|
|
389241
|
+
"cardinality": "?"
|
|
389242
|
+
},
|
|
389243
|
+
{
|
|
389244
|
+
"$type": "Assignment",
|
|
389245
|
+
"feature": "units",
|
|
389246
|
+
"operator": "=",
|
|
389247
|
+
"terminal": {
|
|
389248
|
+
"$type": "RuleCall",
|
|
389249
|
+
"rule": {
|
|
389250
|
+
"$ref": "#/rules@23"
|
|
389251
|
+
},
|
|
389252
|
+
"arguments": []
|
|
389253
|
+
},
|
|
389254
|
+
"cardinality": "?"
|
|
389255
|
+
},
|
|
389256
|
+
{
|
|
389257
|
+
"$type": "Assignment",
|
|
389258
|
+
"feature": "site",
|
|
389259
|
+
"operator": "=",
|
|
389260
|
+
"terminal": {
|
|
389261
|
+
"$type": "RuleCall",
|
|
389262
|
+
"rule": {
|
|
389263
|
+
"$ref": "#/rules@24"
|
|
389264
|
+
},
|
|
389265
|
+
"arguments": []
|
|
389266
|
+
},
|
|
389267
|
+
"cardinality": "?"
|
|
389268
|
+
},
|
|
389269
|
+
{
|
|
389270
|
+
"$type": "Assignment",
|
|
389271
|
+
"feature": "defaults",
|
|
389272
|
+
"operator": "=",
|
|
389273
|
+
"terminal": {
|
|
389274
|
+
"$type": "RuleCall",
|
|
389275
|
+
"rule": {
|
|
389276
|
+
"$ref": "#/rules@25"
|
|
389277
|
+
},
|
|
389278
|
+
"arguments": []
|
|
389279
|
+
},
|
|
389280
|
+
"cardinality": "?"
|
|
389281
|
+
},
|
|
389282
|
+
{
|
|
389283
|
+
"$type": "Alternatives",
|
|
389284
|
+
"elements": [
|
|
389285
|
+
{
|
|
389286
|
+
"$type": "Assignment",
|
|
389287
|
+
"feature": "imports",
|
|
389288
|
+
"operator": "+=",
|
|
389289
|
+
"terminal": {
|
|
389290
|
+
"$type": "RuleCall",
|
|
389291
|
+
"rule": {
|
|
389292
|
+
"$ref": "#/rules@1"
|
|
389293
|
+
},
|
|
389294
|
+
"arguments": []
|
|
389295
|
+
}
|
|
389296
|
+
},
|
|
389297
|
+
{
|
|
389298
|
+
"$type": "Assignment",
|
|
389299
|
+
"feature": "assets",
|
|
389300
|
+
"operator": "+=",
|
|
389301
|
+
"terminal": {
|
|
389302
|
+
"$type": "RuleCall",
|
|
389303
|
+
"rule": {
|
|
389304
|
+
"$ref": "#/rules@2"
|
|
389305
|
+
},
|
|
389306
|
+
"arguments": []
|
|
389307
|
+
}
|
|
389308
|
+
},
|
|
389309
|
+
{
|
|
389310
|
+
"$type": "Assignment",
|
|
389311
|
+
"feature": "vars",
|
|
389312
|
+
"operator": "+=",
|
|
389313
|
+
"terminal": {
|
|
389314
|
+
"$type": "RuleCall",
|
|
389315
|
+
"rule": {
|
|
389316
|
+
"$ref": "#/rules@3"
|
|
389317
|
+
},
|
|
389318
|
+
"arguments": []
|
|
389319
|
+
}
|
|
389320
|
+
},
|
|
389321
|
+
{
|
|
389322
|
+
"$type": "Assignment",
|
|
389323
|
+
"feature": "points",
|
|
389324
|
+
"operator": "+=",
|
|
389325
|
+
"terminal": {
|
|
389326
|
+
"$type": "RuleCall",
|
|
389327
|
+
"rule": {
|
|
389328
|
+
"$ref": "#/rules@4"
|
|
389329
|
+
},
|
|
389330
|
+
"arguments": []
|
|
389331
|
+
}
|
|
389332
|
+
},
|
|
389333
|
+
{
|
|
389334
|
+
"$type": "Assignment",
|
|
389335
|
+
"feature": "grids",
|
|
389336
|
+
"operator": "+=",
|
|
389337
|
+
"terminal": {
|
|
389338
|
+
"$type": "RuleCall",
|
|
389339
|
+
"rule": {
|
|
389340
|
+
"$ref": "#/rules@5"
|
|
389341
|
+
},
|
|
389342
|
+
"arguments": []
|
|
389343
|
+
}
|
|
389344
|
+
},
|
|
389345
|
+
{
|
|
389346
|
+
"$type": "Assignment",
|
|
389347
|
+
"feature": "configurators",
|
|
389348
|
+
"operator": "+=",
|
|
389349
|
+
"terminal": {
|
|
389350
|
+
"$type": "RuleCall",
|
|
389351
|
+
"rule": {
|
|
389352
|
+
"$ref": "#/rules@7"
|
|
389353
|
+
},
|
|
389354
|
+
"arguments": []
|
|
389355
|
+
}
|
|
389356
|
+
},
|
|
389357
|
+
{
|
|
389358
|
+
"$type": "Assignment",
|
|
389359
|
+
"feature": "layers",
|
|
389360
|
+
"operator": "+=",
|
|
389361
|
+
"terminal": {
|
|
389362
|
+
"$type": "RuleCall",
|
|
389363
|
+
"rule": {
|
|
389364
|
+
"$ref": "#/rules@26"
|
|
389365
|
+
},
|
|
389366
|
+
"arguments": []
|
|
389367
|
+
}
|
|
389368
|
+
},
|
|
389369
|
+
{
|
|
389370
|
+
"$type": "Assignment",
|
|
389371
|
+
"feature": "components",
|
|
389372
|
+
"operator": "+=",
|
|
389373
|
+
"terminal": {
|
|
389374
|
+
"$type": "RuleCall",
|
|
389375
|
+
"rule": {
|
|
389376
|
+
"$ref": "#/rules@27"
|
|
389377
|
+
},
|
|
389378
|
+
"arguments": []
|
|
389379
|
+
}
|
|
389380
|
+
},
|
|
389381
|
+
{
|
|
389382
|
+
"$type": "Assignment",
|
|
389383
|
+
"feature": "floors",
|
|
389384
|
+
"operator": "+=",
|
|
389385
|
+
"terminal": {
|
|
389386
|
+
"$type": "RuleCall",
|
|
389387
|
+
"rule": {
|
|
389388
|
+
"$ref": "#/rules@29"
|
|
389389
|
+
},
|
|
389390
|
+
"arguments": []
|
|
389391
|
+
}
|
|
389392
|
+
}
|
|
389393
|
+
],
|
|
389394
|
+
"cardinality": "*"
|
|
389395
|
+
},
|
|
389396
|
+
{
|
|
389397
|
+
"$type": "Keyword",
|
|
389398
|
+
"value": "}"
|
|
389148
389399
|
}
|
|
389149
389400
|
],
|
|
389150
|
-
"cardinality": "
|
|
389401
|
+
"cardinality": "?"
|
|
389402
|
+
}
|
|
389403
|
+
]
|
|
389404
|
+
},
|
|
389405
|
+
"fragment": false,
|
|
389406
|
+
"parameters": []
|
|
389407
|
+
},
|
|
389408
|
+
{
|
|
389409
|
+
"$type": "ParserRule",
|
|
389410
|
+
"name": "Import",
|
|
389411
|
+
"definition": {
|
|
389412
|
+
"$type": "Group",
|
|
389413
|
+
"elements": [
|
|
389414
|
+
{
|
|
389415
|
+
"$type": "Keyword",
|
|
389416
|
+
"value": "import"
|
|
389417
|
+
},
|
|
389418
|
+
{
|
|
389419
|
+
"$type": "Assignment",
|
|
389420
|
+
"feature": "ref",
|
|
389421
|
+
"operator": "=",
|
|
389422
|
+
"terminal": {
|
|
389423
|
+
"$type": "RuleCall",
|
|
389424
|
+
"rule": {
|
|
389425
|
+
"$ref": "#/rules@61"
|
|
389426
|
+
},
|
|
389427
|
+
"arguments": []
|
|
389428
|
+
}
|
|
389429
|
+
},
|
|
389430
|
+
{
|
|
389431
|
+
"$type": "Group",
|
|
389432
|
+
"elements": [
|
|
389433
|
+
{
|
|
389434
|
+
"$type": "Keyword",
|
|
389435
|
+
"value": "as"
|
|
389436
|
+
},
|
|
389437
|
+
{
|
|
389438
|
+
"$type": "Assignment",
|
|
389439
|
+
"feature": "ns",
|
|
389440
|
+
"operator": "=",
|
|
389441
|
+
"terminal": {
|
|
389442
|
+
"$type": "RuleCall",
|
|
389443
|
+
"rule": {
|
|
389444
|
+
"$ref": "#/rules@59"
|
|
389445
|
+
},
|
|
389446
|
+
"arguments": []
|
|
389447
|
+
}
|
|
389448
|
+
}
|
|
389449
|
+
],
|
|
389450
|
+
"cardinality": "?"
|
|
389451
|
+
}
|
|
389452
|
+
]
|
|
389453
|
+
},
|
|
389454
|
+
"entry": false,
|
|
389455
|
+
"fragment": false,
|
|
389456
|
+
"parameters": []
|
|
389457
|
+
},
|
|
389458
|
+
{
|
|
389459
|
+
"$type": "ParserRule",
|
|
389460
|
+
"name": "AssetDecl",
|
|
389461
|
+
"definition": {
|
|
389462
|
+
"$type": "Group",
|
|
389463
|
+
"elements": [
|
|
389464
|
+
{
|
|
389465
|
+
"$type": "Keyword",
|
|
389466
|
+
"value": "asset"
|
|
389467
|
+
},
|
|
389468
|
+
{
|
|
389469
|
+
"$type": "Assignment",
|
|
389470
|
+
"feature": "id",
|
|
389471
|
+
"operator": "=",
|
|
389472
|
+
"terminal": {
|
|
389473
|
+
"$type": "RuleCall",
|
|
389474
|
+
"rule": {
|
|
389475
|
+
"$ref": "#/rules@61"
|
|
389476
|
+
},
|
|
389477
|
+
"arguments": []
|
|
389478
|
+
}
|
|
389151
389479
|
},
|
|
389152
389480
|
{
|
|
389153
389481
|
"$type": "Keyword",
|
|
389154
|
-
"value": "
|
|
389482
|
+
"value": "src"
|
|
389483
|
+
},
|
|
389484
|
+
{
|
|
389485
|
+
"$type": "Assignment",
|
|
389486
|
+
"feature": "src",
|
|
389487
|
+
"operator": "=",
|
|
389488
|
+
"terminal": {
|
|
389489
|
+
"$type": "RuleCall",
|
|
389490
|
+
"rule": {
|
|
389491
|
+
"$ref": "#/rules@61"
|
|
389492
|
+
},
|
|
389493
|
+
"arguments": []
|
|
389494
|
+
}
|
|
389495
|
+
},
|
|
389496
|
+
{
|
|
389497
|
+
"$type": "Keyword",
|
|
389498
|
+
"value": "dims"
|
|
389499
|
+
},
|
|
389500
|
+
{
|
|
389501
|
+
"$type": "Keyword",
|
|
389502
|
+
"value": "("
|
|
389503
|
+
},
|
|
389504
|
+
{
|
|
389505
|
+
"$type": "Assignment",
|
|
389506
|
+
"feature": "dx",
|
|
389507
|
+
"operator": "=",
|
|
389508
|
+
"terminal": {
|
|
389509
|
+
"$type": "RuleCall",
|
|
389510
|
+
"rule": {
|
|
389511
|
+
"$ref": "#/rules@60"
|
|
389512
|
+
},
|
|
389513
|
+
"arguments": []
|
|
389514
|
+
}
|
|
389515
|
+
},
|
|
389516
|
+
{
|
|
389517
|
+
"$type": "Keyword",
|
|
389518
|
+
"value": ","
|
|
389519
|
+
},
|
|
389520
|
+
{
|
|
389521
|
+
"$type": "Assignment",
|
|
389522
|
+
"feature": "dy",
|
|
389523
|
+
"operator": "=",
|
|
389524
|
+
"terminal": {
|
|
389525
|
+
"$type": "RuleCall",
|
|
389526
|
+
"rule": {
|
|
389527
|
+
"$ref": "#/rules@60"
|
|
389528
|
+
},
|
|
389529
|
+
"arguments": []
|
|
389530
|
+
}
|
|
389531
|
+
},
|
|
389532
|
+
{
|
|
389533
|
+
"$type": "Keyword",
|
|
389534
|
+
"value": ","
|
|
389535
|
+
},
|
|
389536
|
+
{
|
|
389537
|
+
"$type": "Assignment",
|
|
389538
|
+
"feature": "dz",
|
|
389539
|
+
"operator": "=",
|
|
389540
|
+
"terminal": {
|
|
389541
|
+
"$type": "RuleCall",
|
|
389542
|
+
"rule": {
|
|
389543
|
+
"$ref": "#/rules@60"
|
|
389544
|
+
},
|
|
389545
|
+
"arguments": []
|
|
389546
|
+
}
|
|
389547
|
+
},
|
|
389548
|
+
{
|
|
389549
|
+
"$type": "Keyword",
|
|
389550
|
+
"value": ")"
|
|
389551
|
+
},
|
|
389552
|
+
{
|
|
389553
|
+
"$type": "Group",
|
|
389554
|
+
"elements": [
|
|
389555
|
+
{
|
|
389556
|
+
"$type": "Keyword",
|
|
389557
|
+
"value": "name"
|
|
389558
|
+
},
|
|
389559
|
+
{
|
|
389560
|
+
"$type": "Assignment",
|
|
389561
|
+
"feature": "assetName",
|
|
389562
|
+
"operator": "=",
|
|
389563
|
+
"terminal": {
|
|
389564
|
+
"$type": "RuleCall",
|
|
389565
|
+
"rule": {
|
|
389566
|
+
"$ref": "#/rules@61"
|
|
389567
|
+
},
|
|
389568
|
+
"arguments": []
|
|
389569
|
+
}
|
|
389570
|
+
}
|
|
389571
|
+
],
|
|
389572
|
+
"cardinality": "?"
|
|
389573
|
+
},
|
|
389574
|
+
{
|
|
389575
|
+
"$type": "Group",
|
|
389576
|
+
"elements": [
|
|
389577
|
+
{
|
|
389578
|
+
"$type": "Keyword",
|
|
389579
|
+
"value": "category"
|
|
389580
|
+
},
|
|
389581
|
+
{
|
|
389582
|
+
"$type": "Assignment",
|
|
389583
|
+
"feature": "category",
|
|
389584
|
+
"operator": "=",
|
|
389585
|
+
"terminal": {
|
|
389586
|
+
"$type": "RuleCall",
|
|
389587
|
+
"rule": {
|
|
389588
|
+
"$ref": "#/rules@61"
|
|
389589
|
+
},
|
|
389590
|
+
"arguments": []
|
|
389591
|
+
}
|
|
389592
|
+
}
|
|
389593
|
+
],
|
|
389594
|
+
"cardinality": "?"
|
|
389155
389595
|
}
|
|
389156
389596
|
]
|
|
389157
389597
|
},
|
|
389598
|
+
"entry": false,
|
|
389158
389599
|
"fragment": false,
|
|
389159
389600
|
"parameters": []
|
|
389160
389601
|
},
|
|
@@ -389175,7 +389616,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389175
389616
|
"terminal": {
|
|
389176
389617
|
"$type": "RuleCall",
|
|
389177
389618
|
"rule": {
|
|
389178
|
-
"$ref": "#/rules@
|
|
389619
|
+
"$ref": "#/rules@59"
|
|
389179
389620
|
},
|
|
389180
389621
|
"arguments": []
|
|
389181
389622
|
}
|
|
@@ -389191,7 +389632,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389191
389632
|
"terminal": {
|
|
389192
389633
|
"$type": "RuleCall",
|
|
389193
389634
|
"rule": {
|
|
389194
|
-
"$ref": "#/rules@
|
|
389635
|
+
"$ref": "#/rules@14"
|
|
389195
389636
|
},
|
|
389196
389637
|
"arguments": []
|
|
389197
389638
|
}
|
|
@@ -389219,7 +389660,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389219
389660
|
"terminal": {
|
|
389220
389661
|
"$type": "RuleCall",
|
|
389221
389662
|
"rule": {
|
|
389222
|
-
"$ref": "#/rules@
|
|
389663
|
+
"$ref": "#/rules@59"
|
|
389223
389664
|
},
|
|
389224
389665
|
"arguments": []
|
|
389225
389666
|
}
|
|
@@ -389243,7 +389684,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389243
389684
|
"terminal": {
|
|
389244
389685
|
"$type": "RuleCall",
|
|
389245
389686
|
"rule": {
|
|
389246
|
-
"$ref": "#/rules@
|
|
389687
|
+
"$ref": "#/rules@14"
|
|
389247
389688
|
},
|
|
389248
389689
|
"arguments": []
|
|
389249
389690
|
}
|
|
@@ -389268,7 +389709,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389268
389709
|
"terminal": {
|
|
389269
389710
|
"$type": "RuleCall",
|
|
389270
389711
|
"rule": {
|
|
389271
|
-
"$ref": "#/rules@
|
|
389712
|
+
"$ref": "#/rules@14"
|
|
389272
389713
|
},
|
|
389273
389714
|
"arguments": []
|
|
389274
389715
|
}
|
|
@@ -389300,7 +389741,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389300
389741
|
"terminal": {
|
|
389301
389742
|
"$type": "RuleCall",
|
|
389302
389743
|
"rule": {
|
|
389303
|
-
"$ref": "#/rules@
|
|
389744
|
+
"$ref": "#/rules@59"
|
|
389304
389745
|
},
|
|
389305
389746
|
"arguments": []
|
|
389306
389747
|
}
|
|
@@ -389324,7 +389765,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389324
389765
|
"terminal": {
|
|
389325
389766
|
"$type": "RuleCall",
|
|
389326
389767
|
"rule": {
|
|
389327
|
-
"$ref": "#/rules@
|
|
389768
|
+
"$ref": "#/rules@6"
|
|
389328
389769
|
},
|
|
389329
389770
|
"arguments": []
|
|
389330
389771
|
}
|
|
@@ -389343,7 +389784,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389343
389784
|
"terminal": {
|
|
389344
389785
|
"$type": "RuleCall",
|
|
389345
389786
|
"rule": {
|
|
389346
|
-
"$ref": "#/rules@
|
|
389787
|
+
"$ref": "#/rules@6"
|
|
389347
389788
|
},
|
|
389348
389789
|
"arguments": []
|
|
389349
389790
|
}
|
|
@@ -389366,7 +389807,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389366
389807
|
"terminal": {
|
|
389367
389808
|
"$type": "RuleCall",
|
|
389368
389809
|
"rule": {
|
|
389369
|
-
"$ref": "#/rules@
|
|
389810
|
+
"$ref": "#/rules@6"
|
|
389370
389811
|
},
|
|
389371
389812
|
"arguments": []
|
|
389372
389813
|
}
|
|
@@ -389385,7 +389826,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389385
389826
|
"terminal": {
|
|
389386
389827
|
"$type": "RuleCall",
|
|
389387
389828
|
"rule": {
|
|
389388
|
-
"$ref": "#/rules@
|
|
389829
|
+
"$ref": "#/rules@6"
|
|
389389
389830
|
},
|
|
389390
389831
|
"arguments": []
|
|
389391
389832
|
}
|
|
@@ -389419,14 +389860,14 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389419
389860
|
{
|
|
389420
389861
|
"$type": "RuleCall",
|
|
389421
389862
|
"rule": {
|
|
389422
|
-
"$ref": "#/rules@
|
|
389863
|
+
"$ref": "#/rules@59"
|
|
389423
389864
|
},
|
|
389424
389865
|
"arguments": []
|
|
389425
389866
|
},
|
|
389426
389867
|
{
|
|
389427
389868
|
"$type": "RuleCall",
|
|
389428
389869
|
"rule": {
|
|
389429
|
-
"$ref": "#/rules@
|
|
389870
|
+
"$ref": "#/rules@60"
|
|
389430
389871
|
},
|
|
389431
389872
|
"arguments": []
|
|
389432
389873
|
}
|
|
@@ -389444,7 +389885,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389444
389885
|
"terminal": {
|
|
389445
389886
|
"$type": "RuleCall",
|
|
389446
389887
|
"rule": {
|
|
389447
|
-
"$ref": "#/rules@
|
|
389888
|
+
"$ref": "#/rules@14"
|
|
389448
389889
|
},
|
|
389449
389890
|
"arguments": []
|
|
389450
389891
|
}
|
|
@@ -389463,7 +389904,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389463
389904
|
"terminal": {
|
|
389464
389905
|
"$type": "RuleCall",
|
|
389465
389906
|
"rule": {
|
|
389466
|
-
"$ref": "#/rules@
|
|
389907
|
+
"$ref": "#/rules@14"
|
|
389467
389908
|
},
|
|
389468
389909
|
"arguments": []
|
|
389469
389910
|
}
|
|
@@ -389526,7 +389967,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389526
389967
|
"terminal": {
|
|
389527
389968
|
"$type": "RuleCall",
|
|
389528
389969
|
"rule": {
|
|
389529
|
-
"$ref": "#/rules@
|
|
389970
|
+
"$ref": "#/rules@8"
|
|
389530
389971
|
},
|
|
389531
389972
|
"arguments": []
|
|
389532
389973
|
},
|
|
@@ -389551,28 +389992,28 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389551
389992
|
{
|
|
389552
389993
|
"$type": "RuleCall",
|
|
389553
389994
|
"rule": {
|
|
389554
|
-
"$ref": "#/rules@
|
|
389995
|
+
"$ref": "#/rules@9"
|
|
389555
389996
|
},
|
|
389556
389997
|
"arguments": []
|
|
389557
389998
|
},
|
|
389558
389999
|
{
|
|
389559
390000
|
"$type": "RuleCall",
|
|
389560
390001
|
"rule": {
|
|
389561
|
-
"$ref": "#/rules@
|
|
390002
|
+
"$ref": "#/rules@10"
|
|
389562
390003
|
},
|
|
389563
390004
|
"arguments": []
|
|
389564
390005
|
},
|
|
389565
390006
|
{
|
|
389566
390007
|
"$type": "RuleCall",
|
|
389567
390008
|
"rule": {
|
|
389568
|
-
"$ref": "#/rules@
|
|
390009
|
+
"$ref": "#/rules@11"
|
|
389569
390010
|
},
|
|
389570
390011
|
"arguments": []
|
|
389571
390012
|
},
|
|
389572
390013
|
{
|
|
389573
390014
|
"$type": "RuleCall",
|
|
389574
390015
|
"rule": {
|
|
389575
|
-
"$ref": "#/rules@
|
|
390016
|
+
"$ref": "#/rules@12"
|
|
389576
390017
|
},
|
|
389577
390018
|
"arguments": []
|
|
389578
390019
|
}
|
|
@@ -389599,7 +390040,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389599
390040
|
"terminal": {
|
|
389600
390041
|
"$type": "RuleCall",
|
|
389601
390042
|
"rule": {
|
|
389602
|
-
"$ref": "#/rules@
|
|
390043
|
+
"$ref": "#/rules@59"
|
|
389603
390044
|
},
|
|
389604
390045
|
"arguments": []
|
|
389605
390046
|
}
|
|
@@ -389611,7 +390052,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389611
390052
|
"terminal": {
|
|
389612
390053
|
"$type": "RuleCall",
|
|
389613
390054
|
"rule": {
|
|
389614
|
-
"$ref": "#/rules@
|
|
390055
|
+
"$ref": "#/rules@61"
|
|
389615
390056
|
},
|
|
389616
390057
|
"arguments": []
|
|
389617
390058
|
}
|
|
@@ -389623,7 +390064,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389623
390064
|
"terminal": {
|
|
389624
390065
|
"$type": "RuleCall",
|
|
389625
390066
|
"rule": {
|
|
389626
|
-
"$ref": "#/rules@
|
|
390067
|
+
"$ref": "#/rules@59"
|
|
389627
390068
|
},
|
|
389628
390069
|
"arguments": []
|
|
389629
390070
|
},
|
|
@@ -389640,7 +390081,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389640
390081
|
"terminal": {
|
|
389641
390082
|
"$type": "RuleCall",
|
|
389642
390083
|
"rule": {
|
|
389643
|
-
"$ref": "#/rules@
|
|
390084
|
+
"$ref": "#/rules@60"
|
|
389644
390085
|
},
|
|
389645
390086
|
"arguments": []
|
|
389646
390087
|
}
|
|
@@ -389656,7 +390097,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389656
390097
|
"terminal": {
|
|
389657
390098
|
"$type": "RuleCall",
|
|
389658
390099
|
"rule": {
|
|
389659
|
-
"$ref": "#/rules@
|
|
390100
|
+
"$ref": "#/rules@60"
|
|
389660
390101
|
},
|
|
389661
390102
|
"arguments": []
|
|
389662
390103
|
}
|
|
@@ -389675,7 +390116,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389675
390116
|
"terminal": {
|
|
389676
390117
|
"$type": "RuleCall",
|
|
389677
390118
|
"rule": {
|
|
389678
|
-
"$ref": "#/rules@
|
|
390119
|
+
"$ref": "#/rules@60"
|
|
389679
390120
|
},
|
|
389680
390121
|
"arguments": []
|
|
389681
390122
|
}
|
|
@@ -389710,7 +390151,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389710
390151
|
"terminal": {
|
|
389711
390152
|
"$type": "RuleCall",
|
|
389712
390153
|
"rule": {
|
|
389713
|
-
"$ref": "#/rules@
|
|
390154
|
+
"$ref": "#/rules@59"
|
|
389714
390155
|
},
|
|
389715
390156
|
"arguments": []
|
|
389716
390157
|
}
|
|
@@ -389722,7 +390163,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389722
390163
|
"terminal": {
|
|
389723
390164
|
"$type": "RuleCall",
|
|
389724
390165
|
"rule": {
|
|
389725
|
-
"$ref": "#/rules@
|
|
390166
|
+
"$ref": "#/rules@61"
|
|
389726
390167
|
},
|
|
389727
390168
|
"arguments": []
|
|
389728
390169
|
}
|
|
@@ -389734,7 +390175,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389734
390175
|
"terminal": {
|
|
389735
390176
|
"$type": "RuleCall",
|
|
389736
390177
|
"rule": {
|
|
389737
|
-
"$ref": "#/rules@
|
|
390178
|
+
"$ref": "#/rules@59"
|
|
389738
390179
|
},
|
|
389739
390180
|
"arguments": []
|
|
389740
390181
|
},
|
|
@@ -389763,7 +390204,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389763
390204
|
"terminal": {
|
|
389764
390205
|
"$type": "RuleCall",
|
|
389765
390206
|
"rule": {
|
|
389766
|
-
"$ref": "#/rules@
|
|
390207
|
+
"$ref": "#/rules@59"
|
|
389767
390208
|
},
|
|
389768
390209
|
"arguments": []
|
|
389769
390210
|
}
|
|
@@ -389775,7 +390216,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389775
390216
|
"terminal": {
|
|
389776
390217
|
"$type": "RuleCall",
|
|
389777
390218
|
"rule": {
|
|
389778
|
-
"$ref": "#/rules@
|
|
390219
|
+
"$ref": "#/rules@61"
|
|
389779
390220
|
},
|
|
389780
390221
|
"arguments": []
|
|
389781
390222
|
}
|
|
@@ -389803,7 +390244,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389803
390244
|
"terminal": {
|
|
389804
390245
|
"$type": "RuleCall",
|
|
389805
390246
|
"rule": {
|
|
389806
|
-
"$ref": "#/rules@
|
|
390247
|
+
"$ref": "#/rules@59"
|
|
389807
390248
|
},
|
|
389808
390249
|
"arguments": []
|
|
389809
390250
|
}
|
|
@@ -389815,7 +390256,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389815
390256
|
"terminal": {
|
|
389816
390257
|
"$type": "RuleCall",
|
|
389817
390258
|
"rule": {
|
|
389818
|
-
"$ref": "#/rules@
|
|
390259
|
+
"$ref": "#/rules@61"
|
|
389819
390260
|
},
|
|
389820
390261
|
"arguments": []
|
|
389821
390262
|
}
|
|
@@ -389831,7 +390272,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389831
390272
|
"terminal": {
|
|
389832
390273
|
"$type": "RuleCall",
|
|
389833
390274
|
"rule": {
|
|
389834
|
-
"$ref": "#/rules@
|
|
390275
|
+
"$ref": "#/rules@13"
|
|
389835
390276
|
},
|
|
389836
390277
|
"arguments": []
|
|
389837
390278
|
}
|
|
@@ -389850,7 +390291,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389850
390291
|
"terminal": {
|
|
389851
390292
|
"$type": "RuleCall",
|
|
389852
390293
|
"rule": {
|
|
389853
|
-
"$ref": "#/rules@
|
|
390294
|
+
"$ref": "#/rules@13"
|
|
389854
390295
|
},
|
|
389855
390296
|
"arguments": []
|
|
389856
390297
|
}
|
|
@@ -389881,7 +390322,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389881
390322
|
"terminal": {
|
|
389882
390323
|
"$type": "RuleCall",
|
|
389883
390324
|
"rule": {
|
|
389884
|
-
"$ref": "#/rules@
|
|
390325
|
+
"$ref": "#/rules@59"
|
|
389885
390326
|
},
|
|
389886
390327
|
"arguments": []
|
|
389887
390328
|
}
|
|
@@ -389897,7 +390338,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389897
390338
|
"terminal": {
|
|
389898
390339
|
"$type": "RuleCall",
|
|
389899
390340
|
"rule": {
|
|
389900
|
-
"$ref": "#/rules@
|
|
390341
|
+
"$ref": "#/rules@60"
|
|
389901
390342
|
},
|
|
389902
390343
|
"arguments": []
|
|
389903
390344
|
}
|
|
@@ -389918,7 +390359,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389918
390359
|
"definition": {
|
|
389919
390360
|
"$type": "RuleCall",
|
|
389920
390361
|
"rule": {
|
|
389921
|
-
"$ref": "#/rules@
|
|
390362
|
+
"$ref": "#/rules@15"
|
|
389922
390363
|
},
|
|
389923
390364
|
"arguments": []
|
|
389924
390365
|
},
|
|
@@ -389939,7 +390380,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389939
390380
|
{
|
|
389940
390381
|
"$type": "RuleCall",
|
|
389941
390382
|
"rule": {
|
|
389942
|
-
"$ref": "#/rules@
|
|
390383
|
+
"$ref": "#/rules@16"
|
|
389943
390384
|
},
|
|
389944
390385
|
"arguments": []
|
|
389945
390386
|
},
|
|
@@ -389980,7 +390421,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
389980
390421
|
"terminal": {
|
|
389981
390422
|
"$type": "RuleCall",
|
|
389982
390423
|
"rule": {
|
|
389983
|
-
"$ref": "#/rules@
|
|
390424
|
+
"$ref": "#/rules@16"
|
|
389984
390425
|
},
|
|
389985
390426
|
"arguments": []
|
|
389986
390427
|
}
|
|
@@ -390007,7 +390448,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390007
390448
|
{
|
|
390008
390449
|
"$type": "RuleCall",
|
|
390009
390450
|
"rule": {
|
|
390010
|
-
"$ref": "#/rules@
|
|
390451
|
+
"$ref": "#/rules@17"
|
|
390011
390452
|
},
|
|
390012
390453
|
"arguments": []
|
|
390013
390454
|
},
|
|
@@ -390048,7 +390489,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390048
390489
|
"terminal": {
|
|
390049
390490
|
"$type": "RuleCall",
|
|
390050
390491
|
"rule": {
|
|
390051
|
-
"$ref": "#/rules@
|
|
390492
|
+
"$ref": "#/rules@17"
|
|
390052
390493
|
},
|
|
390053
390494
|
"arguments": []
|
|
390054
390495
|
}
|
|
@@ -390093,7 +390534,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390093
390534
|
"terminal": {
|
|
390094
390535
|
"$type": "RuleCall",
|
|
390095
390536
|
"rule": {
|
|
390096
|
-
"$ref": "#/rules@
|
|
390537
|
+
"$ref": "#/rules@17"
|
|
390097
390538
|
},
|
|
390098
390539
|
"arguments": []
|
|
390099
390540
|
}
|
|
@@ -390110,7 +390551,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390110
390551
|
{
|
|
390111
390552
|
"$type": "RuleCall",
|
|
390112
390553
|
"rule": {
|
|
390113
|
-
"$ref": "#/rules@
|
|
390554
|
+
"$ref": "#/rules@14"
|
|
390114
390555
|
},
|
|
390115
390556
|
"arguments": []
|
|
390116
390557
|
},
|
|
@@ -390137,7 +390578,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390137
390578
|
"terminal": {
|
|
390138
390579
|
"$type": "RuleCall",
|
|
390139
390580
|
"rule": {
|
|
390140
|
-
"$ref": "#/rules@
|
|
390581
|
+
"$ref": "#/rules@60"
|
|
390141
390582
|
},
|
|
390142
390583
|
"arguments": []
|
|
390143
390584
|
}
|
|
@@ -390147,7 +390588,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390147
390588
|
{
|
|
390148
390589
|
"$type": "RuleCall",
|
|
390149
390590
|
"rule": {
|
|
390150
|
-
"$ref": "#/rules@
|
|
390591
|
+
"$ref": "#/rules@18"
|
|
390151
390592
|
},
|
|
390152
390593
|
"arguments": []
|
|
390153
390594
|
}
|
|
@@ -390181,7 +390622,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390181
390622
|
"terminal": {
|
|
390182
390623
|
"$type": "RuleCall",
|
|
390183
390624
|
"rule": {
|
|
390184
|
-
"$ref": "#/rules@
|
|
390625
|
+
"$ref": "#/rules@59"
|
|
390185
390626
|
},
|
|
390186
390627
|
"arguments": []
|
|
390187
390628
|
}
|
|
@@ -390200,7 +390641,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390200
390641
|
"terminal": {
|
|
390201
390642
|
"$type": "RuleCall",
|
|
390202
390643
|
"rule": {
|
|
390203
|
-
"$ref": "#/rules@
|
|
390644
|
+
"$ref": "#/rules@59"
|
|
390204
390645
|
},
|
|
390205
390646
|
"arguments": []
|
|
390206
390647
|
}
|
|
@@ -390234,7 +390675,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390234
390675
|
"terminal": {
|
|
390235
390676
|
"$type": "RuleCall",
|
|
390236
390677
|
"rule": {
|
|
390237
|
-
"$ref": "#/rules@
|
|
390678
|
+
"$ref": "#/rules@14"
|
|
390238
390679
|
},
|
|
390239
390680
|
"arguments": []
|
|
390240
390681
|
}
|
|
@@ -390253,7 +390694,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390253
390694
|
"terminal": {
|
|
390254
390695
|
"$type": "RuleCall",
|
|
390255
390696
|
"rule": {
|
|
390256
|
-
"$ref": "#/rules@
|
|
390697
|
+
"$ref": "#/rules@14"
|
|
390257
390698
|
},
|
|
390258
390699
|
"arguments": []
|
|
390259
390700
|
}
|
|
@@ -390294,7 +390735,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390294
390735
|
"terminal": {
|
|
390295
390736
|
"$type": "RuleCall",
|
|
390296
390737
|
"rule": {
|
|
390297
|
-
"$ref": "#/rules@
|
|
390738
|
+
"$ref": "#/rules@61"
|
|
390298
390739
|
},
|
|
390299
390740
|
"arguments": []
|
|
390300
390741
|
}
|
|
@@ -390306,7 +390747,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390306
390747
|
"terminal": {
|
|
390307
390748
|
"$type": "RuleCall",
|
|
390308
390749
|
"rule": {
|
|
390309
|
-
"$ref": "#/rules@
|
|
390750
|
+
"$ref": "#/rules@20"
|
|
390310
390751
|
},
|
|
390311
390752
|
"arguments": []
|
|
390312
390753
|
}
|
|
@@ -390341,7 +390782,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390341
390782
|
"terminal": {
|
|
390342
390783
|
"$type": "RuleCall",
|
|
390343
390784
|
"rule": {
|
|
390344
|
-
"$ref": "#/rules@
|
|
390785
|
+
"$ref": "#/rules@21"
|
|
390345
390786
|
},
|
|
390346
390787
|
"arguments": []
|
|
390347
390788
|
}
|
|
@@ -390360,7 +390801,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390360
390801
|
"terminal": {
|
|
390361
390802
|
"$type": "RuleCall",
|
|
390362
390803
|
"rule": {
|
|
390363
|
-
"$ref": "#/rules@
|
|
390804
|
+
"$ref": "#/rules@21"
|
|
390364
390805
|
},
|
|
390365
390806
|
"arguments": []
|
|
390366
390807
|
}
|
|
@@ -390397,14 +390838,14 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390397
390838
|
{
|
|
390398
390839
|
"$type": "RuleCall",
|
|
390399
390840
|
"rule": {
|
|
390400
|
-
"$ref": "#/rules@
|
|
390841
|
+
"$ref": "#/rules@61"
|
|
390401
390842
|
},
|
|
390402
390843
|
"arguments": []
|
|
390403
390844
|
},
|
|
390404
390845
|
{
|
|
390405
390846
|
"$type": "RuleCall",
|
|
390406
390847
|
"rule": {
|
|
390407
|
-
"$ref": "#/rules@
|
|
390848
|
+
"$ref": "#/rules@59"
|
|
390408
390849
|
},
|
|
390409
390850
|
"arguments": []
|
|
390410
390851
|
}
|
|
@@ -390422,7 +390863,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390422
390863
|
"terminal": {
|
|
390423
390864
|
"$type": "RuleCall",
|
|
390424
390865
|
"rule": {
|
|
390425
|
-
"$ref": "#/rules@
|
|
390866
|
+
"$ref": "#/rules@22"
|
|
390426
390867
|
},
|
|
390427
390868
|
"arguments": []
|
|
390428
390869
|
}
|
|
@@ -390446,7 +390887,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390446
390887
|
{
|
|
390447
390888
|
"$type": "RuleCall",
|
|
390448
390889
|
"rule": {
|
|
390449
|
-
"$ref": "#/rules@
|
|
390890
|
+
"$ref": "#/rules@20"
|
|
390450
390891
|
},
|
|
390451
390892
|
"arguments": []
|
|
390452
390893
|
},
|
|
@@ -390474,7 +390915,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390474
390915
|
"terminal": {
|
|
390475
390916
|
"$type": "RuleCall",
|
|
390476
390917
|
"rule": {
|
|
390477
|
-
"$ref": "#/rules@
|
|
390918
|
+
"$ref": "#/rules@22"
|
|
390478
390919
|
},
|
|
390479
390920
|
"arguments": []
|
|
390480
390921
|
}
|
|
@@ -390493,7 +390934,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390493
390934
|
"terminal": {
|
|
390494
390935
|
"$type": "RuleCall",
|
|
390495
390936
|
"rule": {
|
|
390496
|
-
"$ref": "#/rules@
|
|
390937
|
+
"$ref": "#/rules@22"
|
|
390497
390938
|
},
|
|
390498
390939
|
"arguments": []
|
|
390499
390940
|
}
|
|
@@ -390537,7 +390978,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390537
390978
|
"terminal": {
|
|
390538
390979
|
"$type": "RuleCall",
|
|
390539
390980
|
"rule": {
|
|
390540
|
-
"$ref": "#/rules@
|
|
390981
|
+
"$ref": "#/rules@60"
|
|
390541
390982
|
},
|
|
390542
390983
|
"arguments": []
|
|
390543
390984
|
}
|
|
@@ -390561,7 +391002,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390561
391002
|
"terminal": {
|
|
390562
391003
|
"$type": "RuleCall",
|
|
390563
391004
|
"rule": {
|
|
390564
|
-
"$ref": "#/rules@
|
|
391005
|
+
"$ref": "#/rules@61"
|
|
390565
391006
|
},
|
|
390566
391007
|
"arguments": []
|
|
390567
391008
|
}
|
|
@@ -390674,7 +391115,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390674
391115
|
"terminal": {
|
|
390675
391116
|
"$type": "RuleCall",
|
|
390676
391117
|
"rule": {
|
|
390677
|
-
"$ref": "#/rules@
|
|
391118
|
+
"$ref": "#/rules@60"
|
|
390678
391119
|
},
|
|
390679
391120
|
"arguments": []
|
|
390680
391121
|
}
|
|
@@ -390717,7 +391158,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390717
391158
|
"terminal": {
|
|
390718
391159
|
"$type": "RuleCall",
|
|
390719
391160
|
"rule": {
|
|
390720
|
-
"$ref": "#/rules@
|
|
391161
|
+
"$ref": "#/rules@14"
|
|
390721
391162
|
},
|
|
390722
391163
|
"arguments": []
|
|
390723
391164
|
}
|
|
@@ -390733,7 +391174,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390733
391174
|
"terminal": {
|
|
390734
391175
|
"$type": "RuleCall",
|
|
390735
391176
|
"rule": {
|
|
390736
|
-
"$ref": "#/rules@
|
|
391177
|
+
"$ref": "#/rules@14"
|
|
390737
391178
|
},
|
|
390738
391179
|
"arguments": []
|
|
390739
391180
|
}
|
|
@@ -390760,7 +391201,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390760
391201
|
"terminal": {
|
|
390761
391202
|
"$type": "RuleCall",
|
|
390762
391203
|
"rule": {
|
|
390763
|
-
"$ref": "#/rules@
|
|
391204
|
+
"$ref": "#/rules@60"
|
|
390764
391205
|
},
|
|
390765
391206
|
"arguments": []
|
|
390766
391207
|
}
|
|
@@ -390776,7 +391217,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390776
391217
|
"terminal": {
|
|
390777
391218
|
"$type": "RuleCall",
|
|
390778
391219
|
"rule": {
|
|
390779
|
-
"$ref": "#/rules@
|
|
391220
|
+
"$ref": "#/rules@60"
|
|
390780
391221
|
},
|
|
390781
391222
|
"arguments": []
|
|
390782
391223
|
}
|
|
@@ -390826,7 +391267,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390826
391267
|
"terminal": {
|
|
390827
391268
|
"$type": "RuleCall",
|
|
390828
391269
|
"rule": {
|
|
390829
|
-
"$ref": "#/rules@
|
|
391270
|
+
"$ref": "#/rules@60"
|
|
390830
391271
|
},
|
|
390831
391272
|
"arguments": []
|
|
390832
391273
|
}
|
|
@@ -390848,7 +391289,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390848
391289
|
"terminal": {
|
|
390849
391290
|
"$type": "RuleCall",
|
|
390850
391291
|
"rule": {
|
|
390851
|
-
"$ref": "#/rules@
|
|
391292
|
+
"$ref": "#/rules@60"
|
|
390852
391293
|
},
|
|
390853
391294
|
"arguments": []
|
|
390854
391295
|
}
|
|
@@ -390870,7 +391311,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390870
391311
|
"terminal": {
|
|
390871
391312
|
"$type": "RuleCall",
|
|
390872
391313
|
"rule": {
|
|
390873
|
-
"$ref": "#/rules@
|
|
391314
|
+
"$ref": "#/rules@60"
|
|
390874
391315
|
},
|
|
390875
391316
|
"arguments": []
|
|
390876
391317
|
}
|
|
@@ -390892,7 +391333,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390892
391333
|
"terminal": {
|
|
390893
391334
|
"$type": "RuleCall",
|
|
390894
391335
|
"rule": {
|
|
390895
|
-
"$ref": "#/rules@
|
|
391336
|
+
"$ref": "#/rules@60"
|
|
390896
391337
|
},
|
|
390897
391338
|
"arguments": []
|
|
390898
391339
|
}
|
|
@@ -390927,7 +391368,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390927
391368
|
"terminal": {
|
|
390928
391369
|
"$type": "RuleCall",
|
|
390929
391370
|
"rule": {
|
|
390930
|
-
"$ref": "#/rules@
|
|
391371
|
+
"$ref": "#/rules@61"
|
|
390931
391372
|
},
|
|
390932
391373
|
"arguments": []
|
|
390933
391374
|
}
|
|
@@ -390939,7 +391380,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390939
391380
|
"terminal": {
|
|
390940
391381
|
"$type": "RuleCall",
|
|
390941
391382
|
"rule": {
|
|
390942
|
-
"$ref": "#/rules@
|
|
391383
|
+
"$ref": "#/rules@61"
|
|
390943
391384
|
},
|
|
390944
391385
|
"arguments": []
|
|
390945
391386
|
}
|
|
@@ -390958,7 +391399,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390958
391399
|
"terminal": {
|
|
390959
391400
|
"$type": "RuleCall",
|
|
390960
391401
|
"rule": {
|
|
390961
|
-
"$ref": "#/rules@
|
|
391402
|
+
"$ref": "#/rules@61"
|
|
390962
391403
|
},
|
|
390963
391404
|
"arguments": []
|
|
390964
391405
|
}
|
|
@@ -390980,7 +391421,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
390980
391421
|
"terminal": {
|
|
390981
391422
|
"$type": "RuleCall",
|
|
390982
391423
|
"rule": {
|
|
390983
|
-
"$ref": "#/rules@
|
|
391424
|
+
"$ref": "#/rules@61"
|
|
390984
391425
|
},
|
|
390985
391426
|
"arguments": []
|
|
390986
391427
|
}
|
|
@@ -391011,11 +391452,33 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391011
391452
|
"terminal": {
|
|
391012
391453
|
"$type": "RuleCall",
|
|
391013
391454
|
"rule": {
|
|
391014
|
-
"$ref": "#/rules@
|
|
391455
|
+
"$ref": "#/rules@59"
|
|
391015
391456
|
},
|
|
391016
391457
|
"arguments": []
|
|
391017
391458
|
}
|
|
391018
391459
|
},
|
|
391460
|
+
{
|
|
391461
|
+
"$type": "Group",
|
|
391462
|
+
"elements": [
|
|
391463
|
+
{
|
|
391464
|
+
"$type": "Keyword",
|
|
391465
|
+
"value": "goal"
|
|
391466
|
+
},
|
|
391467
|
+
{
|
|
391468
|
+
"$type": "Assignment",
|
|
391469
|
+
"feature": "goal",
|
|
391470
|
+
"operator": "=",
|
|
391471
|
+
"terminal": {
|
|
391472
|
+
"$type": "RuleCall",
|
|
391473
|
+
"rule": {
|
|
391474
|
+
"$ref": "#/rules@61"
|
|
391475
|
+
},
|
|
391476
|
+
"arguments": []
|
|
391477
|
+
}
|
|
391478
|
+
}
|
|
391479
|
+
],
|
|
391480
|
+
"cardinality": "?"
|
|
391481
|
+
},
|
|
391019
391482
|
{
|
|
391020
391483
|
"$type": "Keyword",
|
|
391021
391484
|
"value": "{"
|
|
@@ -391027,7 +391490,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391027
391490
|
"terminal": {
|
|
391028
391491
|
"$type": "RuleCall",
|
|
391029
391492
|
"rule": {
|
|
391030
|
-
"$ref": "#/rules@
|
|
391493
|
+
"$ref": "#/rules@28"
|
|
391031
391494
|
},
|
|
391032
391495
|
"arguments": []
|
|
391033
391496
|
},
|
|
@@ -391043,7 +391506,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391043
391506
|
"terminal": {
|
|
391044
391507
|
"$type": "RuleCall",
|
|
391045
391508
|
"rule": {
|
|
391046
|
-
"$ref": "#/rules@
|
|
391509
|
+
"$ref": "#/rules@3"
|
|
391047
391510
|
},
|
|
391048
391511
|
"arguments": []
|
|
391049
391512
|
}
|
|
@@ -391055,7 +391518,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391055
391518
|
"terminal": {
|
|
391056
391519
|
"$type": "RuleCall",
|
|
391057
391520
|
"rule": {
|
|
391058
|
-
"$ref": "#/rules@
|
|
391521
|
+
"$ref": "#/rules@4"
|
|
391059
391522
|
},
|
|
391060
391523
|
"arguments": []
|
|
391061
391524
|
}
|
|
@@ -391070,7 +391533,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391070
391533
|
"terminal": {
|
|
391071
391534
|
"$type": "RuleCall",
|
|
391072
391535
|
"rule": {
|
|
391073
|
-
"$ref": "#/rules@
|
|
391536
|
+
"$ref": "#/rules@30"
|
|
391074
391537
|
},
|
|
391075
391538
|
"arguments": []
|
|
391076
391539
|
},
|
|
@@ -391103,7 +391566,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391103
391566
|
"terminal": {
|
|
391104
391567
|
"$type": "RuleCall",
|
|
391105
391568
|
"rule": {
|
|
391106
|
-
"$ref": "#/rules@
|
|
391569
|
+
"$ref": "#/rules@59"
|
|
391107
391570
|
},
|
|
391108
391571
|
"arguments": []
|
|
391109
391572
|
}
|
|
@@ -391122,7 +391585,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391122
391585
|
"terminal": {
|
|
391123
391586
|
"$type": "RuleCall",
|
|
391124
391587
|
"rule": {
|
|
391125
|
-
"$ref": "#/rules@
|
|
391588
|
+
"$ref": "#/rules@60"
|
|
391126
391589
|
},
|
|
391127
391590
|
"arguments": []
|
|
391128
391591
|
}
|
|
@@ -391144,7 +391607,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391144
391607
|
"terminal": {
|
|
391145
391608
|
"$type": "RuleCall",
|
|
391146
391609
|
"rule": {
|
|
391147
|
-
"$ref": "#/rules@
|
|
391610
|
+
"$ref": "#/rules@61"
|
|
391148
391611
|
},
|
|
391149
391612
|
"arguments": []
|
|
391150
391613
|
}
|
|
@@ -391175,7 +391638,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391175
391638
|
"terminal": {
|
|
391176
391639
|
"$type": "RuleCall",
|
|
391177
391640
|
"rule": {
|
|
391178
|
-
"$ref": "#/rules@
|
|
391641
|
+
"$ref": "#/rules@60"
|
|
391179
391642
|
},
|
|
391180
391643
|
"arguments": []
|
|
391181
391644
|
}
|
|
@@ -391187,7 +391650,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391187
391650
|
"terminal": {
|
|
391188
391651
|
"$type": "RuleCall",
|
|
391189
391652
|
"rule": {
|
|
391190
|
-
"$ref": "#/rules@
|
|
391653
|
+
"$ref": "#/rules@61"
|
|
391191
391654
|
},
|
|
391192
391655
|
"arguments": []
|
|
391193
391656
|
}
|
|
@@ -391206,7 +391669,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391206
391669
|
"terminal": {
|
|
391207
391670
|
"$type": "RuleCall",
|
|
391208
391671
|
"rule": {
|
|
391209
|
-
"$ref": "#/rules@
|
|
391672
|
+
"$ref": "#/rules@60"
|
|
391210
391673
|
},
|
|
391211
391674
|
"arguments": []
|
|
391212
391675
|
}
|
|
@@ -391228,7 +391691,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391228
391691
|
"terminal": {
|
|
391229
391692
|
"$type": "RuleCall",
|
|
391230
391693
|
"rule": {
|
|
391231
|
-
"$ref": "#/rules@
|
|
391694
|
+
"$ref": "#/rules@60"
|
|
391232
391695
|
},
|
|
391233
391696
|
"arguments": []
|
|
391234
391697
|
}
|
|
@@ -391250,7 +391713,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391250
391713
|
"terminal": {
|
|
391251
391714
|
"$type": "RuleCall",
|
|
391252
391715
|
"rule": {
|
|
391253
|
-
"$ref": "#/rules@
|
|
391716
|
+
"$ref": "#/rules@60"
|
|
391254
391717
|
},
|
|
391255
391718
|
"arguments": []
|
|
391256
391719
|
}
|
|
@@ -391269,7 +391732,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391269
391732
|
"terminal": {
|
|
391270
391733
|
"$type": "RuleCall",
|
|
391271
391734
|
"rule": {
|
|
391272
|
-
"$ref": "#/rules@
|
|
391735
|
+
"$ref": "#/rules@30"
|
|
391273
391736
|
},
|
|
391274
391737
|
"arguments": []
|
|
391275
391738
|
},
|
|
@@ -391294,91 +391757,91 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391294
391757
|
{
|
|
391295
391758
|
"$type": "RuleCall",
|
|
391296
391759
|
"rule": {
|
|
391297
|
-
"$ref": "#/rules@
|
|
391760
|
+
"$ref": "#/rules@32"
|
|
391298
391761
|
},
|
|
391299
391762
|
"arguments": []
|
|
391300
391763
|
},
|
|
391301
391764
|
{
|
|
391302
391765
|
"$type": "RuleCall",
|
|
391303
391766
|
"rule": {
|
|
391304
|
-
"$ref": "#/rules@
|
|
391767
|
+
"$ref": "#/rules@36"
|
|
391305
391768
|
},
|
|
391306
391769
|
"arguments": []
|
|
391307
391770
|
},
|
|
391308
391771
|
{
|
|
391309
391772
|
"$type": "RuleCall",
|
|
391310
391773
|
"rule": {
|
|
391311
|
-
"$ref": "#/rules@
|
|
391774
|
+
"$ref": "#/rules@37"
|
|
391312
391775
|
},
|
|
391313
391776
|
"arguments": []
|
|
391314
391777
|
},
|
|
391315
391778
|
{
|
|
391316
391779
|
"$type": "RuleCall",
|
|
391317
391780
|
"rule": {
|
|
391318
|
-
"$ref": "#/rules@
|
|
391781
|
+
"$ref": "#/rules@38"
|
|
391319
391782
|
},
|
|
391320
391783
|
"arguments": []
|
|
391321
391784
|
},
|
|
391322
391785
|
{
|
|
391323
391786
|
"$type": "RuleCall",
|
|
391324
391787
|
"rule": {
|
|
391325
|
-
"$ref": "#/rules@
|
|
391788
|
+
"$ref": "#/rules@39"
|
|
391326
391789
|
},
|
|
391327
391790
|
"arguments": []
|
|
391328
391791
|
},
|
|
391329
391792
|
{
|
|
391330
391793
|
"$type": "RuleCall",
|
|
391331
391794
|
"rule": {
|
|
391332
|
-
"$ref": "#/rules@
|
|
391795
|
+
"$ref": "#/rules@40"
|
|
391333
391796
|
},
|
|
391334
391797
|
"arguments": []
|
|
391335
391798
|
},
|
|
391336
391799
|
{
|
|
391337
391800
|
"$type": "RuleCall",
|
|
391338
391801
|
"rule": {
|
|
391339
|
-
"$ref": "#/rules@
|
|
391802
|
+
"$ref": "#/rules@41"
|
|
391340
391803
|
},
|
|
391341
391804
|
"arguments": []
|
|
391342
391805
|
},
|
|
391343
391806
|
{
|
|
391344
391807
|
"$type": "RuleCall",
|
|
391345
391808
|
"rule": {
|
|
391346
|
-
"$ref": "#/rules@
|
|
391809
|
+
"$ref": "#/rules@42"
|
|
391347
391810
|
},
|
|
391348
391811
|
"arguments": []
|
|
391349
391812
|
},
|
|
391350
391813
|
{
|
|
391351
391814
|
"$type": "RuleCall",
|
|
391352
391815
|
"rule": {
|
|
391353
|
-
"$ref": "#/rules@
|
|
391816
|
+
"$ref": "#/rules@43"
|
|
391354
391817
|
},
|
|
391355
391818
|
"arguments": []
|
|
391356
391819
|
},
|
|
391357
391820
|
{
|
|
391358
391821
|
"$type": "RuleCall",
|
|
391359
391822
|
"rule": {
|
|
391360
|
-
"$ref": "#/rules@
|
|
391823
|
+
"$ref": "#/rules@45"
|
|
391361
391824
|
},
|
|
391362
391825
|
"arguments": []
|
|
391363
391826
|
},
|
|
391364
391827
|
{
|
|
391365
391828
|
"$type": "RuleCall",
|
|
391366
391829
|
"rule": {
|
|
391367
|
-
"$ref": "#/rules@
|
|
391830
|
+
"$ref": "#/rules@50"
|
|
391368
391831
|
},
|
|
391369
391832
|
"arguments": []
|
|
391370
391833
|
},
|
|
391371
391834
|
{
|
|
391372
391835
|
"$type": "RuleCall",
|
|
391373
391836
|
"rule": {
|
|
391374
|
-
"$ref": "#/rules@
|
|
391837
|
+
"$ref": "#/rules@52"
|
|
391375
391838
|
},
|
|
391376
391839
|
"arguments": []
|
|
391377
391840
|
},
|
|
391378
391841
|
{
|
|
391379
391842
|
"$type": "RuleCall",
|
|
391380
391843
|
"rule": {
|
|
391381
|
-
"$ref": "#/rules@
|
|
391844
|
+
"$ref": "#/rules@19"
|
|
391382
391845
|
},
|
|
391383
391846
|
"arguments": []
|
|
391384
391847
|
}
|
|
@@ -391409,7 +391872,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391409
391872
|
"terminal": {
|
|
391410
391873
|
"$type": "RuleCall",
|
|
391411
391874
|
"rule": {
|
|
391412
|
-
"$ref": "#/rules@
|
|
391875
|
+
"$ref": "#/rules@14"
|
|
391413
391876
|
},
|
|
391414
391877
|
"arguments": []
|
|
391415
391878
|
}
|
|
@@ -391431,7 +391894,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391431
391894
|
"terminal": {
|
|
391432
391895
|
"$type": "RuleCall",
|
|
391433
391896
|
"rule": {
|
|
391434
|
-
"$ref": "#/rules@
|
|
391897
|
+
"$ref": "#/rules@14"
|
|
391435
391898
|
},
|
|
391436
391899
|
"arguments": []
|
|
391437
391900
|
}
|
|
@@ -391453,7 +391916,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391453
391916
|
"terminal": {
|
|
391454
391917
|
"$type": "RuleCall",
|
|
391455
391918
|
"rule": {
|
|
391456
|
-
"$ref": "#/rules@
|
|
391919
|
+
"$ref": "#/rules@61"
|
|
391457
391920
|
},
|
|
391458
391921
|
"arguments": []
|
|
391459
391922
|
}
|
|
@@ -391483,7 +391946,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391483
391946
|
"terminal": {
|
|
391484
391947
|
"$type": "RuleCall",
|
|
391485
391948
|
"rule": {
|
|
391486
|
-
"$ref": "#/rules@
|
|
391949
|
+
"$ref": "#/rules@59"
|
|
391487
391950
|
},
|
|
391488
391951
|
"arguments": []
|
|
391489
391952
|
}
|
|
@@ -391503,7 +391966,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391503
391966
|
"terminal": {
|
|
391504
391967
|
"$type": "RuleCall",
|
|
391505
391968
|
"rule": {
|
|
391506
|
-
"$ref": "#/rules@
|
|
391969
|
+
"$ref": "#/rules@14"
|
|
391507
391970
|
},
|
|
391508
391971
|
"arguments": []
|
|
391509
391972
|
}
|
|
@@ -391519,7 +391982,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391519
391982
|
"terminal": {
|
|
391520
391983
|
"$type": "RuleCall",
|
|
391521
391984
|
"rule": {
|
|
391522
|
-
"$ref": "#/rules@
|
|
391985
|
+
"$ref": "#/rules@14"
|
|
391523
391986
|
},
|
|
391524
391987
|
"arguments": []
|
|
391525
391988
|
}
|
|
@@ -391543,7 +392006,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391543
392006
|
"terminal": {
|
|
391544
392007
|
"$type": "RuleCall",
|
|
391545
392008
|
"rule": {
|
|
391546
|
-
"$ref": "#/rules@
|
|
392009
|
+
"$ref": "#/rules@14"
|
|
391547
392010
|
},
|
|
391548
392011
|
"arguments": []
|
|
391549
392012
|
}
|
|
@@ -391559,7 +392022,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391559
392022
|
"terminal": {
|
|
391560
392023
|
"$type": "RuleCall",
|
|
391561
392024
|
"rule": {
|
|
391562
|
-
"$ref": "#/rules@
|
|
392025
|
+
"$ref": "#/rules@14"
|
|
391563
392026
|
},
|
|
391564
392027
|
"arguments": []
|
|
391565
392028
|
}
|
|
@@ -391582,7 +392045,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391582
392045
|
"terminal": {
|
|
391583
392046
|
"$type": "RuleCall",
|
|
391584
392047
|
"rule": {
|
|
391585
|
-
"$ref": "#/rules@
|
|
392048
|
+
"$ref": "#/rules@14"
|
|
391586
392049
|
},
|
|
391587
392050
|
"arguments": []
|
|
391588
392051
|
}
|
|
@@ -391593,7 +392056,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391593
392056
|
{
|
|
391594
392057
|
"$type": "RuleCall",
|
|
391595
392058
|
"rule": {
|
|
391596
|
-
"$ref": "#/rules@
|
|
392059
|
+
"$ref": "#/rules@31"
|
|
391597
392060
|
},
|
|
391598
392061
|
"arguments": []
|
|
391599
392062
|
},
|
|
@@ -391611,7 +392074,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391611
392074
|
"terminal": {
|
|
391612
392075
|
"$type": "RuleCall",
|
|
391613
392076
|
"rule": {
|
|
391614
|
-
"$ref": "#/rules@
|
|
392077
|
+
"$ref": "#/rules@61"
|
|
391615
392078
|
},
|
|
391616
392079
|
"arguments": []
|
|
391617
392080
|
}
|
|
@@ -391636,7 +392099,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391636
392099
|
"terminal": {
|
|
391637
392100
|
"$type": "RuleCall",
|
|
391638
392101
|
"rule": {
|
|
391639
|
-
"$ref": "#/rules@
|
|
392102
|
+
"$ref": "#/rules@33"
|
|
391640
392103
|
},
|
|
391641
392104
|
"arguments": []
|
|
391642
392105
|
}
|
|
@@ -391648,7 +392111,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391648
392111
|
"terminal": {
|
|
391649
392112
|
"$type": "RuleCall",
|
|
391650
392113
|
"rule": {
|
|
391651
|
-
"$ref": "#/rules@
|
|
392114
|
+
"$ref": "#/rules@46"
|
|
391652
392115
|
},
|
|
391653
392116
|
"arguments": []
|
|
391654
392117
|
}
|
|
@@ -391686,7 +392149,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391686
392149
|
"terminal": {
|
|
391687
392150
|
"$type": "RuleCall",
|
|
391688
392151
|
"rule": {
|
|
391689
|
-
"$ref": "#/rules@
|
|
392152
|
+
"$ref": "#/rules@35"
|
|
391690
392153
|
},
|
|
391691
392154
|
"arguments": []
|
|
391692
392155
|
}
|
|
@@ -391698,7 +392161,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391698
392161
|
"terminal": {
|
|
391699
392162
|
"$type": "RuleCall",
|
|
391700
392163
|
"rule": {
|
|
391701
|
-
"$ref": "#/rules@
|
|
392164
|
+
"$ref": "#/rules@35"
|
|
391702
392165
|
},
|
|
391703
392166
|
"arguments": []
|
|
391704
392167
|
},
|
|
@@ -391718,7 +392181,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391718
392181
|
"terminal": {
|
|
391719
392182
|
"$type": "RuleCall",
|
|
391720
392183
|
"rule": {
|
|
391721
|
-
"$ref": "#/rules@
|
|
392184
|
+
"$ref": "#/rules@14"
|
|
391722
392185
|
},
|
|
391723
392186
|
"arguments": []
|
|
391724
392187
|
}
|
|
@@ -391740,7 +392203,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391740
392203
|
"terminal": {
|
|
391741
392204
|
"$type": "RuleCall",
|
|
391742
392205
|
"rule": {
|
|
391743
|
-
"$ref": "#/rules@
|
|
392206
|
+
"$ref": "#/rules@14"
|
|
391744
392207
|
},
|
|
391745
392208
|
"arguments": []
|
|
391746
392209
|
}
|
|
@@ -391762,7 +392225,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391762
392225
|
"terminal": {
|
|
391763
392226
|
"$type": "RuleCall",
|
|
391764
392227
|
"rule": {
|
|
391765
|
-
"$ref": "#/rules@
|
|
392228
|
+
"$ref": "#/rules@34"
|
|
391766
392229
|
},
|
|
391767
392230
|
"arguments": []
|
|
391768
392231
|
},
|
|
@@ -391812,7 +392275,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391812
392275
|
"terminal": {
|
|
391813
392276
|
"$type": "RuleCall",
|
|
391814
392277
|
"rule": {
|
|
391815
|
-
"$ref": "#/rules@
|
|
392278
|
+
"$ref": "#/rules@59"
|
|
391816
392279
|
},
|
|
391817
392280
|
"arguments": []
|
|
391818
392281
|
}
|
|
@@ -391828,7 +392291,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391828
392291
|
"terminal": {
|
|
391829
392292
|
"$type": "RuleCall",
|
|
391830
392293
|
"rule": {
|
|
391831
|
-
"$ref": "#/rules@
|
|
392294
|
+
"$ref": "#/rules@14"
|
|
391832
392295
|
},
|
|
391833
392296
|
"arguments": []
|
|
391834
392297
|
}
|
|
@@ -391848,7 +392311,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391848
392311
|
"terminal": {
|
|
391849
392312
|
"$type": "RuleCall",
|
|
391850
392313
|
"rule": {
|
|
391851
|
-
"$ref": "#/rules@
|
|
392314
|
+
"$ref": "#/rules@14"
|
|
391852
392315
|
},
|
|
391853
392316
|
"arguments": []
|
|
391854
392317
|
}
|
|
@@ -391864,7 +392327,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391864
392327
|
"terminal": {
|
|
391865
392328
|
"$type": "RuleCall",
|
|
391866
392329
|
"rule": {
|
|
391867
|
-
"$ref": "#/rules@
|
|
392330
|
+
"$ref": "#/rules@14"
|
|
391868
392331
|
},
|
|
391869
392332
|
"arguments": []
|
|
391870
392333
|
}
|
|
@@ -391887,7 +392350,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391887
392350
|
"terminal": {
|
|
391888
392351
|
"$type": "RuleCall",
|
|
391889
392352
|
"rule": {
|
|
391890
|
-
"$ref": "#/rules@
|
|
392353
|
+
"$ref": "#/rules@14"
|
|
391891
392354
|
},
|
|
391892
392355
|
"arguments": []
|
|
391893
392356
|
}
|
|
@@ -391957,7 +392420,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391957
392420
|
"terminal": {
|
|
391958
392421
|
"$type": "RuleCall",
|
|
391959
392422
|
"rule": {
|
|
391960
|
-
"$ref": "#/rules@
|
|
392423
|
+
"$ref": "#/rules@59"
|
|
391961
392424
|
},
|
|
391962
392425
|
"arguments": []
|
|
391963
392426
|
}
|
|
@@ -391977,7 +392440,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391977
392440
|
"terminal": {
|
|
391978
392441
|
"$type": "RuleCall",
|
|
391979
392442
|
"rule": {
|
|
391980
|
-
"$ref": "#/rules@
|
|
392443
|
+
"$ref": "#/rules@14"
|
|
391981
392444
|
},
|
|
391982
392445
|
"arguments": []
|
|
391983
392446
|
}
|
|
@@ -391993,7 +392456,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
391993
392456
|
"terminal": {
|
|
391994
392457
|
"$type": "RuleCall",
|
|
391995
392458
|
"rule": {
|
|
391996
|
-
"$ref": "#/rules@
|
|
392459
|
+
"$ref": "#/rules@14"
|
|
391997
392460
|
},
|
|
391998
392461
|
"arguments": []
|
|
391999
392462
|
}
|
|
@@ -392017,7 +392480,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392017
392480
|
"terminal": {
|
|
392018
392481
|
"$type": "RuleCall",
|
|
392019
392482
|
"rule": {
|
|
392020
|
-
"$ref": "#/rules@
|
|
392483
|
+
"$ref": "#/rules@14"
|
|
392021
392484
|
},
|
|
392022
392485
|
"arguments": []
|
|
392023
392486
|
}
|
|
@@ -392033,7 +392496,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392033
392496
|
"terminal": {
|
|
392034
392497
|
"$type": "RuleCall",
|
|
392035
392498
|
"rule": {
|
|
392036
|
-
"$ref": "#/rules@
|
|
392499
|
+
"$ref": "#/rules@14"
|
|
392037
392500
|
},
|
|
392038
392501
|
"arguments": []
|
|
392039
392502
|
}
|
|
@@ -392056,7 +392519,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392056
392519
|
"terminal": {
|
|
392057
392520
|
"$type": "RuleCall",
|
|
392058
392521
|
"rule": {
|
|
392059
|
-
"$ref": "#/rules@
|
|
392522
|
+
"$ref": "#/rules@14"
|
|
392060
392523
|
},
|
|
392061
392524
|
"arguments": []
|
|
392062
392525
|
}
|
|
@@ -392078,7 +392541,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392078
392541
|
"terminal": {
|
|
392079
392542
|
"$type": "RuleCall",
|
|
392080
392543
|
"rule": {
|
|
392081
|
-
"$ref": "#/rules@
|
|
392544
|
+
"$ref": "#/rules@14"
|
|
392082
392545
|
},
|
|
392083
392546
|
"arguments": []
|
|
392084
392547
|
}
|
|
@@ -392100,7 +392563,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392100
392563
|
"terminal": {
|
|
392101
392564
|
"$type": "RuleCall",
|
|
392102
392565
|
"rule": {
|
|
392103
|
-
"$ref": "#/rules@
|
|
392566
|
+
"$ref": "#/rules@35"
|
|
392104
392567
|
},
|
|
392105
392568
|
"arguments": []
|
|
392106
392569
|
}
|
|
@@ -392111,7 +392574,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392111
392574
|
{
|
|
392112
392575
|
"$type": "RuleCall",
|
|
392113
392576
|
"rule": {
|
|
392114
|
-
"$ref": "#/rules@
|
|
392577
|
+
"$ref": "#/rules@31"
|
|
392115
392578
|
},
|
|
392116
392579
|
"arguments": []
|
|
392117
392580
|
},
|
|
@@ -392129,7 +392592,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392129
392592
|
"terminal": {
|
|
392130
392593
|
"$type": "RuleCall",
|
|
392131
392594
|
"rule": {
|
|
392132
|
-
"$ref": "#/rules@
|
|
392595
|
+
"$ref": "#/rules@61"
|
|
392133
392596
|
},
|
|
392134
392597
|
"arguments": []
|
|
392135
392598
|
}
|
|
@@ -392151,7 +392614,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392151
392614
|
"terminal": {
|
|
392152
392615
|
"$type": "RuleCall",
|
|
392153
392616
|
"rule": {
|
|
392154
|
-
"$ref": "#/rules@
|
|
392617
|
+
"$ref": "#/rules@34"
|
|
392155
392618
|
},
|
|
392156
392619
|
"arguments": []
|
|
392157
392620
|
},
|
|
@@ -392187,7 +392650,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392187
392650
|
"terminal": {
|
|
392188
392651
|
"$type": "RuleCall",
|
|
392189
392652
|
"rule": {
|
|
392190
|
-
"$ref": "#/rules@
|
|
392653
|
+
"$ref": "#/rules@59"
|
|
392191
392654
|
},
|
|
392192
392655
|
"arguments": []
|
|
392193
392656
|
}
|
|
@@ -392207,7 +392670,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392207
392670
|
"terminal": {
|
|
392208
392671
|
"$type": "RuleCall",
|
|
392209
392672
|
"rule": {
|
|
392210
|
-
"$ref": "#/rules@
|
|
392673
|
+
"$ref": "#/rules@14"
|
|
392211
392674
|
},
|
|
392212
392675
|
"arguments": []
|
|
392213
392676
|
}
|
|
@@ -392223,7 +392686,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392223
392686
|
"terminal": {
|
|
392224
392687
|
"$type": "RuleCall",
|
|
392225
392688
|
"rule": {
|
|
392226
|
-
"$ref": "#/rules@
|
|
392689
|
+
"$ref": "#/rules@14"
|
|
392227
392690
|
},
|
|
392228
392691
|
"arguments": []
|
|
392229
392692
|
}
|
|
@@ -392247,7 +392710,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392247
392710
|
"terminal": {
|
|
392248
392711
|
"$type": "RuleCall",
|
|
392249
392712
|
"rule": {
|
|
392250
|
-
"$ref": "#/rules@
|
|
392713
|
+
"$ref": "#/rules@14"
|
|
392251
392714
|
},
|
|
392252
392715
|
"arguments": []
|
|
392253
392716
|
}
|
|
@@ -392263,7 +392726,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392263
392726
|
"terminal": {
|
|
392264
392727
|
"$type": "RuleCall",
|
|
392265
392728
|
"rule": {
|
|
392266
|
-
"$ref": "#/rules@
|
|
392729
|
+
"$ref": "#/rules@14"
|
|
392267
392730
|
},
|
|
392268
392731
|
"arguments": []
|
|
392269
392732
|
}
|
|
@@ -392286,7 +392749,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392286
392749
|
"terminal": {
|
|
392287
392750
|
"$type": "RuleCall",
|
|
392288
392751
|
"rule": {
|
|
392289
|
-
"$ref": "#/rules@
|
|
392752
|
+
"$ref": "#/rules@14"
|
|
392290
392753
|
},
|
|
392291
392754
|
"arguments": []
|
|
392292
392755
|
}
|
|
@@ -392297,7 +392760,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392297
392760
|
{
|
|
392298
392761
|
"$type": "RuleCall",
|
|
392299
392762
|
"rule": {
|
|
392300
|
-
"$ref": "#/rules@
|
|
392763
|
+
"$ref": "#/rules@31"
|
|
392301
392764
|
},
|
|
392302
392765
|
"arguments": []
|
|
392303
392766
|
}
|
|
@@ -392331,7 +392794,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392331
392794
|
"terminal": {
|
|
392332
392795
|
"$type": "RuleCall",
|
|
392333
392796
|
"rule": {
|
|
392334
|
-
"$ref": "#/rules@
|
|
392797
|
+
"$ref": "#/rules@61"
|
|
392335
392798
|
},
|
|
392336
392799
|
"arguments": []
|
|
392337
392800
|
}
|
|
@@ -392354,7 +392817,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392354
392817
|
"terminal": {
|
|
392355
392818
|
"$type": "RuleCall",
|
|
392356
392819
|
"rule": {
|
|
392357
|
-
"$ref": "#/rules@
|
|
392820
|
+
"$ref": "#/rules@14"
|
|
392358
392821
|
},
|
|
392359
392822
|
"arguments": []
|
|
392360
392823
|
}
|
|
@@ -392370,7 +392833,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392370
392833
|
"terminal": {
|
|
392371
392834
|
"$type": "RuleCall",
|
|
392372
392835
|
"rule": {
|
|
392373
|
-
"$ref": "#/rules@
|
|
392836
|
+
"$ref": "#/rules@14"
|
|
392374
392837
|
},
|
|
392375
392838
|
"arguments": []
|
|
392376
392839
|
}
|
|
@@ -392394,7 +392857,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392394
392857
|
"terminal": {
|
|
392395
392858
|
"$type": "RuleCall",
|
|
392396
392859
|
"rule": {
|
|
392397
|
-
"$ref": "#/rules@
|
|
392860
|
+
"$ref": "#/rules@14"
|
|
392398
392861
|
},
|
|
392399
392862
|
"arguments": []
|
|
392400
392863
|
}
|
|
@@ -392410,7 +392873,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392410
392873
|
"terminal": {
|
|
392411
392874
|
"$type": "RuleCall",
|
|
392412
392875
|
"rule": {
|
|
392413
|
-
"$ref": "#/rules@
|
|
392876
|
+
"$ref": "#/rules@14"
|
|
392414
392877
|
},
|
|
392415
392878
|
"arguments": []
|
|
392416
392879
|
}
|
|
@@ -392433,7 +392896,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392433
392896
|
"terminal": {
|
|
392434
392897
|
"$type": "RuleCall",
|
|
392435
392898
|
"rule": {
|
|
392436
|
-
"$ref": "#/rules@
|
|
392899
|
+
"$ref": "#/rules@14"
|
|
392437
392900
|
},
|
|
392438
392901
|
"arguments": []
|
|
392439
392902
|
}
|
|
@@ -392444,7 +392907,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392444
392907
|
{
|
|
392445
392908
|
"$type": "RuleCall",
|
|
392446
392909
|
"rule": {
|
|
392447
|
-
"$ref": "#/rules@
|
|
392910
|
+
"$ref": "#/rules@31"
|
|
392448
392911
|
},
|
|
392449
392912
|
"arguments": []
|
|
392450
392913
|
}
|
|
@@ -392478,7 +392941,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392478
392941
|
"terminal": {
|
|
392479
392942
|
"$type": "RuleCall",
|
|
392480
392943
|
"rule": {
|
|
392481
|
-
"$ref": "#/rules@
|
|
392944
|
+
"$ref": "#/rules@61"
|
|
392482
392945
|
},
|
|
392483
392946
|
"arguments": []
|
|
392484
392947
|
}
|
|
@@ -392501,7 +392964,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392501
392964
|
"terminal": {
|
|
392502
392965
|
"$type": "RuleCall",
|
|
392503
392966
|
"rule": {
|
|
392504
|
-
"$ref": "#/rules@
|
|
392967
|
+
"$ref": "#/rules@14"
|
|
392505
392968
|
},
|
|
392506
392969
|
"arguments": []
|
|
392507
392970
|
}
|
|
@@ -392517,7 +392980,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392517
392980
|
"terminal": {
|
|
392518
392981
|
"$type": "RuleCall",
|
|
392519
392982
|
"rule": {
|
|
392520
|
-
"$ref": "#/rules@
|
|
392983
|
+
"$ref": "#/rules@14"
|
|
392521
392984
|
},
|
|
392522
392985
|
"arguments": []
|
|
392523
392986
|
}
|
|
@@ -392541,7 +393004,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392541
393004
|
"terminal": {
|
|
392542
393005
|
"$type": "RuleCall",
|
|
392543
393006
|
"rule": {
|
|
392544
|
-
"$ref": "#/rules@
|
|
393007
|
+
"$ref": "#/rules@14"
|
|
392545
393008
|
},
|
|
392546
393009
|
"arguments": []
|
|
392547
393010
|
}
|
|
@@ -392557,7 +393020,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392557
393020
|
"terminal": {
|
|
392558
393021
|
"$type": "RuleCall",
|
|
392559
393022
|
"rule": {
|
|
392560
|
-
"$ref": "#/rules@
|
|
393023
|
+
"$ref": "#/rules@14"
|
|
392561
393024
|
},
|
|
392562
393025
|
"arguments": []
|
|
392563
393026
|
}
|
|
@@ -392580,7 +393043,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392580
393043
|
"terminal": {
|
|
392581
393044
|
"$type": "RuleCall",
|
|
392582
393045
|
"rule": {
|
|
392583
|
-
"$ref": "#/rules@
|
|
393046
|
+
"$ref": "#/rules@14"
|
|
392584
393047
|
},
|
|
392585
393048
|
"arguments": []
|
|
392586
393049
|
}
|
|
@@ -392591,7 +393054,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392591
393054
|
{
|
|
392592
393055
|
"$type": "RuleCall",
|
|
392593
393056
|
"rule": {
|
|
392594
|
-
"$ref": "#/rules@
|
|
393057
|
+
"$ref": "#/rules@31"
|
|
392595
393058
|
},
|
|
392596
393059
|
"arguments": []
|
|
392597
393060
|
}
|
|
@@ -392625,7 +393088,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392625
393088
|
"terminal": {
|
|
392626
393089
|
"$type": "RuleCall",
|
|
392627
393090
|
"rule": {
|
|
392628
|
-
"$ref": "#/rules@
|
|
393091
|
+
"$ref": "#/rules@61"
|
|
392629
393092
|
},
|
|
392630
393093
|
"arguments": []
|
|
392631
393094
|
}
|
|
@@ -392648,7 +393111,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392648
393111
|
"terminal": {
|
|
392649
393112
|
"$type": "RuleCall",
|
|
392650
393113
|
"rule": {
|
|
392651
|
-
"$ref": "#/rules@
|
|
393114
|
+
"$ref": "#/rules@14"
|
|
392652
393115
|
},
|
|
392653
393116
|
"arguments": []
|
|
392654
393117
|
}
|
|
@@ -392664,7 +393127,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392664
393127
|
"terminal": {
|
|
392665
393128
|
"$type": "RuleCall",
|
|
392666
393129
|
"rule": {
|
|
392667
|
-
"$ref": "#/rules@
|
|
393130
|
+
"$ref": "#/rules@14"
|
|
392668
393131
|
},
|
|
392669
393132
|
"arguments": []
|
|
392670
393133
|
}
|
|
@@ -392688,7 +393151,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392688
393151
|
"terminal": {
|
|
392689
393152
|
"$type": "RuleCall",
|
|
392690
393153
|
"rule": {
|
|
392691
|
-
"$ref": "#/rules@
|
|
393154
|
+
"$ref": "#/rules@14"
|
|
392692
393155
|
},
|
|
392693
393156
|
"arguments": []
|
|
392694
393157
|
}
|
|
@@ -392704,7 +393167,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392704
393167
|
"terminal": {
|
|
392705
393168
|
"$type": "RuleCall",
|
|
392706
393169
|
"rule": {
|
|
392707
|
-
"$ref": "#/rules@
|
|
393170
|
+
"$ref": "#/rules@14"
|
|
392708
393171
|
},
|
|
392709
393172
|
"arguments": []
|
|
392710
393173
|
}
|
|
@@ -392724,7 +393187,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392724
393187
|
"terminal": {
|
|
392725
393188
|
"$type": "RuleCall",
|
|
392726
393189
|
"rule": {
|
|
392727
|
-
"$ref": "#/rules@
|
|
393190
|
+
"$ref": "#/rules@14"
|
|
392728
393191
|
},
|
|
392729
393192
|
"arguments": []
|
|
392730
393193
|
}
|
|
@@ -392732,7 +393195,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392732
393195
|
{
|
|
392733
393196
|
"$type": "RuleCall",
|
|
392734
393197
|
"rule": {
|
|
392735
|
-
"$ref": "#/rules@
|
|
393198
|
+
"$ref": "#/rules@31"
|
|
392736
393199
|
},
|
|
392737
393200
|
"arguments": []
|
|
392738
393201
|
},
|
|
@@ -392750,7 +393213,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392750
393213
|
"terminal": {
|
|
392751
393214
|
"$type": "RuleCall",
|
|
392752
393215
|
"rule": {
|
|
392753
|
-
"$ref": "#/rules@
|
|
393216
|
+
"$ref": "#/rules@61"
|
|
392754
393217
|
},
|
|
392755
393218
|
"arguments": []
|
|
392756
393219
|
}
|
|
@@ -392788,7 +393251,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392788
393251
|
"terminal": {
|
|
392789
393252
|
"$type": "RuleCall",
|
|
392790
393253
|
"rule": {
|
|
392791
|
-
"$ref": "#/rules@
|
|
393254
|
+
"$ref": "#/rules@61"
|
|
392792
393255
|
},
|
|
392793
393256
|
"arguments": []
|
|
392794
393257
|
}
|
|
@@ -392811,7 +393274,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392811
393274
|
"terminal": {
|
|
392812
393275
|
"$type": "RuleCall",
|
|
392813
393276
|
"rule": {
|
|
392814
|
-
"$ref": "#/rules@
|
|
393277
|
+
"$ref": "#/rules@14"
|
|
392815
393278
|
},
|
|
392816
393279
|
"arguments": []
|
|
392817
393280
|
}
|
|
@@ -392827,7 +393290,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392827
393290
|
"terminal": {
|
|
392828
393291
|
"$type": "RuleCall",
|
|
392829
393292
|
"rule": {
|
|
392830
|
-
"$ref": "#/rules@
|
|
393293
|
+
"$ref": "#/rules@14"
|
|
392831
393294
|
},
|
|
392832
393295
|
"arguments": []
|
|
392833
393296
|
}
|
|
@@ -392851,7 +393314,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392851
393314
|
"terminal": {
|
|
392852
393315
|
"$type": "RuleCall",
|
|
392853
393316
|
"rule": {
|
|
392854
|
-
"$ref": "#/rules@
|
|
393317
|
+
"$ref": "#/rules@14"
|
|
392855
393318
|
},
|
|
392856
393319
|
"arguments": []
|
|
392857
393320
|
}
|
|
@@ -392867,7 +393330,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392867
393330
|
"terminal": {
|
|
392868
393331
|
"$type": "RuleCall",
|
|
392869
393332
|
"rule": {
|
|
392870
|
-
"$ref": "#/rules@
|
|
393333
|
+
"$ref": "#/rules@14"
|
|
392871
393334
|
},
|
|
392872
393335
|
"arguments": []
|
|
392873
393336
|
}
|
|
@@ -392890,7 +393353,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392890
393353
|
"terminal": {
|
|
392891
393354
|
"$type": "RuleCall",
|
|
392892
393355
|
"rule": {
|
|
392893
|
-
"$ref": "#/rules@
|
|
393356
|
+
"$ref": "#/rules@14"
|
|
392894
393357
|
},
|
|
392895
393358
|
"arguments": []
|
|
392896
393359
|
}
|
|
@@ -392901,7 +393364,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392901
393364
|
{
|
|
392902
393365
|
"$type": "RuleCall",
|
|
392903
393366
|
"rule": {
|
|
392904
|
-
"$ref": "#/rules@
|
|
393367
|
+
"$ref": "#/rules@31"
|
|
392905
393368
|
},
|
|
392906
393369
|
"arguments": []
|
|
392907
393370
|
},
|
|
@@ -392919,7 +393382,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392919
393382
|
"terminal": {
|
|
392920
393383
|
"$type": "RuleCall",
|
|
392921
393384
|
"rule": {
|
|
392922
|
-
"$ref": "#/rules@
|
|
393385
|
+
"$ref": "#/rules@61"
|
|
392923
393386
|
},
|
|
392924
393387
|
"arguments": []
|
|
392925
393388
|
}
|
|
@@ -392957,7 +393420,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392957
393420
|
"terminal": {
|
|
392958
393421
|
"$type": "RuleCall",
|
|
392959
393422
|
"rule": {
|
|
392960
|
-
"$ref": "#/rules@
|
|
393423
|
+
"$ref": "#/rules@61"
|
|
392961
393424
|
},
|
|
392962
393425
|
"arguments": []
|
|
392963
393426
|
}
|
|
@@ -392980,7 +393443,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392980
393443
|
"terminal": {
|
|
392981
393444
|
"$type": "RuleCall",
|
|
392982
393445
|
"rule": {
|
|
392983
|
-
"$ref": "#/rules@
|
|
393446
|
+
"$ref": "#/rules@14"
|
|
392984
393447
|
},
|
|
392985
393448
|
"arguments": []
|
|
392986
393449
|
}
|
|
@@ -392996,7 +393459,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
392996
393459
|
"terminal": {
|
|
392997
393460
|
"$type": "RuleCall",
|
|
392998
393461
|
"rule": {
|
|
392999
|
-
"$ref": "#/rules@
|
|
393462
|
+
"$ref": "#/rules@14"
|
|
393000
393463
|
},
|
|
393001
393464
|
"arguments": []
|
|
393002
393465
|
}
|
|
@@ -393020,7 +393483,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393020
393483
|
"terminal": {
|
|
393021
393484
|
"$type": "RuleCall",
|
|
393022
393485
|
"rule": {
|
|
393023
|
-
"$ref": "#/rules@
|
|
393486
|
+
"$ref": "#/rules@14"
|
|
393024
393487
|
},
|
|
393025
393488
|
"arguments": []
|
|
393026
393489
|
}
|
|
@@ -393036,7 +393499,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393036
393499
|
"terminal": {
|
|
393037
393500
|
"$type": "RuleCall",
|
|
393038
393501
|
"rule": {
|
|
393039
|
-
"$ref": "#/rules@
|
|
393502
|
+
"$ref": "#/rules@14"
|
|
393040
393503
|
},
|
|
393041
393504
|
"arguments": []
|
|
393042
393505
|
}
|
|
@@ -393052,7 +393515,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393052
393515
|
"terminal": {
|
|
393053
393516
|
"$type": "RuleCall",
|
|
393054
393517
|
"rule": {
|
|
393055
|
-
"$ref": "#/rules@
|
|
393518
|
+
"$ref": "#/rules@14"
|
|
393056
393519
|
},
|
|
393057
393520
|
"arguments": []
|
|
393058
393521
|
}
|
|
@@ -393072,7 +393535,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393072
393535
|
"terminal": {
|
|
393073
393536
|
"$type": "RuleCall",
|
|
393074
393537
|
"rule": {
|
|
393075
|
-
"$ref": "#/rules@
|
|
393538
|
+
"$ref": "#/rules@35"
|
|
393076
393539
|
},
|
|
393077
393540
|
"arguments": []
|
|
393078
393541
|
}
|
|
@@ -393091,7 +393554,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393091
393554
|
"terminal": {
|
|
393092
393555
|
"$type": "RuleCall",
|
|
393093
393556
|
"rule": {
|
|
393094
|
-
"$ref": "#/rules@
|
|
393557
|
+
"$ref": "#/rules@14"
|
|
393095
393558
|
},
|
|
393096
393559
|
"arguments": []
|
|
393097
393560
|
}
|
|
@@ -393113,7 +393576,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393113
393576
|
"terminal": {
|
|
393114
393577
|
"$type": "RuleCall",
|
|
393115
393578
|
"rule": {
|
|
393116
|
-
"$ref": "#/rules@
|
|
393579
|
+
"$ref": "#/rules@14"
|
|
393117
393580
|
},
|
|
393118
393581
|
"arguments": []
|
|
393119
393582
|
}
|
|
@@ -393135,7 +393598,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393135
393598
|
"terminal": {
|
|
393136
393599
|
"$type": "RuleCall",
|
|
393137
393600
|
"rule": {
|
|
393138
|
-
"$ref": "#/rules@
|
|
393601
|
+
"$ref": "#/rules@14"
|
|
393139
393602
|
},
|
|
393140
393603
|
"arguments": []
|
|
393141
393604
|
}
|
|
@@ -393157,7 +393620,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393157
393620
|
"terminal": {
|
|
393158
393621
|
"$type": "RuleCall",
|
|
393159
393622
|
"rule": {
|
|
393160
|
-
"$ref": "#/rules@
|
|
393623
|
+
"$ref": "#/rules@14"
|
|
393161
393624
|
},
|
|
393162
393625
|
"arguments": []
|
|
393163
393626
|
}
|
|
@@ -393207,7 +393670,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393207
393670
|
"terminal": {
|
|
393208
393671
|
"$type": "RuleCall",
|
|
393209
393672
|
"rule": {
|
|
393210
|
-
"$ref": "#/rules@
|
|
393673
|
+
"$ref": "#/rules@14"
|
|
393211
393674
|
},
|
|
393212
393675
|
"arguments": []
|
|
393213
393676
|
}
|
|
@@ -393218,7 +393681,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393218
393681
|
{
|
|
393219
393682
|
"$type": "RuleCall",
|
|
393220
393683
|
"rule": {
|
|
393221
|
-
"$ref": "#/rules@
|
|
393684
|
+
"$ref": "#/rules@31"
|
|
393222
393685
|
},
|
|
393223
393686
|
"arguments": []
|
|
393224
393687
|
},
|
|
@@ -393236,7 +393699,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393236
393699
|
"terminal": {
|
|
393237
393700
|
"$type": "RuleCall",
|
|
393238
393701
|
"rule": {
|
|
393239
|
-
"$ref": "#/rules@
|
|
393702
|
+
"$ref": "#/rules@61"
|
|
393240
393703
|
},
|
|
393241
393704
|
"arguments": []
|
|
393242
393705
|
}
|
|
@@ -393274,7 +393737,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393274
393737
|
"terminal": {
|
|
393275
393738
|
"$type": "RuleCall",
|
|
393276
393739
|
"rule": {
|
|
393277
|
-
"$ref": "#/rules@
|
|
393740
|
+
"$ref": "#/rules@61"
|
|
393278
393741
|
},
|
|
393279
393742
|
"arguments": []
|
|
393280
393743
|
}
|
|
@@ -393297,7 +393760,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393297
393760
|
"terminal": {
|
|
393298
393761
|
"$type": "RuleCall",
|
|
393299
393762
|
"rule": {
|
|
393300
|
-
"$ref": "#/rules@
|
|
393763
|
+
"$ref": "#/rules@44"
|
|
393301
393764
|
},
|
|
393302
393765
|
"arguments": []
|
|
393303
393766
|
}
|
|
@@ -393316,7 +393779,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393316
393779
|
"terminal": {
|
|
393317
393780
|
"$type": "RuleCall",
|
|
393318
393781
|
"rule": {
|
|
393319
|
-
"$ref": "#/rules@
|
|
393782
|
+
"$ref": "#/rules@44"
|
|
393320
393783
|
},
|
|
393321
393784
|
"arguments": []
|
|
393322
393785
|
}
|
|
@@ -393361,7 +393824,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393361
393824
|
"terminal": {
|
|
393362
393825
|
"$type": "RuleCall",
|
|
393363
393826
|
"rule": {
|
|
393364
|
-
"$ref": "#/rules@
|
|
393827
|
+
"$ref": "#/rules@14"
|
|
393365
393828
|
},
|
|
393366
393829
|
"arguments": []
|
|
393367
393830
|
}
|
|
@@ -393377,7 +393840,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393377
393840
|
"terminal": {
|
|
393378
393841
|
"$type": "RuleCall",
|
|
393379
393842
|
"rule": {
|
|
393380
|
-
"$ref": "#/rules@
|
|
393843
|
+
"$ref": "#/rules@14"
|
|
393381
393844
|
},
|
|
393382
393845
|
"arguments": []
|
|
393383
393846
|
}
|
|
@@ -393396,7 +393859,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393396
393859
|
"terminal": {
|
|
393397
393860
|
"$type": "RuleCall",
|
|
393398
393861
|
"rule": {
|
|
393399
|
-
"$ref": "#/rules@
|
|
393862
|
+
"$ref": "#/rules@14"
|
|
393400
393863
|
},
|
|
393401
393864
|
"arguments": []
|
|
393402
393865
|
}
|
|
@@ -393407,7 +393870,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393407
393870
|
{
|
|
393408
393871
|
"$type": "RuleCall",
|
|
393409
393872
|
"rule": {
|
|
393410
|
-
"$ref": "#/rules@
|
|
393873
|
+
"$ref": "#/rules@31"
|
|
393411
393874
|
},
|
|
393412
393875
|
"arguments": []
|
|
393413
393876
|
},
|
|
@@ -393425,7 +393888,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393425
393888
|
"terminal": {
|
|
393426
393889
|
"$type": "RuleCall",
|
|
393427
393890
|
"rule": {
|
|
393428
|
-
"$ref": "#/rules@
|
|
393891
|
+
"$ref": "#/rules@61"
|
|
393429
393892
|
},
|
|
393430
393893
|
"arguments": []
|
|
393431
393894
|
}
|
|
@@ -393456,7 +393919,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393456
393919
|
"terminal": {
|
|
393457
393920
|
"$type": "RuleCall",
|
|
393458
393921
|
"rule": {
|
|
393459
|
-
"$ref": "#/rules@
|
|
393922
|
+
"$ref": "#/rules@60"
|
|
393460
393923
|
},
|
|
393461
393924
|
"arguments": []
|
|
393462
393925
|
}
|
|
@@ -393472,7 +393935,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393472
393935
|
"terminal": {
|
|
393473
393936
|
"$type": "RuleCall",
|
|
393474
393937
|
"rule": {
|
|
393475
|
-
"$ref": "#/rules@
|
|
393938
|
+
"$ref": "#/rules@60"
|
|
393476
393939
|
},
|
|
393477
393940
|
"arguments": []
|
|
393478
393941
|
}
|
|
@@ -393511,7 +393974,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393511
393974
|
"terminal": {
|
|
393512
393975
|
"$type": "RuleCall",
|
|
393513
393976
|
"rule": {
|
|
393514
|
-
"$ref": "#/rules@
|
|
393977
|
+
"$ref": "#/rules@61"
|
|
393515
393978
|
},
|
|
393516
393979
|
"arguments": []
|
|
393517
393980
|
}
|
|
@@ -393520,20 +393983,42 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393520
393983
|
"cardinality": "?"
|
|
393521
393984
|
},
|
|
393522
393985
|
{
|
|
393523
|
-
"$type": "
|
|
393524
|
-
"
|
|
393525
|
-
|
|
393526
|
-
|
|
393527
|
-
|
|
393528
|
-
|
|
393529
|
-
|
|
393530
|
-
|
|
393531
|
-
|
|
393532
|
-
|
|
393533
|
-
|
|
393986
|
+
"$type": "Alternatives",
|
|
393987
|
+
"elements": [
|
|
393988
|
+
{
|
|
393989
|
+
"$type": "Assignment",
|
|
393990
|
+
"feature": "assetRef",
|
|
393991
|
+
"operator": "=",
|
|
393992
|
+
"terminal": {
|
|
393993
|
+
"$type": "RuleCall",
|
|
393994
|
+
"rule": {
|
|
393995
|
+
"$ref": "#/rules@47"
|
|
393996
|
+
},
|
|
393997
|
+
"arguments": []
|
|
393998
|
+
}
|
|
393534
393999
|
},
|
|
393535
|
-
|
|
393536
|
-
|
|
394000
|
+
{
|
|
394001
|
+
"$type": "Group",
|
|
394002
|
+
"elements": [
|
|
394003
|
+
{
|
|
394004
|
+
"$type": "Keyword",
|
|
394005
|
+
"value": "asset"
|
|
394006
|
+
},
|
|
394007
|
+
{
|
|
394008
|
+
"$type": "Assignment",
|
|
394009
|
+
"feature": "asset",
|
|
394010
|
+
"operator": "=",
|
|
394011
|
+
"terminal": {
|
|
394012
|
+
"$type": "RuleCall",
|
|
394013
|
+
"rule": {
|
|
394014
|
+
"$ref": "#/rules@48"
|
|
394015
|
+
},
|
|
394016
|
+
"arguments": []
|
|
394017
|
+
}
|
|
394018
|
+
}
|
|
394019
|
+
]
|
|
394020
|
+
}
|
|
394021
|
+
]
|
|
393537
394022
|
},
|
|
393538
394023
|
{
|
|
393539
394024
|
"$type": "Keyword",
|
|
@@ -393550,7 +394035,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393550
394035
|
"terminal": {
|
|
393551
394036
|
"$type": "RuleCall",
|
|
393552
394037
|
"rule": {
|
|
393553
|
-
"$ref": "#/rules@
|
|
394038
|
+
"$ref": "#/rules@14"
|
|
393554
394039
|
},
|
|
393555
394040
|
"arguments": []
|
|
393556
394041
|
}
|
|
@@ -393566,7 +394051,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393566
394051
|
"terminal": {
|
|
393567
394052
|
"$type": "RuleCall",
|
|
393568
394053
|
"rule": {
|
|
393569
|
-
"$ref": "#/rules@
|
|
394054
|
+
"$ref": "#/rules@14"
|
|
393570
394055
|
},
|
|
393571
394056
|
"arguments": []
|
|
393572
394057
|
}
|
|
@@ -393589,7 +394074,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393589
394074
|
"terminal": {
|
|
393590
394075
|
"$type": "RuleCall",
|
|
393591
394076
|
"rule": {
|
|
393592
|
-
"$ref": "#/rules@
|
|
394077
|
+
"$ref": "#/rules@14"
|
|
393593
394078
|
},
|
|
393594
394079
|
"arguments": []
|
|
393595
394080
|
}
|
|
@@ -393611,7 +394096,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393611
394096
|
"terminal": {
|
|
393612
394097
|
"$type": "RuleCall",
|
|
393613
394098
|
"rule": {
|
|
393614
|
-
"$ref": "#/rules@
|
|
394099
|
+
"$ref": "#/rules@14"
|
|
393615
394100
|
},
|
|
393616
394101
|
"arguments": []
|
|
393617
394102
|
}
|
|
@@ -393633,7 +394118,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393633
394118
|
"terminal": {
|
|
393634
394119
|
"$type": "RuleCall",
|
|
393635
394120
|
"rule": {
|
|
393636
|
-
"$ref": "#/rules@
|
|
394121
|
+
"$ref": "#/rules@61"
|
|
393637
394122
|
},
|
|
393638
394123
|
"arguments": []
|
|
393639
394124
|
}
|
|
@@ -393655,7 +394140,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393655
394140
|
"terminal": {
|
|
393656
394141
|
"$type": "RuleCall",
|
|
393657
394142
|
"rule": {
|
|
393658
|
-
"$ref": "#/rules@
|
|
394143
|
+
"$ref": "#/rules@49"
|
|
393659
394144
|
},
|
|
393660
394145
|
"arguments": []
|
|
393661
394146
|
}
|
|
@@ -393681,7 +394166,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393681
394166
|
"terminal": {
|
|
393682
394167
|
"$type": "RuleCall",
|
|
393683
394168
|
"rule": {
|
|
393684
|
-
"$ref": "#/rules@
|
|
394169
|
+
"$ref": "#/rules@14"
|
|
393685
394170
|
},
|
|
393686
394171
|
"arguments": []
|
|
393687
394172
|
}
|
|
@@ -393697,7 +394182,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393697
394182
|
"terminal": {
|
|
393698
394183
|
"$type": "RuleCall",
|
|
393699
394184
|
"rule": {
|
|
393700
|
-
"$ref": "#/rules@
|
|
394185
|
+
"$ref": "#/rules@14"
|
|
393701
394186
|
},
|
|
393702
394187
|
"arguments": []
|
|
393703
394188
|
}
|
|
@@ -393712,7 +394197,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393712
394197
|
{
|
|
393713
394198
|
"$type": "RuleCall",
|
|
393714
394199
|
"rule": {
|
|
393715
|
-
"$ref": "#/rules@
|
|
394200
|
+
"$ref": "#/rules@31"
|
|
393716
394201
|
},
|
|
393717
394202
|
"arguments": []
|
|
393718
394203
|
}
|
|
@@ -393746,7 +394231,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393746
394231
|
"terminal": {
|
|
393747
394232
|
"$type": "RuleCall",
|
|
393748
394233
|
"rule": {
|
|
393749
|
-
"$ref": "#/rules@
|
|
394234
|
+
"$ref": "#/rules@61"
|
|
393750
394235
|
},
|
|
393751
394236
|
"arguments": []
|
|
393752
394237
|
}
|
|
@@ -393755,20 +394240,42 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393755
394240
|
"cardinality": "?"
|
|
393756
394241
|
},
|
|
393757
394242
|
{
|
|
393758
|
-
"$type": "
|
|
393759
|
-
"
|
|
393760
|
-
|
|
393761
|
-
|
|
393762
|
-
|
|
393763
|
-
|
|
393764
|
-
|
|
393765
|
-
|
|
393766
|
-
|
|
393767
|
-
|
|
393768
|
-
|
|
394243
|
+
"$type": "Alternatives",
|
|
394244
|
+
"elements": [
|
|
394245
|
+
{
|
|
394246
|
+
"$type": "Assignment",
|
|
394247
|
+
"feature": "assetRef",
|
|
394248
|
+
"operator": "=",
|
|
394249
|
+
"terminal": {
|
|
394250
|
+
"$type": "RuleCall",
|
|
394251
|
+
"rule": {
|
|
394252
|
+
"$ref": "#/rules@47"
|
|
394253
|
+
},
|
|
394254
|
+
"arguments": []
|
|
394255
|
+
}
|
|
393769
394256
|
},
|
|
393770
|
-
|
|
393771
|
-
|
|
394257
|
+
{
|
|
394258
|
+
"$type": "Group",
|
|
394259
|
+
"elements": [
|
|
394260
|
+
{
|
|
394261
|
+
"$type": "Keyword",
|
|
394262
|
+
"value": "asset"
|
|
394263
|
+
},
|
|
394264
|
+
{
|
|
394265
|
+
"$type": "Assignment",
|
|
394266
|
+
"feature": "asset",
|
|
394267
|
+
"operator": "=",
|
|
394268
|
+
"terminal": {
|
|
394269
|
+
"$type": "RuleCall",
|
|
394270
|
+
"rule": {
|
|
394271
|
+
"$ref": "#/rules@48"
|
|
394272
|
+
},
|
|
394273
|
+
"arguments": []
|
|
394274
|
+
}
|
|
394275
|
+
}
|
|
394276
|
+
]
|
|
394277
|
+
}
|
|
394278
|
+
]
|
|
393772
394279
|
},
|
|
393773
394280
|
{
|
|
393774
394281
|
"$type": "Group",
|
|
@@ -393784,7 +394291,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393784
394291
|
"terminal": {
|
|
393785
394292
|
"$type": "RuleCall",
|
|
393786
394293
|
"rule": {
|
|
393787
|
-
"$ref": "#/rules@
|
|
394294
|
+
"$ref": "#/rules@49"
|
|
393788
394295
|
},
|
|
393789
394296
|
"arguments": []
|
|
393790
394297
|
}
|
|
@@ -393810,7 +394317,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393810
394317
|
"terminal": {
|
|
393811
394318
|
"$type": "RuleCall",
|
|
393812
394319
|
"rule": {
|
|
393813
|
-
"$ref": "#/rules@
|
|
394320
|
+
"$ref": "#/rules@14"
|
|
393814
394321
|
},
|
|
393815
394322
|
"arguments": []
|
|
393816
394323
|
}
|
|
@@ -393826,7 +394333,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393826
394333
|
"terminal": {
|
|
393827
394334
|
"$type": "RuleCall",
|
|
393828
394335
|
"rule": {
|
|
393829
|
-
"$ref": "#/rules@
|
|
394336
|
+
"$ref": "#/rules@14"
|
|
393830
394337
|
},
|
|
393831
394338
|
"arguments": []
|
|
393832
394339
|
}
|
|
@@ -393852,7 +394359,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393852
394359
|
"terminal": {
|
|
393853
394360
|
"$type": "RuleCall",
|
|
393854
394361
|
"rule": {
|
|
393855
|
-
"$ref": "#/rules@
|
|
394362
|
+
"$ref": "#/rules@14"
|
|
393856
394363
|
},
|
|
393857
394364
|
"arguments": []
|
|
393858
394365
|
}
|
|
@@ -393874,7 +394381,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393874
394381
|
"terminal": {
|
|
393875
394382
|
"$type": "RuleCall",
|
|
393876
394383
|
"rule": {
|
|
393877
|
-
"$ref": "#/rules@
|
|
394384
|
+
"$ref": "#/rules@14"
|
|
393878
394385
|
},
|
|
393879
394386
|
"arguments": []
|
|
393880
394387
|
}
|
|
@@ -393885,7 +394392,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393885
394392
|
{
|
|
393886
394393
|
"$type": "RuleCall",
|
|
393887
394394
|
"rule": {
|
|
393888
|
-
"$ref": "#/rules@
|
|
394395
|
+
"$ref": "#/rules@31"
|
|
393889
394396
|
},
|
|
393890
394397
|
"arguments": []
|
|
393891
394398
|
}
|
|
@@ -393895,6 +394402,52 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393895
394402
|
"fragment": false,
|
|
393896
394403
|
"parameters": []
|
|
393897
394404
|
},
|
|
394405
|
+
{
|
|
394406
|
+
"$type": "ParserRule",
|
|
394407
|
+
"name": "AssetRef",
|
|
394408
|
+
"definition": {
|
|
394409
|
+
"$type": "Group",
|
|
394410
|
+
"elements": [
|
|
394411
|
+
{
|
|
394412
|
+
"$type": "Group",
|
|
394413
|
+
"elements": [
|
|
394414
|
+
{
|
|
394415
|
+
"$type": "Assignment",
|
|
394416
|
+
"feature": "ns",
|
|
394417
|
+
"operator": "=",
|
|
394418
|
+
"terminal": {
|
|
394419
|
+
"$type": "RuleCall",
|
|
394420
|
+
"rule": {
|
|
394421
|
+
"$ref": "#/rules@59"
|
|
394422
|
+
},
|
|
394423
|
+
"arguments": []
|
|
394424
|
+
}
|
|
394425
|
+
},
|
|
394426
|
+
{
|
|
394427
|
+
"$type": "Keyword",
|
|
394428
|
+
"value": "."
|
|
394429
|
+
}
|
|
394430
|
+
],
|
|
394431
|
+
"cardinality": "?"
|
|
394432
|
+
},
|
|
394433
|
+
{
|
|
394434
|
+
"$type": "Assignment",
|
|
394435
|
+
"feature": "id",
|
|
394436
|
+
"operator": "=",
|
|
394437
|
+
"terminal": {
|
|
394438
|
+
"$type": "RuleCall",
|
|
394439
|
+
"rule": {
|
|
394440
|
+
"$ref": "#/rules@61"
|
|
394441
|
+
},
|
|
394442
|
+
"arguments": []
|
|
394443
|
+
}
|
|
394444
|
+
}
|
|
394445
|
+
]
|
|
394446
|
+
},
|
|
394447
|
+
"entry": false,
|
|
394448
|
+
"fragment": false,
|
|
394449
|
+
"parameters": []
|
|
394450
|
+
},
|
|
393898
394451
|
{
|
|
393899
394452
|
"$type": "ParserRule",
|
|
393900
394453
|
"name": "Asset",
|
|
@@ -393916,7 +394469,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393916
394469
|
"terminal": {
|
|
393917
394470
|
"$type": "RuleCall",
|
|
393918
394471
|
"rule": {
|
|
393919
|
-
"$ref": "#/rules@
|
|
394472
|
+
"$ref": "#/rules@61"
|
|
393920
394473
|
},
|
|
393921
394474
|
"arguments": []
|
|
393922
394475
|
}
|
|
@@ -393932,7 +394485,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393932
394485
|
"terminal": {
|
|
393933
394486
|
"$type": "RuleCall",
|
|
393934
394487
|
"rule": {
|
|
393935
|
-
"$ref": "#/rules@
|
|
394488
|
+
"$ref": "#/rules@61"
|
|
393936
394489
|
},
|
|
393937
394490
|
"arguments": []
|
|
393938
394491
|
}
|
|
@@ -393952,7 +394505,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393952
394505
|
"terminal": {
|
|
393953
394506
|
"$type": "RuleCall",
|
|
393954
394507
|
"rule": {
|
|
393955
|
-
"$ref": "#/rules@
|
|
394508
|
+
"$ref": "#/rules@60"
|
|
393956
394509
|
},
|
|
393957
394510
|
"arguments": []
|
|
393958
394511
|
}
|
|
@@ -393968,7 +394521,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393968
394521
|
"terminal": {
|
|
393969
394522
|
"$type": "RuleCall",
|
|
393970
394523
|
"rule": {
|
|
393971
|
-
"$ref": "#/rules@
|
|
394524
|
+
"$ref": "#/rules@60"
|
|
393972
394525
|
},
|
|
393973
394526
|
"arguments": []
|
|
393974
394527
|
}
|
|
@@ -393984,7 +394537,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
393984
394537
|
"terminal": {
|
|
393985
394538
|
"$type": "RuleCall",
|
|
393986
394539
|
"rule": {
|
|
393987
|
-
"$ref": "#/rules@
|
|
394540
|
+
"$ref": "#/rules@60"
|
|
393988
394541
|
},
|
|
393989
394542
|
"arguments": []
|
|
393990
394543
|
}
|
|
@@ -394007,7 +394560,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394007
394560
|
"terminal": {
|
|
394008
394561
|
"$type": "RuleCall",
|
|
394009
394562
|
"rule": {
|
|
394010
|
-
"$ref": "#/rules@
|
|
394563
|
+
"$ref": "#/rules@61"
|
|
394011
394564
|
},
|
|
394012
394565
|
"arguments": []
|
|
394013
394566
|
}
|
|
@@ -394029,7 +394582,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394029
394582
|
"terminal": {
|
|
394030
394583
|
"$type": "RuleCall",
|
|
394031
394584
|
"rule": {
|
|
394032
|
-
"$ref": "#/rules@
|
|
394585
|
+
"$ref": "#/rules@61"
|
|
394033
394586
|
},
|
|
394034
394587
|
"arguments": []
|
|
394035
394588
|
}
|
|
@@ -394106,6 +394659,28 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394106
394659
|
"$type": "Keyword",
|
|
394107
394660
|
"value": "use"
|
|
394108
394661
|
},
|
|
394662
|
+
{
|
|
394663
|
+
"$type": "Group",
|
|
394664
|
+
"elements": [
|
|
394665
|
+
{
|
|
394666
|
+
"$type": "Assignment",
|
|
394667
|
+
"feature": "ns",
|
|
394668
|
+
"operator": "=",
|
|
394669
|
+
"terminal": {
|
|
394670
|
+
"$type": "RuleCall",
|
|
394671
|
+
"rule": {
|
|
394672
|
+
"$ref": "#/rules@59"
|
|
394673
|
+
},
|
|
394674
|
+
"arguments": []
|
|
394675
|
+
}
|
|
394676
|
+
},
|
|
394677
|
+
{
|
|
394678
|
+
"$type": "Keyword",
|
|
394679
|
+
"value": "."
|
|
394680
|
+
}
|
|
394681
|
+
],
|
|
394682
|
+
"cardinality": "?"
|
|
394683
|
+
},
|
|
394109
394684
|
{
|
|
394110
394685
|
"$type": "Assignment",
|
|
394111
394686
|
"feature": "ref",
|
|
@@ -394113,7 +394688,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394113
394688
|
"terminal": {
|
|
394114
394689
|
"$type": "RuleCall",
|
|
394115
394690
|
"rule": {
|
|
394116
|
-
"$ref": "#/rules@
|
|
394691
|
+
"$ref": "#/rules@59"
|
|
394117
394692
|
},
|
|
394118
394693
|
"arguments": []
|
|
394119
394694
|
}
|
|
@@ -394132,7 +394707,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394132
394707
|
"terminal": {
|
|
394133
394708
|
"$type": "RuleCall",
|
|
394134
394709
|
"rule": {
|
|
394135
|
-
"$ref": "#/rules@
|
|
394710
|
+
"$ref": "#/rules@61"
|
|
394136
394711
|
},
|
|
394137
394712
|
"arguments": []
|
|
394138
394713
|
}
|
|
@@ -394155,7 +394730,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394155
394730
|
"terminal": {
|
|
394156
394731
|
"$type": "RuleCall",
|
|
394157
394732
|
"rule": {
|
|
394158
|
-
"$ref": "#/rules@
|
|
394733
|
+
"$ref": "#/rules@14"
|
|
394159
394734
|
},
|
|
394160
394735
|
"arguments": []
|
|
394161
394736
|
}
|
|
@@ -394171,7 +394746,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394171
394746
|
"terminal": {
|
|
394172
394747
|
"$type": "RuleCall",
|
|
394173
394748
|
"rule": {
|
|
394174
|
-
"$ref": "#/rules@
|
|
394749
|
+
"$ref": "#/rules@14"
|
|
394175
394750
|
},
|
|
394176
394751
|
"arguments": []
|
|
394177
394752
|
}
|
|
@@ -394198,7 +394773,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394198
394773
|
"terminal": {
|
|
394199
394774
|
"$type": "RuleCall",
|
|
394200
394775
|
"rule": {
|
|
394201
|
-
"$ref": "#/rules@
|
|
394776
|
+
"$ref": "#/rules@51"
|
|
394202
394777
|
},
|
|
394203
394778
|
"arguments": []
|
|
394204
394779
|
}
|
|
@@ -394217,7 +394792,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394217
394792
|
"terminal": {
|
|
394218
394793
|
"$type": "RuleCall",
|
|
394219
394794
|
"rule": {
|
|
394220
|
-
"$ref": "#/rules@
|
|
394795
|
+
"$ref": "#/rules@51"
|
|
394221
394796
|
},
|
|
394222
394797
|
"arguments": []
|
|
394223
394798
|
}
|
|
@@ -394235,7 +394810,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394235
394810
|
{
|
|
394236
394811
|
"$type": "RuleCall",
|
|
394237
394812
|
"rule": {
|
|
394238
|
-
"$ref": "#/rules@
|
|
394813
|
+
"$ref": "#/rules@31"
|
|
394239
394814
|
},
|
|
394240
394815
|
"arguments": []
|
|
394241
394816
|
}
|
|
@@ -394258,7 +394833,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394258
394833
|
"terminal": {
|
|
394259
394834
|
"$type": "RuleCall",
|
|
394260
394835
|
"rule": {
|
|
394261
|
-
"$ref": "#/rules@
|
|
394836
|
+
"$ref": "#/rules@59"
|
|
394262
394837
|
},
|
|
394263
394838
|
"arguments": []
|
|
394264
394839
|
}
|
|
@@ -394274,7 +394849,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394274
394849
|
"terminal": {
|
|
394275
394850
|
"$type": "RuleCall",
|
|
394276
394851
|
"rule": {
|
|
394277
|
-
"$ref": "#/rules@
|
|
394852
|
+
"$ref": "#/rules@14"
|
|
394278
394853
|
},
|
|
394279
394854
|
"arguments": []
|
|
394280
394855
|
}
|
|
@@ -394309,7 +394884,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394309
394884
|
"terminal": {
|
|
394310
394885
|
"$type": "RuleCall",
|
|
394311
394886
|
"rule": {
|
|
394312
|
-
"$ref": "#/rules@
|
|
394887
|
+
"$ref": "#/rules@61"
|
|
394313
394888
|
},
|
|
394314
394889
|
"arguments": []
|
|
394315
394890
|
}
|
|
@@ -394374,7 +394949,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394374
394949
|
"terminal": {
|
|
394375
394950
|
"$type": "RuleCall",
|
|
394376
394951
|
"rule": {
|
|
394377
|
-
"$ref": "#/rules@
|
|
394952
|
+
"$ref": "#/rules@53"
|
|
394378
394953
|
},
|
|
394379
394954
|
"arguments": []
|
|
394380
394955
|
},
|
|
@@ -394394,7 +394969,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394394
394969
|
"terminal": {
|
|
394395
394970
|
"$type": "RuleCall",
|
|
394396
394971
|
"rule": {
|
|
394397
|
-
"$ref": "#/rules@
|
|
394972
|
+
"$ref": "#/rules@14"
|
|
394398
394973
|
},
|
|
394399
394974
|
"arguments": []
|
|
394400
394975
|
}
|
|
@@ -394416,7 +394991,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394416
394991
|
"terminal": {
|
|
394417
394992
|
"$type": "RuleCall",
|
|
394418
394993
|
"rule": {
|
|
394419
|
-
"$ref": "#/rules@
|
|
394994
|
+
"$ref": "#/rules@14"
|
|
394420
394995
|
},
|
|
394421
394996
|
"arguments": []
|
|
394422
394997
|
}
|
|
@@ -394438,7 +395013,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394438
395013
|
"terminal": {
|
|
394439
395014
|
"$type": "RuleCall",
|
|
394440
395015
|
"rule": {
|
|
394441
|
-
"$ref": "#/rules@
|
|
395016
|
+
"$ref": "#/rules@14"
|
|
394442
395017
|
},
|
|
394443
395018
|
"arguments": []
|
|
394444
395019
|
}
|
|
@@ -394454,7 +395029,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394454
395029
|
"terminal": {
|
|
394455
395030
|
"$type": "RuleCall",
|
|
394456
395031
|
"rule": {
|
|
394457
|
-
"$ref": "#/rules@
|
|
395032
|
+
"$ref": "#/rules@14"
|
|
394458
395033
|
},
|
|
394459
395034
|
"arguments": []
|
|
394460
395035
|
}
|
|
@@ -394476,7 +395051,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394476
395051
|
"terminal": {
|
|
394477
395052
|
"$type": "RuleCall",
|
|
394478
395053
|
"rule": {
|
|
394479
|
-
"$ref": "#/rules@
|
|
395054
|
+
"$ref": "#/rules@14"
|
|
394480
395055
|
},
|
|
394481
395056
|
"arguments": []
|
|
394482
395057
|
}
|
|
@@ -394487,7 +395062,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394487
395062
|
{
|
|
394488
395063
|
"$type": "RuleCall",
|
|
394489
395064
|
"rule": {
|
|
394490
|
-
"$ref": "#/rules@
|
|
395065
|
+
"$ref": "#/rules@31"
|
|
394491
395066
|
},
|
|
394492
395067
|
"arguments": []
|
|
394493
395068
|
},
|
|
@@ -394505,7 +395080,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394505
395080
|
"terminal": {
|
|
394506
395081
|
"$type": "RuleCall",
|
|
394507
395082
|
"rule": {
|
|
394508
|
-
"$ref": "#/rules@
|
|
395083
|
+
"$ref": "#/rules@61"
|
|
394509
395084
|
},
|
|
394510
395085
|
"arguments": []
|
|
394511
395086
|
}
|
|
@@ -394527,7 +395102,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394527
395102
|
"terminal": {
|
|
394528
395103
|
"$type": "RuleCall",
|
|
394529
395104
|
"rule": {
|
|
394530
|
-
"$ref": "#/rules@
|
|
395105
|
+
"$ref": "#/rules@54"
|
|
394531
395106
|
},
|
|
394532
395107
|
"arguments": []
|
|
394533
395108
|
}
|
|
@@ -394539,7 +395114,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394539
395114
|
"terminal": {
|
|
394540
395115
|
"$type": "RuleCall",
|
|
394541
395116
|
"rule": {
|
|
394542
|
-
"$ref": "#/rules@
|
|
395117
|
+
"$ref": "#/rules@55"
|
|
394543
395118
|
},
|
|
394544
395119
|
"arguments": []
|
|
394545
395120
|
}
|
|
@@ -394592,7 +395167,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394592
395167
|
"terminal": {
|
|
394593
395168
|
"$type": "RuleCall",
|
|
394594
395169
|
"rule": {
|
|
394595
|
-
"$ref": "#/rules@
|
|
395170
|
+
"$ref": "#/rules@14"
|
|
394596
395171
|
},
|
|
394597
395172
|
"arguments": []
|
|
394598
395173
|
}
|
|
@@ -394620,7 +395195,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394620
395195
|
"terminal": {
|
|
394621
395196
|
"$type": "RuleCall",
|
|
394622
395197
|
"rule": {
|
|
394623
|
-
"$ref": "#/rules@
|
|
395198
|
+
"$ref": "#/rules@61"
|
|
394624
395199
|
},
|
|
394625
395200
|
"arguments": []
|
|
394626
395201
|
}
|
|
@@ -394640,7 +395215,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394640
395215
|
"terminal": {
|
|
394641
395216
|
"$type": "RuleCall",
|
|
394642
395217
|
"rule": {
|
|
394643
|
-
"$ref": "#/rules@
|
|
395218
|
+
"$ref": "#/rules@14"
|
|
394644
395219
|
},
|
|
394645
395220
|
"arguments": []
|
|
394646
395221
|
}
|
|
@@ -394656,7 +395231,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394656
395231
|
"terminal": {
|
|
394657
395232
|
"$type": "RuleCall",
|
|
394658
395233
|
"rule": {
|
|
394659
|
-
"$ref": "#/rules@
|
|
395234
|
+
"$ref": "#/rules@14"
|
|
394660
395235
|
},
|
|
394661
395236
|
"arguments": []
|
|
394662
395237
|
}
|
|
@@ -394680,7 +395255,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394680
395255
|
"terminal": {
|
|
394681
395256
|
"$type": "RuleCall",
|
|
394682
395257
|
"rule": {
|
|
394683
|
-
"$ref": "#/rules@
|
|
395258
|
+
"$ref": "#/rules@14"
|
|
394684
395259
|
},
|
|
394685
395260
|
"arguments": []
|
|
394686
395261
|
}
|
|
@@ -394696,7 +395271,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394696
395271
|
"terminal": {
|
|
394697
395272
|
"$type": "RuleCall",
|
|
394698
395273
|
"rule": {
|
|
394699
|
-
"$ref": "#/rules@
|
|
395274
|
+
"$ref": "#/rules@14"
|
|
394700
395275
|
},
|
|
394701
395276
|
"arguments": []
|
|
394702
395277
|
}
|
|
@@ -394716,7 +395291,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394716
395291
|
"terminal": {
|
|
394717
395292
|
"$type": "RuleCall",
|
|
394718
395293
|
"rule": {
|
|
394719
|
-
"$ref": "#/rules@
|
|
395294
|
+
"$ref": "#/rules@14"
|
|
394720
395295
|
},
|
|
394721
395296
|
"arguments": []
|
|
394722
395297
|
}
|
|
@@ -394823,7 +395398,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394823
395398
|
"terminal": {
|
|
394824
395399
|
"$type": "RuleCall",
|
|
394825
395400
|
"rule": {
|
|
394826
|
-
"$ref": "#/rules@
|
|
395401
|
+
"$ref": "#/rules@14"
|
|
394827
395402
|
},
|
|
394828
395403
|
"arguments": []
|
|
394829
395404
|
}
|
|
@@ -394839,7 +395414,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394839
395414
|
"terminal": {
|
|
394840
395415
|
"$type": "RuleCall",
|
|
394841
395416
|
"rule": {
|
|
394842
|
-
"$ref": "#/rules@
|
|
395417
|
+
"$ref": "#/rules@14"
|
|
394843
395418
|
},
|
|
394844
395419
|
"arguments": []
|
|
394845
395420
|
}
|
|
@@ -394869,7 +395444,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394869
395444
|
"terminal": {
|
|
394870
395445
|
"$type": "RuleCall",
|
|
394871
395446
|
"rule": {
|
|
394872
|
-
"$ref": "#/rules@
|
|
395447
|
+
"$ref": "#/rules@14"
|
|
394873
395448
|
},
|
|
394874
395449
|
"arguments": []
|
|
394875
395450
|
}
|
|
@@ -394885,7 +395460,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394885
395460
|
"terminal": {
|
|
394886
395461
|
"$type": "RuleCall",
|
|
394887
395462
|
"rule": {
|
|
394888
|
-
"$ref": "#/rules@
|
|
395463
|
+
"$ref": "#/rules@14"
|
|
394889
395464
|
},
|
|
394890
395465
|
"arguments": []
|
|
394891
395466
|
}
|
|
@@ -394915,7 +395490,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394915
395490
|
"terminal": {
|
|
394916
395491
|
"$type": "RuleCall",
|
|
394917
395492
|
"rule": {
|
|
394918
|
-
"$ref": "#/rules@
|
|
395493
|
+
"$ref": "#/rules@14"
|
|
394919
395494
|
},
|
|
394920
395495
|
"arguments": []
|
|
394921
395496
|
}
|
|
@@ -394931,7 +395506,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394931
395506
|
"terminal": {
|
|
394932
395507
|
"$type": "RuleCall",
|
|
394933
395508
|
"rule": {
|
|
394934
|
-
"$ref": "#/rules@
|
|
395509
|
+
"$ref": "#/rules@14"
|
|
394935
395510
|
},
|
|
394936
395511
|
"arguments": []
|
|
394937
395512
|
}
|
|
@@ -394957,7 +395532,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394957
395532
|
"terminal": {
|
|
394958
395533
|
"$type": "RuleCall",
|
|
394959
395534
|
"rule": {
|
|
394960
|
-
"$ref": "#/rules@
|
|
395535
|
+
"$ref": "#/rules@14"
|
|
394961
395536
|
},
|
|
394962
395537
|
"arguments": []
|
|
394963
395538
|
}
|
|
@@ -394979,7 +395554,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
394979
395554
|
"terminal": {
|
|
394980
395555
|
"$type": "RuleCall",
|
|
394981
395556
|
"rule": {
|
|
394982
|
-
"$ref": "#/rules@
|
|
395557
|
+
"$ref": "#/rules@14"
|
|
394983
395558
|
},
|
|
394984
395559
|
"arguments": []
|
|
394985
395560
|
}
|
|
@@ -395001,7 +395576,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395001
395576
|
"terminal": {
|
|
395002
395577
|
"$type": "RuleCall",
|
|
395003
395578
|
"rule": {
|
|
395004
|
-
"$ref": "#/rules@
|
|
395579
|
+
"$ref": "#/rules@14"
|
|
395005
395580
|
},
|
|
395006
395581
|
"arguments": []
|
|
395007
395582
|
}
|
|
@@ -395023,7 +395598,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395023
395598
|
"terminal": {
|
|
395024
395599
|
"$type": "RuleCall",
|
|
395025
395600
|
"rule": {
|
|
395026
|
-
"$ref": "#/rules@
|
|
395601
|
+
"$ref": "#/rules@14"
|
|
395027
395602
|
},
|
|
395028
395603
|
"arguments": []
|
|
395029
395604
|
}
|
|
@@ -395045,7 +395620,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395045
395620
|
"terminal": {
|
|
395046
395621
|
"$type": "RuleCall",
|
|
395047
395622
|
"rule": {
|
|
395048
|
-
"$ref": "#/rules@
|
|
395623
|
+
"$ref": "#/rules@14"
|
|
395049
395624
|
},
|
|
395050
395625
|
"arguments": []
|
|
395051
395626
|
}
|
|
@@ -395067,7 +395642,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395067
395642
|
"terminal": {
|
|
395068
395643
|
"$type": "RuleCall",
|
|
395069
395644
|
"rule": {
|
|
395070
|
-
"$ref": "#/rules@
|
|
395645
|
+
"$ref": "#/rules@14"
|
|
395071
395646
|
},
|
|
395072
395647
|
"arguments": []
|
|
395073
395648
|
}
|
|
@@ -395089,7 +395664,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395089
395664
|
"terminal": {
|
|
395090
395665
|
"$type": "RuleCall",
|
|
395091
395666
|
"rule": {
|
|
395092
|
-
"$ref": "#/rules@
|
|
395667
|
+
"$ref": "#/rules@14"
|
|
395093
395668
|
},
|
|
395094
395669
|
"arguments": []
|
|
395095
395670
|
}
|
|
@@ -395111,7 +395686,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395111
395686
|
"terminal": {
|
|
395112
395687
|
"$type": "RuleCall",
|
|
395113
395688
|
"rule": {
|
|
395114
|
-
"$ref": "#/rules@
|
|
395689
|
+
"$ref": "#/rules@60"
|
|
395115
395690
|
},
|
|
395116
395691
|
"arguments": []
|
|
395117
395692
|
}
|
|
@@ -395142,7 +395717,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395142
395717
|
"terminal": {
|
|
395143
395718
|
"$type": "RuleCall",
|
|
395144
395719
|
"rule": {
|
|
395145
|
-
"$ref": "#/rules@
|
|
395720
|
+
"$ref": "#/rules@61"
|
|
395146
395721
|
},
|
|
395147
395722
|
"arguments": []
|
|
395148
395723
|
}
|
|
@@ -395180,7 +395755,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395180
395755
|
"terminal": {
|
|
395181
395756
|
"$type": "RuleCall",
|
|
395182
395757
|
"rule": {
|
|
395183
|
-
"$ref": "#/rules@
|
|
395758
|
+
"$ref": "#/rules@14"
|
|
395184
395759
|
},
|
|
395185
395760
|
"arguments": []
|
|
395186
395761
|
}
|
|
@@ -395199,7 +395774,7 @@ var WadiGrammar = () => loadedWadiGrammar ?? (loadedWadiGrammar = loadGrammarFro
|
|
|
395199
395774
|
"terminal": {
|
|
395200
395775
|
"$type": "RuleCall",
|
|
395201
395776
|
"rule": {
|
|
395202
|
-
"$ref": "#/rules@
|
|
395777
|
+
"$ref": "#/rules@14"
|
|
395203
395778
|
},
|
|
395204
395779
|
"arguments": []
|
|
395205
395780
|
}
|
|
@@ -395441,7 +396016,7 @@ function opening(o) {
|
|
|
395441
396016
|
}
|
|
395442
396017
|
function roomItem(it) {
|
|
395443
396018
|
const { formulas, put } = geom();
|
|
395444
|
-
const o = { asset:
|
|
396019
|
+
const o = { asset: resolveItemAsset(it) };
|
|
395445
396020
|
if (it.name) o.name = unquote(it.name);
|
|
395446
396021
|
if (it.anchor) o.anchor = it.anchor;
|
|
395447
396022
|
const gx = put("gap_x", it.gap_x);
|
|
@@ -395561,9 +396136,9 @@ function staircase(s) {
|
|
|
395561
396136
|
direction: s.direction
|
|
395562
396137
|
};
|
|
395563
396138
|
if (s.name) o.name = unquote(s.name);
|
|
395564
|
-
const rh = put("rise_height", s.rise_height);
|
|
396139
|
+
const rh = put("rise_height", s.rise_height, 1);
|
|
395565
396140
|
if (rh !== void 0) o.rise_height = rh;
|
|
395566
|
-
const mr = put("max_run", s.max_run);
|
|
396141
|
+
const mr = put("max_run", s.max_run, 1);
|
|
395567
396142
|
if (mr !== void 0) o.max_run = mr;
|
|
395568
396143
|
const ld = put("landing_depth", s.landing_depth);
|
|
395569
396144
|
if (ld !== void 0) o.landing_depth = ld;
|
|
@@ -395600,11 +396175,54 @@ function asset(a) {
|
|
|
395600
396175
|
if (a.category) o.category = unquote(a.category);
|
|
395601
396176
|
return o;
|
|
395602
396177
|
}
|
|
396178
|
+
var ASSET_INDEX = /* @__PURE__ */ new Map();
|
|
396179
|
+
var NS_ASSET_INDEX = /* @__PURE__ */ new Map();
|
|
396180
|
+
function assetDeclToObj(a) {
|
|
396181
|
+
const o = {
|
|
396182
|
+
id: unquote(a.id),
|
|
396183
|
+
src: unquote(a.src),
|
|
396184
|
+
dimensions: [a.dx, a.dy, a.dz]
|
|
396185
|
+
};
|
|
396186
|
+
if (a.assetName) o.name = unquote(a.assetName);
|
|
396187
|
+
if (a.category) o.category = unquote(a.category);
|
|
396188
|
+
return o;
|
|
396189
|
+
}
|
|
396190
|
+
function resolveItemAsset(it) {
|
|
396191
|
+
if (it.asset) return asset(it.asset);
|
|
396192
|
+
const ref = it.assetRef;
|
|
396193
|
+
if (!ref) throw new Error("item has no asset (expected `asset { \u2026 }` or an asset id)");
|
|
396194
|
+
const id = unquote(ref.id);
|
|
396195
|
+
if (ref.ns) {
|
|
396196
|
+
const mod = NS_ASSET_INDEX.get(ref.ns);
|
|
396197
|
+
if (!mod) {
|
|
396198
|
+
const nss = [...NS_ASSET_INDEX.keys()];
|
|
396199
|
+
throw new Error(
|
|
396200
|
+
`item asset "${ref.ns}.${id}": no import is aliased "${ref.ns}". Add \`import "\u2026" as ${ref.ns}\`` + (nss.length ? ` (imported aliases: ${nss.join(", ")}).` : ".")
|
|
396201
|
+
);
|
|
396202
|
+
}
|
|
396203
|
+
const decl2 = mod.get(id);
|
|
396204
|
+
if (!decl2) {
|
|
396205
|
+
const avail = [...mod.keys()];
|
|
396206
|
+
throw new Error(
|
|
396207
|
+
`unknown asset "${ref.ns}.${id}" \u2014 module "${ref.ns}" declares no "${id}"` + (avail.length ? ` (it has: ${avail.join(", ")}).` : ".")
|
|
396208
|
+
);
|
|
396209
|
+
}
|
|
396210
|
+
return assetDeclToObj(decl2);
|
|
396211
|
+
}
|
|
396212
|
+
const decl = ASSET_INDEX.get(id);
|
|
396213
|
+
if (!decl) {
|
|
396214
|
+
const avail = [...ASSET_INDEX.keys()];
|
|
396215
|
+
throw new Error(
|
|
396216
|
+
`unknown asset "${id}". Declare it with a top-level \`asset "${id}" src \u2026 dims \u2026\`, bare-import a module that provides it, or use a namespaced \`item ns."${id}"\`` + (avail.length ? ` (in scope: ${avail.join(", ")}).` : ".")
|
|
396217
|
+
);
|
|
396218
|
+
}
|
|
396219
|
+
return assetDeclToObj(decl);
|
|
396220
|
+
}
|
|
395603
396221
|
function item(it) {
|
|
395604
396222
|
const { formulas, put } = geom();
|
|
395605
396223
|
const o = {
|
|
395606
396224
|
type: "item",
|
|
395607
|
-
asset:
|
|
396225
|
+
asset: resolveItemAsset(it),
|
|
395608
396226
|
x: put("x", it.x, 0),
|
|
395609
396227
|
y: put("y", it.y, 0)
|
|
395610
396228
|
};
|
|
@@ -395622,11 +396240,36 @@ function item(it) {
|
|
|
395622
396240
|
applyCommon(o, formulas, it);
|
|
395623
396241
|
return done(o, formulas);
|
|
395624
396242
|
}
|
|
396243
|
+
var COMPONENT_NAMES = /* @__PURE__ */ new Set();
|
|
396244
|
+
var NS_COMPONENT_INDEX = /* @__PURE__ */ new Map();
|
|
396245
|
+
function resolveComponentRef(c) {
|
|
396246
|
+
if (c.ns) {
|
|
396247
|
+
const mod = NS_COMPONENT_INDEX.get(c.ns);
|
|
396248
|
+
if (!mod) {
|
|
396249
|
+
const nss = [...NS_COMPONENT_INDEX.keys()];
|
|
396250
|
+
throw new Error(
|
|
396251
|
+
`use ${c.ns}.${c.ref}: no import is aliased "${c.ns}". Add \`import "\u2026" as ${c.ns}\`` + (nss.length ? ` (imported aliases: ${nss.join(", ")}).` : ".")
|
|
396252
|
+
);
|
|
396253
|
+
}
|
|
396254
|
+
if (!mod.has(c.ref)) {
|
|
396255
|
+
throw new Error(
|
|
396256
|
+
`unknown component "${c.ns}.${c.ref}" \u2014 module "${c.ns}" defines no "${c.ref}"` + (mod.size ? ` (it has: ${[...mod.keys()].join(", ")}).` : ".")
|
|
396257
|
+
);
|
|
396258
|
+
}
|
|
396259
|
+
return `${c.ns}.${c.ref}`;
|
|
396260
|
+
}
|
|
396261
|
+
if (COMPONENT_NAMES.size && !COMPONENT_NAMES.has(c.ref)) {
|
|
396262
|
+
throw new Error(
|
|
396263
|
+
`unknown component "${c.ref}". Define it with \`component ${c.ref} { \u2026 }\`, or import a module that provides it and use \`use ns.${c.ref}\` (in scope: ${[...COMPONENT_NAMES].join(", ")}).`
|
|
396264
|
+
);
|
|
396265
|
+
}
|
|
396266
|
+
return c.ref;
|
|
396267
|
+
}
|
|
395625
396268
|
function componentInstance(c) {
|
|
395626
396269
|
const { formulas, put } = geom();
|
|
395627
396270
|
const o = {
|
|
395628
396271
|
type: "component",
|
|
395629
|
-
ref: c
|
|
396272
|
+
ref: resolveComponentRef(c),
|
|
395630
396273
|
x: put("x", c.x, 0),
|
|
395631
396274
|
y: put("y", c.y, 0)
|
|
395632
396275
|
};
|
|
@@ -395743,6 +396386,7 @@ function floorObject(o) {
|
|
|
395743
396386
|
}
|
|
395744
396387
|
function componentDef(d) {
|
|
395745
396388
|
const def = { objects: d.objects.map(floorObject) };
|
|
396389
|
+
if (d.goal) def.goal = unquote(d.goal);
|
|
395746
396390
|
if (d.params.length) {
|
|
395747
396391
|
def.params = d.params.map((p) => {
|
|
395748
396392
|
const pp = { name: p.name };
|
|
@@ -395763,8 +396407,18 @@ function componentDef(d) {
|
|
|
395763
396407
|
}
|
|
395764
396408
|
return def;
|
|
395765
396409
|
}
|
|
395766
|
-
|
|
396410
|
+
var emptyScope = () => ({ bare: /* @__PURE__ */ new Map(), byNs: /* @__PURE__ */ new Map() });
|
|
396411
|
+
var EMPTY_LINK = { assets: emptyScope(), components: emptyScope() };
|
|
396412
|
+
function modelToHouseConfig(model, linked = EMPTY_LINK) {
|
|
395767
396413
|
const cfg = {};
|
|
396414
|
+
ASSET_INDEX = new Map(linked.assets.bare);
|
|
396415
|
+
for (const a of model.assets) ASSET_INDEX.set(unquote(a.id), a);
|
|
396416
|
+
NS_ASSET_INDEX = linked.assets.byNs;
|
|
396417
|
+
COMPONENT_NAMES = /* @__PURE__ */ new Set([
|
|
396418
|
+
...model.components.map((d) => d.name),
|
|
396419
|
+
...linked.components.bare.keys()
|
|
396420
|
+
]);
|
|
396421
|
+
NS_COMPONENT_INDEX = linked.components.byNs;
|
|
395768
396422
|
if (model.convention) cfg.coord_convention = model.convention;
|
|
395769
396423
|
if (model.units) {
|
|
395770
396424
|
const u = { system: model.units.system };
|
|
@@ -395835,10 +396489,14 @@ function modelToHouseConfig(model) {
|
|
|
395835
396489
|
return o;
|
|
395836
396490
|
});
|
|
395837
396491
|
}
|
|
395838
|
-
|
|
396492
|
+
{
|
|
395839
396493
|
const comps = {};
|
|
396494
|
+
for (const [name, d] of linked.components.bare) comps[name] = componentDef(d);
|
|
395840
396495
|
for (const d of model.components) comps[d.name] = componentDef(d);
|
|
395841
|
-
|
|
396496
|
+
for (const [ns, mod] of linked.components.byNs) {
|
|
396497
|
+
for (const [name, d] of mod) comps[`${ns}.${name}`] = componentDef(d);
|
|
396498
|
+
}
|
|
396499
|
+
if (Object.keys(comps).length) cfg.components = comps;
|
|
395842
396500
|
}
|
|
395843
396501
|
cfg.floors = model.floors.map((f2) => {
|
|
395844
396502
|
const floor2 = {
|
|
@@ -395891,18 +396549,66 @@ function configInput(i2) {
|
|
|
395891
396549
|
throw new Error(`unhandled configurator input: ${i2.$type}`);
|
|
395892
396550
|
}
|
|
395893
396551
|
}
|
|
395894
|
-
function
|
|
395895
|
-
const services = createWadiServices(EmptyFileSystem).Wadi;
|
|
396552
|
+
function parseModel(services, text, what = "DSL") {
|
|
395896
396553
|
const result = services.parser.LangiumParser.parse(text);
|
|
395897
396554
|
if (result.lexerErrors.length || result.parserErrors.length) {
|
|
395898
396555
|
const msgs = [
|
|
395899
396556
|
...result.lexerErrors.map((e) => `lex: ${e.message}`),
|
|
395900
396557
|
...result.parserErrors.map((e) => `parse: ${e.message}`)
|
|
395901
396558
|
];
|
|
395902
|
-
throw new Error(
|
|
396559
|
+
throw new Error(`${what} parse failed:
|
|
395903
396560
|
${msgs.join("\n ")}`);
|
|
395904
396561
|
}
|
|
395905
|
-
return
|
|
396562
|
+
return result.value;
|
|
396563
|
+
}
|
|
396564
|
+
function linkModules(model, services, resolveModule) {
|
|
396565
|
+
const assets = emptyScope();
|
|
396566
|
+
const components = emptyScope();
|
|
396567
|
+
for (const imp of model.imports ?? []) {
|
|
396568
|
+
const ref = unquote(imp.ref);
|
|
396569
|
+
if (!resolveModule) {
|
|
396570
|
+
throw new Error(
|
|
396571
|
+
`import "${ref}": imports need a module resolver, but none is available in this context.`
|
|
396572
|
+
);
|
|
396573
|
+
}
|
|
396574
|
+
const src = resolveModule(ref);
|
|
396575
|
+
if (src === void 0) {
|
|
396576
|
+
throw new Error(`import "${ref}": module not found on the search path.`);
|
|
396577
|
+
}
|
|
396578
|
+
const sub = parseModel(services, src, `imported module "${ref}"`);
|
|
396579
|
+
const modAssets = new Map(sub.assets.map((a) => [unquote(a.id), a]));
|
|
396580
|
+
const modComponents = new Map(sub.components.map((d) => [d.name, d]));
|
|
396581
|
+
if (imp.ns) {
|
|
396582
|
+
assets.byNs.set(imp.ns, modAssets);
|
|
396583
|
+
components.byNs.set(imp.ns, modComponents);
|
|
396584
|
+
} else {
|
|
396585
|
+
for (const [id, a] of modAssets) assets.bare.set(id, a);
|
|
396586
|
+
for (const [name, d] of modComponents) components.bare.set(name, d);
|
|
396587
|
+
}
|
|
396588
|
+
}
|
|
396589
|
+
return { assets, components };
|
|
396590
|
+
}
|
|
396591
|
+
function compileDsl(text, opts = {}) {
|
|
396592
|
+
const services = createWadiServices(EmptyFileSystem).Wadi;
|
|
396593
|
+
const model = parseModel(services, text);
|
|
396594
|
+
const linked = linkModules(model, services, opts.resolveModule);
|
|
396595
|
+
return modelToHouseConfig(model, linked);
|
|
396596
|
+
}
|
|
396597
|
+
function moduleExports3(text) {
|
|
396598
|
+
const services = createWadiServices(EmptyFileSystem).Wadi;
|
|
396599
|
+
const model = parseModel(services, text);
|
|
396600
|
+
return {
|
|
396601
|
+
assets: model.assets.map((a) => assetDeclToObj(a)),
|
|
396602
|
+
components: model.components.map((d) => ({
|
|
396603
|
+
name: d.name,
|
|
396604
|
+
...d.goal ? { goal: unquote(d.goal) } : {},
|
|
396605
|
+
params: d.params.map((p) => ({
|
|
396606
|
+
name: p.name,
|
|
396607
|
+
...p.default !== void 0 ? { default: p.default } : {},
|
|
396608
|
+
...p.label ? { label: unquote(p.label) } : {}
|
|
396609
|
+
}))
|
|
396610
|
+
}))
|
|
396611
|
+
};
|
|
395906
396612
|
}
|
|
395907
396613
|
|
|
395908
396614
|
// src/pipeline.ts
|
|
@@ -410856,6 +411562,10 @@ var componentParam = external_exports2.object({
|
|
|
410856
411562
|
}).strict();
|
|
410857
411563
|
var componentDef2 = external_exports2.object({
|
|
410858
411564
|
name: external_exports2.string().optional(),
|
|
411565
|
+
// A short natural-language description of what this component accomplishes
|
|
411566
|
+
// (the discovery key for goal-based module lookup, e.g. "climb to the next
|
|
411567
|
+
// floor"). Purely metadata — renderers ignore it.
|
|
411568
|
+
goal: external_exports2.string().optional(),
|
|
410859
411569
|
params: external_exports2.array(componentParam).optional(),
|
|
410860
411570
|
variables: external_exports2.record(external_exports2.string(), numOrFormula).optional(),
|
|
410861
411571
|
points: external_exports2.record(external_exports2.string(), external_exports2.object({ x: numOrFormula, y: numOrFormula }).strict()).optional(),
|
|
@@ -411509,9 +412219,13 @@ function expandComponent(inst, hostConfig, wallThickness, opts, depth) {
|
|
|
411509
412219
|
overrides[k] = v;
|
|
411510
412220
|
}
|
|
411511
412221
|
}
|
|
412222
|
+
const paramDefaults = {};
|
|
412223
|
+
for (const p of def.params ?? []) {
|
|
412224
|
+
if (p.name && typeof p.default === "number") paramDefaults[p.name] = p.default;
|
|
412225
|
+
}
|
|
411512
412226
|
const subConfig = {
|
|
411513
412227
|
components: hostConfig.components,
|
|
411514
|
-
variables: { ...def.variables ?? {}, ...overrides },
|
|
412228
|
+
variables: { ...paramDefaults, ...def.variables ?? {}, ...overrides },
|
|
411515
412229
|
points: def.points,
|
|
411516
412230
|
floors: [{ floor_number: 0, name: ref, objects: structuredClone(def.objects) }]
|
|
411517
412231
|
};
|
|
@@ -417239,9 +417953,88 @@ function computeRoofSections(cfg, _options = {}) {
|
|
|
417239
417953
|
init_format();
|
|
417240
417954
|
init_config();
|
|
417241
417955
|
import { Resvg } from "@resvg/resvg-js";
|
|
417956
|
+
|
|
417957
|
+
// src/assets.generated.ts
|
|
417958
|
+
var EXAMPLES = {
|
|
417959
|
+
"minimal": '// Minimal valid house \u2014 one floor, one room. The smallest thing that renders.\nhouse Minimal {\n convention center\n units feet_inches per_unit 10\n site { plot (300, 300) }\n defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }\n\n // No floor slab modelled here, so slab_thickness is 0 (convention C3) \u2014 the\n // walls sit directly on grade instead of floating on a phantom deck.\n floor 1 "Ground" slab_thickness 0 {\n room Studio at (4, 4) size (200, 240) {\n wall east west // enclose the exterior sides (C2)\n wall south { door Main at 90 size (34, 84) }\n wall north { window Light at 80 size (60, 50) sill 35 }\n }\n }\n}\n',
|
|
417960
|
+
"two_room": `// Two rooms, NO grid \u2014 explicit centreline coordinates. Adjacent rooms just
|
|
417961
|
+
// abut on a shared line (center convention), so Living's east edge (x=204) is
|
|
417962
|
+
// Bedroom's west edge. A door connects them; each has a window.
|
|
417963
|
+
house TwoRoom {
|
|
417964
|
+
convention center
|
|
417965
|
+
units feet_inches per_unit 10
|
|
417966
|
+
site { plot (420, 300) }
|
|
417967
|
+
defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }
|
|
417968
|
+
|
|
417969
|
+
// No slab modelled \u21D2 slab_thickness 0 so the walls don't float (convention C3).
|
|
417970
|
+
floor 1 "Ground" slab_thickness 0 {
|
|
417971
|
+
room Living at (4, 4) size (200, 240) {
|
|
417972
|
+
wall west // exterior side, enclosed (C2)
|
|
417973
|
+
wall south { door FrontDoor at 80 size (34, 84) }
|
|
417974
|
+
wall east { door Passage at 90 size (32, 84) }
|
|
417975
|
+
wall north { window LivWin at 70 size (60, 50) sill 35 }
|
|
417976
|
+
}
|
|
417977
|
+
room Bedroom at (204, 4) size (160, 240) {
|
|
417978
|
+
wall south // exterior side, enclosed (C2)
|
|
417979
|
+
wall north { window BedWin at 60 size (55, 50) sill 35 }
|
|
417980
|
+
wall east { window BedWinE at 90 size (45, 45) sill 40 }
|
|
417981
|
+
}
|
|
417982
|
+
}
|
|
417983
|
+
}
|
|
417984
|
+
`,
|
|
417985
|
+
"two_story": '// Multi-floor, grid-driven: a Plinth floor, two occupied floors, and a hip roof.\n// Everything is first-class now \u2014 ground, plinth, slab, staircase, and roof are\n// real entities with parameters (no `raw`). Widen it by editing `point House`.\nhouse TwoStory {\n convention center\n units feet_inches per_unit 10\n\n site { plot (500, 500) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n var wallT = 8\n point House { x = 352, y = 352 }\n grid main {\n x: 1 @ wallT / 2, 2 @ House.W / 2, 3 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L / 2, C @ House.L - wallT / 2\n }\n\n // The plinth floor\'s height MUST equal the plinth block height (convention\n // C1) or the Ground Floor above would float 40 units into the air.\n floor 0 "Plinth" height 40 {\n ground name "Ground" at (0, 0) size (500, 500) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n height 40 layer "plinth"\n }\n\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n room Hall at (main.x1, main.yA) size (main.x3 - main.x1, main.yB - main.yA) {\n wall north east west // all three exterior sides (C2)\n wall south { door Main at 120 size (36, 84) }\n }\n room Kitchen at (main.x1, main.yB) size (main.x2 - main.x1, main.yC - main.yB) {\n wall south // exterior side (C2)\n wall west { window KW at 40 size (45, 45) sill 40 }\n }\n room Bath at (main.x2, main.yB) size (main.x3 - main.x2, main.yC - main.yB) {\n wall south // exterior side (C2)\n wall east { window BW at 30 size (40, 40) sill 45 }\n }\n }\n\n floor 2 "First Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n room Bedroom1 at (main.x1, main.yA) size (main.x2 - main.x1, main.yC - main.yA) {\n wall north south // exterior sides (C2)\n wall west { window B1 at 60 size (55, 50) sill 35 }\n }\n room Bedroom2 at (main.x2, main.yA) size (main.x3 - main.x2, main.yC - main.yA) {\n wall north south // exterior sides (C2)\n wall east { window B2 at 60 size (55, 50) sill 35 }\n }\n staircase name "Stair" at (300, 60) step (7, 10, 36) direction south\n }\n\n floor 3 "Loft Floor" {\n roof name "Hip Roof" pitched endpoint closed slope height 100 overhang 25 {\n segment "seg0" from (176, 0) to (176, 352) width 352 hip_setback (80, 80) tie_beams 3\n truss "seg0" fink at (80, 176, 272)\n }\n }\n}\n',
|
|
417986
|
+
"coastal": '// A coastal Konkan cottage, authored entirely in the Wadi DSL.\n// `tsx src/cli/main.ts examples/coastal.wdl` compiles it to a .wadi that the\n// real Wadi pipeline validates + resolves + renders. This one file exercises\n// the parametric core (var/point/grid/formula/configurator) and the domain\n// vocabulary \u2014 every primitive is FIRST-CLASS (ground, plinth, slab, room,\n// wall, opening, pillar, roof), no `raw` needed.\n\nhouse CoastalCottage {\n convention center\n units feet_inches per_unit 10\n\n site { plot (600, 700) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n // --- Parametric core: the degrees of freedom + the grid scaffold ---\n var wallT = 8\n var pillarW = 10\n var pilInset = (pillarW - wallT) / 2\n var roof_style = 3\n\n point House { x = 420, y = 470 }\n\n grid main {\n x: 1 @ wallT / 2 role structural,\n 2 @ House.W / 2,\n 3 @ House.W - wallT / 2 role structural\n y: A @ wallT / 2 role structural,\n B @ House.L / 2,\n C @ House.L - wallT / 2 role structural\n }\n\n // --- Control knobs a homeowner turns (a curated projection of the vars) ---\n configurator {\n slider pillarW "Column size" ft [8 .. 14 step 1]\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n }\n\n // --- Plinth floor: terrain + raised base ---\n floor 0 "Plinth" height 40 { // floor height == plinth height (C1)\n ground name "Ground" at (0, 0) size (600, 700) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n height 40 layer "plinth"\n }\n\n // --- Ground floor: slab + grid-placed rooms + corner pillars ---\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n\n room Living\n at (main.x1, main.yA)\n size (main.x2 - main.x1, main.yB - main.yA) {\n wall west // exterior side (C2)\n wall north { window LivWinN at 55 size (55, 55) sill 35 }\n wall south { door LivDoor at 60 size (32, 80) }\n }\n\n room Kitchen\n at (main.x2, main.yA)\n size (main.x3 - main.x2, main.yB - main.yA) {\n wall north // exterior side (C2)\n wall east { window KitWinE at 40 size (45, 45) sill 40 }\n }\n\n room Bedroom\n at (main.x1, main.yB)\n size (main.x3 - main.x1, main.yC - main.yB) {\n wall east // exterior side (C2)\n wall west { window BedWinW at 50 size (55, 55) sill 35 }\n wall south { door BedDoor at 70 size (32, 80) }\n }\n\n // A pillar\'s `at` is its TOP-LEFT corner \u2014 to centre a column on a grid node,\n // subtract half its width (perimeter columns also inset by pilInset).\n pillar C1 at (main.x1 + pilInset - pillarW/2, main.yA + pilInset - pillarW/2) size (pillarW, pillarW) height 116\n pillar C2 at (main.x3 - pillarW/2, main.yA + pilInset - pillarW/2) size (pillarW, pillarW) height 116\n }\n\n // --- Loft floor: the hip roof (first-class \u2014 nested segments/slope/trusses) ---\n floor 2 "Loft Floor" {\n roof name "Hip Roof" pitched endpoint closed slope height 100 overhang 25 {\n segment "seg0" from (210, 0) to (210, 470) width 420 hip_setback (90, 90)\n truss "seg0" fink at (95, 235, 375)\n }\n }\n}\n',
|
|
417987
|
+
"complete": '// Coverage showcase \u2014 every model entity as FIRST-CLASS syntax, no `raw`:\n// layers, a component library (definition + `use` instance), ground, plinth,\n// slab, beam, room (with openings + an anchored item), a free-standing wall,\n// a kitchen platform, free furniture (item), a pillar, and a gable roof that is\n// `enabled`-gated by the configurator variable. If it compiles + validates,\n// the DSL covers the whole model.\nhouse CompleteShowcase {\n convention center\n units feet_inches per_unit 10\n\n site { plot (400, 500) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n var wallT = 8\n var roof_style = 2 // 2 = Gable (drives the enabled gate below)\n point House { x = 300, y = 400 }\n\n // Per-house display layers (registry).\n layer "structure" "Structure" group "Frame"\n layer "furniture" "Furniture" color "#8B5A2B"\n\n // Reusable component: a low RCC bench, authored in local coords.\n component Bench {\n param blen = 60 label "Bench length"\n param bdep = 18\n beam name "BenchTop" at (0, 0) size (blen, bdep) height 6 layer "structure"\n }\n\n configurator {\n slider wallT "Wall thickness" in [6 .. 12 step 1]\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n }\n\n grid main {\n x: 1 @ wallT / 2, 2 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L - wallT / 2\n }\n\n floor 0 "Plinth" height 40 { // floor height == plinth height (C1)\n ground name "Ground" at (0, 0) size (400, 500) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA)\n height 40 layer "plinth"\n }\n\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA)\n\n // A tie beam across the rear span.\n beam name "Tie" at (main.x1, main.yB - 8) size (main.x2 - main.x1, 8) height 8 layer "structure"\n\n // Living room with a door, a window, and a bed anchored to a corner.\n room Living at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA) {\n wall east west // plain walls \u2014 several in one line\n wall south { door Main at 120 size (36, 84) } // walls with openings: one side each\n wall north { window N1 at 100 size (60, 50) sill 35 }\n item asset { id "bed_double" src "furniture/bed_double.glb" dims (1.5, 0.5, 2.0) category "bedroom" }\n anchor bottom-right gap (12, 12) rotation 0\n }\n\n // A free-standing partition wall.\n wall Partition from (main.x1 + 100, main.yA) to (main.x1 + 100, main.yB - 150)\n height 108 facing east layer "structure"\n\n // An L-shaped kitchen counter (polyline path).\n kitchen name "Counter" path ((40, 40), (140, 40), (140, 120)) side right depth 24 height 36 layer "structure"\n\n // Free furniture placed by absolute plan coordinates.\n item name "Sofa" asset { id "sofa" src "furniture/sofa.glb" dims (1.9, 0.8, 0.9) category "living" }\n at (150, 300) rotation 90 scale 1 layer "furniture"\n\n // A corner column, and a stamped Bench component (param overridden).\n pillar C1 at (main.x1, main.yA) size (10, 10) height 116 layer "structure"\n use Bench as "WindowBench" at (60, 60) with { blen = 80 }\n }\n\n floor 2 "Loft" {\n // Gable roof (open endpoints), gated so it renders only when roof_style == 2.\n roof name "Gable Roof" pitched endpoint open slope angle 30 overhang 20\n enabled 1 - min(1, abs(roof_style - 2)) layer "roof" {\n segment "seg0" from (150, 0) to (150, 400) width 300 gable_overhang (20, 20) tie_beams 2\n truss "seg0" fink at (80, 200, 320)\n }\n }\n}\n',
|
|
417988
|
+
"konkan_cottage": '// konkan_cottage \u2014 a small single-storey Konkan house assembled from the\n// bundled MODULE packs, showing the whole import/reuse flow in one file:\n// \u2022 `import "std-furniture" as f` \u2192 drop GLB furniture with `item f."id"`\n// \u2022 `import "konkan/base" as kb` \u2192 stamp goal-tagged parts with `use kb.Name`\n// The two hand-built rooms (Hall, Bedroom) are furnished; everything else\n// (kitchen, bathroom, verandah, otla, tulsi vrindavan) comes from the pack.\nhouse KonkanCottage {\n convention center\n units feet_inches per_unit 10\n\n site { plot (420, 440) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 }\n\n import "std-furniture" as f // furniture pack (assets \u2192 item f."id")\n import "konkan/base" as kb // house-parts pack (components \u2192 use kb.Name)\n\n // One habitable floor sitting straight on grade (no slab \u21D2 slab_thickness 0, C3).\n floor 1 "Ground" slab_thickness 0 {\n\n // --- hand-built, furnished rooms ---\n room Hall at (40, 40) size (180, 150) {\n wall north east west\n wall south { door HallDoor at 80 size (36, 84) }\n item f."sofa" anchor center\n }\n room Bedroom at (240, 40) size (140, 150) {\n wall north south west\n wall east { window BedWin at 55 size (55, 55) sill 35 }\n item f."bed_double" anchor center\n }\n\n // --- parts from konkan/base ---\n use kb.Kitchen at (40, 210) // "cooking area with an L-shaped counter"\n use kb.Bathroom at (210, 210) with { wide = 70, deep = 60 } // "compact enclosed wet area"\n use kb.Verandah at (40, 350) with { across = 200, deep = 70 } // "shaded sit-out along the front"\n use kb.Otla at (260, 360) // "raised entrance platform (otla)"\n use kb.TulsiVrindavan at (360, 370) // "courtyard planter for tulsi"\n }\n}\n'
|
|
417989
|
+
};
|
|
417990
|
+
var DOCS = {
|
|
417991
|
+
"guide": {
|
|
417992
|
+
"title": "How to author a Wadi house (the workflow)",
|
|
417993
|
+
"body": '# Wadi architect \u2014 author `.wdl` house designs with a live 3D preview\n\nYou are the architect/editor. The user describes a house (in words, or with a\nsketch/photo); you write or update its **`.wdl`** file (the Wadi DSL), and the **Wadi\napp\'s DSL editor renders the model live** from that same file. The user watches and\nsteers with follow-up messages \u2014 and can edit the `.wdl` alongside you.\n\nYou author in the **Wadi DSL** (`.wdl`), not raw JSON. It\'s more direct (formulas,\ngrids, and the configurator are one-liners), the grammar enforces structure, and the\ncompiler reports parse errors with `line:col`. The DSL is **complete** \u2014 every object\ntype has first-class syntax \u2014 so it can express any house the model can hold.\n**`reference/dsl.md` is your syntax reference; read it first.**\n\n**The `.wdl` IS the design \u2014 do not produce a `.wadi`.** The Wadi app\'s DSL previewer\ncompiles + renders the `.wdl` live (in-app), so a single `.wdl` file on disk is the\n**shared source you and the human co-edit**. You never convert it to JSON; you just\nauthor the `.wdl` and verify it with `check.sh`.\n\nThis skill is **agent-neutral** \u2014 it is plain instructions + reference docs + scripts,\nusable by any coding agent (Claude Code, Google Antigravity, \u2026). Agent-specific\nentrypoints live outside this folder (e.g. `.claude/skills/wadi-architect/` for Claude\nCode, `AGENTS.md` at the repo root); they just point here.\n\n## What you need to run this\n\n- **Read/write files** and **run shell + Node** (the only capabilities assumed).\n- The **Wadi repo checked out**, with deps installed once:\n `npm --prefix editor install` and `npm --prefix wadi-dsl install` (the latter also\n regenerates the DSL parser via its `prepare` hook). The `check` and `preview` scripts\n reuse the app\'s own TypeScript, so they flag exactly what the app would.\n- For the *live* render: the **Wadi app\'s DSL editor** open on the `.wdl` you edit \u2014\n desktop **\u2318\u21E7D \u2192 Open**, or the browser playground at `wadi.house/dsl`. It compiles +\n renders the `.wdl` live. Without it you can still author + `check` + render preview\n images yourself.\n\n## The live loop (read this first, every session)\n\nThe **`.wdl` file is the single shared source.** You edit it; the Wadi app\'s DSL editor\n\u2014 open on that same file \u2014 compiles and re-renders it live; the human can edit it too (in\nthe DSL editor, in their own editor, or by asking you). **You never produce or touch a\n`.wadi`** \u2014 the app does the `.wdl` \u2192 render conversion.\n\n**Starting a NEW model:**\n1. Write a starter `house.wdl` (copy the shape from `../../wadi-dsl/examples/` \u2014 start\n from `minimal.wdl`, or `coastal.wdl` for a full cottage) at a path the user wants,\n e.g. `~/Documents/<name>.wdl`.\n2. Tell the user to open it in the **Wadi DSL editor** (**\u2318\u21E7D \u2192 Open** in the desktop\n app) so it renders live and watches the file.\n3. Build the house by editing `house.wdl`. Run `check.sh` after each change to confirm it\n still compiles + validates; the editor re-renders as the file changes.\n\n**Editing an EXISTING model:** edit its `.wdl`. Because it\'s a **co-edited** file, **read\nit first** (the human may have changed it since your last edit) and make a **minimal\npatch** \u2014 change only the lines you need and preserve the rest verbatim, so your edit\nmerges cleanly with theirs.\n\n**Always:**\n- **Tell the user which `.wdl` you are editing**, and edit only that path.\n- **Run `check.sh` after every edit.** It runs the DSL compiler + validator against a\n **throwaway temp** (it does NOT create a `.wadi`) purely for feedback \u2014 fix any\n reported error before telling the user anything changed. A broken `.wdl` just makes the\n editor show a diagnostic and keep the last good render; it never corrupts anything.\n\n## Two ways users work with you\n\n- **Brief \u2192 house.** They describe requirements ("3-bed L-shaped bungalow, ~1500 sq\n ft, hip roof"). You *derive* the base config. Keep a running **design brief** as the\n source of truth so later changes re-derive cleanly \u2014 see `prompts/design-brief.md`.\n This is Wadi\'s "higher-level language": the brief is the intent, the config is the\n derived artifact, you are the compiler.\n- **Drawings \u2192 house (recreate an existing design).** **Do NOT try to read dimensions\n off an architect\'s drawing yourself \u2014 it\'s unreliable and produces the wrong house.**\n Instead run a **guided dialog**: the USER reads their drawing and describes each\n piece in plain terms (names, sizes in feet, where things sit), and YOU do all the\n coordinate / scale / convention work, building **one room at a time** and rendering\n after each so they confirm. Ask **spatially** ("how big? which corner? next to\n what?"), never for coordinates. Never build the whole plan from one answer. Full\n method in `prompts/sketch-to-config.md`.\n- **Iterate.** They react to the live model ("make Bedroom 2 bigger", "add a north\n window"). Apply a **minimal patch** \u2014 see `prompts/update-existing.md`.\n\n## The data model & references (read lazily \u2014 don\'t dump them all up front)\n\n- **`reference/dsl.md`** \u2014 **your primary reference: the complete `.wdl` SYNTAX** \u2014\n the skeleton, the parametric core (var/point/grid/configurator/formulas), the common\n attribute tail (`enabled`/`z_offset`/`layer`/`material`), and the first-class syntax\n for every object type (rooms/walls/openings, slab/beam/plinth/ground/pillar,\n staircase/kitchen/item, roof, components, layers) plus the `raw` escape. Read this\n first, then the semantics references below.\n- **`reference/data-model.md`** \u2014 the underlying **`.wadi` schema** the DSL compiles to:\n every object type, field, type, requiredness, units, semantics. **Generated from the\n Zod schema** (`editor/src/schema/houseConfig.ts`) so it can\'t drift \u2014 regenerate with\n `scripts/gen-schema-doc.mjs` after any schema change. It\'s the field reference for the\n `raw` escape and for understanding exactly what your `.wdl` produces.\n- **`reference/coordinate-system.md`** \u2014 the #1 source of mistakes. X\u2192right, **Y\u2192DOWN**\n (Inkscape frame, not Y-up), Z\u2192up. Units: **10 project units = 1 ft** by default. Read\n before placing anything.\n- **`reference/roof-v2-guide.md`** \u2014 the unified `roof` object (segments, hip vs gable,\n joints, trusses, shed). Its fields are freeform in the schema (validated at\n derivation), so this guide is the field reference for roofs. Read before touching a\n roof.\n- **`reference/conventions.md`** \u2014 the **structural coding conventions** every house\n must follow (plinth-floor height must match the plinth block, rooms must wall every\n exterior side, a floor with no slab must set `slab_thickness 0`, \u2026). These are\n *enforced* by `check.sh` \u2014 errors fail, warnings are advisory \u2014 and shown in the DSL\n editor\'s status. Read it so you author sound houses the first time.\n- **`reference/parametric-conventions.md`** \u2014 how to build a **fully-parametric** model\n (a reusable template that stays valid under any knob change): the **grid-first**\n recipe \u2014 variables (knobs) \u2192 named grid lines (formulas of the house size) \u2192 rooms &\n columns that reference those lines \u2014 plus `coord_convention:center`, proportional grid\n lines with minimums, the `pilInset` flush-column rule, opening placement, and the\n scale-sweep verification. Read before authoring or editing a parametric template.\n- **`../../wadi-dsl/examples/*.wdl`** \u2014 correct, validated `.wdl` houses to copy shapes\n from (every one passes the compile \u2192 resolve \u2192 schema+geometry pipeline in the DSL\'s\n test suite, so **copy from these, not from memory**): `minimal.wdl` (smallest house),\n `two_room.wdl` (no grid), `two_story.wdl` (multi-floor + hip roof), `coastal.wdl`\n (grid + configurator + full cottage), `complete.wdl` (every entity \u2014 beam, wall,\n kitchen, item, component, gable roof, layers). `examples/coastal_konkan.wadi` in this\n folder is a resolved `.wadi` for reference on the compiled output shape.\n\n## Check after every edit (get compiler feedback \u2014 no `.wadi` produced)\n\n`check.sh` runs the DSL end-to-end for **feedback only**: it parses the `.wdl` (reporting\nparse errors with `line:col`), resolves formulas/grids into numbers, and runs the real\nschema + roof/wall geometry validator (catches zero-length roof segments, missing slope,\nbad openings that the schema alone misses), and finally the **structural conventions**\nlinter (`reference/conventions.md`: floating floors, open exterior walls, no-slab floors)\n\u2014 all against a **throwaway temp** that is deleted. It never writes a `.wadi`; the app\'s\nDSL previewer does the real conversion.\n\nConvention **errors** (`\u2716 [C\u2026]`) fail the check \u2014 fix them. Convention **warnings**\n(`\u26A0 [C\u2026]`) are printed but don\'t fail; fix them, or keep them if the open side is a\ndeliberate verandah.\n\n```bash\nwadi-skill/architect/scripts/check.sh "<ABS>.wdl"\n```\n\nExit 0 = compiles + valid. Non-zero prints the exact `parse: \u2026` or `/path: message`\nerror \u2014 fix the `.wdl` and re-run before telling the user anything is ready.\n\n**If you have the `wadi_*` MCP tools** (from the `wadi-mcp` server) instead of a repo\ncheckout, use them \u2014 they\'re the same pipeline, no clone needed: `wadi_check(wdl)` for\nthis step, `wadi_preview(wdl)` for the images below, and `wadi_examples` / `wadi_reference`\nfor the examples and these docs.\n\n## See your work (don\'t author blind)\n\nYou can\'t see the app\'s live render, but you CAN render your `.wdl` to images and **read\nthem** to check your own edit \u2014 layout, sizes, openings, and roof are exactly where\nmistakes happen. `preview.sh` takes the `.wdl` directly (it compiles to a throwaway temp\njust for rendering \u2014 again, no persistent `.wadi`):\n\n```bash\nwadi-skill/architect/scripts/preview.sh "<ABS>.wdl"\n```\n\nIt writes (and prints paths to) `plans.png` (floor plans \u2014 room layout + sizes),\n`elevations.png` (front/back/left/right \u2014 heights + **roof profile**, the 2D view of the\nbuilt 3D model), and `roof.png` (roof top view), plus all SVGs under `.../2d/`. **Read\nthe PNGs** after a non-trivial edit and confirm what you built matches the request (rooms\nin the right place, not overlapping, correct sizes in feet, roof over the plinth). **If\nit doesn\'t match, fix the `.wdl` and re-render \u2014 repeat until it looks right, and only\nthen tell the user it\'s ready.** It reuses the app\'s own generators, so it matches the\napp\'s 2D tabs byte-for-byte. See `prompts/verify-visually.md`.\n\n## Top pitfalls (memorize)\n\n- **Y is DOWN.** A room "to the north" has a *smaller* Y. Never treat Y as up.\n- **Dimensions are project units, not feet.** `width: 120` is 12 ft. Multiply feet by\n 10 (the default; `units.per_unit` can change it).\n- **Set `"coord_convention": "center"`.** Then a room\'s `x,y,width,length` are wall\n **CENTRELINES**, and **two rooms that share a wall just ABUT on the shared line** \u2014 room\n A spans X `[0,150]`, room B `[150,300]`; the wall is centred on `150` and shared. No\n overlap, no `wall_thickness` math (the system grows to the outer face at render). On a\n grid, a room is simply `x:"= main.x1", width:"= main.x2 - main.x1"`. (Legacy files\n without the flag use the OUTER convention where adjacent rooms must overlap by\n `wall_thickness`.) See `coordinate-system.md` \u2192 "the centreline convention".\n- **The roof footprint must cover the plinth footprint.** Roof segment widths and\n positions come from the walls they sit on, not arbitrary numbers.\n- **The roof lives on its OWN top floor** (`floor_number` ABOVE the floors it covers,\n containing only the roof), and you **never set its Z** \u2014 the base height is computed\n from the plinth height + the `height`s of the floors below it. To move the roof\n up/down, change floor heights, not the roof. (See `reference/roof-v2-guide.md`.)\n- **Floors stack; `floor_number` is 0-based** (the plinth floor = 0). Heights are\n independent per floor (`height`, `wall_height`, `slab_thickness` are unrelated\n fields) \u2014 *except* where the **structural conventions** require a match: the\n plinth-floor `height` must equal the plinth block height, and a floor with no slab\n must set `slab_thickness 0`, or the floors above float. See `reference/conventions.md`.\n- **A partial `wall` list makes a room a whitelist.** A bare room (no `wall` lines) is\n enclosed on all four sides; add one `wall` line and every side you don\'t list becomes a\n hole. Wall every **exterior** side (convention C2). List plain sides compactly:\n `wall east west`, then the opening sides separately.\n- **Minimal patches.** Preserve unchanged `.wdl` lines verbatim so the user (and diffs)\n can see exactly what moved.\n- **Formulas are bare expressions in the DSL** \u2014 write `at (main.x1, main.yA)`, not\n `"= main.x1"`; the compiler emits the `= \u2026` form. Quote only `name "\u2026"` strings;\n `room`/`pillar`/`var`/grid-line names are bare identifiers.\n- **Errors are caught by `check.sh`.** A parse error (bad syntax) or a `.strict()` schema\n error (unknown/misspelled key inside a `raw` block) fails `check.sh` with the exact\n location \u2014 and the app\'s DSL editor shows the same squiggle live; nothing reaches the\n model silently.\n'
|
|
417994
|
+
},
|
|
417995
|
+
"dsl": {
|
|
417996
|
+
"title": "The Wadi DSL (.wdl) \u2014 syntax reference",
|
|
417997
|
+
"body": '# The Wadi DSL (`.wdl`) \u2014 authoring reference\n\nYou author houses in the **Wadi DSL** \u2014 a small, formal language (`.wdl`) that\ncompiles to a resolved `.wadi` (`house_config.json`). The DSL is **complete**:\nevery object type in the model has first-class syntax, so you rarely need the\n`raw` escape. Authoring the DSL is more direct and less error-prone than writing\nJSON \u2014 the grammar enforces structure, and `check.sh` reports parse errors with\nline:col.\n\n**This file is the SYNTAX reference.** The *semantics* live in the other\nreferences and apply unchanged \u2014 read them:\n\n- `coordinate-system.md` \u2014 X\u2192right, **Y\u2192DOWN**, Z\u2192up; **10 units = 1 ft**;\n the **centreline** convention. The #1 source of mistakes.\n- `conventions.md` \u2014 the **structural coding conventions** (`check.sh` enforces\n them): plinth-floor height must match the plinth block, rooms must wall every\n exterior side, a no-slab floor must set `slab_thickness 0`.\n- `parametric-conventions.md` \u2014 the grid-first recipe for reusable templates.\n- `roof-v2-guide.md` \u2014 roof segments, hip vs gable, trusses, joints.\n- `data-model.md` \u2014 the underlying `.wadi` schema (what the DSL compiles to; also\n the field reference for the `raw` escape).\n\n## The loop\n\n1. Write / edit `house.wdl` \u2014 the **single shared source** (you and the human\n co-edit it; the app\'s DSL previewer renders it live). You never produce a `.wadi`.\n2. `wadi-skill/architect/scripts/check.sh house.wdl` \u2014 runs the DSL compiler +\n validator (schema + wall/roof geometry) against a **throwaway temp** just for\n feedback; fix any reported error and re-run.\n3. `preview.sh house.wdl` \u2192 read the PNGs (plans / elevations / roof) to check your\n work. (It also compiles to a throwaway temp \u2014 no persistent `.wadi`.)\n\n## Skeleton\n\n```wdl\nhouse MyHouse {\n convention center // ALWAYS use center (wall-centreline coords)\n units feet_inches per_unit 10 // 10 project units = 1 ft\n site { plot (WIDTH, LENGTH) ref (0, 0) }\n defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }\n\n // parametric core (optional): var, point, grid, configurator\n // component / layer declarations (optional)\n floor 0 "Plinth" { \u2026 } // floors stack in source order (0 = plinth)\n floor 1 "Ground Floor" { \u2026 }\n floor 2 "Loft" { roof \u2026 } // roof lives ALONE on its own top floor\n}\n```\n\nNumbers are **project units** (feet \xD7 10 by default). Names after `house`,\n`room`, `pillar`, `var`, `point`, `grid`, and `use`/`component` are bare\nidentifiers (no spaces); names introduced with the `name` keyword are quoted\nstrings.\n\n## Parametric core (domain-neutral)\n\n```wdl\nvar wallT = 8 // a knob; may reference other vars\nvar pilInset = (pillarW - wallT) / 2\n\npoint House { x = 420, y = 470 } // reference as House.x / House.W / House.L\n // (.W = x, .L = y \u2014 a point doubles as a size)\n\ngrid main { // named wall centrelines; publishes main.x1 / main.yA\n x: 1 @ wallT / 2, 2 @ House.W / 2, 3 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L / 2, C @ House.L - wallT / 2\n}\n// each line may add: \u2026 @ <expr> thick <expr> role structural|planning\n\nconfigurator { // the knobs a downstream user turns\n slider pillarW "Column size" ft [8 .. 14 step 1]\n number ceiling "Ceiling height" ft\n toggle has_loft "Add a loft"\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n}\n```\n\n**Formulas are automatic.** Any geometry number can be a formula \u2014 just write the\nexpression instead of a literal (`at (main.x1, main.yA)`, `size (House.W/2, 200)`).\nOperators: `+ - * /`, unary `-`, parentheses, and the functions\n`min max clamp round floor ceil abs`. References: a `var`, a `point`\n(`House.W`), or a grid line (`main.x3 - main.x1`). No comparison operators \u2014 gate\nthings with the `min/abs` idiom (see `enabled` below).\n\n## Common attribute tail (every object)\n\nAfter an object\'s geometry, in THIS order, any of:\n\n```\n\u2026 z_offset <expr> enabled <expr> layer "id" [material "id"]\n```\n\n- `enabled <expr>` \u2014 the on/off switch. A `0`/`false` value hides the object. To\n gate on a configurator variable, use a 0/1 formula:\n `enabled 1 - min(1, abs(roof_style - 3))` renders the object only when\n `roof_style == 3`. (This is how one template carries several roofs and shows\n only the chosen one.)\n- `z_offset <expr>` \u2014 lift above the floor base (split levels).\n- `material "id"` \u2014 only on plinth / ground / room / wall / staircase / kitchen /\n roof.\n\n## Objects \u2014 structure & envelope\n\n```wdl\nslab [name "N"] at (x,y) size (w,l) [thickness <t>] // floor_slab\nbeam [name "N"] at (x,y) size (w,l) [height <h>]\nplinth [name "N"] at (x,y) size (w,l) height <h> // raised base (Plinth floor)\nground [name "N"] at (x,y) size (w,l) [height <h>] // terrain plane\npillar Name at (x,y) size (w,l) [height <h>] // (x,y) = TOP-LEFT corner\n```\n\n`at (x,y)` is the **TOP-LEFT CORNER** \u2014 **not the centre** \u2014 for every one of these\n(same as rooms/slabs/beams); `size (w,l)` is width \xD7 length. All accept the common tail.\n\n**Pillars catch people out here.** A column reads as "placed at a point," but `at` is\nstill its corner. To **centre a column on a point** `(cx, cy)` \u2014 a grid node, a room\ncorner \u2014 place it at **`at (cx - w/2, cy - l/2)`**, never at `(cx, cy)`. On a grid, the\n`pilInset` idiom (see `parametric-conventions.md`) does exactly this so columns sit flush.\n\n## Objects \u2014 rooms, walls & openings\n\nA room shows exactly the walls you declare. A **bare room (no `wall` lines) is\nenclosed on all four sides.** List plain walls compactly; give a wall its own line\nonly when it carries a door/window; omit a side to leave it open (verandah).\n\n```wdl\nroom Name at (x,y) size (w,l) [height <h>] [material "\u2026"] {\n wall east west north // plain walls \u2014 several in one statement\n wall south { door Main at <offset> size (w,h) [open] } // wall WITH openings: one side\n wall west { window W at <offset> size (w,h) [sill <s>] [open] }\n item asset { \u2026 } anchor center [gap (gx,gy)] // furniture anchored inside the room\n}\n```\n\n- `wall <side>\u2026` sides are `north|south|east|west`. A `wall <side>` line may also\n add `height <h>` / `height_end <h>` (sloped).\n- `door`/`window` `at <offset>` is measured along the wall from its start;\n `size (width, height)`; `window \u2026 sill <s>` sets the sill height; `open` = a bare\n hole (no leaf/glazing).\n\nA **free-standing wall** (not a room side):\n\n```wdl\nwall Name from (x1,y1) to (x2,y2) [height <h>] [height_end <h>] [facing north|\u2026] {\n \u2026 door/window openings \u2026\n}\n```\n\n- `from`/`to` are the wall\'s **centreline** endpoints; the wall is drawn as a rectangle\n `wall_thickness` wide, centred on that line.\n- **Overlap walls at corners \u2014 they do NOT auto-mitre.** Two free-standing walls that\n merely *touch* at a shared endpoint leave an unfilled square notch (\xBD\xB7`wall_thickness`)\n at the corner, because each is just a rectangle capped at its endpoint. To fill the\n corner, **extend the endpoints so the wall bodies OVERLAP** \u2014 run at least one wall\'s\n end **half the wall thickness past** the shared point (overlapping by the full thickness\n is fine and simplest). For an L of thickness 8 meeting at `(160,40)`:\n\n ```wdl\n wall H from (40, 40) to (164, 40) height 108 // ends 4 (\xBD\xB78) PAST the corner\n wall V from (160, 40) to (160, 160) height 108 // butts into H\'s overlapped body\n ```\n\n (Room walls handle their own corners; this only applies to `wall \u2026 from \u2026 to \u2026`.)\n\n## Objects \u2014 circulation & fittings\n\n```wdl\nstaircase [name "N"] at (start_x, start_y) step (rise, tread, width)\n direction north|south|east|west\n [total_height <h>] [max_run <r>] [landing_depth <d>]\n [landing_thickness <t>] [turn clockwise|anticlockwise] [flight_gap <g>]\n\nkitchen [name "N"] path ((x,y), (x,y), \u2026) side left|right\n depth <d> height <h> [base_z <z>] // path points are literal numbers\n```\n\n**Staircases are TOP-anchored \u2014 this is the #1 mistake.** You put a staircase on the\n**UPPER** floor and it **DESCENDS** to the floor below:\n\n- `at (x,y)` is the **TOP** of the stair (where it meets the floor it\'s declared on).\n- `direction` is the **descent** direction (the way it travels going *down*).\n- `total_height` is the **drop** to the floor below (omit \u2192 the floor-below\'s height).\n- `max_run` caps a flight\'s run; exceed it and the stair auto-splits into switchback\n flights with turn landings (`landing_depth`/`turn`/`flight_gap` tune the switchback).\n\nSo a stair connecting the ground floor **up** to the first floor lives on the **First\nFloor**, descending to the ground:\n\n```wdl\nfloor 2 "First Floor" height 116 {\n slab at (\u2026) size (\u2026)\n staircase name "Stair" at (212, 64) step (7, 11, 44) // top = this floor, at the landing\n direction south total_height 116 // descends south to the floor below\n}\n```\n\nPut it on the *lower* floor (thinking of it as "climbing up") and it descends the wrong way\n\u2014 **below ground** \u2014 where it draws in 2D plans but is buried/invisible in 3D. `check.sh`\ncatches that (convention **C5**), but author it top-anchored from the start.\n\n// three ways to name the GLB, in order of preference:\nitem [name "N"] f."sofa" // 1. from an imported module (see Imports)\nitem [name "N"] "sofa" // 2. a same-file / bare-imported `asset` id\nitem [name "N"] asset { id "sofa" src "\u2026/sofa.glb" dims (w,h,d) [category "\u2026"] } // 3. inline one-off\n at (x,y) [rotation <deg>] [scale <s>]\n [anchor_to "RoomName" anchor center gap (gx,gy)]\n```\n\nPrefer the module form (`item f."bed_double"`) \u2014 `import "std-furniture" as f`\nonce and every piece is a short id, no URLs. The bare form (`item "sofa"`) needs\na matching top-level `asset "sofa" \u2026` in the file (or a bare `import`). The inline\n`asset { \u2026 }` block is only for a one-off GLB not in any pack. All three produce\nthe identical `{id,src,dims}` downstream. Furniture `dims` are the real-world size\nin **metres** `(width, height, depth)`; `src` is a GLB URL (an unreachable GLB\nshows a placeholder box, never a blank). `anchor` is one of `top-left top-center\ntop-right center-left center center-right bottom-left bottom-center bottom-right`.\n\n## Imports & modules (reusable `.wdl` libraries)\n\nA `.wdl` file can be a **module** \u2014 top-level declarations (no `house` needed) \u2014\nthat another file `import`s. Two bundled ones: `std-furniture` (asset pack \u2192\n`item ns."id"`) and `konkan/base` (goal-tagged component pack \u2192 `use ns.Comp`;\nStairwell, Verandah, Otla, Bathroom, Kitchen, TulsiVrindavan, Parapet). The\n`konkan_cottage` example (`wadi_examples`) assembles a whole house from both.\n\n```wdl\nhouse Home {\n import "std-furniture" as f // aliased: refer to its assets as f."<id>"\n // import "std-furniture" // bare: its ids drop into scope for item "<id>"\n floor 1 "G" slab_thickness 0 {\n room Bed at (20,20) size (160,200) { wall north east south west\n item f."bed_double" anchor center }\n }\n}\n```\n\nA module file itself is just top-level `asset` (later: `component`) decls:\n\n```wdl\n// my-furniture.wdl \u2014 a house-less module (a reusable library)\nasset "daybed" src "https://\u2026/daybed.glb" dims (1.8, 0.4, 0.9) name "Daybed" category "Living"\n```\n\nOver MCP, `wadi_modules` lists importable modules and `wadi_module "<name>"`\nshows a module\'s asset ids + dimensions (filter with a `query`). Import refs\nresolve by name against the bundled `std-*` packs (a local `modules/` search\npath and git refs come later).\n\n## Objects \u2014 roof (one object; flat / shed / gable / hip)\n\nThe roof lives ALONE on its own top floor and you never set its Z (see\n`roof-v2-guide.md`). `endpoint`: `closed` = hip triangle, `open` = gable end-wall.\n\n```wdl\nroof [name "N"] pitched|shed|flat\n [endpoint open|closed]\n [slope angle <deg> | slope height <ridge_h>]\n [overhang <o>] [slab_thickness <t>] [parapet <h> x <t>] [gable_wall_thickness <t>] {\n segment "id" from (x,y) to (x,y) width <w>\n [high_side left|right] // shed only\n [start_endpoint open|closed] [end_endpoint open|closed]\n [hip_setback (a,b)] [gable_overhang (a,b)] [hip_ridge_extension (a,b)]\n [overhang <o>] // uniform eave, all four sides\n [overhang_start <o>] [overhang_end <o>] // per-side along the axis (shed;\n // on a gable end = gable_overhang)\n [overhang_low <o>] [overhang_high <o>] // SHED eaves (down-slope / up-slope)\n [overhang_left <o>] [overhang_right <o>] // PITCHED eaves (left / right of ridge)\n [tie_beams N]\n truss "segId" fink|mono_pitch at (pos, pos, \u2026)\n }\n```\n\nSegment `from`/`to`/`width` and the `hip_setback`/\u2026 values accept formulas, so a\nroof scales with the plot (e.g. `width House.W`, `hip_setback (Verandah.L, Padvi.L)`).\n\n**Per-side overhang (cantilever one edge).** `overhang <o>` sets a uniform eave on\nall four sides. Any sloping roof can override a side independently \u2014 each defaults to\n`overhang`. **Along the axis:** `overhang_start` / `overhang_end` (on a shed, or a\ngable open end \u2014 there they\'re the same as `gable_overhang`; a hip end is geometric,\ntuned via `hip_setback`). **Eaves:** `overhang_low` / `overhang_high` on a **shed**\n(down-slope / up-slope); `overhang_left` / `overhang_right` on a **pitched** roof\n(the two eaves either side of the ridge). A bigger eave overhang also drops that\neave\'s edge along the same pitch, so the slope stays planar. (Per-eave on a *pitched*\nroof is single-segment only \u2014 on a multi-segment roof the eaves share one height so\njoints line up.)\nIdiom: keep the roof FOOTPRINT (its supported edges) on the main room, then cantilever\none eave to cover an entry landing / stair \u2014 end the axis on the room wall and set a big\n`overhang_end`:\n```wdl\n// footprint ends on the main room\'s east wall (x204 centreline \u2192 x208 outer);\n// the east eave reaches 258, covering a landing that sticks out to x256.\nsegment "seg0" from (4,124) to (204,124) width 240 high_side right overhang 25 overhang_end 50\n```\n\n**Roof coordinates are wall centrelines (under `convention center`), same as\nrooms.** `from`/`to` is the segment\'s ridge/axis and `width` its span *centred on\nthat axis*. Author them on the **same centreline grid as the walls** \u2014 a segment\nwhose axis + width match the rooms\' centrelines auto-grows to the **outer wall\nface** on every side (the compiler extends the axis by \xBD\xB7wall_thickness at each end\nand widens by wall_thickness, exactly the grow a room gets). `overhang` then\nextends *beyond* the outer face. So to cover a footprint spanning wall centrelines\n`x1..x2` (E\u2013W) and `yA..yB` (N\u2013S), write `from (x1, (yA+yB)/2) to (x2, (yA+yB)/2)\nwidth (yB - yA)` \u2014 do **not** add \xBD-wall fudge factors; the convention handles it.\n(Before this, a roof drawn on the grid sat half a wall-thickness *inside* the walls.)\n\n## Components & layers\n\n```wdl\ncomponent Bench { // a reusable mini-house in LOCAL coords (origin 0,0)\n param blen = 60 label "Bench length"\n beam name "Top" at (0,0) size (blen, 18) height 6\n}\nuse Bench as "B1" at (x,y) with { blen = 80 } // stamp it onto a floor\n\nlayer "structure" "Structure" [color "#rrggbb"] [group "Frame"] // per-house layer registry\n```\n\nA component may carry a **`goal`** \u2014 a short description of what it accomplishes,\nthe discovery key for module lookup (`wadi_module` / a `wadi_modules` query):\n\n```wdl\ncomponent Stairwell goal "climb to the next floor" {\n param rise = 116\n staircase name "Stair" at (0,0) step (7,11,44) direction south total_height rise\n}\n```\n\nComponents can also come from an **imported module** (see *Imports & modules*),\nstamped with a namespaced `use ns.Comp`:\n\n```wdl\nhouse Home {\n import "konkan/base" as kb // Stairwell, Verandah, Otla (goal-tagged)\n floor 1 "G" slab_thickness 0 {\n room Hall at (20,20) size (200,200) { wall north east south west }\n use kb.Stairwell at (60,60) with { rise = 116 } // param args use `=`, not `:`\n }\n}\n```\n\n`use ns.Comp` expands byte-identical to an inline `component`; keep module\ncomponents flat (they don\'t `use` other components). Un-overridden `param`s fall\nback to their declared defaults.\n\n## The `raw` escape (rarely needed)\n\nAnything the first-class syntax doesn\'t cover can be written as literal JSON per\nthe `.wadi` schema (`data-model.md`):\n\n```wdl\nraw "type" { "field": 1, "formulas": { "field": "= expr" } }\n```\n\n## DSL-specific pitfalls\n\n- **`convention center` and `units \u2026 per_unit 10`** belong at the top of every\n `house` \u2014 same as the JSON path. All the `coordinate-system.md` rules (Y-down,\n units, centreline abutment) apply identically; the DSL just writes them shorter.\n- **Formulas are bare expressions**, not `"= \u2026"` strings \u2014 the compiler emits the\n `= \u2026` form for you. Write `at (main.x1, main.yA)`, not `at ("= main.x1", \u2026)`.\n- **`name "\u2026"` is quoted; `room`/`pillar`/`var`/grid-line names are bare** ids\n (no spaces, and not a reserved word like `width`, `height`, `size`, `at`).\n- **Roof alone on the top floor**; segment widths/positions come from the walls\n they sit on. See `roof-v2-guide.md`.\n- **A pillar\'s `at` is its TOP-LEFT corner, not its centre.** To centre a column on\n `(cx,cy)`, author `at (cx - w/2, cy - l/2)`.\n- **Free-standing walls don\'t auto-mitre at corners** \u2014 extend endpoints so the wall\n bodies overlap (\u2265 \xBD\xB7`wall_thickness` past the shared point), or the corner is left\n as a gap.\n- **Staircases are top-anchored** \u2014 put them on the UPPER floor; they descend to the\n floor below (`check.sh` C5 flags one that lands below ground). See the staircase note.\n- **Structural conventions are enforced** \u2014 `check.sh` fails on floating floors\n (plinth-floor `height` \u2260 plinth block height; a no-slab floor with nonzero\n `slab_thickness`) and warns on exterior room sides left open. See\n `conventions.md`; the DSL editor shows the same findings in its status pill.\n- Compile after **every** edit; a parse error means the `.wadi` wasn\'t updated, so\n the live model just won\'t change \u2014 never silently wrong.\n'
|
|
417998
|
+
},
|
|
417999
|
+
"conventions": {
|
|
418000
|
+
"title": "Structural coding conventions (C1/C2/C3\u2026)",
|
|
418001
|
+
"body": '# Wadi structural conventions (coding guidelines)\n\nA house can be **well-formed but structurally unsound**: it passes the schema and\nthe wall/roof geometry check, yet the building would not stand up \u2014 a floor floats\nin mid-air, a room is open to the weather, walls hover above a phantom slab. These\nare the *coding conventions* every Wadi house must follow.\n\nThey are **formally defined here** and **enforced in code** by the structural\nlinter (`editor/src/lint/structural.ts`), which runs automatically:\n\n- in **`check.sh`** (and `validate.mjs`) \u2014 **errors fail** the check, **warnings**\n are printed but advisory;\n- in the **DSL editor** \u2014 the status pill shows the count and lists every finding\n in its hover tooltip, while still rendering the model so you can *see* the\n unsound part.\n\nEach finding carries its convention id (`C1`, `C2`, \u2026) so this document and the\nlinter stay in lockstep. Add a rule by adding a check to `lintStructure` **and** a\nsection here with the next id.\n\n---\n\n## The vertical model (why C1 and C3 exist)\n\nFloors stack in source order (floor 0 = the Plinth floor). The renderer places\nthem like this (`editor/src/three/coords.ts`):\n\n- **A floor\'s base elevation = the running sum of the previous floors\' `height`\n only.** `wall_height` and `slab_thickness` do **not** raise the next floor.\n- The **plinth block** is drawn to its *own* `height`. So the floor above sits at\n `plinth-floor.height`, while the plinth top is at `plinth.height` \u2014 they must be\n equal or the floor above floats/sinks by the difference. \u2192 **C1**\n- **`slab_thickness` lifts a floor\'s walls within its band** (`wallZ = base +\n slab_thickness`) \u2014 it is the deck the walls stand on. With no slab object there\n is no deck, so the walls float by that amount. \u2192 **C3**\n\n`height`, `wall_height`, and `slab_thickness` are otherwise **independent** \u2014 the\nmodel enforces no relationship between them. These conventions add the few\nrelationships that structural soundness *does* require.\n\n---\n\n## C1 \u2014 The plinth floor\'s height must match the plinth block height \xB7 **error**\n\n**Statement.** A floor that carries a `plinth` object (the Plinth floor) must set\nan explicit `height`, and that height must equal the plinth block\'s `height`.\n\n**Rationale.** The floor above is stacked at `plinth-floor.height`; the plinth\nblock rises to `plinth.height`. If they differ, the floor above floats above the\nplinth (`floor.height > plinth.height`) or sinks into it (`<`). If the floor\n`height` is omitted it silently defaults to `100`, almost never the plinth height.\n\n**Fix.**\n\n```wdl\nfloor 0 "Plinth" height 40 { // == the plinth block height below\n ground name "Ground" at (0,0) size (500,500)\n plinth name "Plinth" at (\u2026) size (\u2026) height 40\n}\n```\n\n(If the plinth block omits its own `height`, it follows the floor height and is\nconsistent by construction \u2014 but set the floor `height` explicitly anyway, so the\nstack is not left to the default.)\n\n---\n\n## C2 \u2014 A room must wall every exterior side \xB7 **warning**\n\n**Statement.** A room shown with a **partial** `walls` list must still wall every\nside that faces **outside** (no room beyond it). Interior (shared) sides may be\nomitted \u2014 the neighbour\'s wall stands on the shared centreline.\n\n**Rationale.** A room shows exactly the walls it declares; a **bare room (no\n`wall` lines) is enclosed on all four sides**. But the moment you add a `wall`\nline to hang a door or window, the room switches to a *whitelist* \u2014 every side you\ndon\'t list is now a hole. An exterior hole leaves the room open to the weather.\nThis is the #1 footgun the conventions guard against.\n\nIt is a **warning**, not an error, because an open exterior side is sometimes\nintentional (a verandah / open padvi). If it is deliberate, leave it \u2014 the warning\ndocuments the choice. Otherwise, add the wall.\n\n**Fix.** List the plain exterior walls compactly alongside the opening walls:\n\n```wdl\nroom Living at (x,y) size (w,l) {\n wall east west // plain exterior sides \u2014 enclosed\n wall south { door Main at 120 size (36,84) }\n wall north { window N1 at 100 size (60,50) sill 35 }\n}\n```\n\n*(The check samples several points along each side, so a side sheltered by rooms\nabove is correctly treated as interior, not open. It also skips a side that\nalready has a wall on its line \u2014 one declared by an adjacent or overlapping room,\nor a standalone wall \u2014 so a shared exterior wall the neighbour declares is not\ndouble-flagged.)*\n\n---\n\n## C3 \u2014 A floor with no slab must set slab_thickness to 0 \xB7 **error**\n\n**Statement.** A floor that has wall/room objects but **no `floor_slab` object**\nmust set `slab_thickness 0`.\n\n**Rationale.** `slab_thickness` is the deck the floor\'s walls stand on\n(`wallZ = base + slab_thickness`). Its default is `8`. With no slab object there is\nno deck, so every wall on the floor floats `slab_thickness` units above the floor\nbase. Setting it to `0` puts the walls on the floor base; alternatively, model the\ndeck by adding a `slab`.\n\n**Fix.**\n\n```wdl\nfloor 1 "Ground" slab_thickness 0 { // no slab modelled \u2192 walls sit on the base\n room Studio at (\u2026) size (\u2026) { \u2026 }\n}\n```\n\n*(This does not fire on a floor that carries no walls/rooms \u2014 e.g. a Plinth floor\nof just `ground` + `plinth`, or a roof-only top floor \u2014 where `slab_thickness` is\nharmless.)*\n\n---\n\n## C4 \u2014 A stacked floor\'s height should equal wall_height + slab_thickness \xB7 **warning**\n\n**Statement.** A floor that carries a floor above it (and has walls/rooms) should set\n`height` = `wall_height` + `slab_thickness`.\n\n**Rationale.** The next floor sits at `base + height`; this floor\'s walls stand on the\ndeck and reach `base + slab_thickness + wall_height`. When `height` is larger, the floor\nabove leaves a gap over the walls; when smaller, the walls poke through it. (These three\nfields are otherwise independent \u2014 see the vertical model above.) It is a **warning** \u2014 a\ndeliberate gap is legitimate (a service plenum, a deep transfer beam) \u2014 but usually they\nshould match.\n\n**Fix.** Make them add up, most simply via the house defaults:\n\n```wdl\ndefaults { floor_height 116 wall_height 108 slab_thickness 8 } // 108 + 8 = 116\n```\n\n*(Skipped for the plinth floor \u2014 governed by C1 \u2014 and for the topmost floor, since nothing\nstacks on its walls.)*\n\n## C5 \u2014 A staircase must land on a floor, not below ground \xB7 **warning**\n\n**Statement.** A staircase\'s descent must not carry it below the ground plane (z < 0).\n\n**Rationale.** Staircases are **top-anchored**: you place one on the **upper** floor and it\n**descends** to the floor below (`at` is the top, `direction` is the descent, `total_height`\nis the drop). Put it on the *lower* floor (as if climbing up), or give it too large a\n`total_height`, and the expanded flight lands **below ground** \u2014 it still draws in the 2D\nplans (which ignore Z) but is **buried and invisible in 3D**, with no other error. This is\nthe one that bit a real design: a stair on the ground floor "climbing" to the first floor\nwas expanded to `z_offset: -105` and vanished from the 3D view.\n\n**Fix.** Move the staircase **up one floor** and let it descend. The stair that connects the\nground floor to the first floor lives on the **First Floor**:\n\n```wdl\nfloor 2 "First Floor" height 116 {\n slab at (\u2026) size (\u2026)\n staircase name "Stair" at (212, 64) step (7, 11, 44) // `at` = the TOP (this floor)\n direction south total_height 116 // descends to the floor below\n}\n```\n\n*(See the staircase section of `dsl.md` for the full top-anchored convention.)*\n\n## Running the checks\n\n```bash\nwadi-skill/architect/scripts/check.sh house.wdl\n```\n\n- **`\u2716 [C\u2026]`** \u2014 a structural **error**; the check exits non-zero. Fix before you\n save/share.\n- **`\u26A0 [C\u2026]`** \u2014 a structural **warning**; advisory. Fix, or keep it if the open\n side is intentional.\n\nIn the DSL editor the same findings appear in the status pill (hover for the full\nlist); the model still renders so you can see the problem.\n\n---\n\n## Planned conventions (not yet enforced)\n\nDocumented so authors know they matter; not linted yet:\n\n- **Interior partition gaps** \u2014 where two rooms share a centreline and *neither*\n declares that wall, there is no partition between them. (C2 only covers\n *exterior* sides.)\n- **Slab thickness \u2194 slab object** \u2014 when a floor *does* carry a `floor_slab`,\n its `slab_thickness` should match the slab\'s own thickness so walls sit on the\n real deck.\n- **Roof footprint coverage** \u2014 the roof segments should span the top occupied\n floor\'s footprint (no uncovered rooms).\n'
|
|
418002
|
+
},
|
|
418003
|
+
"coordinate-system": {
|
|
418004
|
+
"title": "Coordinates, units & the centreline convention",
|
|
418005
|
+
"body": '# Coordinate system & units\n\nThis is the #1 source of mistakes. Read it before placing anything.\n\n## Axes \u2014 Inkscape frame (Y is DOWN)\n\nThe config uses an **Inkscape-style 2D frame**, the same one the SVG floor plans\nuse directly:\n\n```\n origin (0,0) \u2500\u2500 X increases \u2192 (east / right)\n \u2502\n \u2502 Y increases \u2193 (south / DOWN)\n \u25BC\n```\n\n- **X** \u2192 right (east).\n- **Y** \u2192 **DOWN** (south). This is NOT the math/Blender convention. A room "to\n the **north**" of another has a **smaller** Y. Moving something "up" on the plan\n = **decreasing** Y.\n- **Z** \u2192 up (height), in the 3D model. Z isn\'t in the 2D placement fields; it\'s\n derived from `height`/floor stacking. `sill_height`, `z_offset`, `base_z`,\n `plinth.height`, wall `height` are vertical (Z) measures.\n\nEvery position field is the object\'s **top-left corner** in this frame:\n`x`/`y` (rooms, slabs, beams, pillars), `start_x`/`start_y` + `end_x`/`end_y`\n(walls, staircases), `path: [[x,y],\u2026]` (kitchen platforms), roof segment\n`start`/`end` (`[x, y]`).\n\nBecause Y points down:\n- `plinth.length` runs along **X**; `plinth.width` runs along **Y**.\n- A room\'s `width` runs along **X**; its `length` runs along **Y**.\n- A north-up architect\'s sketch has its **Y flipped** when you transcribe it: the\n top of the drawing (north) maps to small Y, the bottom (south) to large Y.\n\n## Units \u2014 10 project units = 1 foot\n\nAll lengths/coordinates are **project units**. The display/dimension convention is\n**`unit_conversion = 10` \u2192 10 units = 1 ft**. So:\n\n| The user says | Config value |\n|---|---|\n| 1 ft | 10 |\n| 12 ft (a 12-foot room) | 120 |\n| 45 ft (plot) | 450 |\n| 6 in (0.5 ft) | 5 |\n\nAlways **multiply feet by 10**. `plot_length: 450` displays as `45\'`.\n\n> Aside you don\'t need for authoring: a separate Blender path uses\n> `units_to_meters_ratio = 0.1` (1 unit = 0.1 m) for the 3D export, so the same\n> `450` is treated as 45 m in Blender. The two constants serve different pipelines;\n> for authoring the config, **only the 10-units-per-foot rule matters.**\n\n### Changing how dimensions are *labelled*\n\nThe `10-units-per-foot` rule above is only the **default label**. The optional\ntop-level `units` block changes the drawing labels **without touching geometry** \u2014\ncoordinates you write stay in project units either way:\n\n```jsonc\n"units": { "system": "meters", "per_unit": 100, "precision": 2 }\n```\n\n- `system` \u2208 `feet_inches` (default), `feet`, `meters`, `centimeters`, `millimeters`.\n- `per_unit` = project units per one display unit (the label divisor). Default `10`.\n- `precision` = decimals for the decimal systems (default `2`; `feet_inches` ignores it).\n\nSo a 120-unit wall labels as `12\'` by default, or `1.20 m` with the block above.\nNever change coordinates to switch units \u2014 only add/edit this block.\n\n### Label font sizes auto-scale (no config needed)\n\nDimension and room-label font sizes are **derived automatically** from the house\'s\nphysical span (larger of `plinth.length`/`plinth.width`), so text stays legible at\nfit-to-view whether the house is tiny or huge. There is **no font-size field** to\nset \u2014 don\'t try to add one. A house at the reference span (450 units \u2248 45 ft)\nrenders at the baseline sizes; larger/smaller houses scale proportionally (clamped\n0.6\xD7\u20136\xD7).\n\n## Rooms, walls, and the centreline convention\n\nSet **`"coord_convention": "center"`** at the top of the house (the canonical mode).\nThen a rect object\'s `x, y, width, length` are **wall CENTRELINES** \u2014 the line each\nwall is centred on, *not* the outer face.\n\n**Two rooms that share a wall simply ABUT on the shared centreline** \u2014 no overlap, no\nwall math:\n\n- Room A spans X `[0, 150]`, room B spans X `[150, 300]`. They meet at `150`; the wall\n is centred on `150` and belongs to both \u2192 **one shared wall.** Done.\n- The clear interior of a room is `width \u2212 t` \xD7 `length \u2212 t` (half a wall on each side);\n its outer extent is `width + t` \xD7 `length + t`. The system grows each footprint to the\n outer face automatically at render time (`expandRoomWalls`), so you never write `t`.\n\nThat\'s the whole rule. No "overlap by `wall_thickness`," no directional offsets.\n\n### Placing a plan on a grid \u2014 rooms reference the grid directly\n\nBecause room coords *are* wall centrelines and a **grid** (`grids` block) is a set of\nnamed wall centrelines, a room is just the rectangle between four grid lines \u2014 with\n**no arithmetic**:\n\n```jsonc\n"grids": { "main": { "x": [ {"name":"1","at":"= wallT/2"}, {"name":"2","at":"= House.W - wallT/2"} ],\n "y": [ {"name":"A","at":0}, {"name":"B","at":"= House.L - wallT/2"} ] } }\n```\n```jsonc\n{ "type":"room", "name":"Hall",\n "formulas": { "x":"= main.x1", "y":"= main.yA",\n "width":"= main.x2 - main.x1", "length":"= main.yB - main.yA" } }\n```\n\nEach grid line is published as a formula **symbol** `<gridId>.x<name>` / `<gridId>.y<name>`\n(e.g. `main.x1`, `main.yA`), so rooms, slabs and the plinth all place themselves off the\nsame lines. Move a grid line (or the `House` knobs its `at` depends on) and every room on\nit follows. The **grid is the single parametric layer** \u2014 `House` + knobs \u2192 grid lines \u2192\nrooms; nothing flows the other way. See `parametric-conventions.md`.\n\n(Legacy files without `coord_convention` are read as `"outer"`: coords are the OUTER\nface and adjacent rooms must **overlap** by `wall_thickness`. New work uses `"center"`.)\n\n## Vertical (Z) fields recap\n\n- `plinth.height` \u2014 how high the base sits above ground.\n- floor `height` \u2014 floor-to-floor rise; floors stack on top of each other by these.\n- floor `wall_height` \u2014 standing wall height on that floor.\n- `slab_thickness` \u2014 RCC deck between a floor and the one above.\n- opening `sill_height` \u2014 window sill height above its floor.\n- `beam.z_offset`, `kitchen_platform.base_z` \u2014 vertical offsets.\n\n## Sloping tops\n\nA wall (or room wall side) with a sloping top sets both `height` (at the start)\nand `height_end` (at the end). Full gable/hip geometry, though, comes from the\n`roof` object, not from wall slopes \u2014 see `roof-v2-guide.md`.\n\n## Quick self-check before saving\n\n- Did I treat "north/up" as **smaller** Y?\n- Are all my numbers in **project units** (feet \xD7 10)?\n- Is `"coord_convention": "center"` set, so room coords are wall centrelines and adjacent\n rooms **abut** on the shared line (no overlap, no `t` math)?\n- Does the plinth rectangle (`length`\xD7`width`) contain all my rooms?\n- Does the roof footprint cover the plinth?\n'
|
|
418006
|
+
},
|
|
418007
|
+
"parametric-conventions": {
|
|
418008
|
+
"title": "Building a fully-parametric template",
|
|
418009
|
+
"body": '# Parametric model conventions (reusable house templates)\n\nHow to author a **fully-parametric** `.wadi` \u2014 a template that stays valid under *any*\nknob change (resize the plot, widen a room, add a floor) instead of a one-off with\nbaked-in numbers. Use it when building a **template** for the library / picker; skip it\nfor a quick fixed sketch.\n\nThe canonical worked example is **`examples/coastal_konkan.wadi`** \u2014 read it alongside\nthis. The engine: `variables` \u2192 `grids` \u2192 per-object `formulas`, resolved\ntopologically by `editor/src/param/resolve.ts`. Formula ops: `+ - * /`, `min`, `max`,\n`clamp`, `round`, `floor`, `ceil`, `abs` (no `eval`, no comparisons/ternary).\n\n## 0. The one big idea: the GRID is the parametric layer\n\nA **grid** is a set of named wall-**centreline** lines \u2014 X (west\u2192east: `1,2,3\u2026`) and Y\n(north\u2192south: `A,B,C\u2026`). Each line\'s position (`at`) is a formula of the house size and\nyour knobs. **Rooms don\'t compute their own geometry \u2014 they name grid lines.** Move a\nline (or the knob its `at` depends on) and every room, slab and column on it follows.\n\n```\nHouse size + knobs \u2500\u2500\u25B6 grid line `at` formulas \u2500\u2500\u25B6 rooms/pillars reference lines\n (variables) (the grids block) (= main.x1, \u2026)\n```\n\nThis one-directional flow is the whole recipe. There is **no** room-corner point layer\nand **no** per-room wall math (both existed in the old convention \u2014 don\'t use them).\n\n## 1. Set the centreline convention\n\nAt the top of the house set:\n\n```jsonc\n"coord_convention": "center"\n```\n\nThen a rect object\'s `x, y, width, length` are wall **centrelines**, and **two rooms\nthat share a wall just ABUT on the shared line** \u2014 room A spans X `[x1,x4]`, room B\nspans `[x4,x8]`, the wall is centred on `x4` and shared. No overlap, no `wallT` math;\nthe renderer grows each footprint to the outer face automatically. See\n`coordinate-system.md` \u2192 "the centreline convention".\n\n## 2. Variables \u2014 the knobs\n\n- **Base dims:** `wallT` (wall thickness), `floorH`, `slabH`, plus derived helpers\n (`wallH = "=floorH-slabH"`).\n- **Column sizes + inset:** `pillarW` (and `pillarL` if rectangular), and\n **`pilInset = "= (pillarW - wallT) / 2"`** \u2014 the amount a perimeter column must move\n inward to sit flush with the facade (see \xA75).\n- **Opening sizes:** `doorW/doorH`, `winW/winH/winSill`, `entranceW`, `doorMargin` \u2014 never\n inline literals.\n- **Room-proportion knobs:** `pct<Room><W/L>` + `min<Room><W/L>` (see \xA73).\n\nVariables may reference only other variables (they resolve before the grid).\n\n## 3. The grid \u2014 named lines as formulas\n\nDefine `grids.main` with X and Y lines. The **outer** lines anchor to the plinth edge;\n**interior** lines carry the room-proportion logic:\n\n```jsonc\n"grids": { "main": {\n "x": [\n { "name": "1", "at": "= wallT / 2" }, // left outer face at 0\n { "name": "2", "at": "= max(minBedW, round(pctBedW * House.W)) + 3*wallT/2" },\n { "name": "8", "at": "= House.W - wallT / 2" } // right outer face at House.W\n ],\n "y": [ { "name": "A", "at": "= wallT / 2" }, { "name": "F", "at": "= House.L - wallT / 2" } ]\n} }\n```\n\n- **Outer lines:** `1`/`A` at `wallT/2`, the last at `House.dim \u2212 wallT/2`. A wall\n centred on `wallT/2` has its outer face at `0`; on `House.W \u2212 wallT/2`, at `House.W`.\n So the building fills the plot exactly.\n- **Interior lines \u2014 where pct/min lives.** Either a fixed **fraction** of the span\n (`round(wallT/2 + frac*(House.W - wallT))`, pure proportional \u2014 the coastal style) or\n a **`max(min, pct*House.dim)`** offset (keeps a room from getting unusably small on a\n tight plot \u2014 the cottage/family style). Because a room\'s clear interior is\n `(line-to-line) \u2212 wallT`, add `+ 3*wallT/2` to a `max(min, pct*\u2026)` size so the KNOB\n equals the clear interior.\n- Each grid line is published as a formula **symbol** `main.x<name>` / `main.y<name>`\n (`main.x1`, `main.yA`). Positions are conserved automatically \u2014 the lines partition\n the span, so there are no gaps/overlaps to reconcile.\n\n## 4. Rooms, slabs, plinth \u2014 reference the grid, nothing else\n\n```jsonc\n{ "type":"room", "name":"Hall",\n "formulas": { "x":"= main.x1", "y":"= main.yA",\n "width":"= main.x4 - main.x1", "length":"= main.yC - main.yA" } }\n```\n\n- `x`/`y` = the room\'s top-left grid node; `width`/`length` = the span to another node.\n- Adjacent rooms use the **same** line for their shared edge (room A `\u2026x4`, room B\n `x:"= main.x4"`) \u2192 they abut and share one wall.\n- The floor slab / plinth span the outermost lines (`main.x1 \u2192 main.x8`,\n `main.yA \u2192 main.yF`).\n- **Keep valid placeholder literals** on `x/y/width/length` (positive numbers) \u2014 the\n strict schema checks stored literals *before* resolve. The resolver overwrites them.\n\n## 5. Pillars \u2014 corner-anchored; centre on a node by subtracting half the width\n\nA pillar\'s `(x,y)` is its **TOP-LEFT CORNER** in **both** conventions (columns align\nto corners \u2014 the convention never shifts a pillar the way it grows a room). To drop a\ncolumn **centred** on a grid node, subtract **half its width** in the formula:\n\n```jsonc\n{ "type":"pillar", "name":"P_mid",\n "formulas": { "x":"= main.x3 - pillarW/2", "y":"= main.yF - pillarW/2",\n "width":"= pillarW", "length":"= pillarW" } }\n```\n\n- **Interior columns** centre on their node: `"= main.x3 - pillarW/2"`.\n- **Perimeter columns** are wider than the wall, so centred on an outer line they\'d jut\n past the plinth. Inset by `pilInset` first, **then** subtract `pillarW/2` \u2014 the net\n effect puts the column\'s OUTER face flush with the wall\'s outer face:\n - on the **min** line (`x1`, `yA`): `"= (main.x1) + pilInset - pillarW/2"`\n - on the **max** line (`x8`, `yF`): `"= (main.x8) - pilInset - pillarW/2"`\n - a corner column does both axes; a front-row column that\'s interior in X only insets Y.\n- Because `pilInset = (pillarW \u2212 wallT)/2` and `pillarW` are formulas, columns stay flush\n when you resize the plot, the wall, or the column.\n- **Colonnade columns** between nodes: `"= (main.x1 + main.x2)/2 - pillarW/2"` (centre on\n the midpoint); still inset the axis that sits on an outer line.\n- **Freehand (no grid):** put `at (x,y)` where the column\'s **corner** should sit \u2014 it\n lands there exactly, so you can butt a column against a room corner or wall junction.\n\n## 6. Openings\n\n- Opening sizes are **variables**; every opening is **positioned by formula** from its\n room\'s line span.\n- **Windows / wide entrances are CENTRED:** offset `= ((span) \u2212 w)/2`.\n- **Internal doors tuck into a corner** (`doorMargin` from one end) to keep a\n continuous wall run for furniture.\n- **A shared wall is declared once** \u2014 the room with the door declares that side\'s\n opening; the neighbour omits the side (the coincident wall is already there).\n- **Validate every opening:** `0 \u2264 offset && offset + width \u2264 wallSpan`, or\n `expandRoomWalls` throws.\n\n## 7. Konkan layout conventions\n\n- **Central hall (Majghar) is the circulation hub** \u2014 rooms open into it, not into each\n other. Preserves privacy and frees wall runs.\n- **Consolidate wet services** \u2014 kitchen + bathroom share a wall so plumbing runs\n together.\n- **Front verandah** (full-width, pillared) + **rear Padvi** (rear verandah).\n- Give fixed rooms a comfortable **minimum** (a 6\'\xD76\' bathroom reads cramped; ~7\'\xD77\' is\n better) \u2014 raise the `min`, not just the `pct`.\n\n## 8. Build & verify \u2014 the loop\n\n1. **Author** the grid + formulas with valid placeholder literals.\n2. **Validate:** `cd editor && npx tsx ../wadi-skill/architect/scripts/validate.mjs <ABS_PATH>`\n \u2014 resolves, schema-checks, and runs the wall/roof pipeline. Exit 0 = good.\n3. **Render + read:** `wadi-skill/architect/scripts/preview.sh <ABS_PATH>` \u2192 look at the\n plans (rooms in place, columns flush, roof over the plinth).\n4. **Scale sweep \u2014 the whole point.** Resolve + render at a **small**, a **large**, and\n an **off-aspect** plot (change `House.W`/`House.L` or the plot). Confirm: no negative\n rooms, rooms fill the plot exactly, every opening fits, **no column juts past the\n plinth**, no pillar/door overlap. A change that only works at the default size isn\'t\n done.\n5. In the app: the **Geometry-issues panel says "No geometry issues"**, and the live 3D\n model updates on save.\n\nSee also `coordinate-system.md` (Y is DOWN, 10 units = 1 ft, the centreline rule),\n`data-model.md` (every field), and `examples/coastal_konkan.wadi` (the reference).\n'
|
|
418010
|
+
},
|
|
418011
|
+
"roof-v2-guide": {
|
|
418012
|
+
"title": "The roof object (hip/gable/shed/flat)",
|
|
418013
|
+
"body": '# Roof v2 guide (the unified `roof` object)\n\nThe `roof` object replaces the legacy `hip_roof`/`gable_roof`/`flat_roof`/\n`shed_roof`. It is **segment-based**. The schema is permissive; the real\nvalidation happens in the compute pipeline, so **always run `validate.mjs`**\nafter writing a roof (it runs the exact derivation the app uses).\n\n> **Strategy:** roof geometry is the subtlest part of the config. Don\'t\n> hand-invent it \u2014 **copy the roof from the closest example** (see the shape map\n> below), then adjust its segment coordinates/widths to your plinth, and validate.\n\n## Where the roof lives, and its height (you do NOT set a Z)\n\nRead this first \u2014 it\'s the part that isn\'t obvious and that you must not try to\nreverse-engineer from the geometry.\n\n- **A roof object goes on its OWN top floor** \u2014 a floor whose `floor_number` is\n ABOVE every floor it covers, containing only the roof object(s). Name it\n something like `"Roof"` or `"Loft Floor"`. Example: ground = 0, first = 1 \u2192 the\n roof floor is `floor_number` **2**. The roof then covers the floors below it.\n (All the examples do this: the roof sits alone on the topmost floor.)\n- **You NEVER write a Z or height on the roof.** There is no Z field anywhere in\n the roof object. Its base sits automatically at the top of the walls below it,\n computed by the pipeline as:\n\n ```\n roof base Z = plinth.height + \u03A3 (height of every floor BELOW the roof\'s floor)\n ```\n\n using each floor\'s own `height` (falling back to `defaults.floor_height`).\n **`slab_thickness` does NOT enter this stack** \u2014 `height` already is the full\n floor-to-floor rise.\n- **To raise or lower the roof, change the FLOORS\' `height` (or `plinth.height`),\n not the roof.** If the roof floats too low/high, you put it on the wrong floor\n or a floor below it has the wrong `height`.\n- `slope` / `ridge_h` is the rise **above** that computed wall-top; segment\n `start`/`end` are 2D `[x, y]` only. Don\'t compute a Z \u2014 the pipeline does it\n entirely from the floor stack.\n\n## The core idea\n\nA roof is a set of **segments**. Each segment is a line (`start`\u2192`end`) with a\n**`width`** measured *perpendicular* to it, and **the segment sits at the CENTRE\nof that width** (the roof extends `width/2` to each side of the line). What the\nline means depends on `roof_type`:\n\n- **pitched** \u2014 the segment **is the ridge**; two symmetric slopes rise from the\n eaves up to it. Ends are covered per `default_endpoint`:\n - `"closed"` \u2192 **hip** (a sloped triangular hip face at the end).\n - `"open"` \u2192 **gable** (a vertical gable-end wall triangle).\n- **shed** \u2014 the segment is the **high edge**; the roof slopes down perpendicular\n to the far side. `shed_high_side` names which side is high.\n- **flat** \u2014 the segment\'s width band is a flat slab extruded down.\n\nSegments can run in **any direction** (not just axis-aligned).\n\n**Centreline convention (`coord_convention: "center"`).** A segment\'s\n`start`/`end`/`width` are **wall centrelines**, exactly like a room\'s\n`x/y/width/length`. On expand, each segment grows to the **outer wall face** \u2014\nthe axis is extended by \xBD\xB7`wall_thickness` at each end and `width` grows by\n`wall_thickness` \u2014 then `overhang` extends beyond that. So author segments on the\n**same centreline grid as the walls below** (e.g. `width House.W`, axis endpoints\non grid lines); do **not** hand-add \xBD-wall offsets, or the roof lands half a wall\nthickness inside the walls. (In the default `"outer"` convention the coordinates\nare literal outer-face positions and no grow happens.)\n\n## Object shape\n\n```jsonc\n{\n "type": "roof",\n "roof_type": "pitched" | "shed" | "flat",\n "default_endpoint": "closed" | "open", // pitched only: closed=hip, open=gable\n "min_overhang": 25, // > 0 \u2014 eave overhang beyond the walls\n "slope": { "by": "height", "ridge_h": 50 }, // rise above wall top \u2026\n // or { "by": "angle", "angle_deg": 30 }, // \u2026 or a pitch angle\n "segments": [\n {\n "id": "seg0",\n "start": [x, y], "end": [x, y], // the ridge (pitched) / high edge (shed)\n "width": 200, // perpendicular span, segment centred in it\n "slope": { \u2026 }, // optional per-segment slope override\n "shed_high_side": "\u2026", // shed only\n "hip_setback_start": \u2026, "hip_setback_end": \u2026, // optional, tune closed hip faces\n // Per-side overhang overrides (each defaults to min_overhang). Cantilever one\n // edge \u2014 e.g. big overhang_end over an entry landing \u2014 while others stay tight.\n "overhang_start": \u2026, "overhang_end": \u2026, // along the ridge axis (shed; on a gable\n // open end = gable_overhang_*)\n "overhang_low": \u2026, "overhang_high": \u2026, // SHED eaves (down-slope / up-slope)\n "overhang_left": \u2026, "overhang_right": \u2026 // PITCHED eaves (left / right of ridge;\n // single-segment only \u2014 see below)\n }\n ],\n "trusses": [\n { "segment_id": "seg0", "type": "fink", "positions_along": [100, 210, 320] }\n // type: "fink" (pitched) | "mono_pitch" (shed)\n // positions_along: distances along the segment where a truss sits\n ],\n "framing": { \u2026 } // optional overrides \u2014 omit unless asked\n}\n```\n\n`slope` may be given once at the roof level (applies to all segments) or per\nsegment. `by: "height"` \u2192 `ridge_h` is the ridge rise above the wall top; `by:\n"angle"` \u2192 `angle_deg` is the pitch.\n\n## Joints (multi-segment shapes)\n\nWhen two segments share an **exactly coincident endpoint**, the pipeline\nauto-resolves that end as a **joint** (no hip/gable face there) \u2014 this is how L,\nU, and closed-loop (courtyard) roofs are formed. Get the endpoints numerically\nequal or they won\'t join.\n\n## Shape \u2192 which example to copy\n\n| Want | Segments | Copy from |\n|---|---|---|\n| Simple hip (one ridge, hipped ends) | 1, `pitched`, `closed` | `two_story_konkan.json` / `verandah_cottage.json` |\n| Simple gable (one ridge, gable ends) | 1, `pitched`, `open` | same, set `default_endpoint: "open"` |\n| **L-shape** (two wings) | 2, `pitched`, coincident inner endpoints | `l_shape_villa.json` |\n| **Courtyard** (ridge loop) | 4, `pitched`, endpoints chained in a loop | `courtyard_home.json` |\n| **Flat** roof/terrace | 1+, `flat` | `modern_flat.json` |\n| Shed / mono-pitch (lean-to, verandah) | 1, `shed`, `shed_high_side` set | derive from a `pitched` seg; add `shed_high_side` + slope |\n\n## Rules & pitfalls\n\n- The roof **footprint must cover the plinth footprint** \u2014 segment lines +\n widths should span the walls they sit on. Mirror the example\'s relationship to\n its plinth.\n- `min_overhang` must be **> 0**.\n- Every segment needs an `id`; every truss references a real `segment_id`.\n- Shed segments **require** a slope (`ridge_h` or `angle_deg`) and a\n `shed_high_side`, or derivation throws.\n- After any roof edit: run `validate.mjs` \u2014 a zero-length segment, missing slope,\n or non-covering footprint fails there, not in the schema.\n'
|
|
418014
|
+
},
|
|
418015
|
+
"data-model": {
|
|
418016
|
+
"title": "The underlying .wadi schema (generated from Zod)",
|
|
418017
|
+
"body": '# Wadi data model (`.wadi` / `house_config.json`)\n\n> **Generated from `editor/src/schema/houseConfig.ts` \u2014 do not edit by hand.**\n> Regenerate: `node scripts/gen-schema-doc.mjs <path/to/houseConfig.ts> reference/data-model.md`\n> The Zod schema is the single source of truth; this file mirrors it (structure + the\n> semantics carried in its comments) so it can\'t drift.\n\nA `.wadi` file is one JSON object matching **HouseConfig**. Geometry is in **project\nunits** (a unitless grid; by default `units.per_unit = 10` means 10 units = 1 ft).\nPlan coordinates are **Inkscape-style**: origin top-left, **X \u2192 right, Y \u2192 down**.\nSee `coordinate-system.md` for the coordinate/units detail and `parametric-conventions.md`\nfor variables/points/formulas.\n\n## Fields shared by (almost) every object\n\nThese appear on most object types; documented once here, marked *(cross-cutting)* below.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `room` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `layer` | string | | |\n| `name` | string | **yes** | |\n| `material` | string | | |\n| `z_offset` | number | | Vertical position of the room (its floor + walls), as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). This is the UNIFIED z_offset convention: every object is placed at `slabZ + z_offset`. When OMITTED, on-slab objects (room, wall, staircase, kitchen_platform) default z_offset to the floor\'s resolved slab thickness (floor.slab_thickness \u2192 house.defaults.slab_thickness \u2192 code default), so by default they sit on top of the slab, exactly as before. Set it explicitly for split-level floors \u2014 e.g. a room raised onto a thicker slab uses the same value the raised slab\'s top sits at. |\n\n\n- `type` \u2014 the discriminated-union tag; selects the object shape (values below).\n- `formulas` \u2014 per-field `"= expression"` overrides; the resolver evaluates each into the\n matching numeric field. See `parametric-conventions.md`.\n- `z_offset` \u2014 vertical lift above the floor base (slab top). On-slab objects (room, wall,\n staircase, kitchen_platform) default it to the floor\'s slab thickness; slab/beam/pillar/\n roof default to 0.\n\n## Top level \u2014 HouseConfig\n\n| field | type | req | notes |\n|---|---|---|---|\n| `coord_convention` | enum: `outer` `center` | | How a rectangular object\'s x/y/width/length relate to its walls (plans/grid-convention.md). "center" (new/canonical): coordinates are wall CENTRELINES \u2014 adjacent rooms ABUT on a shared line (no overlap), walls are centred on the boundary, and expandRoomWalls grows each footprint by wall_thickness/2 to the outer face. "outer" / absent (legacy): coordinates are the OUTER wall face and adjacent rooms must overlap by wall_thickness. |\n| `plinth` | any (freeform) | | Legacy top-level plinth (pre-"Plinth floor"). Tolerated but IGNORED so an un-migrated file still loads (it just renders without a plinth/ground) instead of failing .strict() validation. New configs put the plinth on the Plinth floor as a `plinth` object. |\n| `defaults` | [houseDefaults](#housedefaults) | | |\n| `units` | [units](#units) | | |\n| `layers` | array of [LayerDef](#layerdef) | | Configurable 3D visibility layers (optional; defaults applied when absent). Objects opt in via their own `layer` field. |\n| `variables` | map: string \u2192 number, or `"= formula"` string | | Parametric layer (plans/object-relationships-plan.md). Named scalar variables (number or "= formula", may reference other variables) and named 2D points; object `formulas` maps reference these. Optional \u2014 absent = a plain non-parametric house, resolved as a no-op. |\n| `points` | map: string \u2192 inline object | | |\n| `components` | map: string \u2192 [ComponentDef](#componentdef) | | Reusable-component library (in-file). Map of id \u2192 ComponentDef. A `component` object instantiates one by `ref`. Stored once; referenced by many instances; edit here to update every instance. |\n| `grids` | map: string \u2192 `gridDef` | | First-class parametric grids (plans/grid-convention.md). Map of id \u2192 GridDef (named X/Y wall centrelines). Rooms/slabs bind via `grid`+`cell`, pillars via `grid`+`node`; the resolver derives their geometry from the centrelines + wall thickness. Optional; reusable across templates. |\n| `configurator` | [configurator](#configurator) | | Configurator metadata (Gharkul owner UI). Optional; see plans/configurator-plan.md. |\n| `thumbnails` | array of string | | Preview snapshots (data: URLs) captured by the architect editor and saved WITH the template so the owner gallery can show real previews \u2014 multiple angles + the floor plan. `thumbnails[0]` is the gallery cover. Optional; excluded from share links (a preview isn\'t model data \u2014 see io/shareLink.ts). `thumbnail` (singular) is the legacy one-image form, still read as a fallback so old template files keep working. |\n| `thumbnail` | string | | |\n| `floors` | array of [floor](#floor) | **yes** | |\n| `_walls_expanded` | boolean | | |\n\n\n## floor\n\n| field | type | req | notes |\n|---|---|---|---|\n| `floor_number` | integer \u2265 0 | **yes** | |\n| `name` | string | **yes** | |\n| `height` | number > 0 | | Per-floor overrides for the default heights in GlobalConfig. In project units (10 units = 1 ft). All three are INDEPENDENT \u2014 no relationship enforced between them: height \u2014 floor-to-floor rise (drives roof wallTop-Z stack) wall_height \u2014 standing wall height (floor top \u2192 ceiling) slab_thickness \u2014 RCC deck between this floor and the one above All fall back to GlobalConfig defaults when omitted. |\n| `wall_height` | number > 0 | | |\n| `slab_thickness` | number \u2265 0 | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `objects` | array of [Object types](#object-types) | **yes** | |\n\n\n## Object types (`floors[].objects[]`)\n\nEvery entry in a floor\'s `objects` array is one of these, tagged by `type`:\n\n### `plinth`\n\nThe plinth is now a normal object placed on the "Plinth" floor (the first floor, number 0), not a top-level config key. Its footprint + height match the old top-level plinth; the plinth floor\'s `height` drives the rise to the floor above (replacing the old hardcoded plinth_height seed).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `plinth` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `material` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | |\n\n\n### `ground`\n\nThe ground plane, also on the Plinth floor. Extent defaults to the site plot when authored by the migration. `height` is an optional thickness (0 = a flat plane); slope fields are a later phase.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `ground` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `material` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number \u2265 0 | | |\n| `z_offset` | number | | |\n\n\n### `component`\n\nAn INSTANCE of a reusable component from the in-file `components` library. It references a component by id (`ref`), overrides the component\'s input variables via `params`, and places it at (x, y) with a `z_offset` lift on its parent floor. At render time `expandRoomWalls` flattens it into concrete objects (resolve component with param+origin overrides \u2192 recurse \u2192 offset), so no renderer needs to know about `component`.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `component` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `ref` | string | **yes** | |\n| `params` | map: string \u2192 union \u2014 see notes | | Overrides for the component\'s declared input variables. A string starting with "=" is a formula evaluated in the HOST scope (so it can reference the host\'s variables/points); a number is used directly. |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `z_offset` | number | | |\n\n\n### `item`\n\nA free-standing GLB furniture / decor instance placed directly on a floor (for pieces that aren\'t inside an enclosed room \u2014 outdoor/site/verandah decor, a loft item, etc.). `x`/`y` are the item\'s plan CENTRE. It MAY instead anchor to a named room via `anchor_to` + `anchor` + `gap`, in which case `x`/`y` are DERIVED at expand time (same anchor model as room-nested items). `rotation` is yaw\xB0; `scale` is a uniform resize; `z_offset` lifts it above the floor base (default = slab thickness). (`itemAsset`, `itemAnchor`, `gapField` are defined above `room`.)\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `item` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `asset` | [ItemAsset](#itemasset) | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `rotation` | number | | |\n| `scale` | number > 0 | | |\n| `z_offset` | number | | |\n| `anchor_to` | string | | Optional room-relative anchoring (for a free item that should follow a room). |\n| `anchor` | [ItemAnchor](#itemanchor) | | |\n| `gap_x` | number | | |\n| `gap_y` | number | | |\n\n\n### `floor_slab`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `floor_slab` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `thickness` | number \u2265 0 | | Optional per-slab thickness override. Defaults to the floor\'s slab_thickness (which itself defaults to house.defaults or the code global). In project units. |\n| `z_offset` | number | | Vertical position, as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). Default 0 \u2192 the slab\'s bottom sits at the floor base. Raise it to place a slab at an intermediate height (e.g. a stair landing). See the unified z_offset convention on `room`. |\n\n\n### `pillar`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `pillar` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | TOP-LEFT CORNER (Inkscape frame), consistent with room / floor_slab / beam. (Historically this was the pillar CENTER; changed for consistency.) |\n| `y` | number | **yes** | |\n| `width` | number > 0 | | width or length may be absent \u2014 see create_pillar. |\n| `length` | number > 0 | | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Default 0 \u2014 a pillar rises from the floor base (plinth top on floor 0) through the slab to the ring beam. Same convention as `beam`/`floor_slab`. |\n\n\n### `beam`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `beam` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number > 0 | | Vertical thickness of the beam, in PROJECT UNITS. Optional \u2014 defaults to the floor\'s slab_thickness. The 3D viewer + BeamForm read this as `height`; note the Python builder currently reads a `thickness` key instead (wadi_config.py) \u2014 see the known field-name mismatch. |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), in PROJECT UNITS (10 units = 1 ft). Default 0 \u2014 the beam\'s bottom sits at the floor base. Same convention as `floor_slab`. (Was previously z_offset_ft in feet.) |\n\n\n### `room`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `room` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number \u2265 0 | | 0 accepted \u2014 semantically the same as absent ("use floor default"). Old configs that accidentally saved height: 0 keep loading; the form treats 0 as "no override" and doesn\'t write it back. |\n| `material` | string | | |\n| `z_offset` | number | | Vertical position of the room (its floor + walls), as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). This is the UNIFIED z_offset convention: every object is placed at `slabZ + z_offset`. When OMITTED, on-slab objects (room, wall, staircase, kitchen_platform) default z_offset to the floor\'s resolved slab thickness (floor.slab_thickness \u2192 house.defaults.slab_thickness \u2192 code default), so by default they sit on top of the slab, exactly as before. Set it explicitly for split-level floors \u2014 e.g. a room raised onto a thicker slab uses the same value the raised slab\'s top sits at. |\n| `walls` | union \u2014 see notes | | |\n| `wall_heights` | map: string \u2192 [wall_heights entry](#wall-heights-entry) | | |\n| `items` | array of [RoomItem](#roomitem) | | Furniture nested in this room. Each piece is anchored to the room\'s inner footprint (see roomItem), so it reflows when the room resizes. Expanded into top-level `item` objects at render time. |\n\n\n### `wall`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `wall` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `start_x` | number | **yes** | |\n| `start_y` | number | **yes** | |\n| `end_x` | number | **yes** | |\n| `end_y` | number | **yes** | |\n| `height` | number > 0 | | |\n| `height_end` | number | | |\n| `material` | string | | |\n| `facing` | enum: `north` `south` `east` `west` | | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Omitted \u2192 defaults to the floor\'s resolved slab thickness (sits on the slab, as before). Set it for a split-level wall. Same convention as `room`. |\n| `openings` | array of [Opening](#opening) | | |\n\n\n### `staircase`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `staircase` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `start_x` | number | **yes** | A staircase belongs to the DESTINATION (upper) floor it leads to \u2014 put it on that floor\'s `objects` so deleting the floor deletes the stair. It is TOP-anchored and DESCENDS: (start_x, start_y) is the top connection where it meets this floor, and the stair descends INTO `direction` from there (its body + landings fill the box [start, start + max_run] along `direction`). `z_offset` is the top\'s height above the floor base (omitted \u2192 this floor\'s slab thickness, flush with the walking surface). |\n| `start_y` | number | **yes** | |\n| `rise_height` | number > 0 | | Total height the stair covers, top \u2192 floor below. The step COUNT is derived: num_steps = round(rise_height / step_rise). Omitted \u2192 defaults to the height of the floor immediately below this one. Formula-capable (e.g. "= floor_height"). Replaces the old explicit `num_steps`. |\n| `step_rise` | number > 0 | **yes** | |\n| `step_tread` | number > 0 | **yes** | |\n| `step_width` | number > 0 | **yes** | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | The direction the stair EXTENDS from its top \u2014 the whole assembly fills the allocated box from (start_x,start_y) going this way for up to `max_run`. |\n| `max_run` | number > 0 | | ALLOCATED run: the length of space reserved for the stair along `direction`. The WHOLE assembly (flights + turn landings) is kept within [start, start+max_run]; when the run won\'t fit as one flight it auto-splits into switchback flights (more flights when tight), expanded in expandRoomWalls into plain staircases + floor_slab landings so every renderer is unchanged. Omit \u2192 one flight, no length limit. |\n| `landing_depth` | number > 0 | | Turn-landing depth (along the run). Omitted \u2192 equals step_width. |\n| `landing_thickness` | number \u2265 0 | | Turn-landing slab thickness. Omitted \u2192 equals step_rise. |\n| `turn` | enum: `clockwise` `anticlockwise` | | Switchback handedness, reckoned DESCENDING from the top. Omitted \u2192 "clockwise". Only affects split stairs. |\n| `flight_gap` | number > 0 | | Lateral gap between the two switchback flights (a stairwell void for a spine wall). Omitted/0 \u2192 flights are adjacent. The turn landings widen to bridge the gap. Only affects split stairs. |\n| `z_offset` | number | | Height of the stair\'s TOP above the floor base (slabZ; project units, 10 = 1 ft). Omitted \u2192 this floor\'s slab thickness, so the top is flush with the walking surface and the flights descend to the floor below. Raise it for an internal step whose top sits above the floor. |\n| `material` | string | | |\n\n\n### `door`\n\nFlat door/window remain valid as a legacy schema \u2014 new configs nest them inside room.walls[side].openings or wall.openings.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `door` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | |\n| `room` | string | | |\n| `wall` | string | | |\n| `open` | boolean | | |\n\n\n### `window`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `window` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `sill_height` | number \u2265 0 | | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | |\n| `room` | string | | |\n| `wall` | string | | |\n| `open` | boolean | | |\n\n\n### `kitchen_platform`\n\nKitchen platform \u2014 a polyline countertop / cooking slab that runs along the base of walls. Path is the wall-side edge; the platform extends `depth` units perpendicular to each segment on the given `side`. Renders as one box per path segment; corners meet at the shared point (no fancy mitering in v1).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `kitchen_platform` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `path` | array of tuple `[n,n]` | **yes** | |\n| `side` | enum: `left` `right` | **yes** | |\n| `depth` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Omitted \u2192 defaults to the floor\'s resolved slab thickness (sits on the slab top, as before). Same convention as `room`. |\n| `base_z` | number | | |\n| `material` | string | | |\n\n\n### `roof`\n\nv2 roof \u2014 unified segment-based type that replaces hip/gable/flat/shed. Schema is permissive; the v2 pipeline (svg2d/roof/v2/) validates segments + slope + endpoint style at derivation time.\n\n\n> **Freeform:** extra fields are allowed (`.catchall`) and validated at derivation time. See `roof-v2-guide.md`.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `roof` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n\n\n## Shared & nested schemas\n\n### site\n\nObjects don\'t bind to the grid with a special field \u2014 a grid line\'s position is published as a formula symbol (`<gridId>.x<name>` / `.y<name>`, see param/resolve.ts), so a room places itself with ordinary `formulas`, e.g. { x: "= main.x1", width: "= main.x5 - main.x1" }. With coord_convention:"center" those are wall centrelines and expandRoomWalls handles the wall extent.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `reference_x` | number | **yes** | |\n| `reference_y` | number | **yes** | |\n| `plot_length` | number > 0 | **yes** | |\n| `plot_width` | number > 0 | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n\n\n### houseDefaults\n\nHouse-level overrides for the built-in GlobalConfig defaults. Every floor without its own value falls back to these; if these are absent too, the code defaults in DEFAULT_GLOBAL_CONFIG apply.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `floor_height` | number > 0 | | |\n| `wall_height` | number > 0 | | |\n| `slab_thickness` | number \u2265 0 | | |\n| `wall_thickness` | number > 0 | | House-wide wall thickness (project units). Per-object `wall_thickness`/`thickness` overrides still win. Falls back to the code default (DEFAULT_GLOBAL_CONFIG.wall_thickness = 8) when omitted. |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n\n\n### units\n\nHow dimensions are LABELLED on the drawings. Display-only \u2014 geometry always stays in project units; this just controls the text on the dimension lines. Omitted = the built-in default (feet & inches, 10 project units = 1 ft).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `system` | enum: `feet_inches` `feet` `meters` `centimeters` `millimeters` | | feet_inches \u2192 12\' 6" ; the rest \u2192 decimal with a unit suffix. |\n| `per_unit` | number > 0 | | Project units that equal ONE display unit (10 \u2192 10 units = 1 ft; 100 \u2192 100 units = 1 m). Default 10. |\n| `precision` | integer \u2265 0 | | Decimal places for the non-feet_inches systems. |\n\n\n### Opening\n| field | type | req | notes |\n|---|---|---|---|\n| `kind` | enum: `door` `window` | **yes** | |\n| `name` | string | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | Numeric fields hold the RESOLVED value; a `= formula` for any of them lives in `formulas` (e.g. formulas.offset), evaluated by resolveParametric against the house variables/points \u2014 same pattern as every other object. |\n| `offset` | number \u2265 0 | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `sill_height` | number | | |\n| `direction` | enum: `north` `south` `east` `west` | | |\n| `facing` | enum: `north` `south` `east` `west` | | |\n| `open` | boolean | | When true, the opening is left BARE (just a hole) \u2014 no glazing/frame for a window, no leaf for a door \u2014 e.g. an open doorway or unglazed vent. |\n\n\n### RoomWallSide\n| field | type | req | notes |\n|---|---|---|---|\n| `height` | number | | |\n| `height_end` | number | | |\n| `openings` | array of [Opening](#opening) | | |\n\n\n### RoomItem\n\nA furniture piece nested INSIDE a room (room.items[]). It has NO x/y \u2014 its plan position is DERIVED at expand time from the parent room\'s footprint + `anchor` + per-axis gap (+ its own `rotation`). Flattened into a top-level `item` for every renderer. `gap_x`/`gap_y` are the inset (project units) kept from the anchor into the room (edge/corner anchor \u2192 clears the wall; centre anchor \u2192 signed offset, +x east / +y south). `gap_x`/`gap_y`/`rotation`/`scale`/`z_offset` are all plain numeric fields so each can be driven by a `= formula` (via the `formulas` map).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `layer` | string | | |\n| `asset` | [ItemAsset](#itemasset) | **yes** | |\n| `anchor` | [ItemAnchor](#itemanchor) | | |\n| `gap_x` | number | | |\n| `gap_y` | number | | |\n| `rotation` | number | | |\n| `scale` | number > 0 | | |\n| `z_offset` | number | | |\n\n\n### ItemAsset\n\nFurniture (GLB `item`) \u2014 shared schema pieces Defined BEFORE `room` so a room can nest its own `items[]`. Asset distances are METRES (the GLB\'s native unit); the 3D/2D layers scale them into project units. See registry/nodes/item + three/units. The asset backing a furniture item \u2014 stored INLINE so a .wadi is self-contained (share links / web load the GLB from `src`). A catalog is just a picker convenience.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `id` | string | **yes** | |\n| `name` | string | | |\n| `src` | string | **yes** | |\n| `dimensions` | tuple `[n>0,n>0,n>0]` | **yes** | |\n| `thumbnail` | string | | |\n| `floorPlanUrl` | string | | |\n| `category` | string | | |\n| `tags` | array of string | | |\n| `offset` | tuple `[n,n,n]` | | |\n| `corrRotation` | tuple `[n,n,n]` | | |\n| `corrScale` | tuple `[n>0,n>0,n>0]` | | |\n\n\n### ComponentDef\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | | |\n| `params` | array of [ComponentParam](#componentparam) | | |\n| `variables` | map: string \u2192 number, or `"= formula"` string | | |\n| `points` | map: string \u2192 inline object | | |\n| `objects` | array of [Object types](#object-types) | **yes** | |\n\n\n### ComponentParam\n\nA reusable component DEFINITION in the in-file `components` library. It is a mini-house: its own `variables`/`points` and a flat `objects` body authored in LOCAL coords (origin 0,0). `params` names which variables are the public inputs (label/default for the instance form). A `component` instance overrides those variables and places the body at its (x,y,z_offset). Stored once; referenced by many instances.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | **yes** | |\n| `label` | string | | |\n| `description` | string | | |\n| `default` | number | | |\n\n\n### LayerDef\n\nA visibility layer for the 3D view. Each object may reference a layer by `id` (via its `layer` field); the layers menu toggles whole layers on/off. Display-only \u2014 never affects geometry. Optional: when absent, a built-in default layer set is used, and objects fall back to an automatic per-type/floor mapping.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `id` | string (non-empty) | **yes** | |\n| `label` | string | **yes** | |\n| `color` | string | | |\n| `group` | string | | Friendly group for the owner "Show/hide layers" menu (e.g. "Roof", "Walls"). Layers sharing a group toggle together. Optional. |\n\n\n### configurator\n| field | type | req | notes |\n|---|---|---|---|\n| `title` | string | | |\n| `description` | string | | |\n| `groups` | array of inline object | | |\n| `inputs` | array of [ConfiguratorInput](#configuratorinput) | **yes** | |\n\n\n### ConfiguratorInput\n\nConfigurator (Gharkul owner UI) Optional, author-supplied metadata: which `variables`/`points` a template exposes to end users, and how to present them. IGNORED by the resolver and every geometry consumer \u2014 read only by the owner-facing Configurator UI. `target` is a variable name (e.g. "floorH") or a point coordinate ("House.W" \u2192 points.House.x; W/L/X/Y/x/y are resolver synonyms). `min`/`max`/ `step` are in RAW project units; `unit` only affects display.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `target` | string (non-empty) | **yes** | |\n| `label` | string (non-empty) | **yes** | |\n| `description` | string | | |\n| `control` | enum: `slider` `number` `select` `toggle` | | |\n| `unit` | enum: `ft` `in` `m` `units` `percent` `count` `none` | | |\n| `min` | number | | |\n| `max` | number | | |\n| `step` | number > 0 | | |\n| `options` | array of inline object | | |\n| `group` | string | | |\n\n\n### ItemAnchor\n\n9-point anchor on a room\'s INNER footprint. First token = vertical (top = north \u2026 bottom = south), second = horizontal (left = west \u2026 right = east); "center" alone = both. The item aligns its matching edge/corner to this spot, held `gap` off it, into the room \u2014 so it reflows when the room is resized.\n\nEnum: `top-left` `top-center` `top-right` `center-left` `center` `center-right` `bottom-left` `bottom-center` `bottom-right`\n'
|
|
418018
|
+
}
|
|
418019
|
+
};
|
|
418020
|
+
var MODULES = {
|
|
418021
|
+
"std-furniture": {
|
|
418022
|
+
"summary": "Built-in CC0 furniture pack (Kenney Furniture Kit) \u2014 asset ids for `item`.",
|
|
418023
|
+
"source": '// std-furniture.wdl \u2014 the built-in CC0 furniture pack (Kenney Furniture Kit).\n// GENERATED from editor/src/furniture/catalog.ts by wadi-dsl/scripts/gen-std-modules.mjs.\n// Do not edit by hand: `import "std-furniture" as f` then `item f."<id>"`.\n\n// Bedroom\nasset "bed_double" src "https://templates.wadi.house/furniture/bed_double.glb" dims (1.5, 0.5, 2) name "Double bed" category "Bedroom"\nasset "bed_single" src "https://templates.wadi.house/furniture/bed_single.glb" dims (0.9, 0.5, 1.9) name "Single bed" category "Bedroom"\nasset "bed_bunk" src "https://templates.wadi.house/furniture/bed_bunk.glb" dims (1, 1.7, 2) name "Bunk bed" category "Bedroom"\nasset "wardrobe" src "https://templates.wadi.house/furniture/wardrobe.glb" dims (1, 1.8, 0.55) name "Wardrobe" category "Bedroom"\nasset "bedside_table" src "https://templates.wadi.house/furniture/bedside_table.glb" dims (0.5, 0.55, 0.4) name "Bedside table" category "Bedroom"\n// Living\nasset "sofa" src "https://templates.wadi.house/furniture/sofa.glb" dims (1.9, 0.8, 0.9) name "Sofa" category "Living"\nasset "sofa_long" src "https://templates.wadi.house/furniture/sofa_long.glb" dims (2.5, 0.8, 0.9) name "Large sofa" category "Living"\nasset "sofa_corner" src "https://templates.wadi.house/furniture/sofa_corner.glb" dims (2.4, 0.8, 2.4) name "Corner sofa" category "Living"\nasset "armchair" src "https://templates.wadi.house/furniture/armchair.glb" dims (0.85, 0.8, 0.85) name "Armchair" category "Living"\nasset "recliner" src "https://templates.wadi.house/furniture/recliner.glb" dims (0.9, 1, 0.95) name "Recliner" category "Living"\nasset "ottoman" src "https://templates.wadi.house/furniture/ottoman.glb" dims (0.8, 0.45, 0.8) name "Ottoman" category "Living"\nasset "coffee_table" src "https://templates.wadi.house/furniture/coffee_table.glb" dims (1.1, 0.4, 0.6) name "Coffee table" category "Living"\nasset "side_table" src "https://templates.wadi.house/furniture/side_table.glb" dims (0.5, 0.5, 0.5) name "Side table" category "Living"\nasset "tv_unit" src "https://templates.wadi.house/furniture/tv_unit.glb" dims (1.5, 0.5, 0.4) name "TV unit" category "Living"\nasset "tv" src "https://templates.wadi.house/furniture/tv.glb" dims (1.2, 0.7, 0.1) name "Television" category "Living"\nasset "cabinet_wide" src "https://templates.wadi.house/furniture/cabinet_wide.glb" dims (1.6, 1, 0.4) name "Cabinet" category "Living"\nasset "ceiling_fan" src "https://templates.wadi.house/furniture/ceiling_fan.glb" dims (1.2, 0.35, 1.2) name "Ceiling fan" category "Living"\n// Dining\nasset "dining_table" src "https://templates.wadi.house/furniture/dining_table.glb" dims (1.5, 0.75, 0.9) name "Dining table" category "Dining"\nasset "round_table" src "https://templates.wadi.house/furniture/round_table.glb" dims (1.1, 0.75, 1.1) name "Round table" category "Dining"\nasset "chair" src "https://templates.wadi.house/furniture/chair.glb" dims (0.5, 0.9, 0.5) name "Chair" category "Dining"\nasset "bench" src "https://templates.wadi.house/furniture/bench.glb" dims (1.4, 0.45, 0.4) name "Bench" category "Dining"\nasset "bar_stool" src "https://templates.wadi.house/furniture/bar_stool.glb" dims (0.4, 1.05, 0.4) name "Bar stool" category "Dining"\n// Kitchen\nasset "kitchen_cabinet" src "https://templates.wadi.house/furniture/kitchen_cabinet.glb" dims (0.6, 0.9, 0.6) name "Base cabinet" category "Kitchen"\nasset "kitchen_cabinet_upper" src "https://templates.wadi.house/furniture/kitchen_cabinet_upper.glb" dims (0.6, 0.7, 0.35) name "Wall cabinet" category "Kitchen"\nasset "kitchen_sink" src "https://templates.wadi.house/furniture/kitchen_sink.glb" dims (0.6, 0.9, 0.6) name "Kitchen sink" category "Kitchen"\nasset "stove" src "https://templates.wadi.house/furniture/stove.glb" dims (0.6, 0.9, 0.65) name "Stove" category "Kitchen"\nasset "range_hood" src "https://templates.wadi.house/furniture/range_hood.glb" dims (0.6, 0.45, 0.5) name "Range hood" category "Kitchen"\nasset "fridge" src "https://templates.wadi.house/furniture/fridge.glb" dims (0.7, 1.8, 0.7) name "Fridge" category "Kitchen"\nasset "microwave" src "https://templates.wadi.house/furniture/microwave.glb" dims (0.5, 0.3, 0.4) name "Microwave" category "Kitchen"\nasset "coffee_machine" src "https://templates.wadi.house/furniture/coffee_machine.glb" dims (0.25, 0.35, 0.3) name "Coffee machine" category "Kitchen"\n// Bathroom\nasset "toilet" src "https://templates.wadi.house/furniture/toilet.glb" dims (0.5, 0.8, 0.7) name "Toilet" category "Bathroom"\nasset "bathtub" src "https://templates.wadi.house/furniture/bathtub.glb" dims (0.75, 0.6, 1.6) name "Bathtub" category "Bathroom"\nasset "shower" src "https://templates.wadi.house/furniture/shower.glb" dims (0.9, 2.1, 0.9) name "Shower" category "Bathroom"\nasset "bathroom_sink" src "https://templates.wadi.house/furniture/bathroom_sink.glb" dims (0.6, 0.85, 0.5) name "Washbasin" category "Bathroom"\nasset "bathroom_mirror" src "https://templates.wadi.house/furniture/bathroom_mirror.glb" dims (0.6, 0.8, 0.05) name "Mirror" category "Bathroom"\nasset "bathroom_cabinet" src "https://templates.wadi.house/furniture/bathroom_cabinet.glb" dims (0.6, 0.7, 0.3) name "Bathroom cabinet" category "Bathroom"\nasset "washing_machine" src "https://templates.wadi.house/furniture/washing_machine.glb" dims (0.6, 0.85, 0.6) name "Washing machine" category "Bathroom"\n// Study\nasset "desk" src "https://templates.wadi.house/furniture/desk.glb" dims (1.2, 0.75, 0.6) name "Desk" category "Study"\nasset "desk_corner" src "https://templates.wadi.house/furniture/desk_corner.glb" dims (1.4, 0.75, 1.4) name "Corner desk" category "Study"\nasset "desk_chair" src "https://templates.wadi.house/furniture/desk_chair.glb" dims (0.6, 1, 0.6) name "Desk chair" category "Study"\nasset "bookcase" src "https://templates.wadi.house/furniture/bookcase.glb" dims (0.9, 1.8, 0.3) name "Bookcase" category "Study"\nasset "monitor" src "https://templates.wadi.house/furniture/monitor.glb" dims (0.55, 0.4, 0.2) name "Monitor" category "Study"\nasset "laptop" src "https://templates.wadi.house/furniture/laptop.glb" dims (0.35, 0.03, 0.25) name "Laptop" category "Study"\n// Lighting\nasset "floor_lamp" src "https://templates.wadi.house/furniture/floor_lamp.glb" dims (0.4, 1.6, 0.4) name "Floor lamp" category "Lighting"\nasset "table_lamp" src "https://templates.wadi.house/furniture/table_lamp.glb" dims (0.3, 0.5, 0.3) name "Table lamp" category "Lighting"\nasset "wall_light" src "https://templates.wadi.house/furniture/wall_light.glb" dims (0.2, 0.3, 0.15) name "Wall light" category "Lighting"\n// Decor\nasset "plant" src "https://templates.wadi.house/furniture/plant.glb" dims (0.5, 1, 0.5) name "Potted plant" category "Decor"\nasset "small_plant" src "https://templates.wadi.house/furniture/small_plant.glb" dims (0.3, 0.45, 0.3) name "Small plant" category "Decor"\nasset "coat_rack" src "https://templates.wadi.house/furniture/coat_rack.glb" dims (0.5, 1.8, 0.5) name "Coat rack" category "Decor"\nasset "rug" src "https://templates.wadi.house/furniture/rug.glb" dims (1.6, 0.02, 2.3) name "Rug" category "Decor"\n// Bedroom\nasset "bedside_cabinet" src "https://templates.wadi.house/furniture/bedside_cabinet.glb" dims (0.51, 0.44, 0.41) name "Bedside cabinet" category "Bedroom"\nasset "bedside_table_drawers" src "https://templates.wadi.house/furniture/bedside_table_drawers.glb" dims (0.51, 0.5, 0.41) name "Bedside table (drawers)" category "Bedroom"\nasset "pillow" src "https://templates.wadi.house/furniture/pillow.glb" dims (0.44, 0.42, 0.17) name "Pillow" category "Bedroom"\nasset "pillow_blue" src "https://templates.wadi.house/furniture/pillow_blue.glb" dims (0.44, 0.24, 0.12) name "Pillow (blue)" category "Bedroom"\nasset "bolster" src "https://templates.wadi.house/furniture/bolster.glb" dims (0.73, 0.42, 0.17) name "Bolster pillow" category "Bedroom"\nasset "bolster_blue" src "https://templates.wadi.house/furniture/bolster_blue.glb" dims (0.98, 0.42, 0.17) name "Bolster (blue)" category "Bedroom"\n// Living\nasset "sofa_design" src "https://templates.wadi.house/furniture/sofa_design.glb" dims (2.13, 0.76, 0.78) name "Design sofa" category "Living"\nasset "sofa_design_corner" src "https://templates.wadi.house/furniture/sofa_design_corner.glb" dims (2.56, 0.76, 2.56) name "Design corner sofa" category "Living"\nasset "armchair_design" src "https://templates.wadi.house/furniture/armchair_design.glb" dims (1.39, 0.76, 0.78) name "Design armchair" category "Living"\nasset "bench_cushion" src "https://templates.wadi.house/furniture/bench_cushion.glb" dims (0.76, 0.87, 0.38) name "Cushioned bench" category "Living"\nasset "bench_cushion_low" src "https://templates.wadi.house/furniture/bench_cushion_low.glb" dims (0.8, 0.38, 0.42) name "Low cushioned bench" category "Living"\nasset "tv_unit_doors" src "https://templates.wadi.house/furniture/tv_unit_doors.glb" dims (1.52, 0.59, 0.49) name "TV unit (doors)" category "Living"\nasset "tv_antenna" src "https://templates.wadi.house/furniture/tv_antenna.glb" dims (0.5, 0.2, 0.15) name "TV (antenna)" category "Living"\nasset "tv_vintage" src "https://templates.wadi.house/furniture/tv_vintage.glb" dims (0.78, 0.51, 0.51) name "Vintage TV" category "Living"\nasset "speaker" src "https://templates.wadi.house/furniture/speaker.glb" dims (0.28, 1.21, 0.28) name "Speaker" category "Living"\nasset "speaker_small" src "https://templates.wadi.house/furniture/speaker_small.glb" dims (0.28, 0.57, 0.25) name "Small speaker" category "Living"\nasset "radio" src "https://templates.wadi.house/furniture/radio.glb" dims (0.6, 0.43, 0.19) name "Radio" category "Living"\nasset "coffee_table_glass" src "https://templates.wadi.house/furniture/coffee_table_glass.glb" dims (1.26, 0.44, 0.76) name "Glass coffee table" category "Living"\nasset "coffee_table_glass_sq" src "https://templates.wadi.house/furniture/coffee_table_glass_sq.glb" dims (0.76, 0.44, 0.76) name "Glass coffee table (square)" category "Living"\nasset "coffee_table_square" src "https://templates.wadi.house/furniture/coffee_table_square.glb" dims (0.76, 0.44, 0.76) name "Coffee table (square)" category "Living"\nasset "side_table_cross" src "https://templates.wadi.house/furniture/side_table_cross.glb" dims (1.62, 0.66, 0.85) name "Cross-leg side table" category "Living"\nasset "side_table_cross_cloth" src "https://templates.wadi.house/furniture/side_table_cross_cloth.glb" dims (1.62, 0.66, 0.85) name "Cross-leg table (cloth)" category "Living"\nasset "side_table_drawers" src "https://templates.wadi.house/furniture/side_table_drawers.glb" dims (1.02, 0.73, 0.42) name "Side table (drawers)" category "Living"\n// Dining\nasset "chair_cushion" src "https://templates.wadi.house/furniture/chair_cushion.glb" dims (0.38, 0.87, 0.38) name "Cushioned chair" category "Dining"\nasset "chair_modern" src "https://templates.wadi.house/furniture/chair_modern.glb" dims (0.38, 0.87, 0.38) name "Modern chair" category "Dining"\nasset "chair_modern_frame" src "https://templates.wadi.house/furniture/chair_modern_frame.glb" dims (0.38, 0.87, 0.38) name "Modern frame chair" category "Dining"\nasset "chair_rounded" src "https://templates.wadi.house/furniture/chair_rounded.glb" dims (0.38, 0.86, 0.38) name "Rounded chair" category "Dining"\nasset "dining_table_glass" src "https://templates.wadi.house/furniture/dining_table_glass.glb" dims (1.6, 0.62, 0.85) name "Glass dining table" category "Dining"\nasset "dining_table_cloth" src "https://templates.wadi.house/furniture/dining_table_cloth.glb" dims (1.6, 0.62, 0.85) name "Dining table (cloth)" category "Dining"\nasset "bar_stool_square" src "https://templates.wadi.house/furniture/bar_stool_square.glb" dims (0.29, 0.77, 0.28) name "Bar stool (square)" category "Dining"\n// Kitchen\nasset "kitchen_island" src "https://templates.wadi.house/furniture/kitchen_island.glb" dims (0.82, 0.8, 0.4) name "Kitchen island" category "Kitchen"\nasset "kitchen_island_end" src "https://templates.wadi.house/furniture/kitchen_island_end.glb" dims (0.19, 0.8, 0.4) name "Island end" category "Kitchen"\nasset "blender" src "https://templates.wadi.house/furniture/blender.glb" dims (0.26, 0.43, 0.21) name "Blender" category "Kitchen"\nasset "kitchen_cabinet_corner" src "https://templates.wadi.house/furniture/kitchen_cabinet_corner.glb" dims (0.87, 0.85, 0.87) name "Corner base cabinet" category "Kitchen"\nasset "kitchen_cabinet_corner_round" src "https://templates.wadi.house/furniture/kitchen_cabinet_corner_round.glb" dims (0.85, 0.85, 0.85) name "Corner base cabinet (round)" category "Kitchen"\nasset "kitchen_cabinet_drawer" src "https://templates.wadi.house/furniture/kitchen_cabinet_drawer.glb" dims (0.82, 0.85, 0.85) name "Base cabinet (drawers)" category "Kitchen"\nasset "kitchen_cabinet_upper_corner" src "https://templates.wadi.house/furniture/kitchen_cabinet_upper_corner.glb" dims (0.41, 0.74, 0.4) name "Wall cabinet (corner)" category "Kitchen"\nasset "kitchen_cabinet_upper_double" src "https://templates.wadi.house/furniture/kitchen_cabinet_upper_double.glb" dims (0.82, 0.74, 0.42) name "Wall cabinet (double)" category "Kitchen"\nasset "kitchen_cabinet_upper_low" src "https://templates.wadi.house/furniture/kitchen_cabinet_upper_low.glb" dims (0.82, 0.37, 0.42) name "Wall cabinet (low)" category "Kitchen"\nasset "fridge_builtin" src "https://templates.wadi.house/furniture/fridge_builtin.glb" dims (0.82, 1.65, 0.85) name "Built-in fridge" category "Kitchen"\nasset "fridge_large" src "https://templates.wadi.house/furniture/fridge_large.glb" dims (0.99, 1.75, 0.77) name "Large fridge" category "Kitchen"\nasset "fridge_small" src "https://templates.wadi.house/furniture/fridge_small.glb" dims (0.82, 1.14, 0.55) name "Mini fridge" category "Kitchen"\nasset "stove_electric" src "https://templates.wadi.house/furniture/stove_electric.glb" dims (0.82, 0.85, 0.85) name "Electric stove" category "Kitchen"\nasset "range_hood_large" src "https://templates.wadi.house/furniture/range_hood_large.glb" dims (0.82, 0.7, 0.54) name "Range hood (large)" category "Kitchen"\nasset "toaster" src "https://templates.wadi.house/furniture/toaster.glb" dims (0.36, 0.25, 0.19) name "Toaster" category "Kitchen"\nasset "trashcan" src "https://templates.wadi.house/furniture/trashcan.glb" dims (0.39, 0.81, 0.44) name "Trash can" category "Kitchen"\n// Bathroom\nasset "bathroom_cabinet_drawer" src "https://templates.wadi.house/furniture/bathroom_cabinet_drawer.glb" dims (0.82, 0.9, 0.61) name "Bathroom cabinet (drawers)" category "Bathroom"\nasset "bathroom_sink_square" src "https://templates.wadi.house/furniture/bathroom_sink_square.glb" dims (0.82, 1.1, 0.57) name "Washbasin (square)" category "Bathroom"\nasset "shower_square" src "https://templates.wadi.house/furniture/shower_square.glb" dims (1.07, 2.08, 1.11) name "Shower (square)" category "Bathroom"\nasset "toilet_square" src "https://templates.wadi.house/furniture/toilet_square.glb" dims (0.58, 0.86, 0.74) name "Toilet (square)" category "Bathroom"\nasset "dryer" src "https://templates.wadi.house/furniture/dryer.glb" dims (0.74, 0.89, 0.72) name "Dryer" category "Bathroom"\nasset "washer_dryer_stacked" src "https://templates.wadi.house/furniture/washer_dryer_stacked.glb" dims (0.74, 1.79, 0.74) name "Washer-dryer (stacked)" category "Bathroom"\n// Study\nasset "bookcase_closed" src "https://templates.wadi.house/furniture/bookcase_closed.glb" dims (0.76, 1.61, 0.47) name "Bookcase (closed)" category "Study"\nasset "bookcase_low" src "https://templates.wadi.house/furniture/bookcase_low.glb" dims (0.76, 0.76, 0.47) name "Bookcase (low)" category "Study"\nasset "keyboard" src "https://templates.wadi.house/furniture/keyboard.glb" dims (0.54, 0.05, 0.22) name "Keyboard" category "Study"\nasset "mouse" src "https://templates.wadi.house/furniture/mouse.glb" dims (0.09, 0.04, 0.16) name "Mouse" category "Study"\nasset "books" src "https://templates.wadi.house/furniture/books.glb" dims (0.29, 0.2, 0.18) name "Books" category "Study"\n// Lighting\nasset "ceiling_lamp_square" src "https://templates.wadi.house/furniture/ceiling_lamp_square.glb" dims (0.23, 0.44, 0.23) name "Ceiling lamp (square)" category "Lighting"\nasset "floor_lamp_square" src "https://templates.wadi.house/furniture/floor_lamp_square.glb" dims (0.23, 1.63, 0.23) name "Floor lamp (square)" category "Lighting"\nasset "table_lamp_square" src "https://templates.wadi.house/furniture/table_lamp_square.glb" dims (0.23, 0.55, 0.23) name "Table lamp (square)" category "Lighting"\n// Decor\nasset "small_plant_2" src "https://templates.wadi.house/furniture/small_plant_2.glb" dims (0.18, 0.27, 0.18) name "Small plant (fern)" category "Decor"\nasset "small_plant_3" src "https://templates.wadi.house/furniture/small_plant_3.glb" dims (0.19, 0.28, 0.16) name "Small plant (cactus)" category "Decor"\nasset "coat_hooks" src "https://templates.wadi.house/furniture/coat_hooks.glb" dims (0.85, 0.53, 0.26) name "Coat hooks (wall)" category "Decor"\nasset "doormat" src "https://templates.wadi.house/furniture/doormat.glb" dims (0.82, 0.02, 0.45) name "Doormat" category "Decor"\nasset "rug_round" src "https://templates.wadi.house/furniture/rug_round.glb" dims (1.75, 0.02, 1.75) name "Round rug" category "Decor"\nasset "rug_rounded" src "https://templates.wadi.house/furniture/rug_rounded.glb" dims (2.98, 0.02, 1.75) name "Rounded rug" category "Decor"\nasset "rug_square" src "https://templates.wadi.house/furniture/rug_square.glb" dims (1.72, 0.02, 1.75) name "Square rug" category "Decor"\nasset "teddy_bear" src "https://templates.wadi.house/furniture/teddy_bear.glb" dims (0.74, 0.85, 0.47) name "Teddy bear" category "Decor"\nasset "box_closed" src "https://templates.wadi.house/furniture/box_closed.glb" dims (0.4, 0.53, 0.4) name "Box (closed)" category "Decor"\nasset "box_open" src "https://templates.wadi.house/furniture/box_open.glb" dims (0.71, 0.53, 0.4) name "Box (open)" category "Decor"\n'
|
|
418024
|
+
},
|
|
418025
|
+
"konkan/base": {
|
|
418026
|
+
"summary": "Goal-tagged Konkan house parts (Stairwell, Verandah, Otla) \u2014 components for `use`.",
|
|
418027
|
+
"source": '// konkan/base.wdl \u2014 a starter pack of reusable, goal-tagged Konkan house parts.\n//\n// A MODULE (no `house` body): import it and stamp its components onto a floor \u2014\n// import "konkan/base" as kb\n// floor 1 "Ground" { use kb.Stairwell at (208, 64) with { rise: 116 } }\n//\n// Each component is authored in LOCAL coordinates (origin 0,0) and is flat\n// (it does not `use` other components), so it stamps cleanly into any host.\n// The `goal` line is the discovery key \u2014 `wadi_module "konkan/base"` (or a\n// `wadi_modules` query) surfaces the component whose goal matches the intent.\n\n// Climb one floor. A single straight run for a short rise; give `run` and the\n// staircase auto-folds into switchback flights (max_run) when the rise is tall.\ncomponent Stairwell goal "climb to the next floor" {\n param rise = 116 // total height to the floor above (= floor_height)\n param run = 200 // max horizontal run before a switchback landing\n staircase name "Stair" at (0, 0) step (7, 11, 44) direction south total_height rise max_run run\n}\n\n// A shaded sit-out running along the front of the house \u2014 the room is open to\n// the south (front) and enclosed on the other three sides. Add a roof + pillars\n// in the host if you want it covered.\ncomponent Verandah goal "a shaded sit-out along the house front" {\n param across = 200 // span across the front\n param deep = 70 // how far it projects\n room Verandah at (0, 0) size (across, deep) {\n wall north east west // open to the south\n }\n}\n\n// An otla \u2014 the traditional Konkan raised platform at the entrance where people\n// sit. A low slab you place at the doorway (its thickness is the platform rise).\ncomponent Otla goal "a raised entrance platform to sit on (Konkan otla)" {\n param wide = 90\n param deep = 55\n param rise = 12 // platform height above grade\n slab name "Otla" at (0, 0) size (wide, deep) thickness rise\n}\n\n// A compact enclosed wet area (bathroom / WC): a small fully-walled room with a\n// door on the front (south). Size it to the fixture you need.\ncomponent Bathroom goal "a compact enclosed wet area (bathroom / WC)" {\n param wide = 70\n param deep = 60\n room Bath at (0, 0) size (wide, deep) {\n wall north east west\n wall south { door BathDoor at 20 size (30, 78) }\n }\n}\n\n// A cooking area with an L-shaped masonry counter in the corner. Fixed size (the\n// counter path can\'t be parametric), so the room exactly fits its counter.\ncomponent Kitchen goal "a cooking area with an L-shaped counter platform" {\n room Kitchen at (0, 0) size (150, 120) {\n wall north east south west\n }\n kitchen name "Counter" path ((8, 8), (130, 8), (130, 100)) side right depth 22 height 36\n}\n\n// A tulsi vrindavan \u2014 the raised masonry planter for the sacred basil that stands\n// in a Konkan courtyard. A small square raised block; place it in the aangan.\ncomponent TulsiVrindavan goal "a raised courtyard planter for tulsi (sacred basil)" {\n param wide = 24 // square side\n param rise = 30 // planter height\n slab name "Tulsi" at (0, 0) size (wide, wide) thickness rise\n}\n\n// A parapet \u2014 a low wall enclosing a terrace edge (open at the top, no roof).\n// Stamp it around a flat roof / terrace slab. (Per-side wall height is a fixed\n// literal here \u2014 parametric per-side wall heights aren\'t supported yet.)\ncomponent Parapet goal "a low wall enclosing a terrace edge" {\n param wide = 200\n param deep = 200\n room Terrace at (0, 0) size (wide, deep) {\n wall north east south west height 36\n }\n}\n'
|
|
418028
|
+
}
|
|
418029
|
+
};
|
|
418030
|
+
|
|
418031
|
+
// src/pipeline.ts
|
|
418032
|
+
function stdResolveModule(ref) {
|
|
418033
|
+
return MODULES[ref]?.source;
|
|
418034
|
+
}
|
|
417242
418035
|
var ALL_VIEWS = ["plans", "elevations", "roof"];
|
|
417243
418036
|
function compileConfig(wdl) {
|
|
417244
|
-
const compiled = compileDsl(wdl);
|
|
418037
|
+
const compiled = compileDsl(wdl, { resolveModule: stdResolveModule });
|
|
417245
418038
|
const { config: config3 } = resolveParametric(compiled);
|
|
417246
418039
|
return config3;
|
|
417247
418040
|
}
|
|
@@ -417334,71 +418127,15 @@ async function appCapture(config3) {
|
|
|
417334
418127
|
}
|
|
417335
418128
|
var APP_NOT_RUNNING = "The Wadi desktop app isn't running, so live 3D isn't available. Open the Wadi app (it serves the bridge on 127.0.0.1:" + PORT + "), or use `wadi_preview` for headless 2D drawings (plans / elevations / roof).";
|
|
417336
418129
|
|
|
417337
|
-
// src/assets.generated.ts
|
|
417338
|
-
var EXAMPLES = {
|
|
417339
|
-
"minimal": '// Minimal valid house \u2014 one floor, one room. The smallest thing that renders.\nhouse Minimal {\n convention center\n units feet_inches per_unit 10\n site { plot (300, 300) }\n defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }\n\n // No floor slab modelled here, so slab_thickness is 0 (convention C3) \u2014 the\n // walls sit directly on grade instead of floating on a phantom deck.\n floor 1 "Ground" slab_thickness 0 {\n room Studio at (4, 4) size (200, 240) {\n wall east west // enclose the exterior sides (C2)\n wall south { door Main at 90 size (34, 84) }\n wall north { window Light at 80 size (60, 50) sill 35 }\n }\n }\n}\n',
|
|
417340
|
-
"two_room": `// Two rooms, NO grid \u2014 explicit centreline coordinates. Adjacent rooms just
|
|
417341
|
-
// abut on a shared line (center convention), so Living's east edge (x=204) is
|
|
417342
|
-
// Bedroom's west edge. A door connects them; each has a window.
|
|
417343
|
-
house TwoRoom {
|
|
417344
|
-
convention center
|
|
417345
|
-
units feet_inches per_unit 10
|
|
417346
|
-
site { plot (420, 300) }
|
|
417347
|
-
defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }
|
|
417348
|
-
|
|
417349
|
-
// No slab modelled \u21D2 slab_thickness 0 so the walls don't float (convention C3).
|
|
417350
|
-
floor 1 "Ground" slab_thickness 0 {
|
|
417351
|
-
room Living at (4, 4) size (200, 240) {
|
|
417352
|
-
wall west // exterior side, enclosed (C2)
|
|
417353
|
-
wall south { door FrontDoor at 80 size (34, 84) }
|
|
417354
|
-
wall east { door Passage at 90 size (32, 84) }
|
|
417355
|
-
wall north { window LivWin at 70 size (60, 50) sill 35 }
|
|
417356
|
-
}
|
|
417357
|
-
room Bedroom at (204, 4) size (160, 240) {
|
|
417358
|
-
wall south // exterior side, enclosed (C2)
|
|
417359
|
-
wall north { window BedWin at 60 size (55, 50) sill 35 }
|
|
417360
|
-
wall east { window BedWinE at 90 size (45, 45) sill 40 }
|
|
417361
|
-
}
|
|
417362
|
-
}
|
|
417363
|
-
}
|
|
417364
|
-
`,
|
|
417365
|
-
"two_story": '// Multi-floor, grid-driven: a Plinth floor, two occupied floors, and a hip roof.\n// Everything is first-class now \u2014 ground, plinth, slab, staircase, and roof are\n// real entities with parameters (no `raw`). Widen it by editing `point House`.\nhouse TwoStory {\n convention center\n units feet_inches per_unit 10\n\n site { plot (500, 500) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n var wallT = 8\n point House { x = 352, y = 352 }\n grid main {\n x: 1 @ wallT / 2, 2 @ House.W / 2, 3 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L / 2, C @ House.L - wallT / 2\n }\n\n // The plinth floor\'s height MUST equal the plinth block height (convention\n // C1) or the Ground Floor above would float 40 units into the air.\n floor 0 "Plinth" height 40 {\n ground name "Ground" at (0, 0) size (500, 500) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n height 40 layer "plinth"\n }\n\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n room Hall at (main.x1, main.yA) size (main.x3 - main.x1, main.yB - main.yA) {\n wall north east west // all three exterior sides (C2)\n wall south { door Main at 120 size (36, 84) }\n }\n room Kitchen at (main.x1, main.yB) size (main.x2 - main.x1, main.yC - main.yB) {\n wall south // exterior side (C2)\n wall west { window KW at 40 size (45, 45) sill 40 }\n }\n room Bath at (main.x2, main.yB) size (main.x3 - main.x2, main.yC - main.yB) {\n wall south // exterior side (C2)\n wall east { window BW at 30 size (40, 40) sill 45 }\n }\n }\n\n floor 2 "First Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n room Bedroom1 at (main.x1, main.yA) size (main.x2 - main.x1, main.yC - main.yA) {\n wall north south // exterior sides (C2)\n wall west { window B1 at 60 size (55, 50) sill 35 }\n }\n room Bedroom2 at (main.x2, main.yA) size (main.x3 - main.x2, main.yC - main.yA) {\n wall north south // exterior sides (C2)\n wall east { window B2 at 60 size (55, 50) sill 35 }\n }\n staircase name "Stair" at (300, 60) step (7, 10, 36) direction south\n }\n\n floor 3 "Loft Floor" {\n roof name "Hip Roof" pitched endpoint closed slope height 100 overhang 25 {\n segment "seg0" from (176, 0) to (176, 352) width 352 hip_setback (80, 80) tie_beams 3\n truss "seg0" fink at (80, 176, 272)\n }\n }\n}\n',
|
|
417366
|
-
"coastal": '// A coastal Konkan cottage, authored entirely in the Wadi DSL.\n// `tsx src/cli/main.ts examples/coastal.wdl` compiles it to a .wadi that the\n// real Wadi pipeline validates + resolves + renders. This one file exercises\n// the parametric core (var/point/grid/formula/configurator) and the domain\n// vocabulary \u2014 every primitive is FIRST-CLASS (ground, plinth, slab, room,\n// wall, opening, pillar, roof), no `raw` needed.\n\nhouse CoastalCottage {\n convention center\n units feet_inches per_unit 10\n\n site { plot (600, 700) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n // --- Parametric core: the degrees of freedom + the grid scaffold ---\n var wallT = 8\n var pillarW = 10\n var pilInset = (pillarW - wallT) / 2\n var roof_style = 3\n\n point House { x = 420, y = 470 }\n\n grid main {\n x: 1 @ wallT / 2 role structural,\n 2 @ House.W / 2,\n 3 @ House.W - wallT / 2 role structural\n y: A @ wallT / 2 role structural,\n B @ House.L / 2,\n C @ House.L - wallT / 2 role structural\n }\n\n // --- Control knobs a homeowner turns (a curated projection of the vars) ---\n configurator {\n slider pillarW "Column size" ft [8 .. 14 step 1]\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n }\n\n // --- Plinth floor: terrain + raised base ---\n floor 0 "Plinth" height 40 { // floor height == plinth height (C1)\n ground name "Ground" at (0, 0) size (600, 700) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n height 40 layer "plinth"\n }\n\n // --- Ground floor: slab + grid-placed rooms + corner pillars ---\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x3 - main.x1, main.yC - main.yA)\n\n room Living\n at (main.x1, main.yA)\n size (main.x2 - main.x1, main.yB - main.yA) {\n wall west // exterior side (C2)\n wall north { window LivWinN at 55 size (55, 55) sill 35 }\n wall south { door LivDoor at 60 size (32, 80) }\n }\n\n room Kitchen\n at (main.x2, main.yA)\n size (main.x3 - main.x2, main.yB - main.yA) {\n wall north // exterior side (C2)\n wall east { window KitWinE at 40 size (45, 45) sill 40 }\n }\n\n room Bedroom\n at (main.x1, main.yB)\n size (main.x3 - main.x1, main.yC - main.yB) {\n wall east // exterior side (C2)\n wall west { window BedWinW at 50 size (55, 55) sill 35 }\n wall south { door BedDoor at 70 size (32, 80) }\n }\n\n // A pillar\'s `at` is its TOP-LEFT corner \u2014 to centre a column on a grid node,\n // subtract half its width (perimeter columns also inset by pilInset).\n pillar C1 at (main.x1 + pilInset - pillarW/2, main.yA + pilInset - pillarW/2) size (pillarW, pillarW) height 116\n pillar C2 at (main.x3 - pillarW/2, main.yA + pilInset - pillarW/2) size (pillarW, pillarW) height 116\n }\n\n // --- Loft floor: the hip roof (first-class \u2014 nested segments/slope/trusses) ---\n floor 2 "Loft Floor" {\n roof name "Hip Roof" pitched endpoint closed slope height 100 overhang 25 {\n segment "seg0" from (210, 0) to (210, 470) width 420 hip_setback (90, 90)\n truss "seg0" fink at (95, 235, 375)\n }\n }\n}\n',
|
|
417367
|
-
"complete": '// Coverage showcase \u2014 every model entity as FIRST-CLASS syntax, no `raw`:\n// layers, a component library (definition + `use` instance), ground, plinth,\n// slab, beam, room (with openings + an anchored item), a free-standing wall,\n// a kitchen platform, free furniture (item), a pillar, and a gable roof that is\n// `enabled`-gated by the configurator variable. If it compiles + validates,\n// the DSL covers the whole model.\nhouse CompleteShowcase {\n convention center\n units feet_inches per_unit 10\n\n site { plot (400, 500) ref (0, 0) }\n defaults { floor_height 116 wall_height 108 slab_thickness 8 wall_thickness 8 } // floor_height = wall_height + slab_thickness (C4)\n\n var wallT = 8\n var roof_style = 2 // 2 = Gable (drives the enabled gate below)\n point House { x = 300, y = 400 }\n\n // Per-house display layers (registry).\n layer "structure" "Structure" group "Frame"\n layer "furniture" "Furniture" color "#8B5A2B"\n\n // Reusable component: a low RCC bench, authored in local coords.\n component Bench {\n param blen = 60 label "Bench length"\n param bdep = 18\n beam name "BenchTop" at (0, 0) size (blen, bdep) height 6 layer "structure"\n }\n\n configurator {\n slider wallT "Wall thickness" in [6 .. 12 step 1]\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n }\n\n grid main {\n x: 1 @ wallT / 2, 2 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L - wallT / 2\n }\n\n floor 0 "Plinth" height 40 { // floor height == plinth height (C1)\n ground name "Ground" at (0, 0) size (400, 500) layer "ground"\n plinth name "Plinth"\n at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA)\n height 40 layer "plinth"\n }\n\n floor 1 "Ground Floor" {\n slab at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA)\n\n // A tie beam across the rear span.\n beam name "Tie" at (main.x1, main.yB - 8) size (main.x2 - main.x1, 8) height 8 layer "structure"\n\n // Living room with a door, a window, and a bed anchored to a corner.\n room Living at (main.x1, main.yA) size (main.x2 - main.x1, main.yB - main.yA) {\n wall east west // plain walls \u2014 several in one line\n wall south { door Main at 120 size (36, 84) } // walls with openings: one side each\n wall north { window N1 at 100 size (60, 50) sill 35 }\n item asset { id "bed_double" src "furniture/bed_double.glb" dims (1.5, 0.5, 2.0) category "bedroom" }\n anchor bottom-right gap (12, 12) rotation 0\n }\n\n // A free-standing partition wall.\n wall Partition from (main.x1 + 100, main.yA) to (main.x1 + 100, main.yB - 150)\n height 108 facing east layer "structure"\n\n // An L-shaped kitchen counter (polyline path).\n kitchen name "Counter" path ((40, 40), (140, 40), (140, 120)) side right depth 24 height 36 layer "structure"\n\n // Free furniture placed by absolute plan coordinates.\n item name "Sofa" asset { id "sofa" src "furniture/sofa.glb" dims (1.9, 0.8, 0.9) category "living" }\n at (150, 300) rotation 90 scale 1 layer "furniture"\n\n // A corner column, and a stamped Bench component (param overridden).\n pillar C1 at (main.x1, main.yA) size (10, 10) height 116 layer "structure"\n use Bench as "WindowBench" at (60, 60) with { blen = 80 }\n }\n\n floor 2 "Loft" {\n // Gable roof (open endpoints), gated so it renders only when roof_style == 2.\n roof name "Gable Roof" pitched endpoint open slope angle 30 overhang 20\n enabled 1 - min(1, abs(roof_style - 2)) layer "roof" {\n segment "seg0" from (150, 0) to (150, 400) width 300 gable_overhang (20, 20) tie_beams 2\n truss "seg0" fink at (80, 200, 320)\n }\n }\n}\n'
|
|
417368
|
-
};
|
|
417369
|
-
var DOCS = {
|
|
417370
|
-
"guide": {
|
|
417371
|
-
"title": "How to author a Wadi house (the workflow)",
|
|
417372
|
-
"body": '# Wadi architect \u2014 author `.wdl` house designs with a live 3D preview\n\nYou are the architect/editor. The user describes a house (in words, or with a\nsketch/photo); you write or update its **`.wdl`** file (the Wadi DSL), and the **Wadi\napp\'s DSL editor renders the model live** from that same file. The user watches and\nsteers with follow-up messages \u2014 and can edit the `.wdl` alongside you.\n\nYou author in the **Wadi DSL** (`.wdl`), not raw JSON. It\'s more direct (formulas,\ngrids, and the configurator are one-liners), the grammar enforces structure, and the\ncompiler reports parse errors with `line:col`. The DSL is **complete** \u2014 every object\ntype has first-class syntax \u2014 so it can express any house the model can hold.\n**`reference/dsl.md` is your syntax reference; read it first.**\n\n**The `.wdl` IS the design \u2014 do not produce a `.wadi`.** The Wadi app\'s DSL previewer\ncompiles + renders the `.wdl` live (in-app), so a single `.wdl` file on disk is the\n**shared source you and the human co-edit**. You never convert it to JSON; you just\nauthor the `.wdl` and verify it with `check.sh`.\n\nThis skill is **agent-neutral** \u2014 it is plain instructions + reference docs + scripts,\nusable by any coding agent (Claude Code, Google Antigravity, \u2026). Agent-specific\nentrypoints live outside this folder (e.g. `.claude/skills/wadi-architect/` for Claude\nCode, `AGENTS.md` at the repo root); they just point here.\n\n## What you need to run this\n\n- **Read/write files** and **run shell + Node** (the only capabilities assumed).\n- The **Wadi repo checked out**, with deps installed once:\n `npm --prefix editor install` and `npm --prefix wadi-dsl install` (the latter also\n regenerates the DSL parser via its `prepare` hook). The `check` and `preview` scripts\n reuse the app\'s own TypeScript, so they flag exactly what the app would.\n- For the *live* render: the **Wadi app\'s DSL editor** open on the `.wdl` you edit \u2014\n desktop **\u2318\u21E7D \u2192 Open**, or the browser playground at `wadi.house/dsl`. It compiles +\n renders the `.wdl` live. Without it you can still author + `check` + render preview\n images yourself.\n\n## The live loop (read this first, every session)\n\nThe **`.wdl` file is the single shared source.** You edit it; the Wadi app\'s DSL editor\n\u2014 open on that same file \u2014 compiles and re-renders it live; the human can edit it too (in\nthe DSL editor, in their own editor, or by asking you). **You never produce or touch a\n`.wadi`** \u2014 the app does the `.wdl` \u2192 render conversion.\n\n**Starting a NEW model:**\n1. Write a starter `house.wdl` (copy the shape from `../../wadi-dsl/examples/` \u2014 start\n from `minimal.wdl`, or `coastal.wdl` for a full cottage) at a path the user wants,\n e.g. `~/Documents/<name>.wdl`.\n2. Tell the user to open it in the **Wadi DSL editor** (**\u2318\u21E7D \u2192 Open** in the desktop\n app) so it renders live and watches the file.\n3. Build the house by editing `house.wdl`. Run `check.sh` after each change to confirm it\n still compiles + validates; the editor re-renders as the file changes.\n\n**Editing an EXISTING model:** edit its `.wdl`. Because it\'s a **co-edited** file, **read\nit first** (the human may have changed it since your last edit) and make a **minimal\npatch** \u2014 change only the lines you need and preserve the rest verbatim, so your edit\nmerges cleanly with theirs.\n\n**Always:**\n- **Tell the user which `.wdl` you are editing**, and edit only that path.\n- **Run `check.sh` after every edit.** It runs the DSL compiler + validator against a\n **throwaway temp** (it does NOT create a `.wadi`) purely for feedback \u2014 fix any\n reported error before telling the user anything changed. A broken `.wdl` just makes the\n editor show a diagnostic and keep the last good render; it never corrupts anything.\n\n## Two ways users work with you\n\n- **Brief \u2192 house.** They describe requirements ("3-bed L-shaped bungalow, ~1500 sq\n ft, hip roof"). You *derive* the base config. Keep a running **design brief** as the\n source of truth so later changes re-derive cleanly \u2014 see `prompts/design-brief.md`.\n This is Wadi\'s "higher-level language": the brief is the intent, the config is the\n derived artifact, you are the compiler.\n- **Drawings \u2192 house (recreate an existing design).** **Do NOT try to read dimensions\n off an architect\'s drawing yourself \u2014 it\'s unreliable and produces the wrong house.**\n Instead run a **guided dialog**: the USER reads their drawing and describes each\n piece in plain terms (names, sizes in feet, where things sit), and YOU do all the\n coordinate / scale / convention work, building **one room at a time** and rendering\n after each so they confirm. Ask **spatially** ("how big? which corner? next to\n what?"), never for coordinates. Never build the whole plan from one answer. Full\n method in `prompts/sketch-to-config.md`.\n- **Iterate.** They react to the live model ("make Bedroom 2 bigger", "add a north\n window"). Apply a **minimal patch** \u2014 see `prompts/update-existing.md`.\n\n## The data model & references (read lazily \u2014 don\'t dump them all up front)\n\n- **`reference/dsl.md`** \u2014 **your primary reference: the complete `.wdl` SYNTAX** \u2014\n the skeleton, the parametric core (var/point/grid/configurator/formulas), the common\n attribute tail (`enabled`/`z_offset`/`layer`/`material`), and the first-class syntax\n for every object type (rooms/walls/openings, slab/beam/plinth/ground/pillar,\n staircase/kitchen/item, roof, components, layers) plus the `raw` escape. Read this\n first, then the semantics references below.\n- **`reference/data-model.md`** \u2014 the underlying **`.wadi` schema** the DSL compiles to:\n every object type, field, type, requiredness, units, semantics. **Generated from the\n Zod schema** (`editor/src/schema/houseConfig.ts`) so it can\'t drift \u2014 regenerate with\n `scripts/gen-schema-doc.mjs` after any schema change. It\'s the field reference for the\n `raw` escape and for understanding exactly what your `.wdl` produces.\n- **`reference/coordinate-system.md`** \u2014 the #1 source of mistakes. X\u2192right, **Y\u2192DOWN**\n (Inkscape frame, not Y-up), Z\u2192up. Units: **10 project units = 1 ft** by default. Read\n before placing anything.\n- **`reference/roof-v2-guide.md`** \u2014 the unified `roof` object (segments, hip vs gable,\n joints, trusses, shed). Its fields are freeform in the schema (validated at\n derivation), so this guide is the field reference for roofs. Read before touching a\n roof.\n- **`reference/conventions.md`** \u2014 the **structural coding conventions** every house\n must follow (plinth-floor height must match the plinth block, rooms must wall every\n exterior side, a floor with no slab must set `slab_thickness 0`, \u2026). These are\n *enforced* by `check.sh` \u2014 errors fail, warnings are advisory \u2014 and shown in the DSL\n editor\'s status. Read it so you author sound houses the first time.\n- **`reference/parametric-conventions.md`** \u2014 how to build a **fully-parametric** model\n (a reusable template that stays valid under any knob change): the **grid-first**\n recipe \u2014 variables (knobs) \u2192 named grid lines (formulas of the house size) \u2192 rooms &\n columns that reference those lines \u2014 plus `coord_convention:center`, proportional grid\n lines with minimums, the `pilInset` flush-column rule, opening placement, and the\n scale-sweep verification. Read before authoring or editing a parametric template.\n- **`../../wadi-dsl/examples/*.wdl`** \u2014 correct, validated `.wdl` houses to copy shapes\n from (every one passes the compile \u2192 resolve \u2192 schema+geometry pipeline in the DSL\'s\n test suite, so **copy from these, not from memory**): `minimal.wdl` (smallest house),\n `two_room.wdl` (no grid), `two_story.wdl` (multi-floor + hip roof), `coastal.wdl`\n (grid + configurator + full cottage), `complete.wdl` (every entity \u2014 beam, wall,\n kitchen, item, component, gable roof, layers). `examples/coastal_konkan.wadi` in this\n folder is a resolved `.wadi` for reference on the compiled output shape.\n\n## Check after every edit (get compiler feedback \u2014 no `.wadi` produced)\n\n`check.sh` runs the DSL end-to-end for **feedback only**: it parses the `.wdl` (reporting\nparse errors with `line:col`), resolves formulas/grids into numbers, and runs the real\nschema + roof/wall geometry validator (catches zero-length roof segments, missing slope,\nbad openings that the schema alone misses), and finally the **structural conventions**\nlinter (`reference/conventions.md`: floating floors, open exterior walls, no-slab floors)\n\u2014 all against a **throwaway temp** that is deleted. It never writes a `.wadi`; the app\'s\nDSL previewer does the real conversion.\n\nConvention **errors** (`\u2716 [C\u2026]`) fail the check \u2014 fix them. Convention **warnings**\n(`\u26A0 [C\u2026]`) are printed but don\'t fail; fix them, or keep them if the open side is a\ndeliberate verandah.\n\n```bash\nwadi-skill/architect/scripts/check.sh "<ABS>.wdl"\n```\n\nExit 0 = compiles + valid. Non-zero prints the exact `parse: \u2026` or `/path: message`\nerror \u2014 fix the `.wdl` and re-run before telling the user anything is ready.\n\n**If you have the `wadi_*` MCP tools** (from the `wadi-mcp` server) instead of a repo\ncheckout, use them \u2014 they\'re the same pipeline, no clone needed: `wadi_check(wdl)` for\nthis step, `wadi_preview(wdl)` for the images below, and `wadi_examples` / `wadi_reference`\nfor the examples and these docs.\n\n## See your work (don\'t author blind)\n\nYou can\'t see the app\'s live render, but you CAN render your `.wdl` to images and **read\nthem** to check your own edit \u2014 layout, sizes, openings, and roof are exactly where\nmistakes happen. `preview.sh` takes the `.wdl` directly (it compiles to a throwaway temp\njust for rendering \u2014 again, no persistent `.wadi`):\n\n```bash\nwadi-skill/architect/scripts/preview.sh "<ABS>.wdl"\n```\n\nIt writes (and prints paths to) `plans.png` (floor plans \u2014 room layout + sizes),\n`elevations.png` (front/back/left/right \u2014 heights + **roof profile**, the 2D view of the\nbuilt 3D model), and `roof.png` (roof top view), plus all SVGs under `.../2d/`. **Read\nthe PNGs** after a non-trivial edit and confirm what you built matches the request (rooms\nin the right place, not overlapping, correct sizes in feet, roof over the plinth). **If\nit doesn\'t match, fix the `.wdl` and re-render \u2014 repeat until it looks right, and only\nthen tell the user it\'s ready.** It reuses the app\'s own generators, so it matches the\napp\'s 2D tabs byte-for-byte. See `prompts/verify-visually.md`.\n\n## Top pitfalls (memorize)\n\n- **Y is DOWN.** A room "to the north" has a *smaller* Y. Never treat Y as up.\n- **Dimensions are project units, not feet.** `width: 120` is 12 ft. Multiply feet by\n 10 (the default; `units.per_unit` can change it).\n- **Set `"coord_convention": "center"`.** Then a room\'s `x,y,width,length` are wall\n **CENTRELINES**, and **two rooms that share a wall just ABUT on the shared line** \u2014 room\n A spans X `[0,150]`, room B `[150,300]`; the wall is centred on `150` and shared. No\n overlap, no `wall_thickness` math (the system grows to the outer face at render). On a\n grid, a room is simply `x:"= main.x1", width:"= main.x2 - main.x1"`. (Legacy files\n without the flag use the OUTER convention where adjacent rooms must overlap by\n `wall_thickness`.) See `coordinate-system.md` \u2192 "the centreline convention".\n- **The roof footprint must cover the plinth footprint.** Roof segment widths and\n positions come from the walls they sit on, not arbitrary numbers.\n- **The roof lives on its OWN top floor** (`floor_number` ABOVE the floors it covers,\n containing only the roof), and you **never set its Z** \u2014 the base height is computed\n from the plinth height + the `height`s of the floors below it. To move the roof\n up/down, change floor heights, not the roof. (See `reference/roof-v2-guide.md`.)\n- **Floors stack; `floor_number` is 0-based** (the plinth floor = 0). Heights are\n independent per floor (`height`, `wall_height`, `slab_thickness` are unrelated\n fields) \u2014 *except* where the **structural conventions** require a match: the\n plinth-floor `height` must equal the plinth block height, and a floor with no slab\n must set `slab_thickness 0`, or the floors above float. See `reference/conventions.md`.\n- **A partial `wall` list makes a room a whitelist.** A bare room (no `wall` lines) is\n enclosed on all four sides; add one `wall` line and every side you don\'t list becomes a\n hole. Wall every **exterior** side (convention C2). List plain sides compactly:\n `wall east west`, then the opening sides separately.\n- **Minimal patches.** Preserve unchanged `.wdl` lines verbatim so the user (and diffs)\n can see exactly what moved.\n- **Formulas are bare expressions in the DSL** \u2014 write `at (main.x1, main.yA)`, not\n `"= main.x1"`; the compiler emits the `= \u2026` form. Quote only `name "\u2026"` strings;\n `room`/`pillar`/`var`/grid-line names are bare identifiers.\n- **Errors are caught by `check.sh`.** A parse error (bad syntax) or a `.strict()` schema\n error (unknown/misspelled key inside a `raw` block) fails `check.sh` with the exact\n location \u2014 and the app\'s DSL editor shows the same squiggle live; nothing reaches the\n model silently.\n'
|
|
417373
|
-
},
|
|
417374
|
-
"dsl": {
|
|
417375
|
-
"title": "The Wadi DSL (.wdl) \u2014 syntax reference",
|
|
417376
|
-
"body": '# The Wadi DSL (`.wdl`) \u2014 authoring reference\n\nYou author houses in the **Wadi DSL** \u2014 a small, formal language (`.wdl`) that\ncompiles to a resolved `.wadi` (`house_config.json`). The DSL is **complete**:\nevery object type in the model has first-class syntax, so you rarely need the\n`raw` escape. Authoring the DSL is more direct and less error-prone than writing\nJSON \u2014 the grammar enforces structure, and `check.sh` reports parse errors with\nline:col.\n\n**This file is the SYNTAX reference.** The *semantics* live in the other\nreferences and apply unchanged \u2014 read them:\n\n- `coordinate-system.md` \u2014 X\u2192right, **Y\u2192DOWN**, Z\u2192up; **10 units = 1 ft**;\n the **centreline** convention. The #1 source of mistakes.\n- `conventions.md` \u2014 the **structural coding conventions** (`check.sh` enforces\n them): plinth-floor height must match the plinth block, rooms must wall every\n exterior side, a no-slab floor must set `slab_thickness 0`.\n- `parametric-conventions.md` \u2014 the grid-first recipe for reusable templates.\n- `roof-v2-guide.md` \u2014 roof segments, hip vs gable, trusses, joints.\n- `data-model.md` \u2014 the underlying `.wadi` schema (what the DSL compiles to; also\n the field reference for the `raw` escape).\n\n## The loop\n\n1. Write / edit `house.wdl` \u2014 the **single shared source** (you and the human\n co-edit it; the app\'s DSL previewer renders it live). You never produce a `.wadi`.\n2. `wadi-skill/architect/scripts/check.sh house.wdl` \u2014 runs the DSL compiler +\n validator (schema + wall/roof geometry) against a **throwaway temp** just for\n feedback; fix any reported error and re-run.\n3. `preview.sh house.wdl` \u2192 read the PNGs (plans / elevations / roof) to check your\n work. (It also compiles to a throwaway temp \u2014 no persistent `.wadi`.)\n\n## Skeleton\n\n```wdl\nhouse MyHouse {\n convention center // ALWAYS use center (wall-centreline coords)\n units feet_inches per_unit 10 // 10 project units = 1 ft\n site { plot (WIDTH, LENGTH) ref (0, 0) }\n defaults { floor_height 120 wall_height 108 slab_thickness 8 wall_thickness 8 }\n\n // parametric core (optional): var, point, grid, configurator\n // component / layer declarations (optional)\n floor 0 "Plinth" { \u2026 } // floors stack in source order (0 = plinth)\n floor 1 "Ground Floor" { \u2026 }\n floor 2 "Loft" { roof \u2026 } // roof lives ALONE on its own top floor\n}\n```\n\nNumbers are **project units** (feet \xD7 10 by default). Names after `house`,\n`room`, `pillar`, `var`, `point`, `grid`, and `use`/`component` are bare\nidentifiers (no spaces); names introduced with the `name` keyword are quoted\nstrings.\n\n## Parametric core (domain-neutral)\n\n```wdl\nvar wallT = 8 // a knob; may reference other vars\nvar pilInset = (pillarW - wallT) / 2\n\npoint House { x = 420, y = 470 } // reference as House.x / House.W / House.L\n // (.W = x, .L = y \u2014 a point doubles as a size)\n\ngrid main { // named wall centrelines; publishes main.x1 / main.yA\n x: 1 @ wallT / 2, 2 @ House.W / 2, 3 @ House.W - wallT / 2\n y: A @ wallT / 2, B @ House.L / 2, C @ House.L - wallT / 2\n}\n// each line may add: \u2026 @ <expr> thick <expr> role structural|planning\n\nconfigurator { // the knobs a downstream user turns\n slider pillarW "Column size" ft [8 .. 14 step 1]\n number ceiling "Ceiling height" ft\n toggle has_loft "Add a loft"\n select roof_style "Roof style" { Flat = 0, Shed = 1, Gable = 2, Hip = 3 }\n}\n```\n\n**Formulas are automatic.** Any geometry number can be a formula \u2014 just write the\nexpression instead of a literal (`at (main.x1, main.yA)`, `size (House.W/2, 200)`).\nOperators: `+ - * /`, unary `-`, parentheses, and the functions\n`min max clamp round floor ceil abs`. References: a `var`, a `point`\n(`House.W`), or a grid line (`main.x3 - main.x1`). No comparison operators \u2014 gate\nthings with the `min/abs` idiom (see `enabled` below).\n\n## Common attribute tail (every object)\n\nAfter an object\'s geometry, in THIS order, any of:\n\n```\n\u2026 z_offset <expr> enabled <expr> layer "id" [material "id"]\n```\n\n- `enabled <expr>` \u2014 the on/off switch. A `0`/`false` value hides the object. To\n gate on a configurator variable, use a 0/1 formula:\n `enabled 1 - min(1, abs(roof_style - 3))` renders the object only when\n `roof_style == 3`. (This is how one template carries several roofs and shows\n only the chosen one.)\n- `z_offset <expr>` \u2014 lift above the floor base (split levels).\n- `material "id"` \u2014 only on plinth / ground / room / wall / staircase / kitchen /\n roof.\n\n## Objects \u2014 structure & envelope\n\n```wdl\nslab [name "N"] at (x,y) size (w,l) [thickness <t>] // floor_slab\nbeam [name "N"] at (x,y) size (w,l) [height <h>]\nplinth [name "N"] at (x,y) size (w,l) height <h> // raised base (Plinth floor)\nground [name "N"] at (x,y) size (w,l) [height <h>] // terrain plane\npillar Name at (x,y) size (w,l) [height <h>] // (x,y) = TOP-LEFT corner\n```\n\n`at (x,y)` is the **TOP-LEFT CORNER** \u2014 **not the centre** \u2014 for every one of these\n(same as rooms/slabs/beams); `size (w,l)` is width \xD7 length. All accept the common tail.\n\n**Pillars catch people out here.** A column reads as "placed at a point," but `at` is\nstill its corner. To **centre a column on a point** `(cx, cy)` \u2014 a grid node, a room\ncorner \u2014 place it at **`at (cx - w/2, cy - l/2)`**, never at `(cx, cy)`. On a grid, the\n`pilInset` idiom (see `parametric-conventions.md`) does exactly this so columns sit flush.\n\n## Objects \u2014 rooms, walls & openings\n\nA room shows exactly the walls you declare. A **bare room (no `wall` lines) is\nenclosed on all four sides.** List plain walls compactly; give a wall its own line\nonly when it carries a door/window; omit a side to leave it open (verandah).\n\n```wdl\nroom Name at (x,y) size (w,l) [height <h>] [material "\u2026"] {\n wall east west north // plain walls \u2014 several in one statement\n wall south { door Main at <offset> size (w,h) [open] } // wall WITH openings: one side\n wall west { window W at <offset> size (w,h) [sill <s>] [open] }\n item asset { \u2026 } anchor center [gap (gx,gy)] // furniture anchored inside the room\n}\n```\n\n- `wall <side>\u2026` sides are `north|south|east|west`. A `wall <side>` line may also\n add `height <h>` / `height_end <h>` (sloped).\n- `door`/`window` `at <offset>` is measured along the wall from its start;\n `size (width, height)`; `window \u2026 sill <s>` sets the sill height; `open` = a bare\n hole (no leaf/glazing).\n\nA **free-standing wall** (not a room side):\n\n```wdl\nwall Name from (x1,y1) to (x2,y2) [height <h>] [height_end <h>] [facing north|\u2026] {\n \u2026 door/window openings \u2026\n}\n```\n\n- `from`/`to` are the wall\'s **centreline** endpoints; the wall is drawn as a rectangle\n `wall_thickness` wide, centred on that line.\n- **Overlap walls at corners \u2014 they do NOT auto-mitre.** Two free-standing walls that\n merely *touch* at a shared endpoint leave an unfilled square notch (\xBD\xB7`wall_thickness`)\n at the corner, because each is just a rectangle capped at its endpoint. To fill the\n corner, **extend the endpoints so the wall bodies OVERLAP** \u2014 run at least one wall\'s\n end **half the wall thickness past** the shared point (overlapping by the full thickness\n is fine and simplest). For an L of thickness 8 meeting at `(160,40)`:\n\n ```wdl\n wall H from (40, 40) to (164, 40) height 108 // ends 4 (\xBD\xB78) PAST the corner\n wall V from (160, 40) to (160, 160) height 108 // butts into H\'s overlapped body\n ```\n\n (Room walls handle their own corners; this only applies to `wall \u2026 from \u2026 to \u2026`.)\n\n## Objects \u2014 circulation & fittings\n\n```wdl\nstaircase [name "N"] at (start_x, start_y) step (rise, tread, width)\n direction north|south|east|west\n [total_height <h>] [max_run <r>] [landing_depth <d>]\n [landing_thickness <t>] [turn clockwise|anticlockwise] [flight_gap <g>]\n\nkitchen [name "N"] path ((x,y), (x,y), \u2026) side left|right\n depth <d> height <h> [base_z <z>] // path points are literal numbers\n```\n\n**Staircases are TOP-anchored \u2014 this is the #1 mistake.** You put a staircase on the\n**UPPER** floor and it **DESCENDS** to the floor below:\n\n- `at (x,y)` is the **TOP** of the stair (where it meets the floor it\'s declared on).\n- `direction` is the **descent** direction (the way it travels going *down*).\n- `total_height` is the **drop** to the floor below (omit \u2192 the floor-below\'s height).\n- `max_run` caps a flight\'s run; exceed it and the stair auto-splits into switchback\n flights with turn landings (`landing_depth`/`turn`/`flight_gap` tune the switchback).\n\nSo a stair connecting the ground floor **up** to the first floor lives on the **First\nFloor**, descending to the ground:\n\n```wdl\nfloor 2 "First Floor" height 116 {\n slab at (\u2026) size (\u2026)\n staircase name "Stair" at (212, 64) step (7, 11, 44) // top = this floor, at the landing\n direction south total_height 116 // descends south to the floor below\n}\n```\n\nPut it on the *lower* floor (thinking of it as "climbing up") and it descends the wrong way\n\u2014 **below ground** \u2014 where it draws in 2D plans but is buried/invisible in 3D. `check.sh`\ncatches that (convention **C5**), but author it top-anchored from the start.\n\nitem [name "N"] asset { id "sofa" src "furniture/sofa.glb" dims (w,h,d) [category "\u2026"] }\n at (x,y) [rotation <deg>] [scale <s>]\n [anchor_to "RoomName" anchor center gap (gx,gy)]\n```\n\nFurniture `dims` are the real-world size in **metres** `(width, height, depth)`;\n`src` is a GLB URL (bundled ids resolve at `furniture/<id>.glb` \u2014 e.g. `sofa`,\n`bed_double`, `dining_table`; an unreachable GLB shows a placeholder box, never a\nblank). `anchor` is one of `top-left top-center top-right center-left center\ncenter-right bottom-left bottom-center bottom-right`.\n\n## Objects \u2014 roof (one object; flat / shed / gable / hip)\n\nThe roof lives ALONE on its own top floor and you never set its Z (see\n`roof-v2-guide.md`). `endpoint`: `closed` = hip triangle, `open` = gable end-wall.\n\n```wdl\nroof [name "N"] pitched|shed|flat\n [endpoint open|closed]\n [slope angle <deg> | slope height <ridge_h>]\n [overhang <o>] [slab_thickness <t>] [parapet <h> x <t>] [gable_wall_thickness <t>] {\n segment "id" from (x,y) to (x,y) width <w>\n [high_side left|right] // shed only\n [start_endpoint open|closed] [end_endpoint open|closed]\n [hip_setback (a,b)] [gable_overhang (a,b)] [hip_ridge_extension (a,b)]\n [overhang <o>] // uniform eave, all four sides\n [overhang_start <o>] [overhang_end <o>] // per-side along the axis (shed;\n // on a gable end = gable_overhang)\n [overhang_low <o>] [overhang_high <o>] // SHED eaves (down-slope / up-slope)\n [overhang_left <o>] [overhang_right <o>] // PITCHED eaves (left / right of ridge)\n [tie_beams N]\n truss "segId" fink|mono_pitch at (pos, pos, \u2026)\n }\n```\n\nSegment `from`/`to`/`width` and the `hip_setback`/\u2026 values accept formulas, so a\nroof scales with the plot (e.g. `width House.W`, `hip_setback (Verandah.L, Padvi.L)`).\n\n**Per-side overhang (cantilever one edge).** `overhang <o>` sets a uniform eave on\nall four sides. Any sloping roof can override a side independently \u2014 each defaults to\n`overhang`. **Along the axis:** `overhang_start` / `overhang_end` (on a shed, or a\ngable open end \u2014 there they\'re the same as `gable_overhang`; a hip end is geometric,\ntuned via `hip_setback`). **Eaves:** `overhang_low` / `overhang_high` on a **shed**\n(down-slope / up-slope); `overhang_left` / `overhang_right` on a **pitched** roof\n(the two eaves either side of the ridge). A bigger eave overhang also drops that\neave\'s edge along the same pitch, so the slope stays planar. (Per-eave on a *pitched*\nroof is single-segment only \u2014 on a multi-segment roof the eaves share one height so\njoints line up.)\nIdiom: keep the roof FOOTPRINT (its supported edges) on the main room, then cantilever\none eave to cover an entry landing / stair \u2014 end the axis on the room wall and set a big\n`overhang_end`:\n```wdl\n// footprint ends on the main room\'s east wall (x204 centreline \u2192 x208 outer);\n// the east eave reaches 258, covering a landing that sticks out to x256.\nsegment "seg0" from (4,124) to (204,124) width 240 high_side right overhang 25 overhang_end 50\n```\n\n**Roof coordinates are wall centrelines (under `convention center`), same as\nrooms.** `from`/`to` is the segment\'s ridge/axis and `width` its span *centred on\nthat axis*. Author them on the **same centreline grid as the walls** \u2014 a segment\nwhose axis + width match the rooms\' centrelines auto-grows to the **outer wall\nface** on every side (the compiler extends the axis by \xBD\xB7wall_thickness at each end\nand widens by wall_thickness, exactly the grow a room gets). `overhang` then\nextends *beyond* the outer face. So to cover a footprint spanning wall centrelines\n`x1..x2` (E\u2013W) and `yA..yB` (N\u2013S), write `from (x1, (yA+yB)/2) to (x2, (yA+yB)/2)\nwidth (yB - yA)` \u2014 do **not** add \xBD-wall fudge factors; the convention handles it.\n(Before this, a roof drawn on the grid sat half a wall-thickness *inside* the walls.)\n\n## Components & layers\n\n```wdl\ncomponent Bench { // a reusable mini-house in LOCAL coords (origin 0,0)\n param blen = 60 label "Bench length"\n beam name "Top" at (0,0) size (blen, 18) height 6\n}\nuse Bench as "B1" at (x,y) with { blen = 80 } // stamp it onto a floor\n\nlayer "structure" "Structure" [color "#rrggbb"] [group "Frame"] // per-house layer registry\n```\n\n## The `raw` escape (rarely needed)\n\nAnything the first-class syntax doesn\'t cover can be written as literal JSON per\nthe `.wadi` schema (`data-model.md`):\n\n```wdl\nraw "type" { "field": 1, "formulas": { "field": "= expr" } }\n```\n\n## DSL-specific pitfalls\n\n- **`convention center` and `units \u2026 per_unit 10`** belong at the top of every\n `house` \u2014 same as the JSON path. All the `coordinate-system.md` rules (Y-down,\n units, centreline abutment) apply identically; the DSL just writes them shorter.\n- **Formulas are bare expressions**, not `"= \u2026"` strings \u2014 the compiler emits the\n `= \u2026` form for you. Write `at (main.x1, main.yA)`, not `at ("= main.x1", \u2026)`.\n- **`name "\u2026"` is quoted; `room`/`pillar`/`var`/grid-line names are bare** ids\n (no spaces, and not a reserved word like `width`, `height`, `size`, `at`).\n- **Roof alone on the top floor**; segment widths/positions come from the walls\n they sit on. See `roof-v2-guide.md`.\n- **A pillar\'s `at` is its TOP-LEFT corner, not its centre.** To centre a column on\n `(cx,cy)`, author `at (cx - w/2, cy - l/2)`.\n- **Free-standing walls don\'t auto-mitre at corners** \u2014 extend endpoints so the wall\n bodies overlap (\u2265 \xBD\xB7`wall_thickness` past the shared point), or the corner is left\n as a gap.\n- **Staircases are top-anchored** \u2014 put them on the UPPER floor; they descend to the\n floor below (`check.sh` C5 flags one that lands below ground). See the staircase note.\n- **Structural conventions are enforced** \u2014 `check.sh` fails on floating floors\n (plinth-floor `height` \u2260 plinth block height; a no-slab floor with nonzero\n `slab_thickness`) and warns on exterior room sides left open. See\n `conventions.md`; the DSL editor shows the same findings in its status pill.\n- Compile after **every** edit; a parse error means the `.wadi` wasn\'t updated, so\n the live model just won\'t change \u2014 never silently wrong.\n'
|
|
417377
|
-
},
|
|
417378
|
-
"conventions": {
|
|
417379
|
-
"title": "Structural coding conventions (C1/C2/C3\u2026)",
|
|
417380
|
-
"body": '# Wadi structural conventions (coding guidelines)\n\nA house can be **well-formed but structurally unsound**: it passes the schema and\nthe wall/roof geometry check, yet the building would not stand up \u2014 a floor floats\nin mid-air, a room is open to the weather, walls hover above a phantom slab. These\nare the *coding conventions* every Wadi house must follow.\n\nThey are **formally defined here** and **enforced in code** by the structural\nlinter (`editor/src/lint/structural.ts`), which runs automatically:\n\n- in **`check.sh`** (and `validate.mjs`) \u2014 **errors fail** the check, **warnings**\n are printed but advisory;\n- in the **DSL editor** \u2014 the status pill shows the count and lists every finding\n in its hover tooltip, while still rendering the model so you can *see* the\n unsound part.\n\nEach finding carries its convention id (`C1`, `C2`, \u2026) so this document and the\nlinter stay in lockstep. Add a rule by adding a check to `lintStructure` **and** a\nsection here with the next id.\n\n---\n\n## The vertical model (why C1 and C3 exist)\n\nFloors stack in source order (floor 0 = the Plinth floor). The renderer places\nthem like this (`editor/src/three/coords.ts`):\n\n- **A floor\'s base elevation = the running sum of the previous floors\' `height`\n only.** `wall_height` and `slab_thickness` do **not** raise the next floor.\n- The **plinth block** is drawn to its *own* `height`. So the floor above sits at\n `plinth-floor.height`, while the plinth top is at `plinth.height` \u2014 they must be\n equal or the floor above floats/sinks by the difference. \u2192 **C1**\n- **`slab_thickness` lifts a floor\'s walls within its band** (`wallZ = base +\n slab_thickness`) \u2014 it is the deck the walls stand on. With no slab object there\n is no deck, so the walls float by that amount. \u2192 **C3**\n\n`height`, `wall_height`, and `slab_thickness` are otherwise **independent** \u2014 the\nmodel enforces no relationship between them. These conventions add the few\nrelationships that structural soundness *does* require.\n\n---\n\n## C1 \u2014 The plinth floor\'s height must match the plinth block height \xB7 **error**\n\n**Statement.** A floor that carries a `plinth` object (the Plinth floor) must set\nan explicit `height`, and that height must equal the plinth block\'s `height`.\n\n**Rationale.** The floor above is stacked at `plinth-floor.height`; the plinth\nblock rises to `plinth.height`. If they differ, the floor above floats above the\nplinth (`floor.height > plinth.height`) or sinks into it (`<`). If the floor\n`height` is omitted it silently defaults to `100`, almost never the plinth height.\n\n**Fix.**\n\n```wdl\nfloor 0 "Plinth" height 40 { // == the plinth block height below\n ground name "Ground" at (0,0) size (500,500)\n plinth name "Plinth" at (\u2026) size (\u2026) height 40\n}\n```\n\n(If the plinth block omits its own `height`, it follows the floor height and is\nconsistent by construction \u2014 but set the floor `height` explicitly anyway, so the\nstack is not left to the default.)\n\n---\n\n## C2 \u2014 A room must wall every exterior side \xB7 **warning**\n\n**Statement.** A room shown with a **partial** `walls` list must still wall every\nside that faces **outside** (no room beyond it). Interior (shared) sides may be\nomitted \u2014 the neighbour\'s wall stands on the shared centreline.\n\n**Rationale.** A room shows exactly the walls it declares; a **bare room (no\n`wall` lines) is enclosed on all four sides**. But the moment you add a `wall`\nline to hang a door or window, the room switches to a *whitelist* \u2014 every side you\ndon\'t list is now a hole. An exterior hole leaves the room open to the weather.\nThis is the #1 footgun the conventions guard against.\n\nIt is a **warning**, not an error, because an open exterior side is sometimes\nintentional (a verandah / open padvi). If it is deliberate, leave it \u2014 the warning\ndocuments the choice. Otherwise, add the wall.\n\n**Fix.** List the plain exterior walls compactly alongside the opening walls:\n\n```wdl\nroom Living at (x,y) size (w,l) {\n wall east west // plain exterior sides \u2014 enclosed\n wall south { door Main at 120 size (36,84) }\n wall north { window N1 at 100 size (60,50) sill 35 }\n}\n```\n\n*(The check samples several points along each side, so a side sheltered by rooms\nabove is correctly treated as interior, not open. It also skips a side that\nalready has a wall on its line \u2014 one declared by an adjacent or overlapping room,\nor a standalone wall \u2014 so a shared exterior wall the neighbour declares is not\ndouble-flagged.)*\n\n---\n\n## C3 \u2014 A floor with no slab must set slab_thickness to 0 \xB7 **error**\n\n**Statement.** A floor that has wall/room objects but **no `floor_slab` object**\nmust set `slab_thickness 0`.\n\n**Rationale.** `slab_thickness` is the deck the floor\'s walls stand on\n(`wallZ = base + slab_thickness`). Its default is `8`. With no slab object there is\nno deck, so every wall on the floor floats `slab_thickness` units above the floor\nbase. Setting it to `0` puts the walls on the floor base; alternatively, model the\ndeck by adding a `slab`.\n\n**Fix.**\n\n```wdl\nfloor 1 "Ground" slab_thickness 0 { // no slab modelled \u2192 walls sit on the base\n room Studio at (\u2026) size (\u2026) { \u2026 }\n}\n```\n\n*(This does not fire on a floor that carries no walls/rooms \u2014 e.g. a Plinth floor\nof just `ground` + `plinth`, or a roof-only top floor \u2014 where `slab_thickness` is\nharmless.)*\n\n---\n\n## C4 \u2014 A stacked floor\'s height should equal wall_height + slab_thickness \xB7 **warning**\n\n**Statement.** A floor that carries a floor above it (and has walls/rooms) should set\n`height` = `wall_height` + `slab_thickness`.\n\n**Rationale.** The next floor sits at `base + height`; this floor\'s walls stand on the\ndeck and reach `base + slab_thickness + wall_height`. When `height` is larger, the floor\nabove leaves a gap over the walls; when smaller, the walls poke through it. (These three\nfields are otherwise independent \u2014 see the vertical model above.) It is a **warning** \u2014 a\ndeliberate gap is legitimate (a service plenum, a deep transfer beam) \u2014 but usually they\nshould match.\n\n**Fix.** Make them add up, most simply via the house defaults:\n\n```wdl\ndefaults { floor_height 116 wall_height 108 slab_thickness 8 } // 108 + 8 = 116\n```\n\n*(Skipped for the plinth floor \u2014 governed by C1 \u2014 and for the topmost floor, since nothing\nstacks on its walls.)*\n\n## C5 \u2014 A staircase must land on a floor, not below ground \xB7 **warning**\n\n**Statement.** A staircase\'s descent must not carry it below the ground plane (z < 0).\n\n**Rationale.** Staircases are **top-anchored**: you place one on the **upper** floor and it\n**descends** to the floor below (`at` is the top, `direction` is the descent, `total_height`\nis the drop). Put it on the *lower* floor (as if climbing up), or give it too large a\n`total_height`, and the expanded flight lands **below ground** \u2014 it still draws in the 2D\nplans (which ignore Z) but is **buried and invisible in 3D**, with no other error. This is\nthe one that bit a real design: a stair on the ground floor "climbing" to the first floor\nwas expanded to `z_offset: -105` and vanished from the 3D view.\n\n**Fix.** Move the staircase **up one floor** and let it descend. The stair that connects the\nground floor to the first floor lives on the **First Floor**:\n\n```wdl\nfloor 2 "First Floor" height 116 {\n slab at (\u2026) size (\u2026)\n staircase name "Stair" at (212, 64) step (7, 11, 44) // `at` = the TOP (this floor)\n direction south total_height 116 // descends to the floor below\n}\n```\n\n*(See the staircase section of `dsl.md` for the full top-anchored convention.)*\n\n## Running the checks\n\n```bash\nwadi-skill/architect/scripts/check.sh house.wdl\n```\n\n- **`\u2716 [C\u2026]`** \u2014 a structural **error**; the check exits non-zero. Fix before you\n save/share.\n- **`\u26A0 [C\u2026]`** \u2014 a structural **warning**; advisory. Fix, or keep it if the open\n side is intentional.\n\nIn the DSL editor the same findings appear in the status pill (hover for the full\nlist); the model still renders so you can see the problem.\n\n---\n\n## Planned conventions (not yet enforced)\n\nDocumented so authors know they matter; not linted yet:\n\n- **Interior partition gaps** \u2014 where two rooms share a centreline and *neither*\n declares that wall, there is no partition between them. (C2 only covers\n *exterior* sides.)\n- **Slab thickness \u2194 slab object** \u2014 when a floor *does* carry a `floor_slab`,\n its `slab_thickness` should match the slab\'s own thickness so walls sit on the\n real deck.\n- **Roof footprint coverage** \u2014 the roof segments should span the top occupied\n floor\'s footprint (no uncovered rooms).\n'
|
|
417381
|
-
},
|
|
417382
|
-
"coordinate-system": {
|
|
417383
|
-
"title": "Coordinates, units & the centreline convention",
|
|
417384
|
-
"body": '# Coordinate system & units\n\nThis is the #1 source of mistakes. Read it before placing anything.\n\n## Axes \u2014 Inkscape frame (Y is DOWN)\n\nThe config uses an **Inkscape-style 2D frame**, the same one the SVG floor plans\nuse directly:\n\n```\n origin (0,0) \u2500\u2500 X increases \u2192 (east / right)\n \u2502\n \u2502 Y increases \u2193 (south / DOWN)\n \u25BC\n```\n\n- **X** \u2192 right (east).\n- **Y** \u2192 **DOWN** (south). This is NOT the math/Blender convention. A room "to\n the **north**" of another has a **smaller** Y. Moving something "up" on the plan\n = **decreasing** Y.\n- **Z** \u2192 up (height), in the 3D model. Z isn\'t in the 2D placement fields; it\'s\n derived from `height`/floor stacking. `sill_height`, `z_offset`, `base_z`,\n `plinth.height`, wall `height` are vertical (Z) measures.\n\nEvery position field is the object\'s **top-left corner** in this frame:\n`x`/`y` (rooms, slabs, beams, pillars), `start_x`/`start_y` + `end_x`/`end_y`\n(walls, staircases), `path: [[x,y],\u2026]` (kitchen platforms), roof segment\n`start`/`end` (`[x, y]`).\n\nBecause Y points down:\n- `plinth.length` runs along **X**; `plinth.width` runs along **Y**.\n- A room\'s `width` runs along **X**; its `length` runs along **Y**.\n- A north-up architect\'s sketch has its **Y flipped** when you transcribe it: the\n top of the drawing (north) maps to small Y, the bottom (south) to large Y.\n\n## Units \u2014 10 project units = 1 foot\n\nAll lengths/coordinates are **project units**. The display/dimension convention is\n**`unit_conversion = 10` \u2192 10 units = 1 ft**. So:\n\n| The user says | Config value |\n|---|---|\n| 1 ft | 10 |\n| 12 ft (a 12-foot room) | 120 |\n| 45 ft (plot) | 450 |\n| 6 in (0.5 ft) | 5 |\n\nAlways **multiply feet by 10**. `plot_length: 450` displays as `45\'`.\n\n> Aside you don\'t need for authoring: a separate Blender path uses\n> `units_to_meters_ratio = 0.1` (1 unit = 0.1 m) for the 3D export, so the same\n> `450` is treated as 45 m in Blender. The two constants serve different pipelines;\n> for authoring the config, **only the 10-units-per-foot rule matters.**\n\n### Changing how dimensions are *labelled*\n\nThe `10-units-per-foot` rule above is only the **default label**. The optional\ntop-level `units` block changes the drawing labels **without touching geometry** \u2014\ncoordinates you write stay in project units either way:\n\n```jsonc\n"units": { "system": "meters", "per_unit": 100, "precision": 2 }\n```\n\n- `system` \u2208 `feet_inches` (default), `feet`, `meters`, `centimeters`, `millimeters`.\n- `per_unit` = project units per one display unit (the label divisor). Default `10`.\n- `precision` = decimals for the decimal systems (default `2`; `feet_inches` ignores it).\n\nSo a 120-unit wall labels as `12\'` by default, or `1.20 m` with the block above.\nNever change coordinates to switch units \u2014 only add/edit this block.\n\n### Label font sizes auto-scale (no config needed)\n\nDimension and room-label font sizes are **derived automatically** from the house\'s\nphysical span (larger of `plinth.length`/`plinth.width`), so text stays legible at\nfit-to-view whether the house is tiny or huge. There is **no font-size field** to\nset \u2014 don\'t try to add one. A house at the reference span (450 units \u2248 45 ft)\nrenders at the baseline sizes; larger/smaller houses scale proportionally (clamped\n0.6\xD7\u20136\xD7).\n\n## Rooms, walls, and the centreline convention\n\nSet **`"coord_convention": "center"`** at the top of the house (the canonical mode).\nThen a rect object\'s `x, y, width, length` are **wall CENTRELINES** \u2014 the line each\nwall is centred on, *not* the outer face.\n\n**Two rooms that share a wall simply ABUT on the shared centreline** \u2014 no overlap, no\nwall math:\n\n- Room A spans X `[0, 150]`, room B spans X `[150, 300]`. They meet at `150`; the wall\n is centred on `150` and belongs to both \u2192 **one shared wall.** Done.\n- The clear interior of a room is `width \u2212 t` \xD7 `length \u2212 t` (half a wall on each side);\n its outer extent is `width + t` \xD7 `length + t`. The system grows each footprint to the\n outer face automatically at render time (`expandRoomWalls`), so you never write `t`.\n\nThat\'s the whole rule. No "overlap by `wall_thickness`," no directional offsets.\n\n### Placing a plan on a grid \u2014 rooms reference the grid directly\n\nBecause room coords *are* wall centrelines and a **grid** (`grids` block) is a set of\nnamed wall centrelines, a room is just the rectangle between four grid lines \u2014 with\n**no arithmetic**:\n\n```jsonc\n"grids": { "main": { "x": [ {"name":"1","at":"= wallT/2"}, {"name":"2","at":"= House.W - wallT/2"} ],\n "y": [ {"name":"A","at":0}, {"name":"B","at":"= House.L - wallT/2"} ] } }\n```\n```jsonc\n{ "type":"room", "name":"Hall",\n "formulas": { "x":"= main.x1", "y":"= main.yA",\n "width":"= main.x2 - main.x1", "length":"= main.yB - main.yA" } }\n```\n\nEach grid line is published as a formula **symbol** `<gridId>.x<name>` / `<gridId>.y<name>`\n(e.g. `main.x1`, `main.yA`), so rooms, slabs and the plinth all place themselves off the\nsame lines. Move a grid line (or the `House` knobs its `at` depends on) and every room on\nit follows. The **grid is the single parametric layer** \u2014 `House` + knobs \u2192 grid lines \u2192\nrooms; nothing flows the other way. See `parametric-conventions.md`.\n\n(Legacy files without `coord_convention` are read as `"outer"`: coords are the OUTER\nface and adjacent rooms must **overlap** by `wall_thickness`. New work uses `"center"`.)\n\n## Vertical (Z) fields recap\n\n- `plinth.height` \u2014 how high the base sits above ground.\n- floor `height` \u2014 floor-to-floor rise; floors stack on top of each other by these.\n- floor `wall_height` \u2014 standing wall height on that floor.\n- `slab_thickness` \u2014 RCC deck between a floor and the one above.\n- opening `sill_height` \u2014 window sill height above its floor.\n- `beam.z_offset`, `kitchen_platform.base_z` \u2014 vertical offsets.\n\n## Sloping tops\n\nA wall (or room wall side) with a sloping top sets both `height` (at the start)\nand `height_end` (at the end). Full gable/hip geometry, though, comes from the\n`roof` object, not from wall slopes \u2014 see `roof-v2-guide.md`.\n\n## Quick self-check before saving\n\n- Did I treat "north/up" as **smaller** Y?\n- Are all my numbers in **project units** (feet \xD7 10)?\n- Is `"coord_convention": "center"` set, so room coords are wall centrelines and adjacent\n rooms **abut** on the shared line (no overlap, no `t` math)?\n- Does the plinth rectangle (`length`\xD7`width`) contain all my rooms?\n- Does the roof footprint cover the plinth?\n'
|
|
417385
|
-
},
|
|
417386
|
-
"parametric-conventions": {
|
|
417387
|
-
"title": "Building a fully-parametric template",
|
|
417388
|
-
"body": '# Parametric model conventions (reusable house templates)\n\nHow to author a **fully-parametric** `.wadi` \u2014 a template that stays valid under *any*\nknob change (resize the plot, widen a room, add a floor) instead of a one-off with\nbaked-in numbers. Use it when building a **template** for the library / picker; skip it\nfor a quick fixed sketch.\n\nThe canonical worked example is **`examples/coastal_konkan.wadi`** \u2014 read it alongside\nthis. The engine: `variables` \u2192 `grids` \u2192 per-object `formulas`, resolved\ntopologically by `editor/src/param/resolve.ts`. Formula ops: `+ - * /`, `min`, `max`,\n`clamp`, `round`, `floor`, `ceil`, `abs` (no `eval`, no comparisons/ternary).\n\n## 0. The one big idea: the GRID is the parametric layer\n\nA **grid** is a set of named wall-**centreline** lines \u2014 X (west\u2192east: `1,2,3\u2026`) and Y\n(north\u2192south: `A,B,C\u2026`). Each line\'s position (`at`) is a formula of the house size and\nyour knobs. **Rooms don\'t compute their own geometry \u2014 they name grid lines.** Move a\nline (or the knob its `at` depends on) and every room, slab and column on it follows.\n\n```\nHouse size + knobs \u2500\u2500\u25B6 grid line `at` formulas \u2500\u2500\u25B6 rooms/pillars reference lines\n (variables) (the grids block) (= main.x1, \u2026)\n```\n\nThis one-directional flow is the whole recipe. There is **no** room-corner point layer\nand **no** per-room wall math (both existed in the old convention \u2014 don\'t use them).\n\n## 1. Set the centreline convention\n\nAt the top of the house set:\n\n```jsonc\n"coord_convention": "center"\n```\n\nThen a rect object\'s `x, y, width, length` are wall **centrelines**, and **two rooms\nthat share a wall just ABUT on the shared line** \u2014 room A spans X `[x1,x4]`, room B\nspans `[x4,x8]`, the wall is centred on `x4` and shared. No overlap, no `wallT` math;\nthe renderer grows each footprint to the outer face automatically. See\n`coordinate-system.md` \u2192 "the centreline convention".\n\n## 2. Variables \u2014 the knobs\n\n- **Base dims:** `wallT` (wall thickness), `floorH`, `slabH`, plus derived helpers\n (`wallH = "=floorH-slabH"`).\n- **Column sizes + inset:** `pillarW` (and `pillarL` if rectangular), and\n **`pilInset = "= (pillarW - wallT) / 2"`** \u2014 the amount a perimeter column must move\n inward to sit flush with the facade (see \xA75).\n- **Opening sizes:** `doorW/doorH`, `winW/winH/winSill`, `entranceW`, `doorMargin` \u2014 never\n inline literals.\n- **Room-proportion knobs:** `pct<Room><W/L>` + `min<Room><W/L>` (see \xA73).\n\nVariables may reference only other variables (they resolve before the grid).\n\n## 3. The grid \u2014 named lines as formulas\n\nDefine `grids.main` with X and Y lines. The **outer** lines anchor to the plinth edge;\n**interior** lines carry the room-proportion logic:\n\n```jsonc\n"grids": { "main": {\n "x": [\n { "name": "1", "at": "= wallT / 2" }, // left outer face at 0\n { "name": "2", "at": "= max(minBedW, round(pctBedW * House.W)) + 3*wallT/2" },\n { "name": "8", "at": "= House.W - wallT / 2" } // right outer face at House.W\n ],\n "y": [ { "name": "A", "at": "= wallT / 2" }, { "name": "F", "at": "= House.L - wallT / 2" } ]\n} }\n```\n\n- **Outer lines:** `1`/`A` at `wallT/2`, the last at `House.dim \u2212 wallT/2`. A wall\n centred on `wallT/2` has its outer face at `0`; on `House.W \u2212 wallT/2`, at `House.W`.\n So the building fills the plot exactly.\n- **Interior lines \u2014 where pct/min lives.** Either a fixed **fraction** of the span\n (`round(wallT/2 + frac*(House.W - wallT))`, pure proportional \u2014 the coastal style) or\n a **`max(min, pct*House.dim)`** offset (keeps a room from getting unusably small on a\n tight plot \u2014 the cottage/family style). Because a room\'s clear interior is\n `(line-to-line) \u2212 wallT`, add `+ 3*wallT/2` to a `max(min, pct*\u2026)` size so the KNOB\n equals the clear interior.\n- Each grid line is published as a formula **symbol** `main.x<name>` / `main.y<name>`\n (`main.x1`, `main.yA`). Positions are conserved automatically \u2014 the lines partition\n the span, so there are no gaps/overlaps to reconcile.\n\n## 4. Rooms, slabs, plinth \u2014 reference the grid, nothing else\n\n```jsonc\n{ "type":"room", "name":"Hall",\n "formulas": { "x":"= main.x1", "y":"= main.yA",\n "width":"= main.x4 - main.x1", "length":"= main.yC - main.yA" } }\n```\n\n- `x`/`y` = the room\'s top-left grid node; `width`/`length` = the span to another node.\n- Adjacent rooms use the **same** line for their shared edge (room A `\u2026x4`, room B\n `x:"= main.x4"`) \u2192 they abut and share one wall.\n- The floor slab / plinth span the outermost lines (`main.x1 \u2192 main.x8`,\n `main.yA \u2192 main.yF`).\n- **Keep valid placeholder literals** on `x/y/width/length` (positive numbers) \u2014 the\n strict schema checks stored literals *before* resolve. The resolver overwrites them.\n\n## 5. Pillars \u2014 corner-anchored; centre on a node by subtracting half the width\n\nA pillar\'s `(x,y)` is its **TOP-LEFT CORNER** in **both** conventions (columns align\nto corners \u2014 the convention never shifts a pillar the way it grows a room). To drop a\ncolumn **centred** on a grid node, subtract **half its width** in the formula:\n\n```jsonc\n{ "type":"pillar", "name":"P_mid",\n "formulas": { "x":"= main.x3 - pillarW/2", "y":"= main.yF - pillarW/2",\n "width":"= pillarW", "length":"= pillarW" } }\n```\n\n- **Interior columns** centre on their node: `"= main.x3 - pillarW/2"`.\n- **Perimeter columns** are wider than the wall, so centred on an outer line they\'d jut\n past the plinth. Inset by `pilInset` first, **then** subtract `pillarW/2` \u2014 the net\n effect puts the column\'s OUTER face flush with the wall\'s outer face:\n - on the **min** line (`x1`, `yA`): `"= (main.x1) + pilInset - pillarW/2"`\n - on the **max** line (`x8`, `yF`): `"= (main.x8) - pilInset - pillarW/2"`\n - a corner column does both axes; a front-row column that\'s interior in X only insets Y.\n- Because `pilInset = (pillarW \u2212 wallT)/2` and `pillarW` are formulas, columns stay flush\n when you resize the plot, the wall, or the column.\n- **Colonnade columns** between nodes: `"= (main.x1 + main.x2)/2 - pillarW/2"` (centre on\n the midpoint); still inset the axis that sits on an outer line.\n- **Freehand (no grid):** put `at (x,y)` where the column\'s **corner** should sit \u2014 it\n lands there exactly, so you can butt a column against a room corner or wall junction.\n\n## 6. Openings\n\n- Opening sizes are **variables**; every opening is **positioned by formula** from its\n room\'s line span.\n- **Windows / wide entrances are CENTRED:** offset `= ((span) \u2212 w)/2`.\n- **Internal doors tuck into a corner** (`doorMargin` from one end) to keep a\n continuous wall run for furniture.\n- **A shared wall is declared once** \u2014 the room with the door declares that side\'s\n opening; the neighbour omits the side (the coincident wall is already there).\n- **Validate every opening:** `0 \u2264 offset && offset + width \u2264 wallSpan`, or\n `expandRoomWalls` throws.\n\n## 7. Konkan layout conventions\n\n- **Central hall (Majghar) is the circulation hub** \u2014 rooms open into it, not into each\n other. Preserves privacy and frees wall runs.\n- **Consolidate wet services** \u2014 kitchen + bathroom share a wall so plumbing runs\n together.\n- **Front verandah** (full-width, pillared) + **rear Padvi** (rear verandah).\n- Give fixed rooms a comfortable **minimum** (a 6\'\xD76\' bathroom reads cramped; ~7\'\xD77\' is\n better) \u2014 raise the `min`, not just the `pct`.\n\n## 8. Build & verify \u2014 the loop\n\n1. **Author** the grid + formulas with valid placeholder literals.\n2. **Validate:** `cd editor && npx tsx ../wadi-skill/architect/scripts/validate.mjs <ABS_PATH>`\n \u2014 resolves, schema-checks, and runs the wall/roof pipeline. Exit 0 = good.\n3. **Render + read:** `wadi-skill/architect/scripts/preview.sh <ABS_PATH>` \u2192 look at the\n plans (rooms in place, columns flush, roof over the plinth).\n4. **Scale sweep \u2014 the whole point.** Resolve + render at a **small**, a **large**, and\n an **off-aspect** plot (change `House.W`/`House.L` or the plot). Confirm: no negative\n rooms, rooms fill the plot exactly, every opening fits, **no column juts past the\n plinth**, no pillar/door overlap. A change that only works at the default size isn\'t\n done.\n5. In the app: the **Geometry-issues panel says "No geometry issues"**, and the live 3D\n model updates on save.\n\nSee also `coordinate-system.md` (Y is DOWN, 10 units = 1 ft, the centreline rule),\n`data-model.md` (every field), and `examples/coastal_konkan.wadi` (the reference).\n'
|
|
417389
|
-
},
|
|
417390
|
-
"roof-v2-guide": {
|
|
417391
|
-
"title": "The roof object (hip/gable/shed/flat)",
|
|
417392
|
-
"body": '# Roof v2 guide (the unified `roof` object)\n\nThe `roof` object replaces the legacy `hip_roof`/`gable_roof`/`flat_roof`/\n`shed_roof`. It is **segment-based**. The schema is permissive; the real\nvalidation happens in the compute pipeline, so **always run `validate.mjs`**\nafter writing a roof (it runs the exact derivation the app uses).\n\n> **Strategy:** roof geometry is the subtlest part of the config. Don\'t\n> hand-invent it \u2014 **copy the roof from the closest example** (see the shape map\n> below), then adjust its segment coordinates/widths to your plinth, and validate.\n\n## Where the roof lives, and its height (you do NOT set a Z)\n\nRead this first \u2014 it\'s the part that isn\'t obvious and that you must not try to\nreverse-engineer from the geometry.\n\n- **A roof object goes on its OWN top floor** \u2014 a floor whose `floor_number` is\n ABOVE every floor it covers, containing only the roof object(s). Name it\n something like `"Roof"` or `"Loft Floor"`. Example: ground = 0, first = 1 \u2192 the\n roof floor is `floor_number` **2**. The roof then covers the floors below it.\n (All the examples do this: the roof sits alone on the topmost floor.)\n- **You NEVER write a Z or height on the roof.** There is no Z field anywhere in\n the roof object. Its base sits automatically at the top of the walls below it,\n computed by the pipeline as:\n\n ```\n roof base Z = plinth.height + \u03A3 (height of every floor BELOW the roof\'s floor)\n ```\n\n using each floor\'s own `height` (falling back to `defaults.floor_height`).\n **`slab_thickness` does NOT enter this stack** \u2014 `height` already is the full\n floor-to-floor rise.\n- **To raise or lower the roof, change the FLOORS\' `height` (or `plinth.height`),\n not the roof.** If the roof floats too low/high, you put it on the wrong floor\n or a floor below it has the wrong `height`.\n- `slope` / `ridge_h` is the rise **above** that computed wall-top; segment\n `start`/`end` are 2D `[x, y]` only. Don\'t compute a Z \u2014 the pipeline does it\n entirely from the floor stack.\n\n## The core idea\n\nA roof is a set of **segments**. Each segment is a line (`start`\u2192`end`) with a\n**`width`** measured *perpendicular* to it, and **the segment sits at the CENTRE\nof that width** (the roof extends `width/2` to each side of the line). What the\nline means depends on `roof_type`:\n\n- **pitched** \u2014 the segment **is the ridge**; two symmetric slopes rise from the\n eaves up to it. Ends are covered per `default_endpoint`:\n - `"closed"` \u2192 **hip** (a sloped triangular hip face at the end).\n - `"open"` \u2192 **gable** (a vertical gable-end wall triangle).\n- **shed** \u2014 the segment is the **high edge**; the roof slopes down perpendicular\n to the far side. `shed_high_side` names which side is high.\n- **flat** \u2014 the segment\'s width band is a flat slab extruded down.\n\nSegments can run in **any direction** (not just axis-aligned).\n\n**Centreline convention (`coord_convention: "center"`).** A segment\'s\n`start`/`end`/`width` are **wall centrelines**, exactly like a room\'s\n`x/y/width/length`. On expand, each segment grows to the **outer wall face** \u2014\nthe axis is extended by \xBD\xB7`wall_thickness` at each end and `width` grows by\n`wall_thickness` \u2014 then `overhang` extends beyond that. So author segments on the\n**same centreline grid as the walls below** (e.g. `width House.W`, axis endpoints\non grid lines); do **not** hand-add \xBD-wall offsets, or the roof lands half a wall\nthickness inside the walls. (In the default `"outer"` convention the coordinates\nare literal outer-face positions and no grow happens.)\n\n## Object shape\n\n```jsonc\n{\n "type": "roof",\n "roof_type": "pitched" | "shed" | "flat",\n "default_endpoint": "closed" | "open", // pitched only: closed=hip, open=gable\n "min_overhang": 25, // > 0 \u2014 eave overhang beyond the walls\n "slope": { "by": "height", "ridge_h": 50 }, // rise above wall top \u2026\n // or { "by": "angle", "angle_deg": 30 }, // \u2026 or a pitch angle\n "segments": [\n {\n "id": "seg0",\n "start": [x, y], "end": [x, y], // the ridge (pitched) / high edge (shed)\n "width": 200, // perpendicular span, segment centred in it\n "slope": { \u2026 }, // optional per-segment slope override\n "shed_high_side": "\u2026", // shed only\n "hip_setback_start": \u2026, "hip_setback_end": \u2026, // optional, tune closed hip faces\n // Per-side overhang overrides (each defaults to min_overhang). Cantilever one\n // edge \u2014 e.g. big overhang_end over an entry landing \u2014 while others stay tight.\n "overhang_start": \u2026, "overhang_end": \u2026, // along the ridge axis (shed; on a gable\n // open end = gable_overhang_*)\n "overhang_low": \u2026, "overhang_high": \u2026, // SHED eaves (down-slope / up-slope)\n "overhang_left": \u2026, "overhang_right": \u2026 // PITCHED eaves (left / right of ridge;\n // single-segment only \u2014 see below)\n }\n ],\n "trusses": [\n { "segment_id": "seg0", "type": "fink", "positions_along": [100, 210, 320] }\n // type: "fink" (pitched) | "mono_pitch" (shed)\n // positions_along: distances along the segment where a truss sits\n ],\n "framing": { \u2026 } // optional overrides \u2014 omit unless asked\n}\n```\n\n`slope` may be given once at the roof level (applies to all segments) or per\nsegment. `by: "height"` \u2192 `ridge_h` is the ridge rise above the wall top; `by:\n"angle"` \u2192 `angle_deg` is the pitch.\n\n## Joints (multi-segment shapes)\n\nWhen two segments share an **exactly coincident endpoint**, the pipeline\nauto-resolves that end as a **joint** (no hip/gable face there) \u2014 this is how L,\nU, and closed-loop (courtyard) roofs are formed. Get the endpoints numerically\nequal or they won\'t join.\n\n## Shape \u2192 which example to copy\n\n| Want | Segments | Copy from |\n|---|---|---|\n| Simple hip (one ridge, hipped ends) | 1, `pitched`, `closed` | `two_story_konkan.json` / `verandah_cottage.json` |\n| Simple gable (one ridge, gable ends) | 1, `pitched`, `open` | same, set `default_endpoint: "open"` |\n| **L-shape** (two wings) | 2, `pitched`, coincident inner endpoints | `l_shape_villa.json` |\n| **Courtyard** (ridge loop) | 4, `pitched`, endpoints chained in a loop | `courtyard_home.json` |\n| **Flat** roof/terrace | 1+, `flat` | `modern_flat.json` |\n| Shed / mono-pitch (lean-to, verandah) | 1, `shed`, `shed_high_side` set | derive from a `pitched` seg; add `shed_high_side` + slope |\n\n## Rules & pitfalls\n\n- The roof **footprint must cover the plinth footprint** \u2014 segment lines +\n widths should span the walls they sit on. Mirror the example\'s relationship to\n its plinth.\n- `min_overhang` must be **> 0**.\n- Every segment needs an `id`; every truss references a real `segment_id`.\n- Shed segments **require** a slope (`ridge_h` or `angle_deg`) and a\n `shed_high_side`, or derivation throws.\n- After any roof edit: run `validate.mjs` \u2014 a zero-length segment, missing slope,\n or non-covering footprint fails there, not in the schema.\n'
|
|
417393
|
-
},
|
|
417394
|
-
"data-model": {
|
|
417395
|
-
"title": "The underlying .wadi schema (generated from Zod)",
|
|
417396
|
-
"body": '# Wadi data model (`.wadi` / `house_config.json`)\n\n> **Generated from `editor/src/schema/houseConfig.ts` \u2014 do not edit by hand.**\n> Regenerate: `node scripts/gen-schema-doc.mjs <path/to/houseConfig.ts> reference/data-model.md`\n> The Zod schema is the single source of truth; this file mirrors it (structure + the\n> semantics carried in its comments) so it can\'t drift.\n\nA `.wadi` file is one JSON object matching **HouseConfig**. Geometry is in **project\nunits** (a unitless grid; by default `units.per_unit = 10` means 10 units = 1 ft).\nPlan coordinates are **Inkscape-style**: origin top-left, **X \u2192 right, Y \u2192 down**.\nSee `coordinate-system.md` for the coordinate/units detail and `parametric-conventions.md`\nfor variables/points/formulas.\n\n## Fields shared by (almost) every object\n\nThese appear on most object types; documented once here, marked *(cross-cutting)* below.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `room` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `layer` | string | | |\n| `name` | string | **yes** | |\n| `material` | string | | |\n| `z_offset` | number | | Vertical position of the room (its floor + walls), as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). This is the UNIFIED z_offset convention: every object is placed at `slabZ + z_offset`. When OMITTED, on-slab objects (room, wall, staircase, kitchen_platform) default z_offset to the floor\'s resolved slab thickness (floor.slab_thickness \u2192 house.defaults.slab_thickness \u2192 code default), so by default they sit on top of the slab, exactly as before. Set it explicitly for split-level floors \u2014 e.g. a room raised onto a thicker slab uses the same value the raised slab\'s top sits at. |\n\n\n- `type` \u2014 the discriminated-union tag; selects the object shape (values below).\n- `formulas` \u2014 per-field `"= expression"` overrides; the resolver evaluates each into the\n matching numeric field. See `parametric-conventions.md`.\n- `z_offset` \u2014 vertical lift above the floor base (slab top). On-slab objects (room, wall,\n staircase, kitchen_platform) default it to the floor\'s slab thickness; slab/beam/pillar/\n roof default to 0.\n\n## Top level \u2014 HouseConfig\n\n| field | type | req | notes |\n|---|---|---|---|\n| `coord_convention` | enum: `outer` `center` | | How a rectangular object\'s x/y/width/length relate to its walls (plans/grid-convention.md). "center" (new/canonical): coordinates are wall CENTRELINES \u2014 adjacent rooms ABUT on a shared line (no overlap), walls are centred on the boundary, and expandRoomWalls grows each footprint by wall_thickness/2 to the outer face. "outer" / absent (legacy): coordinates are the OUTER wall face and adjacent rooms must overlap by wall_thickness. |\n| `plinth` | any (freeform) | | Legacy top-level plinth (pre-"Plinth floor"). Tolerated but IGNORED so an un-migrated file still loads (it just renders without a plinth/ground) instead of failing .strict() validation. New configs put the plinth on the Plinth floor as a `plinth` object. |\n| `defaults` | [houseDefaults](#housedefaults) | | |\n| `units` | [units](#units) | | |\n| `layers` | array of [LayerDef](#layerdef) | | Configurable 3D visibility layers (optional; defaults applied when absent). Objects opt in via their own `layer` field. |\n| `variables` | map: string \u2192 number, or `"= formula"` string | | Parametric layer (plans/object-relationships-plan.md). Named scalar variables (number or "= formula", may reference other variables) and named 2D points; object `formulas` maps reference these. Optional \u2014 absent = a plain non-parametric house, resolved as a no-op. |\n| `points` | map: string \u2192 inline object | | |\n| `components` | map: string \u2192 [ComponentDef](#componentdef) | | Reusable-component library (in-file). Map of id \u2192 ComponentDef. A `component` object instantiates one by `ref`. Stored once; referenced by many instances; edit here to update every instance. |\n| `grids` | map: string \u2192 `gridDef` | | First-class parametric grids (plans/grid-convention.md). Map of id \u2192 GridDef (named X/Y wall centrelines). Rooms/slabs bind via `grid`+`cell`, pillars via `grid`+`node`; the resolver derives their geometry from the centrelines + wall thickness. Optional; reusable across templates. |\n| `configurator` | [configurator](#configurator) | | Configurator metadata (Gharkul owner UI). Optional; see plans/configurator-plan.md. |\n| `thumbnails` | array of string | | Preview snapshots (data: URLs) captured by the architect editor and saved WITH the template so the owner gallery can show real previews \u2014 multiple angles + the floor plan. `thumbnails[0]` is the gallery cover. Optional; excluded from share links (a preview isn\'t model data \u2014 see io/shareLink.ts). `thumbnail` (singular) is the legacy one-image form, still read as a fallback so old template files keep working. |\n| `thumbnail` | string | | |\n| `floors` | array of [floor](#floor) | **yes** | |\n| `_walls_expanded` | boolean | | |\n\n\n## floor\n\n| field | type | req | notes |\n|---|---|---|---|\n| `floor_number` | integer \u2265 0 | **yes** | |\n| `name` | string | **yes** | |\n| `height` | number > 0 | | Per-floor overrides for the default heights in GlobalConfig. In project units (10 units = 1 ft). All three are INDEPENDENT \u2014 no relationship enforced between them: height \u2014 floor-to-floor rise (drives roof wallTop-Z stack) wall_height \u2014 standing wall height (floor top \u2192 ceiling) slab_thickness \u2014 RCC deck between this floor and the one above All fall back to GlobalConfig defaults when omitted. |\n| `wall_height` | number > 0 | | |\n| `slab_thickness` | number \u2265 0 | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `objects` | array of [Object types](#object-types) | **yes** | |\n\n\n## Object types (`floors[].objects[]`)\n\nEvery entry in a floor\'s `objects` array is one of these, tagged by `type`:\n\n### `plinth`\n\nThe plinth is now a normal object placed on the "Plinth" floor (the first floor, number 0), not a top-level config key. Its footprint + height match the old top-level plinth; the plinth floor\'s `height` drives the rise to the floor above (replacing the old hardcoded plinth_height seed).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `plinth` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `material` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | |\n\n\n### `ground`\n\nThe ground plane, also on the Plinth floor. Extent defaults to the site plot when authored by the migration. `height` is an optional thickness (0 = a flat plane); slope fields are a later phase.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `ground` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `material` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number \u2265 0 | | |\n| `z_offset` | number | | |\n\n\n### `component`\n\nAn INSTANCE of a reusable component from the in-file `components` library. It references a component by id (`ref`), overrides the component\'s input variables via `params`, and places it at (x, y) with a `z_offset` lift on its parent floor. At render time `expandRoomWalls` flattens it into concrete objects (resolve component with param+origin overrides \u2192 recurse \u2192 offset), so no renderer needs to know about `component`.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `component` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `ref` | string | **yes** | |\n| `params` | map: string \u2192 union \u2014 see notes | | Overrides for the component\'s declared input variables. A string starting with "=" is a formula evaluated in the HOST scope (so it can reference the host\'s variables/points); a number is used directly. |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `z_offset` | number | | |\n\n\n### `item`\n\nA free-standing GLB furniture / decor instance placed directly on a floor (for pieces that aren\'t inside an enclosed room \u2014 outdoor/site/verandah decor, a loft item, etc.). `x`/`y` are the item\'s plan CENTRE. It MAY instead anchor to a named room via `anchor_to` + `anchor` + `gap`, in which case `x`/`y` are DERIVED at expand time (same anchor model as room-nested items). `rotation` is yaw\xB0; `scale` is a uniform resize; `z_offset` lifts it above the floor base (default = slab thickness). (`itemAsset`, `itemAnchor`, `gapField` are defined above `room`.)\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `item` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `asset` | [ItemAsset](#itemasset) | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `rotation` | number | | |\n| `scale` | number > 0 | | |\n| `z_offset` | number | | |\n| `anchor_to` | string | | Optional room-relative anchoring (for a free item that should follow a room). |\n| `anchor` | [ItemAnchor](#itemanchor) | | |\n| `gap_x` | number | | |\n| `gap_y` | number | | |\n\n\n### `floor_slab`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `floor_slab` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `thickness` | number \u2265 0 | | Optional per-slab thickness override. Defaults to the floor\'s slab_thickness (which itself defaults to house.defaults or the code global). In project units. |\n| `z_offset` | number | | Vertical position, as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). Default 0 \u2192 the slab\'s bottom sits at the floor base. Raise it to place a slab at an intermediate height (e.g. a stair landing). See the unified z_offset convention on `room`. |\n\n\n### `pillar`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `pillar` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | TOP-LEFT CORNER (Inkscape frame), consistent with room / floor_slab / beam. (Historically this was the pillar CENTER; changed for consistency.) |\n| `y` | number | **yes** | |\n| `width` | number > 0 | | width or length may be absent \u2014 see create_pillar. |\n| `length` | number > 0 | | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Default 0 \u2014 a pillar rises from the floor base (plinth top on floor 0) through the slab to the ring beam. Same convention as `beam`/`floor_slab`. |\n\n\n### `beam`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `beam` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number > 0 | | Vertical thickness of the beam, in PROJECT UNITS. Optional \u2014 defaults to the floor\'s slab_thickness. The 3D viewer + BeamForm read this as `height`; note the Python builder currently reads a `thickness` key instead (wadi_config.py) \u2014 see the known field-name mismatch. |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), in PROJECT UNITS (10 units = 1 ft). Default 0 \u2014 the beam\'s bottom sits at the floor base. Same convention as `floor_slab`. (Was previously z_offset_ft in feet.) |\n\n\n### `room`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `room` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `length` | number > 0 | **yes** | |\n| `height` | number \u2265 0 | | 0 accepted \u2014 semantically the same as absent ("use floor default"). Old configs that accidentally saved height: 0 keep loading; the form treats 0 as "no override" and doesn\'t write it back. |\n| `material` | string | | |\n| `z_offset` | number | | Vertical position of the room (its floor + walls), as a lift above the FLOOR BASE (slabZ = plinth top for floor 0, else the floor below\'s top; project units, 10 = 1 ft). This is the UNIFIED z_offset convention: every object is placed at `slabZ + z_offset`. When OMITTED, on-slab objects (room, wall, staircase, kitchen_platform) default z_offset to the floor\'s resolved slab thickness (floor.slab_thickness \u2192 house.defaults.slab_thickness \u2192 code default), so by default they sit on top of the slab, exactly as before. Set it explicitly for split-level floors \u2014 e.g. a room raised onto a thicker slab uses the same value the raised slab\'s top sits at. |\n| `walls` | union \u2014 see notes | | |\n| `wall_heights` | map: string \u2192 [wall_heights entry](#wall-heights-entry) | | |\n| `items` | array of [RoomItem](#roomitem) | | Furniture nested in this room. Each piece is anchored to the room\'s inner footprint (see roomItem), so it reflows when the room resizes. Expanded into top-level `item` objects at render time. |\n\n\n### `wall`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `wall` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `start_x` | number | **yes** | |\n| `start_y` | number | **yes** | |\n| `end_x` | number | **yes** | |\n| `end_y` | number | **yes** | |\n| `height` | number > 0 | | |\n| `height_end` | number | | |\n| `material` | string | | |\n| `facing` | enum: `north` `south` `east` `west` | | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Omitted \u2192 defaults to the floor\'s resolved slab thickness (sits on the slab, as before). Set it for a split-level wall. Same convention as `room`. |\n| `openings` | array of [Opening](#opening) | | |\n\n\n### `staircase`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `staircase` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `start_x` | number | **yes** | A staircase belongs to the DESTINATION (upper) floor it leads to \u2014 put it on that floor\'s `objects` so deleting the floor deletes the stair. It is TOP-anchored and DESCENDS: (start_x, start_y) is the top connection where it meets this floor, and the stair descends INTO `direction` from there (its body + landings fill the box [start, start + max_run] along `direction`). `z_offset` is the top\'s height above the floor base (omitted \u2192 this floor\'s slab thickness, flush with the walking surface). |\n| `start_y` | number | **yes** | |\n| `rise_height` | number > 0 | | Total height the stair covers, top \u2192 floor below. The step COUNT is derived: num_steps = round(rise_height / step_rise). Omitted \u2192 defaults to the height of the floor immediately below this one. Formula-capable (e.g. "= floor_height"). Replaces the old explicit `num_steps`. |\n| `step_rise` | number > 0 | **yes** | |\n| `step_tread` | number > 0 | **yes** | |\n| `step_width` | number > 0 | **yes** | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | The direction the stair EXTENDS from its top \u2014 the whole assembly fills the allocated box from (start_x,start_y) going this way for up to `max_run`. |\n| `max_run` | number > 0 | | ALLOCATED run: the length of space reserved for the stair along `direction`. The WHOLE assembly (flights + turn landings) is kept within [start, start+max_run]; when the run won\'t fit as one flight it auto-splits into switchback flights (more flights when tight), expanded in expandRoomWalls into plain staircases + floor_slab landings so every renderer is unchanged. Omit \u2192 one flight, no length limit. |\n| `landing_depth` | number > 0 | | Turn-landing depth (along the run). Omitted \u2192 equals step_width. |\n| `landing_thickness` | number \u2265 0 | | Turn-landing slab thickness. Omitted \u2192 equals step_rise. |\n| `turn` | enum: `clockwise` `anticlockwise` | | Switchback handedness, reckoned DESCENDING from the top. Omitted \u2192 "clockwise". Only affects split stairs. |\n| `flight_gap` | number > 0 | | Lateral gap between the two switchback flights (a stairwell void for a spine wall). Omitted/0 \u2192 flights are adjacent. The turn landings widen to bridge the gap. Only affects split stairs. |\n| `z_offset` | number | | Height of the stair\'s TOP above the floor base (slabZ; project units, 10 = 1 ft). Omitted \u2192 this floor\'s slab thickness, so the top is flush with the walking surface and the flights descend to the floor below. Raise it for an internal step whose top sits above the floor. |\n| `material` | string | | |\n\n\n### `door`\n\nFlat door/window remain valid as a legacy schema \u2014 new configs nest them inside room.walls[side].openings or wall.openings.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `door` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | |\n| `room` | string | | |\n| `wall` | string | | |\n| `open` | boolean | | |\n\n\n### `window`\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `window` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | **yes** | |\n| `x` | number | **yes** | |\n| `y` | number | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `sill_height` | number \u2265 0 | | |\n| `direction` | enum: `north` `south` `east` `west` | **yes** | |\n| `room` | string | | |\n| `wall` | string | | |\n| `open` | boolean | | |\n\n\n### `kitchen_platform`\n\nKitchen platform \u2014 a polyline countertop / cooking slab that runs along the base of walls. Path is the wall-side edge; the platform extends `depth` units perpendicular to each segment on the given `side`. Renders as one box per path segment; corners meet at the shared point (no fancy mitering in v1).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `kitchen_platform` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n| `layer` | string | | *(shared \u2014 see top)* |\n| `name` | string | | |\n| `path` | array of tuple `[n,n]` | **yes** | |\n| `side` | enum: `left` `right` | **yes** | |\n| `depth` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `z_offset` | number | | Lift above the FLOOR BASE (slabZ), project units. Omitted \u2192 defaults to the floor\'s resolved slab thickness (sits on the slab top, as before). Same convention as `room`. |\n| `base_z` | number | | |\n| `material` | string | | |\n\n\n### `roof`\n\nv2 roof \u2014 unified segment-based type that replaces hip/gable/flat/shed. Schema is permissive; the v2 pipeline (svg2d/roof/v2/) validates segments + slope + endpoint style at derivation time.\n\n\n> **Freeform:** extra fields are allowed (`.catchall`) and validated at derivation time. See `roof-v2-guide.md`.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `type` | literal `roof` | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | *(shared \u2014 see top)* |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | *(shared \u2014 see top)* |\n\n\n## Shared & nested schemas\n\n### site\n\nObjects don\'t bind to the grid with a special field \u2014 a grid line\'s position is published as a formula symbol (`<gridId>.x<name>` / `.y<name>`, see param/resolve.ts), so a room places itself with ordinary `formulas`, e.g. { x: "= main.x1", width: "= main.x5 - main.x1" }. With coord_convention:"center" those are wall centrelines and expandRoomWalls handles the wall extent.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `reference_x` | number | **yes** | |\n| `reference_y` | number | **yes** | |\n| `plot_length` | number > 0 | **yes** | |\n| `plot_width` | number > 0 | **yes** | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n\n\n### houseDefaults\n\nHouse-level overrides for the built-in GlobalConfig defaults. Every floor without its own value falls back to these; if these are absent too, the code defaults in DEFAULT_GLOBAL_CONFIG apply.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `floor_height` | number > 0 | | |\n| `wall_height` | number > 0 | | |\n| `slab_thickness` | number \u2265 0 | | |\n| `wall_thickness` | number > 0 | | House-wide wall thickness (project units). Per-object `wall_thickness`/`thickness` overrides still win. Falls back to the code default (DEFAULT_GLOBAL_CONFIG.wall_thickness = 8) when omitted. |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n\n\n### units\n\nHow dimensions are LABELLED on the drawings. Display-only \u2014 geometry always stays in project units; this just controls the text on the dimension lines. Omitted = the built-in default (feet & inches, 10 project units = 1 ft).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `system` | enum: `feet_inches` `feet` `meters` `centimeters` `millimeters` | | feet_inches \u2192 12\' 6" ; the rest \u2192 decimal with a unit suffix. |\n| `per_unit` | number > 0 | | Project units that equal ONE display unit (10 \u2192 10 units = 1 ft; 100 \u2192 100 units = 1 m). Default 10. |\n| `precision` | integer \u2265 0 | | Decimal places for the non-feet_inches systems. |\n\n\n### Opening\n| field | type | req | notes |\n|---|---|---|---|\n| `kind` | enum: `door` `window` | **yes** | |\n| `name` | string | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | Numeric fields hold the RESOLVED value; a `= formula` for any of them lives in `formulas` (e.g. formulas.offset), evaluated by resolveParametric against the house variables/points \u2014 same pattern as every other object. |\n| `offset` | number \u2265 0 | **yes** | |\n| `width` | number > 0 | **yes** | |\n| `height` | number > 0 | **yes** | |\n| `sill_height` | number | | |\n| `direction` | enum: `north` `south` `east` `west` | | |\n| `facing` | enum: `north` `south` `east` `west` | | |\n| `open` | boolean | | When true, the opening is left BARE (just a hole) \u2014 no glazing/frame for a window, no leaf for a door \u2014 e.g. an open doorway or unglazed vent. |\n\n\n### RoomWallSide\n| field | type | req | notes |\n|---|---|---|---|\n| `height` | number | | |\n| `height_end` | number | | |\n| `openings` | array of [Opening](#opening) | | |\n\n\n### RoomItem\n\nA furniture piece nested INSIDE a room (room.items[]). It has NO x/y \u2014 its plan position is DERIVED at expand time from the parent room\'s footprint + `anchor` + per-axis gap (+ its own `rotation`). Flattened into a top-level `item` for every renderer. `gap_x`/`gap_y` are the inset (project units) kept from the anchor into the room (edge/corner anchor \u2192 clears the wall; centre anchor \u2192 signed offset, +x east / +y south). `gap_x`/`gap_y`/`rotation`/`scale`/`z_offset` are all plain numeric fields so each can be driven by a `= formula` (via the `formulas` map).\n\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | | |\n| `formulas` | map: field name \u2192 `"= formula"` string | | |\n| `enabled` | boolean or number (`false`/`0` = hidden) | | |\n| `layer` | string | | |\n| `asset` | [ItemAsset](#itemasset) | **yes** | |\n| `anchor` | [ItemAnchor](#itemanchor) | | |\n| `gap_x` | number | | |\n| `gap_y` | number | | |\n| `rotation` | number | | |\n| `scale` | number > 0 | | |\n| `z_offset` | number | | |\n\n\n### ItemAsset\n\nFurniture (GLB `item`) \u2014 shared schema pieces Defined BEFORE `room` so a room can nest its own `items[]`. Asset distances are METRES (the GLB\'s native unit); the 3D/2D layers scale them into project units. See registry/nodes/item + three/units. The asset backing a furniture item \u2014 stored INLINE so a .wadi is self-contained (share links / web load the GLB from `src`). A catalog is just a picker convenience.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `id` | string | **yes** | |\n| `name` | string | | |\n| `src` | string | **yes** | |\n| `dimensions` | tuple `[n>0,n>0,n>0]` | **yes** | |\n| `thumbnail` | string | | |\n| `floorPlanUrl` | string | | |\n| `category` | string | | |\n| `tags` | array of string | | |\n| `offset` | tuple `[n,n,n]` | | |\n| `corrRotation` | tuple `[n,n,n]` | | |\n| `corrScale` | tuple `[n>0,n>0,n>0]` | | |\n\n\n### ComponentDef\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | | |\n| `params` | array of [ComponentParam](#componentparam) | | |\n| `variables` | map: string \u2192 number, or `"= formula"` string | | |\n| `points` | map: string \u2192 inline object | | |\n| `objects` | array of [Object types](#object-types) | **yes** | |\n\n\n### ComponentParam\n\nA reusable component DEFINITION in the in-file `components` library. It is a mini-house: its own `variables`/`points` and a flat `objects` body authored in LOCAL coords (origin 0,0). `params` names which variables are the public inputs (label/default for the instance form). A `component` instance overrides those variables and places the body at its (x,y,z_offset). Stored once; referenced by many instances.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `name` | string | **yes** | |\n| `label` | string | | |\n| `description` | string | | |\n| `default` | number | | |\n\n\n### LayerDef\n\nA visibility layer for the 3D view. Each object may reference a layer by `id` (via its `layer` field); the layers menu toggles whole layers on/off. Display-only \u2014 never affects geometry. Optional: when absent, a built-in default layer set is used, and objects fall back to an automatic per-type/floor mapping.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `id` | string (non-empty) | **yes** | |\n| `label` | string | **yes** | |\n| `color` | string | | |\n| `group` | string | | Friendly group for the owner "Show/hide layers" menu (e.g. "Roof", "Walls"). Layers sharing a group toggle together. Optional. |\n\n\n### configurator\n| field | type | req | notes |\n|---|---|---|---|\n| `title` | string | | |\n| `description` | string | | |\n| `groups` | array of inline object | | |\n| `inputs` | array of [ConfiguratorInput](#configuratorinput) | **yes** | |\n\n\n### ConfiguratorInput\n\nConfigurator (Gharkul owner UI) Optional, author-supplied metadata: which `variables`/`points` a template exposes to end users, and how to present them. IGNORED by the resolver and every geometry consumer \u2014 read only by the owner-facing Configurator UI. `target` is a variable name (e.g. "floorH") or a point coordinate ("House.W" \u2192 points.House.x; W/L/X/Y/x/y are resolver synonyms). `min`/`max`/ `step` are in RAW project units; `unit` only affects display.\n\n| field | type | req | notes |\n|---|---|---|---|\n| `target` | string (non-empty) | **yes** | |\n| `label` | string (non-empty) | **yes** | |\n| `description` | string | | |\n| `control` | enum: `slider` `number` `select` `toggle` | | |\n| `unit` | enum: `ft` `in` `m` `units` `percent` `count` `none` | | |\n| `min` | number | | |\n| `max` | number | | |\n| `step` | number > 0 | | |\n| `options` | array of inline object | | |\n| `group` | string | | |\n\n\n### ItemAnchor\n\n9-point anchor on a room\'s INNER footprint. First token = vertical (top = north \u2026 bottom = south), second = horizontal (left = west \u2026 right = east); "center" alone = both. The item aligns its matching edge/corner to this spot, held `gap` off it, into the room \u2014 so it reflows when the room is resized.\n\nEnum: `top-left` `top-center` `top-right` `center-left` `center` `center-right` `bottom-left` `bottom-center` `bottom-right`\n'
|
|
417397
|
-
}
|
|
417398
|
-
};
|
|
417399
|
-
|
|
417400
418130
|
// src/server.ts
|
|
417401
418131
|
var server = new McpServer({ name: "wadi-mcp", version: "0.1.0" });
|
|
418132
|
+
function savePng(buf, outDir, name) {
|
|
418133
|
+
const dir = outDir && outDir.trim() ? outDir : join(tmpdir(), "wadi-mcp");
|
|
418134
|
+
mkdirSync(dir, { recursive: true });
|
|
418135
|
+
const file2 = join(dir, name);
|
|
418136
|
+
writeFileSync(file2, buf);
|
|
418137
|
+
return file2;
|
|
418138
|
+
}
|
|
417402
418139
|
server.registerTool(
|
|
417403
418140
|
"wadi_check",
|
|
417404
418141
|
{
|
|
@@ -417425,14 +418162,15 @@ server.registerTool(
|
|
|
417425
418162
|
"wadi_preview",
|
|
417426
418163
|
{
|
|
417427
418164
|
title: "Render a Wadi design to images",
|
|
417428
|
-
description: "Compile a Wadi DSL house and render the requested 2D drawings to PNG images
|
|
418165
|
+
description: "Compile a Wadi DSL house and render the requested 2D drawings to PNG images: floor plans, elevations (front/back/left/right), and the roof top view. Use it to visually confirm room layout, sizes, openings, and roof before telling the user it's ready. Each PNG is BOTH returned inline AND written to a file whose absolute path is in the text \u2014 so if your client can't display inline images, tell the user the path(s) to open.",
|
|
417429
418166
|
inputSchema: {
|
|
417430
418167
|
wdl: external_exports.string().describe("The full .wdl source text."),
|
|
417431
418168
|
views: external_exports.array(external_exports.enum(["plans", "elevations", "roof"])).optional().describe("Which drawings to render. Default: all three."),
|
|
417432
|
-
width: external_exports.number().int().min(400).max(4e3).optional().describe("Raster width in px (default 1600).")
|
|
418169
|
+
width: external_exports.number().int().min(400).max(4e3).optional().describe("Raster width in px (default 1600)."),
|
|
418170
|
+
out_dir: external_exports.string().optional().describe("Absolute directory to save the PNGs to. Default: the OS temp dir. The saved path is returned in the text.")
|
|
417433
418171
|
}
|
|
417434
418172
|
},
|
|
417435
|
-
async ({ wdl, views, width }) => {
|
|
418173
|
+
async ({ wdl, views, width, out_dir }) => {
|
|
417436
418174
|
const want = views && views.length ? views : ALL_VIEWS;
|
|
417437
418175
|
let svgs;
|
|
417438
418176
|
try {
|
|
@@ -417451,7 +418189,8 @@ server.registerTool(
|
|
|
417451
418189
|
const content = [];
|
|
417452
418190
|
for (const { view, svg } of svgs) {
|
|
417453
418191
|
const png = rasterize(svg, width ?? 1600);
|
|
417454
|
-
|
|
418192
|
+
const file2 = savePng(png, out_dir, `wadi_${view}.png`);
|
|
418193
|
+
content.push({ type: "text", text: `\u2014 ${view} \u2014 saved to: ${file2}` });
|
|
417455
418194
|
content.push({ type: "image", data: png.toString("base64"), mimeType: "image/png" });
|
|
417456
418195
|
}
|
|
417457
418196
|
if (!content.length) {
|
|
@@ -417490,10 +418229,13 @@ server.registerTool(
|
|
|
417490
418229
|
"wadi_capture_3d",
|
|
417491
418230
|
{
|
|
417492
418231
|
title: "Capture a 3D image of a Wadi design",
|
|
417493
|
-
description: "Render a Wadi DSL house in the RUNNING Wadi desktop app and return a real 3D PNG
|
|
417494
|
-
inputSchema: {
|
|
418232
|
+
description: "Render a Wadi DSL house in the RUNNING Wadi desktop app and return a real 3D PNG \u2014 the actual textured model, not a 2D drawing. Requires the Wadi app to be open. The PNG is BOTH returned inline AND written to a file whose absolute path is in the text (open it if your client can't show inline images). (Headless 2D plans/elevations/roof: wadi_preview.)",
|
|
418233
|
+
inputSchema: {
|
|
418234
|
+
wdl: external_exports.string().describe("The full .wdl source text."),
|
|
418235
|
+
out_dir: external_exports.string().optional().describe("Absolute directory to save the PNG to. Default: the OS temp dir. The saved path is returned in the text.")
|
|
418236
|
+
}
|
|
417495
418237
|
},
|
|
417496
|
-
async ({ wdl }) => {
|
|
418238
|
+
async ({ wdl, out_dir }) => {
|
|
417497
418239
|
let config3;
|
|
417498
418240
|
try {
|
|
417499
418241
|
config3 = compileConfig(wdl);
|
|
@@ -417503,9 +418245,10 @@ server.registerTool(
|
|
|
417503
418245
|
if (!await appReachable()) return { content: [{ type: "text", text: APP_NOT_RUNNING }] };
|
|
417504
418246
|
try {
|
|
417505
418247
|
const img = await appCapture(config3);
|
|
418248
|
+
const file2 = savePng(Buffer.from(img.data, "base64"), out_dir, "wadi_3d.png");
|
|
417506
418249
|
return {
|
|
417507
418250
|
content: [
|
|
417508
|
-
{ type: "text", text:
|
|
418251
|
+
{ type: "text", text: `\u2014 3D view (from the live app) \u2014 saved to: ${file2}` },
|
|
417509
418252
|
{ type: "image", data: img.data, mimeType: img.mime }
|
|
417510
418253
|
]
|
|
417511
418254
|
};
|
|
@@ -417520,7 +418263,9 @@ server.registerTool(
|
|
|
417520
418263
|
title: "List or fetch example Wadi designs",
|
|
417521
418264
|
description: "Get validated example .wdl houses to copy from. With no name, lists the examples; with a name, returns that example's full .wdl source. Copy from these rather than authoring from memory.",
|
|
417522
418265
|
inputSchema: {
|
|
417523
|
-
name: external_exports.string().optional().describe(
|
|
418266
|
+
name: external_exports.string().optional().describe(
|
|
418267
|
+
"Example name (minimal | two_room | two_story | coastal | complete | konkan_cottage). konkan_cottage shows `import`ing the furniture + konkan/base packs. Omit to list."
|
|
418268
|
+
)
|
|
417524
418269
|
}
|
|
417525
418270
|
},
|
|
417526
418271
|
async ({ name }) => {
|
|
@@ -417571,10 +418316,112 @@ server.registerTool(
|
|
|
417571
418316
|
return { content: [{ type: "text", text: d.body }] };
|
|
417572
418317
|
}
|
|
417573
418318
|
);
|
|
418319
|
+
function moduleMatchesQuery(name, q) {
|
|
418320
|
+
const mod = MODULES[name];
|
|
418321
|
+
const ex = moduleExports3(mod.source);
|
|
418322
|
+
const hay = [
|
|
418323
|
+
name,
|
|
418324
|
+
mod.summary,
|
|
418325
|
+
...ex.assets.flatMap((a) => [a.id, a.name ?? "", a.category ?? ""]),
|
|
418326
|
+
...ex.components.flatMap((c) => [c.name, c.goal ?? ""])
|
|
418327
|
+
].join(" ").toLowerCase();
|
|
418328
|
+
return q.toLowerCase().split(/\s+/).filter(Boolean).some((w) => hay.includes(w));
|
|
418329
|
+
}
|
|
418330
|
+
server.registerTool(
|
|
418331
|
+
"wadi_modules",
|
|
418332
|
+
{
|
|
418333
|
+
title: "List importable Wadi modules (libraries)",
|
|
418334
|
+
description: 'List the bundled Wadi DSL modules a design can `import` \u2014 reusable `.wdl` libraries: asset packs (furniture ids for `item`) and component packs (goal-tagged parts for `use`). Each is importable by name: `import "<name>" as ns`. Pass a `query` to find a module by keyword \u2014 including a component\'s GOAL (e.g. "stairs" or "sit-out") \u2014 then call wadi_module for its exports.',
|
|
418335
|
+
inputSchema: {
|
|
418336
|
+
query: external_exports.string().optional().describe("Optional keywords; matches module name/summary, asset ids, and component names + goals.")
|
|
418337
|
+
}
|
|
418338
|
+
},
|
|
418339
|
+
async ({ query }) => {
|
|
418340
|
+
let names = Object.keys(MODULES);
|
|
418341
|
+
if (!names.length) return { content: [{ type: "text", text: "No modules bundled." }] };
|
|
418342
|
+
if (query && query.trim()) names = names.filter((n2) => moduleMatchesQuery(n2, query.trim()));
|
|
418343
|
+
if (!names.length) {
|
|
418344
|
+
return { content: [{ type: "text", text: `No modules match "${query}". Try wadi_modules with no query.` }] };
|
|
418345
|
+
}
|
|
418346
|
+
const list = names.map((n2) => `- ${n2} \u2014 ${MODULES[n2].summary}`).join("\n");
|
|
418347
|
+
return {
|
|
418348
|
+
content: [
|
|
418349
|
+
{
|
|
418350
|
+
type: "text",
|
|
418351
|
+
text: (query ? `Modules matching "${query}":
|
|
418352
|
+
` : "Importable modules (call wadi_module for exports):\n") + list + '\n\nThen: `import "<name>" as ns` and `item ns."<asset-id>"` / `use ns.<Component>`.'
|
|
418353
|
+
}
|
|
418354
|
+
]
|
|
418355
|
+
};
|
|
418356
|
+
}
|
|
418357
|
+
);
|
|
418358
|
+
server.registerTool(
|
|
418359
|
+
"wadi_module",
|
|
418360
|
+
{
|
|
418361
|
+
title: "Show a Wadi module's exports",
|
|
418362
|
+
description: 'Show what a bundled Wadi module exports so you can use it: ASSETS (ids + real-world dimensions + category, placed with `item ns."<id>"`) and COMPONENTS (name + GOAL + params, stamped with `use ns.<Name> at (x,y) with { param = \u2026 }`). Import first: `import "<name>" as ns`. An optional query keyword-filters both assets and components (by id/name/category/goal).',
|
|
418363
|
+
inputSchema: {
|
|
418364
|
+
name: external_exports.string().describe("Module name (e.g. std-furniture, konkan/base). Call wadi_modules to list."),
|
|
418365
|
+
query: external_exports.string().optional().describe("Optional keyword to filter exports by id/name/category/goal.")
|
|
418366
|
+
}
|
|
418367
|
+
},
|
|
418368
|
+
async ({ name, query }) => {
|
|
418369
|
+
const mod = MODULES[name];
|
|
418370
|
+
if (!mod) {
|
|
418371
|
+
return {
|
|
418372
|
+
content: [{ type: "text", text: `No module "${name}". Available: ${Object.keys(MODULES).join(", ")}` }],
|
|
418373
|
+
isError: true
|
|
418374
|
+
};
|
|
418375
|
+
}
|
|
418376
|
+
const ex = moduleExports3(mod.source);
|
|
418377
|
+
let assets = ex.assets;
|
|
418378
|
+
let components = ex.components;
|
|
418379
|
+
if (query && query.trim()) {
|
|
418380
|
+
const q = query.trim().toLowerCase();
|
|
418381
|
+
assets = assets.filter(
|
|
418382
|
+
(a) => a.id.toLowerCase().includes(q) || (a.name ?? "").toLowerCase().includes(q) || (a.category ?? "").toLowerCase().includes(q)
|
|
418383
|
+
);
|
|
418384
|
+
components = components.filter(
|
|
418385
|
+
(c) => c.name.toLowerCase().includes(q) || (c.goal ?? "").toLowerCase().includes(q)
|
|
418386
|
+
);
|
|
418387
|
+
}
|
|
418388
|
+
if (!assets.length && !components.length) {
|
|
418389
|
+
return { content: [{ type: "text", text: `Module "${name}": nothing${query ? ` matches "${query}"` : ""}.` }] };
|
|
418390
|
+
}
|
|
418391
|
+
const lines = [`Module "${name}" \u2014 ${mod.summary}`, `Import: \`import "${name}" as ns\``, ""];
|
|
418392
|
+
if (components.length) {
|
|
418393
|
+
lines.push("Components (use ns.<Name>):");
|
|
418394
|
+
for (const c of components) {
|
|
418395
|
+
const params = c.params.map((p) => `${p.name}${p.default !== void 0 ? `=${p.default}` : ""}`).join(", ");
|
|
418396
|
+
lines.push(` ${c.name}${c.goal ? ` \u2014 goal: "${c.goal}"` : ""}${params ? ` (params: ${params})` : ""}`);
|
|
418397
|
+
}
|
|
418398
|
+
const c0 = components[0];
|
|
418399
|
+
const p0 = c0.params[0];
|
|
418400
|
+
lines.push(` e.g. \`use ns.${c0.name} at (x, y)${p0 ? ` with { ${p0.name} = ${p0.default ?? 0} }` : ""}\``, "");
|
|
418401
|
+
}
|
|
418402
|
+
if (assets.length) {
|
|
418403
|
+
const byCat = /* @__PURE__ */ new Map();
|
|
418404
|
+
for (const a of assets) {
|
|
418405
|
+
const c = a.category ?? "Other";
|
|
418406
|
+
(byCat.get(c) ?? byCat.set(c, []).get(c)).push(a);
|
|
418407
|
+
}
|
|
418408
|
+
lines.push('Assets (item ns."<id>"):');
|
|
418409
|
+
for (const [cat, items] of byCat) {
|
|
418410
|
+
lines.push(` ${cat}:`);
|
|
418411
|
+
for (const a of items) {
|
|
418412
|
+
const [w, h, d] = a.dimensions;
|
|
418413
|
+
lines.push(` ${a.id} \u2014 ${a.name ?? a.id} (${w}\xD7${h}\xD7${d} m)`);
|
|
418414
|
+
}
|
|
418415
|
+
}
|
|
418416
|
+
lines.push(` e.g. \`item ns."${assets[0].id}" at (x, y)\` or in a room \`item ns."${assets[0].id}" anchor center\``);
|
|
418417
|
+
}
|
|
418418
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
418419
|
+
}
|
|
418420
|
+
);
|
|
417574
418421
|
var transport = new StdioServerTransport();
|
|
417575
418422
|
await server.connect(transport);
|
|
417576
418423
|
console.error(
|
|
417577
|
-
"[wadi-mcp] ready \u2014 tools: wadi_check, wadi_preview, wadi_examples, wadi_reference, wadi_view_3d, wadi_capture_3d"
|
|
418424
|
+
"[wadi-mcp] ready \u2014 tools: wadi_check, wadi_preview, wadi_examples, wadi_reference, wadi_modules, wadi_module, wadi_view_3d, wadi_capture_3d"
|
|
417578
418425
|
);
|
|
417579
418426
|
/*! Bundled license information:
|
|
417580
418427
|
|