@neocompose/cli 0.72.0 → 0.72.2

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
  }
@@ -38356,6 +38520,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38356
38520
  (candidate) => (candidate.kind === "function" || candidate.kind === "method") && candidate.name === callee.name
38357
38521
  );
38358
38522
  if (member) {
38523
+ this.validateFunctionReceiver(receiver, callee.name, optional2, pos);
38359
38524
  if (type !== void 0) this.assertMemberAccessible(type, member, pos);
38360
38525
  if (member.static === true) {
38361
38526
  throw new CompileError(
@@ -38442,39 +38607,8 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38442
38607
  }
38443
38608
  };
38444
38609
  }
38445
- resolveDelegateCallee(callee, scope, receiverValue) {
38446
- if (callee.kind === "ident") {
38447
- const scoped = scope.lookup(callee.name);
38448
- const implicit = this.implicitMember(callee.name);
38449
- if (scoped === null && (implicit === null || implicit.symbol.kind === "function" || implicit.symbol.kind === "method")) {
38450
- return null;
38451
- }
38452
- const resolved = this.resolveIdentifier(callee.name, scope, callee.pos);
38453
- return resolved.type.kind === "delegate" ? resolved : null;
38454
- }
38455
- if (callee.kind !== "member") return null;
38456
- try {
38457
- const resolved = this.resolveMember(
38458
- callee.receiver,
38459
- callee.name,
38460
- scope,
38461
- callee.pos,
38462
- callee.optional === true,
38463
- receiverValue
38464
- );
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) {
38610
+ /** Classify callable values once before falling back to ordinary methods. */
38611
+ resolveCallableValueCallee(callee, scope, receiverValue) {
38478
38612
  if (callee.kind === "ident") {
38479
38613
  const scoped = scope.lookup(callee.name);
38480
38614
  const implicit = this.implicitMember(callee.name);
@@ -38482,7 +38616,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38482
38616
  return null;
38483
38617
  }
38484
38618
  const resolved = this.resolveIdentifier(callee.name, scope, callee.pos);
38485
- return resolved.type.kind === "action" ? resolved : null;
38619
+ return resolved.type.kind === "delegate" || resolved.type.kind === "action" ? resolved : null;
38486
38620
  }
38487
38621
  if (callee.kind !== "member") return null;
38488
38622
  try {
@@ -38494,7 +38628,7 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
38494
38628
  callee.optional === true,
38495
38629
  receiverValue
38496
38630
  );
38497
- return resolved.type.kind === "action" ? resolved : null;
38631
+ return resolved.type.kind === "delegate" || resolved.type.kind === "action" ? resolved : null;
38498
38632
  } catch (error) {
38499
38633
  if (error instanceof CompileError) return null;
38500
38634
  throw error;
@@ -39535,12 +39669,10 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
39535
39669
  callableSignatureForReceiver(symbol, receiver) {
39536
39670
  let parameters = symbol.parameters ?? [];
39537
39671
  let returnType = symbol.returnType ?? symbol.type;
39538
- if (this.context.projectSourceKind !== "spec" && !(receiver?.kind === "instance" && receiver.dispatch === "base")) {
39539
- return { parameters, returnType };
39540
- }
39541
39672
  if (receiver?.kind !== "instance") return { parameters, returnType };
39542
39673
  const receiverType = receiver.expression.type;
39543
39674
  if (receiverType.kind !== "named") return { parameters, returnType };
39675
+ if (!receiverType.typeArguments?.length) return { parameters, returnType };
39544
39676
  const declaring = this.project.typeById.get(receiverType.typeId);
39545
39677
  if (declaring === void 0) return { parameters, returnType };
39546
39678
  parameters = parameters.map((parameter3) => ({
@@ -40444,6 +40576,21 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
40444
40576
  callSiteId: this.nextCallSite(expression.pos)
40445
40577
  };
40446
40578
  }
40579
+ validateFunctionReceiver(receiver, name, optional2, pos) {
40580
+ if (optional2 && !isNullable(receiver.type)) {
40581
+ throw new CompileError(
40582
+ `\`?.\` requires an optional receiver; got ${this.describe(receiver.type)}`,
40583
+ pos
40584
+ );
40585
+ }
40586
+ const receiverType = receiver.optionalChainType ?? receiver.type;
40587
+ if (!optional2 && isNullable(receiverType)) {
40588
+ throw new CompileError(
40589
+ `Function '${name}' is called on ${this.describe(receiverType)}, which may be null. Use optional chaining, force-unwrapping, or a null check before calling it.`,
40590
+ pos
40591
+ );
40592
+ }
40593
+ }
40447
40594
  resolveFunctionStatement(expression, scope) {
40448
40595
  if (expression.kind !== "call") return null;
40449
40596
  const receiverValue = this.callReceiver(expression.callee, scope);
@@ -40474,19 +40621,15 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
40474
40621
  throw new Error("Base call did not produce a function call.");
40475
40622
  return result.pointer;
40476
40623
  }
40477
- const action = this.resolveActionCallee(
40624
+ const callable2 = this.resolveCallableValueCallee(
40478
40625
  expression.callee,
40479
40626
  scope,
40480
40627
  receiverValue
40481
40628
  );
40482
- if (action?.type.kind === "action") {
40483
- return this.resolveActionCall(action, action.type, expression, scope);
40629
+ if (callable2?.type.kind === "action") {
40630
+ return this.resolveActionCall(callable2, callable2.type, expression, scope);
40484
40631
  }
40485
- const delegate = this.resolveDelegateCallee(
40486
- expression.callee,
40487
- scope,
40488
- receiverValue
40489
- );
40632
+ const delegate = callable2;
40490
40633
  if (delegate?.type.kind === "delegate") {
40491
40634
  const delegateType = delegate.type;
40492
40635
  requireArgCount(
@@ -40611,12 +40754,19 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
40611
40754
  }
40612
40755
  }
40613
40756
  const receiver = receiverValue();
40614
- if (receiver.type.kind !== "named") return null;
40615
- const type = this.project.typeById.get(receiver.type.typeId);
40757
+ const memberReceiverType = neoScriptMemberLookupType(receiver.type);
40758
+ if (memberReceiverType.kind !== "named") return null;
40759
+ const type = this.project.typeById.get(memberReceiverType.typeId);
40616
40760
  const symbol = type?.members.find(
40617
40761
  (candidate) => (candidate.kind === "function" || candidate.kind === "method") && candidate.name === memberName
40618
40762
  );
40619
40763
  if (!symbol) return null;
40764
+ this.validateFunctionReceiver(
40765
+ receiver,
40766
+ memberName,
40767
+ expression.callee.optional === true,
40768
+ expression.pos
40769
+ );
40620
40770
  if (type !== void 0) {
40621
40771
  this.assertMemberAccessible(type, symbol, expression.pos);
40622
40772
  }
@@ -40629,7 +40779,10 @@ var StrictNeoScriptResolver = class _StrictNeoScriptResolver {
40629
40779
  this.validateCallableInContext(symbol, expression.pos);
40630
40780
  const resolved = this.resolveCallableArguments(
40631
40781
  symbol,
40632
- { kind: "instance", expression: receiver },
40782
+ {
40783
+ kind: "instance",
40784
+ expression: memberReceiverType === receiver.type ? receiver : { ...receiver, type: memberReceiverType }
40785
+ },
40633
40786
  expression.args,
40634
40787
  scope,
40635
40788
  expression.pos
@@ -45074,6 +45227,15 @@ function analyzerMemberById(context, id) {
45074
45227
  }
45075
45228
  return analyzerSchemaIndex(context).member(id) ?? null;
45076
45229
  }
45230
+ function resolveAnalyzerMember(context, member) {
45231
+ const index = activeSchemaIndexByContext.get(context);
45232
+ if (index === void 0) return resolveMember(member, context.vm.members);
45233
+ const cached = index.resolvedMembers.get(member);
45234
+ if (cached !== void 0) return cached;
45235
+ const resolved = resolveMemberFromIndex(member, index.membersById);
45236
+ index.resolvedMembers.set(member, resolved);
45237
+ return resolved;
45238
+ }
45077
45239
 
45078
45240
  // ../src/runtime/neoscript/neoscript-language-context-adapter.ts
45079
45241
  var NEOSCRIPT_COMPILER_ADAPTER_REVISION = 5;
@@ -45082,6 +45244,31 @@ var UNKNOWN_TYPE = {
45082
45244
  name: "unknown"
45083
45245
  };
45084
45246
  var storageResolverByContext = /* @__PURE__ */ new WeakMap();
45247
+ var dialogueProjects = /* @__PURE__ */ new WeakMap();
45248
+ function withDialogueContextType(project, context) {
45249
+ if (!context.dialogueContext) return project;
45250
+ let contexts = dialogueProjects.get(project);
45251
+ if (contexts === void 0) {
45252
+ contexts = /* @__PURE__ */ new Map();
45253
+ dialogueProjects.set(project, contexts);
45254
+ }
45255
+ const dialogueType = createDialogueContextType(context);
45256
+ const key = JSON.stringify(dialogueType);
45257
+ let scoped = contexts.get(key);
45258
+ if (scoped === void 0) {
45259
+ scoped = {
45260
+ ...project,
45261
+ types: [
45262
+ ...project.types.filter(
45263
+ (type) => type.id !== AnalyzerDialogueContextClassId
45264
+ ),
45265
+ dialogueType
45266
+ ]
45267
+ };
45268
+ contexts.set(key, scoped);
45269
+ }
45270
+ return scoped;
45271
+ }
45085
45272
  function createNeoScriptDocumentContext(context, projectOverride) {
45086
45273
  return withAnalyzerSchemaIndex(
45087
45274
  context,
@@ -45089,7 +45276,7 @@ function createNeoScriptDocumentContext(context, projectOverride) {
45089
45276
  );
45090
45277
  }
45091
45278
  function createNeoScriptDocumentContextInScope(context, projectOverride) {
45092
- const project = projectOverride ?? createNeoScriptProject(context);
45279
+ const project = projectOverride === void 0 ? createNeoScriptProject(context) : withDialogueContextType(projectOverride, context);
45093
45280
  const documentKind = context.scriptKind ?? "getter";
45094
45281
  const thisClass = context.thisClass ? namedType(context.thisClass.id, true) : void 0;
45095
45282
  const baseClass = overrideBaseClass(context);
@@ -45303,12 +45490,15 @@ function classToLanguageType(schemaClass2, context) {
45303
45490
  const record4 = analyzerMemberById(context, placement.memberId);
45304
45491
  if (!record4) continue;
45305
45492
  let projectedRecord = record4;
45493
+ let projectedBase;
45306
45494
  try {
45307
45495
  projectedRecord = substituteMember(
45308
45496
  record4,
45309
45497
  genericEnvironment,
45310
- context.vm.members
45498
+ context.vm.members,
45499
+ resolveAnalyzerMember(context, record4)
45311
45500
  );
45501
+ projectedBase = projectedRecord;
45312
45502
  } catch {
45313
45503
  }
45314
45504
  const symbol = memberToSymbol(
@@ -45318,7 +45508,8 @@ function classToLanguageType(schemaClass2, context) {
45318
45508
  placement.ownerClassId,
45319
45509
  index,
45320
45510
  context,
45321
- genericEnvironment
45511
+ genericEnvironment,
45512
+ projectedBase
45322
45513
  );
45323
45514
  if (!symbol) continue;
45324
45515
  names.add(symbol.name);
@@ -45403,7 +45594,8 @@ function constructorSignature(schemaClass2, members, context, genericEnvironment
45403
45594
  const resolved = substituteMember(
45404
45595
  record4,
45405
45596
  genericEnvironment,
45406
- context.vm.members
45597
+ context.vm.members,
45598
+ resolveAnalyzerMember(context, record4)
45407
45599
  );
45408
45600
  return {
45409
45601
  required: isRequiredMember(resolved),
@@ -45429,7 +45621,8 @@ function constructorSignature(schemaClass2, members, context, genericEnvironment
45429
45621
  const resolved = substituteMember(
45430
45622
  record4,
45431
45623
  genericEnvironment,
45432
- context.vm.members
45624
+ context.vm.members,
45625
+ resolveAnalyzerMember(context, record4)
45433
45626
  );
45434
45627
  return {
45435
45628
  required: isRequiredMember(resolved),
@@ -45481,10 +45674,10 @@ function canonicalMemberId(id, context) {
45481
45674
  }
45482
45675
  return resolve(id);
45483
45676
  }
45484
- function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index, context, genericEnvironment) {
45677
+ function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index, context, genericEnvironment, projectedBase) {
45485
45678
  let resolved;
45486
45679
  try {
45487
- resolved = resolveMember(record4, context.vm.members);
45680
+ resolved = projectedBase ?? resolveAnalyzerMember(context, record4);
45488
45681
  } catch {
45489
45682
  return null;
45490
45683
  }
@@ -45492,7 +45685,8 @@ function memberToSymbol(record4, schemaKey, containingClass, ownerClassId, index
45492
45685
  record4,
45493
45686
  context,
45494
45687
  /* @__PURE__ */ new Set(),
45495
- genericEnvironment
45688
+ genericEnvironment,
45689
+ resolved
45496
45690
  );
45497
45691
  const owner = analyzerSchemaIndex(context).class(ownerClassId);
45498
45692
  const inheritedFrom = owner && owner.id !== containingClass.id ? {
@@ -45823,7 +46017,7 @@ function createListIndexes(context) {
45823
46017
  for (const record4 of context.vm.members) {
45824
46018
  let resolved;
45825
46019
  try {
45826
- resolved = resolveMember(record4, context.vm.members);
46020
+ resolved = resolveAnalyzerMember(context, record4);
45827
46021
  } catch {
45828
46022
  continue;
45829
46023
  }
@@ -45853,12 +46047,12 @@ function createListIndexes(context) {
45853
46047
  }
45854
46048
  return result;
45855
46049
  }
45856
- function memberRuntimeType(record4, context, seen = /* @__PURE__ */ new Set(), genericEnvironment) {
46050
+ function memberRuntimeType(record4, context, seen = /* @__PURE__ */ new Set(), genericEnvironment, projectedBase) {
45857
46051
  if (seen.has(record4.id)) return UNKNOWN_TYPE;
45858
46052
  const nextSeen = new Set(seen).add(record4.id);
45859
46053
  let member;
45860
46054
  try {
45861
- member = resolveMember(record4, context.vm.members);
46055
+ member = projectedBase ?? resolveAnalyzerMember(context, record4);
45862
46056
  } catch {
45863
46057
  return UNKNOWN_TYPE;
45864
46058
  }
@@ -46105,7 +46299,12 @@ function classArguments(member, context, seen, genericEnvironment) {
46105
46299
  function substituteForGenericEnvironment(member, environment, context) {
46106
46300
  if (!environment) return member;
46107
46301
  try {
46108
- return substituteMember(member, environment, context.vm.members);
46302
+ return substituteMember(
46303
+ member,
46304
+ environment,
46305
+ context.vm.members,
46306
+ resolveAnalyzerMember(context, member)
46307
+ );
46109
46308
  } catch {
46110
46309
  return member;
46111
46310
  }
@@ -46391,7 +46590,7 @@ function scriptDefinitionLocations2(memberId, context) {
46391
46590
  if (!record4) return {};
46392
46591
  let resolved;
46393
46592
  try {
46394
- resolved = resolveMember(record4, context.vm.members);
46593
+ resolved = resolveAnalyzerMember(context, record4);
46395
46594
  } catch {
46396
46595
  return {};
46397
46596
  }
@@ -46477,7 +46676,7 @@ function virtualNeoSchemaClassHeader(schemaClass2, context) {
46477
46676
  return `public ${isAbstractClass(schemaClass2) ? "abstract " : ""}partial class ${virtualCSharpIdentifier(schemaClass2.name)}${genericParameters}${inheritance}${constraints.join("")} // Neo class ${schemaClass2.id}`;
46478
46677
  }
46479
46678
  function virtualConstraintMemberType(member, context) {
46480
- const resolved = resolveMember(member, context.vm.members);
46679
+ const resolved = resolveAnalyzerMember(context, member);
46481
46680
  switch (resolved.kind) {
46482
46681
  case 1 /* Bool */:
46483
46682
  return "bool";
@@ -49050,18 +49249,18 @@ function readProjectDocument(value, options = {}) {
49050
49249
  "localizationConfig",
49051
49250
  isProjectLocalizationConfig
49052
49251
  ) : readField(value, "localizationConfig", isProjectLocalizationConfig);
49053
- const storedValues = readArrayField(value, "values", isMemberValue);
49252
+ const storedValues = readDocumentArrayField(value, "values", isMemberValue);
49054
49253
  const valueBuckets = options.values === "stored" ? { values: storedValues } : projectDocumentValueBuckets(storedValues);
49055
49254
  return {
49056
49255
  version: readField(value, "version", isProjectVersion),
49057
- versions: readArrayField(value, "versions", isProjectVersion),
49256
+ versions: readDocumentArrayField(value, "versions", isProjectVersion),
49058
49257
  versionStatus: readField(value, "versionStatus", isProjectVersionStatus),
49059
- versionStatuses: readArrayField(
49258
+ versionStatuses: readDocumentArrayField(
49060
49259
  value,
49061
49260
  "versionStatuses",
49062
49261
  isProjectVersionStatus
49063
49262
  ),
49064
- releaseChannels: readArrayField(
49263
+ releaseChannels: readDocumentArrayField(
49065
49264
  value,
49066
49265
  "releaseChannels",
49067
49266
  isProjectReleaseChannel
@@ -49071,7 +49270,7 @@ function readProjectDocument(value, options = {}) {
49071
49270
  value,
49072
49271
  options.members === "authored-or-compiled" ? isAnyMemberAuthoredOrCompiled : isAnyMember
49073
49272
  ),
49074
- classes: readArrayField(value, "classes", isNeoSchemaClass),
49273
+ classes: readDocumentArrayField(value, "classes", isNeoSchemaClass),
49075
49274
  constructors: readOptionalArrayField(
49076
49275
  value,
49077
49276
  "constructors",
@@ -49092,13 +49291,13 @@ function readProjectDocument(value, options = {}) {
49092
49291
  // Retain the physical bucket after expansion for write-path comparisons.
49093
49292
  values: valueBuckets.values,
49094
49293
  ...valueBuckets.physicalValues === void 0 ? {} : { physicalValues: valueBuckets.physicalValues },
49095
- enums: readArrayField(
49294
+ enums: readDocumentArrayField(
49096
49295
  value,
49097
49296
  "enums",
49098
49297
  options.identities === "prospective" ? isProspectiveEnum : isEnum
49099
49298
  ),
49100
- interfaces: readArrayField(value, "interfaces", isNeoInterface),
49101
- ...options.dialogues === "omit" ? {} : { dialogues: readArrayField(value, "dialogues", isDialogue) },
49299
+ interfaces: readDocumentArrayField(value, "interfaces", isNeoInterface),
49300
+ ...options.dialogues === "omit" ? {} : { dialogues: readDocumentArrayField(value, "dialogues", isDialogue) },
49102
49301
  dialogueRecords: readOptionalArrayField(
49103
49302
  value,
49104
49303
  "dialogueRecords",
@@ -49109,26 +49308,38 @@ function readProjectDocument(value, options = {}) {
49109
49308
  "dialogueNodes",
49110
49309
  isDialogueNodeRecord
49111
49310
  ),
49112
- dialogueGroups: readArrayField(value, "dialogueGroups", isAnyDialogueGroup),
49113
- priorityGroups: readArrayField(value, "priorityGroups", isPriorityGroup),
49114
- projectFiles: readArrayField(value, "projectFiles", isProjectFile),
49115
- textureTemplates: readArrayField(
49311
+ dialogueGroups: readDocumentArrayField(
49312
+ value,
49313
+ "dialogueGroups",
49314
+ isAnyDialogueGroup
49315
+ ),
49316
+ priorityGroups: readDocumentArrayField(
49317
+ value,
49318
+ "priorityGroups",
49319
+ isPriorityGroup
49320
+ ),
49321
+ projectFiles: readDocumentArrayField(value, "projectFiles", isProjectFile),
49322
+ textureTemplates: readDocumentArrayField(
49116
49323
  value,
49117
49324
  "textureTemplates",
49118
49325
  isUnityTexture2DImportSettingsTemplate
49119
49326
  ),
49120
- audioClipTemplates: readArrayField(
49327
+ audioClipTemplates: readDocumentArrayField(
49121
49328
  value,
49122
49329
  "audioClipTemplates",
49123
49330
  isUnityAudioClipImportSettingsTemplate
49124
49331
  ),
49125
49332
  localizationConfig,
49126
- localizationStatuses: readArrayField(
49333
+ localizationStatuses: readDocumentArrayField(
49127
49334
  value,
49128
49335
  "localizationStatuses",
49129
49336
  isLocalizationStatus
49130
49337
  ),
49131
- localizedTexts: readArrayField(value, "localizedTexts", isLocalizedText),
49338
+ localizedTexts: readDocumentArrayField(
49339
+ value,
49340
+ "localizedTexts",
49341
+ isLocalizedText
49342
+ ),
49132
49343
  migrations: readOptionalArrayField(value, "migrations", isProjectMigration)
49133
49344
  };
49134
49345
  }
@@ -49158,7 +49369,7 @@ function isHashHead(value) {
49158
49369
  }
49159
49370
  function readField(source, key, isValid) {
49160
49371
  const value = source[key];
49161
- if (isValid(value)) return value;
49372
+ if (frozenRecordGuard(isValid)(value)) return value;
49162
49373
  throw new Error(
49163
49374
  `Convex project document field "${key}" has an invalid shape.`
49164
49375
  );
@@ -49166,11 +49377,23 @@ function readField(source, key, isValid) {
49166
49377
  function readOptionalNullableField(source, key, isValid) {
49167
49378
  const value = source[key];
49168
49379
  if (value === void 0 || value === null) return null;
49169
- if (isValid(value)) return value;
49380
+ if (frozenRecordGuard(isValid)(value)) return value;
49170
49381
  throw new Error(
49171
49382
  `Convex project document field "${key}" has an invalid shape.`
49172
49383
  );
49173
49384
  }
49385
+ var frozenRecordGuards = /* @__PURE__ */ new WeakMap();
49386
+ function frozenRecordGuard(isValid) {
49387
+ let guard = frozenRecordGuards.get(isValid);
49388
+ if (guard === void 0) {
49389
+ guard = memoizeFrozenJsonGuard(isValid);
49390
+ frozenRecordGuards.set(isValid, guard);
49391
+ }
49392
+ return guard;
49393
+ }
49394
+ function readDocumentArrayField(source, key, isValid) {
49395
+ return readArrayField(source, key, frozenRecordGuard(isValid));
49396
+ }
49174
49397
  function readArrayField(source, key, isValid) {
49175
49398
  const value = source[key];
49176
49399
  if (!Array.isArray(value)) {
@@ -49192,10 +49415,10 @@ function describeRejectedCompilerRevision(value) {
49192
49415
  }
49193
49416
  function readOptionalArrayField(source, key, isValid) {
49194
49417
  if (!Object.prototype.hasOwnProperty.call(source, key)) return [];
49195
- return readArrayField(source, key, isValid);
49418
+ return readDocumentArrayField(source, key, isValid);
49196
49419
  }
49197
49420
  function readStoredMembersField(source, isValid = isAnyMember) {
49198
- return readArrayField(
49421
+ return readDocumentArrayField(
49199
49422
  source,
49200
49423
  "members",
49201
49424
  isValid
@@ -49482,10 +49705,20 @@ var WORLD_LAYER_LINK_KINDS = /* @__PURE__ */ new Set([
49482
49705
  NeoWorldSystemClassKind.ObjectLayerLink
49483
49706
  ]);
49484
49707
 
49485
- // ../packages/manifest/src/value-comparison.ts
49486
- function isObjectRecord(value) {
49487
- return typeof value === "object" && value !== null && !Array.isArray(value);
49488
- }
49708
+ // ../src/database/project-snapshot-derived-edges.ts
49709
+ var REFERENCE_ID_PAYLOAD = canonicalJsonStringify({
49710
+ referenceKind: "record-id"
49711
+ });
49712
+ var REFERENCE_NAME_PAYLOAD = canonicalJsonStringify({
49713
+ referenceKind: "type-name"
49714
+ });
49715
+ var CONSTRUCTED_CLASS_PAYLOAD = canonicalJsonStringify({
49716
+ referenceKind: "constructed-class-id"
49717
+ });
49718
+ var BODY_CHILD_PAYLOAD = canonicalJsonStringify({
49719
+ relation: "body-child",
49720
+ depth: 1
49721
+ });
49489
49722
 
49490
49723
  // ../src/models/project/world-content-sidecar-validation.ts
49491
49724
  var WORLD_PLACEMENT_ASSET_KIND = /* @__PURE__ */ new Map([[NeoWorldSystemClassKind.Object, NeoWorldSystemClassKind.Object]]);
@@ -54423,6 +54656,1442 @@ var SPECIALIZED_RELATION_KINDS = /* @__PURE__ */ new Set([
54423
54656
  "world.object-layer-link.target"
54424
54657
  ]);
54425
54658
 
54659
+ // ../packages/manifest/schema-contract/registry.mjs
54660
+ var PROJECT_SCHEMA_CONTRACT = Object.freeze({
54661
+ cliVersion: "0.72.2",
54662
+ projectFileUploadBatchSize: 32,
54663
+ documentRecords: {
54664
+ member: {
54665
+ authored: [
54666
+ "id",
54667
+ "name",
54668
+ "docsText",
54669
+ "kind",
54670
+ "requirement",
54671
+ "mutability",
54672
+ "modifier",
54673
+ "access",
54674
+ "defaultValue",
54675
+ "extendsMemberId",
54676
+ "system",
54677
+ "storage",
54678
+ "storageKey",
54679
+ // Deliberately carries no normalization rule (P76 §1): absence is the
54680
+ // canonical automatic setting and explicit ordinal 0 is an explicit
54681
+ // `.Sparse`, so `absentMeansDefault` would collapse the two states
54682
+ // that the whole contract exists to keep apart.
54683
+ "distribution",
54684
+ "minValue",
54685
+ "maxValue",
54686
+ "decimalPoints",
54687
+ "format",
54688
+ "searchBy",
54689
+ "entryMemberId",
54690
+ "keyKind",
54691
+ "keyEnumId",
54692
+ "listKind",
54693
+ "indexes",
54694
+ "columnSettings",
54695
+ "classId",
54696
+ "payload",
54697
+ "schemaKeyOrder",
54698
+ "classArguments",
54699
+ "enumId",
54700
+ "selection",
54701
+ "collectionMemberId",
54702
+ "collectionValueId",
54703
+ "declaredTypeInfo",
54704
+ "targetTypeInfo",
54705
+ "valueTypeInfo",
54706
+ "dialogueGroupId",
54707
+ "code",
54708
+ "setterCode",
54709
+ "returnTypeInfo",
54710
+ "argumentTypes",
54711
+ "dispatch",
54712
+ "bodyMode",
54713
+ // P97 §1.1. No normalization rule, like `distribution`: absence means
54714
+ // unset (a declaration resolves to `.None`, an override inherits) and
54715
+ // explicit ordinal 0 is an authored `.None` that stops inheritance.
54716
+ "effect",
54717
+ "uiAction",
54718
+ "templateId",
54719
+ "genericParamId"
54720
+ ],
54721
+ derived: ["valueId", "getter", "setter", "action"],
54722
+ volatile: ["projectId", "createdAt", "updatedAt"],
54723
+ normalization: {
54724
+ requirement: { kind: "absentMeansDefault", defaultValue: 0 },
54725
+ mutability: { kind: "absentMeansDefault", defaultValue: 0 },
54726
+ modifier: { kind: "absentMeansDefault", defaultValue: 0 },
54727
+ access: { kind: "absentMeansDefault", defaultValue: 0 },
54728
+ defaultValue: "nullIsAbsentOnFullMember",
54729
+ extendsMemberId: "nullIsAbsent",
54730
+ system: "nullIsAbsent",
54731
+ storage: { kind: "absentMeansDefault", defaultValue: 0 },
54732
+ storageKey: "nullOrEmptyStringIsAbsentOnFullMember",
54733
+ minValue: "nullIsAbsentOnFullMember",
54734
+ maxValue: "nullIsAbsentOnFullMember",
54735
+ decimalPoints: "nullIsAbsentOnFullMember",
54736
+ format: { kind: "absentMeansDefault", defaultValue: 0 },
54737
+ searchBy: { kind: "absentMeansDefault", defaultValue: 0 },
54738
+ keyEnumId: "nullIsAbsent",
54739
+ keyKind: { kind: "absentMeansDefault", defaultValue: 0 },
54740
+ listKind: { kind: "absentMeansDefault", defaultValue: 0 },
54741
+ indexes: "nullOrEmptyArrayIsAbsentOnFullMember",
54742
+ columnSettings: "nullOrEmptyArrayIsAbsentOnFullMember",
54743
+ schemaKeyOrder: "nullIsAbsentOnFullMember",
54744
+ classArguments: "nullOrEmptyObjectIsAbsentOnFullMember",
54745
+ payload: { kind: "absentMeansDefault", defaultValue: 0 },
54746
+ selection: { kind: "absentMeansDefault", defaultValue: 0 },
54747
+ collectionValueId: "nullIsAbsentOnFullMember",
54748
+ declaredTypeInfo: "nullIsAbsentOnFullMember",
54749
+ targetTypeInfo: "nullIsAbsentOnFullMember",
54750
+ valueTypeInfo: "nullIsAbsentOnFullMember",
54751
+ dialogueGroupId: "nullIsAbsentOnFullMember",
54752
+ code: "nullIsAbsentOnFullMember",
54753
+ templateId: "nullIsAbsentOnFullMember",
54754
+ setterCode: "nullIsAbsentOnFullMember",
54755
+ dispatch: { kind: "absentMeansDefault", defaultValue: 0 },
54756
+ bodyMode: { kind: "absentMeansDefault", defaultValue: 0 },
54757
+ uiAction: "nullIsAbsentOnFullMember"
54758
+ }
54759
+ },
54760
+ class: {
54761
+ authored: [
54762
+ "id",
54763
+ "name",
54764
+ "docsText",
54765
+ "schema",
54766
+ "schemaKeyOrder",
54767
+ "extendsClassId",
54768
+ "implementsInterfaceIds",
54769
+ "uiVisibility",
54770
+ "modifier",
54771
+ "system",
54772
+ "allowedStorage",
54773
+ "allowedStorageKeys",
54774
+ "genericParams",
54775
+ "extendsGenericBindings",
54776
+ "constructorIds",
54777
+ "requiredConstructorId",
54778
+ "targetMemberId"
54779
+ ],
54780
+ derived: [],
54781
+ volatile: ["projectId", "createdAt", "updatedAt"],
54782
+ normalization: {
54783
+ uiVisibility: { kind: "absentMeansDefault", defaultValue: 0 },
54784
+ modifier: { kind: "absentMeansDefault", defaultValue: 0 },
54785
+ targetMemberId: "nullIsAbsent",
54786
+ schemaKeyOrder: "nullIsAbsent",
54787
+ extendsClassId: "nullIsAbsent",
54788
+ implementsInterfaceIds: "nullOrEmptyArrayIsAbsent",
54789
+ system: "nullIsAbsent",
54790
+ allowedStorage: { kind: "absentMeansDefault", defaultValue: 0 },
54791
+ allowedStorageKeys: "nullIsAbsent",
54792
+ genericParams: "nullOrEmptyArrayIsAbsent",
54793
+ extendsGenericBindings: "nullOrEmptyObjectIsAbsent",
54794
+ constructorIds: "nullOrEmptyArrayIsAbsent",
54795
+ requiredConstructorId: "nullIsAbsent"
54796
+ }
54797
+ },
54798
+ constructor: {
54799
+ authored: [
54800
+ "id",
54801
+ "classId",
54802
+ "argumentTypes",
54803
+ "code",
54804
+ "baseArguments",
54805
+ "baseInitializerFields",
54806
+ "docsText"
54807
+ ],
54808
+ derived: [
54809
+ "action",
54810
+ "compiledBaseArguments",
54811
+ "compiledBaseInitializerFields"
54812
+ ],
54813
+ volatile: ["projectId", "createdAt", "updatedAt"],
54814
+ // `code` is deliberately un-normalized. P49 §1.2 gives it three states —
54815
+ // a body, `""` for a declared-but-empty body, and `null` for a class
54816
+ // header that declares no `init` block — and the last two must stay
54817
+ // distinct in the canonical form or `neo pull` cannot tell
54818
+ // `class Foo { init { } }` from `class Foo()`. `nullIsAbsent` would keep
54819
+ // them distinct too, but it drops the field from the written record
54820
+ // (`composeDocumentRecord` writes the normalized authored half), which
54821
+ // would make the persisted shape disagree with the domain model's
54822
+ // required `code: string | null`. Leaving it plain means exactly two
54823
+ // spellings of an empty body reach storage, never three.
54824
+ normalization: {
54825
+ baseArguments: "nullOrEmptyArrayIsAbsent",
54826
+ baseInitializerFields: "nullOrEmptyArrayIsAbsent"
54827
+ }
54828
+ },
54829
+ variant: {
54830
+ // P67 §2.1. A variant record names its class, its scope, and the root row
54831
+ // of the value graph it owns. The delegates themselves are value rows, so
54832
+ // the compiled `action` IR the server derives lives there, not here —
54833
+ // which is why this record has no derived half at all.
54834
+ authored: ["id", "classId", "name", "folderId", "valueId"],
54835
+ derived: [],
54836
+ volatile: ["projectId", "createdAt", "updatedAt"],
54837
+ // `folderId` is always written: null is the class root folder, and a
54838
+ // missing field would make "root" and "corrupt" the same shape.
54839
+ normalization: { folderId: "missingIsNull" }
54840
+ },
54841
+ "variant-folder": {
54842
+ // P67 §3.3. A folder's whole content is its path, which is what lets a
54843
+ // rename be a one-record edit that orphans nothing.
54844
+ authored: ["id", "classId", "path", "binding"],
54845
+ derived: [],
54846
+ volatile: ["projectId", "createdAt", "updatedAt"],
54847
+ normalization: { binding: "nullIsAbsent" }
54848
+ },
54849
+ interface: {
54850
+ authored: [
54851
+ "id",
54852
+ "name",
54853
+ "docsText",
54854
+ "members",
54855
+ "memberKeyOrder",
54856
+ "extendsInterfaceIds",
54857
+ "system"
54858
+ ],
54859
+ derived: [],
54860
+ volatile: ["projectId", "createdAt", "updatedAt"],
54861
+ normalization: {
54862
+ memberKeyOrder: "nullOrEmptyArrayIsAbsent",
54863
+ extendsInterfaceIds: "nullOrEmptyArrayIsAbsent",
54864
+ system: "nullIsAbsent"
54865
+ }
54866
+ },
54867
+ enum: {
54868
+ authored: [
54869
+ "id",
54870
+ "name",
54871
+ "docsText",
54872
+ "options",
54873
+ "optionKeyOrder",
54874
+ "system"
54875
+ ],
54876
+ derived: [],
54877
+ volatile: ["projectId", "createdAt", "updatedAt"],
54878
+ normalization: { system: "nullIsAbsent" }
54879
+ },
54880
+ "unity-texture-template": {
54881
+ authored: [
54882
+ "id",
54883
+ "name",
54884
+ "type",
54885
+ "textureType",
54886
+ "textureShape",
54887
+ "sRGBTexture",
54888
+ "alphaSource",
54889
+ "alphaIsTransparency",
54890
+ "nonPowerOfTwoScale",
54891
+ "ignorePngGamma",
54892
+ "readWriteEnabled",
54893
+ "virtualTextureOnly",
54894
+ "generateMipMaps",
54895
+ "borderMipMaps",
54896
+ "mipMapFiltering",
54897
+ "mipMapsPreserveCoverage",
54898
+ "alphaCutoffValue",
54899
+ "fadeOutMipMaps",
54900
+ "mipMapFadeDistanceStart",
54901
+ "mipMapFadeDistanceEnd",
54902
+ "anisoLevel",
54903
+ "wrapMode",
54904
+ "wrapModeU",
54905
+ "wrapModeV",
54906
+ "filterMode",
54907
+ "maxTextureSize",
54908
+ "resizeAlgorithm",
54909
+ "textureCompression",
54910
+ "compressionQuality",
54911
+ "crunchedCompression",
54912
+ "platformSettings",
54913
+ "spriteSettings",
54914
+ "normalMapSettings",
54915
+ "cookieSettings",
54916
+ "singleChannelSettings",
54917
+ "swizzle"
54918
+ ],
54919
+ derived: [],
54920
+ volatile: ["projectId", "createdAt", "updatedAt"],
54921
+ normalization: {
54922
+ wrapModeU: "missingIsNull",
54923
+ wrapModeV: "missingIsNull",
54924
+ spriteSettings: "missingIsNull",
54925
+ normalMapSettings: "missingIsNull",
54926
+ cookieSettings: "missingIsNull",
54927
+ singleChannelSettings: "missingIsNull",
54928
+ swizzle: "missingIsNull"
54929
+ }
54930
+ },
54931
+ "unity-audio-clip-template": {
54932
+ authored: [
54933
+ "id",
54934
+ "name",
54935
+ "forceToMono",
54936
+ "normalize",
54937
+ "loadInBackground",
54938
+ "ambisonic",
54939
+ "loadType",
54940
+ "compressionFormat",
54941
+ "quality",
54942
+ "sampleRateSetting",
54943
+ "overrideSampleRate",
54944
+ "preloadAudioData"
54945
+ ],
54946
+ derived: [],
54947
+ volatile: ["projectId", "createdAt", "updatedAt"],
54948
+ normalization: { overrideSampleRate: "missingIsNull" }
54949
+ },
54950
+ "localization-config": {
54951
+ authored: [
54952
+ "id",
54953
+ "mainLocale",
54954
+ "supportedLocales",
54955
+ "sortedStatusIds",
54956
+ "mainLocaleDefaultStatusId"
54957
+ ],
54958
+ derived: [],
54959
+ volatile: ["projectId", "createdAt", "updatedAt"],
54960
+ normalization: {}
54961
+ },
54962
+ "localization-status": {
54963
+ authored: [
54964
+ "id",
54965
+ "slug",
54966
+ "name",
54967
+ "description",
54968
+ "color",
54969
+ "emoji",
54970
+ "archivedAt",
54971
+ "transitionRules",
54972
+ "transitionToStatusIdOnEditText",
54973
+ "transitionToWhenSourceBecomesStatusId",
54974
+ "system"
54975
+ ],
54976
+ derived: [],
54977
+ volatile: ["projectId", "createdAt", "updatedAt"],
54978
+ normalization: {
54979
+ description: "missingIsNull",
54980
+ color: "missingIsNull",
54981
+ emoji: "missingIsNull",
54982
+ archivedAt: "missingIsNull",
54983
+ transitionRules: "missingIsNull",
54984
+ transitionToStatusIdOnEditText: "missingIsNull",
54985
+ transitionToWhenSourceBecomesStatusId: "missingIsNull",
54986
+ system: "nullIsAbsent"
54987
+ }
54988
+ },
54989
+ "internal-record-relation": {
54990
+ authored: [
54991
+ "id",
54992
+ "relationKind",
54993
+ "sourceRecordKind",
54994
+ "sourceRecordId",
54995
+ "targetRecordKind",
54996
+ "targetRecordId",
54997
+ "orderKey"
54998
+ ],
54999
+ derived: [],
55000
+ volatile: ["projectId", "createdAt", "updatedAt"],
55001
+ normalization: { orderKey: "nullIsAbsent" }
55002
+ }
55003
+ },
55004
+ sdkDeclarations: {
55005
+ attributes: {
55006
+ enums: {
55007
+ NeoStorage: [
55008
+ "Inherit",
55009
+ "Immutable",
55010
+ "Save",
55011
+ "Session",
55012
+ "Writable",
55013
+ "User"
55014
+ ],
55015
+ NeoAllowedStorage: [
55016
+ "Any",
55017
+ "Immutable",
55018
+ "Save",
55019
+ "Session",
55020
+ "Writable",
55021
+ "User"
55022
+ ],
55023
+ NeoListKind: ["Ordered", "Unordered"],
55024
+ NeoDictionaryKeyKind: ["String", "Enum"],
55025
+ NeoClassVisibility: ["Visible", "Hidden"],
55026
+ NeoSubtreeDistribution: ["Sparse", "Packed"],
55027
+ NeoStringFormat: ["Localized", "Plain"],
55028
+ NeoMemberSearchBy: ["None", "MemberKey"],
55029
+ NeoListIndexKind: ["Bucket", "Unique"],
55030
+ NeoColumnVisibility: ["Visible", "Hidden"],
55031
+ NeoColumnPin: ["None", "Leading"],
55032
+ NeoColumnOverflow: ["Clip", "Wrap"],
55033
+ NeoFileKind: ["Sprite", "Audio"],
55034
+ NeoEffectKind: ["None", "Auto"]
55035
+ },
55036
+ markers: {
55037
+ NeoSchemaClassAttribute: {
55038
+ targets: ["Class"],
55039
+ constructor: [
55040
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55041
+ ],
55042
+ properties: [
55043
+ { type: "string?", name: "Id", access: "get" },
55044
+ { type: "string?", name: "Name", access: "set" },
55045
+ {
55046
+ type: "NeoClassVisibility",
55047
+ name: "Visibility",
55048
+ access: "set",
55049
+ default: "NeoClassVisibility.Visible"
55050
+ },
55051
+ {
55052
+ type: "NeoAllowedStorage",
55053
+ name: "AllowedStorage",
55054
+ access: "set",
55055
+ default: "NeoAllowedStorage.Any"
55056
+ },
55057
+ { type: "string[]?", name: "AllowedStorageKeys", access: "set" }
55058
+ ]
55059
+ },
55060
+ NeoInterfaceAttribute: {
55061
+ targets: ["Interface"],
55062
+ constructor: [
55063
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55064
+ ],
55065
+ properties: [
55066
+ { type: "string?", name: "Id", access: "get" },
55067
+ { type: "string?", name: "Name", access: "set" }
55068
+ ]
55069
+ },
55070
+ NeoEnumAttribute: {
55071
+ targets: ["Enum"],
55072
+ constructor: [
55073
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55074
+ ],
55075
+ properties: [
55076
+ { type: "string?", name: "Id", access: "get" },
55077
+ { type: "string?", name: "Name", access: "set" }
55078
+ ]
55079
+ },
55080
+ NeoIdAttribute: {
55081
+ targets: ["GenericParameter"],
55082
+ constructor: [
55083
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55084
+ ],
55085
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55086
+ },
55087
+ NeoMemberAttribute: {
55088
+ targets: ["Property", "Method"],
55089
+ constructor: [
55090
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55091
+ ],
55092
+ properties: [
55093
+ { type: "string?", name: "Id", access: "get" },
55094
+ { type: "string?", name: "Key", access: "set" },
55095
+ { type: "string?", name: "Name", access: "set" },
55096
+ {
55097
+ type: "NeoStorage",
55098
+ name: "Storage",
55099
+ access: "set",
55100
+ default: "NeoStorage.Inherit"
55101
+ },
55102
+ { type: "string?", name: "StorageKey", access: "set" },
55103
+ { type: "int", name: "Order", access: "set", default: "-1" }
55104
+ ]
55105
+ },
55106
+ NeoSystemAttribute: {
55107
+ targets: ["Class", "Interface", "Enum", "Property", "Method"],
55108
+ constructor: [
55109
+ {
55110
+ type: "NeoSystemProtectionKind",
55111
+ name: "kind",
55112
+ assigns: "Kind"
55113
+ }
55114
+ ],
55115
+ properties: [
55116
+ {
55117
+ type: "NeoSystemProtectionKind",
55118
+ name: "Kind",
55119
+ access: "get"
55120
+ },
55121
+ {
55122
+ type: "NeoWorldKind",
55123
+ name: "WorldKind",
55124
+ access: "set",
55125
+ default: "NeoWorldKind.None"
55126
+ }
55127
+ ]
55128
+ },
55129
+ NeoTextAttribute: {
55130
+ targets: ["Property"],
55131
+ properties: [
55132
+ {
55133
+ type: "NeoStringFormat",
55134
+ name: "Format",
55135
+ access: "set",
55136
+ default: "NeoStringFormat.Localized"
55137
+ },
55138
+ {
55139
+ type: "NeoMemberSearchBy",
55140
+ name: "SearchBy",
55141
+ access: "set",
55142
+ default: "NeoMemberSearchBy.None"
55143
+ }
55144
+ ]
55145
+ },
55146
+ NeoNullAttribute: { targets: ["Property"], properties: [] },
55147
+ NeoNumberAttribute: {
55148
+ targets: ["Property"],
55149
+ properties: [
55150
+ {
55151
+ type: "double",
55152
+ name: "Min",
55153
+ access: "set",
55154
+ default: "double.NaN"
55155
+ },
55156
+ {
55157
+ type: "double",
55158
+ name: "Max",
55159
+ access: "set",
55160
+ default: "double.NaN"
55161
+ },
55162
+ { type: "string?", name: "DecimalMin", access: "set" },
55163
+ { type: "string?", name: "DecimalMax", access: "set" },
55164
+ {
55165
+ type: "int",
55166
+ name: "DecimalPoints",
55167
+ access: "set",
55168
+ default: "-1"
55169
+ }
55170
+ ]
55171
+ },
55172
+ NeoDictionaryAttribute: {
55173
+ targets: ["Property"],
55174
+ properties: [
55175
+ {
55176
+ type: "NeoDictionaryKeyKind",
55177
+ name: "KeyKind",
55178
+ access: "set",
55179
+ default: "NeoDictionaryKeyKind.String"
55180
+ },
55181
+ { type: "Type?", name: "KeyEnum", access: "set" }
55182
+ ]
55183
+ },
55184
+ NeoListAttribute: {
55185
+ targets: ["Property"],
55186
+ properties: [
55187
+ {
55188
+ type: "NeoListKind",
55189
+ name: "Kind",
55190
+ access: "set",
55191
+ default: "NeoListKind.Ordered"
55192
+ }
55193
+ ]
55194
+ },
55195
+ NeoEntriesAttribute: {
55196
+ targets: ["Class", "Property"],
55197
+ constructor: [
55198
+ { type: "string", name: "settings", assigns: "Settings" }
55199
+ ],
55200
+ properties: [{ type: "string", name: "Settings", access: "get" }]
55201
+ },
55202
+ NeoSchemaOrderAttribute: {
55203
+ targets: ["Class", "Property"],
55204
+ constructor: [
55205
+ {
55206
+ type: "string[]",
55207
+ name: "members",
55208
+ modifier: "params",
55209
+ assigns: "Members"
55210
+ }
55211
+ ],
55212
+ properties: [{ type: "string[]", name: "Members", access: "get" }]
55213
+ },
55214
+ NeoIndexAttribute: {
55215
+ targets: ["Property"],
55216
+ allowMultiple: true,
55217
+ constructor: [{ type: "string", name: "member", assigns: "Member" }],
55218
+ properties: [
55219
+ { type: "string", name: "Member", access: "get" },
55220
+ {
55221
+ type: "NeoListIndexKind",
55222
+ name: "Kind",
55223
+ access: "set",
55224
+ default: "NeoListIndexKind.Bucket"
55225
+ }
55226
+ ]
55227
+ },
55228
+ NeoColumnAttribute: {
55229
+ targets: ["Property"],
55230
+ allowMultiple: true,
55231
+ constructor: [{ type: "string", name: "member", assigns: "Member" }],
55232
+ properties: [
55233
+ { type: "string", name: "Member", access: "get" },
55234
+ { type: "int", name: "Width", access: "set", default: "-1" },
55235
+ {
55236
+ type: "NeoColumnVisibility",
55237
+ name: "Visibility",
55238
+ access: "set",
55239
+ default: "NeoColumnVisibility.Visible"
55240
+ },
55241
+ {
55242
+ type: "NeoColumnPin",
55243
+ name: "Pin",
55244
+ access: "set",
55245
+ default: "NeoColumnPin.None"
55246
+ },
55247
+ {
55248
+ type: "NeoColumnOverflow",
55249
+ name: "Overflow",
55250
+ access: "set",
55251
+ default: "NeoColumnOverflow.Clip"
55252
+ }
55253
+ ]
55254
+ },
55255
+ NeoLookupAttribute: {
55256
+ targets: ["Property"],
55257
+ constructor: [
55258
+ {
55259
+ type: "string",
55260
+ name: "collectionMember",
55261
+ assigns: "CollectionMember"
55262
+ }
55263
+ ],
55264
+ properties: [
55265
+ { type: "string", name: "CollectionMember", access: "get" },
55266
+ { type: "string?", name: "CollectionValueMember", access: "set" }
55267
+ ]
55268
+ },
55269
+ NeoDialogueAttribute: {
55270
+ targets: ["Property"],
55271
+ properties: [{ type: "string?", name: "Group", access: "set" }]
55272
+ },
55273
+ NeoFileAttribute: {
55274
+ targets: ["Property"],
55275
+ constructor: [{ type: "NeoFileKind", name: "kind", assigns: "Kind" }],
55276
+ properties: [
55277
+ { type: "NeoFileKind", name: "Kind", access: "get" },
55278
+ { type: "Type?", name: "Template", access: "set" }
55279
+ ]
55280
+ },
55281
+ NeoComputedAttribute: { targets: ["Property"], properties: [] },
55282
+ NeoScriptAttribute: { targets: ["Method"], properties: [] },
55283
+ NeoFunctionAttribute: { targets: ["Method"], properties: [] },
55284
+ NeoEnumOptionAttribute: {
55285
+ targets: ["Field"],
55286
+ constructor: [
55287
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55288
+ ],
55289
+ properties: [
55290
+ { type: "string?", name: "Id", access: "get" },
55291
+ { type: "string?", name: "Key", access: "set" },
55292
+ { type: "string?", name: "Text", access: "set" }
55293
+ ]
55294
+ },
55295
+ NeoTextureTemplateAttribute: {
55296
+ targets: ["Class", "Property"],
55297
+ constructor: [
55298
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55299
+ ],
55300
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55301
+ },
55302
+ NeoAudioTemplateAttribute: {
55303
+ targets: ["Class", "Property"],
55304
+ constructor: [
55305
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55306
+ ],
55307
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55308
+ },
55309
+ NeoLocalizationAttribute: {
55310
+ targets: ["Class", "Property"],
55311
+ constructor: [
55312
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55313
+ ],
55314
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55315
+ },
55316
+ NeoLocalizationStatusAttribute: {
55317
+ targets: ["Class", "Property"],
55318
+ constructor: [
55319
+ { type: "string?", name: "id", default: "null", assigns: "Id" }
55320
+ ],
55321
+ properties: [{ type: "string?", name: "Id", access: "get" }]
55322
+ },
55323
+ NeoRegistryAttribute: { targets: ["Class"], properties: [] },
55324
+ NeoRelationConfigurationAttribute: {
55325
+ targets: ["Class"],
55326
+ properties: []
55327
+ }
55328
+ }
55329
+ },
55330
+ settings: {
55331
+ enums: {
55332
+ NeoProjectRecordKind: [
55333
+ "Project",
55334
+ "Member",
55335
+ "Value",
55336
+ "Class",
55337
+ "InternalRecordRelation",
55338
+ "Enum",
55339
+ "Interface",
55340
+ "Dialogue",
55341
+ "DialogueNode",
55342
+ "DialogueGroup",
55343
+ "PriorityGroup",
55344
+ "ProjectFile",
55345
+ "UnityTextureTemplate",
55346
+ "UnityAudioClipTemplate",
55347
+ "LocalizationConfig",
55348
+ "LocalizationStatus",
55349
+ "LocalizedText",
55350
+ "Migration"
55351
+ ],
55352
+ NeoEntryKind: [
55353
+ "Null",
55354
+ "Boolean",
55355
+ "Integer",
55356
+ "String",
55357
+ "Float",
55358
+ "Decimal",
55359
+ "Vector2",
55360
+ "Vector2Int",
55361
+ "Vector3",
55362
+ "Vector3Int",
55363
+ "Color",
55364
+ "Dictionary",
55365
+ "List",
55366
+ "Class",
55367
+ "Enum",
55368
+ "Lookup",
55369
+ "DialogueLookup",
55370
+ "Sprite",
55371
+ "Audio",
55372
+ "Generic"
55373
+ ],
55374
+ NeoSystemProtectionKind: [
55375
+ "WorldAuthoring",
55376
+ "DialogueMemorySchema",
55377
+ "DialogueMemoryContainer",
55378
+ "DialoguePriorityDefault",
55379
+ "PolicyImmutable",
55380
+ "PolicyDeleteBlocked",
55381
+ "ScriptRuntime"
55382
+ ],
55383
+ NeoMemberRequirement: ["Optional", "Required"],
55384
+ NeoMemberMutability: ["Mutable", "ReadOnly"],
55385
+ NeoMemberModifier: ["Virtual", "Sealed", "Abstract", "Static"],
55386
+ NeoMemberAccess: ["Public", "Protected", "Private"],
55387
+ NeoMemberSelection: ["Single", "Multi"],
55388
+ NeoFunctionDispatch: ["Synchronous", "Asynchronous"],
55389
+ NeoMemberPayload: ["Full", "Partial"],
55390
+ NeoFunctionLogicMode: ["UI"],
55391
+ NeoWorldKind: [
55392
+ "CellPattern",
55393
+ "None",
55394
+ "TileGrid",
55395
+ "TileLayer",
55396
+ "ObjectLayer",
55397
+ "Tile",
55398
+ "ObjectBase",
55399
+ "LayerGroupBase",
55400
+ "SpriteObject",
55401
+ "Object",
55402
+ "TileLayerLink",
55403
+ "ObjectLayerLink",
55404
+ "PlacementTile",
55405
+ "ObjectCollider",
55406
+ "SortingGroup",
55407
+ "SortingLayer",
55408
+ "SmartTile",
55409
+ "SmartTileRule",
55410
+ "SmartTileNeighbor",
55411
+ "AnimationClip",
55412
+ "AnimationFrame",
55413
+ "AnimationChildOverride",
55414
+ "AnimationFrameBase",
55415
+ "AnimationSegmentFrame",
55416
+ "AnimationSegment",
55417
+ "SpriteAnimationSegment",
55418
+ "AnimationTrack",
55419
+ "AnimationChildTrack",
55420
+ "AnimationSegmentTrack",
55421
+ "SpriteAnimationSegmentTrack",
55422
+ "Variant",
55423
+ "VariantFolder",
55424
+ "LookupVariant",
55425
+ "LookupVariantFolder"
55426
+ ],
55427
+ NeoTextureType: [
55428
+ "Default",
55429
+ "NormalMap",
55430
+ "EditorGuiAndLegacyGui",
55431
+ "Sprite",
55432
+ "Cursor",
55433
+ "Cookie",
55434
+ "Lightmap",
55435
+ "SingleChannel"
55436
+ ],
55437
+ NeoSpriteMode: ["Single", "Multiple", "Polygon"],
55438
+ NeoSpriteMeshType: ["FullRect", "Tight"],
55439
+ NeoSpriteAlignment: [
55440
+ "Center",
55441
+ "TopLeft",
55442
+ "TopCenter",
55443
+ "TopRight",
55444
+ "LeftCenter",
55445
+ "RightCenter",
55446
+ "BottomLeft",
55447
+ "BottomCenter",
55448
+ "BottomRight",
55449
+ "Custom"
55450
+ ],
55451
+ NeoTextureWrapMode: [
55452
+ "Repeat",
55453
+ "Clamp",
55454
+ "Mirror",
55455
+ "MirrorOnce",
55456
+ "PerAxis"
55457
+ ],
55458
+ NeoTextureFilterMode: ["Point", "Bilinear", "Trilinear"],
55459
+ NeoTextureCompression: [
55460
+ "None",
55461
+ "LowQuality",
55462
+ "NormalQuality",
55463
+ "HighQuality"
55464
+ ],
55465
+ NeoTextureFormat: [
55466
+ "Automatic",
55467
+ "RgbaCompressedDxt5Bc3",
55468
+ "RgbCompressedDxt1Bc1",
55469
+ "Rgba32Bit",
55470
+ "Rgb24Bit"
55471
+ ],
55472
+ NeoAlphaSource: ["None", "InputTextureAlpha", "FromGrayScale"],
55473
+ NeoNonPowerOfTwoScale: ["None", "ToNearest", "ToLarger", "ToSmaller"],
55474
+ NeoNormalMapFiltering: ["Sharp", "Smooth"],
55475
+ NeoCookieLightType: ["Spot", "Directional", "Point"],
55476
+ NeoSingleChannelComponent: ["Alpha", "Red"],
55477
+ NeoTextureSwizzle: ["Red", "Green", "Blue", "Alpha", "Zero", "One"],
55478
+ NeoMipMapFiltering: ["Box", "Kaiser"],
55479
+ NeoTextureResizeAlgorithm: ["Mitchell", "Bilinear"],
55480
+ NeoAudioLoadType: [
55481
+ "DecompressOnLoad",
55482
+ "CompressedInMemory",
55483
+ "Streaming"
55484
+ ],
55485
+ NeoAudioCompressionFormat: ["Pcm", "Adpcm", "Vorbis"],
55486
+ NeoAudioSampleRate: [
55487
+ "PreserveSampleRate",
55488
+ "OptimizeSampleRate",
55489
+ "OverrideSampleRate"
55490
+ ]
55491
+ },
55492
+ classes: {
55493
+ NeoClassRelationDefinition: {
55494
+ constructors: [
55495
+ [{ type: "Type", name: "target", assigns: "Target" }],
55496
+ [
55497
+ { type: "string?", name: "id", assigns: "Id" },
55498
+ { type: "Type", name: "target", assigns: "Target" }
55499
+ ]
55500
+ ],
55501
+ properties: [
55502
+ { type: "string?", name: "Id" },
55503
+ { type: "Type", name: "Target", default: "typeof(object)" }
55504
+ ]
55505
+ },
55506
+ NeoGridRelationSettings: [
55507
+ {
55508
+ type: "List<NeoClassRelationDefinition>",
55509
+ name: "TileImports",
55510
+ default: "new List<NeoClassRelationDefinition>()"
55511
+ },
55512
+ {
55513
+ type: "List<NeoClassRelationDefinition>",
55514
+ name: "ObjectImports",
55515
+ default: "new List<NeoClassRelationDefinition>()"
55516
+ },
55517
+ {
55518
+ type: "List<NeoClassRelationDefinition>",
55519
+ name: "TileLayers",
55520
+ default: "new List<NeoClassRelationDefinition>()"
55521
+ },
55522
+ {
55523
+ type: "List<NeoClassRelationDefinition>",
55524
+ name: "ObjectLayers",
55525
+ default: "new List<NeoClassRelationDefinition>()"
55526
+ }
55527
+ ],
55528
+ NeoTileRelationSettings: [
55529
+ {
55530
+ type: "List<NeoClassRelationDefinition>",
55531
+ name: "CompatibleLayers",
55532
+ default: "new List<NeoClassRelationDefinition>()"
55533
+ },
55534
+ { type: "NeoClassRelationDefinition?", name: "DefaultLayer" }
55535
+ ],
55536
+ NeoObjectRelationSettings: [
55537
+ {
55538
+ type: "List<NeoClassRelationDefinition>",
55539
+ name: "CompatibleLayers",
55540
+ default: "new List<NeoClassRelationDefinition>()"
55541
+ },
55542
+ { type: "NeoClassRelationDefinition?", name: "DefaultLayer" }
55543
+ ],
55544
+ NeoTileLayerLinkRelationSettings: [
55545
+ { type: "NeoClassRelationDefinition?", name: "TargetLayer" }
55546
+ ],
55547
+ NeoObjectLayerLinkRelationSettings: [
55548
+ { type: "NeoClassRelationDefinition?", name: "TargetLayer" }
55549
+ ],
55550
+ NeoEntrySettings: [
55551
+ { type: "string?", name: "Id" },
55552
+ { type: "string", name: "Path", default: "string.Empty" },
55553
+ { type: "NeoEntryKind", name: "Kind" },
55554
+ {
55555
+ type: "NeoMemberRequirement",
55556
+ name: "Requirement",
55557
+ default: "NeoMemberRequirement.Optional"
55558
+ },
55559
+ {
55560
+ type: "NeoMemberMutability",
55561
+ name: "Mutability",
55562
+ default: "NeoMemberMutability.Mutable"
55563
+ },
55564
+ {
55565
+ type: "NeoMemberModifier",
55566
+ name: "Modifier",
55567
+ default: "NeoMemberModifier.Virtual"
55568
+ },
55569
+ {
55570
+ type: "NeoMemberAccess",
55571
+ name: "Access",
55572
+ default: "NeoMemberAccess.Public"
55573
+ },
55574
+ { type: "NeoMemberReference?", name: "Overrides" },
55575
+ {
55576
+ type: "NeoStorage",
55577
+ name: "Storage",
55578
+ default: "NeoStorage.Inherit"
55579
+ },
55580
+ { type: "string?", name: "StorageKey" },
55581
+ { type: "NeoValueSettings?", name: "Default" },
55582
+ { type: "NeoTextSettings?", name: "Text" },
55583
+ { type: "NeoNumberSettings?", name: "Number" },
55584
+ { type: "NeoDictionarySettings?", name: "Dictionary" },
55585
+ { type: "NeoListSettings?", name: "List" },
55586
+ { type: "NeoLookupSettings?", name: "Lookup" },
55587
+ { type: "NeoDialogueSettings?", name: "Dialogue" },
55588
+ { type: "NeoFileSettings?", name: "File" },
55589
+ { type: "NeoClassSettings?", name: "Class" },
55590
+ { type: "NeoEnumSettings?", name: "Enum" },
55591
+ { type: "NeoGenericSettings?", name: "Generic" },
55592
+ { type: "NeoSystemSettings?", name: "System" },
55593
+ {
55594
+ type: "IReadOnlyList<NeoEntrySettings>",
55595
+ name: "Entries",
55596
+ default: "new List<NeoEntrySettings>()"
55597
+ }
55598
+ ],
55599
+ NeoValueSettings: [
55600
+ { type: "bool", name: "IsNull" },
55601
+ { type: "Type?", name: "ConcreteType" },
55602
+ { type: "bool?", name: "Boolean" },
55603
+ { type: "long?", name: "Integer" },
55604
+ { type: "double?", name: "Number" },
55605
+ { type: "string?", name: "Text" },
55606
+ { type: "decimal?", name: "Decimal" },
55607
+ { type: "NeoVector2?", name: "Vector2" },
55608
+ { type: "NeoVector2Int?", name: "Vector2Int" },
55609
+ { type: "NeoVector3?", name: "Vector3" },
55610
+ { type: "NeoVector3Int?", name: "Vector3Int" },
55611
+ { type: "NeoColor?", name: "Color" },
55612
+ { type: "NeoSprite?", name: "Sprite" },
55613
+ { type: "NeoAudio?", name: "Audio" },
55614
+ { type: "NeoDialogue?", name: "Dialogue" },
55615
+ { type: "NeoReferenceSettings?", name: "Reference" },
55616
+ { type: "string?", name: "EnumOption" },
55617
+ { type: "IReadOnlyList<NeoValueSettings>?", name: "List" },
55618
+ {
55619
+ type: "IReadOnlyDictionary<string, NeoValueSettings>?",
55620
+ name: "Dictionary"
55621
+ },
55622
+ {
55623
+ type: "IReadOnlyDictionary<string, NeoValueSettings>?",
55624
+ name: "Object"
55625
+ }
55626
+ ],
55627
+ NeoReferenceSettings: [
55628
+ { type: "Type", name: "Type", default: "typeof(object)" },
55629
+ { type: "string", name: "Id", default: "string.Empty" }
55630
+ ],
55631
+ NeoTextSettings: [
55632
+ {
55633
+ type: "NeoStringFormat",
55634
+ name: "Format",
55635
+ default: "NeoStringFormat.Localized"
55636
+ },
55637
+ {
55638
+ type: "NeoMemberSearchBy",
55639
+ name: "SearchBy",
55640
+ default: "NeoMemberSearchBy.None"
55641
+ }
55642
+ ],
55643
+ NeoNumberSettings: [
55644
+ { type: "double?", name: "Min" },
55645
+ { type: "double?", name: "Max" },
55646
+ { type: "string?", name: "DecimalMin" },
55647
+ { type: "string?", name: "DecimalMax" },
55648
+ { type: "int?", name: "DecimalPoints" }
55649
+ ],
55650
+ NeoFunctionSettings: [{ type: "NeoFunctionLogicMode", name: "Logic" }],
55651
+ NeoDictionarySettings: [
55652
+ { type: "NeoDictionaryKeyKind", name: "KeyKind" },
55653
+ { type: "Type?", name: "KeyEnum" }
55654
+ ],
55655
+ NeoClassSettings: [
55656
+ { type: "Type", name: "Type", default: "typeof(object)" },
55657
+ { type: "IReadOnlyList<string>?", name: "SchemaOrder" },
55658
+ {
55659
+ type: "IReadOnlyDictionary<string, NeoGenericBindingSettings>?",
55660
+ name: "TypeArguments"
55661
+ }
55662
+ ],
55663
+ NeoGenericBindingSettings: [
55664
+ { type: "string", name: "Parameter", default: "string.Empty" },
55665
+ { type: "string?", name: "GenericParameter" },
55666
+ { type: "NeoEntrySettings?", name: "Member" }
55667
+ ],
55668
+ NeoEnumSettings: [
55669
+ { type: "Type", name: "Enum", default: "typeof(object)" },
55670
+ {
55671
+ type: "NeoMemberSelection",
55672
+ name: "Selection",
55673
+ default: "NeoMemberSelection.Single"
55674
+ }
55675
+ ],
55676
+ NeoGenericSettings: [
55677
+ { type: "string", name: "Parameter", default: "string.Empty" }
55678
+ ],
55679
+ NeoLookupSettings: [
55680
+ { type: "string", name: "CollectionMember", default: "string.Empty" },
55681
+ { type: "string?", name: "CollectionValueMember" },
55682
+ {
55683
+ type: "NeoMemberSelection",
55684
+ name: "Selection",
55685
+ default: "NeoMemberSelection.Single"
55686
+ }
55687
+ ],
55688
+ /**
55689
+ * Class-level settings. `TargetMember` names the member of another
55690
+ * class this class writes — schema metadata rather than row data, the
55691
+ * same shape `NeoLookupSettings.CollectionMember` uses to name a
55692
+ * collection.
55693
+ */
55694
+ NeoClassSchemaSettings: [
55695
+ { type: "string", name: "TargetMember", default: "string.Empty" }
55696
+ ],
55697
+ NeoDialogueSettings: [
55698
+ { type: "string?", name: "Group" },
55699
+ {
55700
+ type: "NeoMemberSelection",
55701
+ name: "Selection",
55702
+ default: "NeoMemberSelection.Single"
55703
+ }
55704
+ ],
55705
+ NeoFileSettings: [
55706
+ { type: "NeoFileKind", name: "Kind" },
55707
+ { type: "Type?", name: "Template" }
55708
+ ],
55709
+ NeoSystemSettings: [
55710
+ {
55711
+ type: "NeoSystemProtectionKind",
55712
+ name: "Kind",
55713
+ default: "NeoSystemProtectionKind.WorldAuthoring"
55714
+ },
55715
+ { type: "NeoWorldKind?", name: "WorldKind" }
55716
+ ],
55717
+ NeoListSettings: [
55718
+ { type: "NeoListKind", name: "Kind", default: "NeoListKind.Ordered" },
55719
+ {
55720
+ type: "IReadOnlyList<NeoListIndexSettings>",
55721
+ name: "Indexes",
55722
+ default: "new List<NeoListIndexSettings>()"
55723
+ },
55724
+ {
55725
+ type: "IReadOnlyList<NeoListColumnSettings>",
55726
+ name: "Columns",
55727
+ default: "new List<NeoListColumnSettings>()"
55728
+ }
55729
+ ],
55730
+ NeoListIndexSettings: [
55731
+ { type: "string", name: "Member", default: "string.Empty" },
55732
+ {
55733
+ type: "NeoListIndexKind",
55734
+ name: "Kind",
55735
+ default: "NeoListIndexKind.Bucket"
55736
+ }
55737
+ ],
55738
+ NeoListColumnSettings: [
55739
+ { type: "string", name: "Member", default: "string.Empty" },
55740
+ { type: "int?", name: "Width" },
55741
+ {
55742
+ type: "NeoColumnVisibility",
55743
+ name: "Visibility",
55744
+ default: "NeoColumnVisibility.Visible"
55745
+ },
55746
+ {
55747
+ type: "NeoColumnPin",
55748
+ name: "Pin",
55749
+ default: "NeoColumnPin.None"
55750
+ },
55751
+ {
55752
+ type: "NeoColumnOverflow",
55753
+ name: "Overflow",
55754
+ default: "NeoColumnOverflow.Clip"
55755
+ }
55756
+ ],
55757
+ NeoTextureTemplateSettings: [
55758
+ { type: "string", name: "Name", default: "string.Empty" },
55759
+ {
55760
+ type: "NeoTextureType",
55761
+ name: "TextureType",
55762
+ default: "NeoTextureType.Sprite"
55763
+ },
55764
+ { type: "bool", name: "SrgbTexture", default: "true" },
55765
+ {
55766
+ type: "NeoAlphaSource",
55767
+ name: "AlphaSource",
55768
+ default: "NeoAlphaSource.InputTextureAlpha"
55769
+ },
55770
+ { type: "bool", name: "AlphaIsTransparency", default: "true" },
55771
+ { type: "NeoNonPowerOfTwoScale", name: "NonPowerOfTwoScale" },
55772
+ { type: "bool", name: "IgnorePngGamma" },
55773
+ { type: "bool", name: "ReadWriteEnabled" },
55774
+ { type: "bool", name: "VirtualTextureOnly" },
55775
+ { type: "bool", name: "GenerateMipMaps" },
55776
+ { type: "bool", name: "BorderMipMaps" },
55777
+ { type: "NeoMipMapFiltering", name: "MipMapFiltering" },
55778
+ { type: "bool", name: "MipMapsPreserveCoverage" },
55779
+ { type: "double", name: "AlphaCutoffValue", default: "0.5" },
55780
+ { type: "bool", name: "FadeOutMipMaps" },
55781
+ { type: "int", name: "MipMapFadeDistanceStart", default: "1" },
55782
+ { type: "int", name: "MipMapFadeDistanceEnd", default: "3" },
55783
+ { type: "int", name: "AnisoLevel", default: "1" },
55784
+ {
55785
+ type: "NeoTextureWrapMode",
55786
+ name: "WrapMode",
55787
+ default: "NeoTextureWrapMode.Clamp"
55788
+ },
55789
+ { type: "NeoTextureWrapMode?", name: "WrapModeU" },
55790
+ { type: "NeoTextureWrapMode?", name: "WrapModeV" },
55791
+ {
55792
+ type: "NeoTextureFilterMode",
55793
+ name: "FilterMode",
55794
+ default: "NeoTextureFilterMode.Point"
55795
+ },
55796
+ { type: "int", name: "MaxTextureSize", default: "2048" },
55797
+ { type: "NeoTextureResizeAlgorithm", name: "ResizeAlgorithm" },
55798
+ { type: "NeoTextureCompression", name: "TextureCompression" },
55799
+ { type: "int", name: "CompressionQuality", default: "50" },
55800
+ { type: "bool", name: "CrunchedCompression" },
55801
+ {
55802
+ type: "NeoTexturePlatformSettings",
55803
+ name: "Platforms",
55804
+ default: "new()"
55805
+ },
55806
+ { type: "NeoSpriteSettings?", name: "Sprite" },
55807
+ { type: "NeoNormalMapSettings?", name: "NormalMap" },
55808
+ { type: "NeoCookieSettings?", name: "Cookie" },
55809
+ { type: "NeoSingleChannelSettings?", name: "SingleChannel" },
55810
+ { type: "NeoSwizzleSettings?", name: "Swizzle" }
55811
+ ],
55812
+ NeoTexturePlatformSettings: [
55813
+ {
55814
+ type: "NeoTexturePlatformEntry",
55815
+ name: "Default",
55816
+ default: "new()"
55817
+ },
55818
+ {
55819
+ type: "NeoTexturePlatformEntry",
55820
+ name: "Standalone",
55821
+ default: "new()"
55822
+ },
55823
+ { type: "NeoTexturePlatformEntry", name: "Web", default: "new()" }
55824
+ ],
55825
+ NeoTexturePlatformEntry: [
55826
+ { type: "bool", name: "Override" },
55827
+ { type: "int", name: "MaxTextureSize", default: "2048" },
55828
+ { type: "NeoTextureResizeAlgorithm", name: "ResizeAlgorithm" },
55829
+ { type: "NeoTextureFormat", name: "Format" },
55830
+ { type: "NeoTextureCompression", name: "TextureCompression" },
55831
+ { type: "bool", name: "CrunchedCompression" },
55832
+ { type: "int", name: "CompressionQuality", default: "50" }
55833
+ ],
55834
+ NeoSpriteSettings: [
55835
+ {
55836
+ type: "NeoSpriteMode",
55837
+ name: "Mode",
55838
+ default: "NeoSpriteMode.Multiple"
55839
+ },
55840
+ { type: "double", name: "PixelsPerUnit", default: "100" },
55841
+ {
55842
+ type: "NeoSpriteMeshType",
55843
+ name: "MeshType",
55844
+ default: "NeoSpriteMeshType.Tight"
55845
+ },
55846
+ { type: "int", name: "ExtrudeEdges", default: "1" },
55847
+ { type: "NeoSpriteAlignment", name: "PivotAlignment" },
55848
+ { type: "NeoVector2", name: "Pivot", default: "new(0.5, 0.5)" },
55849
+ { type: "bool", name: "GeneratePhysicsShape", default: "true" },
55850
+ { type: "NeoSpriteSliceSettings?", name: "Slice" }
55851
+ ],
55852
+ NeoSpriteSliceSettings: [
55853
+ { type: "NeoVector2", name: "PixelSize" },
55854
+ { type: "NeoVector2", name: "Offset" },
55855
+ { type: "NeoVector2", name: "Padding" },
55856
+ { type: "bool", name: "KeepEmptyRects" },
55857
+ { type: "NeoSpriteAlignment", name: "PivotAlignment" },
55858
+ { type: "NeoVector2", name: "Pivot" },
55859
+ { type: "NeoVector4", name: "Border" },
55860
+ { type: "string", name: "NamingPattern", default: '"{0}"' },
55861
+ { type: "int", name: "NamingStartIndex" },
55862
+ { type: "bool", name: "ColumnMajor" }
55863
+ ],
55864
+ NeoNormalMapSettings: [
55865
+ { type: "bool", name: "CreateFromGrayscale" },
55866
+ { type: "double", name: "Bumpiness", default: "0.25" },
55867
+ {
55868
+ type: "NeoNormalMapFiltering",
55869
+ name: "Filtering",
55870
+ default: "NeoNormalMapFiltering.Smooth"
55871
+ },
55872
+ { type: "bool", name: "FlipGreenChannel" }
55873
+ ],
55874
+ NeoCookieSettings: [{ type: "NeoCookieLightType", name: "LightType" }],
55875
+ NeoSingleChannelSettings: [
55876
+ { type: "NeoSingleChannelComponent", name: "Component" }
55877
+ ],
55878
+ NeoSwizzleSettings: [
55879
+ {
55880
+ type: "NeoTextureSwizzle",
55881
+ name: "R",
55882
+ default: "NeoTextureSwizzle.Red"
55883
+ },
55884
+ {
55885
+ type: "NeoTextureSwizzle",
55886
+ name: "G",
55887
+ default: "NeoTextureSwizzle.Green"
55888
+ },
55889
+ {
55890
+ type: "NeoTextureSwizzle",
55891
+ name: "B",
55892
+ default: "NeoTextureSwizzle.Blue"
55893
+ },
55894
+ {
55895
+ type: "NeoTextureSwizzle",
55896
+ name: "A",
55897
+ default: "NeoTextureSwizzle.Alpha"
55898
+ }
55899
+ ],
55900
+ NeoAudioTemplateSettings: [
55901
+ { type: "string", name: "Name", default: "string.Empty" },
55902
+ { type: "bool", name: "ForceToMono" },
55903
+ { type: "bool", name: "Normalize" },
55904
+ { type: "bool", name: "LoadInBackground" },
55905
+ { type: "bool", name: "Ambisonic" },
55906
+ { type: "NeoAudioLoadType", name: "LoadType" },
55907
+ {
55908
+ type: "NeoAudioCompressionFormat",
55909
+ name: "CompressionFormat",
55910
+ default: "NeoAudioCompressionFormat.Vorbis"
55911
+ },
55912
+ { type: "double", name: "Quality", default: "1" },
55913
+ { type: "NeoAudioSampleRate", name: "SampleRate" },
55914
+ { type: "int?", name: "OverrideSampleRate" },
55915
+ { type: "bool", name: "PreloadAudioData", default: "true" }
55916
+ ],
55917
+ NeoLocalizationSettings: [
55918
+ { type: "string", name: "MainLocale", default: '"en-US"' },
55919
+ {
55920
+ type: "IReadOnlyList<NeoLocaleSettings>",
55921
+ name: "Locales",
55922
+ default: "new List<NeoLocaleSettings>()"
55923
+ },
55924
+ {
55925
+ type: "IReadOnlyList<string>",
55926
+ name: "StatusIds",
55927
+ default: "new List<string>()"
55928
+ },
55929
+ {
55930
+ type: "string",
55931
+ name: "MainLocaleDefaultStatus",
55932
+ default: "string.Empty"
55933
+ }
55934
+ ],
55935
+ NeoLocaleSettings: [
55936
+ { type: "string", name: "Locale", default: "string.Empty" },
55937
+ { type: "string?", name: "SourceLocale" },
55938
+ { type: "string?", name: "Name" },
55939
+ { type: "int", name: "Order" },
55940
+ { type: "long?", name: "ArchivedAt" }
55941
+ ],
55942
+ NeoLocalizationStatusSettings: [
55943
+ { type: "string", name: "Slug", default: "string.Empty" },
55944
+ { type: "string", name: "Name", default: "string.Empty" },
55945
+ { type: "string?", name: "Description" },
55946
+ { type: "string?", name: "Color" },
55947
+ { type: "string?", name: "Emoji" },
55948
+ { type: "long?", name: "ArchivedAt" },
55949
+ { type: "IReadOnlyList<string>?", name: "TransitionRules" },
55950
+ { type: "string?", name: "TransitionOnTextEdit" },
55951
+ { type: "string?", name: "TransitionWhenSourceBecomes" },
55952
+ { type: "NeoSystemSettings?", name: "System" }
55953
+ ]
55954
+ },
55955
+ records: {
55956
+ NeoProjectRecordReference: {
55957
+ kind: "readonly record struct",
55958
+ catalog: true,
55959
+ parameters: [
55960
+ { type: "NeoProjectRecordKind", name: "Kind" },
55961
+ { type: "string", name: "Id" }
55962
+ ]
55963
+ },
55964
+ NeoInternalRecordRelationDefinition: {
55965
+ kind: "sealed record",
55966
+ catalog: true,
55967
+ parameters: [
55968
+ { type: "string?", name: "Id" },
55969
+ { type: "string", name: "RelationKind" },
55970
+ { type: "NeoProjectRecordReference", name: "Source" },
55971
+ { type: "NeoProjectRecordReference", name: "Target" }
55972
+ ]
55973
+ },
55974
+ NeoVector2: {
55975
+ kind: "readonly record struct",
55976
+ parameters: [
55977
+ { type: "double", name: "X" },
55978
+ { type: "double", name: "Y" }
55979
+ ]
55980
+ },
55981
+ NeoVector2Int: {
55982
+ kind: "readonly record struct",
55983
+ parameters: [
55984
+ { type: "int", name: "X" },
55985
+ { type: "int", name: "Y" }
55986
+ ]
55987
+ },
55988
+ NeoVector3: {
55989
+ kind: "readonly record struct",
55990
+ parameters: [
55991
+ { type: "double", name: "X" },
55992
+ { type: "double", name: "Y" },
55993
+ { type: "double", name: "Z" }
55994
+ ]
55995
+ },
55996
+ NeoVector3Int: {
55997
+ kind: "readonly record struct",
55998
+ parameters: [
55999
+ { type: "int", name: "X" },
56000
+ { type: "int", name: "Y" },
56001
+ { type: "int", name: "Z" }
56002
+ ]
56003
+ },
56004
+ NeoVector4: {
56005
+ kind: "readonly record struct",
56006
+ parameters: [
56007
+ { type: "double", name: "X" },
56008
+ { type: "double", name: "Y" },
56009
+ { type: "double", name: "Z" },
56010
+ { type: "double", name: "W" }
56011
+ ]
56012
+ },
56013
+ NeoColor: {
56014
+ kind: "readonly record struct",
56015
+ parameters: [
56016
+ { type: "double", name: "R" },
56017
+ { type: "double", name: "G" },
56018
+ { type: "double", name: "B" },
56019
+ { type: "double", name: "A" }
56020
+ ]
56021
+ },
56022
+ NeoSprite: {
56023
+ kind: "sealed record",
56024
+ parameters: [
56025
+ { type: "string", name: "FileId" },
56026
+ { type: "int", name: "SliceIndex" }
56027
+ ]
56028
+ },
56029
+ NeoAudio: {
56030
+ kind: "sealed record",
56031
+ parameters: [{ type: "string", name: "FileId" }]
56032
+ },
56033
+ NeoDialogue: {
56034
+ kind: "sealed record",
56035
+ parameters: [{ type: "string", name: "DialogueId" }]
56036
+ },
56037
+ "NeoLookup<T>": {
56038
+ kind: "sealed record",
56039
+ parameters: [{ type: "string", name: "ValueId" }]
56040
+ },
56041
+ NeoMemberReference: {
56042
+ kind: "readonly record struct",
56043
+ parameters: [{ type: "string", name: "Id" }]
56044
+ }
56045
+ },
56046
+ intrinsics: {
56047
+ Neo: [
56048
+ {
56049
+ typeParameters: "<T>",
56050
+ returnType: "T",
56051
+ name: "Ref",
56052
+ parameters: [{ type: "string", name: "id" }],
56053
+ expression: "default!"
56054
+ },
56055
+ {
56056
+ typeParameters: "<T>",
56057
+ returnType: "NeoLookup<T>",
56058
+ name: "Lookup",
56059
+ parameters: [{ type: "string", name: "id" }],
56060
+ expression: "new(id)"
56061
+ },
56062
+ {
56063
+ returnType: "NeoDialogue",
56064
+ name: "Dialogue",
56065
+ parameters: [{ type: "string", name: "id" }],
56066
+ expression: "new(id)"
56067
+ },
56068
+ {
56069
+ returnType: "NeoSprite",
56070
+ name: "Sprite",
56071
+ parameters: [
56072
+ { type: "string", name: "fileId" },
56073
+ { type: "int", name: "sliceIndex", default: "0" }
56074
+ ],
56075
+ expression: "new(fileId, sliceIndex)"
56076
+ },
56077
+ {
56078
+ returnType: "NeoAudio",
56079
+ name: "Audio",
56080
+ parameters: [{ type: "string", name: "fileId" }],
56081
+ expression: "new(fileId)"
56082
+ },
56083
+ {
56084
+ returnType: "NeoMemberReference",
56085
+ name: "Member",
56086
+ parameters: [{ type: "string", name: "id" }],
56087
+ expression: "new(id)"
56088
+ }
56089
+ ]
56090
+ }
56091
+ }
56092
+ }
56093
+ });
56094
+
54426
56095
  // src/project-source/workspace-status-core.ts
54427
56096
  var ANIMATION_DOCUMENT_RECORD_KINDS = [
54428
56097
  ProjectRecordKind.Project,
@@ -54734,6 +56403,16 @@ var WORLD_OBJECT_CONTRACT_WORLD_KINDS = /* @__PURE__ */ new Set([
54734
56403
  NeoWorldSystemClassKind.SpriteObject
54735
56404
  ]);
54736
56405
 
56406
+ // ../src/models/exports/unity-codegen-revision.ts
56407
+ var UNITY_CODEGEN_REVISION = "45a0847addd4616acfc29f142556dcb2e0a27daae14d6aa456430228e66dbc07";
56408
+
56409
+ // src/export-cache.ts
56410
+ var CACHE_BUILD = JSON.stringify([
56411
+ PROJECT_SCHEMA_CONTRACT.cliVersion,
56412
+ NEOSCRIPT_COMPILER_REVISION,
56413
+ UNITY_CODEGEN_REVISION
56414
+ ]);
56415
+
54737
56416
  // src/export-state.ts
54738
56417
  import { join } from "node:path";
54739
56418
  var EXPORT_STATE_FILE = join(".neo", "export.json");