@almadar/core 10.129.0 → 11.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/behavior-package.d.ts +49 -11
- package/dist/behavior-package.js +1 -1
- package/dist/{orbital-CkFdDS9f.d.ts → builders-BdgbY7Th.d.ts} +5828 -6917
- package/dist/builders.d.ts +6 -6
- package/dist/builders.js +7 -6
- package/dist/{bus-CcbB__oo.d.ts → bus-C0hFDNFR.d.ts} +262 -354
- package/dist/chunk-347APWFM.js +286 -0
- package/dist/chunk-347APWFM.js.map +1 -0
- package/dist/chunk-5WQ3U7NJ.js +2363 -0
- package/dist/chunk-5WQ3U7NJ.js.map +1 -0
- package/dist/chunk-5YTPYMPZ.js +99 -0
- package/dist/chunk-5YTPYMPZ.js.map +1 -0
- package/dist/chunk-66Q5VX2F.js +3810 -0
- package/dist/chunk-66Q5VX2F.js.map +1 -0
- package/dist/chunk-7GHJU5WI.js +39 -0
- package/dist/chunk-7GHJU5WI.js.map +1 -0
- package/dist/chunk-B4MNHGBP.js +8 -0
- package/dist/chunk-B4MNHGBP.js.map +1 -0
- package/dist/chunk-E4T2MQAV.js +24 -0
- package/dist/chunk-E4T2MQAV.js.map +1 -0
- package/dist/chunk-ENOCKYGA.js +412 -0
- package/dist/chunk-ENOCKYGA.js.map +1 -0
- package/dist/chunk-FGT5OS2Y.js +918 -0
- package/dist/chunk-FGT5OS2Y.js.map +1 -0
- package/dist/chunk-GF7KCLNR.js +3284 -0
- package/dist/chunk-GF7KCLNR.js.map +1 -0
- package/dist/chunk-PNGFWLHD.js +1567 -0
- package/dist/chunk-PNGFWLHD.js.map +1 -0
- package/dist/{chunk-X4SC7FGF.js → chunk-RGACZEYC.js} +99 -96
- package/dist/chunk-RGACZEYC.js.map +1 -0
- package/dist/{chunk-RYPVOI6H.js → chunk-SNZYN7UA.js} +2541 -433
- package/dist/{chunk-RYPVOI6H.js.map → chunk-SNZYN7UA.js.map} +1 -1
- package/dist/{chunk-KDMV222Q.js → chunk-TDNQT3M3.js} +304 -373
- package/dist/chunk-TDNQT3M3.js.map +1 -0
- package/dist/chunk-VG7BRFUD.js +152 -0
- package/dist/chunk-VG7BRFUD.js.map +1 -0
- package/dist/chunk-Z7BI7DE7.js +1293 -0
- package/dist/chunk-Z7BI7DE7.js.map +1 -0
- package/dist/{domain-Dz3jP-UM.d.ts → domain-Cpmja5ak.d.ts} +55 -55
- package/dist/{effect-CiEVLsZz.d.ts → effect-DZaXwSAz.d.ts} +283 -453
- package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-1HpXgeBc.d.ts} +656 -851
- package/dist/{expression-D0Fs0riG.d.ts → expression-DirYKz-f.d.ts} +5 -13
- package/dist/factory/index.d.ts +7 -144
- package/dist/factory/index.js +8 -8
- package/dist/factory-runtime/index.d.ts +7 -6
- package/dist/factory-runtime/index.js +527 -8
- package/dist/factory-runtime/index.js.map +1 -1
- package/dist/fixtures.d.ts +9 -11
- package/dist/fixtures.js +12 -8
- package/dist/fixtures.js.map +1 -1
- package/dist/i18n/index.d.ts +15 -19
- package/dist/i18n/index.js +2 -1
- package/dist/{index-BC-Jycqj.d.ts → index-D7SxwNdv.d.ts} +34 -734
- package/dist/index.d.ts +92 -247
- package/dist/index.js +322 -986
- package/dist/index.js.map +1 -1
- package/dist/kernel-wire.d.ts +3 -3
- package/dist/kernel-wire.js +3 -79
- package/dist/kernel-wire.js.map +1 -1
- package/dist/language/constructs.json +22 -2
- package/dist/language/program-types.json +203 -22
- package/dist/language/protocols.json +46 -0
- package/dist/language/ui-vocabulary.json +1697 -0
- package/dist/language/validation-codes.json +1222 -1212
- package/dist/language/vocabulary.json +44 -8
- package/dist/language-data.d.ts +7 -4
- package/dist/language-data.js +20 -14
- package/dist/language-data.js.map +1 -1
- package/dist/patterns/component-mapping.json +11 -1
- package/dist/patterns/definitions.d.ts +2 -2
- package/dist/patterns/definitions.js +1 -1
- package/dist/patterns/event-contracts.json +1 -15
- package/dist/patterns/game-font-families.json +13 -0
- package/dist/patterns/index.d.ts +24 -120
- package/dist/patterns/index.js +3 -3
- package/dist/patterns/pattern-tile-geometry.json +1065 -0
- package/dist/patterns/patterns-registry.json +2539 -431
- package/dist/patterns/registry.json +2539 -431
- package/dist/trait-sRjIivFq.d.ts +3519 -0
- package/dist/types/index.d.ts +9 -10
- package/dist/types/index.js +11 -5
- package/dist/{types-DGwrltUF.d.ts → types-C6_yPMpn.d.ts} +3 -3
- package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
- package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
- package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
- package/fixtures/events-wire/navigate-1/response.json +8 -5
- package/fixtures/events-wire/navigate-2/response.json +11 -8
- package/fixtures/events-wire/navigate-3/response.json +14 -11
- package/fixtures/events-wire/navigate-back/response.json +7 -4
- package/fixtures/events-wire/render-ui-3/response.json +12 -9
- package/fixtures/events-wire/render-ui-clear/response.json +0 -7
- package/fixtures/events-wire/sse-stream/response.json +0 -20
- package/fixtures/events-wire/sse-stream/stream.json +0 -20
- package/fixtures/events-wire/stateless-traits/response.json +14 -5
- package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
- package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
- package/fixtures/kernel-wire/golden/rollback.json +793 -0
- package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
- package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
- package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
- package/fixtures/kernel-wire/played-step.json +136 -0
- package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
- package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
- package/fixtures/kernel-wire/scripts/rollback.json +53 -0
- package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
- package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
- package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
- package/package.json +28 -19
- package/dist/builders-DmZE5By0.d.ts +0 -2663
- package/dist/chunk-45I2O4SJ.js +0 -4646
- package/dist/chunk-45I2O4SJ.js.map +0 -1
- package/dist/chunk-6LR43Z5E.js +0 -3061
- package/dist/chunk-6LR43Z5E.js.map +0 -1
- package/dist/chunk-GIUA3NUJ.js +0 -809
- package/dist/chunk-GIUA3NUJ.js.map +0 -1
- package/dist/chunk-GTY53NS5.js +0 -1908
- package/dist/chunk-GTY53NS5.js.map +0 -1
- package/dist/chunk-JOHDVS6J.js +0 -1614
- package/dist/chunk-JOHDVS6J.js.map +0 -1
- package/dist/chunk-KDMV222Q.js.map +0 -1
- package/dist/chunk-QRHJUS3D.js +0 -23
- package/dist/chunk-QRHJUS3D.js.map +0 -1
- package/dist/chunk-QUOTJULD.js +0 -4009
- package/dist/chunk-QUOTJULD.js.map +0 -1
- package/dist/chunk-V5VNGRVU.js +0 -66
- package/dist/chunk-V5VNGRVU.js.map +0 -1
- package/dist/chunk-X4SC7FGF.js.map +0 -1
- package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
- package/dist/mock/index.d.ts +0 -153
- package/dist/mock/index.js +0 -190
- package/dist/mock/index.js.map +0 -1
- package/dist/schema-T5RT5s6H.d.ts +0 -282
- package/dist/state-machine/index.d.ts +0 -359
- package/dist/state-machine/index.js +0 -3
- package/dist/state-machine/index.js.map +0 -1
|
@@ -0,0 +1,918 @@
|
|
|
1
|
+
import { SExprListSchema, SExprSchema, SExprDataSchema } from './chunk-347APWFM.js';
|
|
2
|
+
import { EntityIdSchema } from './chunk-VG7BRFUD.js';
|
|
3
|
+
import { JsonValueSchema } from './chunk-7GHJU5WI.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
|
|
6
|
+
var FieldProjectionSchema = z.object({
|
|
7
|
+
type: z.string().min(1),
|
|
8
|
+
field: z.string().min(1).optional()
|
|
9
|
+
});
|
|
10
|
+
var NUM_WIDTH_TAGS = ["i8", "i16", "i32", "u8", "u16", "u32", "u64", "f32"];
|
|
11
|
+
var FIELD_TYPES = [
|
|
12
|
+
"string",
|
|
13
|
+
"number",
|
|
14
|
+
"int",
|
|
15
|
+
...NUM_WIDTH_TAGS,
|
|
16
|
+
"boolean",
|
|
17
|
+
"date",
|
|
18
|
+
"timestamp",
|
|
19
|
+
"datetime",
|
|
20
|
+
"instant",
|
|
21
|
+
"email",
|
|
22
|
+
"url",
|
|
23
|
+
"phone",
|
|
24
|
+
"uuid",
|
|
25
|
+
"image",
|
|
26
|
+
"money",
|
|
27
|
+
"file",
|
|
28
|
+
"bytes",
|
|
29
|
+
"array",
|
|
30
|
+
"object",
|
|
31
|
+
"enum",
|
|
32
|
+
"relation",
|
|
33
|
+
"trait",
|
|
34
|
+
"orbital",
|
|
35
|
+
"behavior",
|
|
36
|
+
"slot",
|
|
37
|
+
"pattern",
|
|
38
|
+
"node",
|
|
39
|
+
"event",
|
|
40
|
+
"EventAddress",
|
|
41
|
+
"CallKey",
|
|
42
|
+
"SExpr",
|
|
43
|
+
"union",
|
|
44
|
+
"tuple",
|
|
45
|
+
"field"
|
|
46
|
+
];
|
|
47
|
+
var SEMANTIC_STRING_TYPES = ["email", "url", "phone", "uuid", "image"];
|
|
48
|
+
function isSemanticStringType(type) {
|
|
49
|
+
return SEMANTIC_STRING_TYPES.includes(type);
|
|
50
|
+
}
|
|
51
|
+
var FieldTagSchema = z.enum(FIELD_TYPES);
|
|
52
|
+
function isTypeVariable(type) {
|
|
53
|
+
return /^\$.+$/.test(type);
|
|
54
|
+
}
|
|
55
|
+
var TypeVariableSchema = z.custom(
|
|
56
|
+
(v) => typeof v === "string" && isTypeVariable(v),
|
|
57
|
+
{ message: "a type variable is `$<name>`" }
|
|
58
|
+
);
|
|
59
|
+
var FieldTypeSchema = z.union([FieldTagSchema, TypeVariableSchema]);
|
|
60
|
+
var TYPE_POSITION_ONLY = [
|
|
61
|
+
"Map",
|
|
62
|
+
"any",
|
|
63
|
+
"asset",
|
|
64
|
+
"bool",
|
|
65
|
+
"component",
|
|
66
|
+
"duration",
|
|
67
|
+
"entity",
|
|
68
|
+
"f64",
|
|
69
|
+
"float",
|
|
70
|
+
"i64",
|
|
71
|
+
"icon",
|
|
72
|
+
"null",
|
|
73
|
+
"secret",
|
|
74
|
+
"void"
|
|
75
|
+
];
|
|
76
|
+
var RelationCardinalitySchema = z.enum([
|
|
77
|
+
"one",
|
|
78
|
+
"many",
|
|
79
|
+
"one-to-many",
|
|
80
|
+
"many-to-one",
|
|
81
|
+
"many-to-many"
|
|
82
|
+
]);
|
|
83
|
+
var RelationConfigSchema = z.object({
|
|
84
|
+
entity: z.string().min(1, "Target entity is required"),
|
|
85
|
+
entityId: EntityIdSchema.optional(),
|
|
86
|
+
field: z.string().optional(),
|
|
87
|
+
cardinality: RelationCardinalitySchema.optional(),
|
|
88
|
+
onDelete: z.enum(["cascade", "nullify", "restrict"]).optional(),
|
|
89
|
+
display: z.string().min(1).optional(),
|
|
90
|
+
// Legacy compatibility fields
|
|
91
|
+
foreignKey: z.string().optional(),
|
|
92
|
+
target: z.string().optional(),
|
|
93
|
+
type: RelationCardinalitySchema.optional()
|
|
94
|
+
}).transform((data) => {
|
|
95
|
+
const cardinality = data.cardinality || data.type;
|
|
96
|
+
const normalized = {
|
|
97
|
+
entity: data.entity || data.target || "",
|
|
98
|
+
...data.entityId !== void 0 ? { entityId: data.entityId } : {},
|
|
99
|
+
...cardinality !== void 0 ? { cardinality } : {},
|
|
100
|
+
...data.field !== void 0 ? { field: data.field } : {},
|
|
101
|
+
...data.onDelete !== void 0 ? { onDelete: data.onDelete } : {},
|
|
102
|
+
...data.display !== void 0 ? { display: data.display } : {}
|
|
103
|
+
};
|
|
104
|
+
return normalized;
|
|
105
|
+
});
|
|
106
|
+
var SEMANTIC_STRING_PATTERNS = {
|
|
107
|
+
email: "^[^\\s@]+@[^\\s@.]+\\.[^\\s@]+$",
|
|
108
|
+
url: "^https?://[^\\s]+$",
|
|
109
|
+
phone: "^[+]?[\\d\\s().-]{7,}$",
|
|
110
|
+
uuid: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
|
|
111
|
+
};
|
|
112
|
+
var EMAIL_RE = new RegExp(SEMANTIC_STRING_PATTERNS.email);
|
|
113
|
+
var URL_RE = new RegExp(SEMANTIC_STRING_PATTERNS.url);
|
|
114
|
+
var PHONE_RE = new RegExp(SEMANTIC_STRING_PATTERNS.phone);
|
|
115
|
+
var UUID_RE = new RegExp(SEMANTIC_STRING_PATTERNS.uuid);
|
|
116
|
+
function isEmailValue(value) {
|
|
117
|
+
return EMAIL_RE.test(value);
|
|
118
|
+
}
|
|
119
|
+
function isUrlValue(value) {
|
|
120
|
+
return URL_RE.test(value);
|
|
121
|
+
}
|
|
122
|
+
function isPhoneValue(value) {
|
|
123
|
+
return PHONE_RE.test(value);
|
|
124
|
+
}
|
|
125
|
+
function isUuidValue(value) {
|
|
126
|
+
return UUID_RE.test(value);
|
|
127
|
+
}
|
|
128
|
+
var FileValueSchema = z.object({
|
|
129
|
+
name: z.string(),
|
|
130
|
+
url: z.string(),
|
|
131
|
+
mimeType: z.string(),
|
|
132
|
+
sizeBytes: z.number()
|
|
133
|
+
});
|
|
134
|
+
function isFileValue(value) {
|
|
135
|
+
return FileValueSchema.safeParse(value).success;
|
|
136
|
+
}
|
|
137
|
+
function isSemanticStringValue(type, value) {
|
|
138
|
+
switch (type) {
|
|
139
|
+
case "email":
|
|
140
|
+
return isEmailValue(value);
|
|
141
|
+
case "url":
|
|
142
|
+
case "image":
|
|
143
|
+
return isUrlValue(value);
|
|
144
|
+
case "phone":
|
|
145
|
+
return isPhoneValue(value);
|
|
146
|
+
case "uuid":
|
|
147
|
+
return isUuidValue(value);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function isTypeVariableField(f) {
|
|
151
|
+
return isTypeVariable(f.type);
|
|
152
|
+
}
|
|
153
|
+
var FIELD_TYPE_ALIASES = {
|
|
154
|
+
text: "string",
|
|
155
|
+
float: "number",
|
|
156
|
+
ts: "timestamp"
|
|
157
|
+
};
|
|
158
|
+
var EntityFieldSchema = z.lazy(() => {
|
|
159
|
+
const baseFieldShape = {
|
|
160
|
+
name: z.string().min(1, "Field name is required").optional(),
|
|
161
|
+
required: z.boolean().optional(),
|
|
162
|
+
nullable: z.boolean().optional(),
|
|
163
|
+
additionalProperties: EntityFieldSchema.optional(),
|
|
164
|
+
primaryKey: z.boolean().optional(),
|
|
165
|
+
default: JsonValueSchema.optional(),
|
|
166
|
+
min: z.number().optional(),
|
|
167
|
+
max: z.number().optional(),
|
|
168
|
+
properties: z.record(z.string(), EntityFieldSchema).optional(),
|
|
169
|
+
intrinsic: z.boolean().optional(),
|
|
170
|
+
derived: JsonValueSchema.optional(),
|
|
171
|
+
description: z.string().optional(),
|
|
172
|
+
synonyms: z.string().optional(),
|
|
173
|
+
mock: z.string().optional(),
|
|
174
|
+
mergedFrom: z.string().optional(),
|
|
175
|
+
projectedFrom: FieldProjectionSchema.optional()
|
|
176
|
+
};
|
|
177
|
+
function scalarVariant(t) {
|
|
178
|
+
return z.object({
|
|
179
|
+
...baseFieldShape,
|
|
180
|
+
type: z.literal(t),
|
|
181
|
+
values: z.array(z.string()).optional()
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return z.preprocess(
|
|
185
|
+
(input) => {
|
|
186
|
+
if (input === null || typeof input !== "object" || !("type" in input) || typeof input.type !== "string") {
|
|
187
|
+
return input;
|
|
188
|
+
}
|
|
189
|
+
const obj = input;
|
|
190
|
+
const next = { ...obj };
|
|
191
|
+
const aliased = FIELD_TYPE_ALIASES[obj.type];
|
|
192
|
+
if (aliased !== void 0) next.type = aliased;
|
|
193
|
+
if (next.enum !== void 0 && next.values === void 0) {
|
|
194
|
+
next.values = next.enum;
|
|
195
|
+
}
|
|
196
|
+
delete next.enum;
|
|
197
|
+
return next;
|
|
198
|
+
},
|
|
199
|
+
z.union([
|
|
200
|
+
z.object({ ...baseFieldShape, type: TypeVariableSchema }),
|
|
201
|
+
z.discriminatedUnion("type", [
|
|
202
|
+
scalarVariant("string"),
|
|
203
|
+
scalarVariant("number"),
|
|
204
|
+
scalarVariant("int"),
|
|
205
|
+
scalarVariant("i8"),
|
|
206
|
+
scalarVariant("i16"),
|
|
207
|
+
scalarVariant("i32"),
|
|
208
|
+
scalarVariant("u8"),
|
|
209
|
+
scalarVariant("u16"),
|
|
210
|
+
scalarVariant("u32"),
|
|
211
|
+
scalarVariant("u64"),
|
|
212
|
+
scalarVariant("f32"),
|
|
213
|
+
scalarVariant("boolean"),
|
|
214
|
+
scalarVariant("date"),
|
|
215
|
+
scalarVariant("timestamp"),
|
|
216
|
+
scalarVariant("datetime"),
|
|
217
|
+
scalarVariant("instant"),
|
|
218
|
+
scalarVariant("email"),
|
|
219
|
+
scalarVariant("url"),
|
|
220
|
+
scalarVariant("phone"),
|
|
221
|
+
scalarVariant("uuid"),
|
|
222
|
+
scalarVariant("image"),
|
|
223
|
+
scalarVariant("trait"),
|
|
224
|
+
scalarVariant("orbital"),
|
|
225
|
+
scalarVariant("behavior"),
|
|
226
|
+
scalarVariant("slot"),
|
|
227
|
+
scalarVariant("pattern"),
|
|
228
|
+
scalarVariant("node"),
|
|
229
|
+
scalarVariant("event"),
|
|
230
|
+
scalarVariant("EventAddress"),
|
|
231
|
+
scalarVariant("CallKey"),
|
|
232
|
+
scalarVariant("money"),
|
|
233
|
+
scalarVariant("file"),
|
|
234
|
+
scalarVariant("bytes"),
|
|
235
|
+
scalarVariant("SExpr"),
|
|
236
|
+
// Enum variant — REQUIRES non-empty values.
|
|
237
|
+
z.object({
|
|
238
|
+
...baseFieldShape,
|
|
239
|
+
type: z.literal("enum"),
|
|
240
|
+
values: z.array(z.string()).min(1, "Enum field requires a non-empty `values` array")
|
|
241
|
+
}),
|
|
242
|
+
// Union variant — tagged struct union; values = variant names,
|
|
243
|
+
// per-variant shapes in `properties` (absent on named recursion).
|
|
244
|
+
z.object({
|
|
245
|
+
...baseFieldShape,
|
|
246
|
+
type: z.literal("union"),
|
|
247
|
+
values: z.array(z.string()).min(1, "Union field requires a non-empty `values` array")
|
|
248
|
+
}),
|
|
249
|
+
// Relation variant — REQUIRES relation config.
|
|
250
|
+
z.object({
|
|
251
|
+
...baseFieldShape,
|
|
252
|
+
type: z.literal("relation"),
|
|
253
|
+
relation: RelationConfigSchema
|
|
254
|
+
}),
|
|
255
|
+
// Array variant — items optional to match relaxed TS shape.
|
|
256
|
+
z.object({
|
|
257
|
+
...baseFieldShape,
|
|
258
|
+
type: z.literal("array"),
|
|
259
|
+
items: EntityFieldSchema.optional()
|
|
260
|
+
}),
|
|
261
|
+
// Field-reference variant — `items` is the type the named field must have.
|
|
262
|
+
z.object({
|
|
263
|
+
...baseFieldShape,
|
|
264
|
+
type: z.literal("field"),
|
|
265
|
+
record: z.string().optional(),
|
|
266
|
+
items: EntityFieldSchema.optional()
|
|
267
|
+
}),
|
|
268
|
+
// Tuple variant — slots in `properties`, keyed by index (at least one).
|
|
269
|
+
z.object({
|
|
270
|
+
...baseFieldShape,
|
|
271
|
+
type: z.literal("tuple"),
|
|
272
|
+
properties: z.record(z.string(), EntityFieldSchema).refine((p) => Object.keys(p).length > 0, "Tuple field requires slots in `properties`")
|
|
273
|
+
}),
|
|
274
|
+
// Object variant — fixed-key struct (`properties`) or dynamic-key
|
|
275
|
+
// map (`Map K V`, uniform value schema in `items`).
|
|
276
|
+
z.object({
|
|
277
|
+
...baseFieldShape,
|
|
278
|
+
type: z.literal("object"),
|
|
279
|
+
items: EntityFieldSchema.optional(),
|
|
280
|
+
record: z.string().optional(),
|
|
281
|
+
values: z.array(z.string()).optional()
|
|
282
|
+
})
|
|
283
|
+
])
|
|
284
|
+
])
|
|
285
|
+
);
|
|
286
|
+
});
|
|
287
|
+
var FieldSchema = EntityFieldSchema;
|
|
288
|
+
var ENTITY_ROLES = [
|
|
289
|
+
"player",
|
|
290
|
+
"enemy",
|
|
291
|
+
"npc",
|
|
292
|
+
"item",
|
|
293
|
+
"tile",
|
|
294
|
+
"projectile",
|
|
295
|
+
"effect",
|
|
296
|
+
"ui",
|
|
297
|
+
"decoration",
|
|
298
|
+
"vehicle"
|
|
299
|
+
];
|
|
300
|
+
var EntityRoleSchema = z.enum(ENTITY_ROLES);
|
|
301
|
+
var VISUAL_STYLES = ["pixel", "vector", "hd", "1-bit", "isometric"];
|
|
302
|
+
var VisualStyleSchema = z.enum(VISUAL_STYLES);
|
|
303
|
+
var ASSET_DIMENSIONS = ["2d", "3d"];
|
|
304
|
+
var AssetDimensionSchema = z.enum(ASSET_DIMENSIONS);
|
|
305
|
+
var ASSET_ASPECTS = ["1:1", "16:9", "5:7", "8:1", "4:1", "5:3", "1:2"];
|
|
306
|
+
var AssetAspectSchema = z.enum(ASSET_ASPECTS);
|
|
307
|
+
var FX_KINDS = ["slash", "puff", "heal", "trap", "burst"];
|
|
308
|
+
var FxKindSchema = z.enum(FX_KINDS);
|
|
309
|
+
var ANIMATION_NAMES = ["idle", "walk", "skate", "jump", "fall", "attack", "hit", "death"];
|
|
310
|
+
var AnimationNameSchema = z.enum(ANIMATION_NAMES);
|
|
311
|
+
var SPRITE_DIRECTIONS = ["se", "sw", "ne", "nw"];
|
|
312
|
+
var SpriteDirectionSchema = z.enum(SPRITE_DIRECTIONS);
|
|
313
|
+
var SHEET_PROJECTIONS = ["iso", "front", "back", "top", "perspective"];
|
|
314
|
+
var SheetProjectionSchema = z.enum(SHEET_PROJECTIONS);
|
|
315
|
+
var AnimationDefSchema = z.object({
|
|
316
|
+
row: z.number().int().nonnegative(),
|
|
317
|
+
frames: z.number().int().positive(),
|
|
318
|
+
frameRate: z.number().positive(),
|
|
319
|
+
loop: z.boolean()
|
|
320
|
+
});
|
|
321
|
+
var SpriteSheetAtlasSchema = z.object({
|
|
322
|
+
unit: z.string().optional(),
|
|
323
|
+
type: z.string().optional(),
|
|
324
|
+
frameWidth: z.number().positive(),
|
|
325
|
+
frameHeight: z.number().positive(),
|
|
326
|
+
columns: z.number().int().positive(),
|
|
327
|
+
rows: z.number().int().positive(),
|
|
328
|
+
directions: z.array(SpriteDirectionSchema),
|
|
329
|
+
sheets: z.partialRecord(SpriteDirectionSchema, z.string()),
|
|
330
|
+
animations: z.record(z.string(), AnimationDefSchema),
|
|
331
|
+
projections: z.object({
|
|
332
|
+
iso: z.partialRecord(SpriteDirectionSchema, z.string()).optional(),
|
|
333
|
+
front: z.string().optional(),
|
|
334
|
+
back: z.string().optional(),
|
|
335
|
+
top: z.string().optional(),
|
|
336
|
+
perspective: z.string().optional()
|
|
337
|
+
}).optional()
|
|
338
|
+
});
|
|
339
|
+
var SubTextureSchema = z.object({
|
|
340
|
+
x: z.number().nonnegative(),
|
|
341
|
+
y: z.number().nonnegative(),
|
|
342
|
+
width: z.number().positive(),
|
|
343
|
+
height: z.number().positive(),
|
|
344
|
+
frameX: z.number().optional(),
|
|
345
|
+
frameY: z.number().optional(),
|
|
346
|
+
frameWidth: z.number().positive().optional(),
|
|
347
|
+
frameHeight: z.number().positive().optional()
|
|
348
|
+
});
|
|
349
|
+
var TextureAtlasSchema = z.object({
|
|
350
|
+
imagePath: z.string(),
|
|
351
|
+
subTextures: z.record(z.string(), SubTextureSchema)
|
|
352
|
+
});
|
|
353
|
+
var TilesheetSchema = z.object({
|
|
354
|
+
imagePath: z.string(),
|
|
355
|
+
tileWidth: z.number().positive(),
|
|
356
|
+
tileHeight: z.number().positive(),
|
|
357
|
+
columns: z.number().int().positive(),
|
|
358
|
+
rows: z.number().int().positive(),
|
|
359
|
+
margin: z.number().nonnegative().optional(),
|
|
360
|
+
spacing: z.number().nonnegative().optional(),
|
|
361
|
+
names: z.array(z.string()).optional()
|
|
362
|
+
});
|
|
363
|
+
var SemanticAssetRefSchema = z.object({
|
|
364
|
+
role: z.string().min(1),
|
|
365
|
+
category: z.string().min(1),
|
|
366
|
+
animations: z.array(z.string()).optional(),
|
|
367
|
+
style: VisualStyleSchema.optional(),
|
|
368
|
+
variant: z.string().optional(),
|
|
369
|
+
dimension: AssetDimensionSchema.optional(),
|
|
370
|
+
aspect: AssetAspectSchema.optional()
|
|
371
|
+
});
|
|
372
|
+
var AssetSchema = SemanticAssetRefSchema.extend({
|
|
373
|
+
url: z.string(),
|
|
374
|
+
atlas: z.string().optional(),
|
|
375
|
+
sprite: z.string().optional(),
|
|
376
|
+
name: z.string().optional(),
|
|
377
|
+
thumbnailUrl: z.string().optional(),
|
|
378
|
+
prompt: z.string().optional(),
|
|
379
|
+
choreography: z.record(z.string(), z.array(z.string())).optional(),
|
|
380
|
+
fxKind: FxKindSchema.optional()
|
|
381
|
+
});
|
|
382
|
+
z.object({
|
|
383
|
+
pack: z.string().min(1),
|
|
384
|
+
version: z.number().int().nonnegative(),
|
|
385
|
+
base: z.string(),
|
|
386
|
+
assets: z.record(z.string(), AssetSchema)
|
|
387
|
+
});
|
|
388
|
+
var AssetCatalogEntrySchema = z.object({
|
|
389
|
+
url: z.string(),
|
|
390
|
+
name: z.string(),
|
|
391
|
+
category: z.string(),
|
|
392
|
+
kind: z.enum(["image", "spritesheet", "audio", "scene", "portrait", "model", "other"]),
|
|
393
|
+
thumbnailUrl: z.string().optional(),
|
|
394
|
+
dimension: AssetDimensionSchema.optional(),
|
|
395
|
+
aspect: AssetAspectSchema.optional()
|
|
396
|
+
});
|
|
397
|
+
var AssetCatalogSchema = z.array(AssetCatalogEntrySchema);
|
|
398
|
+
var ScenePosSchema = z.object({
|
|
399
|
+
x: z.number(),
|
|
400
|
+
y: z.number(),
|
|
401
|
+
z: z.number().optional()
|
|
402
|
+
});
|
|
403
|
+
var CAMERA_MODES = ["isometric", "perspective", "top-down", "front", "follow", "chase"];
|
|
404
|
+
var CameraModeSchema = z.enum(CAMERA_MODES);
|
|
405
|
+
var CameraSchema = z.object({
|
|
406
|
+
pos: ScenePosSchema.optional(),
|
|
407
|
+
target: ScenePosSchema.optional(),
|
|
408
|
+
zoom: z.number().optional(),
|
|
409
|
+
fov: z.number().optional(),
|
|
410
|
+
mode: CameraModeSchema.optional(),
|
|
411
|
+
azimuth: z.number().optional(),
|
|
412
|
+
elevation: z.number().optional(),
|
|
413
|
+
controls: z.boolean().optional()
|
|
414
|
+
});
|
|
415
|
+
function createAssetKey(role, category) {
|
|
416
|
+
return `${role}:${category}`;
|
|
417
|
+
}
|
|
418
|
+
function parseAssetKey(key) {
|
|
419
|
+
const parts = key.split(":");
|
|
420
|
+
if (parts.length !== 2) return null;
|
|
421
|
+
return { role: parts[0], category: parts[1] };
|
|
422
|
+
}
|
|
423
|
+
function getDefaultAnimationsForRole(role) {
|
|
424
|
+
switch (role) {
|
|
425
|
+
case "player":
|
|
426
|
+
return ["idle", "run", "jump", "fall", "attack", "hurt", "die"];
|
|
427
|
+
case "enemy":
|
|
428
|
+
return ["idle", "walk", "attack", "hurt", "die"];
|
|
429
|
+
case "npc":
|
|
430
|
+
return ["idle", "walk", "talk"];
|
|
431
|
+
case "item":
|
|
432
|
+
return ["idle", "collected"];
|
|
433
|
+
case "tile":
|
|
434
|
+
return ["static"];
|
|
435
|
+
case "projectile":
|
|
436
|
+
return ["fly", "hit", "expire"];
|
|
437
|
+
case "effect":
|
|
438
|
+
return ["play"];
|
|
439
|
+
case "ui":
|
|
440
|
+
return ["normal", "hover", "pressed", "disabled"];
|
|
441
|
+
case "decoration":
|
|
442
|
+
return ["idle"];
|
|
443
|
+
case "vehicle":
|
|
444
|
+
return ["idle", "move", "brake"];
|
|
445
|
+
default:
|
|
446
|
+
return ["idle"];
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function validateAssetAnimations(assetRef, requiredAnimations) {
|
|
450
|
+
const provided = assetRef.animations || [];
|
|
451
|
+
const missing = requiredAnimations.filter((anim) => !provided.includes(anim));
|
|
452
|
+
return { valid: missing.length === 0, missing };
|
|
453
|
+
}
|
|
454
|
+
var SPRITE_SHEET_LAYOUT = {
|
|
455
|
+
frameWidth: 256,
|
|
456
|
+
frameHeight: 256,
|
|
457
|
+
columns: 8,
|
|
458
|
+
rows: 5,
|
|
459
|
+
background: "#20202E"
|
|
460
|
+
};
|
|
461
|
+
var DEFAULT_UNIT_ANIMATION_ROWS = [
|
|
462
|
+
{ name: "idle", row: 0, frames: 4, loop: true, frameRate: 6 },
|
|
463
|
+
{ name: "walk", row: 1, frames: 8, loop: true, frameRate: 10 },
|
|
464
|
+
{ name: "attack", row: 2, frames: 6, loop: false, frameRate: 12 },
|
|
465
|
+
{ name: "hit", row: 3, frames: 3, loop: false, frameRate: 8 },
|
|
466
|
+
{ name: "death", row: 4, frames: 6, loop: false, frameRate: 8 }
|
|
467
|
+
];
|
|
468
|
+
function defaultUnitAtlas(sheets, opts) {
|
|
469
|
+
const directions = opts?.directions ?? SPRITE_DIRECTIONS.filter((direction) => sheets[direction] !== void 0);
|
|
470
|
+
const animations = {};
|
|
471
|
+
for (const { name, ...def } of DEFAULT_UNIT_ANIMATION_ROWS) {
|
|
472
|
+
animations[name] = def;
|
|
473
|
+
}
|
|
474
|
+
return {
|
|
475
|
+
frameWidth: SPRITE_SHEET_LAYOUT.frameWidth,
|
|
476
|
+
frameHeight: SPRITE_SHEET_LAYOUT.frameHeight,
|
|
477
|
+
columns: SPRITE_SHEET_LAYOUT.columns,
|
|
478
|
+
rows: SPRITE_SHEET_LAYOUT.rows,
|
|
479
|
+
directions,
|
|
480
|
+
sheets,
|
|
481
|
+
animations
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
var MANIFEST_ENTRY_KINDS = ["model", "image", "spritesheet", "audio", "json"];
|
|
485
|
+
var ManifestEntryKindSchema = z.enum(MANIFEST_ENTRY_KINDS);
|
|
486
|
+
var SoundEntrySchema = z.object({
|
|
487
|
+
path: z.union([z.string(), z.array(z.string())]),
|
|
488
|
+
volume: z.number().optional(),
|
|
489
|
+
loop: z.boolean().optional(),
|
|
490
|
+
poolSize: z.number().optional(),
|
|
491
|
+
autostart: z.boolean().optional(),
|
|
492
|
+
crossfade: z.boolean().optional(),
|
|
493
|
+
crossfadeDurationMs: z.number().optional()
|
|
494
|
+
});
|
|
495
|
+
var AudioManifestSchema = z.record(z.string(), SoundEntrySchema);
|
|
496
|
+
var MANIFEST_CANVAS_AFFINITIES = ["isometric", "hex", "flat", "side", "3d", "none"];
|
|
497
|
+
var ManifestCanvasAffinitySchema = z.enum(MANIFEST_CANVAS_AFFINITIES);
|
|
498
|
+
var MANIFEST_SOURCE_CATALOGS = ["kenny", "kekec-assets", "iram-assets", "trait-wars-assets", "kflow-assets"];
|
|
499
|
+
var ManifestSourceCatalogSchema = z.enum(MANIFEST_SOURCE_CATALOGS);
|
|
500
|
+
var MANIFEST_ASSET_LICENSES = ["CC0", "proprietary"];
|
|
501
|
+
var ManifestAssetLicenseSchema = z.enum(MANIFEST_ASSET_LICENSES);
|
|
502
|
+
var ManifestFrameSpecSchema = z.union([
|
|
503
|
+
z.object({ kind: z.literal("iso-tile"), w: z.number(), h: z.number() }),
|
|
504
|
+
z.object({ kind: z.literal("sprite-sheet"), frame: z.number(), cols: z.number(), rows: z.number() }),
|
|
505
|
+
z.string().min(1),
|
|
506
|
+
z.null()
|
|
507
|
+
]);
|
|
508
|
+
var ManifestEntrySchema = z.object({
|
|
509
|
+
url: z.string(),
|
|
510
|
+
name: z.string(),
|
|
511
|
+
category: z.string(),
|
|
512
|
+
kind: ManifestEntryKindSchema,
|
|
513
|
+
width: z.number(),
|
|
514
|
+
height: z.number(),
|
|
515
|
+
canvasAffinity: ManifestCanvasAffinitySchema,
|
|
516
|
+
genreAffinity: z.array(z.string()),
|
|
517
|
+
swapClass: z.string(),
|
|
518
|
+
sourceCatalog: ManifestSourceCatalogSchema,
|
|
519
|
+
frameSpec: ManifestFrameSpecSchema,
|
|
520
|
+
license: ManifestAssetLicenseSchema.optional()
|
|
521
|
+
});
|
|
522
|
+
var ASSET_CATALOG_ENTRY_KINDS = [
|
|
523
|
+
"image",
|
|
524
|
+
"spritesheet",
|
|
525
|
+
"audio",
|
|
526
|
+
"scene",
|
|
527
|
+
"portrait",
|
|
528
|
+
"model",
|
|
529
|
+
"other"
|
|
530
|
+
];
|
|
531
|
+
var MODEL_URL_EXTENSIONS = [".glb", ".gltf"];
|
|
532
|
+
var AUDIO_URL_EXTENSIONS = [".mp3", ".ogg", ".wav"];
|
|
533
|
+
function urlEndsWithAny(url, extensions) {
|
|
534
|
+
const lower = url.toLowerCase();
|
|
535
|
+
return extensions.some((extension) => lower.endsWith(extension));
|
|
536
|
+
}
|
|
537
|
+
function deriveManifestAssetKind(entry) {
|
|
538
|
+
if (typeof entry.frameSpec === "string" || entry.frameSpec?.kind === "sprite-sheet" || entry.kind === "spritesheet") return "spritesheet";
|
|
539
|
+
if (entry.kind === "model" || urlEndsWithAny(entry.url, MODEL_URL_EXTENSIONS)) return "model";
|
|
540
|
+
if (entry.kind === "audio" || urlEndsWithAny(entry.url, AUDIO_URL_EXTENSIONS)) return "audio";
|
|
541
|
+
if (entry.kind === "image") return "image";
|
|
542
|
+
return "other";
|
|
543
|
+
}
|
|
544
|
+
function parseAssetAspectRatio(aspect) {
|
|
545
|
+
const [w, h] = aspect.split(":").map(Number);
|
|
546
|
+
return w / h;
|
|
547
|
+
}
|
|
548
|
+
var ASSET_ASPECT_RATIO_TOLERANCE = 0.01;
|
|
549
|
+
function deriveManifestAssetAspect(width, height) {
|
|
550
|
+
if (width <= 0 || height <= 0) return void 0;
|
|
551
|
+
const ratio = width / height;
|
|
552
|
+
for (const aspect of ASSET_ASPECTS) {
|
|
553
|
+
const expected = parseAssetAspectRatio(aspect);
|
|
554
|
+
if (Math.abs(ratio / expected - 1) <= ASSET_ASPECT_RATIO_TOLERANCE) return aspect;
|
|
555
|
+
}
|
|
556
|
+
return void 0;
|
|
557
|
+
}
|
|
558
|
+
var ABSOLUTE_URL_PATTERN = /^[a-z][a-z0-9+.-]*:\/\//i;
|
|
559
|
+
function resolveManifestUrl(url, cdnPrefix) {
|
|
560
|
+
if (!cdnPrefix || ABSOLUTE_URL_PATTERN.test(url)) return url;
|
|
561
|
+
const prefix = cdnPrefix.endsWith("/") ? cdnPrefix : `${cdnPrefix}/`;
|
|
562
|
+
const rest = url.startsWith("/") ? url.slice(1) : url;
|
|
563
|
+
return `${prefix}${rest}`;
|
|
564
|
+
}
|
|
565
|
+
function manifestToAssetCatalog(entries, opts) {
|
|
566
|
+
return entries.map((entry) => {
|
|
567
|
+
const kind = deriveManifestAssetKind(entry);
|
|
568
|
+
const dimension = entry.canvasAffinity === "3d" ? "3d" : "2d";
|
|
569
|
+
const aspect = deriveManifestAssetAspect(entry.width, entry.height);
|
|
570
|
+
const url = resolveManifestUrl(entry.url, opts?.cdnPrefix);
|
|
571
|
+
const catalogEntry = {
|
|
572
|
+
url,
|
|
573
|
+
name: entry.name,
|
|
574
|
+
category: entry.category,
|
|
575
|
+
kind,
|
|
576
|
+
dimension
|
|
577
|
+
};
|
|
578
|
+
if (aspect !== void 0) catalogEntry.aspect = aspect;
|
|
579
|
+
if (kind === "image" || kind === "spritesheet") catalogEntry.thumbnailUrl = url;
|
|
580
|
+
return catalogEntry;
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
var ASSET_QUERY_TYPE_PREFIX = "t:";
|
|
584
|
+
var ASSET_QUERY_LABEL_PREFIX = "l:";
|
|
585
|
+
function isAssetCatalogEntryKind(value) {
|
|
586
|
+
return ASSET_CATALOG_ENTRY_KINDS.some((kind) => kind === value);
|
|
587
|
+
}
|
|
588
|
+
function parseAssetQueryTokens(q) {
|
|
589
|
+
const tokens = q.trim().length > 0 ? q.trim().split(/\s+/) : [];
|
|
590
|
+
const textParts = [];
|
|
591
|
+
const labels = [];
|
|
592
|
+
let kind;
|
|
593
|
+
let unknownKind = false;
|
|
594
|
+
for (const token of tokens) {
|
|
595
|
+
if (token.startsWith(ASSET_QUERY_TYPE_PREFIX)) {
|
|
596
|
+
const value = token.slice(ASSET_QUERY_TYPE_PREFIX.length);
|
|
597
|
+
if (isAssetCatalogEntryKind(value)) kind = value;
|
|
598
|
+
else unknownKind = true;
|
|
599
|
+
} else if (token.startsWith(ASSET_QUERY_LABEL_PREFIX)) {
|
|
600
|
+
const value = token.slice(ASSET_QUERY_LABEL_PREFIX.length);
|
|
601
|
+
if (value.length > 0) labels.push(value);
|
|
602
|
+
} else {
|
|
603
|
+
textParts.push(token);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
return { text: textParts.join(" "), kind, labels, unknownKind };
|
|
607
|
+
}
|
|
608
|
+
function parseAssetQuery(q) {
|
|
609
|
+
const parsed = parseAssetQueryTokens(q);
|
|
610
|
+
return parsed.kind === void 0 ? { text: parsed.text, labels: parsed.labels } : { text: parsed.text, kind: parsed.kind, labels: parsed.labels };
|
|
611
|
+
}
|
|
612
|
+
function matchAssetQuery(entry, q) {
|
|
613
|
+
const parsed = parseAssetQueryTokens(q);
|
|
614
|
+
if (parsed.unknownKind) return false;
|
|
615
|
+
if (parsed.kind !== void 0 && entry.kind !== parsed.kind) return false;
|
|
616
|
+
for (const label of parsed.labels) {
|
|
617
|
+
if (entry.category.toLowerCase() !== label.toLowerCase()) return false;
|
|
618
|
+
}
|
|
619
|
+
if (parsed.text.length > 0) {
|
|
620
|
+
const haystack = `${entry.name} ${entry.category}`.toLowerCase();
|
|
621
|
+
if (!haystack.includes(parsed.text.toLowerCase())) return false;
|
|
622
|
+
}
|
|
623
|
+
return true;
|
|
624
|
+
}
|
|
625
|
+
var EntityPersistenceSchema = z.enum([
|
|
626
|
+
"persistent",
|
|
627
|
+
"runtime"
|
|
628
|
+
]);
|
|
629
|
+
var OrbitalEntitySchema = z.object({
|
|
630
|
+
name: z.string().min(1, "Entity name is required"),
|
|
631
|
+
// V4 arena id (`EntityDefinition.id`); declared so the strip-mode zod gate
|
|
632
|
+
// carries an imported entity's id through instead of erasing it.
|
|
633
|
+
id: EntityIdSchema.optional(),
|
|
634
|
+
persistence: EntityPersistenceSchema.default("persistent"),
|
|
635
|
+
shared: z.boolean().optional(),
|
|
636
|
+
// Must stay in step with the Rust serde field (`EntityDefinition.identity`,
|
|
637
|
+
// orbital-core/src/schema/types.rs). `z.object()` STRIPS unknown keys rather
|
|
638
|
+
// than rejecting them, so a Rust-only field works on the compiled path and
|
|
639
|
+
// silently vanishes on the interpreter path.
|
|
640
|
+
identity: z.boolean().optional(),
|
|
641
|
+
// Rust twin: `EntityDefinition.browser`.
|
|
642
|
+
browser: z.boolean().optional(),
|
|
643
|
+
// Rust twin: `EntityDefinition.store`.
|
|
644
|
+
store: z.string().min(1).optional(),
|
|
645
|
+
// Same "must stay in step with Rust serde" hazard as `identity` above —
|
|
646
|
+
// these four mirror `EntityDefinition.{read,create,update,delete}_policy`.
|
|
647
|
+
// Rust has no `rename_all` on this struct, so the wire key IS snake_case
|
|
648
|
+
// (unlike this file's other camelCase fields, which are Rust-side-absent
|
|
649
|
+
// and so never hit this cross-language constraint — see `visual_prompt`
|
|
650
|
+
// just below for the existing precedent).
|
|
651
|
+
read_policy: SExprSchema.optional(),
|
|
652
|
+
create_policy: SExprSchema.optional(),
|
|
653
|
+
update_policy: SExprSchema.optional(),
|
|
654
|
+
delete_policy: SExprSchema.optional(),
|
|
655
|
+
// Snake_case for the same cross-language reason as the four policies above.
|
|
656
|
+
access_waivers: z.object({
|
|
657
|
+
read: z.string().optional(),
|
|
658
|
+
create: z.string().optional(),
|
|
659
|
+
update: z.string().optional(),
|
|
660
|
+
delete: z.string().optional()
|
|
661
|
+
}).optional(),
|
|
662
|
+
invariants: SExprListSchema.optional(),
|
|
663
|
+
indexes: z.array(z.object({ fields: z.array(z.string()), orderBy: z.string().optional() }).strict()).optional(),
|
|
664
|
+
collection: z.string().optional(),
|
|
665
|
+
fields: z.array(EntityFieldSchema),
|
|
666
|
+
instances: z.array(z.record(z.string(), JsonValueSchema)).optional(),
|
|
667
|
+
localeInstances: z.record(z.string(), z.array(z.record(z.string(), JsonValueSchema))).optional(),
|
|
668
|
+
timestamps: z.boolean().optional(),
|
|
669
|
+
softDelete: z.boolean().optional(),
|
|
670
|
+
description: z.string().optional(),
|
|
671
|
+
visual_prompt: z.string().optional(),
|
|
672
|
+
assetRef: SemanticAssetRefSchema.optional()
|
|
673
|
+
});
|
|
674
|
+
var EntitySchema = OrbitalEntitySchema;
|
|
675
|
+
function instancesForLocale(entity, locale) {
|
|
676
|
+
const localized = locale !== void 0 ? entity.localeInstances?.[locale] : void 0;
|
|
677
|
+
return localized ?? entity.instances ?? [];
|
|
678
|
+
}
|
|
679
|
+
function isRuntimeEntity(entity) {
|
|
680
|
+
return entity.persistence === "runtime";
|
|
681
|
+
}
|
|
682
|
+
function isClientResident(entity) {
|
|
683
|
+
return entity.persistence === "runtime" || entity.browser === true;
|
|
684
|
+
}
|
|
685
|
+
function storesRowsInBrowser(entity) {
|
|
686
|
+
return entity.browser === true;
|
|
687
|
+
}
|
|
688
|
+
function persistenceModeAllowsOverrides(persistence, dataBearing = false) {
|
|
689
|
+
return persistence === "persistent" || persistence === void 0 || persistence === "runtime" && dataBearing;
|
|
690
|
+
}
|
|
691
|
+
var FieldValueSchema = JsonValueSchema;
|
|
692
|
+
function isFieldValue(value) {
|
|
693
|
+
if (value === null) return true;
|
|
694
|
+
const kind = typeof value;
|
|
695
|
+
if (kind === "string" || kind === "number" || kind === "boolean") return true;
|
|
696
|
+
if (Array.isArray(value)) return value.every((item) => isFieldValue(item));
|
|
697
|
+
if (kind === "object" && typeof value === "object" && !(value instanceof Date)) {
|
|
698
|
+
return Object.values(value).every((item) => isFieldValue(item));
|
|
699
|
+
}
|
|
700
|
+
return false;
|
|
701
|
+
}
|
|
702
|
+
var EntityRowSchema = z.object({ id: z.string().optional() }).catchall(FieldValueSchema);
|
|
703
|
+
var UI_SLOTS = [
|
|
704
|
+
// App slots
|
|
705
|
+
"main",
|
|
706
|
+
"sidebar",
|
|
707
|
+
"dock",
|
|
708
|
+
// Right inline panel that pushes main (narrow screens: a drawer)
|
|
709
|
+
"modal",
|
|
710
|
+
"drawer",
|
|
711
|
+
"overlay",
|
|
712
|
+
"center",
|
|
713
|
+
"toast",
|
|
714
|
+
"floating",
|
|
715
|
+
"system",
|
|
716
|
+
// For invisible system components (InputListener, CollisionDetector)
|
|
717
|
+
"content",
|
|
718
|
+
"screen",
|
|
719
|
+
// Game HUD slots
|
|
720
|
+
"hud",
|
|
721
|
+
"hud-top",
|
|
722
|
+
"hud-bottom",
|
|
723
|
+
"hud.health",
|
|
724
|
+
"hud.score",
|
|
725
|
+
"hud.inventory",
|
|
726
|
+
"hud.stamina",
|
|
727
|
+
// Game overlay slots
|
|
728
|
+
"overlay.inventory",
|
|
729
|
+
"overlay.dialogue",
|
|
730
|
+
"overlay.menu",
|
|
731
|
+
"overlay.pause"
|
|
732
|
+
];
|
|
733
|
+
var RENDERED_SLOTS = UI_SLOTS.filter(
|
|
734
|
+
(slot) => !slot.includes(".") && slot !== "hud" && slot !== "screen"
|
|
735
|
+
);
|
|
736
|
+
var UISlotSchema = z.enum(UI_SLOTS);
|
|
737
|
+
function isRowObject(value) {
|
|
738
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date);
|
|
739
|
+
}
|
|
740
|
+
function isPersistBatchOperation(value) {
|
|
741
|
+
if (!Array.isArray(value) || typeof value[1] !== "string") return false;
|
|
742
|
+
switch (value[0]) {
|
|
743
|
+
case "create":
|
|
744
|
+
return value.length === 2 || value.length === 3 && isRowObject(value[2]);
|
|
745
|
+
case "update":
|
|
746
|
+
return typeof value[2] === "string" && (value.length === 3 || value.length === 4 && isRowObject(value[3]));
|
|
747
|
+
case "delete":
|
|
748
|
+
return value.length === 3 && typeof value[2] === "string";
|
|
749
|
+
default:
|
|
750
|
+
return false;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
var EFFECT_OPERATORS = [
|
|
754
|
+
"render-ui",
|
|
755
|
+
"navigate",
|
|
756
|
+
"navigate-back",
|
|
757
|
+
"emit",
|
|
758
|
+
"set",
|
|
759
|
+
"persist",
|
|
760
|
+
"call-service",
|
|
761
|
+
"cancel-call",
|
|
762
|
+
"oauth-authorize",
|
|
763
|
+
"oauth-connection-status",
|
|
764
|
+
"oauth-connection-forget",
|
|
765
|
+
"random-bytes",
|
|
766
|
+
"credential-status",
|
|
767
|
+
"credential-forget",
|
|
768
|
+
"credential-connect",
|
|
769
|
+
"credential-list",
|
|
770
|
+
"credential-set",
|
|
771
|
+
"credential-remove",
|
|
772
|
+
"credential-test",
|
|
773
|
+
"credential-mode",
|
|
774
|
+
"credential-rotate",
|
|
775
|
+
"access-check",
|
|
776
|
+
"spawn",
|
|
777
|
+
"despawn",
|
|
778
|
+
"do",
|
|
779
|
+
"fetch",
|
|
780
|
+
"fetch-stream",
|
|
781
|
+
"if",
|
|
782
|
+
"when",
|
|
783
|
+
"let",
|
|
784
|
+
"log",
|
|
785
|
+
"wait",
|
|
786
|
+
"notify",
|
|
787
|
+
"send-server",
|
|
788
|
+
"prob/seed",
|
|
789
|
+
"prob/condition",
|
|
790
|
+
"workspace/write-orbital",
|
|
791
|
+
"workspace/write-file",
|
|
792
|
+
"workspace/write-schema",
|
|
793
|
+
"workspace/write-plan",
|
|
794
|
+
"workspace/archive-orbital",
|
|
795
|
+
"behavior/catalog",
|
|
796
|
+
"behavior/describe",
|
|
797
|
+
"behavior/source",
|
|
798
|
+
"behavior/resolve",
|
|
799
|
+
"behavior/dependencies",
|
|
800
|
+
"behavior/packages",
|
|
801
|
+
"program/read",
|
|
802
|
+
"program/print",
|
|
803
|
+
"program/eval",
|
|
804
|
+
"program/validate",
|
|
805
|
+
"program/prove",
|
|
806
|
+
"program/os-grants",
|
|
807
|
+
"program/compose",
|
|
808
|
+
"program/step",
|
|
809
|
+
"program/inputs",
|
|
810
|
+
"program/dispatch",
|
|
811
|
+
"program/open",
|
|
812
|
+
"program/close",
|
|
813
|
+
"program/live",
|
|
814
|
+
"program/self",
|
|
815
|
+
"program/tick",
|
|
816
|
+
"program/resolve-rows",
|
|
817
|
+
"persist/read-named",
|
|
818
|
+
"mem/arena-new",
|
|
819
|
+
"mem/arena-drop",
|
|
820
|
+
"mem/alloc",
|
|
821
|
+
"mem/free",
|
|
822
|
+
"mem/borrow",
|
|
823
|
+
"mem/release",
|
|
824
|
+
"mem/write",
|
|
825
|
+
"mem/freeze",
|
|
826
|
+
"mem/atomic-load",
|
|
827
|
+
"mem/atomic-store",
|
|
828
|
+
"mem/atomic-add",
|
|
829
|
+
"mem/atomic-cas",
|
|
830
|
+
"kernel/queue-front",
|
|
831
|
+
"kernel/queue-back",
|
|
832
|
+
"ffi/call"
|
|
833
|
+
];
|
|
834
|
+
var EFFECT_OPERATOR_FAMILIES = [
|
|
835
|
+
"agent",
|
|
836
|
+
"os",
|
|
837
|
+
"browser",
|
|
838
|
+
"llm",
|
|
839
|
+
"session",
|
|
840
|
+
"trace",
|
|
841
|
+
"memory",
|
|
842
|
+
"kv",
|
|
843
|
+
"application",
|
|
844
|
+
"audio",
|
|
845
|
+
"auth",
|
|
846
|
+
"identity",
|
|
847
|
+
"theme"
|
|
848
|
+
];
|
|
849
|
+
var SERVER_REPORTED_EFFECTS = [
|
|
850
|
+
"set",
|
|
851
|
+
"persist",
|
|
852
|
+
"call-service",
|
|
853
|
+
"fetch",
|
|
854
|
+
"fetch-stream",
|
|
855
|
+
"emit"
|
|
856
|
+
];
|
|
857
|
+
var EffectShapeSchema = z.array(SExprDataSchema).min(1).refine(
|
|
858
|
+
(arr) => typeof arr[0] === "string",
|
|
859
|
+
{ message: "Effect must be an S-expression with a string operator as first element" }
|
|
860
|
+
);
|
|
861
|
+
var EffectSchema = z.custom(
|
|
862
|
+
(value) => EffectShapeSchema.safeParse(value).success,
|
|
863
|
+
{ message: "Effect must be an S-expression with a string operator as first element" }
|
|
864
|
+
);
|
|
865
|
+
function isEffect(value) {
|
|
866
|
+
return Array.isArray(value) && value.length > 0 && typeof value[0] === "string";
|
|
867
|
+
}
|
|
868
|
+
var isSExprEffect = isEffect;
|
|
869
|
+
function set(binding, value) {
|
|
870
|
+
return ["set", binding, value];
|
|
871
|
+
}
|
|
872
|
+
function emit(event, payload) {
|
|
873
|
+
return payload ? ["emit", event, payload] : ["emit", event];
|
|
874
|
+
}
|
|
875
|
+
function navigate(path, params, options) {
|
|
876
|
+
if (params && options) return ["navigate", path, params, options];
|
|
877
|
+
return params ? ["navigate", path, params] : ["navigate", path];
|
|
878
|
+
}
|
|
879
|
+
function navigateBack() {
|
|
880
|
+
return ["navigate-back"];
|
|
881
|
+
}
|
|
882
|
+
function renderUI(target, pattern) {
|
|
883
|
+
return ["render-ui", target, pattern];
|
|
884
|
+
}
|
|
885
|
+
function persist(action, entity, data) {
|
|
886
|
+
if (action === "create" || action === "upsert" || action === "update") {
|
|
887
|
+
return ["persist", action, entity, data];
|
|
888
|
+
}
|
|
889
|
+
return data ? ["persist", action, entity, data] : ["persist", action, entity];
|
|
890
|
+
}
|
|
891
|
+
function callService(serviceName, config) {
|
|
892
|
+
return ["call-service", serviceName, config];
|
|
893
|
+
}
|
|
894
|
+
function spawn(entity, initialState) {
|
|
895
|
+
return initialState ? ["spawn", entity, initialState] : ["spawn", entity];
|
|
896
|
+
}
|
|
897
|
+
function despawn(entityId) {
|
|
898
|
+
return ["despawn", entityId];
|
|
899
|
+
}
|
|
900
|
+
function doEffects(...effects) {
|
|
901
|
+
return ["do", ...effects];
|
|
902
|
+
}
|
|
903
|
+
var PatternConfigSchema = z.custom(
|
|
904
|
+
(value) => value === null || typeof value === "object" && value !== null && !Array.isArray(value),
|
|
905
|
+
{ message: "Expected a pattern config object or null" }
|
|
906
|
+
);
|
|
907
|
+
var PatternObjectSchema = z.custom(
|
|
908
|
+
(value) => typeof value === "object" && value !== null && !Array.isArray(value),
|
|
909
|
+
{ message: "Expected a pattern config object" }
|
|
910
|
+
);
|
|
911
|
+
var ResolvedPatternPropsSchema = z.custom(
|
|
912
|
+
(value) => typeof value === "object" && value !== null && !Array.isArray(value),
|
|
913
|
+
{ message: "Expected a resolved pattern props object" }
|
|
914
|
+
);
|
|
915
|
+
|
|
916
|
+
export { ANIMATION_NAMES, ASSET_ASPECTS, ASSET_DIMENSIONS, AnimationDefSchema, AnimationNameSchema, AssetAspectSchema, AssetCatalogEntrySchema, AssetCatalogSchema, AssetDimensionSchema, AssetSchema, AudioManifestSchema, CAMERA_MODES, CameraModeSchema, CameraSchema, DEFAULT_UNIT_ANIMATION_ROWS, EFFECT_OPERATORS, EFFECT_OPERATOR_FAMILIES, ENTITY_ROLES, EffectSchema, EntityFieldSchema, EntityPersistenceSchema, EntityRoleSchema, EntityRowSchema, EntitySchema, FIELD_TYPES, FX_KINDS, FieldProjectionSchema, FieldSchema, FieldTagSchema, FieldTypeSchema, FieldValueSchema, FileValueSchema, FxKindSchema, MANIFEST_ASSET_LICENSES, MANIFEST_CANVAS_AFFINITIES, MANIFEST_ENTRY_KINDS, MANIFEST_SOURCE_CATALOGS, ManifestAssetLicenseSchema, ManifestCanvasAffinitySchema, ManifestEntryKindSchema, ManifestEntrySchema, ManifestFrameSpecSchema, ManifestSourceCatalogSchema, NUM_WIDTH_TAGS, OrbitalEntitySchema, PatternConfigSchema, PatternObjectSchema, RENDERED_SLOTS, RelationConfigSchema, ResolvedPatternPropsSchema, SEMANTIC_STRING_PATTERNS, SEMANTIC_STRING_TYPES, SERVER_REPORTED_EFFECTS, SHEET_PROJECTIONS, SPRITE_DIRECTIONS, SPRITE_SHEET_LAYOUT, ScenePosSchema, SemanticAssetRefSchema, SheetProjectionSchema, SoundEntrySchema, SpriteDirectionSchema, SpriteSheetAtlasSchema, SubTextureSchema, TYPE_POSITION_ONLY, TextureAtlasSchema, TilesheetSchema, TypeVariableSchema, UISlotSchema, UI_SLOTS, VISUAL_STYLES, VisualStyleSchema, callService, createAssetKey, defaultUnitAtlas, despawn, doEffects, emit, getDefaultAnimationsForRole, instancesForLocale, isClientResident, isEffect, isEmailValue, isFieldValue, isFileValue, isPersistBatchOperation, isPhoneValue, isRuntimeEntity, isSExprEffect, isSemanticStringType, isSemanticStringValue, isTypeVariable, isTypeVariableField, isUrlValue, isUuidValue, manifestToAssetCatalog, matchAssetQuery, navigate, navigateBack, parseAssetKey, parseAssetQuery, persist, persistenceModeAllowsOverrides, renderUI, set, spawn, storesRowsInBrowser, validateAssetAnimations };
|
|
917
|
+
//# sourceMappingURL=chunk-FGT5OS2Y.js.map
|
|
918
|
+
//# sourceMappingURL=chunk-FGT5OS2Y.js.map
|