@neocompose/cli 0.72.0 → 0.72.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.
@@ -5059,6 +5059,7 @@ var ProjectSchemaIndex = class {
5059
5059
  */
5060
5060
  resolvedMembers = /* @__PURE__ */ new WeakMap();
5061
5061
  ancestryByClassId = /* @__PURE__ */ new Map();
5062
+ effectivePlacementsByClassId = /* @__PURE__ */ new Map();
5062
5063
  ancestorIdsByClassId = /* @__PURE__ */ new Map();
5063
5064
  get classes() {
5064
5065
  return this.source.classes;
@@ -5114,12 +5115,19 @@ var ProjectSchemaIndex = class {
5114
5115
  return chain;
5115
5116
  }
5116
5117
  effectiveSchemaPlacement(classId, schemaKey) {
5117
- for (const ownerClass of this.inheritanceChain(classId)) {
5118
- if (typeof ownerClass.schema[schemaKey] === "string") {
5119
- return { ownerClass, schemaKey };
5118
+ let placements = this.effectivePlacementsByClassId.get(classId);
5119
+ if (placements === void 0) {
5120
+ const flattened = /* @__PURE__ */ new Map();
5121
+ for (const ownerClass of this.inheritanceChain(classId)) {
5122
+ for (const key of Object.keys(ownerClass.schema)) {
5123
+ if (!flattened.has(key) && typeof ownerClass.schema[key] === "string")
5124
+ flattened.set(key, { ownerClass, schemaKey: key });
5125
+ }
5120
5126
  }
5127
+ this.effectivePlacementsByClassId.set(classId, flattened);
5128
+ placements = flattened;
5121
5129
  }
5122
- return null;
5130
+ return placements.get(schemaKey) ?? null;
5123
5131
  }
5124
5132
  effectiveMemberId(classId, schemaKey) {
5125
5133
  const placement = this.effectiveSchemaPlacement(classId, schemaKey);
@@ -5223,33 +5231,12 @@ function classIndexFor(classes) {
5223
5231
  function memberIndexFor(members) {
5224
5232
  return projectSchemaIndexFor({ classes: NO_CLASSES, members }).membersById;
5225
5233
  }
5226
- function createMergeMemo() {
5227
- const byClasses = /* @__PURE__ */ new WeakMap();
5228
- return (classId, classIndex, memberIndex, compute) => {
5229
- let byMembers = byClasses.get(classIndex);
5230
- if (byMembers === void 0) {
5231
- byMembers = /* @__PURE__ */ new WeakMap();
5232
- byClasses.set(classIndex, byMembers);
5233
- }
5234
- let byClassId = byMembers.get(memberIndex);
5235
- if (byClassId === void 0) {
5236
- byClassId = /* @__PURE__ */ new Map();
5237
- byMembers.set(memberIndex, byClassId);
5238
- }
5239
- const cached = byClassId.get(classId);
5240
- if (cached !== void 0) return [...cached];
5241
- const computed = compute();
5242
- byClassId.set(classId, computed);
5243
- return [...computed];
5244
- };
5245
- }
5246
- var instanceSurfaceMemo = createMergeMemo();
5247
- var storedInstanceMemo = createMergeMemo();
5248
- var readOnlyMemberMemo = createMergeMemo();
5249
- var staticMemberMemo = createMergeMemo();
5250
5234
  function resolveInheritanceChain(classId, classes, draft) {
5251
5235
  return [...indexClasses(classes).inheritanceChain(classId, draft)];
5252
5236
  }
5237
+ function resolveInheritanceChainFromIndex(classId, classIndex, draft) {
5238
+ return resolveChainFromIndex(classId, classIndex, draft);
5239
+ }
5253
5240
  function resolveChainFromIndex(classId, index, draft) {
5254
5241
  const chain = [];
5255
5242
  const visited = /* @__PURE__ */ new Set();
@@ -5303,50 +5290,70 @@ function mergeSchemas(chain) {
5303
5290
  }
5304
5291
  return merged;
5305
5292
  }
5306
- function mergeInstanceSurfaceSchema(classId, classes, members) {
5307
- return instanceSurfaceFromIndex(classId, indexSchema(classes, members));
5308
- }
5309
- function mergeInstanceSurfaceSchemaFromIndexes(classId, classIndex, memberIndex) {
5310
- return instanceSurfaceFromIndexes(classId, classIndex, memberIndex);
5293
+ var resolvedClassSchemas = /* @__PURE__ */ new WeakMap();
5294
+ function resolvedClassSchemaFromIndexes(classId, classIndex, memberIndex) {
5295
+ let byMembers = resolvedClassSchemas.get(classIndex);
5296
+ if (byMembers === void 0) {
5297
+ byMembers = /* @__PURE__ */ new WeakMap();
5298
+ resolvedClassSchemas.set(classIndex, byMembers);
5299
+ }
5300
+ let byClass = byMembers.get(memberIndex);
5301
+ if (byClass === void 0) {
5302
+ byClass = /* @__PURE__ */ new Map();
5303
+ byMembers.set(memberIndex, byClass);
5304
+ }
5305
+ const cached = byClass.get(classId);
5306
+ if (cached !== void 0) return cached;
5307
+ const chain = resolveChainFromIndex(classId, classIndex);
5308
+ const surface = [];
5309
+ const stored = [];
5310
+ const readOnly = [];
5311
+ const statics = [];
5312
+ const surfaceByKey = /* @__PURE__ */ new Map();
5313
+ const storedByKey = /* @__PURE__ */ new Map();
5314
+ for (const entry of mergeSchemas(chain)) {
5315
+ const member = memberIndex.get(entry.memberId);
5316
+ if (member !== void 0 && isStaticMember(member)) {
5317
+ statics.push({ ...entry, declaringClassId: entry.ownerClassId });
5318
+ continue;
5319
+ }
5320
+ surface.push(entry);
5321
+ surfaceByKey.set(entry.schemaKey, entry);
5322
+ if (member !== void 0 && isReadOnlyMember(member)) readOnly.push(entry);
5323
+ else {
5324
+ stored.push(entry);
5325
+ storedByKey.set(entry.schemaKey, entry);
5326
+ }
5327
+ }
5328
+ const node = {
5329
+ surface,
5330
+ stored,
5331
+ readOnly,
5332
+ statics,
5333
+ surfaceByKey,
5334
+ storedByKey
5335
+ };
5336
+ byClass.set(classId, node);
5337
+ return node;
5311
5338
  }
5312
- function instanceSurfaceFromIndex(classId, index) {
5313
- return instanceSurfaceFromIndexes(
5339
+ function resolvedClassSchema(classId, classes, members) {
5340
+ const index = indexSchema(classes, members);
5341
+ return resolvedClassSchemaFromIndexes(
5314
5342
  classId,
5315
5343
  index.classesById,
5316
5344
  index.membersById
5317
5345
  );
5318
5346
  }
5319
- function instanceSurfaceFromIndexes(classId, classIndex, memberIndex) {
5320
- return instanceSurfaceMemo(classId, classIndex, memberIndex, () => {
5321
- const instanceEntries = [];
5322
- for (const entry of mergeSchemas(
5323
- resolveChainFromIndex(classId, classIndex)
5324
- )) {
5325
- const member = memberIndex.get(entry.memberId);
5326
- if (member === void 0 || !isStaticMember(member)) {
5327
- instanceEntries.push(entry);
5328
- }
5329
- }
5330
- return instanceEntries;
5331
- });
5347
+ function mergeInstanceSurfaceSchema(classId, classes, members) {
5348
+ return [...resolvedClassSchema(classId, classes, members).surface];
5349
+ }
5350
+ function mergeInstanceSurfaceSchemaFromIndexes(classId, classIndex, memberIndex) {
5351
+ return [
5352
+ ...resolvedClassSchemaFromIndexes(classId, classIndex, memberIndex).surface
5353
+ ];
5332
5354
  }
5333
5355
  function mergeStoredInstanceSchema(classId, classes, members) {
5334
- const index = indexSchema(classes, members);
5335
- return storedInstanceMemo(
5336
- classId,
5337
- index.classesById,
5338
- index.membersById,
5339
- () => {
5340
- const storedEntries = [];
5341
- for (const entry of instanceSurfaceFromIndex(classId, index)) {
5342
- const member = index.member(entry.memberId);
5343
- if (member === void 0 || !isReadOnlyMember(member)) {
5344
- storedEntries.push(entry);
5345
- }
5346
- }
5347
- return storedEntries;
5348
- }
5349
- );
5356
+ return [...resolvedClassSchema(classId, classes, members).stored];
5350
5357
  }
5351
5358
  function findSchemaPlacement(memberId, classes) {
5352
5359
  return indexClasses(classes).firstSchemaPlacement(memberId);
@@ -5377,6 +5384,9 @@ function resolveMember(member, members) {
5377
5384
  index.resolvedMembers.set(member, resolved);
5378
5385
  return resolved;
5379
5386
  }
5387
+ function resolveMemberFromIndex(member, memberIndex) {
5388
+ return resolveMemberWithIndex(member, () => memberIndex);
5389
+ }
5380
5390
  function resolveMemberWithIndex(member, memberIndex) {
5381
5391
  const chain = [];
5382
5392
  const visited = /* @__PURE__ */ new Set();
@@ -7488,8 +7498,9 @@ function clonePlain(value, path, visiting) {
7488
7498
  );
7489
7499
  }
7490
7500
  const clone = {};
7491
- for (const [key, entry] of Object.entries(value)) {
7492
- const child = clonePlain(entry, `${path}.${key}`, visiting);
7501
+ const record4 = value;
7502
+ for (const key of Object.keys(record4)) {
7503
+ const child = clonePlain(record4[key], `${path}.${key}`, visiting);
7493
7504
  if (key === "__proto__") setOwnField(clone, key, child);
7494
7505
  else clone[key] = child;
7495
7506
  }
@@ -7534,15 +7545,27 @@ var WORLD_SYSTEM_SCHEMA_FIELD_SITES_BY_MEMBER_ID = new Map(
7534
7545
  );
7535
7546
 
7536
7547
  // ../src/models/classes/generics.ts
7548
+ var genericBindingsByClassIndex = /* @__PURE__ */ new WeakMap();
7537
7549
  function resolveGenericEnv(classId, classes, draft) {
7538
- const chain = resolveInheritanceChain(classId, classes, draft);
7539
- const env = /* @__PURE__ */ new Map();
7540
- for (let i = 0; i < chain.length; i++) {
7541
- for (const param of chain[i].genericParams ?? []) {
7542
- env.set(param.id, resolveParamAtChainIndex(chain, i, param.id));
7550
+ const index = classIndexFor(classes);
7551
+ let byClass = genericBindingsByClassIndex.get(index);
7552
+ let bindings = draft === void 0 ? byClass?.get(classId) : void 0;
7553
+ if (bindings === void 0) {
7554
+ const chain = resolveInheritanceChainFromIndex(classId, index, draft);
7555
+ const env = /* @__PURE__ */ new Map();
7556
+ for (let i = 0; i < chain.length; i++) {
7557
+ for (const param of chain[i].genericParams ?? []) {
7558
+ env.set(param.id, resolveParamAtChainIndex(chain, i, param.id));
7559
+ }
7560
+ }
7561
+ bindings = [...env];
7562
+ if (draft === void 0) {
7563
+ byClass ??= /* @__PURE__ */ new Map();
7564
+ byClass.set(classId, bindings);
7565
+ genericBindingsByClassIndex.set(index, byClass);
7543
7566
  }
7544
7567
  }
7545
- return env;
7568
+ return new Map(bindings.map(([id, entry]) => [id, { ...entry }]));
7546
7569
  }
7547
7570
  function resolveParamAtChainIndex(chain, declarerIndex, paramId) {
7548
7571
  let cursor = paramId;
@@ -8281,6 +8304,9 @@ function buildUnorderedListMembershipIndex(values) {
8281
8304
  // ../src/models/members/member-value-id.ts
8282
8305
  var NEO_MEMBER_VALUE_NAMESPACE = "7f2b9c14-58d6-5a07-b3e1-4c9d0a6f8b25";
8283
8306
  var NEO_VIRTUAL_VALUE_NAMESPACE = "3e8ca0b3-e3f1-5d5f-bf2f-6ab5ee3896d0";
8307
+ var virtualNamespaceBytes = parse_default(NEO_VIRTUAL_VALUE_NAMESPACE);
8308
+ var virtualIdentityEncoder = new TextEncoder();
8309
+ var SURROGATE_CODE_UNIT = /[\ud800-\udfff]/;
8284
8310
  function derivedMemberValueId(memberId) {
8285
8311
  return inSystemRecordNamespaceOf(
8286
8312
  memberId,
@@ -8288,12 +8314,11 @@ function derivedMemberValueId(memberId) {
8288
8314
  );
8289
8315
  }
8290
8316
  function virtualValueId(instanceRootId, sourceIdentity2) {
8317
+ const identity = `${withoutSystemRecordIdPrefix(instanceRootId)}:${sourceIdentity2}`;
8318
+ const bytes = SURROGATE_CODE_UNIT.test(identity) ? identity : virtualIdentityEncoder.encode(identity);
8291
8319
  return inSystemRecordNamespaceOf(
8292
8320
  instanceRootId,
8293
- v5_default(
8294
- `${withoutSystemRecordIdPrefix(instanceRootId)}:${sourceIdentity2}`,
8295
- NEO_VIRTUAL_VALUE_NAMESPACE
8296
- )
8321
+ v5_default(bytes, virtualNamespaceBytes)
8297
8322
  );
8298
8323
  }
8299
8324
  function virtualSourceIdentityHead(sourceIdentity2) {
@@ -9047,7 +9072,7 @@ function constructionMembers(classId, context) {
9047
9072
  raw,
9048
9073
  env,
9049
9074
  document2.members,
9050
- resolveMember(raw, document2.members)
9075
+ document2.resolvedMember?.(raw) ?? resolveMember(raw, document2.members)
9051
9076
  ),
9052
9077
  id: raw.id
9053
9078
  };
@@ -10279,11 +10304,11 @@ function withIndexedDefaultValueDocument(document2, options = {}) {
10279
10304
  storedInstanceSchema: (classId) => {
10280
10305
  const cached = cache.storedSchemaByClassId.get(classId);
10281
10306
  if (cached !== void 0) return cached;
10282
- const schema = mergeStoredInstanceSchema(
10307
+ const schema = resolvedClassSchema(
10283
10308
  classId,
10284
10309
  document2.classes,
10285
10310
  document2.members
10286
- );
10311
+ ).stored;
10287
10312
  cache.storedSchemaByClassId.set(classId, schema);
10288
10313
  return schema;
10289
10314
  },
@@ -10308,7 +10333,7 @@ function withIndexedDefaultValueDocument(document2, options = {}) {
10308
10333
  },
10309
10334
  memberDefaultSettlesConstruction: (member, environment) => {
10310
10335
  cache.memberDefaultConstructionChecker ??= createMemberDefaultConstructionChecker({
10311
- ...document2,
10336
+ ...indexed,
10312
10337
  constructors: document2.constructors ?? []
10313
10338
  });
10314
10339
  return cache.memberDefaultConstructionChecker(member, environment);
@@ -11079,7 +11104,9 @@ function cloneDefaultValueForMemberCore(args, sourceValue) {
11079
11104
  members: args.document.members,
11080
11105
  constructors: args.document.constructors ?? [],
11081
11106
  values: args.document.values,
11082
- valueById: args.document.valueById
11107
+ valueById: args.document.valueById,
11108
+ memberById: args.document.memberById,
11109
+ resolvedMember: args.document.resolvedMember
11083
11110
  },
11084
11111
  args.genericEnv
11085
11112
  )) {
@@ -11225,9 +11252,9 @@ function formatDefaultReferenceLocation(memberName, key) {
11225
11252
  return `${memberName}[${key}]`;
11226
11253
  }
11227
11254
  function getSchemaEntryMap(document2, classId) {
11228
- return new Map(
11229
- (document2.storedInstanceSchema?.(classId) ?? mergeStoredInstanceSchema(classId, document2.classes, document2.members)).map((entry) => [entry.schemaKey, entry])
11230
- );
11255
+ const node = resolvedClassSchema(classId, document2.classes, document2.members);
11256
+ const entries = document2.storedInstanceSchema?.(classId);
11257
+ return entries === void 0 || entries === node.stored ? node.storedByKey : new Map(entries.map((entry) => [entry.schemaKey, entry]));
11231
11258
  }
11232
11259
  function cloneMemberValueBase(body) {
11233
11260
  return {
@@ -13002,6 +13029,7 @@ function isRecordValue(value) {
13002
13029
  }
13003
13030
  function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots, rootOwners, rootKinds, traversalExtension) {
13004
13031
  const resolved = /* @__PURE__ */ new Map();
13032
+ let complete = false;
13005
13033
  if (targetValueIds.size === 0) return resolved;
13006
13034
  const valuesById = new Map(document2.values.map((value) => [value.id, value]));
13007
13035
  const membersById = new Map(
@@ -13061,7 +13089,9 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13061
13089
  resolved.set(valueId, member);
13062
13090
  rootOwners?.set(valueId, rootOwner);
13063
13091
  rootKinds?.set(valueId, rootKind);
13092
+ complete = traversalExtension === void 0 && resolved.size === targetValueIds.size;
13064
13093
  }
13094
+ if (complete) return;
13065
13095
  if (visited.has(valueId)) return;
13066
13096
  visited.add(valueId);
13067
13097
  const value = valuesById.get(valueId);
@@ -13108,6 +13138,7 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13108
13138
  );
13109
13139
  const env = overlayStamp(instanceEnv, body.genericBindings);
13110
13140
  for (const entry of merged) {
13141
+ if (complete) break;
13111
13142
  if (entry.memberId === null) continue;
13112
13143
  const childValueId = body.value[entry.schemaKey];
13113
13144
  if (childValueId === void 0) continue;
@@ -13127,6 +13158,7 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13127
13158
  const entryMember = trySubstituteMember(entryMemberRecord, entryEnv);
13128
13159
  if (entryMember === null) return;
13129
13160
  for (const childValueId of Object.values(body.value)) {
13161
+ if (complete) break;
13130
13162
  searchRow(entryMember, childValueId, rootOwner, entryEnv, rootKind);
13131
13163
  }
13132
13164
  return;
@@ -13140,12 +13172,14 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13140
13172
  if (listKindOf(member) === 1 /* Unordered */) {
13141
13173
  if (body.id === null) return;
13142
13174
  for (const row of rowsByContainerId.get(body.id) ?? []) {
13175
+ if (complete) break;
13143
13176
  searchRow(entryMember, row.id, rootOwner, entryEnv, rootKind);
13144
13177
  }
13145
13178
  return;
13146
13179
  }
13147
13180
  if (!Array.isArray(body.value)) return;
13148
13181
  for (const childValueId of body.value) {
13182
+ if (complete) break;
13149
13183
  if (typeof childValueId !== "string") continue;
13150
13184
  searchRow(entryMember, childValueId, rootOwner, entryEnv, rootKind);
13151
13185
  }
@@ -13163,6 +13197,7 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13163
13197
  );
13164
13198
  }
13165
13199
  for (const root of additionalRoots ?? []) {
13200
+ if (complete) break;
13166
13201
  searchRootMember(
13167
13202
  root.member,
13168
13203
  root.valueId,
@@ -13171,10 +13206,12 @@ function resolveOwnerMembersForValues(document2, targetValueIds, additionalRoots
13171
13206
  );
13172
13207
  }
13173
13208
  for (const member of document2.members) {
13209
+ if (complete) break;
13174
13210
  if (typeof member.valueId !== "string") continue;
13175
13211
  searchRootMember(member, member.valueId, "instance");
13176
13212
  }
13177
13213
  for (const member of document2.members) {
13214
+ if (complete) break;
13178
13215
  const defaultBody = member.defaultValue;
13179
13216
  if (defaultBody === void 0) continue;
13180
13217
  if (defaultBody === null) continue;
@@ -21240,6 +21277,7 @@ function memberIdFromSyntheticDefaultValueId(valueId) {
21240
21277
  }
21241
21278
  function resolveLocalizedTextId(value, ctx) {
21242
21279
  ctx.localizedTextDependencies?.add(value);
21280
+ ctx.vm.localizedTextDependencies?.add(value);
21243
21281
  const mainLocale = ctx.vm.localizationConfig?.mainLocale;
21244
21282
  if (mainLocale === void 0) return value;
21245
21283
  const text = ctx.vm.databaseVM?.localizedTextById?.(value) ?? ctx.vm.localizedTexts?.find((candidate) => candidate.id === value) ?? null;
@@ -22753,11 +22791,12 @@ function validateClassConstructorDescriptor(info, ctx, requireEveryRequiredField
22753
22791
  return cacheDescriptor({ schemaClass: schemaClass2, fields, instanceEnv, classArguments: classArguments2 });
22754
22792
  }
22755
22793
  function assertConstructorFieldSlotWritable(args) {
22756
- const surfaceEntry = mergeInstanceSurfaceSchema(
22794
+ const index = evaluatorSchemaIndex(args.ctx);
22795
+ const surfaceEntry = resolvedClassSchemaFromIndexes(
22757
22796
  args.settledClassId,
22758
- args.ctx.vm.classes,
22759
- args.ctx.vm.members
22760
- ).find((entry) => entry.schemaKey === args.schemaKey);
22797
+ index.classesById,
22798
+ index.membersById
22799
+ ).surfaceByKey.get(args.schemaKey);
22761
22800
  if (surfaceEntry === void 0) return;
22762
22801
  if (isReadOnlyMember(evalMemberById(args.ctx.vm, surfaceEntry.memberId)) !== true) {
22763
22802
  return;
@@ -25872,12 +25911,25 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
25872
25911
  const active = /* @__PURE__ */ new Set();
25873
25912
  const clonedBySourceId = /* @__PURE__ */ new Map();
25874
25913
  ctx.onUnattributableValueRead?.(`class-clone:${sourceId}`);
25875
- const constructorArgumentCandidates = evaluatorValues(ctx);
25914
+ const priorRuntimeRows = [...ctx.__runtimeSessionValues.values()];
25915
+ const priorOverlayRows = [...ctx.__valueOverlay?.values() ?? []];
25916
+ const priorPersistedRows = ctx.__valueOverlay instanceof LazyValueOverlay ? ctx.__valueOverlay.sourceRowsSnapshot() : ctx.vm.values;
25917
+ const priorRemovedIds = new Set(ctx.__removedValueIds);
25876
25918
  let constructorArgumentReferenceCounts = null;
25877
25919
  function constructorArgumentReferenceCount(valueId) {
25878
25920
  if (constructorArgumentReferenceCounts === null) {
25879
25921
  constructorArgumentReferenceCounts = /* @__PURE__ */ new Map();
25880
- for (const candidate of constructorArgumentCandidates) {
25922
+ const shadowedIds = /* @__PURE__ */ new Set();
25923
+ const candidates = [];
25924
+ for (const row of [...priorRuntimeRows, ...priorOverlayRows]) {
25925
+ shadowedIds.add(row.id);
25926
+ if (!priorRemovedIds.has(row.id)) candidates.push(row);
25927
+ }
25928
+ for (const row of priorPersistedRows) {
25929
+ if (!shadowedIds.has(row.id) && !priorRemovedIds.has(row.id))
25930
+ candidates.push(row);
25931
+ }
25932
+ for (const candidate of candidates) {
25881
25933
  for (const argument2 of ownedConstructorArgumentValues(candidate, ctx)) {
25882
25934
  constructorArgumentReferenceCounts.set(
25883
25935
  argument2.id,
@@ -26065,9 +26117,18 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
26065
26117
  ).id;
26066
26118
  });
26067
26119
  ctx.onUnattributableValueRead?.(containerEntriesRead(sourceRow.id));
26068
- for (const child of evaluatorValues(ctx)) {
26069
- if (child.containerId !== sourceRow.id) continue;
26070
- cloneRow2(child, entryMember, id, entryTypeInfo);
26120
+ for (const childId of evaluatorUnorderedListEntryIds(
26121
+ sourceRow.id,
26122
+ ctx
26123
+ )) {
26124
+ if (typeof childId !== "string") continue;
26125
+ const child = evalValueById(
26126
+ ctx,
26127
+ childId,
26128
+ ctx.__runtimeSessionValues,
26129
+ ctx.__valueOverlay
26130
+ );
26131
+ if (child !== null) cloneRow2(child, entryMember, id, entryTypeInfo);
26071
26132
  }
26072
26133
  }
26073
26134
  }
@@ -27380,12 +27441,12 @@ function collectReturnStatements(statements) {
27380
27441
  var SourceText = class {
27381
27442
  text;
27382
27443
  lineStarts;
27444
+ #lastPositionLine = 0;
27383
27445
  constructor(text) {
27384
27446
  this.text = text;
27385
27447
  const starts = [0];
27386
- for (let index = 0; index < text.length; index++) {
27387
- if (text.charCodeAt(index) === 10) starts.push(index + 1);
27388
- }
27448
+ for (let index = text.indexOf("\n"); index !== -1; index = text.indexOf("\n", index + 1))
27449
+ starts.push(index + 1);
27389
27450
  this.lineStarts = starts;
27390
27451
  }
27391
27452
  get lineCount() {
@@ -27393,6 +27454,11 @@ var SourceText = class {
27393
27454
  }
27394
27455
  positionAt(rawOffset) {
27395
27456
  const offset = clamp(rawOffset, 0, this.text.length);
27457
+ const previousLine = this.#lastPositionLine;
27458
+ const previousStart = this.lineStarts[previousLine];
27459
+ const nextStart = this.lineStarts[previousLine + 1];
27460
+ if (offset >= previousStart && (nextStart === void 0 || offset < nextStart))
27461
+ return { line: previousLine, character: offset - previousStart };
27396
27462
  let low = 0;
27397
27463
  let high = this.lineStarts.length;
27398
27464
  while (low < high) {
@@ -27402,6 +27468,7 @@ var SourceText = class {
27402
27468
  else low = middle + 1;
27403
27469
  }
27404
27470
  const line = Math.max(0, low - 1);
27471
+ this.#lastPositionLine = line;
27405
27472
  return {
27406
27473
  line,
27407
27474
  character: offset - (this.lineStarts[line] ?? 0)
@@ -27445,6 +27512,13 @@ var TYPE_SET = /* @__PURE__ */ new Set([
27445
27512
  var OPERATORS = [...NEOSCRIPT_OPERATORS].sort(
27446
27513
  (left, right) => right.length - left.length
27447
27514
  );
27515
+ var OPERATORS_BY_FIRST_CHARACTER = /* @__PURE__ */ new Map();
27516
+ for (const operator of OPERATORS) {
27517
+ const first = operator[0];
27518
+ const candidates = OPERATORS_BY_FIRST_CHARACTER.get(first) ?? [];
27519
+ candidates.push(operator);
27520
+ OPERATORS_BY_FIRST_CHARACTER.set(first, candidates);
27521
+ }
27448
27522
  var PUNCTUATION = /* @__PURE__ */ new Set([
27449
27523
  ";",
27450
27524
  ",",
@@ -27594,7 +27668,7 @@ function lex(sourceValue) {
27594
27668
  emit(makeToken(kind, start, cursor));
27595
27669
  continue;
27596
27670
  }
27597
- const operator = OPERATORS.find(
27671
+ const operator = OPERATORS_BY_FIRST_CHARACTER.get(char)?.find(
27598
27672
  (candidate) => sourceValue.startsWith(candidate, cursor)
27599
27673
  );
27600
27674
  if (operator) {
@@ -29352,7 +29426,7 @@ function asASTBinaryOp(text) {
29352
29426
  }
29353
29427
  function grammarTokens(lexed, start, end) {
29354
29428
  const lexicalError = lexed.diagnostics.find(
29355
- (diagnostic) => diagnostic.severity === "error" && lexed.source.offsetAt(diagnostic.range.start) >= start && lexed.source.offsetAt(diagnostic.range.start) <= end
29429
+ (diagnostic) => diagnostic.severity === "error" && lexed.source.offsetAt(diagnostic.range.start) >= start && lexed.source.offsetAt(diagnostic.range.start) < end
29356
29430
  );
29357
29431
  if (lexicalError) {
29358
29432
  throw new CompileError(lexicalError.message, {
@@ -29360,12 +29434,22 @@ function grammarTokens(lexed, start, end) {
29360
29434
  column: lexicalError.range.start.character + 1
29361
29435
  });
29362
29436
  }
29363
- return [
29364
- ...lexed.roots.filter(
29365
- (token) => token.kind !== "comment" && token.kind !== "eof" && token.start >= start && token.end <= end
29366
- ),
29367
- eofToken(end, lexed.source.positionAt(end))
29368
- ];
29437
+ let low = 0;
29438
+ let high = lexed.roots.length;
29439
+ while (low < high) {
29440
+ const middle = low + high >>> 1;
29441
+ if (lexed.roots[middle].start < start) low = middle + 1;
29442
+ else high = middle;
29443
+ }
29444
+ const tokens = [];
29445
+ for (let index = low; index < lexed.roots.length; index++) {
29446
+ const token = lexed.roots[index];
29447
+ if (token.start > end) break;
29448
+ if (token.kind !== "comment" && token.kind !== "eof" && token.end <= end)
29449
+ tokens.push(token);
29450
+ }
29451
+ tokens.push(eofToken(end, lexed.source.positionAt(end)));
29452
+ return tokens;
29369
29453
  }
29370
29454
  function eofToken(offset, position) {
29371
29455
  return {
@@ -29863,61 +29947,11 @@ function expandStoredInstance(args) {
29863
29947
  `Virtual expansion root "${args.instanceRoot.id}" is missing required constructor arguments.`
29864
29948
  );
29865
29949
  }
29866
- const constructorArguments = requiredConstructor === null ? [] : requiredConstructor.argumentTypes.flatMap((typeInfo, index) => {
29867
- const parameterId = constructorActionParameterId(
29868
- requiredConstructor,
29869
- index
29870
- );
29871
- if (!Object.hasOwn(storedArgs, parameterId)) {
29872
- if (!typeInfo.required) return [];
29873
- throw new VirtualExpansionUnsupportedError(
29874
- `Virtual expansion root "${args.instanceRoot.id}" is missing creation data for constructor parameter "${typeInfo.name}" (${parameterId}).`
29875
- );
29876
- }
29877
- return [
29878
- {
29879
- name: typeInfo.name,
29880
- valuePointer: storedArgumentPointer(
29881
- storedArgs[parameterId],
29882
- typeInfo
29883
- )
29884
- }
29885
- ];
29886
- });
29887
- const constructionPointer = (fields = []) => typeof instanceRoot.instanceVariantId === "string" ? {
29888
- type: "function" /* function */,
29889
- function: {
29890
- type: "variantInitialize" /* variantInitialize */,
29891
- info: {
29892
- variantPointer: {
29893
- type: "variant" /* variant */,
29894
- classId,
29895
- variantId: instanceRoot.instanceVariantId,
29896
- rowValueId: instanceRoot.instanceVariantRowValueId ?? null
29897
- },
29898
- schemaClassInfo: {
29899
- type: 7 /* Class */,
29900
- required: true,
29901
- classId
29902
- }
29903
- }
29904
- }
29905
- } : {
29906
- type: "function" /* function */,
29907
- function: {
29908
- type: "declaredConstructor" /* declaredConstructor */,
29909
- info: {
29910
- schemaClassInfo: {
29911
- type: 7 /* Class */,
29912
- required: true,
29913
- classId
29914
- },
29915
- constructorId: recordedConstructorId,
29916
- args: constructorArguments,
29917
- fields
29918
- }
29919
- }
29920
- };
29950
+ const constructorArguments = storedConstructorReplayArguments(
29951
+ requiredConstructor,
29952
+ storedArgs,
29953
+ instanceRoot.id
29954
+ );
29921
29955
  const {
29922
29956
  value: _value,
29923
29957
  classId: _classId,
@@ -29939,21 +29973,15 @@ function expandStoredInstance(args) {
29939
29973
  );
29940
29974
  const replayMember = closedRootMember === rootMember ? rootMember : { ...closedRootMember, classId };
29941
29975
  const replay = (fields) => {
29942
- const compiled = {
29943
- compilerRevision: NEOSCRIPT_COMPILER_REVISION,
29944
- parameters: evaluatorEnvelopeParameters(),
29945
- instructions: [
29946
- {
29947
- type: "return" /* return */,
29948
- pointer: constructionPointer(fields)
29949
- }
29950
- ],
29951
- typeInfo: { type: 7 /* Class */, required: true, classId }
29952
- };
29953
- const init = {
29954
- code: `virtual-replay:${args.instanceRoot.id}`,
29955
- compiled
29956
- };
29976
+ const init = storedConstructorReplayInitializer({
29977
+ classId,
29978
+ constructorId: recordedConstructorId,
29979
+ arguments: constructorArguments,
29980
+ fields,
29981
+ variantId: instanceRoot.instanceVariantId,
29982
+ variantRowValueId: instanceRoot.instanceVariantRowValueId,
29983
+ code: `virtual-replay:${args.instanceRoot.id}`
29984
+ });
29957
29985
  return trackMaterialization(
29958
29986
  () => materializeInitializerValue({
29959
29987
  evaluateInitializer: args.evaluateInitializer,
@@ -30121,11 +30149,11 @@ function resolveVirtualInstanceGraph(args) {
30121
30149
  const classId = effective.classId ?? indexed.member.classId;
30122
30150
  const constructedChildren = materialized === null ? /* @__PURE__ */ new Map() : settledAggregateChildren(materialized, classId, pathKey);
30123
30151
  const effectiveRecord = {};
30124
- const schema = mergeStoredInstanceSchema(
30152
+ const schema = resolvedClassSchema(
30125
30153
  classId,
30126
30154
  args.document.classes,
30127
30155
  args.document.members
30128
- );
30156
+ ).stored;
30129
30157
  for (const entry of schema) {
30130
30158
  const childPath = appendVirtualValuePath(pathKey, {
30131
30159
  kind: "class",
@@ -30560,10 +30588,10 @@ function resolveVirtualInstanceGraph(args) {
30560
30588
  };
30561
30589
  }
30562
30590
  function mergeExpandedAndMaterializedRow(expanded, materialized) {
30563
- const expandedClone = cloneRow(expanded);
30564
- if (materialized === null) return expandedClone;
30565
- const materializedClone = cloneRow(materialized);
30566
- const merged = isLiteralValueContent(materialized) ? overlayLiteralValueContent(expandedClone, materializedClone) : { ...expandedClone, ...materializedClone };
30591
+ if (materialized === null) return cloneRow(expanded);
30592
+ const merged = cloneRow(
30593
+ isLiteralValueContent(materialized) ? overlayLiteralValueContent(expanded, materialized) : { ...expanded, ...materialized }
30594
+ );
30567
30595
  if (merged.sourceValueId === materialized.id) delete merged.sourceValueId;
30568
30596
  return merged;
30569
30597
  }
@@ -30872,11 +30900,11 @@ function indexExpansion(args) {
30872
30900
  instanceEnv.set(paramId, { kind: "member", memberId });
30873
30901
  }
30874
30902
  }
30875
- const schema = mergeStoredInstanceSchema(
30903
+ const schema = resolvedClassSchema(
30876
30904
  classId,
30877
30905
  args.document.classes,
30878
30906
  args.document.members
30879
- );
30907
+ ).stored;
30880
30908
  for (const entry of schema) {
30881
30909
  const childId = record4[entry.schemaKey];
30882
30910
  const childMember = membersById.get(entry.memberId);
@@ -31194,6 +31222,69 @@ function canonicalJson(value) {
31194
31222
  }
31195
31223
  return `{${Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(",")}}`;
31196
31224
  }
31225
+ function storedConstructorReplayArguments(constructor, storedArgs, rootId) {
31226
+ return constructor === null ? [] : constructor.argumentTypes.flatMap((typeInfo, index) => {
31227
+ const parameterId = constructorActionParameterId(constructor, index);
31228
+ if (!Object.hasOwn(storedArgs, parameterId)) {
31229
+ if (!typeInfo.required) return [];
31230
+ throw new VirtualExpansionUnsupportedError(
31231
+ `Virtual expansion root "${rootId}" is missing creation data for constructor parameter "${typeInfo.name}" (${parameterId}).`
31232
+ );
31233
+ }
31234
+ return [
31235
+ {
31236
+ name: typeInfo.name,
31237
+ valuePointer: storedArgumentPointer(
31238
+ storedArgs[parameterId],
31239
+ typeInfo
31240
+ )
31241
+ }
31242
+ ];
31243
+ });
31244
+ }
31245
+ function storedConstructorReplayInitializer(args) {
31246
+ const schemaClassInfo = {
31247
+ type: 7 /* Class */,
31248
+ required: true,
31249
+ classId: args.classId,
31250
+ ...args.typeArguments === void 0 ? {} : { typeArguments: args.typeArguments }
31251
+ };
31252
+ const pointer = typeof args.variantId === "string" ? {
31253
+ type: "function" /* function */,
31254
+ function: {
31255
+ type: "variantInitialize" /* variantInitialize */,
31256
+ info: {
31257
+ variantPointer: {
31258
+ type: "variant" /* variant */,
31259
+ classId: args.classId,
31260
+ variantId: args.variantId,
31261
+ rowValueId: args.variantRowValueId ?? null
31262
+ },
31263
+ schemaClassInfo
31264
+ }
31265
+ }
31266
+ } : {
31267
+ type: "function" /* function */,
31268
+ function: {
31269
+ type: "declaredConstructor" /* declaredConstructor */,
31270
+ info: {
31271
+ schemaClassInfo,
31272
+ constructorId: args.constructorId,
31273
+ args: args.arguments,
31274
+ fields: args.fields ?? []
31275
+ }
31276
+ }
31277
+ };
31278
+ return {
31279
+ code: args.code,
31280
+ compiled: {
31281
+ compilerRevision: NEOSCRIPT_COMPILER_REVISION,
31282
+ parameters: evaluatorEnvelopeParameters(),
31283
+ instructions: [{ type: "return" /* return */, pointer }],
31284
+ typeInfo: schemaClassInfo
31285
+ }
31286
+ };
31287
+ }
31197
31288
  function storedArgumentPointer(value, typeInfo) {
31198
31289
  if ((typeInfo.type === 7 /* Class */ || typeInfo.type === 22 /* Interface */ || typeInfo.type === 6 /* List */ || typeInfo.type === 5 /* Dictionary */) && typeof value === "string") {
31199
31290
  return { type: "reference" /* reference */, valueId: value };
@@ -31568,6 +31659,11 @@ function createHeadlessVirtualInstanceResolver(args) {
31568
31659
  return knownGraph === void 0 ? emptyRows : expandRoot(knownGraph.instanceRootId, void 0);
31569
31660
  };
31570
31661
  return {
31662
+ storedClassGraph: (rootId, member) => {
31663
+ expandRoot(rootId, member);
31664
+ const graph = graphByValueId.get(rootId);
31665
+ return graph?.instanceRootId === rootId ? graph : null;
31666
+ },
31571
31667
  virtualInstanceRowsForValue,
31572
31668
  valueById: (id) => expandedRowById.get(id) ?? null,
31573
31669
  rowForValueReference: (value) => expandedRowByRecord.get(value) ?? null,
@@ -31914,6 +32010,7 @@ function evaluateMemberInitializer(args) {
31914
32010
  interfaces: args.document.interfaces,
31915
32011
  localizedTexts: args.document.localizedTexts,
31916
32012
  localizationConfig: args.document.localizationConfig,
32013
+ localizedTextDependencies: args.document.localizedTextDependencies,
31917
32014
  // P67 §4: `Variants.X.Initialize()` and the P75 variant-construction
31918
32015
  // replay both resolve the graph through `ctx.vm.variants`; omitting
31919
32016
  // these made every variant-constructed instance refuse with
@@ -32099,6 +32196,70 @@ function headlessVirtualInstanceLookups(document2, options = {}) {
32099
32196
  return lookups;
32100
32197
  }
32101
32198
 
32199
+ // ../src/common/immutable-json.ts
32200
+ var immutable = /* @__PURE__ */ new WeakSet();
32201
+ function isFrozenJsonData(value) {
32202
+ return immutable.has(value);
32203
+ }
32204
+ function memoizeFrozenJsonGuard(isValid) {
32205
+ const accepted = /* @__PURE__ */ new WeakSet();
32206
+ return (value) => {
32207
+ if (value === null || typeof value !== "object" || !isFrozenJsonData(value))
32208
+ return isValid(value);
32209
+ if (accepted.has(value)) return true;
32210
+ if (!isValid(value)) return false;
32211
+ accepted.add(value);
32212
+ return true;
32213
+ };
32214
+ }
32215
+
32216
+ // ../packages/manifest/src/value-comparison.ts
32217
+ function isObjectRecord(value) {
32218
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32219
+ }
32220
+
32221
+ // ../src/database/canonical-json.ts
32222
+ function canonicalJsonStringify(value) {
32223
+ return JSON.stringify(toCanonicalJsonValue(value));
32224
+ }
32225
+ function toCanonicalJsonValue(value) {
32226
+ if (value === null) return null;
32227
+ if (value === void 0) return void 0;
32228
+ if (value instanceof Date) return value.toISOString();
32229
+ if (typeof value === "string") return value;
32230
+ if (typeof value === "boolean") return value;
32231
+ if (typeof value === "number") {
32232
+ if (!Number.isFinite(value)) {
32233
+ throw new Error("Cannot canonicalize a non-finite number.");
32234
+ }
32235
+ return value;
32236
+ }
32237
+ if (typeof value === "bigint") {
32238
+ throw new Error("Cannot canonicalize bigint values.");
32239
+ }
32240
+ if (typeof value === "symbol") {
32241
+ throw new Error("Cannot canonicalize symbol values.");
32242
+ }
32243
+ if (typeof value === "function") {
32244
+ throw new Error("Cannot canonicalize function values.");
32245
+ }
32246
+ if (Array.isArray(value)) {
32247
+ return value.map((item) => {
32248
+ const canonicalItem = toCanonicalJsonValue(item);
32249
+ if (canonicalItem === void 0) return null;
32250
+ return canonicalItem;
32251
+ });
32252
+ }
32253
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
32254
+ const canonicalObject = {};
32255
+ for (const [key, entryValue] of entries) {
32256
+ const canonicalValue = toCanonicalJsonValue(entryValue);
32257
+ if (canonicalValue === void 0) continue;
32258
+ canonicalObject[key] = canonicalValue;
32259
+ }
32260
+ return canonicalObject;
32261
+ }
32262
+
32102
32263
  // ../packages/neoscript-language/src/syntax-index.ts
32103
32264
  var OPEN_TO_CLOSE = /* @__PURE__ */ new Map([
32104
32265
  ["(", ")"],
@@ -37099,7 +37260,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
37099
37260
  /**
37100
37261
  * P67 §4.1/§4.2 — `<variant>.Initialize()` and `<source>.ToVariant(<variant>)`.
37101
37262
  *
37102
- * Checked before {@link resolveDelegateCallee} deliberately. The variant
37263
+ * Checked before {@link resolveCallableValueCallee} deliberately. The variant
37103
37264
  * graph really does carry an `Initialize` member of delegate type, so the
37104
37265
  * ordinary delegate path would resolve `.Initialize()` and run step 1 of the
37105
37266
  * construction path while silently skipping Overrides and ChildOverrides.
@@ -38152,20 +38313,23 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38152
38313
  receiverValue
38153
38314
  );
38154
38315
  if (variantCall !== null) return variantCall;
38155
- const delegate = this.resolveDelegateCallee(callee, scope, receiverValue);
38156
- if (delegate !== null) {
38316
+ const callable2 = this.resolveCallableValueCallee(
38317
+ callee,
38318
+ scope,
38319
+ receiverValue
38320
+ );
38321
+ if (callable2?.type.kind === "delegate") {
38157
38322
  return this.resolveDelegateCall(
38158
- delegate,
38323
+ callable2,
38159
38324
  argumentsList2,
38160
38325
  scope,
38161
38326
  pos,
38162
38327
  callee.kind === "member" && callee.optional === true
38163
38328
  );
38164
38329
  }
38165
- const action = this.resolveActionCallee(callee, scope, receiverValue);
38166
- if (action !== null) {
38330
+ if (callable2?.type.kind === "action") {
38167
38331
  throw new CompileError(
38168
- `${this.describe(action.type)} is void and cannot be used as a value; call it as a statement instead.`,
38332
+ `${this.describe(callable2.type)} is void and cannot be used as a value; call it as a statement instead.`,
38169
38333
  pos
38170
38334
  );
38171
38335
  }
@@ -38442,7 +38606,8 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38442
38606
  }
38443
38607
  };
38444
38608
  }
38445
- resolveDelegateCallee(callee, scope, receiverValue) {
38609
+ /** Classify callable values once before falling back to ordinary methods. */
38610
+ resolveCallableValueCallee(callee, scope, receiverValue) {
38446
38611
  if (callee.kind === "ident") {
38447
38612
  const scoped = scope.lookup(callee.name);
38448
38613
  const implicit = this.implicitMember(callee.name);
@@ -38450,7 +38615,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38450
38615
  return null;
38451
38616
  }
38452
38617
  const resolved = this.resolveIdentifier(callee.name, scope, callee.pos);
38453
- return resolved.type.kind === "delegate" ? resolved : null;
38618
+ return resolved.type.kind === "delegate" || resolved.type.kind === "action" ? resolved : null;
38454
38619
  }
38455
38620
  if (callee.kind !== "member") return null;
38456
38621
  try {
@@ -38462,39 +38627,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38462
38627
  callee.optional === true,
38463
38628
  receiverValue
38464
38629
  );
38465
- return resolved.type.kind === "delegate" ? resolved : null;
38466
- } catch (error) {
38467
- if (error instanceof CompileError) return null;
38468
- throw error;
38469
- }
38470
- }
38471
- /**
38472
- * The action-typed sibling of {@link resolveDelegateCallee}. Kept separate
38473
- * so an action never leaks into the delegate call path: an action is
38474
- * statement-only, and its two call sites want opposite outcomes — the
38475
- * statement path compiles it, the expression path rejects it.
38476
- */
38477
- resolveActionCallee(callee, scope, receiverValue) {
38478
- if (callee.kind === "ident") {
38479
- const scoped = scope.lookup(callee.name);
38480
- const implicit = this.implicitMember(callee.name);
38481
- if (scoped === null && (implicit === null || implicit.symbol.kind === "function" || implicit.symbol.kind === "method")) {
38482
- return null;
38483
- }
38484
- const resolved = this.resolveIdentifier(callee.name, scope, callee.pos);
38485
- return resolved.type.kind === "action" ? resolved : null;
38486
- }
38487
- if (callee.kind !== "member") return null;
38488
- try {
38489
- const resolved = this.resolveMember(
38490
- callee.receiver,
38491
- callee.name,
38492
- scope,
38493
- callee.pos,
38494
- callee.optional === true,
38495
- receiverValue
38496
- );
38497
- return resolved.type.kind === "action" ? resolved : null;
38630
+ return resolved.type.kind === "delegate" || resolved.type.kind === "action" ? resolved : null;
38498
38631
  } catch (error) {
38499
38632
  if (error instanceof CompileError) return null;
38500
38633
  throw error;
@@ -40474,19 +40607,15 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
40474
40607
  throw new Error("Base call did not produce a function call.");
40475
40608
  return result.pointer;
40476
40609
  }
40477
- const action = this.resolveActionCallee(
40610
+ const callable2 = this.resolveCallableValueCallee(
40478
40611
  expression.callee,
40479
40612
  scope,
40480
40613
  receiverValue
40481
40614
  );
40482
- if (action?.type.kind === "action") {
40483
- return this.resolveActionCall(action, action.type, expression, scope);
40615
+ if (callable2?.type.kind === "action") {
40616
+ return this.resolveActionCall(callable2, callable2.type, expression, scope);
40484
40617
  }
40485
- const delegate = this.resolveDelegateCallee(
40486
- expression.callee,
40487
- scope,
40488
- receiverValue
40489
- );
40618
+ const delegate = callable2;
40490
40619
  if (delegate?.type.kind === "delegate") {
40491
40620
  const delegateType = delegate.type;
40492
40621
  requireArgCount(
@@ -45074,6 +45203,15 @@ function analyzerMemberById(context, id) {
45074
45203
  }
45075
45204
  return analyzerSchemaIndex(context).member(id) ?? null;
45076
45205
  }
45206
+ function resolveAnalyzerMember(context, member) {
45207
+ const index = activeSchemaIndexByContext.get(context);
45208
+ if (index === void 0) return resolveMember(member, context.vm.members);
45209
+ const cached = index.resolvedMembers.get(member);
45210
+ if (cached !== void 0) return cached;
45211
+ const resolved = resolveMemberFromIndex(member, index.membersById);
45212
+ index.resolvedMembers.set(member, resolved);
45213
+ return resolved;
45214
+ }
45077
45215
 
45078
45216
  // ../src/runtime/neoscript/neoscript-language-context-adapter.ts
45079
45217
  var NEOSCRIPT_COMPILER_ADAPTER_REVISION = 5;
@@ -45082,6 +45220,31 @@ var UNKNOWN_TYPE = {
45082
45220
  name: "unknown"
45083
45221
  };
45084
45222
  var storageResolverByContext = /* @__PURE__ */ new WeakMap();
45223
+ var dialogueProjects = /* @__PURE__ */ new WeakMap();
45224
+ function withDialogueContextType(project, context) {
45225
+ if (!context.dialogueContext) return project;
45226
+ let contexts = dialogueProjects.get(project);
45227
+ if (contexts === void 0) {
45228
+ contexts = /* @__PURE__ */ new Map();
45229
+ dialogueProjects.set(project, contexts);
45230
+ }
45231
+ const dialogueType = createDialogueContextType(context);
45232
+ const key = JSON.stringify(dialogueType);
45233
+ let scoped = contexts.get(key);
45234
+ if (scoped === void 0) {
45235
+ scoped = {
45236
+ ...project,
45237
+ types: [
45238
+ ...project.types.filter(
45239
+ (type) => type.id !== AnalyzerDialogueContextClassId
45240
+ ),
45241
+ dialogueType
45242
+ ]
45243
+ };
45244
+ contexts.set(key, scoped);
45245
+ }
45246
+ return scoped;
45247
+ }
45085
45248
  function createNeoScriptDocumentContext(context, projectOverride) {
45086
45249
  return withAnalyzerSchemaIndex(
45087
45250
  context,
@@ -45089,7 +45252,7 @@ function createNeoScriptDocumentContext(context, projectOverride) {
45089
45252
  );
45090
45253
  }
45091
45254
  function createNeoScriptDocumentContextInScope(context, projectOverride) {
45092
- const project = projectOverride ?? createNeoScriptProject(context);
45255
+ const project = projectOverride === void 0 ? createNeoScriptProject(context) : withDialogueContextType(projectOverride, context);
45093
45256
  const documentKind = context.scriptKind ?? "getter";
45094
45257
  const thisClass = context.thisClass ? namedType(context.thisClass.id, true) : void 0;
45095
45258
  const baseClass = overrideBaseClass(context);
@@ -45303,12 +45466,15 @@ function classToLanguageType(schemaClass2, context) {
45303
45466
  const record4 = analyzerMemberById(context, placement.memberId);
45304
45467
  if (!record4) continue;
45305
45468
  let projectedRecord = record4;
45469
+ let projectedBase;
45306
45470
  try {
45307
45471
  projectedRecord = substituteMember(
45308
45472
  record4,
45309
45473
  genericEnvironment,
45310
- context.vm.members
45474
+ context.vm.members,
45475
+ resolveAnalyzerMember(context, record4)
45311
45476
  );
45477
+ projectedBase = projectedRecord;
45312
45478
  } catch {
45313
45479
  }
45314
45480
  const symbol = memberToSymbol(
@@ -45318,7 +45484,8 @@ function classToLanguageType(schemaClass2, context) {
45318
45484
  placement.ownerClassId,
45319
45485
  index,
45320
45486
  context,
45321
- genericEnvironment
45487
+ genericEnvironment,
45488
+ projectedBase
45322
45489
  );
45323
45490
  if (!symbol) continue;
45324
45491
  names.add(symbol.name);
@@ -45403,7 +45570,8 @@ function constructorSignature(schemaClass2, members, context, genericEnvironment
45403
45570
  const resolved = substituteMember(
45404
45571
  record4,
45405
45572
  genericEnvironment,
45406
- context.vm.members
45573
+ context.vm.members,
45574
+ resolveAnalyzerMember(context, record4)
45407
45575
  );
45408
45576
  return {
45409
45577
  required: isRequiredMember(resolved),
@@ -45429,7 +45597,8 @@ function constructorSignature(schemaClass2, members, context, genericEnvironment
45429
45597
  const resolved = substituteMember(
45430
45598
  record4,
45431
45599
  genericEnvironment,
45432
- context.vm.members
45600
+ context.vm.members,
45601
+ resolveAnalyzerMember(context, record4)
45433
45602
  );
45434
45603
  return {
45435
45604
  required: isRequiredMember(resolved),
@@ -45481,10 +45650,10 @@ function canonicalMemberId(id, context) {
45481
45650
  }
45482
45651
  return resolve(id);
45483
45652
  }
45484
- function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index, context, genericEnvironment) {
45653
+ function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index, context, genericEnvironment, projectedBase) {
45485
45654
  let resolved;
45486
45655
  try {
45487
- resolved = resolveMember(record4, context.vm.members);
45656
+ resolved = projectedBase ?? resolveAnalyzerMember(context, record4);
45488
45657
  } catch {
45489
45658
  return null;
45490
45659
  }
@@ -45492,7 +45661,8 @@ function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index
45492
45661
  record4,
45493
45662
  context,
45494
45663
  /* @__PURE__ */ new Set(),
45495
- genericEnvironment
45664
+ genericEnvironment,
45665
+ resolved
45496
45666
  );
45497
45667
  const owner = analyzerSchemaIndex(context).class(ownerClassId);
45498
45668
  const inheritedFrom = owner && owner.id !== containingClass.id ? {
@@ -45823,7 +45993,7 @@ function createListIndexes(context) {
45823
45993
  for (const record4 of context.vm.members) {
45824
45994
  let resolved;
45825
45995
  try {
45826
- resolved = resolveMember(record4, context.vm.members);
45996
+ resolved = resolveAnalyzerMember(context, record4);
45827
45997
  } catch {
45828
45998
  continue;
45829
45999
  }
@@ -45853,12 +46023,12 @@ function createListIndexes(context) {
45853
46023
  }
45854
46024
  return result;
45855
46025
  }
45856
- function memberRuntimeType(record4, context, seen = /* @__PURE__ */ new Set(), genericEnvironment) {
46026
+ function memberRuntimeType(record4, context, seen = /* @__PURE__ */ new Set(), genericEnvironment, projectedBase) {
45857
46027
  if (seen.has(record4.id)) return UNKNOWN_TYPE;
45858
46028
  const nextSeen = new Set(seen).add(record4.id);
45859
46029
  let member;
45860
46030
  try {
45861
- member = resolveMember(record4, context.vm.members);
46031
+ member = projectedBase ?? resolveAnalyzerMember(context, record4);
45862
46032
  } catch {
45863
46033
  return UNKNOWN_TYPE;
45864
46034
  }
@@ -46105,7 +46275,12 @@ function classArguments(member, context, seen, genericEnvironment) {
46105
46275
  function substituteForGenericEnvironment(member, environment, context) {
46106
46276
  if (!environment) return member;
46107
46277
  try {
46108
- return substituteMember(member, environment, context.vm.members);
46278
+ return substituteMember(
46279
+ member,
46280
+ environment,
46281
+ context.vm.members,
46282
+ resolveAnalyzerMember(context, member)
46283
+ );
46109
46284
  } catch {
46110
46285
  return member;
46111
46286
  }
@@ -46391,7 +46566,7 @@ function scriptDefinitionLocations2(memberId, context) {
46391
46566
  if (!record4) return {};
46392
46567
  let resolved;
46393
46568
  try {
46394
- resolved = resolveMember(record4, context.vm.members);
46569
+ resolved = resolveAnalyzerMember(context, record4);
46395
46570
  } catch {
46396
46571
  return {};
46397
46572
  }
@@ -46477,7 +46652,7 @@ function virtualNeoSchemaClassHeader(schemaClass2, context) {
46477
46652
  return `public ${isAbstractClass(schemaClass2) ? "abstract " : ""}partial class ${virtualCSharpIdentifier(schemaClass2.name)}${genericParameters}${inheritance}${constraints.join("")} // Neo class ${schemaClass2.id}`;
46478
46653
  }
46479
46654
  function virtualConstraintMemberType(member, context) {
46480
- const resolved = resolveMember(member, context.vm.members);
46655
+ const resolved = resolveAnalyzerMember(context, member);
46481
46656
  switch (resolved.kind) {
46482
46657
  case 1 /* Bool */:
46483
46658
  return "bool";
@@ -49050,18 +49225,18 @@ function readProjectDocument(value, options = {}) {
49050
49225
  "localizationConfig",
49051
49226
  isProjectLocalizationConfig
49052
49227
  ) : readField(value, "localizationConfig", isProjectLocalizationConfig);
49053
- const storedValues = readArrayField(value, "values", isMemberValue);
49228
+ const storedValues = readDocumentArrayField(value, "values", isMemberValue);
49054
49229
  const valueBuckets = options.values === "stored" ? { values: storedValues } : projectDocumentValueBuckets(storedValues);
49055
49230
  return {
49056
49231
  version: readField(value, "version", isProjectVersion),
49057
- versions: readArrayField(value, "versions", isProjectVersion),
49232
+ versions: readDocumentArrayField(value, "versions", isProjectVersion),
49058
49233
  versionStatus: readField(value, "versionStatus", isProjectVersionStatus),
49059
- versionStatuses: readArrayField(
49234
+ versionStatuses: readDocumentArrayField(
49060
49235
  value,
49061
49236
  "versionStatuses",
49062
49237
  isProjectVersionStatus
49063
49238
  ),
49064
- releaseChannels: readArrayField(
49239
+ releaseChannels: readDocumentArrayField(
49065
49240
  value,
49066
49241
  "releaseChannels",
49067
49242
  isProjectReleaseChannel
@@ -49071,7 +49246,7 @@ function readProjectDocument(value, options = {}) {
49071
49246
  value,
49072
49247
  options.members === "authored-or-compiled" ? isAnyMemberAuthoredOrCompiled : isAnyMember
49073
49248
  ),
49074
- classes: readArrayField(value, "classes", isNeoSchemaClass),
49249
+ classes: readDocumentArrayField(value, "classes", isNeoSchemaClass),
49075
49250
  constructors: readOptionalArrayField(
49076
49251
  value,
49077
49252
  "constructors",
@@ -49092,13 +49267,13 @@ function readProjectDocument(value, options = {}) {
49092
49267
  // Retain the physical bucket after expansion for write-path comparisons.
49093
49268
  values: valueBuckets.values,
49094
49269
  ...valueBuckets.physicalValues === void 0 ? {} : { physicalValues: valueBuckets.physicalValues },
49095
- enums: readArrayField(
49270
+ enums: readDocumentArrayField(
49096
49271
  value,
49097
49272
  "enums",
49098
49273
  options.identities === "prospective" ? isProspectiveEnum : isEnum
49099
49274
  ),
49100
- interfaces: readArrayField(value, "interfaces", isNeoInterface),
49101
- ...options.dialogues === "omit" ? {} : { dialogues: readArrayField(value, "dialogues", isDialogue) },
49275
+ interfaces: readDocumentArrayField(value, "interfaces", isNeoInterface),
49276
+ ...options.dialogues === "omit" ? {} : { dialogues: readDocumentArrayField(value, "dialogues", isDialogue) },
49102
49277
  dialogueRecords: readOptionalArrayField(
49103
49278
  value,
49104
49279
  "dialogueRecords",
@@ -49109,26 +49284,38 @@ function readProjectDocument(value, options = {}) {
49109
49284
  "dialogueNodes",
49110
49285
  isDialogueNodeRecord
49111
49286
  ),
49112
- dialogueGroups: readArrayField(value, "dialogueGroups", isAnyDialogueGroup),
49113
- priorityGroups: readArrayField(value, "priorityGroups", isPriorityGroup),
49114
- projectFiles: readArrayField(value, "projectFiles", isProjectFile),
49115
- textureTemplates: readArrayField(
49287
+ dialogueGroups: readDocumentArrayField(
49288
+ value,
49289
+ "dialogueGroups",
49290
+ isAnyDialogueGroup
49291
+ ),
49292
+ priorityGroups: readDocumentArrayField(
49293
+ value,
49294
+ "priorityGroups",
49295
+ isPriorityGroup
49296
+ ),
49297
+ projectFiles: readDocumentArrayField(value, "projectFiles", isProjectFile),
49298
+ textureTemplates: readDocumentArrayField(
49116
49299
  value,
49117
49300
  "textureTemplates",
49118
49301
  isUnityTexture2DImportSettingsTemplate
49119
49302
  ),
49120
- audioClipTemplates: readArrayField(
49303
+ audioClipTemplates: readDocumentArrayField(
49121
49304
  value,
49122
49305
  "audioClipTemplates",
49123
49306
  isUnityAudioClipImportSettingsTemplate
49124
49307
  ),
49125
49308
  localizationConfig,
49126
- localizationStatuses: readArrayField(
49309
+ localizationStatuses: readDocumentArrayField(
49127
49310
  value,
49128
49311
  "localizationStatuses",
49129
49312
  isLocalizationStatus
49130
49313
  ),
49131
- localizedTexts: readArrayField(value, "localizedTexts", isLocalizedText),
49314
+ localizedTexts: readDocumentArrayField(
49315
+ value,
49316
+ "localizedTexts",
49317
+ isLocalizedText
49318
+ ),
49132
49319
  migrations: readOptionalArrayField(value, "migrations", isProjectMigration)
49133
49320
  };
49134
49321
  }
@@ -49158,7 +49345,7 @@ function isHashHead(value) {
49158
49345
  }
49159
49346
  function readField(source, key, isValid) {
49160
49347
  const value = source[key];
49161
- if (isValid(value)) return value;
49348
+ if (frozenRecordGuard(isValid)(value)) return value;
49162
49349
  throw new Error(
49163
49350
  `Convex project document field "${key}" has an invalid shape.`
49164
49351
  );
@@ -49166,11 +49353,23 @@ function readField(source, key, isValid) {
49166
49353
  function readOptionalNullableField(source, key, isValid) {
49167
49354
  const value = source[key];
49168
49355
  if (value === void 0 || value === null) return null;
49169
- if (isValid(value)) return value;
49356
+ if (frozenRecordGuard(isValid)(value)) return value;
49170
49357
  throw new Error(
49171
49358
  `Convex project document field "${key}" has an invalid shape.`
49172
49359
  );
49173
49360
  }
49361
+ var frozenRecordGuards = /* @__PURE__ */ new WeakMap();
49362
+ function frozenRecordGuard(isValid) {
49363
+ let guard = frozenRecordGuards.get(isValid);
49364
+ if (guard === void 0) {
49365
+ guard = memoizeFrozenJsonGuard(isValid);
49366
+ frozenRecordGuards.set(isValid, guard);
49367
+ }
49368
+ return guard;
49369
+ }
49370
+ function readDocumentArrayField(source, key, isValid) {
49371
+ return readArrayField(source, key, frozenRecordGuard(isValid));
49372
+ }
49174
49373
  function readArrayField(source, key, isValid) {
49175
49374
  const value = source[key];
49176
49375
  if (!Array.isArray(value)) {
@@ -49192,10 +49391,10 @@ function describeRejectedCompilerRevision(value) {
49192
49391
  }
49193
49392
  function readOptionalArrayField(source, key, isValid) {
49194
49393
  if (!Object.prototype.hasOwnProperty.call(source, key)) return [];
49195
- return readArrayField(source, key, isValid);
49394
+ return readDocumentArrayField(source, key, isValid);
49196
49395
  }
49197
49396
  function readStoredMembersField(source, isValid = isAnyMember) {
49198
- return readArrayField(
49397
+ return readDocumentArrayField(
49199
49398
  source,
49200
49399
  "members",
49201
49400
  isValid
@@ -49482,10 +49681,20 @@ var WORLD_LAYER_LINK_KINDS = /* @__PURE__ */ new Set([
49482
49681
  NeoWorldSystemClassKind.ObjectLayerLink
49483
49682
  ]);
49484
49683
 
49485
- // ../packages/manifest/src/value-comparison.ts
49486
- function isObjectRecord(value) {
49487
- return typeof value === "object" && value !== null && !Array.isArray(value);
49488
- }
49684
+ // ../src/database/project-snapshot-derived-edges.ts
49685
+ var REFERENCE_ID_PAYLOAD = canonicalJsonStringify({
49686
+ referenceKind: "record-id"
49687
+ });
49688
+ var REFERENCE_NAME_PAYLOAD = canonicalJsonStringify({
49689
+ referenceKind: "type-name"
49690
+ });
49691
+ var CONSTRUCTED_CLASS_PAYLOAD = canonicalJsonStringify({
49692
+ referenceKind: "constructed-class-id"
49693
+ });
49694
+ var BODY_CHILD_PAYLOAD = canonicalJsonStringify({
49695
+ relation: "body-child",
49696
+ depth: 1
49697
+ });
49489
49698
 
49490
49699
  // ../src/models/project/world-content-sidecar-validation.ts
49491
49700
  var WORLD_PLACEMENT_ASSET_KIND = /* @__PURE__ */ new Map([[NeoWorldSystemClassKind.Object, NeoWorldSystemClassKind.Object]]);
@@ -54423,6 +54632,1442 @@ var SPECIALIZED_RELATION_KINDS = /* @__PURE__ */ new Set([
54423
54632
  "world.object-layer-link.target"
54424
54633
  ]);
54425
54634
 
54635
+ // ../packages/manifest/schema-contract/registry.mjs
54636
+ var PROJECT_SCHEMA_CONTRACT = Object.freeze({
54637
+ cliVersion: "0.72.1",
54638
+ projectFileUploadBatchSize: 32,
54639
+ documentRecords: {
54640
+ member: {
54641
+ authored: [
54642
+ "id",
54643
+ "name",
54644
+ "docsText",
54645
+ "kind",
54646
+ "requirement",
54647
+ "mutability",
54648
+ "modifier",
54649
+ "access",
54650
+ "defaultValue",
54651
+ "extendsMemberId",
54652
+ "system",
54653
+ "storage",
54654
+ "storageKey",
54655
+ // Deliberately carries no normalization rule (P76 §1): absence is the
54656
+ // canonical automatic setting and explicit ordinal 0 is an explicit
54657
+ // `.Sparse`, so `absentMeansDefault` would collapse the two states
54658
+ // that the whole contract exists to keep apart.
54659
+ "distribution",
54660
+ "minValue",
54661
+ "maxValue",
54662
+ "decimalPoints",
54663
+ "format",
54664
+ "searchBy",
54665
+ "entryMemberId",
54666
+ "keyKind",
54667
+ "keyEnumId",
54668
+ "listKind",
54669
+ "indexes",
54670
+ "columnSettings",
54671
+ "classId",
54672
+ "payload",
54673
+ "schemaKeyOrder",
54674
+ "classArguments",
54675
+ "enumId",
54676
+ "selection",
54677
+ "collectionMemberId",
54678
+ "collectionValueId",
54679
+ "declaredTypeInfo",
54680
+ "targetTypeInfo",
54681
+ "valueTypeInfo",
54682
+ "dialogueGroupId",
54683
+ "code",
54684
+ "setterCode",
54685
+ "returnTypeInfo",
54686
+ "argumentTypes",
54687
+ "dispatch",
54688
+ "bodyMode",
54689
+ // P97 §1.1. No normalization rule, like `distribution`: absence means
54690
+ // unset (a declaration resolves to `.None`, an override inherits) and
54691
+ // explicit ordinal 0 is an authored `.None` that stops inheritance.
54692
+ "effect",
54693
+ "uiAction",
54694
+ "templateId",
54695
+ "genericParamId"
54696
+ ],
54697
+ derived: ["valueId", "getter", "setter", "action"],
54698
+ volatile: ["projectId", "createdAt", "updatedAt"],
54699
+ normalization: {
54700
+ requirement: { kind: "absentMeansDefault", defaultValue: 0 },
54701
+ mutability: { kind: "absentMeansDefault", defaultValue: 0 },
54702
+ modifier: { kind: "absentMeansDefault", defaultValue: 0 },
54703
+ access: { kind: "absentMeansDefault", defaultValue: 0 },
54704
+ defaultValue: "nullIsAbsentOnFullMember",
54705
+ extendsMemberId: "nullIsAbsent",
54706
+ system: "nullIsAbsent",
54707
+ storage: { kind: "absentMeansDefault", defaultValue: 0 },
54708
+ storageKey: "nullOrEmptyStringIsAbsentOnFullMember",
54709
+ minValue: "nullIsAbsentOnFullMember",
54710
+ maxValue: "nullIsAbsentOnFullMember",
54711
+ decimalPoints: "nullIsAbsentOnFullMember",
54712
+ format: { kind: "absentMeansDefault", defaultValue: 0 },
54713
+ searchBy: { kind: "absentMeansDefault", defaultValue: 0 },
54714
+ keyEnumId: "nullIsAbsent",
54715
+ keyKind: { kind: "absentMeansDefault", defaultValue: 0 },
54716
+ listKind: { kind: "absentMeansDefault", defaultValue: 0 },
54717
+ indexes: "nullOrEmptyArrayIsAbsentOnFullMember",
54718
+ columnSettings: "nullOrEmptyArrayIsAbsentOnFullMember",
54719
+ schemaKeyOrder: "nullIsAbsentOnFullMember",
54720
+ classArguments: "nullOrEmptyObjectIsAbsentOnFullMember",
54721
+ payload: { kind: "absentMeansDefault", defaultValue: 0 },
54722
+ selection: { kind: "absentMeansDefault", defaultValue: 0 },
54723
+ collectionValueId: "nullIsAbsentOnFullMember",
54724
+ declaredTypeInfo: "nullIsAbsentOnFullMember",
54725
+ targetTypeInfo: "nullIsAbsentOnFullMember",
54726
+ valueTypeInfo: "nullIsAbsentOnFullMember",
54727
+ dialogueGroupId: "nullIsAbsentOnFullMember",
54728
+ code: "nullIsAbsentOnFullMember",
54729
+ templateId: "nullIsAbsentOnFullMember",
54730
+ setterCode: "nullIsAbsentOnFullMember",
54731
+ dispatch: { kind: "absentMeansDefault", defaultValue: 0 },
54732
+ bodyMode: { kind: "absentMeansDefault", defaultValue: 0 },
54733
+ uiAction: "nullIsAbsentOnFullMember"
54734
+ }
54735
+ },
54736
+ class: {
54737
+ authored: [
54738
+ "id",
54739
+ "name",
54740
+ "docsText",
54741
+ "schema",
54742
+ "schemaKeyOrder",
54743
+ "extendsClassId",
54744
+ "implementsInterfaceIds",
54745
+ "uiVisibility",
54746
+ "modifier",
54747
+ "system",
54748
+ "allowedStorage",
54749
+ "allowedStorageKeys",
54750
+ "genericParams",
54751
+ "extendsGenericBindings",
54752
+ "constructorIds",
54753
+ "requiredConstructorId",
54754
+ "targetMemberId"
54755
+ ],
54756
+ derived: [],
54757
+ volatile: ["projectId", "createdAt", "updatedAt"],
54758
+ normalization: {
54759
+ uiVisibility: { kind: "absentMeansDefault", defaultValue: 0 },
54760
+ modifier: { kind: "absentMeansDefault", defaultValue: 0 },
54761
+ targetMemberId: "nullIsAbsent",
54762
+ schemaKeyOrder: "nullIsAbsent",
54763
+ extendsClassId: "nullIsAbsent",
54764
+ implementsInterfaceIds: "nullOrEmptyArrayIsAbsent",
54765
+ system: "nullIsAbsent",
54766
+ allowedStorage: { kind: "absentMeansDefault", defaultValue: 0 },
54767
+ allowedStorageKeys: "nullIsAbsent",
54768
+ genericParams: "nullOrEmptyArrayIsAbsent",
54769
+ extendsGenericBindings: "nullOrEmptyObjectIsAbsent",
54770
+ constructorIds: "nullOrEmptyArrayIsAbsent",
54771
+ requiredConstructorId: "nullIsAbsent"
54772
+ }
54773
+ },
54774
+ constructor: {
54775
+ authored: [
54776
+ "id",
54777
+ "classId",
54778
+ "argumentTypes",
54779
+ "code",
54780
+ "baseArguments",
54781
+ "baseInitializerFields",
54782
+ "docsText"
54783
+ ],
54784
+ derived: [
54785
+ "action",
54786
+ "compiledBaseArguments",
54787
+ "compiledBaseInitializerFields"
54788
+ ],
54789
+ volatile: ["projectId", "createdAt", "updatedAt"],
54790
+ // `code` is deliberately un-normalized. P49 §1.2 gives it three states —
54791
+ // a body, `""` for a declared-but-empty body, and `null` for a class
54792
+ // header that declares no `init` block — and the last two must stay
54793
+ // distinct in the canonical form or `neo pull` cannot tell
54794
+ // `class Foo { init { } }` from `class Foo()`. `nullIsAbsent` would keep
54795
+ // them distinct too, but it drops the field from the written record
54796
+ // (`composeDocumentRecord` writes the normalized authored half), which
54797
+ // would make the persisted shape disagree with the domain model's
54798
+ // required `code: string | null`. Leaving it plain means exactly two
54799
+ // spellings of an empty body reach storage, never three.
54800
+ normalization: {
54801
+ baseArguments: "nullOrEmptyArrayIsAbsent",
54802
+ baseInitializerFields: "nullOrEmptyArrayIsAbsent"
54803
+ }
54804
+ },
54805
+ variant: {
54806
+ // P67 §2.1. A variant record names its class, its scope, and the root row
54807
+ // of the value graph it owns. The delegates themselves are value rows, so
54808
+ // the compiled `action` IR the server derives lives there, not here —
54809
+ // which is why this record has no derived half at all.
54810
+ authored: ["id", "classId", "name", "folderId", "valueId"],
54811
+ derived: [],
54812
+ volatile: ["projectId", "createdAt", "updatedAt"],
54813
+ // `folderId` is always written: null is the class root folder, and a
54814
+ // missing field would make "root" and "corrupt" the same shape.
54815
+ normalization: { folderId: "missingIsNull" }
54816
+ },
54817
+ "variant-folder": {
54818
+ // P67 §3.3. A folder's whole content is its path, which is what lets a
54819
+ // rename be a one-record edit that orphans nothing.
54820
+ authored: ["id", "classId", "path", "binding"],
54821
+ derived: [],
54822
+ volatile: ["projectId", "createdAt", "updatedAt"],
54823
+ normalization: { binding: "nullIsAbsent" }
54824
+ },
54825
+ interface: {
54826
+ authored: [
54827
+ "id",
54828
+ "name",
54829
+ "docsText",
54830
+ "members",
54831
+ "memberKeyOrder",
54832
+ "extendsInterfaceIds",
54833
+ "system"
54834
+ ],
54835
+ derived: [],
54836
+ volatile: ["projectId", "createdAt", "updatedAt"],
54837
+ normalization: {
54838
+ memberKeyOrder: "nullOrEmptyArrayIsAbsent",
54839
+ extendsInterfaceIds: "nullOrEmptyArrayIsAbsent",
54840
+ system: "nullIsAbsent"
54841
+ }
54842
+ },
54843
+ enum: {
54844
+ authored: [
54845
+ "id",
54846
+ "name",
54847
+ "docsText",
54848
+ "options",
54849
+ "optionKeyOrder",
54850
+ "system"
54851
+ ],
54852
+ derived: [],
54853
+ volatile: ["projectId", "createdAt", "updatedAt"],
54854
+ normalization: { system: "nullIsAbsent" }
54855
+ },
54856
+ "unity-texture-template": {
54857
+ authored: [
54858
+ "id",
54859
+ "name",
54860
+ "type",
54861
+ "textureType",
54862
+ "textureShape",
54863
+ "sRGBTexture",
54864
+ "alphaSource",
54865
+ "alphaIsTransparency",
54866
+ "nonPowerOfTwoScale",
54867
+ "ignorePngGamma",
54868
+ "readWriteEnabled",
54869
+ "virtualTextureOnly",
54870
+ "generateMipMaps",
54871
+ "borderMipMaps",
54872
+ "mipMapFiltering",
54873
+ "mipMapsPreserveCoverage",
54874
+ "alphaCutoffValue",
54875
+ "fadeOutMipMaps",
54876
+ "mipMapFadeDistanceStart",
54877
+ "mipMapFadeDistanceEnd",
54878
+ "anisoLevel",
54879
+ "wrapMode",
54880
+ "wrapModeU",
54881
+ "wrapModeV",
54882
+ "filterMode",
54883
+ "maxTextureSize",
54884
+ "resizeAlgorithm",
54885
+ "textureCompression",
54886
+ "compressionQuality",
54887
+ "crunchedCompression",
54888
+ "platformSettings",
54889
+ "spriteSettings",
54890
+ "normalMapSettings",
54891
+ "cookieSettings",
54892
+ "singleChannelSettings",
54893
+ "swizzle"
54894
+ ],
54895
+ derived: [],
54896
+ volatile: ["projectId", "createdAt", "updatedAt"],
54897
+ normalization: {
54898
+ wrapModeU: "missingIsNull",
54899
+ wrapModeV: "missingIsNull",
54900
+ spriteSettings: "missingIsNull",
54901
+ normalMapSettings: "missingIsNull",
54902
+ cookieSettings: "missingIsNull",
54903
+ singleChannelSettings: "missingIsNull",
54904
+ swizzle: "missingIsNull"
54905
+ }
54906
+ },
54907
+ "unity-audio-clip-template": {
54908
+ authored: [
54909
+ "id",
54910
+ "name",
54911
+ "forceToMono",
54912
+ "normalize",
54913
+ "loadInBackground",
54914
+ "ambisonic",
54915
+ "loadType",
54916
+ "compressionFormat",
54917
+ "quality",
54918
+ "sampleRateSetting",
54919
+ "overrideSampleRate",
54920
+ "preloadAudioData"
54921
+ ],
54922
+ derived: [],
54923
+ volatile: ["projectId", "createdAt", "updatedAt"],
54924
+ normalization: { overrideSampleRate: "missingIsNull" }
54925
+ },
54926
+ "localization-config": {
54927
+ authored: [
54928
+ "id",
54929
+ "mainLocale",
54930
+ "supportedLocales",
54931
+ "sortedStatusIds",
54932
+ "mainLocaleDefaultStatusId"
54933
+ ],
54934
+ derived: [],
54935
+ volatile: ["projectId", "createdAt", "updatedAt"],
54936
+ normalization: {}
54937
+ },
54938
+ "localization-status": {
54939
+ authored: [
54940
+ "id",
54941
+ "slug",
54942
+ "name",
54943
+ "description",
54944
+ "color",
54945
+ "emoji",
54946
+ "archivedAt",
54947
+ "transitionRules",
54948
+ "transitionToStatusIdOnEditText",
54949
+ "transitionToWhenSourceBecomesStatusId",
54950
+ "system"
54951
+ ],
54952
+ derived: [],
54953
+ volatile: ["projectId", "createdAt", "updatedAt"],
54954
+ normalization: {
54955
+ description: "missingIsNull",
54956
+ color: "missingIsNull",
54957
+ emoji: "missingIsNull",
54958
+ archivedAt: "missingIsNull",
54959
+ transitionRules: "missingIsNull",
54960
+ transitionToStatusIdOnEditText: "missingIsNull",
54961
+ transitionToWhenSourceBecomesStatusId: "missingIsNull",
54962
+ system: "nullIsAbsent"
54963
+ }
54964
+ },
54965
+ "internal-record-relation": {
54966
+ authored: [
54967
+ "id",
54968
+ "relationKind",
54969
+ "sourceRecordKind",
54970
+ "sourceRecordId",
54971
+ "targetRecordKind",
54972
+ "targetRecordId",
54973
+ "orderKey"
54974
+ ],
54975
+ derived: [],
54976
+ volatile: ["projectId", "createdAt", "updatedAt"],
54977
+ normalization: { orderKey: "nullIsAbsent" }
54978
+ }
54979
+ },
54980
+ sdkDeclarations: {
54981
+ attributes: {
54982
+ enums: {
54983
+ NeoStorage: [
54984
+ "Inherit",
54985
+ "Immutable",
54986
+ "Save",
54987
+ "Session",
54988
+ "Writable",
54989
+ "User"
54990
+ ],
54991
+ NeoAllowedStorage: [
54992
+ "Any",
54993
+ "Immutable",
54994
+ "Save",
54995
+ "Session",
54996
+ "Writable",
54997
+ "User"
54998
+ ],
54999
+ NeoListKind: ["Ordered", "Unordered"],
55000
+ NeoDictionaryKeyKind: ["String", "Enum"],
55001
+ NeoClassVisibility: ["Visible", "Hidden"],
55002
+ NeoSubtreeDistribution: ["Sparse", "Packed"],
55003
+ NeoStringFormat: ["Localized", "Plain"],
55004
+ NeoMemberSearchBy: ["None", "MemberKey"],
55005
+ NeoListIndexKind: ["Bucket", "Unique"],
55006
+ NeoColumnVisibility: ["Visible", "Hidden"],
55007
+ NeoColumnPin: ["None", "Leading"],
55008
+ NeoColumnOverflow: ["Clip", "Wrap"],
55009
+ NeoFileKind: ["Sprite", "Audio"],
55010
+ NeoEffectKind: ["None", "Auto"]
55011
+ },
55012
+ markers: {
55013
+ NeoSchemaClassAttribute: {
55014
+ targets: ["Class"],
55015
+ constructor: [
55016
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55017
+ ],
55018
+ properties: [
55019
+ { type: "string?", name: "Id", access: "get" },
55020
+ { type: "string?", name: "Name", access: "set" },
55021
+ {
55022
+ type: "NeoClassVisibility",
55023
+ name: "Visibility",
55024
+ access: "set",
55025
+ default: "NeoClassVisibility.Visible"
55026
+ },
55027
+ {
55028
+ type: "NeoAllowedStorage",
55029
+ name: "AllowedStorage",
55030
+ access: "set",
55031
+ default: "NeoAllowedStorage.Any"
55032
+ },
55033
+ { type: "string[]?", name: "AllowedStorageKeys", access: "set" }
55034
+ ]
55035
+ },
55036
+ NeoInterfaceAttribute: {
55037
+ targets: ["Interface"],
55038
+ constructor: [
55039
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55040
+ ],
55041
+ properties: [
55042
+ { type: "string?", name: "Id", access: "get" },
55043
+ { type: "string?", name: "Name", access: "set" }
55044
+ ]
55045
+ },
55046
+ NeoEnumAttribute: {
55047
+ targets: ["Enum"],
55048
+ constructor: [
55049
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55050
+ ],
55051
+ properties: [
55052
+ { type: "string?", name: "Id", access: "get" },
55053
+ { type: "string?", name: "Name", access: "set" }
55054
+ ]
55055
+ },
55056
+ NeoIdAttribute: {
55057
+ targets: ["GenericParameter"],
55058
+ constructor: [
55059
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55060
+ ],
55061
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55062
+ },
55063
+ NeoMemberAttribute: {
55064
+ targets: ["Property", "Method"],
55065
+ constructor: [
55066
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55067
+ ],
55068
+ properties: [
55069
+ { type: "string?", name: "Id", access: "get" },
55070
+ { type: "string?", name: "Key", access: "set" },
55071
+ { type: "string?", name: "Name", access: "set" },
55072
+ {
55073
+ type: "NeoStorage",
55074
+ name: "Storage",
55075
+ access: "set",
55076
+ default: "NeoStorage.Inherit"
55077
+ },
55078
+ { type: "string?", name: "StorageKey", access: "set" },
55079
+ { type: "int", name: "Order", access: "set", default: "-1" }
55080
+ ]
55081
+ },
55082
+ NeoSystemAttribute: {
55083
+ targets: ["Class", "Interface", "Enum", "Property", "Method"],
55084
+ constructor: [
55085
+ {
55086
+ type: "NeoSystemProtectionKind",
55087
+ name: "kind",
55088
+ assigns: "Kind"
55089
+ }
55090
+ ],
55091
+ properties: [
55092
+ {
55093
+ type: "NeoSystemProtectionKind",
55094
+ name: "Kind",
55095
+ access: "get"
55096
+ },
55097
+ {
55098
+ type: "NeoWorldKind",
55099
+ name: "WorldKind",
55100
+ access: "set",
55101
+ default: "NeoWorldKind.None"
55102
+ }
55103
+ ]
55104
+ },
55105
+ NeoTextAttribute: {
55106
+ targets: ["Property"],
55107
+ properties: [
55108
+ {
55109
+ type: "NeoStringFormat",
55110
+ name: "Format",
55111
+ access: "set",
55112
+ default: "NeoStringFormat.Localized"
55113
+ },
55114
+ {
55115
+ type: "NeoMemberSearchBy",
55116
+ name: "SearchBy",
55117
+ access: "set",
55118
+ default: "NeoMemberSearchBy.None"
55119
+ }
55120
+ ]
55121
+ },
55122
+ NeoNullAttribute: { targets: ["Property"], properties: [] },
55123
+ NeoNumberAttribute: {
55124
+ targets: ["Property"],
55125
+ properties: [
55126
+ {
55127
+ type: "double",
55128
+ name: "Min",
55129
+ access: "set",
55130
+ default: "double.NaN"
55131
+ },
55132
+ {
55133
+ type: "double",
55134
+ name: "Max",
55135
+ access: "set",
55136
+ default: "double.NaN"
55137
+ },
55138
+ { type: "string?", name: "DecimalMin", access: "set" },
55139
+ { type: "string?", name: "DecimalMax", access: "set" },
55140
+ {
55141
+ type: "int",
55142
+ name: "DecimalPoints",
55143
+ access: "set",
55144
+ default: "-1"
55145
+ }
55146
+ ]
55147
+ },
55148
+ NeoDictionaryAttribute: {
55149
+ targets: ["Property"],
55150
+ properties: [
55151
+ {
55152
+ type: "NeoDictionaryKeyKind",
55153
+ name: "KeyKind",
55154
+ access: "set",
55155
+ default: "NeoDictionaryKeyKind.String"
55156
+ },
55157
+ { type: "Type?", name: "KeyEnum", access: "set" }
55158
+ ]
55159
+ },
55160
+ NeoListAttribute: {
55161
+ targets: ["Property"],
55162
+ properties: [
55163
+ {
55164
+ type: "NeoListKind",
55165
+ name: "Kind",
55166
+ access: "set",
55167
+ default: "NeoListKind.Ordered"
55168
+ }
55169
+ ]
55170
+ },
55171
+ NeoEntriesAttribute: {
55172
+ targets: ["Class", "Property"],
55173
+ constructor: [
55174
+ { type: "string", name: "settings", assigns: "Settings" }
55175
+ ],
55176
+ properties: [{ type: "string", name: "Settings", access: "get" }]
55177
+ },
55178
+ NeoSchemaOrderAttribute: {
55179
+ targets: ["Class", "Property"],
55180
+ constructor: [
55181
+ {
55182
+ type: "string[]",
55183
+ name: "members",
55184
+ modifier: "params",
55185
+ assigns: "Members"
55186
+ }
55187
+ ],
55188
+ properties: [{ type: "string[]", name: "Members", access: "get" }]
55189
+ },
55190
+ NeoIndexAttribute: {
55191
+ targets: ["Property"],
55192
+ allowMultiple: true,
55193
+ constructor: [{ type: "string", name: "member", assigns: "Member" }],
55194
+ properties: [
55195
+ { type: "string", name: "Member", access: "get" },
55196
+ {
55197
+ type: "NeoListIndexKind",
55198
+ name: "Kind",
55199
+ access: "set",
55200
+ default: "NeoListIndexKind.Bucket"
55201
+ }
55202
+ ]
55203
+ },
55204
+ NeoColumnAttribute: {
55205
+ targets: ["Property"],
55206
+ allowMultiple: true,
55207
+ constructor: [{ type: "string", name: "member", assigns: "Member" }],
55208
+ properties: [
55209
+ { type: "string", name: "Member", access: "get" },
55210
+ { type: "int", name: "Width", access: "set", default: "-1" },
55211
+ {
55212
+ type: "NeoColumnVisibility",
55213
+ name: "Visibility",
55214
+ access: "set",
55215
+ default: "NeoColumnVisibility.Visible"
55216
+ },
55217
+ {
55218
+ type: "NeoColumnPin",
55219
+ name: "Pin",
55220
+ access: "set",
55221
+ default: "NeoColumnPin.None"
55222
+ },
55223
+ {
55224
+ type: "NeoColumnOverflow",
55225
+ name: "Overflow",
55226
+ access: "set",
55227
+ default: "NeoColumnOverflow.Clip"
55228
+ }
55229
+ ]
55230
+ },
55231
+ NeoLookupAttribute: {
55232
+ targets: ["Property"],
55233
+ constructor: [
55234
+ {
55235
+ type: "string",
55236
+ name: "collectionMember",
55237
+ assigns: "CollectionMember"
55238
+ }
55239
+ ],
55240
+ properties: [
55241
+ { type: "string", name: "CollectionMember", access: "get" },
55242
+ { type: "string?", name: "CollectionValueMember", access: "set" }
55243
+ ]
55244
+ },
55245
+ NeoDialogueAttribute: {
55246
+ targets: ["Property"],
55247
+ properties: [{ type: "string?", name: "Group", access: "set" }]
55248
+ },
55249
+ NeoFileAttribute: {
55250
+ targets: ["Property"],
55251
+ constructor: [{ type: "NeoFileKind", name: "kind", assigns: "Kind" }],
55252
+ properties: [
55253
+ { type: "NeoFileKind", name: "Kind", access: "get" },
55254
+ { type: "Type?", name: "Template", access: "set" }
55255
+ ]
55256
+ },
55257
+ NeoComputedAttribute: { targets: ["Property"], properties: [] },
55258
+ NeoScriptAttribute: { targets: ["Method"], properties: [] },
55259
+ NeoFunctionAttribute: { targets: ["Method"], properties: [] },
55260
+ NeoEnumOptionAttribute: {
55261
+ targets: ["Field"],
55262
+ constructor: [
55263
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55264
+ ],
55265
+ properties: [
55266
+ { type: "string?", name: "Id", access: "get" },
55267
+ { type: "string?", name: "Key", access: "set" },
55268
+ { type: "string?", name: "Text", access: "set" }
55269
+ ]
55270
+ },
55271
+ NeoTextureTemplateAttribute: {
55272
+ targets: ["Class", "Property"],
55273
+ constructor: [
55274
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55275
+ ],
55276
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55277
+ },
55278
+ NeoAudioTemplateAttribute: {
55279
+ targets: ["Class", "Property"],
55280
+ constructor: [
55281
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55282
+ ],
55283
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55284
+ },
55285
+ NeoLocalizationAttribute: {
55286
+ targets: ["Class", "Property"],
55287
+ constructor: [
55288
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55289
+ ],
55290
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55291
+ },
55292
+ NeoLocalizationStatusAttribute: {
55293
+ targets: ["Class", "Property"],
55294
+ constructor: [
55295
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55296
+ ],
55297
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55298
+ },
55299
+ NeoRegistryAttribute: { targets: ["Class"], properties: [] },
55300
+ NeoRelationConfigurationAttribute: {
55301
+ targets: ["Class"],
55302
+ properties: []
55303
+ }
55304
+ }
55305
+ },
55306
+ settings: {
55307
+ enums: {
55308
+ NeoProjectRecordKind: [
55309
+ "Project",
55310
+ "Member",
55311
+ "Value",
55312
+ "Class",
55313
+ "InternalRecordRelation",
55314
+ "Enum",
55315
+ "Interface",
55316
+ "Dialogue",
55317
+ "DialogueNode",
55318
+ "DialogueGroup",
55319
+ "PriorityGroup",
55320
+ "ProjectFile",
55321
+ "UnityTextureTemplate",
55322
+ "UnityAudioClipTemplate",
55323
+ "LocalizationConfig",
55324
+ "LocalizationStatus",
55325
+ "LocalizedText",
55326
+ "Migration"
55327
+ ],
55328
+ NeoEntryKind: [
55329
+ "Null",
55330
+ "Boolean",
55331
+ "Integer",
55332
+ "String",
55333
+ "Float",
55334
+ "Decimal",
55335
+ "Vector2",
55336
+ "Vector2Int",
55337
+ "Vector3",
55338
+ "Vector3Int",
55339
+ "Color",
55340
+ "Dictionary",
55341
+ "List",
55342
+ "Class",
55343
+ "Enum",
55344
+ "Lookup",
55345
+ "DialogueLookup",
55346
+ "Sprite",
55347
+ "Audio",
55348
+ "Generic"
55349
+ ],
55350
+ NeoSystemProtectionKind: [
55351
+ "WorldAuthoring",
55352
+ "DialogueMemorySchema",
55353
+ "DialogueMemoryContainer",
55354
+ "DialoguePriorityDefault",
55355
+ "PolicyImmutable",
55356
+ "PolicyDeleteBlocked",
55357
+ "ScriptRuntime"
55358
+ ],
55359
+ NeoMemberRequirement: ["Optional", "Required"],
55360
+ NeoMemberMutability: ["Mutable", "ReadOnly"],
55361
+ NeoMemberModifier: ["Virtual", "Sealed", "Abstract", "Static"],
55362
+ NeoMemberAccess: ["Public", "Protected", "Private"],
55363
+ NeoMemberSelection: ["Single", "Multi"],
55364
+ NeoFunctionDispatch: ["Synchronous", "Asynchronous"],
55365
+ NeoMemberPayload: ["Full", "Partial"],
55366
+ NeoFunctionLogicMode: ["UI"],
55367
+ NeoWorldKind: [
55368
+ "CellPattern",
55369
+ "None",
55370
+ "TileGrid",
55371
+ "TileLayer",
55372
+ "ObjectLayer",
55373
+ "Tile",
55374
+ "ObjectBase",
55375
+ "LayerGroupBase",
55376
+ "SpriteObject",
55377
+ "Object",
55378
+ "TileLayerLink",
55379
+ "ObjectLayerLink",
55380
+ "PlacementTile",
55381
+ "ObjectCollider",
55382
+ "SortingGroup",
55383
+ "SortingLayer",
55384
+ "SmartTile",
55385
+ "SmartTileRule",
55386
+ "SmartTileNeighbor",
55387
+ "AnimationClip",
55388
+ "AnimationFrame",
55389
+ "AnimationChildOverride",
55390
+ "AnimationFrameBase",
55391
+ "AnimationSegmentFrame",
55392
+ "AnimationSegment",
55393
+ "SpriteAnimationSegment",
55394
+ "AnimationTrack",
55395
+ "AnimationChildTrack",
55396
+ "AnimationSegmentTrack",
55397
+ "SpriteAnimationSegmentTrack",
55398
+ "Variant",
55399
+ "VariantFolder",
55400
+ "LookupVariant",
55401
+ "LookupVariantFolder"
55402
+ ],
55403
+ NeoTextureType: [
55404
+ "Default",
55405
+ "NormalMap",
55406
+ "EditorGuiAndLegacyGui",
55407
+ "Sprite",
55408
+ "Cursor",
55409
+ "Cookie",
55410
+ "Lightmap",
55411
+ "SingleChannel"
55412
+ ],
55413
+ NeoSpriteMode: ["Single", "Multiple", "Polygon"],
55414
+ NeoSpriteMeshType: ["FullRect", "Tight"],
55415
+ NeoSpriteAlignment: [
55416
+ "Center",
55417
+ "TopLeft",
55418
+ "TopCenter",
55419
+ "TopRight",
55420
+ "LeftCenter",
55421
+ "RightCenter",
55422
+ "BottomLeft",
55423
+ "BottomCenter",
55424
+ "BottomRight",
55425
+ "Custom"
55426
+ ],
55427
+ NeoTextureWrapMode: [
55428
+ "Repeat",
55429
+ "Clamp",
55430
+ "Mirror",
55431
+ "MirrorOnce",
55432
+ "PerAxis"
55433
+ ],
55434
+ NeoTextureFilterMode: ["Point", "Bilinear", "Trilinear"],
55435
+ NeoTextureCompression: [
55436
+ "None",
55437
+ "LowQuality",
55438
+ "NormalQuality",
55439
+ "HighQuality"
55440
+ ],
55441
+ NeoTextureFormat: [
55442
+ "Automatic",
55443
+ "RgbaCompressedDxt5Bc3",
55444
+ "RgbCompressedDxt1Bc1",
55445
+ "Rgba32Bit",
55446
+ "Rgb24Bit"
55447
+ ],
55448
+ NeoAlphaSource: ["None", "InputTextureAlpha", "FromGrayScale"],
55449
+ NeoNonPowerOfTwoScale: ["None", "ToNearest", "ToLarger", "ToSmaller"],
55450
+ NeoNormalMapFiltering: ["Sharp", "Smooth"],
55451
+ NeoCookieLightType: ["Spot", "Directional", "Point"],
55452
+ NeoSingleChannelComponent: ["Alpha", "Red"],
55453
+ NeoTextureSwizzle: ["Red", "Green", "Blue", "Alpha", "Zero", "One"],
55454
+ NeoMipMapFiltering: ["Box", "Kaiser"],
55455
+ NeoTextureResizeAlgorithm: ["Mitchell", "Bilinear"],
55456
+ NeoAudioLoadType: [
55457
+ "DecompressOnLoad",
55458
+ "CompressedInMemory",
55459
+ "Streaming"
55460
+ ],
55461
+ NeoAudioCompressionFormat: ["Pcm", "Adpcm", "Vorbis"],
55462
+ NeoAudioSampleRate: [
55463
+ "PreserveSampleRate",
55464
+ "OptimizeSampleRate",
55465
+ "OverrideSampleRate"
55466
+ ]
55467
+ },
55468
+ classes: {
55469
+ NeoClassRelationDefinition: {
55470
+ constructors: [
55471
+ [{ type: "Type", name: "target", assigns: "Target" }],
55472
+ [
55473
+ { type: "string?", name: "id", assigns: "Id" },
55474
+ { type: "Type", name: "target", assigns: "Target" }
55475
+ ]
55476
+ ],
55477
+ properties: [
55478
+ { type: "string?", name: "Id" },
55479
+ { type: "Type", name: "Target", default: "typeof(object)" }
55480
+ ]
55481
+ },
55482
+ NeoGridRelationSettings: [
55483
+ {
55484
+ type: "List<NeoClassRelationDefinition>",
55485
+ name: "TileImports",
55486
+ default: "new List<NeoClassRelationDefinition>()"
55487
+ },
55488
+ {
55489
+ type: "List<NeoClassRelationDefinition>",
55490
+ name: "ObjectImports",
55491
+ default: "new List<NeoClassRelationDefinition>()"
55492
+ },
55493
+ {
55494
+ type: "List<NeoClassRelationDefinition>",
55495
+ name: "TileLayers",
55496
+ default: "new List<NeoClassRelationDefinition>()"
55497
+ },
55498
+ {
55499
+ type: "List<NeoClassRelationDefinition>",
55500
+ name: "ObjectLayers",
55501
+ default: "new List<NeoClassRelationDefinition>()"
55502
+ }
55503
+ ],
55504
+ NeoTileRelationSettings: [
55505
+ {
55506
+ type: "List<NeoClassRelationDefinition>",
55507
+ name: "CompatibleLayers",
55508
+ default: "new List<NeoClassRelationDefinition>()"
55509
+ },
55510
+ { type: "NeoClassRelationDefinition?", name: "DefaultLayer" }
55511
+ ],
55512
+ NeoObjectRelationSettings: [
55513
+ {
55514
+ type: "List<NeoClassRelationDefinition>",
55515
+ name: "CompatibleLayers",
55516
+ default: "new List<NeoClassRelationDefinition>()"
55517
+ },
55518
+ { type: "NeoClassRelationDefinition?", name: "DefaultLayer" }
55519
+ ],
55520
+ NeoTileLayerLinkRelationSettings: [
55521
+ { type: "NeoClassRelationDefinition?", name: "TargetLayer" }
55522
+ ],
55523
+ NeoObjectLayerLinkRelationSettings: [
55524
+ { type: "NeoClassRelationDefinition?", name: "TargetLayer" }
55525
+ ],
55526
+ NeoEntrySettings: [
55527
+ { type: "string?", name: "Id" },
55528
+ { type: "string", name: "Path", default: "string.Empty" },
55529
+ { type: "NeoEntryKind", name: "Kind" },
55530
+ {
55531
+ type: "NeoMemberRequirement",
55532
+ name: "Requirement",
55533
+ default: "NeoMemberRequirement.Optional"
55534
+ },
55535
+ {
55536
+ type: "NeoMemberMutability",
55537
+ name: "Mutability",
55538
+ default: "NeoMemberMutability.Mutable"
55539
+ },
55540
+ {
55541
+ type: "NeoMemberModifier",
55542
+ name: "Modifier",
55543
+ default: "NeoMemberModifier.Virtual"
55544
+ },
55545
+ {
55546
+ type: "NeoMemberAccess",
55547
+ name: "Access",
55548
+ default: "NeoMemberAccess.Public"
55549
+ },
55550
+ { type: "NeoMemberReference?", name: "Overrides" },
55551
+ {
55552
+ type: "NeoStorage",
55553
+ name: "Storage",
55554
+ default: "NeoStorage.Inherit"
55555
+ },
55556
+ { type: "string?", name: "StorageKey" },
55557
+ { type: "NeoValueSettings?", name: "Default" },
55558
+ { type: "NeoTextSettings?", name: "Text" },
55559
+ { type: "NeoNumberSettings?", name: "Number" },
55560
+ { type: "NeoDictionarySettings?", name: "Dictionary" },
55561
+ { type: "NeoListSettings?", name: "List" },
55562
+ { type: "NeoLookupSettings?", name: "Lookup" },
55563
+ { type: "NeoDialogueSettings?", name: "Dialogue" },
55564
+ { type: "NeoFileSettings?", name: "File" },
55565
+ { type: "NeoClassSettings?", name: "Class" },
55566
+ { type: "NeoEnumSettings?", name: "Enum" },
55567
+ { type: "NeoGenericSettings?", name: "Generic" },
55568
+ { type: "NeoSystemSettings?", name: "System" },
55569
+ {
55570
+ type: "IReadOnlyList<NeoEntrySettings>",
55571
+ name: "Entries",
55572
+ default: "new List<NeoEntrySettings>()"
55573
+ }
55574
+ ],
55575
+ NeoValueSettings: [
55576
+ { type: "bool", name: "IsNull" },
55577
+ { type: "Type?", name: "ConcreteType" },
55578
+ { type: "bool?", name: "Boolean" },
55579
+ { type: "long?", name: "Integer" },
55580
+ { type: "double?", name: "Number" },
55581
+ { type: "string?", name: "Text" },
55582
+ { type: "decimal?", name: "Decimal" },
55583
+ { type: "NeoVector2?", name: "Vector2" },
55584
+ { type: "NeoVector2Int?", name: "Vector2Int" },
55585
+ { type: "NeoVector3?", name: "Vector3" },
55586
+ { type: "NeoVector3Int?", name: "Vector3Int" },
55587
+ { type: "NeoColor?", name: "Color" },
55588
+ { type: "NeoSprite?", name: "Sprite" },
55589
+ { type: "NeoAudio?", name: "Audio" },
55590
+ { type: "NeoDialogue?", name: "Dialogue" },
55591
+ { type: "NeoReferenceSettings?", name: "Reference" },
55592
+ { type: "string?", name: "EnumOption" },
55593
+ { type: "IReadOnlyList<NeoValueSettings>?", name: "List" },
55594
+ {
55595
+ type: "IReadOnlyDictionary<string, NeoValueSettings>?",
55596
+ name: "Dictionary"
55597
+ },
55598
+ {
55599
+ type: "IReadOnlyDictionary<string, NeoValueSettings>?",
55600
+ name: "Object"
55601
+ }
55602
+ ],
55603
+ NeoReferenceSettings: [
55604
+ { type: "Type", name: "Type", default: "typeof(object)" },
55605
+ { type: "string", name: "Id", default: "string.Empty" }
55606
+ ],
55607
+ NeoTextSettings: [
55608
+ {
55609
+ type: "NeoStringFormat",
55610
+ name: "Format",
55611
+ default: "NeoStringFormat.Localized"
55612
+ },
55613
+ {
55614
+ type: "NeoMemberSearchBy",
55615
+ name: "SearchBy",
55616
+ default: "NeoMemberSearchBy.None"
55617
+ }
55618
+ ],
55619
+ NeoNumberSettings: [
55620
+ { type: "double?", name: "Min" },
55621
+ { type: "double?", name: "Max" },
55622
+ { type: "string?", name: "DecimalMin" },
55623
+ { type: "string?", name: "DecimalMax" },
55624
+ { type: "int?", name: "DecimalPoints" }
55625
+ ],
55626
+ NeoFunctionSettings: [{ type: "NeoFunctionLogicMode", name: "Logic" }],
55627
+ NeoDictionarySettings: [
55628
+ { type: "NeoDictionaryKeyKind", name: "KeyKind" },
55629
+ { type: "Type?", name: "KeyEnum" }
55630
+ ],
55631
+ NeoClassSettings: [
55632
+ { type: "Type", name: "Type", default: "typeof(object)" },
55633
+ { type: "IReadOnlyList<string>?", name: "SchemaOrder" },
55634
+ {
55635
+ type: "IReadOnlyDictionary<string, NeoGenericBindingSettings>?",
55636
+ name: "TypeArguments"
55637
+ }
55638
+ ],
55639
+ NeoGenericBindingSettings: [
55640
+ { type: "string", name: "Parameter", default: "string.Empty" },
55641
+ { type: "string?", name: "GenericParameter" },
55642
+ { type: "NeoEntrySettings?", name: "Member" }
55643
+ ],
55644
+ NeoEnumSettings: [
55645
+ { type: "Type", name: "Enum", default: "typeof(object)" },
55646
+ {
55647
+ type: "NeoMemberSelection",
55648
+ name: "Selection",
55649
+ default: "NeoMemberSelection.Single"
55650
+ }
55651
+ ],
55652
+ NeoGenericSettings: [
55653
+ { type: "string", name: "Parameter", default: "string.Empty" }
55654
+ ],
55655
+ NeoLookupSettings: [
55656
+ { type: "string", name: "CollectionMember", default: "string.Empty" },
55657
+ { type: "string?", name: "CollectionValueMember" },
55658
+ {
55659
+ type: "NeoMemberSelection",
55660
+ name: "Selection",
55661
+ default: "NeoMemberSelection.Single"
55662
+ }
55663
+ ],
55664
+ /**
55665
+ * Class-level settings. `TargetMember` names the member of another
55666
+ * class this class writes — schema metadata rather than row data, the
55667
+ * same shape `NeoLookupSettings.CollectionMember` uses to name a
55668
+ * collection.
55669
+ */
55670
+ NeoClassSchemaSettings: [
55671
+ { type: "string", name: "TargetMember", default: "string.Empty" }
55672
+ ],
55673
+ NeoDialogueSettings: [
55674
+ { type: "string?", name: "Group" },
55675
+ {
55676
+ type: "NeoMemberSelection",
55677
+ name: "Selection",
55678
+ default: "NeoMemberSelection.Single"
55679
+ }
55680
+ ],
55681
+ NeoFileSettings: [
55682
+ { type: "NeoFileKind", name: "Kind" },
55683
+ { type: "Type?", name: "Template" }
55684
+ ],
55685
+ NeoSystemSettings: [
55686
+ {
55687
+ type: "NeoSystemProtectionKind",
55688
+ name: "Kind",
55689
+ default: "NeoSystemProtectionKind.WorldAuthoring"
55690
+ },
55691
+ { type: "NeoWorldKind?", name: "WorldKind" }
55692
+ ],
55693
+ NeoListSettings: [
55694
+ { type: "NeoListKind", name: "Kind", default: "NeoListKind.Ordered" },
55695
+ {
55696
+ type: "IReadOnlyList<NeoListIndexSettings>",
55697
+ name: "Indexes",
55698
+ default: "new List<NeoListIndexSettings>()"
55699
+ },
55700
+ {
55701
+ type: "IReadOnlyList<NeoListColumnSettings>",
55702
+ name: "Columns",
55703
+ default: "new List<NeoListColumnSettings>()"
55704
+ }
55705
+ ],
55706
+ NeoListIndexSettings: [
55707
+ { type: "string", name: "Member", default: "string.Empty" },
55708
+ {
55709
+ type: "NeoListIndexKind",
55710
+ name: "Kind",
55711
+ default: "NeoListIndexKind.Bucket"
55712
+ }
55713
+ ],
55714
+ NeoListColumnSettings: [
55715
+ { type: "string", name: "Member", default: "string.Empty" },
55716
+ { type: "int?", name: "Width" },
55717
+ {
55718
+ type: "NeoColumnVisibility",
55719
+ name: "Visibility",
55720
+ default: "NeoColumnVisibility.Visible"
55721
+ },
55722
+ {
55723
+ type: "NeoColumnPin",
55724
+ name: "Pin",
55725
+ default: "NeoColumnPin.None"
55726
+ },
55727
+ {
55728
+ type: "NeoColumnOverflow",
55729
+ name: "Overflow",
55730
+ default: "NeoColumnOverflow.Clip"
55731
+ }
55732
+ ],
55733
+ NeoTextureTemplateSettings: [
55734
+ { type: "string", name: "Name", default: "string.Empty" },
55735
+ {
55736
+ type: "NeoTextureType",
55737
+ name: "TextureType",
55738
+ default: "NeoTextureType.Sprite"
55739
+ },
55740
+ { type: "bool", name: "SrgbTexture", default: "true" },
55741
+ {
55742
+ type: "NeoAlphaSource",
55743
+ name: "AlphaSource",
55744
+ default: "NeoAlphaSource.InputTextureAlpha"
55745
+ },
55746
+ { type: "bool", name: "AlphaIsTransparency", default: "true" },
55747
+ { type: "NeoNonPowerOfTwoScale", name: "NonPowerOfTwoScale" },
55748
+ { type: "bool", name: "IgnorePngGamma" },
55749
+ { type: "bool", name: "ReadWriteEnabled" },
55750
+ { type: "bool", name: "VirtualTextureOnly" },
55751
+ { type: "bool", name: "GenerateMipMaps" },
55752
+ { type: "bool", name: "BorderMipMaps" },
55753
+ { type: "NeoMipMapFiltering", name: "MipMapFiltering" },
55754
+ { type: "bool", name: "MipMapsPreserveCoverage" },
55755
+ { type: "double", name: "AlphaCutoffValue", default: "0.5" },
55756
+ { type: "bool", name: "FadeOutMipMaps" },
55757
+ { type: "int", name: "MipMapFadeDistanceStart", default: "1" },
55758
+ { type: "int", name: "MipMapFadeDistanceEnd", default: "3" },
55759
+ { type: "int", name: "AnisoLevel", default: "1" },
55760
+ {
55761
+ type: "NeoTextureWrapMode",
55762
+ name: "WrapMode",
55763
+ default: "NeoTextureWrapMode.Clamp"
55764
+ },
55765
+ { type: "NeoTextureWrapMode?", name: "WrapModeU" },
55766
+ { type: "NeoTextureWrapMode?", name: "WrapModeV" },
55767
+ {
55768
+ type: "NeoTextureFilterMode",
55769
+ name: "FilterMode",
55770
+ default: "NeoTextureFilterMode.Point"
55771
+ },
55772
+ { type: "int", name: "MaxTextureSize", default: "2048" },
55773
+ { type: "NeoTextureResizeAlgorithm", name: "ResizeAlgorithm" },
55774
+ { type: "NeoTextureCompression", name: "TextureCompression" },
55775
+ { type: "int", name: "CompressionQuality", default: "50" },
55776
+ { type: "bool", name: "CrunchedCompression" },
55777
+ {
55778
+ type: "NeoTexturePlatformSettings",
55779
+ name: "Platforms",
55780
+ default: "new()"
55781
+ },
55782
+ { type: "NeoSpriteSettings?", name: "Sprite" },
55783
+ { type: "NeoNormalMapSettings?", name: "NormalMap" },
55784
+ { type: "NeoCookieSettings?", name: "Cookie" },
55785
+ { type: "NeoSingleChannelSettings?", name: "SingleChannel" },
55786
+ { type: "NeoSwizzleSettings?", name: "Swizzle" }
55787
+ ],
55788
+ NeoTexturePlatformSettings: [
55789
+ {
55790
+ type: "NeoTexturePlatformEntry",
55791
+ name: "Default",
55792
+ default: "new()"
55793
+ },
55794
+ {
55795
+ type: "NeoTexturePlatformEntry",
55796
+ name: "Standalone",
55797
+ default: "new()"
55798
+ },
55799
+ { type: "NeoTexturePlatformEntry", name: "Web", default: "new()" }
55800
+ ],
55801
+ NeoTexturePlatformEntry: [
55802
+ { type: "bool", name: "Override" },
55803
+ { type: "int", name: "MaxTextureSize", default: "2048" },
55804
+ { type: "NeoTextureResizeAlgorithm", name: "ResizeAlgorithm" },
55805
+ { type: "NeoTextureFormat", name: "Format" },
55806
+ { type: "NeoTextureCompression", name: "TextureCompression" },
55807
+ { type: "bool", name: "CrunchedCompression" },
55808
+ { type: "int", name: "CompressionQuality", default: "50" }
55809
+ ],
55810
+ NeoSpriteSettings: [
55811
+ {
55812
+ type: "NeoSpriteMode",
55813
+ name: "Mode",
55814
+ default: "NeoSpriteMode.Multiple"
55815
+ },
55816
+ { type: "double", name: "PixelsPerUnit", default: "100" },
55817
+ {
55818
+ type: "NeoSpriteMeshType",
55819
+ name: "MeshType",
55820
+ default: "NeoSpriteMeshType.Tight"
55821
+ },
55822
+ { type: "int", name: "ExtrudeEdges", default: "1" },
55823
+ { type: "NeoSpriteAlignment", name: "PivotAlignment" },
55824
+ { type: "NeoVector2", name: "Pivot", default: "new(0.5, 0.5)" },
55825
+ { type: "bool", name: "GeneratePhysicsShape", default: "true" },
55826
+ { type: "NeoSpriteSliceSettings?", name: "Slice" }
55827
+ ],
55828
+ NeoSpriteSliceSettings: [
55829
+ { type: "NeoVector2", name: "PixelSize" },
55830
+ { type: "NeoVector2", name: "Offset" },
55831
+ { type: "NeoVector2", name: "Padding" },
55832
+ { type: "bool", name: "KeepEmptyRects" },
55833
+ { type: "NeoSpriteAlignment", name: "PivotAlignment" },
55834
+ { type: "NeoVector2", name: "Pivot" },
55835
+ { type: "NeoVector4", name: "Border" },
55836
+ { type: "string", name: "NamingPattern", default: '"{0}"' },
55837
+ { type: "int", name: "NamingStartIndex" },
55838
+ { type: "bool", name: "ColumnMajor" }
55839
+ ],
55840
+ NeoNormalMapSettings: [
55841
+ { type: "bool", name: "CreateFromGrayscale" },
55842
+ { type: "double", name: "Bumpiness", default: "0.25" },
55843
+ {
55844
+ type: "NeoNormalMapFiltering",
55845
+ name: "Filtering",
55846
+ default: "NeoNormalMapFiltering.Smooth"
55847
+ },
55848
+ { type: "bool", name: "FlipGreenChannel" }
55849
+ ],
55850
+ NeoCookieSettings: [{ type: "NeoCookieLightType", name: "LightType" }],
55851
+ NeoSingleChannelSettings: [
55852
+ { type: "NeoSingleChannelComponent", name: "Component" }
55853
+ ],
55854
+ NeoSwizzleSettings: [
55855
+ {
55856
+ type: "NeoTextureSwizzle",
55857
+ name: "R",
55858
+ default: "NeoTextureSwizzle.Red"
55859
+ },
55860
+ {
55861
+ type: "NeoTextureSwizzle",
55862
+ name: "G",
55863
+ default: "NeoTextureSwizzle.Green"
55864
+ },
55865
+ {
55866
+ type: "NeoTextureSwizzle",
55867
+ name: "B",
55868
+ default: "NeoTextureSwizzle.Blue"
55869
+ },
55870
+ {
55871
+ type: "NeoTextureSwizzle",
55872
+ name: "A",
55873
+ default: "NeoTextureSwizzle.Alpha"
55874
+ }
55875
+ ],
55876
+ NeoAudioTemplateSettings: [
55877
+ { type: "string", name: "Name", default: "string.Empty" },
55878
+ { type: "bool", name: "ForceToMono" },
55879
+ { type: "bool", name: "Normalize" },
55880
+ { type: "bool", name: "LoadInBackground" },
55881
+ { type: "bool", name: "Ambisonic" },
55882
+ { type: "NeoAudioLoadType", name: "LoadType" },
55883
+ {
55884
+ type: "NeoAudioCompressionFormat",
55885
+ name: "CompressionFormat",
55886
+ default: "NeoAudioCompressionFormat.Vorbis"
55887
+ },
55888
+ { type: "double", name: "Quality", default: "1" },
55889
+ { type: "NeoAudioSampleRate", name: "SampleRate" },
55890
+ { type: "int?", name: "OverrideSampleRate" },
55891
+ { type: "bool", name: "PreloadAudioData", default: "true" }
55892
+ ],
55893
+ NeoLocalizationSettings: [
55894
+ { type: "string", name: "MainLocale", default: '"en-US"' },
55895
+ {
55896
+ type: "IReadOnlyList<NeoLocaleSettings>",
55897
+ name: "Locales",
55898
+ default: "new List<NeoLocaleSettings>()"
55899
+ },
55900
+ {
55901
+ type: "IReadOnlyList<string>",
55902
+ name: "StatusIds",
55903
+ default: "new List<string>()"
55904
+ },
55905
+ {
55906
+ type: "string",
55907
+ name: "MainLocaleDefaultStatus",
55908
+ default: "string.Empty"
55909
+ }
55910
+ ],
55911
+ NeoLocaleSettings: [
55912
+ { type: "string", name: "Locale", default: "string.Empty" },
55913
+ { type: "string?", name: "SourceLocale" },
55914
+ { type: "string?", name: "Name" },
55915
+ { type: "int", name: "Order" },
55916
+ { type: "long?", name: "ArchivedAt" }
55917
+ ],
55918
+ NeoLocalizationStatusSettings: [
55919
+ { type: "string", name: "Slug", default: "string.Empty" },
55920
+ { type: "string", name: "Name", default: "string.Empty" },
55921
+ { type: "string?", name: "Description" },
55922
+ { type: "string?", name: "Color" },
55923
+ { type: "string?", name: "Emoji" },
55924
+ { type: "long?", name: "ArchivedAt" },
55925
+ { type: "IReadOnlyList<string>?", name: "TransitionRules" },
55926
+ { type: "string?", name: "TransitionOnTextEdit" },
55927
+ { type: "string?", name: "TransitionWhenSourceBecomes" },
55928
+ { type: "NeoSystemSettings?", name: "System" }
55929
+ ]
55930
+ },
55931
+ records: {
55932
+ NeoProjectRecordReference: {
55933
+ kind: "readonly record struct",
55934
+ catalog: true,
55935
+ parameters: [
55936
+ { type: "NeoProjectRecordKind", name: "Kind" },
55937
+ { type: "string", name: "Id" }
55938
+ ]
55939
+ },
55940
+ NeoInternalRecordRelationDefinition: {
55941
+ kind: "sealed record",
55942
+ catalog: true,
55943
+ parameters: [
55944
+ { type: "string?", name: "Id" },
55945
+ { type: "string", name: "RelationKind" },
55946
+ { type: "NeoProjectRecordReference", name: "Source" },
55947
+ { type: "NeoProjectRecordReference", name: "Target" }
55948
+ ]
55949
+ },
55950
+ NeoVector2: {
55951
+ kind: "readonly record struct",
55952
+ parameters: [
55953
+ { type: "double", name: "X" },
55954
+ { type: "double", name: "Y" }
55955
+ ]
55956
+ },
55957
+ NeoVector2Int: {
55958
+ kind: "readonly record struct",
55959
+ parameters: [
55960
+ { type: "int", name: "X" },
55961
+ { type: "int", name: "Y" }
55962
+ ]
55963
+ },
55964
+ NeoVector3: {
55965
+ kind: "readonly record struct",
55966
+ parameters: [
55967
+ { type: "double", name: "X" },
55968
+ { type: "double", name: "Y" },
55969
+ { type: "double", name: "Z" }
55970
+ ]
55971
+ },
55972
+ NeoVector3Int: {
55973
+ kind: "readonly record struct",
55974
+ parameters: [
55975
+ { type: "int", name: "X" },
55976
+ { type: "int", name: "Y" },
55977
+ { type: "int", name: "Z" }
55978
+ ]
55979
+ },
55980
+ NeoVector4: {
55981
+ kind: "readonly record struct",
55982
+ parameters: [
55983
+ { type: "double", name: "X" },
55984
+ { type: "double", name: "Y" },
55985
+ { type: "double", name: "Z" },
55986
+ { type: "double", name: "W" }
55987
+ ]
55988
+ },
55989
+ NeoColor: {
55990
+ kind: "readonly record struct",
55991
+ parameters: [
55992
+ { type: "double", name: "R" },
55993
+ { type: "double", name: "G" },
55994
+ { type: "double", name: "B" },
55995
+ { type: "double", name: "A" }
55996
+ ]
55997
+ },
55998
+ NeoSprite: {
55999
+ kind: "sealed record",
56000
+ parameters: [
56001
+ { type: "string", name: "FileId" },
56002
+ { type: "int", name: "SliceIndex" }
56003
+ ]
56004
+ },
56005
+ NeoAudio: {
56006
+ kind: "sealed record",
56007
+ parameters: [{ type: "string", name: "FileId" }]
56008
+ },
56009
+ NeoDialogue: {
56010
+ kind: "sealed record",
56011
+ parameters: [{ type: "string", name: "DialogueId" }]
56012
+ },
56013
+ "NeoLookup<T>": {
56014
+ kind: "sealed record",
56015
+ parameters: [{ type: "string", name: "ValueId" }]
56016
+ },
56017
+ NeoMemberReference: {
56018
+ kind: "readonly record struct",
56019
+ parameters: [{ type: "string", name: "Id" }]
56020
+ }
56021
+ },
56022
+ intrinsics: {
56023
+ Neo: [
56024
+ {
56025
+ typeParameters: "<T>",
56026
+ returnType: "T",
56027
+ name: "Ref",
56028
+ parameters: [{ type: "string", name: "id" }],
56029
+ expression: "default!"
56030
+ },
56031
+ {
56032
+ typeParameters: "<T>",
56033
+ returnType: "NeoLookup<T>",
56034
+ name: "Lookup",
56035
+ parameters: [{ type: "string", name: "id" }],
56036
+ expression: "new(id)"
56037
+ },
56038
+ {
56039
+ returnType: "NeoDialogue",
56040
+ name: "Dialogue",
56041
+ parameters: [{ type: "string", name: "id" }],
56042
+ expression: "new(id)"
56043
+ },
56044
+ {
56045
+ returnType: "NeoSprite",
56046
+ name: "Sprite",
56047
+ parameters: [
56048
+ { type: "string", name: "fileId" },
56049
+ { type: "int", name: "sliceIndex", default: "0" }
56050
+ ],
56051
+ expression: "new(fileId, sliceIndex)"
56052
+ },
56053
+ {
56054
+ returnType: "NeoAudio",
56055
+ name: "Audio",
56056
+ parameters: [{ type: "string", name: "fileId" }],
56057
+ expression: "new(fileId)"
56058
+ },
56059
+ {
56060
+ returnType: "NeoMemberReference",
56061
+ name: "Member",
56062
+ parameters: [{ type: "string", name: "id" }],
56063
+ expression: "new(id)"
56064
+ }
56065
+ ]
56066
+ }
56067
+ }
56068
+ }
56069
+ });
56070
+
54426
56071
  // src/project-source/workspace-status-core.ts
54427
56072
  var ANIMATION_DOCUMENT_RECORD_KINDS = [
54428
56073
  ProjectRecordKind.Project,
@@ -54734,6 +56379,16 @@ var WORLD_OBJECT_CONTRACT_WORLD_KINDS = /* @__PURE__ */ new Set([
54734
56379
  NeoWorldSystemClassKind.SpriteObject
54735
56380
  ]);
54736
56381
 
56382
+ // ../src/models/exports/unity-codegen-revision.ts
56383
+ var UNITY_CODEGEN_REVISION = "45a0847addd4616acfc29f142556dcb2e0a27daae14d6aa456430228e66dbc07";
56384
+
56385
+ // src/export-cache.ts
56386
+ var CACHE_BUILD = JSON.stringify([
56387
+ PROJECT_SCHEMA_CONTRACT.cliVersion,
56388
+ NEOSCRIPT_COMPILER_REVISION,
56389
+ UNITY_CODEGEN_REVISION
56390
+ ]);
56391
+
54737
56392
  // src/export-state.ts
54738
56393
  import { join } from "node:path";
54739
56394
  var EXPORT_STATE_FILE = join(".neo", "export.json");