@neocompose/cli 0.74.0 → 0.75.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/neo.mjs CHANGED
@@ -41,7 +41,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
41
41
  mod
42
42
  ));
43
43
 
44
- // ../src/models/members/member-storage.ts
44
+ // ../packages/models/src/members/member-storage.ts
45
45
  function isMemberStorageKind(value) {
46
46
  return value === 0 /* Inherit */ || value === 1 /* Immutable */ || value === 2 /* Save */ || value === 3 /* Session */ || value === 4 /* Writable */ || value === 5 /* User */;
47
47
  }
@@ -103,7 +103,7 @@ function isChildStorageAllowed(context, child2) {
103
103
  }
104
104
  var MemberStorageKind;
105
105
  var init_member_storage = __esm({
106
- "../src/models/members/member-storage.ts"() {
106
+ "../packages/models/src/members/member-storage.ts"() {
107
107
  "use strict";
108
108
  MemberStorageKind = /* @__PURE__ */ ((MemberStorageKind3) => {
109
109
  MemberStorageKind3[MemberStorageKind3["Inherit"] = 0] = "Inherit";
@@ -117,51 +117,50 @@ var init_member_storage = __esm({
117
117
  }
118
118
  });
119
119
 
120
- // ../src/models/members/member-kind-enum.ts
120
+ // ../packages/models/src/members/member-kind-enum.ts
121
121
  var MemberKind;
122
122
  var init_member_kind_enum = __esm({
123
- "../src/models/members/member-kind-enum.ts"() {
124
- "use strict";
125
- MemberKind = /* @__PURE__ */ ((MemberKind13) => {
126
- MemberKind13[MemberKind13["Null"] = 0] = "Null";
127
- MemberKind13[MemberKind13["Bool"] = 1] = "Bool";
128
- MemberKind13[MemberKind13["Int"] = 2] = "Int";
129
- MemberKind13[MemberKind13["String"] = 3] = "String";
130
- MemberKind13[MemberKind13["Float"] = 4] = "Float";
131
- MemberKind13[MemberKind13["Dictionary"] = 5] = "Dictionary";
132
- MemberKind13[MemberKind13["List"] = 6] = "List";
133
- MemberKind13[MemberKind13["Class"] = 7] = "Class";
134
- MemberKind13[MemberKind13["Enum"] = 8] = "Enum";
135
- MemberKind13[MemberKind13["Lookup"] = 9] = "Lookup";
136
- MemberKind13[MemberKind13["NSProperty"] = 10] = "NSProperty";
137
- MemberKind13[MemberKind13["Sprite"] = 11] = "Sprite";
138
- MemberKind13[MemberKind13["Audio"] = 12] = "Audio";
139
- MemberKind13[MemberKind13["Function"] = 13] = "Function";
140
- MemberKind13[MemberKind13["Vector2"] = 14] = "Vector2";
141
- MemberKind13[MemberKind13["Vector2Int"] = 15] = "Vector2Int";
142
- MemberKind13[MemberKind13["Vector3"] = 16] = "Vector3";
143
- MemberKind13[MemberKind13["Vector3Int"] = 17] = "Vector3Int";
144
- MemberKind13[MemberKind13["DialogueLookup"] = 18] = "DialogueLookup";
145
- MemberKind13[MemberKind13["Color"] = 19] = "Color";
146
- MemberKind13[MemberKind13["Decimal"] = 20] = "Decimal";
147
- MemberKind13[MemberKind13["Generic"] = 21] = "Generic";
148
- MemberKind13[MemberKind13["Interface"] = 22] = "Interface";
149
- MemberKind13[MemberKind13["NSFunction"] = 23] = "NSFunction";
150
- MemberKind13[MemberKind13["FunctionRef"] = 24] = "FunctionRef";
151
- MemberKind13[MemberKind13["NSDelegate"] = 25] = "NSDelegate";
152
- MemberKind13[MemberKind13["NSAction"] = 26] = "NSAction";
153
- MemberKind13[MemberKind13["Variant"] = 27] = "Variant";
154
- return MemberKind13;
123
+ "../packages/models/src/members/member-kind-enum.ts"() {
124
+ "use strict";
125
+ MemberKind = /* @__PURE__ */ ((MemberKind12) => {
126
+ MemberKind12[MemberKind12["Null"] = 0] = "Null";
127
+ MemberKind12[MemberKind12["Bool"] = 1] = "Bool";
128
+ MemberKind12[MemberKind12["Int"] = 2] = "Int";
129
+ MemberKind12[MemberKind12["String"] = 3] = "String";
130
+ MemberKind12[MemberKind12["Float"] = 4] = "Float";
131
+ MemberKind12[MemberKind12["Dictionary"] = 5] = "Dictionary";
132
+ MemberKind12[MemberKind12["List"] = 6] = "List";
133
+ MemberKind12[MemberKind12["Class"] = 7] = "Class";
134
+ MemberKind12[MemberKind12["Enum"] = 8] = "Enum";
135
+ MemberKind12[MemberKind12["Lookup"] = 9] = "Lookup";
136
+ MemberKind12[MemberKind12["NSProperty"] = 10] = "NSProperty";
137
+ MemberKind12[MemberKind12["Sprite"] = 11] = "Sprite";
138
+ MemberKind12[MemberKind12["Audio"] = 12] = "Audio";
139
+ MemberKind12[MemberKind12["Function"] = 13] = "Function";
140
+ MemberKind12[MemberKind12["Vector2"] = 14] = "Vector2";
141
+ MemberKind12[MemberKind12["Vector2Int"] = 15] = "Vector2Int";
142
+ MemberKind12[MemberKind12["Vector3"] = 16] = "Vector3";
143
+ MemberKind12[MemberKind12["Vector3Int"] = 17] = "Vector3Int";
144
+ MemberKind12[MemberKind12["DialogueLookup"] = 18] = "DialogueLookup";
145
+ MemberKind12[MemberKind12["Color"] = 19] = "Color";
146
+ MemberKind12[MemberKind12["Decimal"] = 20] = "Decimal";
147
+ MemberKind12[MemberKind12["Generic"] = 21] = "Generic";
148
+ MemberKind12[MemberKind12["Interface"] = 22] = "Interface";
149
+ MemberKind12[MemberKind12["NSFunction"] = 23] = "NSFunction";
150
+ MemberKind12[MemberKind12["FunctionRef"] = 24] = "FunctionRef";
151
+ MemberKind12[MemberKind12["NSDelegate"] = 25] = "NSDelegate";
152
+ MemberKind12[MemberKind12["NSAction"] = 26] = "NSAction";
153
+ MemberKind12[MemberKind12["Variant"] = 27] = "Variant";
154
+ return MemberKind12;
155
155
  })(MemberKind || {});
156
156
  }
157
157
  });
158
158
 
159
- // ../src/models/members/member-kind-taxonomy.ts
159
+ // ../packages/models/src/members/member-kind-taxonomy.ts
160
160
  var STORED, BINDABLE, TAXONOMY, ALL_MEMBER_KINDS, DIRECT_MEMBER_KINDS, hasTrait, isVectorMemberKind, memberKindSupportsStorage, memberKindOwnsStoredValue;
161
161
  var init_member_kind_taxonomy = __esm({
162
- "../src/models/members/member-kind-taxonomy.ts"() {
162
+ "../packages/models/src/members/member-kind-taxonomy.ts"() {
163
163
  "use strict";
164
- init_member_kind_enum();
165
164
  STORED = 1 /* Storage */ | 2 /* OwnsValue */;
166
165
  BINDABLE = STORED | 4 /* Binding */;
167
166
  TAXONOMY = {
@@ -264,7 +263,7 @@ var init_member_kind_taxonomy = __esm({
264
263
  }
265
264
  });
266
265
 
267
- // ../src/models/members/member-subtree-distribution.ts
266
+ // ../packages/models/src/members/member-subtree-distribution.ts
268
267
  function isNeoSubtreeDistributionKind(value) {
269
268
  return value === 0 /* Sparse */ || value === 1 /* Packed */;
270
269
  }
@@ -296,9 +295,8 @@ function memberKindSupportsDistribution(kind) {
296
295
  }
297
296
  var AUTOMATIC_MEMBER_DISTRIBUTION, PACKED;
298
297
  var init_member_subtree_distribution = __esm({
299
- "../src/models/members/member-subtree-distribution.ts"() {
298
+ "../packages/models/src/members/member-subtree-distribution.ts"() {
300
299
  "use strict";
301
- init_member_kind_enum();
302
300
  init_member_kind_taxonomy();
303
301
  AUTOMATIC_MEMBER_DISTRIBUTION = {
304
302
  /** A stored null has no growth axis. */
@@ -372,6 +370,7 @@ var init_member_subtree_distribution = __esm({
372
370
  var regex_default;
373
371
  var init_regex = __esm({
374
372
  "../node_modules/uuid/dist-node/regex.js"() {
373
+ "use strict";
375
374
  regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;
376
375
  }
377
376
  });
@@ -383,6 +382,7 @@ function validate(uuid) {
383
382
  var validate_default;
384
383
  var init_validate = __esm({
385
384
  "../node_modules/uuid/dist-node/validate.js"() {
385
+ "use strict";
386
386
  init_regex();
387
387
  validate_default = validate;
388
388
  }
@@ -399,6 +399,7 @@ function parse(uuid) {
399
399
  var parse_default;
400
400
  var init_parse = __esm({
401
401
  "../node_modules/uuid/dist-node/parse.js"() {
402
+ "use strict";
402
403
  init_validate();
403
404
  parse_default = parse;
404
405
  }
@@ -411,6 +412,7 @@ function unsafeStringify(arr, offset = 0) {
411
412
  var byteToHex;
412
413
  var init_stringify = __esm({
413
414
  "../node_modules/uuid/dist-node/stringify.js"() {
415
+ "use strict";
414
416
  byteToHex = [];
415
417
  for (let i2 = 0; i2 < 256; ++i2) {
416
418
  byteToHex.push((i2 + 256).toString(16).slice(1));
@@ -425,6 +427,7 @@ function rng() {
425
427
  var rnds8;
426
428
  var init_rng = __esm({
427
429
  "../node_modules/uuid/dist-node/rng.js"() {
430
+ "use strict";
428
431
  rnds8 = new Uint8Array(16);
429
432
  }
430
433
  });
@@ -468,6 +471,7 @@ function v35(version, hash, value, namespace, buf, offset) {
468
471
  var DNS, URL2;
469
472
  var init_v35 = __esm({
470
473
  "../node_modules/uuid/dist-node/v35.js"() {
474
+ "use strict";
471
475
  init_parse();
472
476
  init_stringify();
473
477
  DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
@@ -505,6 +509,7 @@ function _v4(options, buf, offset) {
505
509
  var v4_default;
506
510
  var init_v4 = __esm({
507
511
  "../node_modules/uuid/dist-node/v4.js"() {
512
+ "use strict";
508
513
  init_rng();
509
514
  init_stringify();
510
515
  v4_default = v4;
@@ -524,6 +529,7 @@ function sha1(bytes) {
524
529
  var sha1_default;
525
530
  var init_sha1 = __esm({
526
531
  "../node_modules/uuid/dist-node/sha1.js"() {
532
+ "use strict";
527
533
  sha1_default = sha1;
528
534
  }
529
535
  });
@@ -535,6 +541,7 @@ function v5(value, namespace, buf, offset) {
535
541
  var v5_default;
536
542
  var init_v5 = __esm({
537
543
  "../node_modules/uuid/dist-node/v5.js"() {
544
+ "use strict";
538
545
  init_sha1();
539
546
  init_v35();
540
547
  v5.DNS = DNS;
@@ -546,13 +553,14 @@ var init_v5 = __esm({
546
553
  // ../node_modules/uuid/dist-node/index.js
547
554
  var init_dist_node = __esm({
548
555
  "../node_modules/uuid/dist-node/index.js"() {
556
+ "use strict";
549
557
  init_parse();
550
558
  init_v4();
551
559
  init_v5();
552
560
  }
553
561
  });
554
562
 
555
- // ../src/models/project/project-root-members.ts
563
+ // ../packages/models/src/project/project-root-members.ts
556
564
  function projectRootMemberIds(project) {
557
565
  return PROJECT_ROOTS.map((root) => project[root.projectField]);
558
566
  }
@@ -582,9 +590,8 @@ function projectRootMembersInDisplayOrder(project) {
582
590
  }
583
591
  var PROJECT_ROOTS;
584
592
  var init_project_root_members = __esm({
585
- "../src/models/project/project-root-members.ts"() {
593
+ "../packages/models/src/project/project-root-members.ts"() {
586
594
  "use strict";
587
- init_member_storage();
588
595
  PROJECT_ROOTS = [
589
596
  {
590
597
  key: "Assets",
@@ -618,7 +625,7 @@ var init_project_root_members = __esm({
618
625
  }
619
626
  });
620
627
 
621
- // ../src/models/core/structural-narrow.ts
628
+ // ../packages/models/src/core/structural-narrow.ts
622
629
  function isObject(value) {
623
630
  if (typeof value !== "object") return false;
624
631
  return value !== null;
@@ -678,19 +685,19 @@ function setOwnField(record7, key, value) {
678
685
  });
679
686
  }
680
687
  var init_structural_narrow = __esm({
681
- "../src/models/core/structural-narrow.ts"() {
688
+ "../packages/models/src/core/structural-narrow.ts"() {
682
689
  "use strict";
683
690
  }
684
691
  });
685
692
 
686
- // ../src/models/core/world-system-kinds.generated.ts
693
+ // ../packages/models/src/core/world-system-kinds.generated.ts
687
694
  function isNeoWorldSystemClassKind(value) {
688
695
  if (typeof value !== "string") return false;
689
696
  return NEO_WORLD_SYSTEM_CLASS_KIND_VALUES.has(value);
690
697
  }
691
698
  var NeoWorldSystemClassKind, NEO_WORLD_SYSTEM_CLASS_KIND_VALUES;
692
699
  var init_world_system_kinds_generated = __esm({
693
- "../src/models/core/world-system-kinds.generated.ts"() {
700
+ "../packages/models/src/core/world-system-kinds.generated.ts"() {
694
701
  "use strict";
695
702
  NeoWorldSystemClassKind = {
696
703
  CellPattern: "cellPattern",
@@ -733,7 +740,7 @@ var init_world_system_kinds_generated = __esm({
733
740
  }
734
741
  });
735
742
 
736
- // ../src/models/core/core-types.ts
743
+ // ../packages/models/src/core/core-types.ts
737
744
  function isWithId(value) {
738
745
  return typeof value?.id === "string";
739
746
  }
@@ -766,7 +773,7 @@ function isWithName(value) {
766
773
  }
767
774
  var SystemDisallowedOperation, SystemProtectionKind;
768
775
  var init_core_types = __esm({
769
- "../src/models/core/core-types.ts"() {
776
+ "../packages/models/src/core/core-types.ts"() {
770
777
  "use strict";
771
778
  init_world_system_kinds_generated();
772
779
  SystemDisallowedOperation = {
@@ -799,7 +806,7 @@ var init_core_types = __esm({
799
806
  }
800
807
  });
801
808
 
802
- // ../src/models/docs-text.ts
809
+ // ../packages/models/src/docs-text.ts
803
810
  function isValidDocsText(value) {
804
811
  if (value === void 0) return true;
805
812
  if (typeof value !== "string") return false;
@@ -807,14 +814,14 @@ function isValidDocsText(value) {
807
814
  }
808
815
  var DOCS_TEXT_MAX_UTF8_BYTES, textEncoder;
809
816
  var init_docs_text = __esm({
810
- "../src/models/docs-text.ts"() {
817
+ "../packages/models/src/docs-text.ts"() {
811
818
  "use strict";
812
819
  DOCS_TEXT_MAX_UTF8_BYTES = 16384;
813
820
  textEncoder = new TextEncoder();
814
821
  }
815
822
  });
816
823
 
817
- // ../src/models/members/float32.ts
824
+ // ../packages/models/src/members/float32.ts
818
825
  function isFloat32(value) {
819
826
  return typeof value === "number" && Number.isFinite(value) && Math.fround(value) === value;
820
827
  }
@@ -850,7 +857,7 @@ function float32Text(value) {
850
857
  return String(value);
851
858
  }
852
859
  var init_float32 = __esm({
853
- "../src/models/members/float32.ts"() {
860
+ "../packages/models/src/members/float32.ts"() {
854
861
  "use strict";
855
862
  }
856
863
  });
@@ -1897,7 +1904,7 @@ var init_project_source_identifiers = __esm({
1897
1904
  }
1898
1905
  });
1899
1906
 
1900
- // ../src/models/project-source-identifiers.ts
1907
+ // ../packages/models/src/project-source-identifiers.ts
1901
1908
  function isValidGeneratedIdentifier(value) {
1902
1909
  return typeof value === "string" && isGeneratedCSharpIdentifier(value) && !isGeneratedCSharpReservedKeyword(value);
1903
1910
  }
@@ -1911,14 +1918,14 @@ function isValidProjectBindingIdentifier(value) {
1911
1918
  return isValidGeneratedIdentifier(value) && isValidNeoProjectBindingIdentifier(value);
1912
1919
  }
1913
1920
  var init_project_source_identifiers2 = __esm({
1914
- "../src/models/project-source-identifiers.ts"() {
1921
+ "../packages/models/src/project-source-identifiers.ts"() {
1915
1922
  "use strict";
1916
1923
  init_generated_csharp_identifiers();
1917
1924
  init_project_source_identifiers();
1918
1925
  }
1919
1926
  });
1920
1927
 
1921
- // ../src/models/schema-identifiers.ts
1928
+ // ../packages/models/src/schema-identifiers.ts
1922
1929
  function isValidSchemaAuthoredIdentifier(value) {
1923
1930
  return isValidProjectSourceIdentifier(value);
1924
1931
  }
@@ -1929,7 +1936,7 @@ function isValidSchemaBindingIdentifier(value) {
1929
1936
  return isValidProjectBindingIdentifier(value);
1930
1937
  }
1931
1938
  var init_schema_identifiers = __esm({
1932
- "../src/models/schema-identifiers.ts"() {
1939
+ "../packages/models/src/schema-identifiers.ts"() {
1933
1940
  "use strict";
1934
1941
  init_project_source_identifiers2();
1935
1942
  }
@@ -1962,7 +1969,7 @@ var init_strict_ir = __esm({
1962
1969
  }
1963
1970
  });
1964
1971
 
1965
- // ../src/models/neoscript/neoscript-compiler-revision.ts
1972
+ // ../packages/models/src/neoscript/neoscript-compiler-revision.ts
1966
1973
  function isAcceptedNeoScriptCompilerRevision(stamp, rollout = ACTIVE_NEOSCRIPT_COMPILER_REVISION_ROLLOUT) {
1967
1974
  if (stamp === NEOSCRIPT_COMPILER_REVISION) return true;
1968
1975
  if (rollout === null) return false;
@@ -2029,7 +2036,7 @@ function isCompiledBodyShape(object2) {
2029
2036
  }
2030
2037
  var ACTIVE_NEOSCRIPT_COMPILER_REVISION_ROLLOUT;
2031
2038
  var init_neoscript_compiler_revision = __esm({
2032
- "../src/models/neoscript/neoscript-compiler-revision.ts"() {
2039
+ "../packages/models/src/neoscript/neoscript-compiler-revision.ts"() {
2033
2040
  "use strict";
2034
2041
  init_strict_ir();
2035
2042
  ACTIVE_NEOSCRIPT_COMPILER_REVISION_ROLLOUT = // <neoscript-compiler-revision-rollout>
@@ -2037,10 +2044,10 @@ var init_neoscript_compiler_revision = __esm({
2037
2044
  }
2038
2045
  });
2039
2046
 
2040
- // ../src/models/neoscript/neoscript-types.ts
2047
+ // ../packages/models/src/neoscript/neoscript-types.ts
2041
2048
  var NS_TYPE_UNKNOWN, NS_TYPE_VOID, NSAssignmentOperator, NSWritability, NSCollectionMutation;
2042
2049
  var init_neoscript_types = __esm({
2043
- "../src/models/neoscript/neoscript-types.ts"() {
2050
+ "../packages/models/src/neoscript/neoscript-types.ts"() {
2044
2051
  "use strict";
2045
2052
  NS_TYPE_UNKNOWN = "Unknown";
2046
2053
  NS_TYPE_VOID = "Void";
@@ -2078,7 +2085,7 @@ var init_neoscript_types = __esm({
2078
2085
  }
2079
2086
  });
2080
2087
 
2081
- // ../src/models/neoscript/neoscript-guards.ts
2088
+ // ../packages/models/src/neoscript/neoscript-guards.ts
2082
2089
  function isNSTypeInfoBase(value) {
2083
2090
  const v = value;
2084
2091
  return typeof v === "object" && v !== null && typeof v.type === "number" && v.type in MemberKind && typeof v.required === "boolean";
@@ -3150,24 +3157,30 @@ function isNSInstructionTry(value) {
3150
3157
  }
3151
3158
  return true;
3152
3159
  }
3153
- function isNSInstructionChangeListener(value) {
3154
- const instruction = value;
3155
- if (instruction?.type !== "addChangeListener" /* addChangeListener */ && instruction?.type !== "removeChangeListener" /* removeChangeListener */)
3156
- return false;
3157
- const target = instruction.target;
3160
+ function isNSChangeListenerTarget(value) {
3161
+ const target = value;
3158
3162
  if (!target || typeof target.memberId !== "string" || target.memberId.length === 0)
3159
3163
  return false;
3160
3164
  if (!isNSPointer(target.owner) || !isNSTypeInfo(target.typeInfo))
3161
3165
  return false;
3162
- if (!Object.values(NSWritability).includes(target.writability)) return false;
3163
- return isNSPointer(instruction.listener);
3166
+ return target.writability !== void 0 && Object.values(NSWritability).includes(target.writability);
3167
+ }
3168
+ function isNSInstructionChangeListener(value) {
3169
+ const instruction = value;
3170
+ if (instruction?.type !== "addChangeListener" /* addChangeListener */ && instruction?.type !== "removeChangeListener" /* removeChangeListener */)
3171
+ return false;
3172
+ return isNSChangeListenerTarget(instruction.target) && isNSPointer(instruction.listener);
3173
+ }
3174
+ function isNSInstructionClearChangeListeners(value) {
3175
+ const instruction = value;
3176
+ return instruction?.type === "clearChangeListeners" /* clearChangeListeners */ && isNSChangeListenerTarget(instruction.target);
3164
3177
  }
3165
3178
  function isNSInstructionDebug(value) {
3166
3179
  const v = value;
3167
3180
  return v?.type === "debug" /* debug */ && ["log", "warning", "error", "assert"].includes(v.severity ?? "") && isNSPointer(v.message) && isNSTypeInfo(v.messageType) && (v.severity === "assert" ? isNSPointer(v.condition) : v.condition === void 0);
3168
3181
  }
3169
3182
  function isNSInstruction(value) {
3170
- return isNSInstructionDebug(value) || isNSInstructionVariable(value) || isNSInstructionIfBranch(value) || isNSInstructionReturn(value) || isNSInstructionThrow(value) || isNSInstructionAssign(value) || isNSInstructionCollectionCall(value) || isNSInstructionFunctionCall(value) || isNSInstructionConditionLoop(value) || isNSInstructionFor(value) || isNSInstructionForEach(value) || isNSInstructionBreak(value) || isNSInstructionContinue(value) || isNSInstructionSwitch(value) || isNSInstructionTry(value) || isNSInstructionChangeListener(value) || isNSInstructionAddActionListener(value) || isNSInstructionRemoveActionListener(value);
3183
+ return isNSInstructionDebug(value) || isNSInstructionVariable(value) || isNSInstructionIfBranch(value) || isNSInstructionReturn(value) || isNSInstructionThrow(value) || isNSInstructionAssign(value) || isNSInstructionCollectionCall(value) || isNSInstructionFunctionCall(value) || isNSInstructionConditionLoop(value) || isNSInstructionFor(value) || isNSInstructionForEach(value) || isNSInstructionBreak(value) || isNSInstructionContinue(value) || isNSInstructionSwitch(value) || isNSInstructionTry(value) || isNSInstructionChangeListener(value) || isNSInstructionClearChangeListeners(value) || isNSInstructionAddActionListener(value) || isNSInstructionRemoveActionListener(value);
3171
3184
  }
3172
3185
  function isNSInstructions(value) {
3173
3186
  return Array.isArray(value) && value.every(isNSInstruction);
@@ -3217,7 +3230,7 @@ function isNSVoidBody(value) {
3217
3230
  }
3218
3231
  var NS_STRING_OPS, NS_DECIMAL_OPS, NS_MATH_OPS;
3219
3232
  var init_neoscript_guards = __esm({
3220
- "../src/models/neoscript/neoscript-guards.ts"() {
3233
+ "../packages/models/src/neoscript/neoscript-guards.ts"() {
3221
3234
  "use strict";
3222
3235
  init_neoscript_compiler_revision();
3223
3236
  init_member_kind_enum();
@@ -3254,7 +3267,7 @@ var init_neoscript_guards = __esm({
3254
3267
  }
3255
3268
  });
3256
3269
 
3257
- // ../src/models/neoscript/parameter-defaults.ts
3270
+ // ../packages/models/src/neoscript/parameter-defaults.ts
3258
3271
  function parameterHasDefault(argument2) {
3259
3272
  return argument2.defaultValue !== void 0;
3260
3273
  }
@@ -3300,12 +3313,12 @@ function callableParameters(overload) {
3300
3313
  }));
3301
3314
  }
3302
3315
  var init_parameter_defaults = __esm({
3303
- "../src/models/neoscript/parameter-defaults.ts"() {
3316
+ "../packages/models/src/neoscript/parameter-defaults.ts"() {
3304
3317
  "use strict";
3305
3318
  }
3306
3319
  });
3307
3320
 
3308
- // ../src/models/neoscript/type-info-equality.ts
3321
+ // ../packages/models/src/neoscript/type-info-equality.ts
3309
3322
  function typeInfosInvariantlyEqual(left, right) {
3310
3323
  if (left.type !== right.type) return false;
3311
3324
  if (left.required !== right.required) return false;
@@ -3356,14 +3369,13 @@ function typeInfosInvariantlyEqual(left, right) {
3356
3369
  return true;
3357
3370
  }
3358
3371
  var init_type_info_equality = __esm({
3359
- "../src/models/neoscript/type-info-equality.ts"() {
3372
+ "../packages/models/src/neoscript/type-info-equality.ts"() {
3360
3373
  "use strict";
3361
- init_member_kind_enum();
3362
3374
  init_neoscript_types();
3363
3375
  }
3364
3376
  });
3365
3377
 
3366
- // ../src/common/collections.ts
3378
+ // ../packages/models/src/common/collections.ts
3367
3379
  function indexById(records3) {
3368
3380
  const indexed = /* @__PURE__ */ new Map();
3369
3381
  for (const record7 of records3) indexed.set(record7.id, record7);
@@ -3388,12 +3400,12 @@ async function forEachConcurrently(items, limit, work) {
3388
3400
  );
3389
3401
  }
3390
3402
  var init_collections = __esm({
3391
- "../src/common/collections.ts"() {
3403
+ "../packages/models/src/common/collections.ts"() {
3392
3404
  "use strict";
3393
3405
  }
3394
3406
  });
3395
3407
 
3396
- // ../src/models/classes/classes.ts
3408
+ // ../packages/models/src/classes/classes.ts
3397
3409
  function isAbstractClass(value) {
3398
3410
  return value?.modifier === 1 /* Abstract */;
3399
3411
  }
@@ -3588,7 +3600,7 @@ function isNeoSchemaClass(value) {
3588
3600
  }
3589
3601
  var RETIRED_CONSTRUCTOR_PROJECTIONS_FIELD;
3590
3602
  var init_classes = __esm({
3591
- "../src/models/classes/classes.ts"() {
3603
+ "../packages/models/src/classes/classes.ts"() {
3592
3604
  "use strict";
3593
3605
  init_collections();
3594
3606
  init_core_types();
@@ -3598,7 +3610,7 @@ var init_classes = __esm({
3598
3610
  }
3599
3611
  });
3600
3612
 
3601
- // ../src/models/members/structured-leaf-fields.ts
3613
+ // ../packages/models/src/members/structured-leaf-fields.ts
3602
3614
  function isStructuredLeafKind(kind) {
3603
3615
  return Object.prototype.hasOwnProperty.call(STRUCTURED_LEAF_FIELDS, kind);
3604
3616
  }
@@ -3683,9 +3695,8 @@ function structuredLeafFieldViolation(type, value) {
3683
3695
  }
3684
3696
  var STRUCTURED_LEAF_FIELDS, STRUCTURED_LEAF_PARTIAL_KEY;
3685
3697
  var init_structured_leaf_fields = __esm({
3686
- "../src/models/members/structured-leaf-fields.ts"() {
3698
+ "../packages/models/src/members/structured-leaf-fields.ts"() {
3687
3699
  "use strict";
3688
- init_member_kind_enum();
3689
3700
  init_float32();
3690
3701
  STRUCTURED_LEAF_FIELDS = {
3691
3702
  [11 /* Sprite */]: [
@@ -3721,7 +3732,7 @@ var init_structured_leaf_fields = __esm({
3721
3732
  }
3722
3733
  });
3723
3734
 
3724
- // ../src/models/members/member-kinds.ts
3735
+ // ../packages/models/src/members/member-kinds.ts
3725
3736
  function isFunctionEffectKind(value) {
3726
3737
  return value === 0 /* None */ || value === 1 /* Auto */;
3727
3738
  }
@@ -4909,7 +4920,7 @@ function isAnyMemberAuthoredOrCompiled(value) {
4909
4920
  }
4910
4921
  var FunctionArgumentReservedNames, ListKind, CHAIN_RESOLVED_OPTIONAL_MEMBER_FIELDS, MEMBER_ACCESS_KINDS, DECIMAL_STRING_PATTERN, DECIMAL_MAX_SIGNIFICANT_DIGITS, DECIMAL_MAX_SCALE;
4911
4922
  var init_member_kinds = __esm({
4912
- "../src/models/members/member-kinds.ts"() {
4923
+ "../packages/models/src/members/member-kinds.ts"() {
4913
4924
  "use strict";
4914
4925
  init_structural_narrow();
4915
4926
  init_core_types();
@@ -4933,10 +4944,10 @@ var init_member_kinds = __esm({
4933
4944
  "root",
4934
4945
  "context"
4935
4946
  ]);
4936
- ListKind = /* @__PURE__ */ ((ListKind3) => {
4937
- ListKind3[ListKind3["Ordered"] = 0] = "Ordered";
4938
- ListKind3[ListKind3["Unordered"] = 1] = "Unordered";
4939
- return ListKind3;
4947
+ ListKind = /* @__PURE__ */ ((ListKind2) => {
4948
+ ListKind2[ListKind2["Ordered"] = 0] = "Ordered";
4949
+ ListKind2[ListKind2["Unordered"] = 1] = "Unordered";
4950
+ return ListKind2;
4940
4951
  })(ListKind || {});
4941
4952
  CHAIN_RESOLVED_OPTIONAL_MEMBER_FIELDS = [
4942
4953
  "storageKey",
@@ -4968,7 +4979,7 @@ var init_member_kinds = __esm({
4968
4979
  }
4969
4980
  });
4970
4981
 
4971
- // ../src/models/project/project-schema-index.ts
4982
+ // ../packages/models/src/project/project-schema-index.ts
4972
4983
  function append(map, key, value) {
4973
4984
  const values = map.get(key);
4974
4985
  if (values === void 0) map.set(key, [value]);
@@ -5025,7 +5036,7 @@ function projectSchemaIndexFor(source, revision = EMPTY_REVISION) {
5025
5036
  }
5026
5037
  var CircularInheritanceError, ProjectSchemaIndex, EMPTY_STRING_SET, EMPTY_REVISION, projectSchemaIndexEpoch, projectSchemaIndexes, ABSENT_COLLECTION;
5027
5038
  var init_project_schema_index = __esm({
5028
- "../src/models/project/project-schema-index.ts"() {
5039
+ "../packages/models/src/project/project-schema-index.ts"() {
5029
5040
  "use strict";
5030
5041
  init_member_kinds();
5031
5042
  CircularInheritanceError = class extends Error {
@@ -5202,7 +5213,7 @@ var init_project_schema_index = __esm({
5202
5213
  }
5203
5214
  });
5204
5215
 
5205
- // ../src/models/classes/inheritance.ts
5216
+ // ../packages/models/src/classes/inheritance.ts
5206
5217
  function indexClasses(classes) {
5207
5218
  return projectSchemaIndexFor({ classes, members: NO_MEMBERS });
5208
5219
  }
@@ -5514,7 +5525,7 @@ function addDependentMemberIds(memberIds, members) {
5514
5525
  }
5515
5526
  var UnresolvedMemberInheritanceError, NO_CLASSES, NO_MEMBERS, resolvedClassSchemas;
5516
5527
  var init_inheritance = __esm({
5517
- "../src/models/classes/inheritance.ts"() {
5528
+ "../packages/models/src/classes/inheritance.ts"() {
5518
5529
  "use strict";
5519
5530
  init_member_kinds();
5520
5531
  init_structural_narrow();
@@ -5537,7 +5548,7 @@ var init_inheritance = __esm({
5537
5548
  }
5538
5549
  });
5539
5550
 
5540
- // ../src/models/system-record-id.ts
5551
+ // ../packages/models/src/system-record-id.ts
5541
5552
  function isSystemRecordId(id2) {
5542
5553
  return id2.startsWith(SYSTEM_RECORD_ID_PREFIX);
5543
5554
  }
@@ -5574,7 +5585,7 @@ function inSystemRecordNamespaceOf(ownerId, derivedId) {
5574
5585
  }
5575
5586
  var SYSTEM_RECORD_ID_PREFIX, RECORD_ID_PATTERN;
5576
5587
  var init_system_record_id = __esm({
5577
- "../src/models/system-record-id.ts"() {
5588
+ "../packages/models/src/system-record-id.ts"() {
5578
5589
  "use strict";
5579
5590
  SYSTEM_RECORD_ID_PREFIX = "system_";
5580
5591
  RECORD_ID_PATTERN = new RegExp(
@@ -5583,15 +5594,11 @@ var init_system_record_id = __esm({
5583
5594
  }
5584
5595
  });
5585
5596
 
5586
- // ../src/models/classes/world-system-classes.generated.ts
5597
+ // ../packages/models/src/classes/world-system-classes.generated.ts
5587
5598
  var WORLD_GRID_CHILDREN_MEMBER_ID, WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_BASE_ENABLED_SCHEMA_KEY, WORLD_OBJECT_CHILDREN_MEMBER_ID, WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_COLLIDER_SCHEMA_KEY, WORLD_COLLIDER_SIZE_SCHEMA_KEY, WORLD_COLLIDER_OFFSET_SCHEMA_KEY, WORLD_COLLIDER_IS_TRIGGER_SCHEMA_KEY, WORLD_SORTING_GROUP_SORT_AT_ROOT_SCHEMA_KEY, WORLD_SORTING_GROUP_SORT_POINT_SCHEMA_KEY, WORLD_SPRITE_MASK_INTERACTION_ENUM_ID, WORLD_SPRITE_MASK_INTERACTION_NONE_OPTION_ID, WORLD_SPRITE_MASK_INTERACTION_VISIBLE_INSIDE_OPTION_ID, WORLD_SPRITE_MASK_INTERACTION_VISIBLE_OUTSIDE_OPTION_ID, WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID, WORLD_PLACEMENT_TILE_CELL_MEMBER_ID, WORLD_TILE_CELL_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID, WORLD_TILE_SMART_TILE_SCHEMA_KEY, WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY, WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY, WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY, WORLD_ANIMATION_CLIP_TARGET_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID, WORLD_ANIMATION_CLIP_FPS_MEMBER_ID, WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID, WORLD_ANIMATION_FRAME_BASE_INDEX_MEMBER_ID, WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_SELECTOR_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_REFRESH_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_TRACK_SELECTOR_MEMBER_ID, WORLD_ANIMATION_TRACK_REFRESH_MEMBER_ID, WORLD_ANIMATION_TRACK_START_FRAME_MEMBER_ID, WORLD_ANIMATION_TRACK_DIRECTION_MEMBER_ID, WORLD_ANIMATION_TRACK_OFFSET_START_INDEX_MEMBER_ID, WORLD_ANIMATION_TRACK_OFFSET_END_INDEX_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID, WORLD_ANIMATION_SEGMENT_DURATION_MEMBER_ID, WORLD_ANIMATION_SEGMENT_FRAMES_MEMBER_ID, WORLD_ANIMATION_SEGMENT_TRACK_CHILD_PARAM_ID, WORLD_ANIMATION_SEGMENT_TRACK_VALUE_PARAM_ID, WORLD_PLAY_DIRECTION_ENUM_ID, WORLD_SELECTOR_REFRESH_ON_LOAD_OPTION_ID, WORLD_SELECTOR_REFRESH_PER_FRAME_OPTION_ID, WORLD_PLAY_DIRECTION_FORWARD_OPTION_ID, WORLD_PLAY_DIRECTION_REVERSE_OPTION_ID, WORLD_SYSTEM_CLASS_DEFINITIONS;
5588
5599
  var init_world_system_classes_generated = __esm({
5589
- "../src/models/classes/world-system-classes.generated.ts"() {
5600
+ "../packages/models/src/classes/world-system-classes.generated.ts"() {
5590
5601
  "use strict";
5591
- init_member_storage();
5592
- init_member_subtree_distribution();
5593
- init_classes();
5594
- init_member_kinds();
5595
5602
  WORLD_GRID_CHILDREN_MEMBER_ID = "system_98578ba3-a70e-4397-9283-996a898d44c8";
5596
5603
  WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID = "system_c86da069-7ef9-5693-a54b-5c331755fde9";
5597
5604
  WORLD_OBJECT_BASE_ENABLED_SCHEMA_KEY = "Enabled";
@@ -7597,7 +7604,7 @@ var init_world_system_classes_generated = __esm({
7597
7604
  }
7598
7605
  });
7599
7606
 
7600
- // ../src/models/core/deep-clone-plain-data.ts
7607
+ // ../packages/models/src/core/deep-clone-plain-data.ts
7601
7608
  function deepClonePlainData(value) {
7602
7609
  return clonePlain(value, "$", /* @__PURE__ */ new Set());
7603
7610
  }
@@ -7645,13 +7652,13 @@ function clonePlain(value, path, visiting) {
7645
7652
  }
7646
7653
  }
7647
7654
  var init_deep_clone_plain_data = __esm({
7648
- "../src/models/core/deep-clone-plain-data.ts"() {
7655
+ "../packages/models/src/core/deep-clone-plain-data.ts"() {
7649
7656
  "use strict";
7650
7657
  init_structural_narrow();
7651
7658
  }
7652
7659
  });
7653
7660
 
7654
- // ../src/models/classes/world-system-classes.ts
7661
+ // ../packages/models/src/classes/world-system-classes.ts
7655
7662
  function worldAnimationChildOverrideBindingMemberId(classId) {
7656
7663
  return inSystemRecordNamespaceOf(
7657
7664
  classId,
@@ -7702,16 +7709,11 @@ function animationFamilyClassKinds(classes) {
7702
7709
  }
7703
7710
  var WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE, WORLD_SYSTEM_CLASS_DEFINITION_BY_KIND, WORLD_SYSTEM_ANIMATION_KIND_MARKER, WORLD_SYSTEM_ANIMATION_KINDS, GENERIC_WORLD_SYSTEM_CLASS_KINDS, WORLD_SYSTEM_ALL_KINDS, WORLD_SYSTEM_SCHEMA_FIELD_SITES_BY_MEMBER_ID;
7704
7711
  var init_world_system_classes = __esm({
7705
- "../src/models/classes/world-system-classes.ts"() {
7712
+ "../packages/models/src/classes/world-system-classes.ts"() {
7706
7713
  "use strict";
7707
- init_classes();
7708
- init_member_kinds();
7709
- init_neoscript_types();
7710
- init_core_types();
7711
7714
  init_dist_node();
7712
7715
  init_system_record_id();
7713
7716
  init_world_system_classes_generated();
7714
- init_deep_clone_plain_data();
7715
7717
  init_world_system_classes_generated();
7716
7718
  WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME = "NeoAnimationChildBinding";
7717
7719
  WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE = "2048c3bb-8ae5-51cc-a1dc-15178cc41865";
@@ -7750,7 +7752,7 @@ var init_world_system_classes = __esm({
7750
7752
  }
7751
7753
  });
7752
7754
 
7753
- // ../src/models/classes/generics.ts
7755
+ // ../packages/models/src/classes/generics.ts
7754
7756
  function resolveGenericEnv(classId, classes, draft) {
7755
7757
  const index = classIndexFor(classes);
7756
7758
  let byClass = genericBindingsByClassIndex.get(index);
@@ -8558,7 +8560,7 @@ function isAnimationChildOverrideEntrySlot(slotMember, members) {
8558
8560
  }
8559
8561
  var genericBindingsByClassIndex;
8560
8562
  var init_generics = __esm({
8561
- "../src/models/classes/generics.ts"() {
8563
+ "../packages/models/src/classes/generics.ts"() {
8562
8564
  "use strict";
8563
8565
  init_member_kinds();
8564
8566
  init_neoscript_guards();
@@ -8620,7 +8622,7 @@ var init_value_graph = __esm({
8620
8622
  }
8621
8623
  });
8622
8624
 
8623
- // ../src/models/members/instance-provenance.ts
8625
+ // ../packages/models/src/members/instance-provenance.ts
8624
8626
  function replaceLiteralValueClass(value, classId) {
8625
8627
  const next = { ...value, classId };
8626
8628
  for (const field of LITERAL_INSTANCE_IDENTITY_FIELDS) {
@@ -8659,7 +8661,7 @@ function carriesCompleteConstructionRecipe(value) {
8659
8661
  }
8660
8662
  var LITERAL_INSTANCE_IDENTITY_FIELDS;
8661
8663
  var init_instance_provenance = __esm({
8662
- "../src/models/members/instance-provenance.ts"() {
8664
+ "../packages/models/src/members/instance-provenance.ts"() {
8663
8665
  "use strict";
8664
8666
  init_value_graph();
8665
8667
  init_member_kinds();
@@ -8674,7 +8676,7 @@ var init_instance_provenance = __esm({
8674
8676
  }
8675
8677
  });
8676
8678
 
8677
- // ../src/models/members/unordered-list-membership.ts
8679
+ // ../packages/models/src/members/unordered-list-membership.ts
8678
8680
  function buildUnorderedListMembershipIndex(values) {
8679
8681
  const membersByContainerId = /* @__PURE__ */ new Map();
8680
8682
  for (const candidate of values) {
@@ -8732,13 +8734,13 @@ function assertUnorderedListContainerIsPresent(parentValue) {
8732
8734
  }
8733
8735
  }
8734
8736
  var init_unordered_list_membership = __esm({
8735
- "../src/models/members/unordered-list-membership.ts"() {
8737
+ "../packages/models/src/members/unordered-list-membership.ts"() {
8736
8738
  "use strict";
8737
8739
  init_member_kinds();
8738
8740
  }
8739
8741
  });
8740
8742
 
8741
- // ../src/models/members/read-only-members.ts
8743
+ // ../packages/models/src/members/read-only-members.ts
8742
8744
  function concreteDeclaringGenericEnv(memberId, classes) {
8743
8745
  const env = resolveDeclaringClassGenericEnv(memberId, classes);
8744
8746
  const concrete = new Map(
@@ -9346,16 +9348,13 @@ function genericEnvironmentKey(env) {
9346
9348
  }
9347
9349
  var READ_ONLY_SYNTHETIC_VALUE_ID_PREFIX;
9348
9350
  var init_read_only_members = __esm({
9349
- "../src/models/members/read-only-members.ts"() {
9351
+ "../packages/models/src/members/read-only-members.ts"() {
9350
9352
  "use strict";
9351
9353
  init_project_root_members();
9352
9354
  init_inheritance();
9353
- init_classes();
9354
9355
  init_project_schema_index();
9355
9356
  init_generics();
9356
9357
  init_member_kinds();
9357
- init_instance_provenance();
9358
- init_member_storage();
9359
9358
  init_unordered_list_membership();
9360
9359
  init_dist_node();
9361
9360
  init_classes();
@@ -9363,7 +9362,7 @@ var init_read_only_members = __esm({
9363
9362
  }
9364
9363
  });
9365
9364
 
9366
- // ../src/models/members/member-value-id.ts
9365
+ // ../packages/models/src/members/member-value-id.ts
9367
9366
  function derivedMemberValueId(memberId) {
9368
9367
  return inSystemRecordNamespaceOf(
9369
9368
  memberId,
@@ -9419,7 +9418,7 @@ function pendingMemberValueMemberId(token) {
9419
9418
  }
9420
9419
  var NEO_MEMBER_VALUE_NAMESPACE, NEO_VIRTUAL_VALUE_NAMESPACE, virtualNamespaceBytes, virtualIdentityEncoder, SURROGATE_CODE_UNIT, PENDING_VIRTUAL_VALUE_PREFIX, PENDING_MEMBER_VALUE_PREFIX;
9421
9420
  var init_member_value_id = __esm({
9422
- "../src/models/members/member-value-id.ts"() {
9421
+ "../packages/models/src/members/member-value-id.ts"() {
9423
9422
  "use strict";
9424
9423
  init_dist_node();
9425
9424
  init_system_record_id();
@@ -9433,7 +9432,7 @@ var init_member_value_id = __esm({
9433
9432
  }
9434
9433
  });
9435
9434
 
9436
- // ../src/models/members/packed-value-encoding.ts
9435
+ // ../packages/models/src/members/packed-value-encoding.ts
9437
9436
  function isPackedValueEnvelope(value) {
9438
9437
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
9439
9438
  return false;
@@ -9864,7 +9863,7 @@ function registerEdge(edges, ownerId, childId) {
9864
9863
  }
9865
9864
  var PACKED_VALUE_ENTRY_KEY, PackedValueEncodingError, NO_CHILDREN, NO_EDGES, NO_POSITIONS, PACKED_ENTRY_FORBIDDEN_FIELDS;
9866
9865
  var init_packed_value_encoding = __esm({
9867
- "../src/models/members/packed-value-encoding.ts"() {
9866
+ "../packages/models/src/members/packed-value-encoding.ts"() {
9868
9867
  "use strict";
9869
9868
  init_instance_provenance();
9870
9869
  init_member_kinds();
@@ -9887,7 +9886,7 @@ var init_packed_value_encoding = __esm({
9887
9886
  }
9888
9887
  });
9889
9888
 
9890
- // ../src/models/members/member-storage-key.ts
9889
+ // ../packages/models/src/members/member-storage-key.ts
9891
9890
  function normalizeStorageKeyDeclaration(declaration) {
9892
9891
  if (declaration === void 0 || declaration === null) {
9893
9892
  return STORAGE_KEY_INHERIT;
@@ -9922,7 +9921,7 @@ function resolveMapKeyForCreatedValue(args) {
9922
9921
  }
9923
9922
  var MAIN_STORAGE_PARTITION, STORAGE_KEY_INHERIT, STORAGE_KEY_ALL, PARENT_CLASS_TEMPLATE_TOKEN;
9924
9923
  var init_member_storage_key = __esm({
9925
- "../src/models/members/member-storage-key.ts"() {
9924
+ "../packages/models/src/members/member-storage-key.ts"() {
9926
9925
  "use strict";
9927
9926
  MAIN_STORAGE_PARTITION = "main";
9928
9927
  STORAGE_KEY_INHERIT = "inherit";
@@ -9931,7 +9930,7 @@ var init_member_storage_key = __esm({
9931
9930
  }
9932
9931
  });
9933
9932
 
9934
- // ../src/models/members/storage-partitions.ts
9933
+ // ../packages/models/src/members/storage-partitions.ts
9935
9934
  function resolveDeclaredStorageKey(members, member) {
9936
9935
  const resolved = resolveMember(member, members);
9937
9936
  return normalizeStorageKeyDeclaration(resolved.storageKey);
@@ -10040,7 +10039,7 @@ function referencedValueIdCandidates(value) {
10040
10039
  return [];
10041
10040
  }
10042
10041
  var init_storage_partitions = __esm({
10043
- "../src/models/members/storage-partitions.ts"() {
10042
+ "../packages/models/src/members/storage-partitions.ts"() {
10044
10043
  "use strict";
10045
10044
  init_inheritance();
10046
10045
  init_member_storage_key();
@@ -10048,7 +10047,7 @@ var init_storage_partitions = __esm({
10048
10047
  }
10049
10048
  });
10050
10049
 
10051
- // ../src/models/core/auth-ownership-types.ts
10050
+ // ../packages/models/src/core/auth-ownership-types.ts
10052
10051
  function isActorIdentifier(value) {
10053
10052
  if (typeof value !== "object") return false;
10054
10053
  if (value === null) return false;
@@ -10061,7 +10060,7 @@ function isActorKind(value) {
10061
10060
  }
10062
10061
  var ActorKind;
10063
10062
  var init_auth_ownership_types = __esm({
10064
- "../src/models/core/auth-ownership-types.ts"() {
10063
+ "../packages/models/src/core/auth-ownership-types.ts"() {
10065
10064
  "use strict";
10066
10065
  ActorKind = {
10067
10066
  /**
@@ -10080,9 +10079,9 @@ var init_auth_ownership_types = __esm({
10080
10079
  }
10081
10080
  });
10082
10081
 
10083
- // ../src/models/core/index.ts
10082
+ // ../packages/models/src/core/index.ts
10084
10083
  var init_core = __esm({
10085
- "../src/models/core/index.ts"() {
10084
+ "../packages/models/src/core/index.ts"() {
10086
10085
  "use strict";
10087
10086
  init_core_types();
10088
10087
  init_auth_ownership_types();
@@ -10090,7 +10089,7 @@ var init_core = __esm({
10090
10089
  }
10091
10090
  });
10092
10091
 
10093
- // ../src/models/members/member-change-listeners.ts
10092
+ // ../packages/models/src/members/member-change-listeners.ts
10094
10093
  function editChangeListenerSet(explicit, inherited, edit, options = { inheritedComplete: true }) {
10095
10094
  if (edit.kind === "reset") {
10096
10095
  return explicit === void 0 ? { changed: false } : { changed: true, targets: void 0 };
@@ -10200,7 +10199,7 @@ function defaultSourceWithListeners(row, graph) {
10200
10199
  }
10201
10200
  var authoredListenerIndexes, declarationListenerMetadata;
10202
10201
  var init_member_change_listeners = __esm({
10203
- "../src/models/members/member-change-listeners.ts"() {
10202
+ "../packages/models/src/members/member-change-listeners.ts"() {
10204
10203
  "use strict";
10205
10204
  init_core();
10206
10205
  init_member_kinds();
@@ -10209,7 +10208,7 @@ var init_member_change_listeners = __esm({
10209
10208
  }
10210
10209
  });
10211
10210
 
10212
- // ../src/models/constructors/constructors.ts
10211
+ // ../packages/models/src/constructors/constructors.ts
10213
10212
  function hasRejectedConstructorKey(value) {
10214
10213
  return REJECTED_CONSTRUCTOR_KEYS.some((key) => value[key] !== void 0);
10215
10214
  }
@@ -10351,7 +10350,7 @@ function constructorActionParameterId(constructor2, index) {
10351
10350
  }
10352
10351
  var REJECTED_CONSTRUCTOR_KEYS;
10353
10352
  var init_constructors = __esm({
10354
- "../src/models/constructors/constructors.ts"() {
10353
+ "../packages/models/src/constructors/constructors.ts"() {
10355
10354
  "use strict";
10356
10355
  init_core_types();
10357
10356
  init_docs_text();
@@ -10369,15 +10368,15 @@ var init_constructors = __esm({
10369
10368
  }
10370
10369
  });
10371
10370
 
10372
- // ../src/models/constructors/index.ts
10371
+ // ../packages/models/src/constructors/index.ts
10373
10372
  var init_constructors2 = __esm({
10374
- "../src/models/constructors/index.ts"() {
10373
+ "../packages/models/src/constructors/index.ts"() {
10375
10374
  "use strict";
10376
10375
  init_constructors();
10377
10376
  }
10378
10377
  });
10379
10378
 
10380
- // ../src/models/classes/construction-requirements.ts
10379
+ // ../packages/models/src/classes/construction-requirements.ts
10381
10380
  function requiredMembersForConstruction(classId, document, classArguments2) {
10382
10381
  return unsettledMembers(
10383
10382
  classId,
@@ -10611,10 +10610,9 @@ function resolveConstructionTypeArguments(typeArguments, document) {
10611
10610
  return bindings;
10612
10611
  }
10613
10612
  var init_construction_requirements = __esm({
10614
- "../src/models/classes/construction-requirements.ts"() {
10613
+ "../packages/models/src/classes/construction-requirements.ts"() {
10615
10614
  "use strict";
10616
10615
  init_type_info_equality();
10617
- init_classes();
10618
10616
  init_inheritance();
10619
10617
  init_generics();
10620
10618
  init_constructors2();
@@ -10623,7 +10621,7 @@ var init_construction_requirements = __esm({
10623
10621
  }
10624
10622
  });
10625
10623
 
10626
- // ../src/models/unity/unity-import-settings.ts
10624
+ // ../packages/models/src/unity/unity-import-settings.ts
10627
10625
  function buildDefaultUnityTexture2DImportSettings() {
10628
10626
  return {
10629
10627
  type: "texture-2d" /* Texture2D */,
@@ -11268,7 +11266,7 @@ function isUnityAudioSampleRateSetting(value) {
11268
11266
  }
11269
11267
  var UNITY_TEXTURE_2D_OVERRIDE_PATHS, UNITY_AUDIO_CLIP_OVERRIDE_PATHS;
11270
11268
  var init_unity_import_settings = __esm({
11271
- "../src/models/unity/unity-import-settings.ts"() {
11269
+ "../packages/models/src/unity/unity-import-settings.ts"() {
11272
11270
  "use strict";
11273
11271
  init_core_types();
11274
11272
  init_structural_narrow();
@@ -11328,7 +11326,7 @@ var init_unity_import_settings = __esm({
11328
11326
  }
11329
11327
  });
11330
11328
 
11331
- // ../src/models/files/file-types.ts
11329
+ // ../packages/models/src/files/file-types.ts
11332
11330
  function isProjectFileType(value) {
11333
11331
  if (value === "image" /* Image */) return true;
11334
11332
  if (value === "audio" /* Audio */) return true;
@@ -11403,7 +11401,7 @@ function isSha256(value) {
11403
11401
  return isString(value) && /^[a-f0-9]{64}$/u.test(value);
11404
11402
  }
11405
11403
  var init_file_types = __esm({
11406
- "../src/models/files/file-types.ts"() {
11404
+ "../packages/models/src/files/file-types.ts"() {
11407
11405
  "use strict";
11408
11406
  init_core_types();
11409
11407
  init_structural_narrow();
@@ -11411,7 +11409,7 @@ var init_file_types = __esm({
11411
11409
  }
11412
11410
  });
11413
11411
 
11414
- // ../src/models/files/file-member-utils.ts
11412
+ // ../packages/models/src/files/file-member-utils.ts
11415
11413
  function resolveProjectFileTextureSettings(file, textureTemplates) {
11416
11414
  if (file.fileType !== "image" /* Image */) return null;
11417
11415
  const existing = file.unityTextureSettings;
@@ -11484,16 +11482,15 @@ function isPlainObject(value) {
11484
11482
  return !Array.isArray(value);
11485
11483
  }
11486
11484
  var init_file_member_utils = __esm({
11487
- "../src/models/files/file-member-utils.ts"() {
11485
+ "../packages/models/src/files/file-member-utils.ts"() {
11488
11486
  "use strict";
11489
11487
  init_unity_import_settings();
11490
- init_file_types();
11491
11488
  }
11492
11489
  });
11493
11490
 
11494
- // ../src/models/files/index.ts
11491
+ // ../packages/models/src/files/index.ts
11495
11492
  var init_files = __esm({
11496
- "../src/models/files/index.ts"() {
11493
+ "../packages/models/src/files/index.ts"() {
11497
11494
  "use strict";
11498
11495
  init_file_types();
11499
11496
  init_file_member_utils();
@@ -11512,7 +11509,7 @@ var init_pending_id = __esm({
11512
11509
  }
11513
11510
  });
11514
11511
 
11515
- // ../src/models/enum/enum-types.ts
11512
+ // ../packages/models/src/enum/enum-types.ts
11516
11513
  function isValidEnumOptionId(id2) {
11517
11514
  if (typeof id2 !== "string" || id2.length === 0) return false;
11518
11515
  return OPTION_ID_REGEX.test(withoutSystemRecordIdPrefix(id2));
@@ -11590,7 +11587,7 @@ function isProspectiveEnum(value) {
11590
11587
  }
11591
11588
  var OPTION_ID_REGEX;
11592
11589
  var init_enum_types = __esm({
11593
- "../src/models/enum/enum-types.ts"() {
11590
+ "../packages/models/src/enum/enum-types.ts"() {
11594
11591
  "use strict";
11595
11592
  init_pending_id();
11596
11593
  init_core_types();
@@ -11601,15 +11598,15 @@ var init_enum_types = __esm({
11601
11598
  }
11602
11599
  });
11603
11600
 
11604
- // ../src/models/enum/index.ts
11601
+ // ../packages/models/src/enum/index.ts
11605
11602
  var init_enum = __esm({
11606
- "../src/models/enum/index.ts"() {
11603
+ "../packages/models/src/enum/index.ts"() {
11607
11604
  "use strict";
11608
11605
  init_enum_types();
11609
11606
  }
11610
11607
  });
11611
11608
 
11612
- // ../src/models/members/stored-value-shape.ts
11609
+ // ../packages/models/src/members/stored-value-shape.ts
11613
11610
  function entersAnimationOverrideGraph(memberId) {
11614
11611
  return ANIMATION_OVERRIDE_GRAPH_MEMBER_IDS.has(memberId);
11615
11612
  }
@@ -11721,7 +11718,7 @@ function leafIssue(leaf, shape, value) {
11721
11718
  }
11722
11719
  var ANIMATION_OVERRIDE_GRAPH_MEMBER_IDS;
11723
11720
  var init_stored_value_shape = __esm({
11724
- "../src/models/members/stored-value-shape.ts"() {
11721
+ "../packages/models/src/members/stored-value-shape.ts"() {
11725
11722
  "use strict";
11726
11723
  init_world_system_classes();
11727
11724
  init_member_kinds();
@@ -11734,7 +11731,7 @@ var init_stored_value_shape = __esm({
11734
11731
  }
11735
11732
  });
11736
11733
 
11737
- // ../src/models/members/build-default-member-value.ts
11734
+ // ../packages/models/src/members/build-default-member-value.ts
11738
11735
  function descendPositionThroughMember(position, memberId) {
11739
11736
  if (position.insideAnimationOverrideGraph) return position;
11740
11737
  if (!entersAnimationOverrideGraph(memberId)) return position;
@@ -13056,7 +13053,7 @@ function validateAudioMemberValue(document, member, body) {
13056
13053
  }
13057
13054
  var DECLARATION_DEFAULT_POSITION, SPRITE_FILE_ID_KEY;
13058
13055
  var init_build_default_member_value = __esm({
13059
- "../src/models/members/build-default-member-value.ts"() {
13056
+ "../packages/models/src/members/build-default-member-value.ts"() {
13060
13057
  "use strict";
13061
13058
  init_member_value_id();
13062
13059
  init_member_change_listeners();
@@ -13081,16 +13078,14 @@ var init_build_default_member_value = __esm({
13081
13078
  }
13082
13079
  });
13083
13080
 
13084
- // ../src/models/members/enum-reference-sites.ts
13081
+ // ../packages/models/src/members/enum-reference-sites.ts
13085
13082
  var init_enum_reference_sites = __esm({
13086
- "../src/models/members/enum-reference-sites.ts"() {
13083
+ "../packages/models/src/members/enum-reference-sites.ts"() {
13087
13084
  "use strict";
13088
- init_inheritance();
13089
- init_member_kinds();
13090
13085
  }
13091
13086
  });
13092
13087
 
13093
- // ../src/models/members/effective-distribution.ts
13088
+ // ../packages/models/src/members/effective-distribution.ts
13094
13089
  function declaredMemberDistribution(memberId, members) {
13095
13090
  return walkExtendsMemberChain(memberId, members, (a) => {
13096
13091
  const distribution = a.distribution;
@@ -13120,7 +13115,7 @@ function effectiveMemberDistribution(member, members, env) {
13120
13115
  );
13121
13116
  }
13122
13117
  var init_effective_distribution = __esm({
13123
- "../src/models/members/effective-distribution.ts"() {
13118
+ "../packages/models/src/members/effective-distribution.ts"() {
13124
13119
  "use strict";
13125
13120
  init_member_kinds();
13126
13121
  init_member_subtree_distribution();
@@ -13129,7 +13124,7 @@ var init_effective_distribution = __esm({
13129
13124
  }
13130
13125
  });
13131
13126
 
13132
- // ../src/models/members/list-indexes.ts
13127
+ // ../packages/models/src/members/list-indexes.ts
13133
13128
  function validateListIndexDefinitions(ctx, listMember) {
13134
13129
  const errors = [];
13135
13130
  let list;
@@ -13410,11 +13405,10 @@ function dedupeErrors(errors) {
13410
13405
  });
13411
13406
  }
13412
13407
  var init_list_indexes = __esm({
13413
- "../src/models/members/list-indexes.ts"() {
13408
+ "../packages/models/src/members/list-indexes.ts"() {
13414
13409
  "use strict";
13415
13410
  init_member_kinds();
13416
13411
  init_effective_distribution();
13417
- init_member_subtree_distribution();
13418
13412
  init_structural_narrow();
13419
13413
  init_generics();
13420
13414
  init_inheritance();
@@ -13422,7 +13416,7 @@ var init_list_indexes = __esm({
13422
13416
  }
13423
13417
  });
13424
13418
 
13425
- // ../src/models/members/effective-storage.ts
13419
+ // ../packages/models/src/members/effective-storage.ts
13426
13420
  function declaredMemberStorage(memberId, members) {
13427
13421
  const declared = walkExtendsMemberChain(memberId, members, (a) => {
13428
13422
  const storage = a.storage;
@@ -13612,7 +13606,7 @@ function validateDocumentStorage(ctx) {
13612
13606
  }
13613
13607
  var EffectiveStorageResolver;
13614
13608
  var init_effective_storage = __esm({
13615
- "../src/models/members/effective-storage.ts"() {
13609
+ "../packages/models/src/members/effective-storage.ts"() {
13616
13610
  "use strict";
13617
13611
  init_member_storage();
13618
13612
  init_member_kinds();
@@ -13845,7 +13839,7 @@ var init_effective_storage = __esm({
13845
13839
  }
13846
13840
  });
13847
13841
 
13848
- // ../src/models/members/effective-member-docs.ts
13842
+ // ../packages/models/src/members/effective-member-docs.ts
13849
13843
  function effectiveMemberDocsText(memberId, membersById) {
13850
13844
  const visited = /* @__PURE__ */ new Set();
13851
13845
  let currentId = memberId;
@@ -13868,22 +13862,21 @@ function isMembersMap(value) {
13868
13862
  return value instanceof Map;
13869
13863
  }
13870
13864
  var init_effective_member_docs = __esm({
13871
- "../src/models/members/effective-member-docs.ts"() {
13865
+ "../packages/models/src/members/effective-member-docs.ts"() {
13872
13866
  "use strict";
13873
13867
  }
13874
13868
  });
13875
13869
 
13876
- // ../src/models/members/value-responses.ts
13870
+ // ../packages/models/src/members/value-responses.ts
13877
13871
  var init_value_responses = __esm({
13878
- "../src/models/members/value-responses.ts"() {
13872
+ "../packages/models/src/members/value-responses.ts"() {
13879
13873
  "use strict";
13880
- init_instance_provenance();
13881
13874
  }
13882
13875
  });
13883
13876
 
13884
- // ../src/models/members/index.ts
13877
+ // ../packages/models/src/members/index.ts
13885
13878
  var init_members = __esm({
13886
- "../src/models/members/index.ts"() {
13879
+ "../packages/models/src/members/index.ts"() {
13887
13880
  "use strict";
13888
13881
  init_member_storage();
13889
13882
  init_member_subtree_distribution();
@@ -13904,7 +13897,7 @@ var init_members = __esm({
13904
13897
  }
13905
13898
  });
13906
13899
 
13907
- // ../src/runtime/neoscript/debug.ts
13900
+ // ../packages/neoscript-runtime/src/neoscript/debug.ts
13908
13901
  function snapshotNeoScriptFrames(state) {
13909
13902
  const frames = state.frames.slice(-64).reverse().map((frame) => Object.freeze({ ...frame }));
13910
13903
  if (state.frames.length > 64)
@@ -13968,9 +13961,8 @@ function formatDebugFloat(value) {
13968
13961
  return `${sign}${digits.slice(0, point)}.${digits.slice(point)}`;
13969
13962
  }
13970
13963
  var init_debug = __esm({
13971
- "../src/runtime/neoscript/debug.ts"() {
13964
+ "../packages/neoscript-runtime/src/neoscript/debug.ts"() {
13972
13965
  "use strict";
13973
- init_members();
13974
13966
  }
13975
13967
  });
13976
13968
 
@@ -14047,6 +14039,30 @@ var init_source_text = __esm({
14047
14039
  });
14048
14040
 
14049
14041
  // ../packages/neoscript-language/src/lexer.ts
14042
+ function neoScriptLiteralContinuationLines(source) {
14043
+ const lines = /* @__PURE__ */ new Set();
14044
+ if (!source.includes("\n")) return lines;
14045
+ for (const token of lex(source).roots) {
14046
+ if (token.kind !== "string") continue;
14047
+ for (let line = token.range.start.line + 1; line <= token.range.end.line; line++)
14048
+ lines.add(line);
14049
+ }
14050
+ return lines;
14051
+ }
14052
+ function sameNeoScriptTokens(left, right, comments = "all") {
14053
+ if (left === right) return true;
14054
+ const a = lex(left);
14055
+ const b = lex(right);
14056
+ if (a.diagnostics.length > 0 || b.diagnostics.length > 0) return false;
14057
+ const significant = (token) => comments === "all" || token.kind !== "comment" || token.raw.startsWith("///") || token.raw.startsWith("/*");
14058
+ const spelling = (token) => token.kind === "comment" ? token.raw.trimEnd().split(/\r\n|\r|\n/u).map((line) => line.trim()).join("\n") : token.raw;
14059
+ const leftTokens = a.roots.filter(significant);
14060
+ const rightTokens = b.roots.filter(significant);
14061
+ return leftTokens.length === rightTokens.length && leftTokens.every((token, index) => {
14062
+ const other = rightTokens[index];
14063
+ return other !== void 0 && token.kind === other.kind && spelling(token) === spelling(other);
14064
+ });
14065
+ }
14050
14066
  function lex(sourceValue) {
14051
14067
  const source = new SourceText(sourceValue);
14052
14068
  const tokens = [];
@@ -20194,22 +20210,23 @@ var init_syntax = __esm({
20194
20210
  });
20195
20211
 
20196
20212
  // ../packages/neoscript-language/src/formatter.ts
20213
+ function neoScriptIndentUnit(options = {}) {
20214
+ return options.insertSpaces === false ? " " : " ".repeat(options.tabSize ?? DEFAULT_NEO_SCRIPT_FORMAT_OPTIONS.tabSize);
20215
+ }
20197
20216
  function formatNeoScript(text, options = {}) {
20198
- const tabSize = options.tabSize ?? 2;
20199
- const indentUnit = options.insertSpaces === false ? " " : " ".repeat(tabSize);
20217
+ const indentUnit = neoScriptIndentUnit(options);
20200
20218
  if (options.kind === "definition") text = hoistLocalValueIds(text);
20201
- const lines = text.replace(/\r\n/g, "\n").split("\n");
20202
- const normalizedText = lines.join("\n");
20219
+ const originalEndings = text.match(/\r\n|\r|\n/g) ?? [];
20220
+ const lines = text.split(/\r\n|\r|\n/);
20221
+ const normalizedText = text.replace(/\r(?!\n)/g, "\n");
20203
20222
  const syntax = analyzeNeoScriptSyntax(
20204
20223
  normalizedText,
20205
20224
  options.kind === "definition" ? "function" : options.kind ?? inferDocumentKind(text)
20206
20225
  );
20207
- const splitCatchText = splitSameLineCatchClauses(
20208
- normalizedText,
20209
- syntax.lexed.tokens
20210
- );
20211
- if (splitCatchText !== normalizedText)
20212
- return formatNeoScript(splitCatchText, options);
20226
+ const splitCatchText = splitSameLineCatchClauses(text, syntax.lexed.tokens);
20227
+ if (splitCatchText !== text) return formatNeoScript(splitCatchText, options);
20228
+ const literalContinuations = /* @__PURE__ */ new Set();
20229
+ const literalNewlines = /* @__PURE__ */ new Set();
20213
20230
  const delimiterTokensByLine = /* @__PURE__ */ new Map();
20214
20231
  const tokensByLine = /* @__PURE__ */ new Map();
20215
20232
  const lambdaBraceOffsets = /* @__PURE__ */ new Set();
@@ -20219,6 +20236,12 @@ function formatNeoScript(text, options = {}) {
20219
20236
  let annotationDepth = 0;
20220
20237
  let previousSignificantToken = null;
20221
20238
  for (const token of syntax.lexed.tokens) {
20239
+ if (token.kind === "string") {
20240
+ for (let line = token.range.start.line; line < token.range.end.line; line++) {
20241
+ literalNewlines.add(line);
20242
+ literalContinuations.add(line + 1);
20243
+ }
20244
+ }
20222
20245
  if (token.kind !== "comment" && token.kind !== "eof") {
20223
20246
  if (token.kind === "punctuation" && token.text === "{" && previousSignificantToken?.kind === "operator" && previousSignificantToken.text === "=>") {
20224
20247
  lambdaBraceOffsets.add(token.start);
@@ -20255,10 +20278,12 @@ function formatNeoScript(text, options = {}) {
20255
20278
  let preceding;
20256
20279
  for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
20257
20280
  const rawLine = lines[lineIndex] ?? "";
20258
- const trimmedEnd = rawLine.replace(/[ \t]+$/g, "");
20281
+ const trimmedEnd = options.trimTrailingWhitespace === false || literalNewlines.has(lineIndex) ? rawLine : rawLine.replace(/[ \t]+$/g, "");
20259
20282
  const content = trimmedEnd.trimStart();
20260
20283
  if (content.length === 0) {
20261
- formatted.push("");
20284
+ formatted.push(
20285
+ options.trimTrailingWhitespace === false || literalContinuations.has(lineIndex) || literalNewlines.has(lineIndex) ? rawLine : ""
20286
+ );
20262
20287
  continue;
20263
20288
  }
20264
20289
  const firstContentCharacter = trimmedEnd.length - content.length;
@@ -20283,8 +20308,10 @@ function formatNeoScript(text, options = {}) {
20283
20308
  if (leadingClosers.length === 0 && (first !== void 0 && continuationOperator(first) && preceding !== void 0 && canEndExpression(preceding) || preceding !== void 0 && continuationOperator(preceding)))
20284
20309
  continuations.add(leadingState.at(-1)?.openingOffset ?? -1);
20285
20310
  const lineDepth = depth + sectionDepth + continuations.size;
20286
- const normalized = normalizeControlHeaderSpacing(content);
20287
- formatted.push(`${indentUnit.repeat(lineDepth)}${normalized}`);
20311
+ const normalized = first?.range.start.character === firstContentCharacter ? normalizeControlHeaderSpacing(content) : content;
20312
+ formatted.push(
20313
+ literalContinuations.has(lineIndex) ? trimmedEnd : `${indentUnit.repeat(lineDepth)}${normalized}`
20314
+ );
20288
20315
  for (const token of lineTokens) {
20289
20316
  applyDelimiterToken(delimiters, token, lambdaBraceOffsets);
20290
20317
  }
@@ -20297,11 +20324,16 @@ function formatNeoScript(text, options = {}) {
20297
20324
  }
20298
20325
  }
20299
20326
  }
20300
- while (formatted.length > 1 && formatted[formatted.length - 1] === "") {
20327
+ while (formatted.length > 1 && formatted[formatted.length - 1] === "" && !literalContinuations.has(formatted.length - 1)) {
20301
20328
  formatted.pop();
20302
20329
  }
20303
- const newline = options.finalNewline === false ? "" : "\n";
20304
- return formatted.join("\n") + newline;
20330
+ const eol = options.endOfLine ?? DEFAULT_NEO_SCRIPT_FORMAT_OPTIONS.endOfLine;
20331
+ const newline = options.finalNewline === false ? "" : eol;
20332
+ return formatted.map((line, index) => {
20333
+ if (index === formatted.length - 1) return line;
20334
+ const ending = literalNewlines.has(index) ? originalEndings[index] ?? eol : eol;
20335
+ return line + ending;
20336
+ }).join("") + newline;
20305
20337
  }
20306
20338
  function formattingEdit(text, options) {
20307
20339
  const formatted = formatNeoScript(text, options);
@@ -20318,10 +20350,7 @@ function normalizeControlHeaderSpacing(content) {
20318
20350
  /^}\s*while\s*\(/,
20319
20351
  "} while ("
20320
20352
  );
20321
- const withCatchFilterSpace = withDoWhileSpace.replace(
20322
- /\)\s*when\s*\(/,
20323
- ") when ("
20324
- );
20353
+ const withCatchFilterSpace = withDoWhileSpace.startsWith("catch") ? withDoWhileSpace.replace(/\)\s*when\s*\(/, ") when (") : withDoWhileSpace;
20325
20354
  if (!withCatchFilterSpace.startsWith("foreach ("))
20326
20355
  return withCatchFilterSpace;
20327
20356
  return withCatchFilterSpace.replace(/\s+in\s+/, " in ");
@@ -20575,6 +20604,7 @@ ${text.slice(start, valueStart).trimEnd()} `
20575
20604
  function canEndExpression(token) {
20576
20605
  return token.kind === "identifier" || token.kind === "integer" || token.kind === "float" || token.kind === "string" || [")", "]", "}", "true", "false", "null"].includes(token.text);
20577
20606
  }
20607
+ var DEFAULT_NEO_SCRIPT_FORMAT_OPTIONS;
20578
20608
  var init_formatter = __esm({
20579
20609
  "../packages/neoscript-language/src/formatter.ts"() {
20580
20610
  "use strict";
@@ -20583,6 +20613,12 @@ var init_formatter = __esm({
20583
20613
  init_executable_parser();
20584
20614
  init_source_text();
20585
20615
  init_syntax();
20616
+ DEFAULT_NEO_SCRIPT_FORMAT_OPTIONS = {
20617
+ tabSize: 2,
20618
+ insertSpaces: true,
20619
+ finalNewline: true,
20620
+ endOfLine: "\n"
20621
+ };
20586
20622
  }
20587
20623
  });
20588
20624
 
@@ -22838,7 +22874,6 @@ function visitPointerPatternBindings(pointer, visit) {
22838
22874
  var init_neoscript_pattern_bindings = __esm({
22839
22875
  "../src/models/neoscript/neoscript-pattern-bindings.ts"() {
22840
22876
  "use strict";
22841
- init_neoscript_types();
22842
22877
  }
22843
22878
  });
22844
22879
 
@@ -22895,7 +22930,7 @@ var init_cell_pattern = __esm({
22895
22930
  }
22896
22931
  });
22897
22932
 
22898
- // ../src/models/variants/variant-member.ts
22933
+ // ../packages/models/src/variants/variant-member.ts
22899
22934
  function neoVariantSystemClass(classes, lookup = false) {
22900
22935
  const declared = classes.find(
22901
22936
  (item) => item.system?.worldKind === (lookup ? NeoWorldSystemClassKind.LookupVariant : NeoWorldSystemClassKind.Variant)
@@ -22935,15 +22970,14 @@ function variantMemberDeclaredTypeInfo(member, systemClass) {
22935
22970
  };
22936
22971
  }
22937
22972
  var init_variant_member = __esm({
22938
- "../src/models/variants/variant-member.ts"() {
22973
+ "../packages/models/src/variants/variant-member.ts"() {
22939
22974
  "use strict";
22940
22975
  init_core_types();
22941
- init_member_kind_enum();
22942
22976
  init_member_kinds();
22943
22977
  }
22944
22978
  });
22945
22979
 
22946
- // ../src/models/interfaces/interface-graph.ts
22980
+ // ../packages/models/src/interfaces/interface-graph.ts
22947
22981
  function resolveInterfaceClosure(interfaceId, interfaces) {
22948
22982
  const byId = new Map(
22949
22983
  interfaces.map((neoInterface) => [neoInterface.id, neoInterface])
@@ -22996,7 +23030,7 @@ function classImplementsInterface(classId, interfaceId, classes, interfaces) {
22996
23030
  }
22997
23031
  var CircularInterfaceExtensionError;
22998
23032
  var init_interface_graph = __esm({
22999
- "../src/models/interfaces/interface-graph.ts"() {
23033
+ "../packages/models/src/interfaces/interface-graph.ts"() {
23000
23034
  "use strict";
23001
23035
  init_inheritance();
23002
23036
  CircularInterfaceExtensionError = class extends Error {
@@ -23014,7 +23048,7 @@ var init_interface_graph = __esm({
23014
23048
  }
23015
23049
  });
23016
23050
 
23017
- // ../src/models/neoscript/type-info-compatibility.ts
23051
+ // ../packages/models/src/neoscript/type-info-compatibility.ts
23018
23052
  function isTypeInfoAssignable(from, to, context) {
23019
23053
  if (to.type === NS_TYPE_UNKNOWN) return true;
23020
23054
  if (from.type === NS_TYPE_UNKNOWN) return false;
@@ -23051,9 +23085,8 @@ function isTypeInfoAssignable(from, to, context) {
23051
23085
  return typeInfosInvariantlyEqual(normalizedFrom, to);
23052
23086
  }
23053
23087
  var init_type_info_compatibility = __esm({
23054
- "../src/models/neoscript/type-info-compatibility.ts"() {
23088
+ "../packages/models/src/neoscript/type-info-compatibility.ts"() {
23055
23089
  "use strict";
23056
- init_member_kind_enum();
23057
23090
  init_type_info_equality();
23058
23091
  init_inheritance();
23059
23092
  init_interface_graph();
@@ -23061,9 +23094,9 @@ var init_type_info_compatibility = __esm({
23061
23094
  }
23062
23095
  });
23063
23096
 
23064
- // ../src/models/neoscript/index.ts
23097
+ // ../packages/models/src/neoscript/index.ts
23065
23098
  var init_neoscript = __esm({
23066
- "../src/models/neoscript/index.ts"() {
23099
+ "../packages/models/src/neoscript/index.ts"() {
23067
23100
  "use strict";
23068
23101
  init_neoscript_types();
23069
23102
  init_neoscript_guards();
@@ -25486,7 +25519,7 @@ var init_unity_member_signatures = __esm({
25486
25519
  }
25487
25520
  });
25488
25521
 
25489
- // ../src/models/project/project-types.ts
25522
+ // ../packages/models/src/project/project-types.ts
25490
25523
  function isProject(value) {
25491
25524
  const v = value;
25492
25525
  return typeof v?.name === "string" && typeof v?.id === "string" && isProjectOwner(v.owner) && isActorIdentifier(v.author) && typeof v?.createdAt === "number" && typeof v?.updatedAt === "number" && typeof v?.rootAssetsMemberId === "string" && typeof v?.rootSaveFileMemberId === "string" && typeof v?.rootSessionMemberId === "string" && typeof v?.rootUserMemberId === "string" && isOptionalNullableString2(v.defaultPriorityGroupId) && isOptionalNullableString2(v.defaultTextureTemplateId) && isOptionalNullableString2(v.defaultAudioClipTemplateId) && isProjectExportSettingsOrEmpty(v.exportSettings);
@@ -25515,13 +25548,13 @@ function isUnityExportSettingsOrEmpty(value) {
25515
25548
  return (namespaceValue === void 0 || namespaceValue === null || typeof namespaceValue === "string") && (singletonValue === void 0 || singletonValue === null || typeof singletonValue === "boolean");
25516
25549
  }
25517
25550
  var init_project_types = __esm({
25518
- "../src/models/project/project-types.ts"() {
25551
+ "../packages/models/src/project/project-types.ts"() {
25519
25552
  "use strict";
25520
25553
  init_auth_ownership_types();
25521
25554
  }
25522
25555
  });
25523
25556
 
25524
- // ../src/models/project/project-version-types.ts
25557
+ // ../packages/models/src/project/project-version-types.ts
25525
25558
  function isProjectVersionBumpKind(value) {
25526
25559
  if (value === ProjectVersionBumpKind.Patch) return true;
25527
25560
  if (value === ProjectVersionBumpKind.Minor) return true;
@@ -25754,10 +25787,9 @@ function isStringArray(value) {
25754
25787
  }
25755
25788
  var ProjectVersionBumpKind, ProjectRecordKind, ProjectVersionTransactionOperation, ProjectVersionRecordOperation;
25756
25789
  var init_project_version_types = __esm({
25757
- "../src/models/project/project-version-types.ts"() {
25790
+ "../packages/models/src/project/project-version-types.ts"() {
25758
25791
  "use strict";
25759
25792
  init_core_types();
25760
- init_auth_ownership_types();
25761
25793
  init_structural_narrow();
25762
25794
  ProjectVersionBumpKind = {
25763
25795
  Patch: "patch",
@@ -25810,7 +25842,7 @@ var init_project_version_types = __esm({
25810
25842
  }
25811
25843
  });
25812
25844
 
25813
- // ../src/models/project/project-migration-types.ts
25845
+ // ../packages/models/src/project/project-migration-types.ts
25814
25846
  function isProjectMigration(value) {
25815
25847
  if (typeof value !== "object" || value === null) return false;
25816
25848
  const migration = value;
@@ -25829,13 +25861,13 @@ function isProjectMigration(value) {
25829
25861
  return isNumber(migration.updatedAt);
25830
25862
  }
25831
25863
  var init_project_migration_types = __esm({
25832
- "../src/models/project/project-migration-types.ts"() {
25864
+ "../packages/models/src/project/project-migration-types.ts"() {
25833
25865
  "use strict";
25834
25866
  init_structural_narrow();
25835
25867
  }
25836
25868
  });
25837
25869
 
25838
- // ../src/models/project/internal-record-relations.ts
25870
+ // ../packages/models/src/project/internal-record-relations.ts
25839
25871
  function collectProjectDocumentRelationEndpoints(document) {
25840
25872
  const result = [
25841
25873
  ...optionalEndpoint("project", document.project),
@@ -26415,7 +26447,7 @@ function optionalEndpoint(recordKind, record7) {
26415
26447
  }
26416
26448
  var InternalRecordRelationKind, INTERNAL_RECORD_RELATION_KIND_CONTRACTS;
26417
26449
  var init_internal_record_relations = __esm({
26418
- "../src/models/project/internal-record-relations.ts"() {
26450
+ "../packages/models/src/project/internal-record-relations.ts"() {
26419
26451
  "use strict";
26420
26452
  init_collections();
26421
26453
  init_classes();
@@ -26534,24 +26566,23 @@ var init_internal_record_relations = __esm({
26534
26566
  }
26535
26567
  });
26536
26568
 
26537
- // ../src/models/project/internal-record-relation-head-projection.ts
26569
+ // ../packages/models/src/project/internal-record-relation-head-projection.ts
26538
26570
  var init_internal_record_relation_head_projection = __esm({
26539
- "../src/models/project/internal-record-relation-head-projection.ts"() {
26571
+ "../packages/models/src/project/internal-record-relation-head-projection.ts"() {
26540
26572
  "use strict";
26541
- init_project_version_types();
26542
26573
  }
26543
26574
  });
26544
26575
 
26545
- // ../src/models/project/initial-class-internal-record-relation.ts
26576
+ // ../packages/models/src/project/initial-class-internal-record-relation.ts
26546
26577
  var init_initial_class_internal_record_relation = __esm({
26547
- "../src/models/project/initial-class-internal-record-relation.ts"() {
26578
+ "../packages/models/src/project/initial-class-internal-record-relation.ts"() {
26548
26579
  "use strict";
26549
26580
  }
26550
26581
  });
26551
26582
 
26552
- // ../src/models/project/index.ts
26583
+ // ../packages/models/src/project/index.ts
26553
26584
  var init_project = __esm({
26554
- "../src/models/project/index.ts"() {
26585
+ "../packages/models/src/project/index.ts"() {
26555
26586
  "use strict";
26556
26587
  init_project_types();
26557
26588
  init_project_schema_index();
@@ -27017,7 +27048,6 @@ var init_schema_source_validation = __esm({
27017
27048
  init_project_document_inheritance_validation();
27018
27049
  init_member_access_modifier_validation();
27019
27050
  init_list_indexes();
27020
- init_member_kinds();
27021
27051
  init_project();
27022
27052
  init_source_diagnostics();
27023
27053
  init_lower_support();
@@ -30812,7 +30842,7 @@ function intersectCollectionWritability(left, right) {
30812
30842
  const writable = (value) => value === "local" /* Local */ || value === "save" /* Save */ || value === "session" /* Session */ || value === "runtime" /* Runtime */;
30813
30843
  return writable(left) && writable(right) ? "runtime" /* Runtime */ : "readOnly" /* ReadOnly */;
30814
30844
  }
30815
- var CONSTRUCTING_FUNCTION_KINDS, VARIANT_INITIALIZE_NAME, VARIANT_APPLY_NAME, MATH_NAMESPACE_NAME, MATH_FUNCTIONS, MATH_CONSTANTS, LIST_STATIC_FUNCTIONS, WRITE_TARGET_DESCRIPTIONS, FALLTHROUGH_LABELS, Scope, UnresolvedPersistedListenerReference, StrictNeoScriptResolver, SPRITE_DERIVED_MEMBERS;
30845
+ var CONSTRUCTING_FUNCTION_KINDS, VARIANT_INITIALIZE_NAME, VARIANT_APPLY_NAME, MATH_NAMESPACE_NAME, MATH_FUNCTIONS, MATH_CONSTANTS, LIST_STATIC_FUNCTIONS, WRITE_TARGET_DESCRIPTIONS, ON_CHANGED_OPERATIONS_ERROR, FALLTHROUGH_LABELS, Scope, UnresolvedPersistedListenerReference, StrictNeoScriptResolver, SPRITE_DERIVED_MEMBERS;
30816
30846
  var init_strict_resolver = __esm({
30817
30847
  "../packages/neoscript-language/src/strict-resolver.ts"() {
30818
30848
  "use strict";
@@ -30873,6 +30903,7 @@ var init_strict_resolver = __esm({
30873
30903
  projectValue: "a stored project value",
30874
30904
  unknown: "something other than `this` or a local"
30875
30905
  };
30906
+ ON_CHANGED_OPERATIONS_ERROR = "OnChanged supports only '+=', '-=', and Clear().";
30876
30907
  FALLTHROUGH_LABELS = {
30877
30908
  function: "NSFunction",
30878
30909
  getter: "getter",
@@ -32215,6 +32246,12 @@ var init_strict_resolver = __esm({
32215
32246
  this.resolveExpression(statement.expr, scope);
32216
32247
  const debug = this.resolveDebugStatement(statement.expr, scope);
32217
32248
  if (debug) return debug;
32249
+ const listenerClear = this.resolveChangeListenerClear(
32250
+ statement.expr,
32251
+ scope,
32252
+ statement.pos
32253
+ );
32254
+ if (listenerClear) return listenerClear;
32218
32255
  const actionClear = this.resolveActionClear(
32219
32256
  statement.expr,
32220
32257
  scope,
@@ -32575,8 +32612,20 @@ var init_strict_resolver = __esm({
32575
32612
  const observed = this.resolveExpression(statement.target.receiver, scope);
32576
32613
  const observedType = neoScriptMemberLookupType(observed.type);
32577
32614
  const declared = observedType.kind === "named" && this.project.typeById.get(observedType.typeId)?.members.some((member) => member.name === "OnChanged");
32578
- if (!declared)
32579
- return this.resolveChangeSubscription(statement, observed, scope);
32615
+ if (!declared) {
32616
+ if (statement.op !== "+=" && statement.op !== "-=")
32617
+ throw new CompileError(ON_CHANGED_OPERATIONS_ERROR, statement.pos);
32618
+ return this.resolveChangeListener(
32619
+ statement.target,
32620
+ observed,
32621
+ scope,
32622
+ statement.pos,
32623
+ {
32624
+ kind: statement.op === "+=" ? "addChangeListener" /* AddChangeListener */ : "removeChangeListener" /* RemoveChangeListener */,
32625
+ handler: statement.value
32626
+ }
32627
+ );
32628
+ }
32580
32629
  }
32581
32630
  const local = statement.target.kind === "ident" ? scope.lookup(statement.target.name) : null;
32582
32631
  if (local?.readonlyBinding) {
@@ -32760,158 +32809,142 @@ var init_strict_resolver = __esm({
32760
32809
  pos
32761
32810
  );
32762
32811
  }
32763
- resolveChangeSubscription(statement, observed, scope) {
32764
- if (statement.op !== "+=" && statement.op !== "-=") {
32765
- throw new CompileError(
32766
- "OnChanged supports only '+=' and '-=' subscriptions.",
32767
- statement.pos
32768
- );
32769
- }
32770
- if (statement.target.kind !== "member") {
32812
+ /** `X.M.OnChanged.Clear()` empties M's listener set on X (P70, P106). */
32813
+ resolveChangeListenerClear(expression, scope, pos) {
32814
+ if (expression.kind !== "call" || expression.callee.kind !== "member" || expression.callee.name !== "Clear" || expression.callee.receiver.kind !== "member" || expression.callee.receiver.name !== "OnChanged")
32815
+ return null;
32816
+ const onChanged = expression.callee.receiver;
32817
+ const observed = this.resolveExpression(onChanged.receiver, scope);
32818
+ const observedType = neoScriptMemberLookupType(observed.type);
32819
+ if (observedType.kind === "named" && this.project.typeById.get(observedType.typeId)?.members.some((member) => member.name === "OnChanged"))
32820
+ return null;
32821
+ if (expression.callee.optional)
32771
32822
  throw new CompileError(
32772
- "OnChanged requires a declared member slot.",
32773
- statement.pos
32823
+ "OnChanged is never null, so optional-chained Clear is not supported.",
32824
+ pos
32774
32825
  );
32775
- }
32776
- if (statement.target.optional) {
32826
+ requireArgCount("Clear", expression.args, 0, pos);
32827
+ return this.resolveChangeListener(onChanged, observed, scope, pos, {
32828
+ kind: "clearChangeListeners" /* ClearChangeListeners */
32829
+ });
32830
+ }
32831
+ resolveChangeListener(onChanged, observed, scope, pos, edit) {
32832
+ if (onChanged.optional) {
32777
32833
  throw new CompileError(
32778
32834
  "OnChanged cannot use an optional subscription target.",
32779
- statement.pos
32835
+ pos
32780
32836
  );
32781
32837
  }
32782
32838
  if (observed.optionalChainType !== void 0) {
32783
32839
  throw new CompileError(
32784
32840
  "OnChanged cannot subscribe through optional chaining; narrow the receiver first.",
32785
- statement.pos
32841
+ pos
32786
32842
  );
32787
32843
  }
32788
32844
  const member = observed.symbol;
32789
32845
  if (!member)
32790
32846
  throw new CompileError(
32791
32847
  "OnChanged requires a declared member, not a local variable.",
32792
- statement.pos
32848
+ pos
32793
32849
  );
32794
32850
  if (observed.pointer.type === "staticMember" /* StaticMember */ || observed.pointer.type === "callGetter" /* CallGetter */ && observed.pointer.receiver.kind === "static") {
32795
- const access = statement.target.receiver;
32851
+ const access = onChanged.receiver;
32796
32852
  const name = access.kind === "member" && access.receiver.kind === "ident" ? `${access.receiver.name}.${member.name}` : member.name;
32797
32853
  throw new CompileError(
32798
32854
  `OnChanged requires an instance member. '${name}' is static.`,
32799
- statement.pos
32855
+ pos
32800
32856
  );
32801
32857
  }
32802
32858
  if (observed.pointer.type === "callGetter" /* CallGetter */)
32803
- return this.resolveGetterSubscription(
32804
- statement,
32805
- statement.target.receiver,
32859
+ return this.resolveGetterChangeListener(
32860
+ onChanged.receiver,
32806
32861
  observed,
32807
32862
  observed.pointer,
32808
32863
  member,
32809
- scope
32864
+ scope,
32865
+ pos,
32866
+ edit
32810
32867
  );
32811
32868
  if (observed.pointer.type !== "keyOf" /* KeyOf */)
32812
- throw new CompileError(
32813
- "OnChanged requires a declared member slot.",
32814
- statement.pos
32815
- );
32869
+ throw new CompileError("OnChanged requires a declared member slot.", pos);
32816
32870
  if (!observed.pointer.memberId)
32817
32871
  throw new CompileError(
32818
32872
  "OnChanged cannot observe a collection entry.",
32819
- statement.pos
32873
+ pos
32820
32874
  );
32821
32875
  if (member.computed) {
32822
32876
  throw new CompileError(
32823
32877
  "OnChanged cannot observe a computed member.",
32824
- statement.pos
32878
+ pos
32825
32879
  );
32826
32880
  }
32827
32881
  if (member.readonlyDeclaration) {
32828
32882
  throw new CompileError(
32829
32883
  "OnChanged cannot observe a readonly declaration.",
32830
- statement.pos
32884
+ pos
32831
32885
  );
32832
32886
  }
32833
32887
  if (observed.type.kind === "delegate" || observed.type.kind === "action") {
32834
32888
  throw new CompileError(
32835
32889
  "OnChanged cannot observe a callable member.",
32836
- statement.pos
32890
+ pos
32837
32891
  );
32838
32892
  }
32839
32893
  const writability = observed.userData ? "runtime" /* Runtime */ : observed.writability;
32840
32894
  if (writability !== "save" /* Save */ && writability !== "session" /* Session */ && writability !== "runtime" /* Runtime */ && writability !== "local" /* Local */) {
32841
32895
  throw new CompileError(
32842
32896
  "OnChanged requires a member whose storage is writable at gameplay runtime.",
32843
- statement.pos
32897
+ pos
32844
32898
  );
32845
32899
  }
32846
32900
  this.validateConstructorWriteTarget(
32847
32901
  observed.pointer,
32848
- "subscribe to",
32849
- statement.pos,
32902
+ edit.kind === "clearChangeListeners" /* ClearChangeListeners */ ? "clear listeners on" : "subscribe to",
32903
+ pos,
32850
32904
  scope,
32851
32905
  false
32852
32906
  );
32853
- if (!statement.value) {
32854
- throw new CompileError(
32855
- "OnChanged subscription requires a handler member.",
32856
- statement.pos
32857
- );
32858
- }
32859
32907
  const storageType = this.assignmentStorageType(
32860
- statement.target.receiver,
32908
+ onChanged.receiver,
32861
32909
  observed,
32862
32910
  null,
32863
32911
  scope
32864
32912
  );
32865
- const expected = {
32866
- kind: "action",
32867
- parameterTypes: [storageType]
32868
- };
32869
- const listener = this.resolveActionListener(
32870
- statement.value,
32871
- expected,
32872
- scope,
32873
- true,
32874
- true
32875
- );
32876
- return {
32877
- type: statement.op === "+=" ? "addChangeListener" /* AddChangeListener */ : "removeChangeListener" /* RemoveChangeListener */,
32878
- target: {
32913
+ return this.changeListenerInstruction(
32914
+ edit,
32915
+ {
32879
32916
  owner: observed.pointer.keyOf.pointer,
32880
32917
  memberId: member.canonicalMemberId ?? observed.pointer.memberId,
32881
32918
  typeInfo: toWireType(storageType, this.project),
32882
32919
  writability
32883
32920
  },
32884
- listener
32885
- };
32921
+ storageType,
32922
+ scope,
32923
+ pos
32924
+ );
32886
32925
  }
32887
32926
  /**
32888
32927
  * P106. A getter subscription lives only in the running client's memory:
32889
32928
  * nothing persists it, so construction replay would silently drop one.
32890
32929
  */
32891
- resolveGetterSubscription(statement, getterRead, observed, pointer, member, scope) {
32930
+ resolveGetterChangeListener(getterRead, observed, pointer, member, scope, pos, edit) {
32892
32931
  if (pointer.dispatch === "base") {
32893
32932
  throw new CompileError(
32894
32933
  `OnChanged can't observe a base getter. Subscribe to '${member.name}' on the instance.`,
32895
- statement.pos
32934
+ pos
32896
32935
  );
32897
32936
  }
32898
32937
  if (pointer.receiver.kind !== "instance") {
32899
32938
  throw new CompileError(
32900
32939
  `OnChanged requires an instance receiver for getter '${member.name}'.`,
32901
- statement.pos
32940
+ pos
32902
32941
  );
32903
32942
  }
32904
32943
  const kind = this.context.kind;
32905
32944
  if (isNeoScriptConstructionDocumentKind(kind) || kind === "migration") {
32906
32945
  throw new CompileError(
32907
- `A getter subscription lives only for the play session, so ${dialogueBodyKindLabel(kind)} can't make one. Subscribe from a function.`,
32908
- statement.pos
32909
- );
32910
- }
32911
- if (!statement.value) {
32912
- throw new CompileError(
32913
- "OnChanged subscription requires a handler member.",
32914
- statement.pos
32946
+ edit.kind === "clearChangeListeners" /* ClearChangeListeners */ ? `A getter subscription lives only for the play session, so ${dialogueBodyKindLabel(kind)} can't clear one. Clear from a function.` : `A getter subscription lives only for the play session, so ${dialogueBodyKindLabel(kind)} can't make one. Subscribe from a function.`,
32947
+ pos
32915
32948
  );
32916
32949
  }
32917
32950
  const getterType = this.assignmentStorageType(
@@ -32920,23 +32953,36 @@ var init_strict_resolver = __esm({
32920
32953
  null,
32921
32954
  scope
32922
32955
  );
32923
- const listener = this.resolveActionListener(
32924
- statement.value,
32925
- { kind: "action", parameterTypes: [getterType] },
32926
- scope,
32927
- true,
32928
- true
32929
- );
32930
- return {
32931
- type: statement.op === "+=" ? "addChangeListener" /* AddChangeListener */ : "removeChangeListener" /* RemoveChangeListener */,
32932
- target: {
32956
+ return this.changeListenerInstruction(
32957
+ edit,
32958
+ {
32933
32959
  owner: pointer.receiver.pointer,
32934
32960
  memberId: member.canonicalMemberId ?? pointer.memberId,
32935
32961
  typeInfo: toWireType(getterType, this.project),
32936
32962
  writability: "session" /* Session */
32937
32963
  },
32938
- listener
32939
- };
32964
+ getterType,
32965
+ scope,
32966
+ pos
32967
+ );
32968
+ }
32969
+ changeListenerInstruction(edit, target, observedType, scope, pos) {
32970
+ if (edit.kind === "clearChangeListeners" /* ClearChangeListeners */)
32971
+ return { type: edit.kind, target };
32972
+ if (!edit.handler) {
32973
+ throw new CompileError(
32974
+ "OnChanged subscription requires a handler member.",
32975
+ pos
32976
+ );
32977
+ }
32978
+ const listener = this.resolveActionListener(
32979
+ edit.handler,
32980
+ { kind: "action", parameterTypes: [observedType] },
32981
+ scope,
32982
+ true,
32983
+ true
32984
+ );
32985
+ return { type: edit.kind, target, listener };
32940
32986
  }
32941
32987
  /**
32942
32988
  * P62 §3.2. `+=` / `-=` on an NSAction member are subscription operators,
@@ -35054,6 +35100,8 @@ var init_strict_resolver = __esm({
35054
35100
  entryUserData
35055
35101
  };
35056
35102
  }
35103
+ if (name === "OnChanged")
35104
+ throw new CompileError(ON_CHANGED_OPERATIONS_ERROR, pos);
35057
35105
  throw new CompileError(
35058
35106
  `Cannot read member '${name}' on ${this.describe(receiver.type)}`,
35059
35107
  pos
@@ -41334,7 +41382,7 @@ var init_project_source_construction_diagnostics = __esm({
41334
41382
  "ambiguous-constructor-call": "error",
41335
41383
  /**
41336
41384
  * P65 §1.3. A defaulted parameter declared before a non-defaulted one.
41337
- * The code string is shared with `src/models/neoscript/parameter-defaults.ts`
41385
+ * The code string is shared with `packages/models/src/neoscript/parameter-defaults.ts`
41338
41386
  * so the push guards and the compiler name one rule identically.
41339
41387
  */
41340
41388
  "default-before-required-parameter": "error",
@@ -51773,7 +51821,7 @@ var init_registry = __esm({
51773
51821
  "../packages/manifest/schema-contract/registry.mjs"() {
51774
51822
  "use strict";
51775
51823
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
51776
- cliVersion: "0.74.0",
51824
+ cliVersion: "0.75.1",
51777
51825
  projectFileUploadBatchSize: 32,
51778
51826
  documentRecords: {
51779
51827
  member: {
@@ -53563,18 +53611,18 @@ var init_migration_files = __esm({
53563
53611
  }
53564
53612
  });
53565
53613
 
53566
- // ../src/models/dialogue/dialogue-source-identifiers.ts
53614
+ // ../packages/models/src/dialogue/dialogue-source-identifiers.ts
53567
53615
  function isDialogueSourceIdentifier(value) {
53568
53616
  return isValidProjectSourceIdentifier(value);
53569
53617
  }
53570
53618
  var init_dialogue_source_identifiers = __esm({
53571
- "../src/models/dialogue/dialogue-source-identifiers.ts"() {
53619
+ "../packages/models/src/dialogue/dialogue-source-identifiers.ts"() {
53572
53620
  "use strict";
53573
53621
  init_project_source_identifiers2();
53574
53622
  }
53575
53623
  });
53576
53624
 
53577
- // ../src/models/dialogue/dialogue-source-names.ts
53625
+ // ../packages/models/src/dialogue/dialogue-source-names.ts
53578
53626
  function dialogueSourceNameFromDisplayName(displayName, fallback) {
53579
53627
  const preferred = sourceNameTokens(displayName ?? "");
53580
53628
  const fallbackTokens = sourceNameTokens(fallback);
@@ -53602,7 +53650,7 @@ function inferredDialogueDisplayName(sourceName, kind) {
53602
53650
  }
53603
53651
  var DialogueSourceNameAllocator;
53604
53652
  var init_dialogue_source_names = __esm({
53605
- "../src/models/dialogue/dialogue-source-names.ts"() {
53653
+ "../packages/models/src/dialogue/dialogue-source-names.ts"() {
53606
53654
  "use strict";
53607
53655
  init_dialogue_source_identifiers();
53608
53656
  DialogueSourceNameAllocator = class {
@@ -55152,6 +55200,7 @@ function safeParse(schema, input, config$1) {
55152
55200
  var store$4, DEFAULT_CONFIG, store$3, store$2, store$1, EMOJI_REGEX, ABORT_EARLY_CONFIG;
55153
55201
  var init_dist = __esm({
55154
55202
  "../node_modules/valibot/dist/index.mjs"() {
55203
+ "use strict";
55155
55204
  DEFAULT_CONFIG = {
55156
55205
  lang: void 0,
55157
55206
  message: void 0,
@@ -55976,6 +56025,7 @@ function parse2(schema, input, config$1) {
55976
56025
  var store$42, DEFAULT_CONFIG2, ValiError, EMOJI_REGEX2;
55977
56026
  var init_dist2 = __esm({
55978
56027
  "node_modules/valibot/dist/index.mjs"() {
56028
+ "use strict";
55979
56029
  DEFAULT_CONFIG2 = {
55980
56030
  lang: void 0,
55981
56031
  message: void 0,
@@ -61278,7 +61328,7 @@ var init_projection = __esm({
61278
61328
  }
61279
61329
  });
61280
61330
 
61281
- // ../src/models/classes/constructor-parameter-settlement.ts
61331
+ // ../packages/models/src/classes/constructor-parameter-settlement.ts
61282
61332
  function createConstructorSettlementResolver(view) {
61283
61333
  const classesById = new Map(
61284
61334
  view.classes.map((schemaClass2) => [schemaClass2.id, schemaClass2])
@@ -61411,12 +61461,12 @@ function asRecord(value) {
61411
61461
  return value;
61412
61462
  }
61413
61463
  var init_constructor_parameter_settlement = __esm({
61414
- "../src/models/classes/constructor-parameter-settlement.ts"() {
61464
+ "../packages/models/src/classes/constructor-parameter-settlement.ts"() {
61415
61465
  "use strict";
61416
61466
  }
61417
61467
  });
61418
61468
 
61419
- // ../src/models/dialogue/dialogue-group-types.ts
61469
+ // ../packages/models/src/dialogue/dialogue-group-types.ts
61420
61470
  function isOptionalNullableString3(value) {
61421
61471
  if (value === void 0) return true;
61422
61472
  if (value === null) return true;
@@ -61464,14 +61514,14 @@ function isAnyDialogueGroup(value) {
61464
61514
  return isStandardDialogueGroupBase(value) || isLookupDialogueGroupBase(value) || isFolderDialogueGroupBase(value);
61465
61515
  }
61466
61516
  var init_dialogue_group_types = __esm({
61467
- "../src/models/dialogue/dialogue-group-types.ts"() {
61517
+ "../packages/models/src/dialogue/dialogue-group-types.ts"() {
61468
61518
  "use strict";
61469
61519
  init_core_types();
61470
61520
  init_logic_types();
61471
61521
  }
61472
61522
  });
61473
61523
 
61474
- // ../src/models/dialogue/logic-types.ts
61524
+ // ../packages/models/src/dialogue/logic-types.ts
61475
61525
  function isNSBoolGetter2(value) {
61476
61526
  if (!isNSGetter(value)) return false;
61477
61527
  if (value.typeInfo.type !== 1 /* Bool */) return false;
@@ -61655,12 +61705,9 @@ function isDialogueGroupType2(value) {
61655
61705
  return value === 0 /* Standard */ || value === 1 /* Lookup */ || value === 2 /* Folder */;
61656
61706
  }
61657
61707
  var init_logic_types = __esm({
61658
- "../src/models/dialogue/logic-types.ts"() {
61708
+ "../packages/models/src/dialogue/logic-types.ts"() {
61659
61709
  "use strict";
61660
- init_member_kind_enum();
61661
61710
  init_neoscript_guards();
61662
- init_neoscript_types();
61663
- init_dialogue_group_types();
61664
61711
  init_dialogue_source_identifiers();
61665
61712
  }
61666
61713
  });
@@ -61912,8 +61959,6 @@ function asRecord2(value) {
61912
61959
  var init_neo_script_derived_bodies = __esm({
61913
61960
  "../src/database/neo-script-derived-bodies.ts"() {
61914
61961
  "use strict";
61915
- init_members();
61916
- init_logic_types();
61917
61962
  init_strict_ir();
61918
61963
  init_packed_value_encoding();
61919
61964
  }
@@ -62151,7 +62196,6 @@ var init_reference_target_types = __esm({
62151
62196
  init_project2();
62152
62197
  init_codecs();
62153
62198
  init_document_adapters();
62154
- init_members();
62155
62199
  init_projection();
62156
62200
  init_value_comparison();
62157
62201
  init_stored_value_placements();
@@ -62428,7 +62472,7 @@ var init_reference_target_types = __esm({
62428
62472
  }
62429
62473
  });
62430
62474
 
62431
- // ../src/models/localization/localization-types.ts
62475
+ // ../packages/models/src/localization/localization-types.ts
62432
62476
  function memberValueLocalizedTextLink(valueId) {
62433
62477
  return {
62434
62478
  kind: "member-value",
@@ -62769,7 +62813,7 @@ function isNullableStringArray(value) {
62769
62813
  }
62770
62814
  var PROJECT_LOCALIZATION_CONFIG_ID, DEFAULT_PROJECT_LOCALE, DEFAULT_LOCALIZATION_STATUS_IDS, DEFAULT_LOCALIZATION_STATUS_SLUGS, LOCALIZED_TEXT_LINK_KINDS;
62771
62815
  var init_localization_types = __esm({
62772
- "../src/models/localization/localization-types.ts"() {
62816
+ "../packages/models/src/localization/localization-types.ts"() {
62773
62817
  "use strict";
62774
62818
  init_core_types();
62775
62819
  init_structural_narrow();
@@ -62849,7 +62893,10 @@ function quoteNeoString(value) {
62849
62893
  }
62850
62894
  function indentNeoSource(value, spaces) {
62851
62895
  const prefix = " ".repeat(spaces);
62852
- return value.split("\n").map((line) => line.length > 0 ? `${prefix}${line}` : line).join("\n");
62896
+ const literalLines = neoScriptLiteralContinuationLines(value);
62897
+ return value.split("\n").map(
62898
+ (line, index) => line.length > 0 && !literalLines.has(index) ? `${prefix}${line}` : line
62899
+ ).join("\n");
62853
62900
  }
62854
62901
  function formatNeoNumber(value) {
62855
62902
  if (!Number.isFinite(value)) {
@@ -62879,6 +62926,7 @@ function invariantCaseKey(value) {
62879
62926
  var init_source_format = __esm({
62880
62927
  "src/project-source/source-format.ts"() {
62881
62928
  "use strict";
62929
+ init_lexer();
62882
62930
  init_float32();
62883
62931
  init_machine_strings();
62884
62932
  }
@@ -66135,7 +66183,10 @@ function normalizeBodySource(source) {
66135
66183
  const trimmed = source.trim();
66136
66184
  const lines = trimmed.split("\n");
66137
66185
  if (lines.length < 2) return trimmed;
66138
- const continuations = lines.slice(1).filter((line) => line.trim().length > 0);
66186
+ const literalLines = neoScriptLiteralContinuationLines(trimmed);
66187
+ const continuations = lines.slice(1).filter(
66188
+ (line, index) => !literalLines.has(index + 1) && line.trim().length > 0
66189
+ );
66139
66190
  if (continuations.length === 0) return trimmed;
66140
66191
  const common = Math.min(
66141
66192
  ...continuations.map((line) => line.length - line.trimStart().length)
@@ -66143,7 +66194,10 @@ function normalizeBodySource(source) {
66143
66194
  if (common === 0) return trimmed;
66144
66195
  return [
66145
66196
  lines[0],
66146
- ...lines.slice(1).map((line) => line.trim().length === 0 ? "" : line.slice(common))
66197
+ ...lines.slice(1).map((line, index) => {
66198
+ if (literalLines.has(index + 1)) return line;
66199
+ return line.trim().length === 0 ? "" : line.slice(common);
66200
+ })
66147
66201
  ].join("\n");
66148
66202
  }
66149
66203
  function normalizeInitializerSource(source) {
@@ -66314,6 +66368,7 @@ var normalizedInitializers, normalizedInitializerCharacters, MAX_NORMALIZED_INIT
66314
66368
  var init_init_source = __esm({
66315
66369
  "src/project-source/init-source.ts"() {
66316
66370
  "use strict";
66371
+ init_lexer();
66317
66372
  init_value_comparison();
66318
66373
  normalizedInitializers = /* @__PURE__ */ new Map();
66319
66374
  normalizedInitializerCharacters = 0;
@@ -66519,12 +66574,12 @@ function innerBody(body) {
66519
66574
  }
66520
66575
  function preserveEquivalentBody(authored, base) {
66521
66576
  if (base === void 0) return authored;
66522
- const normalize = (value) => value.split("\n").map((line) => line.trim()).filter((line) => line.length > 0).join("\n");
66523
- return normalize(authored) === normalize(base ?? "") ? base : authored;
66577
+ return sameNeoScriptTokens(authored, base ?? "") ? base : authored;
66524
66578
  }
66525
66579
  var init_lower_constructors = __esm({
66526
66580
  "src/project-source/lower-constructors.ts"() {
66527
66581
  "use strict";
66582
+ init_lexer();
66528
66583
  init_pending_id();
66529
66584
  init_declared_constructors();
66530
66585
  init_required_constructor_id();
@@ -66596,7 +66651,6 @@ var MEMBER_KIND_SOURCE_TYPE_NAMES, MEMBER_KIND_NUMBERS, SOURCE_TYPE_NAME_BY_MEMB
66596
66651
  var init_member_kind_type_names = __esm({
66597
66652
  "src/project-source/member-kind-type-names.ts"() {
66598
66653
  "use strict";
66599
- init_members();
66600
66654
  MEMBER_KIND_SOURCE_TYPE_NAMES = {
66601
66655
  null: "null",
66602
66656
  bool: "bool",
@@ -69189,8 +69243,7 @@ function functionBodySource(body, isVoid2) {
69189
69243
  function preserveEquivalentCode(authored, base) {
69190
69244
  if (authored === null) return null;
69191
69245
  if (base !== null && base !== void 0) {
69192
- const normalize = (value) => value.split("\n").map((line) => line.trim()).filter((line) => line.length > 0).join("\n");
69193
- if (normalize(authored) === normalize(base)) return base;
69246
+ if (sameNeoScriptTokens(authored, base)) return base;
69194
69247
  }
69195
69248
  return authored;
69196
69249
  }
@@ -69356,6 +69409,7 @@ var UNSET_LIST_COLUMN_WIDTH, EMPTY_GENERIC_TYPE_ENVIRONMENT, STRUCTURED_LEAF_COM
69356
69409
  var init_lower_members = __esm({
69357
69410
  "src/project-source/lower-members.ts"() {
69358
69411
  "use strict";
69412
+ init_lexer();
69359
69413
  init_initializer_reference_spellings();
69360
69414
  init_listener_sources();
69361
69415
  init_project_source_ast();
@@ -69507,7 +69561,6 @@ var init_project_file_registry = __esm({
69507
69561
  "use strict";
69508
69562
  init_language_spec();
69509
69563
  init_project_source_identifiers();
69510
- init_files();
69511
69564
  PROJECT_FILE_REGISTRIES = [
69512
69565
  {
69513
69566
  fileType: "image" /* Image */,
@@ -71221,7 +71274,6 @@ var init_supplemental_records = __esm({
71221
71274
  init_project_source_parser();
71222
71275
  init_strict_ir();
71223
71276
  init_declaration_path();
71224
- init_dialogue_group_types();
71225
71277
  init_value_comparison();
71226
71278
  init_projection();
71227
71279
  init_emitter();
@@ -71883,7 +71935,7 @@ function conditionProjectionMatches(context, prior, body) {
71883
71935
  prior.getter,
71884
71936
  context.sourceSchema.uiActionResolver(alias, bindingNames)
71885
71937
  );
71886
- if (projected !== null && normalizeSourceCode(body) === normalizeSourceCode(projected)) {
71938
+ if (projected !== null && sameNeoScriptTokens(body, projected)) {
71887
71939
  return true;
71888
71940
  }
71889
71941
  }
@@ -71902,7 +71954,7 @@ function lowerActionLogic(context, prior, fn, fallbackCode, inline, useId, uiRes
71902
71954
  const code = functionCode(fn) ?? fallbackCode;
71903
71955
  if (prior?.type === 0) {
71904
71956
  const projected = uiActionSource(prior.action, uiResolver);
71905
- if (projected !== null && normalizeSourceCode(code) === normalizeSourceCode(projected)) {
71957
+ if (projected !== null && sameNeoScriptTokens(code, projected)) {
71906
71958
  return prior;
71907
71959
  }
71908
71960
  }
@@ -72986,13 +73038,11 @@ function sourceFunctionForPrior(context, prior) {
72986
73038
  }
72987
73039
  function isCanonicalProjectedCode(authoredCode, priorCode, context) {
72988
73040
  if (typeof priorCode !== "string") return false;
72989
- return normalizeSourceCode(authoredCode) === normalizeSourceCode(
73041
+ return sameNeoScriptTokens(
73042
+ authoredCode,
72990
73043
  rewritePulledThis(priorCode, context.sourcePrimaryAlias)
72991
73044
  );
72992
73045
  }
72993
- function normalizeSourceCode(code) {
72994
- return code.replaceAll("\r\n", "\n").trim().split("\n").map((line) => line.trim()).join("\n");
72995
- }
72996
73046
  function rewritePulledThis(code, alias) {
72997
73047
  return rewriteNeoScriptThisReceiver(code, alias);
72998
73048
  }
@@ -73248,6 +73298,7 @@ var SourceSchemaIndex;
73248
73298
  var init_dialogue_lower = __esm({
73249
73299
  "src/project-source/dialogue-lower.ts"() {
73250
73300
  "use strict";
73301
+ init_lexer();
73251
73302
  init_lower_support();
73252
73303
  init_dialogue_source_names();
73253
73304
  init_dialogue_group_paths();
@@ -73258,7 +73309,6 @@ var init_dialogue_lower = __esm({
73258
73309
  init_executable_parser();
73259
73310
  init_strict_ir();
73260
73311
  init_localization_types();
73261
- init_members();
73262
73312
  init_neoscript();
73263
73313
  init_value_comparison();
73264
73314
  init_projection();
@@ -73266,7 +73316,6 @@ var init_dialogue_lower = __esm({
73266
73316
  init_ui_action_source();
73267
73317
  init_source_format();
73268
73318
  init_supplemental_records();
73269
- init_dialogue_group_types();
73270
73319
  SourceSchemaIndex = class {
73271
73320
  classesByName;
73272
73321
  classesById;
@@ -73549,10 +73598,10 @@ var init_dialogue_lower = __esm({
73549
73598
  }
73550
73599
  });
73551
73600
 
73552
- // ../src/runtime/neoscript/NSGetterRuntimeError.ts
73601
+ // ../packages/neoscript-runtime/src/neoscript/NSGetterRuntimeError.ts
73553
73602
  var NSGetterRuntimeError, UncompiledInitializerRuntimeError;
73554
73603
  var init_NSGetterRuntimeError = __esm({
73555
- "../src/runtime/neoscript/NSGetterRuntimeError.ts"() {
73604
+ "../packages/neoscript-runtime/src/neoscript/NSGetterRuntimeError.ts"() {
73556
73605
  "use strict";
73557
73606
  init_runtime_source();
73558
73607
  NSGetterRuntimeError = class extends Error {
@@ -75290,7 +75339,7 @@ var init_project_schema_manifest = __esm({
75290
75339
  }
75291
75340
  });
75292
75341
 
75293
- // ../src/models/interfaces/interface-types.ts
75342
+ // ../packages/models/src/interfaces/interface-types.ts
75294
75343
  function isInterfacePropertyMember(member) {
75295
75344
  return member.kind === void 0 || member.kind === 0 /* Property */;
75296
75345
  }
@@ -75406,7 +75455,7 @@ function getInterfaceMemberKeyOrder(neoInterface) {
75406
75455
  return result;
75407
75456
  }
75408
75457
  var init_interface_types = __esm({
75409
- "../src/models/interfaces/interface-types.ts"() {
75458
+ "../packages/models/src/interfaces/interface-types.ts"() {
75410
75459
  "use strict";
75411
75460
  init_core_types();
75412
75461
  init_neoscript_types();
@@ -75417,7 +75466,7 @@ var init_interface_types = __esm({
75417
75466
  }
75418
75467
  });
75419
75468
 
75420
- // ../src/models/dialogue/dialogue-group-language.ts
75469
+ // ../packages/models/src/dialogue/dialogue-group-language.ts
75421
75470
  function dialogueGroupLanguageContract(group) {
75422
75471
  return {
75423
75472
  id: group.id,
@@ -75457,10 +75506,9 @@ function lookupEntry(collectionMemberId, memberById2, classById) {
75457
75506
  }
75458
75507
  var KINDS;
75459
75508
  var init_dialogue_group_language = __esm({
75460
- "../src/models/dialogue/dialogue-group-language.ts"() {
75509
+ "../packages/models/src/dialogue/dialogue-group-language.ts"() {
75461
75510
  "use strict";
75462
75511
  init_members();
75463
- init_dialogue_group_types();
75464
75512
  KINDS = {
75465
75513
  [0 /* Standard */]: "standard",
75466
75514
  [1 /* Lookup */]: "lookup",
@@ -77034,10 +77082,10 @@ var init_neoscript_language_context_adapter = __esm({
77034
77082
  }
77035
77083
  });
77036
77084
 
77037
- // ../src/common/overlay-readonly-map.ts
77085
+ // ../packages/neoscript-runtime/src/internal/overlay-readonly-map.ts
77038
77086
  var OverlayReadonlyMap;
77039
77087
  var init_overlay_readonly_map = __esm({
77040
- "../src/common/overlay-readonly-map.ts"() {
77088
+ "../packages/neoscript-runtime/src/internal/overlay-readonly-map.ts"() {
77041
77089
  "use strict";
77042
77090
  OverlayReadonlyMap = class {
77043
77091
  constructor(parent, own) {
@@ -77080,7 +77128,7 @@ var init_overlay_readonly_map = __esm({
77080
77128
  }
77081
77129
  });
77082
77130
 
77083
- // ../src/runtime/neoscript/initializer-dependencies.ts
77131
+ // ../packages/neoscript-runtime/src/neoscript/initializer-dependencies.ts
77084
77132
  function materializeInitializerDependencies(pending, materialize) {
77085
77133
  const active = /* @__PURE__ */ new Set();
77086
77134
  for (const rootId of pending) {
@@ -77113,7 +77161,7 @@ function materializeInitializerDependencies(pending, materialize) {
77113
77161
  }
77114
77162
  var PendingInitializerDependency;
77115
77163
  var init_initializer_dependencies = __esm({
77116
- "../src/runtime/neoscript/initializer-dependencies.ts"() {
77164
+ "../packages/neoscript-runtime/src/neoscript/initializer-dependencies.ts"() {
77117
77165
  "use strict";
77118
77166
  init_NSGetterRuntimeError();
77119
77167
  PendingInitializerDependency = class extends NSGetterRuntimeError {
@@ -77126,7 +77174,7 @@ var init_initializer_dependencies = __esm({
77126
77174
  }
77127
77175
  });
77128
77176
 
77129
- // ../src/models/members/lookup-declared-type.ts
77177
+ // ../packages/models/src/members/lookup-declared-type.ts
77130
77178
  function lookupDeclaredTypeInfo2(member, collectionTypeInfo) {
77131
77179
  if (collectionTypeInfo === null) return null;
77132
77180
  if (collectionTypeInfo.type !== 6 /* List */ && collectionTypeInfo.type !== 5 /* Dictionary */) {
@@ -77148,14 +77196,13 @@ function lookupDeclaredTypeInfo2(member, collectionTypeInfo) {
77148
77196
  };
77149
77197
  }
77150
77198
  var init_lookup_declared_type = __esm({
77151
- "../src/models/members/lookup-declared-type.ts"() {
77199
+ "../packages/models/src/members/lookup-declared-type.ts"() {
77152
77200
  "use strict";
77153
- init_member_kind_enum();
77154
77201
  init_member_kinds();
77155
77202
  }
77156
77203
  });
77157
77204
 
77158
- // ../src/database/member-declared-type-info.ts
77205
+ // ../packages/neoscript-runtime/src/values/member-declared-type-info.ts
77159
77206
  function resolveMemberDeclaredTypeInfo(member, members) {
77160
77207
  return resolveMemberDeclaredTypeInfoInternal(member, members, /* @__PURE__ */ new Set());
77161
77208
  }
@@ -77272,7 +77319,7 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen) {
77272
77319
  };
77273
77320
  }
77274
77321
  var init_member_declared_type_info = __esm({
77275
- "../src/database/member-declared-type-info.ts"() {
77322
+ "../packages/neoscript-runtime/src/values/member-declared-type-info.ts"() {
77276
77323
  "use strict";
77277
77324
  init_members();
77278
77325
  init_lookup_declared_type();
@@ -77282,7 +77329,7 @@ var init_member_declared_type_info = __esm({
77282
77329
  }
77283
77330
  });
77284
77331
 
77285
- // ../src/database/value-row-owner-members.ts
77332
+ // ../packages/neoscript-runtime/src/values/value-row-owner-members.ts
77286
77333
  function valueIdsWithSourceChains(targetValueIds, valuesById) {
77287
77334
  const result = new Set(targetValueIds);
77288
77335
  for (const targetId of targetValueIds) {
@@ -77818,7 +77865,7 @@ function findOwningMembersForValues(document, valueIds, additionalRoots, travers
77818
77865
  return owners;
77819
77866
  }
77820
77867
  var init_value_row_owner_members = __esm({
77821
- "../src/database/value-row-owner-members.ts"() {
77868
+ "../packages/neoscript-runtime/src/values/value-row-owner-members.ts"() {
77822
77869
  "use strict";
77823
77870
  init_members();
77824
77871
  init_inheritance();
@@ -77827,7 +77874,7 @@ var init_value_row_owner_members = __esm({
77827
77874
  }
77828
77875
  });
77829
77876
 
77830
- // ../src/database/constructor-argument-ownership.ts
77877
+ // ../packages/neoscript-runtime/src/values/constructor-argument-ownership.ts
77831
77878
  function resolveSemanticOwnerMembersForValues(document, targetValueIds, additionalRoots, rootOwners, rootKinds) {
77832
77879
  const result = /* @__PURE__ */ new Map();
77833
77880
  if (targetValueIds.size === 0) return result;
@@ -78150,7 +78197,7 @@ function indexChildrenByContainerId(rows) {
78150
78197
  }
78151
78198
  var MaterializedValueGraphContext;
78152
78199
  var init_constructor_argument_ownership = __esm({
78153
- "../src/database/constructor-argument-ownership.ts"() {
78200
+ "../packages/neoscript-runtime/src/values/constructor-argument-ownership.ts"() {
78154
78201
  "use strict";
78155
78202
  init_constructor_parameter_settlement();
78156
78203
  init_generics();
@@ -78444,7 +78491,7 @@ var init_constructor_argument_ownership = __esm({
78444
78491
  }
78445
78492
  });
78446
78493
 
78447
- // ../src/models/members/stored-value-placement-index.ts
78494
+ // ../packages/models/src/members/stored-value-placement-index.ts
78448
78495
  function buildStoredValuePlacementIndex(args) {
78449
78496
  return createStoredValuePlacementTraversal(args)();
78450
78497
  }
@@ -78813,7 +78860,7 @@ function isStringRecord5(value) {
78813
78860
  return Object.values(value).every((item) => typeof item === "string");
78814
78861
  }
78815
78862
  var init_stored_value_placement_index = __esm({
78816
- "../src/models/members/stored-value-placement-index.ts"() {
78863
+ "../packages/models/src/members/stored-value-placement-index.ts"() {
78817
78864
  "use strict";
78818
78865
  init_inheritance();
78819
78866
  init_constructor_parameter_settlement();
@@ -78823,7 +78870,7 @@ var init_stored_value_placement_index = __esm({
78823
78870
  }
78824
78871
  });
78825
78872
 
78826
- // ../src/runtime/neoscript/unattributable-reads.ts
78873
+ // ../packages/neoscript-runtime/src/neoscript/unattributable-reads.ts
78827
78874
  function ownershipChainRead(kind, rowId) {
78828
78875
  return `${kind}:${rowId}`;
78829
78876
  }
@@ -78846,7 +78893,7 @@ function classifyUnattributableRead(reason) {
78846
78893
  }
78847
78894
  var OWNERSHIP_CHAIN_PREFIXES, CONTAINER_ENTRIES_PREFIX, OWNERSHIP_CHAIN_READ;
78848
78895
  var init_unattributable_reads = __esm({
78849
- "../src/runtime/neoscript/unattributable-reads.ts"() {
78896
+ "../packages/neoscript-runtime/src/neoscript/unattributable-reads.ts"() {
78850
78897
  "use strict";
78851
78898
  OWNERSHIP_CHAIN_PREFIXES = [
78852
78899
  "generic-parent-resolution:",
@@ -78862,13 +78909,13 @@ var init_unattributable_reads = __esm({
78862
78909
  }
78863
78910
  });
78864
78911
 
78865
- // ../src/runtime/world-grid-query-reads.ts
78912
+ // ../packages/neoscript-runtime/src/world-grid-query-reads.ts
78866
78913
  function worldGridQueryReadKey(read) {
78867
78914
  return read.kind === "placement" ? JSON.stringify([read.kind, read.valueId]) : JSON.stringify([read.kind, read.gridId, read.cell.x, read.cell.y]);
78868
78915
  }
78869
78916
  var WorldGridQueryReadSet;
78870
78917
  var init_world_grid_query_reads = __esm({
78871
- "../src/runtime/world-grid-query-reads.ts"() {
78918
+ "../packages/neoscript-runtime/src/world-grid-query-reads.ts"() {
78872
78919
  "use strict";
78873
78920
  init_collections();
78874
78921
  WorldGridQueryReadSet = class {
@@ -78893,7 +78940,7 @@ var init_world_grid_query_reads = __esm({
78893
78940
  }
78894
78941
  });
78895
78942
 
78896
- // ../src/runtime/neoscript/initializer-context.ts
78943
+ // ../packages/neoscript-runtime/src/neoscript/initializer-context.ts
78897
78944
  function initializerEvaluatorCacheKey(document) {
78898
78945
  return document.evaluatorCache?.key ?? document;
78899
78946
  }
@@ -78902,9 +78949,8 @@ function initializerEvaluatorCacheRevision(document) {
78902
78949
  }
78903
78950
  var InitializerReadSet;
78904
78951
  var init_initializer_context = __esm({
78905
- "../src/runtime/neoscript/initializer-context.ts"() {
78952
+ "../packages/neoscript-runtime/src/neoscript/initializer-context.ts"() {
78906
78953
  "use strict";
78907
- init_collections();
78908
78954
  init_unattributable_reads();
78909
78955
  init_world_grid_query_reads();
78910
78956
  InitializerReadSet = class {
@@ -78946,21 +78992,21 @@ var init_initializer_context = __esm({
78946
78992
  }
78947
78993
  });
78948
78994
 
78949
- // ../src/runtime/declaration-default-source.ts
78995
+ // ../packages/neoscript-runtime/src/declaration-default-source.ts
78950
78996
  function declarationDefaultSource(id2, stored, resolveGraph) {
78951
78997
  if (stored !== null && !isCollapseStampedInstanceRoot(stored)) return stored;
78952
78998
  const graph = resolveGraph(id2);
78953
78999
  return defaultSourceWithListeners(graph?.rowsById.get(id2) ?? stored, graph);
78954
79000
  }
78955
79001
  var init_declaration_default_source = __esm({
78956
- "../src/runtime/declaration-default-source.ts"() {
79002
+ "../packages/neoscript-runtime/src/declaration-default-source.ts"() {
78957
79003
  "use strict";
78958
79004
  init_instance_provenance();
78959
79005
  init_member_change_listeners();
78960
79006
  }
78961
79007
  });
78962
79008
 
78963
- // ../src/runtime/listener-write-index.ts
79009
+ // ../packages/neoscript-runtime/src/listener-write-index.ts
78964
79010
  function listenerWritesByOwner(state) {
78965
79011
  if (state === void 0) return empty;
78966
79012
  let index = indexes.get(state);
@@ -78978,16 +79024,19 @@ function listenerWritesByOwner(state) {
78978
79024
  }
78979
79025
  return index.owners;
78980
79026
  }
79027
+ function changeListenerWriteEdit(write) {
79028
+ return write.operation === "clear" ? { kind: "replace", targets: [] } : { kind: write.operation, target: write.listener };
79029
+ }
78981
79030
  var indexes, empty;
78982
79031
  var init_listener_write_index = __esm({
78983
- "../src/runtime/listener-write-index.ts"() {
79032
+ "../packages/neoscript-runtime/src/listener-write-index.ts"() {
78984
79033
  "use strict";
78985
79034
  indexes = /* @__PURE__ */ new WeakMap();
78986
79035
  empty = /* @__PURE__ */ new Map();
78987
79036
  }
78988
79037
  });
78989
79038
 
78990
- // ../src/runtime/neoscript/typed-aggregate-row-references.ts
79039
+ // ../packages/neoscript-runtime/src/neoscript/typed-aggregate-row-references.ts
78991
79040
  function visitTypedAggregateRowReferences(value, rawType, visitor) {
78992
79041
  visitor.beforeVisit?.();
78993
79042
  const pending = [{ value, type: rawType }];
@@ -79013,13 +79062,12 @@ function visitTypedAggregateRowReferences(value, rawType, visitor) {
79013
79062
  }
79014
79063
  }
79015
79064
  var init_typed_aggregate_row_references = __esm({
79016
- "../src/runtime/neoscript/typed-aggregate-row-references.ts"() {
79065
+ "../packages/neoscript-runtime/src/neoscript/typed-aggregate-row-references.ts"() {
79017
79066
  "use strict";
79018
- init_members();
79019
79067
  }
79020
79068
  });
79021
79069
 
79022
- // ../src/runtime/neoscript/cell-pattern.ts
79070
+ // ../packages/neoscript-runtime/src/neoscript/cell-pattern.ts
79023
79071
  function integer2(value, name, minimum = -2147483648) {
79024
79072
  if (typeof value !== "number" || !Number.isInteger(value)) {
79025
79073
  throw new TypeError(`${name} must be an integer.`);
@@ -79214,14 +79262,14 @@ function evaluateCellPatternNative(memberId, receiver, args, ctx) {
79214
79262
  }
79215
79263
  }
79216
79264
  var init_cell_pattern2 = __esm({
79217
- "../src/runtime/neoscript/cell-pattern.ts"() {
79265
+ "../packages/neoscript-runtime/src/neoscript/cell-pattern.ts"() {
79218
79266
  "use strict";
79219
79267
  init_cell_pattern();
79220
79268
  init_member_kinds();
79221
79269
  }
79222
79270
  });
79223
79271
 
79224
- // ../src/models/classes/world-layer-link-target.ts
79272
+ // ../packages/models/src/classes/world-layer-link-target.ts
79225
79273
  function validateWorldLayerLinkClassTargets(args) {
79226
79274
  const relationResolver = createEffectiveClassRelationResolver(args);
79227
79275
  const worldKindsByClassId = indexWorldSystemClassKinds(
@@ -79360,17 +79408,16 @@ function resolveWorldLayerLinkTarget(args) {
79360
79408
  };
79361
79409
  }
79362
79410
  var init_world_layer_link_target = __esm({
79363
- "../src/models/classes/world-layer-link-target.ts"() {
79411
+ "../packages/models/src/classes/world-layer-link-target.ts"() {
79364
79412
  "use strict";
79365
79413
  init_classes();
79366
79414
  init_core();
79367
79415
  init_internal_record_relations();
79368
- init_project_version_types();
79369
79416
  init_classes();
79370
79417
  }
79371
79418
  });
79372
79419
 
79373
- // ../src/runtime/world-grid-query.ts
79420
+ // ../packages/neoscript-runtime/src/world-grid-query.ts
79374
79421
  function getWorldGridQueryIndex(source) {
79375
79422
  const previous = indexes2.get(source.cacheKey);
79376
79423
  if (previous !== void 0 && sameRevision(previous.revision, source.revision))
@@ -79611,7 +79658,7 @@ function checkedCoordinate(value) {
79611
79658
  }
79612
79659
  var WorldGridQueryError, MissingWorldObjectPlacementError, indexes2, building, WorldGridQueryIndex;
79613
79660
  var init_world_grid_query = __esm({
79614
- "../src/runtime/world-grid-query.ts"() {
79661
+ "../packages/neoscript-runtime/src/world-grid-query.ts"() {
79615
79662
  "use strict";
79616
79663
  init_classes();
79617
79664
  init_world_layer_link_target();
@@ -79726,7 +79773,7 @@ var init_world_grid_query = __esm({
79726
79773
  }
79727
79774
  });
79728
79775
 
79729
- // ../src/runtime/neoscript/getter-subscriptions.ts
79776
+ // ../packages/neoscript-runtime/src/neoscript/getter-subscriptions.ts
79730
79777
  function* readKeys(reads) {
79731
79778
  yield* reads.valueIds;
79732
79779
  yield* reads.containerIds;
@@ -79735,7 +79782,7 @@ function* readKeys(reads) {
79735
79782
  }
79736
79783
  var NeoScriptGetterSubscription, NO_SUBSCRIPTIONS, staticReadKey, NeoScriptGetterSubscriptions;
79737
79784
  var init_getter_subscriptions = __esm({
79738
- "../src/runtime/neoscript/getter-subscriptions.ts"() {
79785
+ "../packages/neoscript-runtime/src/neoscript/getter-subscriptions.ts"() {
79739
79786
  "use strict";
79740
79787
  init_initializer_context();
79741
79788
  NeoScriptGetterSubscription = class {
@@ -79871,7 +79918,7 @@ var init_getter_subscriptions = __esm({
79871
79918
  }
79872
79919
  });
79873
79920
 
79874
- // ../src/models/decimal/decimal-math.ts
79921
+ // ../packages/models/src/decimal/decimal-math.ts
79875
79922
  function pow10(exponent) {
79876
79923
  return TEN ** BigInt(exponent);
79877
79924
  }
@@ -80127,7 +80174,7 @@ function floatFromDecimalString(value) {
80127
80174
  }
80128
80175
  var DecimalOverflowError, DecimalDivisionByZeroError, DecimalDigitsRangeError, DecimalNonFiniteError, DecimalClampRangeError, MATH_CLAMP_RANGE_MESSAGE, TEN;
80129
80176
  var init_decimal_math = __esm({
80130
- "../src/models/decimal/decimal-math.ts"() {
80177
+ "../packages/models/src/decimal/decimal-math.ts"() {
80131
80178
  "use strict";
80132
80179
  init_member_kinds();
80133
80180
  DecimalOverflowError = class extends Error {
@@ -80145,15 +80192,15 @@ var init_decimal_math = __esm({
80145
80192
  }
80146
80193
  });
80147
80194
 
80148
- // ../src/models/decimal/index.ts
80195
+ // ../packages/models/src/decimal/index.ts
80149
80196
  var init_decimal = __esm({
80150
- "../src/models/decimal/index.ts"() {
80197
+ "../packages/models/src/decimal/index.ts"() {
80151
80198
  "use strict";
80152
80199
  init_decimal_math();
80153
80200
  }
80154
80201
  });
80155
80202
 
80156
- // ../src/models/members/read-class-member.ts
80203
+ // ../packages/models/src/members/read-class-member.ts
80157
80204
  function readClassMember(args) {
80158
80205
  const { member, schemaKey } = args;
80159
80206
  const declaration = member.kind !== 10 /* NSProperty */ && member.defaultValue != null ? member.defaultValue : void 0;
@@ -80172,16 +80219,16 @@ function readClassMember(args) {
80172
80219
  return { kind: "missing" };
80173
80220
  }
80174
80221
  var init_read_class_member = __esm({
80175
- "../src/models/members/read-class-member.ts"() {
80222
+ "../packages/models/src/members/read-class-member.ts"() {
80176
80223
  "use strict";
80177
80224
  init_member_kinds();
80178
80225
  }
80179
80226
  });
80180
80227
 
80181
- // ../src/runtime/neoscript/NeoScriptScope.ts
80228
+ // ../packages/neoscript-runtime/src/neoscript/NeoScriptScope.ts
80182
80229
  var NeoScriptScope;
80183
80230
  var init_NeoScriptScope = __esm({
80184
- "../src/runtime/neoscript/NeoScriptScope.ts"() {
80231
+ "../packages/neoscript-runtime/src/neoscript/NeoScriptScope.ts"() {
80185
80232
  "use strict";
80186
80233
  NeoScriptScope = class {
80187
80234
  constructor(parent = null, initialBindings) {
@@ -80257,7 +80304,7 @@ var init_NeoScriptScope = __esm({
80257
80304
  }
80258
80305
  });
80259
80306
 
80260
- // ../src/runtime/neoscript/evaluateNSGetter.ts
80307
+ // ../packages/neoscript-runtime/src/neoscript/evaluateNSGetter.ts
80261
80308
  function isCatchableNeoScriptRuntimeError(error) {
80262
80309
  return error instanceof NSGetterRuntimeError && !(error instanceof UncompiledInitializerRuntimeError) && !(error instanceof PendingInitializerDependency) && !(error instanceof NonCatchableNSGetterRuntimeError);
80263
80310
  }
@@ -81888,33 +81935,41 @@ function finalizeConstructorAllocations(ctx, returnValue, ownsInvocationState, r
81888
81935
  const listenerEdges = /* @__PURE__ */ new Map();
81889
81936
  for (const write of state.writes) {
81890
81937
  if (!retainListenerReceivers || write.kind !== "changeListener") continue;
81938
+ const slotKey = JSON.stringify([write.ownerId, write.memberId]);
81939
+ if (write.operation === "clear") {
81940
+ listenerEdges.delete(slotKey);
81941
+ continue;
81942
+ }
81891
81943
  const key = JSON.stringify([
81892
- write.ownerId,
81893
- write.memberId,
81894
81944
  write.listener.memberId,
81895
81945
  write.listener.valueId
81896
81946
  ]);
81897
- if (write.operation === "remove") listenerEdges.delete(key);
81898
- else listenerEdges.set(key, write);
81947
+ let edges = listenerEdges.get(slotKey);
81948
+ if (write.operation === "remove") edges?.delete(key);
81949
+ else {
81950
+ if (edges === void 0) listenerEdges.set(slotKey, edges = /* @__PURE__ */ new Map());
81951
+ edges.set(key, write);
81952
+ }
81899
81953
  }
81900
81954
  const externalListenerReceivers = /* @__PURE__ */ new Set();
81901
- for (const write of listenerEdges.values()) {
81902
- if (write.listener.valueId === null) continue;
81903
- const receiverGroup = groupByRowId.get(write.listener.valueId);
81904
- if (receiverGroup === void 0) continue;
81905
- const ownerGroup = groupByRowId.get(write.ownerId);
81906
- if (ownerGroup === void 0) {
81907
- if (rowForCleanup(write.ownerId) !== null)
81908
- externalListenerReceivers.add(receiverGroup);
81909
- } else {
81910
- let dependencies = state.constructorGroupDependencies.get(ownerGroup);
81911
- if (dependencies === void 0) {
81912
- dependencies = /* @__PURE__ */ new Set();
81913
- state.constructorGroupDependencies.set(ownerGroup, dependencies);
81955
+ for (const edges of listenerEdges.values())
81956
+ for (const write of edges.values()) {
81957
+ if (write.listener.valueId === null) continue;
81958
+ const receiverGroup = groupByRowId.get(write.listener.valueId);
81959
+ if (receiverGroup === void 0) continue;
81960
+ const ownerGroup = groupByRowId.get(write.ownerId);
81961
+ if (ownerGroup === void 0) {
81962
+ if (rowForCleanup(write.ownerId) !== null)
81963
+ externalListenerReceivers.add(receiverGroup);
81964
+ } else {
81965
+ let dependencies = state.constructorGroupDependencies.get(ownerGroup);
81966
+ if (dependencies === void 0) {
81967
+ dependencies = /* @__PURE__ */ new Set();
81968
+ state.constructorGroupDependencies.set(ownerGroup, dependencies);
81969
+ }
81970
+ dependencies.add(receiverGroup);
81914
81971
  }
81915
- dependencies.add(receiverGroup);
81916
81972
  }
81917
- }
81918
81973
  const markConstructorGroupEscaped = (rootId) => {
81919
81974
  if (escapedRoots.has(rootId)) return;
81920
81975
  escapedRoots.add(rootId);
@@ -82111,7 +82166,7 @@ function finalizeConstructorAllocations(ctx, returnValue, ownsInvocationState, r
82111
82166
  const survivingWrites = state.writes.filter((write) => {
82112
82167
  if (write.kind === "changeListener") {
82113
82168
  if (collectedIds.has(write.ownerId)) return false;
82114
- return write.listener.valueId === null || !collectedIds.has(write.listener.valueId);
82169
+ return write.operation === "clear" || write.listener.valueId === null || !collectedIds.has(write.listener.valueId);
82115
82170
  }
82116
82171
  const destination = write.resolvedDestination;
82117
82172
  const destinationId = destination !== void 0 && "containerValueId" in destination ? destination.containerValueId : void 0;
@@ -82752,7 +82807,8 @@ function evalInstructions(instructions, scope, ctx, options) {
82752
82807
  break;
82753
82808
  }
82754
82809
  case "addChangeListener" /* addChangeListener */:
82755
- case "removeChangeListener" /* removeChangeListener */: {
82810
+ case "removeChangeListener" /* removeChangeListener */:
82811
+ case "clearChangeListeners" /* clearChangeListeners */: {
82756
82812
  evalChangeListenerInstruction(ins, scope, ctx, options);
82757
82813
  break;
82758
82814
  }
@@ -83182,6 +83238,18 @@ function evalChangeListenerInstruction(ins, scope, ctx, options) {
83182
83238
  throw new NSGetterRuntimeError(
83183
83239
  `OnChanged member '${ins.target.memberId}' is not an observable member or getter of owner '${owner.id}'.`
83184
83240
  );
83241
+ if (ins.type === "clearChangeListeners" /* clearChangeListeners */) {
83242
+ if (getter !== null) clearGetterSubscription(getter, ctx);
83243
+ else
83244
+ options.writes.push({
83245
+ kind: "changeListener",
83246
+ target: ins.target,
83247
+ ownerId: owner.id,
83248
+ memberId: slot.memberId,
83249
+ operation: "clear"
83250
+ });
83251
+ return;
83252
+ }
83185
83253
  const listener = evalPointer(ins.listener, scope, ctx);
83186
83254
  if (!isMemberDelegateTarget(listener))
83187
83255
  throw new NSGetterRuntimeError(
@@ -83238,6 +83306,17 @@ function editGetterSubscription(slot, target, add, ctx) {
83238
83306
  }
83239
83307
  subscription.targets.push(target);
83240
83308
  }
83309
+ function clearGetterSubscription(slot, ctx) {
83310
+ if ((ctx.__executionState?.constructionStack.length ?? 0) > 0)
83311
+ throw new NSGetterRuntimeError(
83312
+ "A getter subscription lives only for the play session, so a constructor can't clear one. Clear from a function."
83313
+ );
83314
+ const subscriptions = ctx.__getterSubscriptions;
83315
+ const subscription = subscriptions?.get(slot.owner.id, slot.memberId);
83316
+ if (subscriptions === void 0 || subscription === void 0) return;
83317
+ subscription.targets.length = 0;
83318
+ subscriptions.drop(subscription);
83319
+ }
83241
83320
  function dispatchGetterSubscriptions(ctx) {
83242
83321
  const subscriptions = ctx.__getterSubscriptions;
83243
83322
  if (subscriptions === void 0) return;
@@ -91540,7 +91619,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
91540
91619
  const edit = editChangeListenerSet(
91541
91620
  entry?.[write.memberId],
91542
91621
  [],
91543
- { kind: write.operation, target: write.listener },
91622
+ changeListenerWriteEdit(write),
91544
91623
  { inheritedComplete: false }
91545
91624
  );
91546
91625
  if (!edit.changed) continue;
@@ -91769,7 +91848,7 @@ function collectionEntryUsesReferenceResolution(collection, key, ctx) {
91769
91848
  }
91770
91849
  var DELEGATE_LEXICAL_THIS, DELEGATE_LEXICAL_ROOT, NonCatchableNSGetterRuntimeError, NativeFunctionDelegateUnavailableError, CorruptNeoScriptIRError, NeoScriptResourceLimitError, NeoScriptWallClockTimeoutError, DEFAULT_NEO_SCRIPT_EXECUTION_BUDGET_LIMITS, liveListIndexesByProject, evaluatorOwnershipCachesByBase, MAX_CONSTRUCTION_DEPTH, MAX_LOOP_ITERATIONS, resolutionCacheByMembers, NO_SCHEMA_REVISION, LazyValueOverlay, READONLY_FOREACH_BINDING_ERROR, READONLY_CATCH_BINDING_ERROR, DIALOGUE_CONTEXT_PARAMETER_ID, NS_MATH_OP_NAMES, DOUBLE_INTEGRAL_MAGNITUDE, EMPTY_SUPPLIED_CONSTRUCTOR_FIELDS;
91771
91850
  var init_evaluateNSGetter = __esm({
91772
- "../src/runtime/neoscript/evaluateNSGetter.ts"() {
91851
+ "../packages/neoscript-runtime/src/neoscript/evaluateNSGetter.ts"() {
91773
91852
  "use strict";
91774
91853
  init_debug();
91775
91854
  init_core();
@@ -91982,7 +92061,7 @@ var init_evaluateNSGetter = __esm({
91982
92061
  }
91983
92062
  });
91984
92063
 
91985
- // ../src/runtime/neoscript/evaluateInitializer.ts
92064
+ // ../packages/neoscript-runtime/src/neoscript/evaluateInitializer.ts
91986
92065
  function sharedHeadlessResolver(overlay) {
91987
92066
  const base = overlay.base;
91988
92067
  if (base.databaseVM !== void 0) return void 0;
@@ -92576,7 +92655,7 @@ function evaluateMemberInitializer(args) {
92576
92655
  }
92577
92656
  var evaluatorLookupsByDocument, headlessResolversByLookupKey, indexedEvaluatorLookupsByDocument;
92578
92657
  var init_evaluateInitializer = __esm({
92579
- "../src/runtime/neoscript/evaluateInitializer.ts"() {
92658
+ "../packages/neoscript-runtime/src/neoscript/evaluateInitializer.ts"() {
92580
92659
  "use strict";
92581
92660
  init_NSGetterRuntimeError();
92582
92661
  init_declaration_default_source();
@@ -92596,7 +92675,7 @@ var init_evaluateInitializer = __esm({
92596
92675
  }
92597
92676
  });
92598
92677
 
92599
- // ../src/database/initializer-identifiers.ts
92678
+ // ../packages/neoscript-runtime/src/values/initializer-identifiers.ts
92600
92679
  function initializerReferencedIdentifiers(source) {
92601
92680
  let expression;
92602
92681
  try {
@@ -92629,13 +92708,13 @@ function initializerReferencesAnyIdentifier(source, names) {
92629
92708
  return false;
92630
92709
  }
92631
92710
  var init_initializer_identifiers = __esm({
92632
- "../src/database/initializer-identifiers.ts"() {
92711
+ "../packages/neoscript-runtime/src/values/initializer-identifiers.ts"() {
92633
92712
  "use strict";
92634
92713
  init_executable_parser();
92635
92714
  }
92636
92715
  });
92637
92716
 
92638
- // ../src/runtime/initializer-materialization.ts
92717
+ // ../packages/neoscript-runtime/src/initializer-materialization.ts
92639
92718
  function declarationInitializerContext(document) {
92640
92719
  const key = initializerEvaluatorCacheKey(document);
92641
92720
  const revision = initializerEvaluatorCacheRevision(document);
@@ -92866,7 +92945,7 @@ function materializeMemberDefaultValue(args) {
92866
92945
  }
92867
92946
  var declarationInitializerContextByDocument;
92868
92947
  var init_initializer_materialization = __esm({
92869
- "../src/runtime/initializer-materialization.ts"() {
92948
+ "../packages/neoscript-runtime/src/initializer-materialization.ts"() {
92870
92949
  "use strict";
92871
92950
  init_unattributable_reads();
92872
92951
  init_deep_clone_plain_data();
@@ -92882,7 +92961,7 @@ var init_initializer_materialization = __esm({
92882
92961
  }
92883
92962
  });
92884
92963
 
92885
- // ../src/runtime/virtual-instance-graph.ts
92964
+ // ../packages/neoscript-runtime/src/virtual-instance-graph.ts
92886
92965
  function buildVirtualInstanceMaterializedIndex(args) {
92887
92966
  const rowsById = new Map(
92888
92967
  (args.materializedRows ?? args.document.values).map((row) => [row.id, row])
@@ -95917,14 +95996,13 @@ function assertStoredConstructionStamp(root, classId = root.classId) {
95917
95996
  }
95918
95997
  var KEPT_ROW_SAMPLE_LIMIT, CORPUS_SCANNING_MEMBER_KINDS, VirtualExpansionUnsupportedError, ROOT_PATH, OpenGenericComparisonError, SYNTHETIC_LINEAGE_PREFIXES, resolverDocumentsByDocument;
95919
95998
  var init_virtual_instance_graph = __esm({
95920
- "../src/runtime/virtual-instance-graph.ts"() {
95999
+ "../packages/neoscript-runtime/src/virtual-instance-graph.ts"() {
95921
96000
  "use strict";
95922
96001
  init_listener_endpoint_projection();
95923
96002
  init_overlay_readonly_map();
95924
96003
  init_member_change_listeners();
95925
96004
  init_initializer_dependencies();
95926
96005
  init_constructor_argument_ownership();
95927
- init_classes();
95928
96006
  init_constructor_parameter_settlement();
95929
96007
  init_generics();
95930
96008
  init_inheritance();
@@ -95933,10 +96011,8 @@ var init_virtual_instance_graph = __esm({
95933
96011
  init_members();
95934
96012
  init_instance_provenance();
95935
96013
  init_member_value_id();
95936
- init_packed_value_encoding();
95937
96014
  init_stored_value_placement_index();
95938
96015
  init_unordered_list_membership();
95939
- init_neoscript_types();
95940
96016
  init_neoscript_guards();
95941
96017
  init_project_schema_index();
95942
96018
  init_initializer_context();
@@ -95962,7 +96038,7 @@ var init_virtual_instance_graph = __esm({
95962
96038
  }
95963
96039
  });
95964
96040
 
95965
- // ../src/runtime/listener-endpoint-projection.ts
96041
+ // ../packages/neoscript-runtime/src/listener-endpoint-projection.ts
95966
96042
  function projectListenerEndpoint(args) {
95967
96043
  const { descriptor } = args;
95968
96044
  if (!descriptor.pathKey.startsWith("$/")) return void 0;
@@ -95989,7 +96065,7 @@ function projectListenerEndpoint(args) {
95989
96065
  return claim(descriptor.pathKey) === args.id ? node : void 0;
95990
96066
  }
95991
96067
  var init_listener_endpoint_projection = __esm({
95992
- "../src/runtime/listener-endpoint-projection.ts"() {
96068
+ "../packages/neoscript-runtime/src/listener-endpoint-projection.ts"() {
95993
96069
  "use strict";
95994
96070
  init_virtual_instance_graph();
95995
96071
  }
@@ -96596,7 +96672,7 @@ var init_listener_emission = __esm({
96596
96672
  }
96597
96673
  });
96598
96674
 
96599
- // ../src/runtime/effective-value-comparison.ts
96675
+ // ../packages/neoscript-runtime/src/effective-value-comparison.ts
96600
96676
  function createEffectiveValueComparator() {
96601
96677
  const pairs = /* @__PURE__ */ new WeakMap();
96602
96678
  const keys = /* @__PURE__ */ new WeakMap();
@@ -96677,7 +96753,7 @@ function effectiveValuesEqual(left, right) {
96677
96753
  return createEffectiveValueComparator()(left, right) === 0;
96678
96754
  }
96679
96755
  var init_effective_value_comparison = __esm({
96680
- "../src/runtime/effective-value-comparison.ts"() {
96756
+ "../packages/neoscript-runtime/src/effective-value-comparison.ts"() {
96681
96757
  "use strict";
96682
96758
  }
96683
96759
  });
@@ -96961,7 +97037,7 @@ var init_compile = __esm({
96961
97037
  }
96962
97038
  });
96963
97039
 
96964
- // ../src/database/variant-value-graph.ts
97040
+ // ../packages/neoscript-runtime/src/values/variant-value-graph.ts
96965
97041
  function variantRootMemberId(variantId) {
96966
97042
  return `variant-root:${variantId}`;
96967
97043
  }
@@ -97161,10 +97237,9 @@ function withVariantPlacementRoots(document) {
97161
97237
  }
97162
97238
  var NO_PLACEMENT_ROOTS, VARIANT_ROOT_POSITION;
97163
97239
  var init_variant_value_graph = __esm({
97164
- "../src/database/variant-value-graph.ts"() {
97240
+ "../packages/neoscript-runtime/src/values/variant-value-graph.ts"() {
97165
97241
  "use strict";
97166
97242
  init_members();
97167
- init_classes();
97168
97243
  init_core();
97169
97244
  init_constructor_argument_ownership();
97170
97245
  NO_PLACEMENT_ROOTS = [];
@@ -97174,7 +97249,7 @@ var init_variant_value_graph = __esm({
97174
97249
  }
97175
97250
  });
97176
97251
 
97177
- // ../src/models/variants/variants.ts
97252
+ // ../packages/models/src/variants/variants.ts
97178
97253
  function isNonEmptyString2(value) {
97179
97254
  if (typeof value !== "string") return false;
97180
97255
  return value.length > 0;
@@ -97206,7 +97281,7 @@ function isNeoClassVariantFolder(value) {
97206
97281
  }
97207
97282
  var NEO_VARIANT_INITIALIZE_SCHEMA_KEY, NEO_VARIANT_APPLY_SCHEMA_KEY, NEO_VARIANT_OVERRIDES_SCHEMA_KEY, NEO_VARIANT_CHILD_OVERRIDES_SCHEMA_KEY;
97208
97283
  var init_variants = __esm({
97209
- "../src/models/variants/variants.ts"() {
97284
+ "../packages/models/src/variants/variants.ts"() {
97210
97285
  "use strict";
97211
97286
  NEO_VARIANT_INITIALIZE_SCHEMA_KEY = "Initialize";
97212
97287
  NEO_VARIANT_APPLY_SCHEMA_KEY = "Apply";
@@ -97215,7 +97290,7 @@ var init_variants = __esm({
97215
97290
  }
97216
97291
  });
97217
97292
 
97218
- // ../src/database/canonical-json.ts
97293
+ // ../packages/neoscript-runtime/src/values/canonical-json.ts
97219
97294
  function canonicalJsonStringify(value) {
97220
97295
  return JSON.stringify(toCanonicalJsonValue(value));
97221
97296
  }
@@ -97260,13 +97335,13 @@ function toCanonicalJsonValue(value) {
97260
97335
  return canonicalObject;
97261
97336
  }
97262
97337
  var init_canonical_json = __esm({
97263
- "../src/database/canonical-json.ts"() {
97338
+ "../packages/neoscript-runtime/src/values/canonical-json.ts"() {
97264
97339
  "use strict";
97265
97340
  init_value_comparison();
97266
97341
  }
97267
97342
  });
97268
97343
 
97269
- // ../src/runtime/effective-value-reader.ts
97344
+ // ../packages/neoscript-runtime/src/effective-value-reader.ts
97270
97345
  function rootReadScope(document) {
97271
97346
  const cached = rootReadScopes.get(document);
97272
97347
  if (cached !== void 0 && cached.members === document.members && cached.values === document.values && cached.variants === document.variants) {
@@ -97542,7 +97617,7 @@ function isAggregateTypeInfo2(type) {
97542
97617
  }
97543
97618
  var rootReadScopes, EffectiveValueReader;
97544
97619
  var init_effective_value_reader = __esm({
97545
- "../src/runtime/effective-value-reader.ts"() {
97620
+ "../packages/neoscript-runtime/src/effective-value-reader.ts"() {
97546
97621
  "use strict";
97547
97622
  init_canonical_json();
97548
97623
  init_effective_value_comparison();
@@ -97950,7 +98025,7 @@ var init_effective_value_reader = __esm({
97950
98025
  }
97951
98026
  });
97952
98027
 
97953
- // ../src/runtime/virtual-instance-values.ts
98028
+ // ../packages/neoscript-runtime/src/virtual-instance-values.ts
97954
98029
  function expandStoredInstance2(args) {
97955
98030
  return expandStoredInstance({
97956
98031
  ...args,
@@ -97976,7 +98051,7 @@ function resolveStoredClassValue2(args) {
97976
98051
  });
97977
98052
  }
97978
98053
  var init_virtual_instance_values = __esm({
97979
- "../src/runtime/virtual-instance-values.ts"() {
98054
+ "../packages/neoscript-runtime/src/virtual-instance-values.ts"() {
97980
98055
  "use strict";
97981
98056
  init_evaluateInitializer();
97982
98057
  init_virtual_instance_graph();
@@ -98072,9 +98147,7 @@ function compileDelegateClosureValue(code, signature) {
98072
98147
  var init_compile_delegate_closure = __esm({
98073
98148
  "../src/database/neoscript/compile-delegate-closure.ts"() {
98074
98149
  "use strict";
98075
- init_members();
98076
98150
  init_neoscript_guards();
98077
- init_neoscript_types();
98078
98151
  init_compile();
98079
98152
  }
98080
98153
  });
@@ -98918,7 +98991,7 @@ var init_document_initializer_compiler = __esm({
98918
98991
  }
98919
98992
  });
98920
98993
 
98921
- // ../src/runtime/materialize-values.ts
98994
+ // ../packages/neoscript-runtime/src/materialize-values.ts
98922
98995
  function materializeInitializerValue2(args) {
98923
98996
  return materializeInitializerValue({
98924
98997
  ...args,
@@ -98926,7 +98999,7 @@ function materializeInitializerValue2(args) {
98926
98999
  });
98927
99000
  }
98928
99001
  var init_materialize_values = __esm({
98929
- "../src/runtime/materialize-values.ts"() {
99002
+ "../packages/neoscript-runtime/src/materialize-values.ts"() {
98930
99003
  "use strict";
98931
99004
  init_evaluateInitializer();
98932
99005
  init_initializer_materialization();
@@ -99054,7 +99127,7 @@ var init_project_read_base = __esm({
99054
99127
  }
99055
99128
  });
99056
99129
 
99057
- // ../src/models/dialogue/dialogue-types.ts
99130
+ // ../packages/models/src/dialogue/dialogue-types.ts
99058
99131
  function isNonArrayObject(value) {
99059
99132
  if (!isRequiredType(value, isObject)) return false;
99060
99133
  return !Array.isArray(value);
@@ -99351,18 +99424,17 @@ function isDialogue(value) {
99351
99424
  return isDialogueProps(value);
99352
99425
  }
99353
99426
  var init_dialogue_types2 = __esm({
99354
- "../src/models/dialogue/dialogue-types.ts"() {
99427
+ "../packages/models/src/dialogue/dialogue-types.ts"() {
99355
99428
  "use strict";
99356
99429
  init_core_types();
99357
99430
  init_structural_narrow();
99358
- init_member_kind_enum();
99359
99431
  init_logic_types();
99360
99432
  init_neoscript_guards();
99361
99433
  init_dialogue_source_identifiers();
99362
99434
  }
99363
99435
  });
99364
99436
 
99365
- // ../src/models/dialogue/priority-types.ts
99437
+ // ../packages/models/src/dialogue/priority-types.ts
99366
99438
  function isPriorityTypeBase(value) {
99367
99439
  const v = value;
99368
99440
  if (typeof v !== "object") return false;
@@ -99403,7 +99475,7 @@ function isPriorityGroup(value) {
99403
99475
  }
99404
99476
  var DEFAULT_PRIORITY_OPTION_IDS, DefaultPriorityGroup;
99405
99477
  var init_priority_types = __esm({
99406
- "../src/models/dialogue/priority-types.ts"() {
99478
+ "../packages/models/src/dialogue/priority-types.ts"() {
99407
99479
  "use strict";
99408
99480
  init_core_types();
99409
99481
  DEFAULT_PRIORITY_OPTION_IDS = {
@@ -100696,7 +100768,7 @@ var init_project_document_read = __esm({
100696
100768
  }
100697
100769
  });
100698
100770
 
100699
- // ../src/models/localization/localized-text-create-envelope.ts
100771
+ // ../packages/models/src/localization/localized-text-create-envelope.ts
100700
100772
  function completeLocalizedTextCreateEnvelope(data, config) {
100701
100773
  const text = asUnknownRecord(data);
100702
100774
  if (text === null) return data;
@@ -100751,7 +100823,7 @@ function asUnknownRecord(value) {
100751
100823
  return value;
100752
100824
  }
100753
100825
  var init_localized_text_create_envelope = __esm({
100754
- "../src/models/localization/localized-text-create-envelope.ts"() {
100826
+ "../packages/models/src/localization/localized-text-create-envelope.ts"() {
100755
100827
  "use strict";
100756
100828
  init_localization_types();
100757
100829
  }
@@ -101567,7 +101639,6 @@ var init_neo_script_recompile_scope = __esm({
101567
101639
  init_lexer();
101568
101640
  init_generated_csharp_identifiers();
101569
101641
  init_dialogue_group_language();
101570
- init_member_kind_enum();
101571
101642
  init_member_kinds();
101572
101643
  init_inheritance();
101573
101644
  init_effective_storage();
@@ -102555,7 +102626,6 @@ var UNIVERSAL_SEARCH_MAX_SUBTITLE_BYTES, utf8Encoder;
102555
102626
  var init_universal_search_projection = __esm({
102556
102627
  "../src/models/search/universal-search-projection.ts"() {
102557
102628
  "use strict";
102558
- init_classes();
102559
102629
  UNIVERSAL_SEARCH_MAX_SUBTITLE_BYTES = 512;
102560
102630
  utf8Encoder = new TextEncoder();
102561
102631
  }
@@ -102956,7 +103026,6 @@ var init_valueHeadPlacementGraph = __esm({
102956
103026
  init_classes();
102957
103027
  init_member_kinds();
102958
103028
  init_universal_search_projection();
102959
- init_member_kinds();
102960
103029
  }
102961
103030
  });
102962
103031
 
@@ -103837,7 +103906,6 @@ var init_packed_value_write_fold = __esm({
103837
103906
  init_project();
103838
103907
  init_member_kinds();
103839
103908
  init_effective_distribution();
103840
- init_member_subtree_distribution();
103841
103909
  init_packed_value_encoding();
103842
103910
  init_canonical_json();
103843
103911
  init_constructor_argument_ownership();
@@ -104068,9 +104136,6 @@ var init_project_version_relation_sweep_trigger = __esm({
104068
104136
  var init_packed_root_merge = __esm({
104069
104137
  "../src/database/packed-root-merge.ts"() {
104070
104138
  "use strict";
104071
- init_member_kinds();
104072
- init_packed_value_encoding();
104073
- init_project();
104074
104139
  }
104075
104140
  });
104076
104141
 
@@ -104089,8 +104154,6 @@ var init_immediate_commit_rules = __esm({
104089
104154
  "../src/database/immediate-commit-rules.ts"() {
104090
104155
  "use strict";
104091
104156
  init_core();
104092
- init_member_kinds();
104093
- init_packed_value_encoding();
104094
104157
  init_packed_root_merge();
104095
104158
  init_project_record_semantics();
104096
104159
  WORLD_LAYER_LINK_KINDS = /* @__PURE__ */ new Set([
@@ -106986,7 +107049,6 @@ var init_project_commit_preparation_scoped_loader = __esm({
106986
107049
  init_primary_localized_text_writes();
106987
107050
  init_localization_types();
106988
107051
  init_member_localization();
106989
- init_member_kind_enum();
106990
107052
  init_members();
106991
107053
  init_inheritance();
106992
107054
  init_core();
@@ -107312,7 +107374,6 @@ var init_dialogue_context_resolver = __esm({
107312
107374
  "../src/models/dialogue-context-resolver.ts"() {
107313
107375
  "use strict";
107314
107376
  init_member_kinds();
107315
- init_dialogue_group_types();
107316
107377
  init_neoscript_types();
107317
107378
  }
107318
107379
  });
@@ -107666,7 +107727,6 @@ function isPrimitiveTextVariableType(typeInfo) {
107666
107727
  var init_dialogue_logic_compile_pure = __esm({
107667
107728
  "../src/database/dialogue-logic-compile-pure.ts"() {
107668
107729
  "use strict";
107669
- init_members();
107670
107730
  init_logic_types();
107671
107731
  init_neoscript();
107672
107732
  init_dialogue_context_resolver2();
@@ -107674,15 +107734,14 @@ var init_dialogue_logic_compile_pure = __esm({
107674
107734
  }
107675
107735
  });
107676
107736
 
107677
- // ../src/runtime/neoscript/index.ts
107737
+ // ../packages/neoscript-runtime/src/neoscript/index.ts
107678
107738
  var init_neoscript2 = __esm({
107679
- "../src/runtime/neoscript/index.ts"() {
107739
+ "../packages/neoscript-runtime/src/neoscript/index.ts"() {
107680
107740
  "use strict";
107681
107741
  init_NSGetterRuntimeError();
107682
107742
  init_evaluateNSGetter();
107683
107743
  init_evaluateInitializer();
107684
107744
  init_initializer_context();
107685
- init_getter_subscriptions();
107686
107745
  }
107687
107746
  });
107688
107747
 
@@ -109013,10 +109072,11 @@ function migrationMemberListenerRows(document, writes, copied) {
109013
109072
  const map = root.changeListeners;
109014
109073
  const entry = map[write.ownerId] ?? {};
109015
109074
  const inherited = reader.listenerDefaultsForOwner(write.ownerId)?.[write.memberId] ?? [];
109016
- const edit = editChangeListenerSet(entry[write.memberId], inherited, {
109017
- kind: write.operation,
109018
- target: write.listener
109019
- });
109075
+ const edit = editChangeListenerSet(
109076
+ entry[write.memberId],
109077
+ inherited,
109078
+ changeListenerWriteEdit(write)
109079
+ );
109020
109080
  if (!edit.changed) continue;
109021
109081
  if (edit.targets === void 0) delete entry[write.memberId];
109022
109082
  else entry[write.memberId] = edit.targets;
@@ -109049,11 +109109,12 @@ var init_project_migration_member_listeners = __esm({
109049
109109
  init_members();
109050
109110
  init_project_root_members();
109051
109111
  init_member_change_listeners();
109112
+ init_listener_write_index();
109052
109113
  init_authored_listener_endpoints();
109053
109114
  }
109054
109115
  });
109055
109116
 
109056
- // ../src/runtime/tile-class-conversion.ts
109117
+ // ../packages/neoscript-runtime/src/tile-class-conversion.ts
109057
109118
  function planTileClassConversion(args) {
109058
109119
  if (args.storedRoot.classId === args.targetClassId) {
109059
109120
  return { nextRoot: args.storedRoot, creates: [] };
@@ -109111,7 +109172,7 @@ function record6(value) {
109111
109172
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
109112
109173
  }
109113
109174
  var init_tile_class_conversion = __esm({
109114
- "../src/runtime/tile-class-conversion.ts"() {
109175
+ "../packages/neoscript-runtime/src/tile-class-conversion.ts"() {
109115
109176
  "use strict";
109116
109177
  init_instance_provenance();
109117
109178
  init_virtual_instance_values();
@@ -109379,15 +109440,8 @@ function compileProjectMigrationAction(document, migration) {
109379
109440
  var init_project_migration_runner = __esm({
109380
109441
  "../src/database/project-migration-runner.ts"() {
109381
109442
  "use strict";
109382
- init_evaluateNSGetter();
109383
109443
  init_project_migration_member_listeners();
109384
109444
  init_compiler_adapter();
109385
- init_neoscript2();
109386
- init_members();
109387
- init_packed_value_encoding();
109388
- init_project_root_members();
109389
- init_virtual_instance_values();
109390
- init_tile_class_conversion();
109391
109445
  init_project_version_intents();
109392
109446
  init_compile_ns_property();
109393
109447
  init_project_migration_created_values();
@@ -109713,11 +109767,6 @@ var SourceBodyCompileError, VOID_ACTION_TYPE_INFO, BOOL_TYPE_INFO, STRING_TYPE_I
109713
109767
  var init_general_function_call_ir_source_recompile = __esm({
109714
109768
  "../src/database/general-function-call-ir-source-recompile.ts"() {
109715
109769
  "use strict";
109716
- init_members();
109717
- init_core();
109718
- init_dialogue_types2();
109719
- init_logic_types();
109720
- init_inheritance();
109721
109770
  init_project_content_hash();
109722
109771
  init_project_document_read();
109723
109772
  init_compile_ns_property();
@@ -109725,7 +109774,6 @@ var init_general_function_call_ir_source_recompile = __esm({
109725
109774
  init_dialogue_logic_compile_pure();
109726
109775
  init_project_migration_runner();
109727
109776
  init_compiler_adapter();
109728
- init_neoscript();
109729
109777
  init_dialogue_node_index();
109730
109778
  init_strict_ir();
109731
109779
  init_neo_script_derived_bodies();
@@ -116527,7 +116575,6 @@ var init_user_delegate_target_validation = __esm({
116527
116575
  "../src/database/user-delegate-target-validation.ts"() {
116528
116576
  "use strict";
116529
116577
  init_member_kinds();
116530
- init_member_storage();
116531
116578
  init_effective_storage();
116532
116579
  init_project_root_members();
116533
116580
  init_project_schema_index();
@@ -116623,7 +116670,6 @@ var init_animation_clips = __esm({
116623
116670
  init_member_kinds();
116624
116671
  init_structured_leaf_fields();
116625
116672
  init_effective_storage();
116626
- init_member_storage();
116627
116673
  init_neoscript_types();
116628
116674
  init_neoscript_guards();
116629
116675
  init_members();
@@ -118197,7 +118243,6 @@ var init_projectVariantValidation = __esm({
118197
118243
  "use strict";
118198
118244
  init_generated_csharp_identifiers();
118199
118245
  init_project_source_variants();
118200
- init_classes();
118201
118246
  VARIANT_WORLD_KIND = "variant";
118202
118247
  VARIANT_FOLDER_WORLD_KIND = "variantFolder";
118203
118248
  LOOKUP_VARIANT_WORLD_KIND = "lookupVariant";
@@ -120775,7 +120820,6 @@ var init_projectInterfaceValidation = __esm({
120775
120820
  init_generated_csharp_identifiers();
120776
120821
  init_project_source_identifiers();
120777
120822
  init_classes();
120778
- init_interface_types();
120779
120823
  init_member_kinds();
120780
120824
  init_float32();
120781
120825
  init_stored_value_shape();
@@ -121408,8 +121452,6 @@ var SYSTEM_OWNED_OPERATIONS;
121408
121452
  var init_reserved_record_id_validation = __esm({
121409
121453
  "../src/database/reserved-record-id-validation.ts"() {
121410
121454
  "use strict";
121411
- init_system_record_id();
121412
- init_world_system_classes();
121413
121455
  SYSTEM_OWNED_OPERATIONS = /* @__PURE__ */ new Set([
121414
121456
  "migration",
121415
121457
  "version-create"
@@ -133978,7 +134020,6 @@ var init_value_sources = __esm({
133978
134020
  init_constructor_argument_ownership();
133979
134021
  init_compile();
133980
134022
  init_variant_value_graph();
133981
- init_classes();
133982
134023
  init_world_system_classes();
133983
134024
  init_members();
133984
134025
  init_instance_provenance();
@@ -139154,8 +139195,12 @@ ${statements.join("\n")}
139154
139195
  STATIC_MEMBER_OWNERSHIP_RECOVERY_SOURCE
139155
139196
  );
139156
139197
  }
139198
+ const formatSource = options.formatSource;
139157
139199
  return {
139158
- files,
139200
+ files: formatSource ? files.map((file) => ({
139201
+ ...file,
139202
+ content: formatSource(file.path, file.content)
139203
+ })) : files,
139159
139204
  recordFiles,
139160
139205
  materializedConstructors,
139161
139206
  materializedConstructorOverrideKeys,
@@ -143412,6 +143457,7 @@ var init_dialogue_status_cache = __esm({
143412
143457
  // node_modules/ignore/index.js
143413
143458
  var require_ignore = __commonJS({
143414
143459
  "node_modules/ignore/index.js"(exports, module) {
143460
+ "use strict";
143415
143461
  function makeArray(subject) {
143416
143462
  return Array.isArray(subject) ? subject : [subject];
143417
143463
  }
@@ -145904,6 +145950,52 @@ var init_status_output = __esm({
145904
145950
  }
145905
145951
  });
145906
145952
 
145953
+ // ../packages/neoscript-language/src/node-format-options.ts
145954
+ import { parseSync } from "editorconfig";
145955
+ function readNeoScriptFormatOptions(path, fallback = {}, cache) {
145956
+ const config = parseSync(path, cache ? { cache } : {});
145957
+ const indentSize = config.indent_size === "tab" ? config.tab_width : config.indent_size;
145958
+ const options = {
145959
+ ...DEFAULT_NEO_SCRIPT_FORMAT_OPTIONS,
145960
+ ...fallback,
145961
+ ...config.indent_style === "tab" || config.indent_style === "space" ? { insertSpaces: config.indent_style === "space" } : {},
145962
+ ...typeof indentSize === "number" && Number.isInteger(indentSize) && indentSize > 0 && indentSize <= 100 ? { tabSize: indentSize } : {},
145963
+ ...config.end_of_line === "lf" ? { endOfLine: "\n" } : {},
145964
+ ...config.end_of_line === "crlf" ? { endOfLine: "\r\n" } : {},
145965
+ ...config.end_of_line === "cr" ? { endOfLine: "\r" } : {},
145966
+ ...typeof config.insert_final_newline === "boolean" ? { finalNewline: config.insert_final_newline } : {},
145967
+ ...typeof config.trim_trailing_whitespace === "boolean" ? { trimTrailingWhitespace: config.trim_trailing_whitespace } : {}
145968
+ };
145969
+ return options;
145970
+ }
145971
+ function createNeoScriptFormatOptionsResolver() {
145972
+ const cache = /* @__PURE__ */ new Map();
145973
+ return (path, fallback) => readNeoScriptFormatOptions(path, fallback, cache);
145974
+ }
145975
+ var init_node_format_options = __esm({
145976
+ "../packages/neoscript-language/src/node-format-options.ts"() {
145977
+ "use strict";
145978
+ init_formatter();
145979
+ }
145980
+ });
145981
+
145982
+ // src/project-source/workspace-format.ts
145983
+ import { join as join10 } from "node:path";
145984
+ function createWorkspaceSourceFormatter(root) {
145985
+ const optionsFor = createNeoScriptFormatOptionsResolver();
145986
+ return (path, source) => formatNeoScript(source, {
145987
+ ...optionsFor(join10(root, path)),
145988
+ kind: "definition"
145989
+ });
145990
+ }
145991
+ var init_workspace_format = __esm({
145992
+ "src/project-source/workspace-format.ts"() {
145993
+ "use strict";
145994
+ init_formatter();
145995
+ init_node_format_options();
145996
+ }
145997
+ });
145998
+
145907
145999
  // src/project-source/project-file-source-preservation.ts
145908
146000
  function applySourceEdits(source, edits, start = 0, end = source.length) {
145909
146001
  const chunks = [];
@@ -154988,6 +155080,7 @@ function gzipSync(data, opts) {
154988
155080
  var require2, _a, Worker4, isMarkedAsUntransferable, u8, u16, i32, fleb, fdeb, clim, freb, _a, fl, revfl, _b, fd, revfd, rev, x, i, hMap, flt, i, i, i, i, fdt, i, flm, fdm, shft, slc, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, deo, et, dflt, crct, crc, dopt, wbytes, gzh, gzhl, td, tds;
154989
155081
  var init_esm = __esm({
154990
155082
  "../node_modules/fflate/esm/index.mjs"() {
155083
+ "use strict";
154991
155084
  require2 = createRequire("/");
154992
155085
  try {
154993
155086
  _a = require2("worker_threads"), Worker4 = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable;
@@ -155554,7 +155647,6 @@ var init_client_commit_transport = __esm({
155554
155647
  var init_project_version_semver = __esm({
155555
155648
  "../src/database/project-version-semver.ts"() {
155556
155649
  "use strict";
155557
- init_project();
155558
155650
  }
155559
155651
  });
155560
155652
 
@@ -155563,10 +155655,8 @@ var ProjectVersionBumpRequiredError;
155563
155655
  var init_project_version_compatibility = __esm({
155564
155656
  "../src/database/project-version-compatibility.ts"() {
155565
155657
  "use strict";
155566
- init_project();
155567
155658
  init_project_version_semver();
155568
155659
  init_project_version_intents();
155569
- init_internal_record_relations();
155570
155660
  ProjectVersionBumpRequiredError = class extends Error {
155571
155661
  response;
155572
155662
  constructor(response) {
@@ -155968,25 +156058,25 @@ var init_client_commit_submit = __esm({
155968
156058
  import { spawn } from "node:child_process";
155969
156059
  import { createHash as createHash9 } from "node:crypto";
155970
156060
  import { existsSync as existsSync9, readFileSync as readFileSync12, readdirSync as readdirSync3 } from "node:fs";
155971
- import { join as join10, relative as relative5, sep as sep5 } from "node:path";
156061
+ import { join as join11, relative as relative5, sep as sep5 } from "node:path";
155972
156062
  function fingerprintPushInputs(workspace, options = {}) {
155973
156063
  const paths = /* @__PURE__ */ new Set([
155974
- join10(workspace.root, "neo.json"),
156064
+ join11(workspace.root, "neo.json"),
155975
156065
  ...listProjectSourceFilesV4(workspace.root),
155976
156066
  ...options.includeTests === false ? [] : listProjectTestFilesV1(workspace.root),
155977
- ...workspace.config.unityConfigPath === void 0 ? [] : [join10(workspace.root, workspace.config.unityConfigPath)]
156067
+ ...workspace.config.unityConfigPath === void 0 ? [] : [join11(workspace.root, workspace.config.unityConfigPath)]
155978
156068
  ]);
155979
156069
  const visitManaged = (directory) => {
155980
156070
  if (!existsSync9(directory)) return;
155981
156071
  for (const entry of readdirSync3(directory, { withFileTypes: true })) {
155982
156072
  if (entry.isSymbolicLink()) continue;
155983
- const path = join10(directory, entry.name);
156073
+ const path = join11(directory, entry.name);
155984
156074
  if (entry.isDirectory()) visitManaged(path);
155985
156075
  else if (entry.isFile()) paths.add(path);
155986
156076
  }
155987
156077
  };
155988
- visitManaged(join10(workspace.root, "Files", "Images"));
155989
- visitManaged(join10(workspace.root, "Files", "AudioClips"));
156078
+ visitManaged(join11(workspace.root, "Files", "Images"));
156079
+ visitManaged(join11(workspace.root, "Files", "AudioClips"));
155990
156080
  const hash = createHash9("sha256");
155991
156081
  for (const path of [...paths].sort()) {
155992
156082
  const name = relative5(workspace.root, path).split(sep5).join("/");
@@ -156165,7 +156255,7 @@ import {
156165
156255
  writeFileSync as writeFileSync10
156166
156256
  } from "node:fs";
156167
156257
  import { tmpdir } from "node:os";
156168
- import { join as join11 } from "node:path";
156258
+ import { join as join12 } from "node:path";
156169
156259
  async function pullProjectBinariesV4(args) {
156170
156260
  const resolvePath = createWorkspaceSourcePathResolver(args.workspace.root);
156171
156261
  const plans = /* @__PURE__ */ new Map();
@@ -156231,7 +156321,7 @@ async function pullProjectBinariesV4(args) {
156231
156321
  try {
156232
156322
  const stagedPaths = /* @__PURE__ */ new Map();
156233
156323
  if (downloads.length > 0) {
156234
- stagingDirectory = mkdtempSync(join11(tmpdir(), "neo-pull-files-"));
156324
+ stagingDirectory = mkdtempSync(join12(tmpdir(), "neo-pull-files-"));
156235
156325
  const directory = stagingDirectory;
156236
156326
  const client = args.client ?? NeoApiClient.forBaseUrl(args.workspace.config.apiBaseUrl);
156237
156327
  await mapWithConcurrency(
@@ -156249,7 +156339,7 @@ async function pullProjectBinariesV4(args) {
156249
156339
  `Project file ${plan.fileId} content changed while pull was in progress (${plan.remoteDigest} -> ${response.sha256}). Pull again against a stable version head.`
156250
156340
  );
156251
156341
  }
156252
- const stagedPath = join11(directory, String(index));
156342
+ const stagedPath = join12(directory, String(index));
156253
156343
  writeFileSync10(stagedPath, response.bytes);
156254
156344
  stagedPaths.set(plan.fileId, stagedPath);
156255
156345
  }
@@ -156418,7 +156508,7 @@ function fileName(data) {
156418
156508
  }
156419
156509
  function removePreviousConflict(root, state) {
156420
156510
  if (state?.conflict?.artifactPath === void 0) return;
156421
- rmSync6(join11(root, state.conflict.artifactPath), { force: true });
156511
+ rmSync6(join12(root, state.conflict.artifactPath), { force: true });
156422
156512
  }
156423
156513
  var DOWNLOAD_CONCURRENCY;
156424
156514
  var init_project_file_pull = __esm({
@@ -156435,7 +156525,7 @@ var init_project_file_pull = __esm({
156435
156525
  });
156436
156526
 
156437
156527
  // src/project-source/project-file-push.ts
156438
- import { join as join12 } from "node:path";
156528
+ import { join as join13 } from "node:path";
156439
156529
  import { readFileSync as readFileSync14 } from "node:fs";
156440
156530
  import { randomUUID as randomUUID4 } from "node:crypto";
156441
156531
  async function cleanupRejectedProjectFilePushesV4(args) {
@@ -156499,7 +156589,7 @@ function prepareProjectFilePushesV4(args) {
156499
156589
  `Project file ${recordId} has upload bytes but its source change has no record data.`
156500
156590
  );
156501
156591
  }
156502
- const absolute = join12(args.workspace.root, binary.path);
156592
+ const absolute = join13(args.workspace.root, binary.path);
156503
156593
  const bytes = new Uint8Array(readFileSync14(absolute));
156504
156594
  const digest2 = sha256Bytes(bytes);
156505
156595
  if (binary.localSha256 !== null && digest2 !== binary.localSha256) {
@@ -157126,9 +157216,7 @@ function collectNeoScriptFileReferences(roots, files) {
157126
157216
  var init_neoscript_file_references = __esm({
157127
157217
  "../src/models/exports/neoscript-file-references.ts"() {
157128
157218
  "use strict";
157129
- init_member_kind_enum();
157130
157219
  init_neoscript_guards();
157131
- init_neoscript_types();
157132
157220
  }
157133
157221
  });
157134
157222
 
@@ -157502,6 +157590,7 @@ function parseNumberSkeleton(tokens) {
157502
157590
  var DATE_TIME_REGEX, WHITE_SPACE_REGEX, FRACTION_PRECISION_REGEX, SIGNIFICANT_PRECISION_REGEX, INTEGER_WIDTH_REGEX, CONCISE_INTEGER_WIDTH_REGEX;
157503
157591
  var init_icu_skeleton_parser = __esm({
157504
157592
  "../node_modules/@formatjs/icu-skeleton-parser/index.js"() {
157593
+ "use strict";
157505
157594
  DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;
157506
157595
  WHITE_SPACE_REGEX = /[\t-\r \x85\u200E\u200F\u2028\u2029]/i;
157507
157596
  FRACTION_PRECISION_REGEX = /^\.(?:(0+)(\*)?|(#+)|(0+)(#+))$/g;
@@ -157680,6 +157769,7 @@ function parse3(message, opts = {}) {
157680
157769
  var ErrorKind, SPACE_SEPARATOR_REGEX, IDENTIFIER_PREFIX_REGEX, timeData, SPACE_SEPARATOR_START_REGEX, SPACE_SEPARATOR_END_REGEX, hasNativeFromEntries, hasTrimStart, hasTrimEnd, fromEntries, trimStart, trimEnd, IDENTIFIER_PREFIX_RE, Parser2;
157681
157770
  var init_icu_messageformat_parser = __esm({
157682
157771
  "../node_modules/@formatjs/icu-messageformat-parser/index.js"() {
157772
+ "use strict";
157683
157773
  init_icu_skeleton_parser();
157684
157774
  ErrorKind = /* @__PURE__ */ (function(ErrorKind2) {
157685
157775
  ErrorKind2[ErrorKind2["EXPECT_ARGUMENT_CLOSING_BRACE"] = 1] = "EXPECT_ARGUMENT_CLOSING_BRACE";
@@ -160449,7 +160539,6 @@ var init_project_unity_export_utils = __esm({
160449
160539
  init_classes();
160450
160540
  init_generics();
160451
160541
  init_core();
160452
- init_files();
160453
160542
  init_localization_types();
160454
160543
  init_members();
160455
160544
  init_project_unity_localization_smart_format();
@@ -160521,7 +160610,7 @@ var init_project_unity_export_utils = __esm({
160521
160610
  }
160522
160611
  });
160523
160612
 
160524
- // ../src/models/interfaces/interface-conformance.ts
160613
+ // ../packages/models/src/interfaces/interface-conformance.ts
160525
160614
  function functionsCompatible(left, right) {
160526
160615
  if (!isInterfaceFunctionMember(left) || !isInterfaceFunctionMember(right)) {
160527
160616
  return false;
@@ -160932,10 +161021,9 @@ function resolveMemberImplementation(schemaClass2, group, context) {
160932
161021
  return { state: "conforming", member, schemaEntry };
160933
161022
  }
160934
161023
  var init_interface_conformance = __esm({
160935
- "../src/models/interfaces/interface-conformance.ts"() {
161024
+ "../packages/models/src/interfaces/interface-conformance.ts"() {
160936
161025
  "use strict";
160937
161026
  init_member_kinds();
160938
- init_member_storage();
160939
161027
  init_classes();
160940
161028
  init_generics();
160941
161029
  init_inheritance();
@@ -168816,7 +168904,6 @@ var init_generate_unity_classes = __esm({
168816
168904
  init_interface_types();
168817
168905
  init_interface_graph();
168818
168906
  init_internal_record_relations();
168819
- init_dialogue_group_types();
168820
168907
  init_inheritance();
168821
168908
  init_neoscript();
168822
168909
  init_unity_codegen_docs();
@@ -168996,7 +169083,6 @@ function buildProjectUnityExport(document, metadata, fileReferenceCache) {
168996
169083
  var init_project_version_contracts = __esm({
168997
169084
  "../src/database/project-version-contracts.ts"() {
168998
169085
  "use strict";
168999
- init_project();
169000
169086
  init_project_unity_export_utils();
169001
169087
  init_unity_codegen_docs();
169002
169088
  init_generate_unity_classes();
@@ -169004,7 +169090,7 @@ var init_project_version_contracts = __esm({
169004
169090
  }
169005
169091
  });
169006
169092
 
169007
- // ../src/models/dialogue/dialogue-diagnostics.ts
169093
+ // ../packages/models/src/dialogue/dialogue-diagnostics.ts
169008
169094
  function buildDialogueSemanticDiagnostics(args) {
169009
169095
  const context = buildDialogueSemanticDiagnosticContext(args);
169010
169096
  const diagnostics = args.dialogues.flatMap(
@@ -171363,7 +171449,7 @@ function optionLabel(option) {
171363
171449
  return option.id;
171364
171450
  }
171365
171451
  var init_dialogue_diagnostics = __esm({
171366
- "../src/models/dialogue/dialogue-diagnostics.ts"() {
171452
+ "../packages/models/src/dialogue/dialogue-diagnostics.ts"() {
171367
171453
  "use strict";
171368
171454
  init_members();
171369
171455
  init_inheritance();
@@ -171371,9 +171457,6 @@ var init_dialogue_diagnostics = __esm({
171371
171457
  init_interface_types();
171372
171458
  init_interface_graph();
171373
171459
  init_neoscript();
171374
- init_dialogue_types2();
171375
- init_dialogue_group_types();
171376
- init_logic_types();
171377
171460
  init_core();
171378
171461
  init_lookup_declared_type();
171379
171462
  init_members();
@@ -172140,7 +172223,6 @@ var init_project_unity_export_diagnostics = __esm({
172140
172223
  "use strict";
172141
172224
  init_project_world_placement_bindings();
172142
172225
  init_dialogue_diagnostics();
172143
- init_dialogue_types2();
172144
172226
  init_members();
172145
172227
  init_core_types();
172146
172228
  init_inheritance();
@@ -172172,7 +172254,7 @@ var init_project_unity_export_types = __esm({
172172
172254
  "../src/models/exports/project-unity-export-types.ts"() {
172173
172255
  "use strict";
172174
172256
  init_unity_codegen_revision();
172175
- PROJECT_UNITY_EXPORT_SCHEMA_VERSION = 40;
172257
+ PROJECT_UNITY_EXPORT_SCHEMA_VERSION = 41;
172176
172258
  }
172177
172259
  });
172178
172260
 
@@ -172545,14 +172627,14 @@ var init_local_export_preparation = __esm({
172545
172627
  // src/unity-export-artifacts.ts
172546
172628
  import { createHash as createHash11 } from "node:crypto";
172547
172629
  import { readFileSync as readFileSync15 } from "node:fs";
172548
- import { join as join13 } from "node:path";
172630
+ import { join as join14 } from "node:path";
172549
172631
  function hashBytes(bytes) {
172550
172632
  return createHash11("sha256").update(bytes).digest("hex");
172551
172633
  }
172552
172634
  function readUnityExportArtifact(root, hash) {
172553
172635
  if (!/^[a-f0-9]{64}$/.test(hash)) return void 0;
172554
172636
  try {
172555
- const content = readFileSync15(join13(root, ARTIFACTS_PATH, hash));
172637
+ const content = readFileSync15(join14(root, ARTIFACTS_PATH, hash));
172556
172638
  return hashBytes(content) === hash ? content : void 0;
172557
172639
  } catch {
172558
172640
  return void 0;
@@ -172794,10 +172876,10 @@ import {
172794
172876
  unlinkSync as unlinkSync2,
172795
172877
  writeFileSync as writeFileSync11
172796
172878
  } from "node:fs";
172797
- import { basename as basename2, dirname as dirname9, join as join14 } from "node:path";
172879
+ import { basename as basename2, dirname as dirname9, join as join15 } from "node:path";
172798
172880
  function writeUnityFile(path, content) {
172799
172881
  mkdirSync10(dirname9(path), { recursive: true });
172800
- const temporary = join14(
172882
+ const temporary = join15(
172801
172883
  dirname9(path),
172802
172884
  `.${basename2(path)}.${randomUUID5()}.tmp`
172803
172885
  );
@@ -172863,7 +172945,7 @@ function readManifest(path, content = readFileIfExists(path)) {
172863
172945
  return { projectId: data.projectId, codegenRevision, files };
172864
172946
  }
172865
172947
  function unityGeneratedOutputHashes(directory, projectId) {
172866
- const manifestPath = join14(directory, MANIFEST_FILE);
172948
+ const manifestPath = join15(directory, MANIFEST_FILE);
172867
172949
  const manifestBytes = readFileIfExists(manifestPath);
172868
172950
  if (manifestBytes === null) return null;
172869
172951
  const manifest = readManifest(manifestPath, manifestBytes);
@@ -172874,7 +172956,7 @@ function unityGeneratedOutputHashes(directory, projectId) {
172874
172956
  hashes.set(manifestPath, sha256(manifestBytes));
172875
172957
  for (const file of manifest.files) {
172876
172958
  if (file.hash === null) return null;
172877
- const path = join14(directory, file.path);
172959
+ const path = join15(directory, file.path);
172878
172960
  const bytes = readFileIfExists(path);
172879
172961
  if (bytes === null || sha256(bytes) !== file.hash) return null;
172880
172962
  hashes.set(path, file.hash);
@@ -172900,7 +172982,7 @@ function planUnityGeneratedFiles(directory, projectId, files) {
172900
172982
  if (file.content.trim().length === 0)
172901
172983
  throw new Error(`Empty generated C# file: ${file.path}`);
172902
172984
  }
172903
- const manifestPath = join14(directory, MANIFEST_FILE);
172985
+ const manifestPath = join15(directory, MANIFEST_FILE);
172904
172986
  const manifest = readManifest(manifestPath);
172905
172987
  const previousFiles = manifest?.files ?? [];
172906
172988
  const previousById = new Map(previousFiles.map((file) => [file.id, file]));
@@ -172913,23 +172995,23 @@ function planUnityGeneratedFiles(directory, projectId, files) {
172913
172995
  if (incomingById.get(file.id)?.path === file.path && manifest?.projectId === projectId)
172914
172996
  continue;
172915
172997
  operations.push(
172916
- [join14(directory, file.path), null],
172917
- [join14(directory, file.path + ".meta"), null]
172998
+ [join15(directory, file.path), null],
172999
+ [join15(directory, file.path + ".meta"), null]
172918
173000
  );
172919
173001
  }
172920
173002
  operations.push(
172921
- [join14(directory, "NeoGeneratedTypes.cs"), null],
172922
- [join14(directory, "NeoGeneratedTypes.cs.meta"), null]
173003
+ [join15(directory, "NeoGeneratedTypes.cs"), null],
173004
+ [join15(directory, "NeoGeneratedTypes.cs.meta"), null]
172923
173005
  );
172924
173006
  for (const file of files) {
172925
173007
  const old = manifest?.projectId === projectId ? previousById.get(file.id) : void 0;
172926
- const path = join14(directory, file.path);
173008
+ const path = join15(directory, file.path);
172927
173009
  if (old !== void 0 && old.path !== file.path) {
172928
173010
  if (!previousPaths.has(file.path.toLowerCase()) && (existsSync11(path) || existsSync11(path + ".meta")))
172929
173011
  throw new Error(
172930
173012
  `Generated rename destination is not owned by the manifest: ${file.path}`
172931
173013
  );
172932
- const meta = join14(directory, old.path + ".meta");
173014
+ const meta = join15(directory, old.path + ".meta");
172933
173015
  operations.push([
172934
173016
  path + ".meta",
172935
173017
  existsSync11(meta) ? readFileSync16(meta, "utf8") : null
@@ -173008,7 +173090,7 @@ var init_unity_generated_files = __esm({
173008
173090
  // src/export-cache.ts
173009
173091
  import { createHash as createHash14 } from "node:crypto";
173010
173092
  import { readFileSync as readFileSync17, readdirSync as readdirSync4, rmSync as rmSync8 } from "node:fs";
173011
- import { basename as basename3, dirname as dirname10, join as join15, relative as relative6, sep as sep6 } from "node:path";
173093
+ import { basename as basename3, dirname as dirname10, join as join16, relative as relative6, sep as sep6 } from "node:path";
173012
173094
  function readIfExists(path) {
173013
173095
  try {
173014
173096
  return readFileSync17(path);
@@ -173019,10 +173101,10 @@ function readIfExists(path) {
173019
173101
  }
173020
173102
  }
173021
173103
  function isManagedOutput(path, target, jsonDirectories) {
173022
- if (path === join15(target.projectJsonDirectory, "project.json")) return true;
173104
+ if (path === join16(target.projectJsonDirectory, "project.json")) return true;
173023
173105
  if (jsonDirectories.has(dirname10(path)) && basename3(path).endsWith(".json"))
173024
173106
  return true;
173025
- if (path === join15(target.generatedTypesDirectory, "NeoGeneratedFiles.json"))
173107
+ if (path === join16(target.generatedTypesDirectory, "NeoGeneratedFiles.json"))
173026
173108
  return true;
173027
173109
  const generated = relative6(target.generatedTypesDirectory, path).split(sep6).join("/");
173028
173110
  return /^Generated\/[a-zA-Z0-9_%./-]+\.g\.cs$/.test(generated) && generated.split("/").every((part) => part !== "." && part !== ".." && part !== "");
@@ -173117,7 +173199,7 @@ function jsonFiles(directory) {
173117
173199
  function readReceipt(root) {
173118
173200
  try {
173119
173201
  const cache = JSON.parse(
173120
- readFileSync17(join15(root, CACHE_PATH), "utf8")
173202
+ readFileSync17(join16(root, CACHE_PATH), "utf8")
173121
173203
  );
173122
173204
  if (!isObjectRecord2(cache) || typeof cache.hash !== "string") return null;
173123
173205
  if (!isReceipt(cache.receipt)) return null;
@@ -173231,7 +173313,7 @@ var init_export_cache = __esm({
173231
173313
  if (receipt.inputHash !== inputHash) return null;
173232
173314
  if (receipt.exportStateHash !== exportStateHash(state)) return null;
173233
173315
  const directories = /* @__PURE__ */ new Set([
173234
- join15(target.projectJsonDirectory, "Partitions"),
173316
+ join16(target.projectJsonDirectory, "Partitions"),
173235
173317
  target.localizationResourcesDirectory,
173236
173318
  target.localizationStreamingAssetsDirectory
173237
173319
  ]);
@@ -173255,7 +173337,7 @@ var init_export_cache = __esm({
173255
173337
  for (const directory of receipt.jsonDirectories) {
173256
173338
  const expected = new Set(directory.files);
173257
173339
  for (const file of jsonFiles(directory.path))
173258
- if (!expected.has(file)) deletes.push(join15(directory.path, file));
173340
+ if (!expected.has(file)) deletes.push(join16(directory.path, file));
173259
173341
  }
173260
173342
  } catch {
173261
173343
  return null;
@@ -173272,7 +173354,7 @@ var init_export_cache = __esm({
173272
173354
  retained.add(output.hash);
173273
173355
  if (previousHashes.has(output.hash) && !this.artifactsIncomplete)
173274
173356
  continue;
173275
- const artifact = join15(root, ARTIFACTS_PATH, output.hash);
173357
+ const artifact = join16(root, ARTIFACTS_PATH, output.hash);
173276
173358
  const cached = readIfExists(artifact);
173277
173359
  if (cached !== void 0 && hashBytes(cached) === output.hash) continue;
173278
173360
  const content = contents.get(output.path) ?? readIfExists(output.path);
@@ -173280,7 +173362,7 @@ var init_export_cache = __esm({
173280
173362
  writeUnityFile(artifact, content);
173281
173363
  }
173282
173364
  writeUnityFile(
173283
- join15(root, CACHE_PATH),
173365
+ join16(root, CACHE_PATH),
173284
173366
  JSON.stringify({
173285
173367
  hash: hashBytes(JSON.stringify(receipt)),
173286
173368
  receipt
@@ -173288,7 +173370,7 @@ var init_export_cache = __esm({
173288
173370
  );
173289
173371
  for (const hash of previousHashes)
173290
173372
  if (!retained.has(hash))
173291
- rmSync8(join15(root, ARTIFACTS_PATH, hash), { force: true });
173373
+ rmSync8(join16(root, ARTIFACTS_PATH, hash), { force: true });
173292
173374
  this.artifactsIncomplete = false;
173293
173375
  this.root = root;
173294
173376
  this.receipt = receipt;
@@ -173299,9 +173381,9 @@ var init_export_cache = __esm({
173299
173381
 
173300
173382
  // src/export-state.ts
173301
173383
  import { existsSync as existsSync12, readFileSync as readFileSync18 } from "node:fs";
173302
- import { join as join16 } from "node:path";
173384
+ import { join as join17 } from "node:path";
173303
173385
  function readExportState(root) {
173304
- const path = join16(root, EXPORT_STATE_FILE);
173386
+ const path = join17(root, EXPORT_STATE_FILE);
173305
173387
  if (!existsSync12(path)) return null;
173306
173388
  const parsed = JSON.parse(readFileSync18(path, "utf8"));
173307
173389
  if (typeof parsed !== "object" || parsed === null) {
@@ -173369,7 +173451,7 @@ function readStringMap(path, field, value) {
173369
173451
  return map;
173370
173452
  }
173371
173453
  function writeExportState(root, state) {
173372
- const path = join16(root, EXPORT_STATE_FILE);
173454
+ const path = join17(root, EXPORT_STATE_FILE);
173373
173455
  const content = `${JSON.stringify(state)}
173374
173456
  `;
173375
173457
  if (existsSync12(path) && readFileSync18(path, "utf8") === content) return;
@@ -173381,7 +173463,7 @@ var init_export_state = __esm({
173381
173463
  "use strict";
173382
173464
  init_value_comparison();
173383
173465
  init_unity_generated_files();
173384
- EXPORT_STATE_FILE = join16(".neo", "export.json");
173466
+ EXPORT_STATE_FILE = join17(".neo", "export.json");
173385
173467
  }
173386
173468
  });
173387
173469
 
@@ -173449,7 +173531,6 @@ var RECORD_BOOKKEEPING, CONSTRUCTOR_BODIES;
173449
173531
  var init_unity_codegen_fingerprint = __esm({
173450
173532
  "src/unity-codegen-fingerprint.ts"() {
173451
173533
  "use strict";
173452
- init_member_kind_enum();
173453
173534
  init_unity_codegen_revision();
173454
173535
  init_compiler();
173455
173536
  init_registry();
@@ -173475,11 +173556,11 @@ import {
173475
173556
  readdirSync as readdirSync5,
173476
173557
  statSync as statSync3
173477
173558
  } from "node:fs";
173478
- import { dirname as dirname11, join as join17, relative as relative7, resolve as resolve3, sep as sep7 } from "node:path";
173559
+ import { dirname as dirname11, join as join18, relative as relative7, resolve as resolve3, sep as sep7 } from "node:path";
173479
173560
  async function resolveUnityExportTarget(workspace, unityProject) {
173480
173561
  if (unityProject !== null) {
173481
173562
  const root = resolve3(unityProject);
173482
- if (!isDirectory(join17(root, "Assets"))) {
173563
+ if (!isDirectory(join18(root, "Assets"))) {
173483
173564
  throw new Error(
173484
173565
  `--unity-project "${root}" is not a Unity project: it has no Assets/ folder.`
173485
173566
  );
@@ -173503,7 +173584,7 @@ ${candidates.map((path) => ` ${path}`).join("\n")}`
173503
173584
  const assetPath = resolve3(workspace.root, linked);
173504
173585
  const root = findAncestor(
173505
173586
  dirname11(assetPath),
173506
- (directory) => isDirectory(join17(directory, "Assets"))
173587
+ (directory) => isDirectory(join18(directory, "Assets"))
173507
173588
  );
173508
173589
  if (root === null) {
173509
173590
  throw new Error(
@@ -173517,7 +173598,7 @@ ${candidates.map((path) => ` ${path}`).join("\n")}`
173517
173598
  async function linkDetectedConfigAsset(workspace) {
173518
173599
  const root = findAncestor(
173519
173600
  workspace.root,
173520
- (directory) => isDirectory(join17(directory, "Assets")) && existsSync13(join17(directory, "ProjectSettings", "ProjectVersion.txt"))
173601
+ (directory) => isDirectory(join18(directory, "Assets")) && existsSync13(join18(directory, "ProjectSettings", "ProjectVersion.txt"))
173521
173602
  );
173522
173603
  if (root === null) {
173523
173604
  throw new Error(
@@ -173530,7 +173611,7 @@ async function linkDetectedConfigAsset(workspace) {
173530
173611
  );
173531
173612
  const linkLine = (path) => `"unityConfigPath": "${relativeConfigPath(workspace.root, path)}"`;
173532
173613
  if (candidates.length === 0) {
173533
- const found = assets.length === 0 ? `no NeoComposeConfig asset under "${join17(root, "Assets")}"` : `NeoComposeConfig assets for other projects:
173614
+ const found = assets.length === 0 ? `no NeoComposeConfig asset under "${join18(root, "Assets")}"` : `NeoComposeConfig assets for other projects:
173534
173615
  ${assets.map((path) => ` ${path}`).join("\n")}`;
173535
173616
  throw new Error(
173536
173617
  `"${NEO_CONFIG_FILE}" has no "unityConfigPath", and the Unity project "${root}" has ${found}
@@ -173581,7 +173662,7 @@ function readUnityExportTarget(unityProjectRoot, configAssetPath) {
173581
173662
  `Unity config asset "${configAssetPath}" field "${name}": ${normalized.error}`
173582
173663
  );
173583
173664
  }
173584
- return join17(unityProjectRoot, normalized);
173665
+ return join18(unityProjectRoot, normalized);
173585
173666
  };
173586
173667
  const streaming = field("useStreamingAssetsForNonMainLocales");
173587
173668
  if (streaming !== "0" && streaming !== "1") {
@@ -173644,7 +173725,7 @@ function findConfigAssets(unityProjectRoot) {
173644
173725
  const visit = (directory) => {
173645
173726
  for (const entry of readdirSync5(directory, { withFileTypes: true })) {
173646
173727
  if (entry.name.startsWith(".")) continue;
173647
- const path = join17(directory, entry.name);
173728
+ const path = join18(directory, entry.name);
173648
173729
  if (entry.isDirectory()) {
173649
173730
  if (!entry.name.endsWith("~")) visit(path);
173650
173731
  continue;
@@ -173665,7 +173746,7 @@ function findConfigAssets(unityProjectRoot) {
173665
173746
  }
173666
173747
  }
173667
173748
  };
173668
- visit(join17(unityProjectRoot, "Assets"));
173749
+ visit(join18(unityProjectRoot, "Assets"));
173669
173750
  return found.sort();
173670
173751
  }
173671
173752
  function findAncestor(start, matches) {
@@ -173702,7 +173783,7 @@ __export(export_exports, {
173702
173783
  });
173703
173784
  import { createHash as createHash16, randomUUID as randomUUID6 } from "node:crypto";
173704
173785
  import { existsSync as existsSync14, readFileSync as readFileSync20, readdirSync as readdirSync6 } from "node:fs";
173705
- import { join as join18 } from "node:path";
173786
+ import { join as join19 } from "node:path";
173706
173787
  async function runExport(workspace, options, session) {
173707
173788
  const inputs = exportInputs(workspace);
173708
173789
  const target = await resolveUnityExportTarget(
@@ -173888,7 +173969,7 @@ async function exportUnityProject(args) {
173888
173969
  const read2 = lap();
173889
173970
  let schemaSkew2 = null;
173890
173971
  for (const { path, content, current } of cached.writes) {
173891
- if (path === join18(target.projectJsonDirectory, "project.json"))
173972
+ if (path === join19(target.projectJsonDirectory, "project.json"))
173892
173973
  schemaSkew2 = replacedSchemaVersion(current, content);
173893
173974
  writeUnityFile(path, content);
173894
173975
  }
@@ -174031,18 +174112,18 @@ ${errors.map((error) => ` ${formatDiagnostic(error)}`).join("\n")}`
174031
174112
  const planned = /* @__PURE__ */ new Set([
174032
174113
  ...dataFileBytes.keys(),
174033
174114
  ...localizationFiles.writes.keys(),
174034
- join18(target.generatedTypesDirectory, "NeoGeneratedFiles.json")
174115
+ join19(target.generatedTypesDirectory, "NeoGeneratedFiles.json")
174035
174116
  ]);
174036
174117
  const staleFiles = [
174037
174118
  ...staleJsonFiles(
174038
- join18(target.projectJsonDirectory, PARTITIONS_DIRECTORY),
174119
+ join19(target.projectJsonDirectory, PARTITIONS_DIRECTORY),
174039
174120
  planned
174040
174121
  ),
174041
174122
  ...localizationFiles.directories.flatMap(
174042
174123
  (directory) => staleJsonFiles(directory, planned)
174043
174124
  )
174044
174125
  ];
174045
- const projectJsonPath = join18(target.projectJsonDirectory, PROJECT_JSON_FILE);
174126
+ const projectJsonPath = join19(target.projectJsonDirectory, PROJECT_JSON_FILE);
174046
174127
  let schemaSkew = null;
174047
174128
  onPhase(`Writing changed files into ${target.unityProjectRoot}\u2026`);
174048
174129
  const written = [];
@@ -174125,7 +174206,7 @@ ${errors.map((error) => ` ${formatDiagnostic(error)}`).join("\n")}`
174125
174206
  outputHashes: dataFileHashes,
174126
174207
  generatedOutputHashes: currentGeneratedOutputs ?? /* @__PURE__ */ new Map(),
174127
174208
  jsonDirectories: [
174128
- join18(target.projectJsonDirectory, PARTITIONS_DIRECTORY),
174209
+ join19(target.projectJsonDirectory, PARTITIONS_DIRECTORY),
174129
174210
  ...localizationFiles.directories
174130
174211
  ],
174131
174212
  localChanges: source.localChanges,
@@ -174222,19 +174303,19 @@ function planDataFiles(target, metadata, unityExport) {
174222
174303
  ];
174223
174304
  const files = /* @__PURE__ */ new Map();
174224
174305
  files.set(
174225
- join18(target.projectJsonDirectory, MAIN_PARTITION_FILE),
174306
+ join19(target.projectJsonDirectory, MAIN_PARTITION_FILE),
174226
174307
  JSON.stringify(values, null, 4)
174227
174308
  );
174228
174309
  for (const key of Object.keys(valuePartitions).sort(compareOrdinal)) {
174229
174310
  const file = `${PARTITIONS_DIRECTORY}/${partitionFileName(key)}`;
174230
174311
  partitions.push({ key, file });
174231
174312
  files.set(
174232
- join18(target.projectJsonDirectory, file),
174313
+ join19(target.projectJsonDirectory, file),
174233
174314
  JSON.stringify(valuePartitions[key], null, 4)
174234
174315
  );
174235
174316
  }
174236
174317
  files.set(
174237
- join18(target.projectJsonDirectory, PROJECT_JSON_FILE),
174318
+ join19(target.projectJsonDirectory, PROJECT_JSON_FILE),
174238
174319
  JSON.stringify({ metadata, partitions, ...schema }, null, 4)
174239
174320
  );
174240
174321
  return files;
@@ -174260,7 +174341,7 @@ function planLocalizationFiles(target, unityExport, args) {
174260
174341
  for (const file of files) {
174261
174342
  if (!isSafeLocalizationFileName(file.fileName)) continue;
174262
174343
  const directory = target.useStreamingAssetsForNonMainLocales && file.locale !== mainLocale ? target.localizationStreamingAssetsDirectory : target.localizationResourcesDirectory;
174263
- writes.set(join18(directory, file.fileName), file.content);
174344
+ writes.set(join19(directory, file.fileName), file.content);
174264
174345
  }
174265
174346
  return {
174266
174347
  writes,
@@ -174282,7 +174363,7 @@ function staleJsonFiles(directory, planned) {
174282
174363
  const stale = [];
174283
174364
  for (const entry of readdirSync6(directory, { withFileTypes: true })) {
174284
174365
  if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
174285
- const path = join18(directory, entry.name);
174366
+ const path = join19(directory, entry.name);
174286
174367
  if (!planned.has(path)) stale.push(path);
174287
174368
  }
174288
174369
  return stale;
@@ -174305,8 +174386,8 @@ function replacedSchemaVersion(current, next) {
174305
174386
  return schemaVersion === PROJECT_UNITY_EXPORT_SCHEMA_VERSION ? null : schemaVersion;
174306
174387
  }
174307
174388
  function writeSidecar(unityProjectRoot, args) {
174308
- const directory = join18(unityProjectRoot, "Library", "NeoCompose");
174309
- const path = join18(directory, "export.json");
174389
+ const directory = join19(unityProjectRoot, "Library", "NeoCompose");
174390
+ const path = join19(directory, "export.json");
174310
174391
  if (args.nothingWritten && existsSync14(path)) {
174311
174392
  let current;
174312
174393
  try {
@@ -174314,7 +174395,7 @@ function writeSidecar(unityProjectRoot, args) {
174314
174395
  } catch {
174315
174396
  current = null;
174316
174397
  }
174317
- const ingestedPath = join18(directory, "export.ingested");
174398
+ const ingestedPath = join19(directory, "export.ingested");
174318
174399
  if (typeof current === "object" && current !== null && "exportId" in current && typeof current.exportId === "string" && JSON.stringify({ ...current, exportId: args.sidecar.exportId }) === JSON.stringify(args.sidecar) && existsSync14(ingestedPath) && readFileSync20(ingestedPath, "utf8").trim() === current.exportId) {
174319
174400
  return false;
174320
174401
  }
@@ -174509,7 +174590,7 @@ var init_identity_ledger = __esm({
174509
174590
 
174510
174591
  // src/commands/push-body-diagnostics.ts
174511
174592
  import { existsSync as existsSync15, readFileSync as readFileSync21 } from "node:fs";
174512
- import { join as join19 } from "node:path";
174593
+ import { join as join20 } from "node:path";
174513
174594
  function createNeoScriptBodySourceLocator(workspace, status) {
174514
174595
  const textByFile = /* @__PURE__ */ new Map();
174515
174596
  return {
@@ -174531,7 +174612,7 @@ function createNeoScriptBodySourceLocator(workspace, status) {
174531
174612
  textOf(file) {
174532
174613
  const cached = textByFile.get(file);
174533
174614
  if (cached !== void 0) return cached;
174534
- const path = join19(workspace.root, file);
174615
+ const path = join20(workspace.root, file);
174535
174616
  const text = existsSync15(path) ? readFileSync21(path, "utf8") : null;
174536
174617
  textByFile.set(file, text);
174537
174618
  return text;
@@ -174697,7 +174778,7 @@ import {
174697
174778
  readFileSync as readFileSync22,
174698
174779
  statSync as statSync4
174699
174780
  } from "node:fs";
174700
- import { join as join20, relative as relative8, sep as sep8 } from "node:path";
174781
+ import { join as join21, relative as relative8, sep as sep8 } from "node:path";
174701
174782
  function assignPendingIds(changes, authoredValueSeeds, reconstructed3, previousLedger = {}) {
174702
174783
  const assigned = /* @__PURE__ */ new Map();
174703
174784
  const minted = /* @__PURE__ */ new Map();
@@ -175226,7 +175307,7 @@ ${blockingErrors.map((error) => ` ${error.message}`).join("\n")}`
175226
175307
  binaryChanges: status.binaryChanges ?? []
175227
175308
  });
175228
175309
  const hasSourceBodies = (status.sourceSnapshot?.analysis.compiledBodies.length ?? 0) > 0;
175229
- if (status.changes.length === 0 && status.authoredValueSeeds.size === 0 && (!hasSourceBodies || purpose === "export" /* Export */)) {
175310
+ if (status.changes.length === 0 && status.authoredValueSeeds.size === 0 && options.forceRecompile !== true && (!hasSourceBodies || purpose !== "evaluation" /* Evaluation */)) {
175230
175311
  return status;
175231
175312
  }
175232
175313
  const initConversions = status.initConversions ?? [];
@@ -175249,6 +175330,7 @@ ${blockingErrors.map((error) => ` ${error.message}`).join("\n")}`
175249
175330
  const bodySourceLocator = createNeoScriptBodySourceLocator(workspace, status);
175250
175331
  const compileContext = compileSchema === null ? null : prepareCompleteNeoScriptBodyChanges(workspace, status, compileSchema, {
175251
175332
  completeSweep: options.forceRecompile === true,
175333
+ refreshSourceLocations: purpose === "evaluation" /* Evaluation */,
175252
175334
  bodySourceLocator
175253
175335
  });
175254
175336
  const now = candidateTimestamp(purpose);
@@ -175351,7 +175433,7 @@ async function pushWorkspace(workspace, options, preparationOverride, confirmed
175351
175433
  );
175352
175434
  }
175353
175435
  if (options.noVerify !== true) {
175354
- const preparedBuildDir = configuredHook === void 0 ? void 0 : join20(
175436
+ const preparedBuildDir = configuredHook === void 0 ? void 0 : join21(
175355
175437
  workspace.root,
175356
175438
  ".neo",
175357
175439
  "test-build",
@@ -175368,7 +175450,7 @@ async function pushWorkspace(workspace, options, preparationOverride, confirmed
175368
175450
  const documentJson = JSON.stringify(candidate.document);
175369
175451
  mkdirSync11(preparedBuildDir, { recursive: true });
175370
175452
  writeFileSync12(
175371
- join20(preparedBuildDir, "candidate.json"),
175453
+ join21(preparedBuildDir, "candidate.json"),
175372
175454
  `${JSON.stringify({
175373
175455
  version: 1,
175374
175456
  projectFingerprint: `sha256:${preparedLocal.source.sourceHash}`,
@@ -176746,7 +176828,7 @@ function authoredMemberFormsByFile(root, alternates) {
176746
176828
  for (const alternate of alternates) {
176747
176829
  let existing = contents.get(alternate.path);
176748
176830
  if (existing === void 0) {
176749
- const absolute = join20(root, alternate.path);
176831
+ const absolute = join21(root, alternate.path);
176750
176832
  existing = existsSync16(absolute) ? readFileSync22(absolute, "utf8") : null;
176751
176833
  contents.set(alternate.path, existing);
176752
176834
  }
@@ -176817,20 +176899,20 @@ function rewriteFilesFromState(workspace, records3 = new Map(
176817
176899
  const authoredSources = new Map(
176818
176900
  sourceSnapshot?.inputs.map((input) => [input.uri, input.text])
176819
176901
  );
176902
+ const formatSource = createWorkspaceSourceFormatter(workspace.root);
176820
176903
  const files = result.files.map((file) => {
176821
176904
  const preserved = preservedSourceFiles.get(file.path);
176822
176905
  if (preserved !== void 0 && preservedFileMatchesEmission(preserved, file.content)) {
176823
176906
  return { ...file, content: preserved };
176824
176907
  }
176825
- const path = join20(workspace.root, file.path);
176908
+ const path = join21(workspace.root, file.path);
176826
176909
  const authored = preserved ?? authoredSources.get(file.path) ?? (existsSync16(path) ? readFileSync22(path, "utf8") : void 0);
176827
- return {
176828
- ...file,
176829
- content: restoreAuthoredMemberForms(
176830
- authored === void 0 ? file.content : preserveProjectFileRegistrySource(authored, file.content, records3),
176831
- authoredForms.get(file.path) ?? []
176832
- )
176833
- };
176910
+ const restored = restoreAuthoredMemberForms(
176911
+ authored === void 0 ? file.content : preserveProjectFileRegistrySource(authored, file.content, records3),
176912
+ authoredForms.get(file.path) ?? []
176913
+ );
176914
+ const content = authored !== void 0 && sameNeoScriptTokens(authored, restored, "documentation") ? authored : formatSource(file.path, restored);
176915
+ return { ...file, content };
176834
176916
  });
176835
176917
  const finalInputs = files.map((file) => {
176836
176918
  const kind = neoProjectSourceKind(file.path, file.content);
@@ -177376,6 +177458,12 @@ function compileNSFunctionChange(context, memberData, locator) {
177376
177458
  }
177377
177459
  function prepareCompleteNeoScriptBodyChanges(workspace, status, schema, options = {}) {
177378
177460
  const completeSweep = options.completeSweep ?? false;
177461
+ const refreshSourceLocations = completeSweep || options.refreshSourceLocations === true;
177462
+ const changedSources = new Set(
177463
+ status.changes.map(
177464
+ (change) => recordStateKey(change.recordKind, change.recordId)
177465
+ )
177466
+ );
177379
177467
  const context = createPostPushCompileContext(schema);
177380
177468
  const locator = options.bodySourceLocator ?? createNeoScriptBodySourceLocator(workspace, status);
177381
177469
  const bodyKey = (owner, name, unit) => JSON.stringify([owner, name, unit]);
@@ -177421,6 +177509,8 @@ function prepareCompleteNeoScriptBodyChanges(workspace, status, schema, options
177421
177509
  ]) {
177422
177510
  for (const row of records3) {
177423
177511
  if (typeof row.id !== "string") continue;
177512
+ if (!refreshSourceLocations && !changedSources.has(recordStateKey(kind, row.id)))
177513
+ continue;
177424
177514
  const owner = kind === "constructor" ? context.classesById.get(String(row.classId)) : context.ownersByMemberId.get(row.id);
177425
177515
  if (typeof owner?.name !== "string") continue;
177426
177516
  const sources2 = {};
@@ -177807,6 +177897,8 @@ var compileNSVoidBody2, compileNSFunction2, compileNSGetter2, compileNSSetter2,
177807
177897
  var init_push = __esm({
177808
177898
  "src/commands/push.ts"() {
177809
177899
  "use strict";
177900
+ init_workspace_format();
177901
+ init_lexer();
177810
177902
  init_dialogue_group_symbols();
177811
177903
  init_dialogue_source_diagnostic();
177812
177904
  init_lower_constructors();
@@ -178603,7 +178695,7 @@ import {
178603
178695
  rmSync as rmSync10,
178604
178696
  writeFileSync as writeFileSync13
178605
178697
  } from "node:fs";
178606
- import { dirname as dirname12, join as join21, relative as relative9, sep as sep9 } from "node:path";
178698
+ import { dirname as dirname12, join as join22, relative as relative9, sep as sep9 } from "node:path";
178607
178699
  function prepareWorkspaceResetV4(workspace, document, options = {}) {
178608
178700
  const emissionRecords = options.regenerateSourceNames ? regenerateDialogueSourceNamesV4(document.records) : document.records;
178609
178701
  const layoutWorkspace = workspaceForSourceLayoutV4(workspace, document);
@@ -178617,6 +178709,7 @@ function prepareWorkspaceResetV4(workspace, document, options = {}) {
178617
178709
  dialogueGroupSymbols
178618
178710
  );
178619
178711
  const emitted = emitProjectDocumentFilesV4(emissionRecords, {
178712
+ formatSource: createWorkspaceSourceFormatter(workspace.root),
178620
178713
  localValues,
178621
178714
  dialogueGroupSymbols,
178622
178715
  binaryPaths: workspaceBinaryPathsV4(workspace, status?.binaryFiles),
@@ -178644,10 +178737,10 @@ function resetWorkspaceToProjectSourcesV4(workspace, document, options = {}) {
178644
178737
  rmSync10(resolveSourcePath(path), { force: true });
178645
178738
  }
178646
178739
  for (const file of LEGACY_ROOT_FILES) {
178647
- rmSync10(join21(workspace.root, file), { force: true });
178740
+ rmSync10(join22(workspace.root, file), { force: true });
178648
178741
  }
178649
178742
  for (const privatePath of LEGACY_PRIVATE_PATHS) {
178650
- rmSync10(join21(workspace.root, privatePath), { recursive: true, force: true });
178743
+ rmSync10(join22(workspace.root, privatePath), { recursive: true, force: true });
178651
178744
  }
178652
178745
  for (const file of emitted.files) {
178653
178746
  const absolute = resolveSourcePath(file.path);
@@ -178718,6 +178811,7 @@ var LEGACY_ROOT_FILES, LEGACY_PRIVATE_PATHS;
178718
178811
  var init_reset = __esm({
178719
178812
  "src/project-source/reset.ts"() {
178720
178813
  "use strict";
178814
+ init_workspace_format();
178721
178815
  init_dialogue_group_symbols();
178722
178816
  init_language_spec();
178723
178817
  init_source_layout();
@@ -179215,6 +179309,7 @@ async function finishFormat4Pull(args) {
179215
179309
  workspace,
179216
179310
  layoutStatus?.binaryFiles
179217
179311
  );
179312
+ const formatSource = createWorkspaceSourceFormatter(workspace.root);
179218
179313
  const localResult = emitProjectDocumentFilesV4(
179219
179314
  candidateValueRecordsForEmissionV4(
179220
179315
  localRecords,
@@ -179222,6 +179317,7 @@ async function finishFormat4Pull(args) {
179222
179317
  workspace.config.projectId
179223
179318
  ),
179224
179319
  {
179320
+ formatSource,
179225
179321
  localValues,
179226
179322
  binaryPaths,
179227
179323
  recordFiles,
@@ -179233,7 +179329,13 @@ async function finishFormat4Pull(args) {
179233
179329
  }
179234
179330
  const serverResult = conflictCount === 0 ? null : emitProjectDocumentFilesV4(
179235
179331
  buildEmitRecordSet(document, plans, "server"),
179236
- { recordFiles, localValues, binaryPaths, dialogueGroupSymbols }
179332
+ {
179333
+ formatSource,
179334
+ recordFiles,
179335
+ localValues,
179336
+ binaryPaths,
179337
+ dialogueGroupSymbols
179338
+ }
179237
179339
  );
179238
179340
  const resolveSourcePath = createWorkspaceSourcePathResolver(workspace.root);
179239
179341
  if (!destructive && Object.keys(workspace.state.records).length === 0) {
@@ -179717,6 +179819,7 @@ function composeProspectivePullRecord(recordKind, recordId, data, serverRecord)
179717
179819
  var init_pull = __esm({
179718
179820
  "src/commands/pull.ts"() {
179719
179821
  "use strict";
179822
+ init_workspace_format();
179720
179823
  init_dialogue_group_symbols();
179721
179824
  init_project_file_source_preservation();
179722
179825
  init_push();
@@ -179754,7 +179857,7 @@ __export(init_exports, {
179754
179857
  runInit: () => runInit
179755
179858
  });
179756
179859
  import { existsSync as existsSync19, mkdirSync as mkdirSync14, readFileSync as readFileSync25, writeFileSync as writeFileSync15 } from "node:fs";
179757
- import { join as join22, resolve as resolve4 } from "node:path";
179860
+ import { join as join23, resolve as resolve4 } from "node:path";
179758
179861
  async function runInit(options) {
179759
179862
  let projectId = options.projectId;
179760
179863
  let projects = [];
@@ -179851,8 +179954,8 @@ async function runInit(options) {
179851
179954
  }) : "neo";
179852
179955
  }
179853
179956
  const root = resolve4(directory);
179854
- if (existsSync19(join22(root, NEO_CONFIG_FILE))) {
179855
- throw new Error(`"${join22(root, NEO_CONFIG_FILE)}" already exists.`);
179957
+ if (existsSync19(join23(root, NEO_CONFIG_FILE))) {
179958
+ throw new Error(`"${join23(root, NEO_CONFIG_FILE)}" already exists.`);
179856
179959
  }
179857
179960
  mkdirSync14(root, { recursive: true });
179858
179961
  await acquireWorkspaceLock(root, "init");
@@ -179878,7 +179981,7 @@ async function runInit(options) {
179878
179981
  });
179879
179982
  }
179880
179983
  function ensurePrivateStateIgnored(root) {
179881
- const path = join22(root, ".gitignore");
179984
+ const path = join23(root, ".gitignore");
179882
179985
  const existing = existsSync19(path) ? readFileSync25(path, "utf8") : "";
179883
179986
  if (existing.split(/\r?\n/u).some((line) => line.trim() === ".neo/" || line.trim() === ".neo")) {
179884
179987
  return;
@@ -180849,7 +180952,6 @@ var init_project_integrity = __esm({
180849
180952
  "use strict";
180850
180953
  init_member_storage_key();
180851
180954
  init_system_record_id();
180852
- init_member_kind_enum();
180853
180955
  init_value_comparison();
180854
180956
  init_stored_value_placements();
180855
180957
  UNORDERED_MEMBERSHIP_KEY = "(container)";
@@ -181226,7 +181328,7 @@ var init_neoscript_language_adapter = __esm({
181226
181328
  }
181227
181329
  });
181228
181330
 
181229
- // ../src/models/members/member-change-listener-patches.ts
181331
+ // ../packages/models/src/members/member-change-listener-patches.ts
181230
181332
  function validateChangeListenerOwnerPatches(patches) {
181231
181333
  if (patches.length === 0)
181232
181334
  throw new Error("A listener patch must edit at least one owner.");
@@ -181284,7 +181386,7 @@ function applyChangeListenerOwnerPatches(current, patches) {
181284
181386
  return Object.keys(next).length === 0 ? void 0 : next;
181285
181387
  }
181286
181388
  var init_member_change_listener_patches = __esm({
181287
- "../src/models/members/member-change-listener-patches.ts"() {
181389
+ "../packages/models/src/members/member-change-listener-patches.ts"() {
181288
181390
  "use strict";
181289
181391
  init_core();
181290
181392
  init_member_kinds();
@@ -181563,13 +181665,13 @@ var init_game_save_record_read2 = __esm({
181563
181665
  }
181564
181666
  });
181565
181667
 
181566
- // ../src/models/save-overlay-resolution.ts
181668
+ // ../packages/models/src/save-overlay-resolution.ts
181567
181669
  function isRemovedEntry(entry) {
181568
181670
  return typeof entry === "object" && entry !== null && Reflect.get(entry, "mark") === REMOVED_MARK;
181569
181671
  }
181570
181672
  var REMOVED_MARK;
181571
181673
  var init_save_overlay_resolution = __esm({
181572
- "../src/models/save-overlay-resolution.ts"() {
181674
+ "../packages/models/src/save-overlay-resolution.ts"() {
181573
181675
  "use strict";
181574
181676
  REMOVED_MARK = "removed";
181575
181677
  }
@@ -183139,8 +183241,6 @@ var init_script = __esm({
183139
183241
  init_save_overlay_resolution();
183140
183242
  init_members();
183141
183243
  init_neoscript();
183142
- init_dialogue_types2();
183143
- init_logic_types();
183144
183244
  init_dialogue_logic_compile_pure();
183145
183245
  init_project_migration_runner();
183146
183246
  init_inheritance();
@@ -183188,7 +183288,7 @@ import {
183188
183288
  basename as basename4,
183189
183289
  dirname as dirname14,
183190
183290
  isAbsolute as isAbsolute3,
183191
- join as join23,
183291
+ join as join24,
183192
183292
  relative as relative10,
183193
183293
  resolve as resolve5,
183194
183294
  sep as sep10
@@ -183401,7 +183501,7 @@ function preparedHookCandidate(workspace) {
183401
183501
  );
183402
183502
  }
183403
183503
  const parsed = JSON.parse(
183404
- readFileSync27(join23(directory, "candidate.json"), "utf8")
183504
+ readFileSync27(join24(directory, "candidate.json"), "utf8")
183405
183505
  );
183406
183506
  if (!isRecord12(parsed)) {
183407
183507
  throw new NeoTestPreparedCandidateError(
@@ -183458,7 +183558,7 @@ function fingerprintTestCandidateInputs(workspace) {
183458
183558
  }
183459
183559
  function testCandidateCachePath(workspace, inputFingerprint) {
183460
183560
  const cacheKey = createHash18("sha256").update(inputFingerprint).digest("hex");
183461
- return join23(
183561
+ return join24(
183462
183562
  workspace.root,
183463
183563
  ".neo",
183464
183564
  "test-build",
@@ -183483,7 +183583,7 @@ function cachedTestCandidate(workspace, inputFingerprint) {
183483
183583
  }
183484
183584
  if (typeof parsed.documentSha256 !== "string") return null;
183485
183585
  const documentJson = readFileSync27(
183486
- join23(dirname14(candidatePath), "document.json"),
183586
+ join24(dirname14(candidatePath), "document.json"),
183487
183587
  "utf8"
183488
183588
  );
183489
183589
  if (createHash18("sha256").update(documentJson).digest("hex") !== parsed.documentSha256) {
@@ -183504,7 +183604,7 @@ function cacheTestCandidate(workspace, inputFingerprint, candidate) {
183504
183604
  const documentJson = JSON.stringify(candidate.document);
183505
183605
  const documentSha256 = createHash18("sha256").update(documentJson).digest("hex");
183506
183606
  const candidatePath = testCandidateCachePath(workspace, inputFingerprint);
183507
- atomicWrite(join23(dirname14(candidatePath), "document.json"), documentJson);
183607
+ atomicWrite(join24(dirname14(candidatePath), "document.json"), documentJson);
183508
183608
  atomicWrite(
183509
183609
  candidatePath,
183510
183610
  JSON.stringify({
@@ -183571,7 +183671,7 @@ function compileSpec(workspace, compile, absolutePath, projectCompilationHash2)
183571
183671
  const source = readFileSync27(absolutePath, "utf8");
183572
183672
  const sourceHash = createHash18("sha256").update(source).digest("hex");
183573
183673
  const artifactHash = createHash18("sha256").update(path).update("\0").update(sourceHash).digest("hex");
183574
- const artifactPath = join23(
183674
+ const artifactPath = join24(
183575
183675
  workspace.root,
183576
183676
  ".neo",
183577
183677
  "test-build",
@@ -184441,7 +184541,7 @@ function testBuildFiles(root) {
184441
184541
  const visit = (directory) => {
184442
184542
  for (const entry of readdirSync7(directory, { withFileTypes: true })) {
184443
184543
  if (entry.isSymbolicLink()) continue;
184444
- const path = join23(directory, entry.name);
184544
+ const path = join24(directory, entry.name);
184445
184545
  if (entry.isDirectory()) visit(path);
184446
184546
  else if (entry.isFile()) {
184447
184547
  const stats = statSync5(path);
@@ -184502,7 +184602,7 @@ function formatStatusCounts(passed, failed, total, skipped = 0) {
184502
184602
  async function runTest(workspace, options, dependencies = {}) {
184503
184603
  const started = Date.now();
184504
184604
  const performanceStarted = performance.now();
184505
- const testBuildRoot = join23(workspace.root, ".neo", "test-build");
184605
+ const testBuildRoot = join24(workspace.root, ".neo", "test-build");
184506
184606
  maintainNeoTestBuildCache(testBuildRoot);
184507
184607
  const startedAt = new Date(started).toISOString();
184508
184608
  let projectFingerprint = null;
@@ -184687,7 +184787,7 @@ async function runTest(workspace, options, dependencies = {}) {
184687
184787
  }))
184688
184788
  };
184689
184789
  atomicWrite(
184690
- join23(workspace.root, ".neo", "test-build", "v1", "manifest.json"),
184790
+ join24(workspace.root, ".neo", "test-build", "v1", "manifest.json"),
184691
184791
  `${JSON.stringify(buildManifest, null, 2)}
184692
184792
  `
184693
184793
  );
@@ -184791,7 +184891,7 @@ async function runTest(workspace, options, dependencies = {}) {
184791
184891
  if (options.outputFile !== null) {
184792
184892
  try {
184793
184893
  atomicWrite(
184794
- isAbsolute3(options.outputFile) ? options.outputFile : join23(workspace.root, options.outputFile),
184894
+ isAbsolute3(options.outputFile) ? options.outputFile : join24(workspace.root, options.outputFile),
184795
184895
  serialized
184796
184896
  );
184797
184897
  } catch (error) {
@@ -184936,7 +185036,6 @@ var init_test = __esm({
184936
185036
  init_project2();
184937
185037
  init_test_prelude();
184938
185038
  init_strict_ir();
184939
- init_members();
184940
185039
  init_neoscript2();
184941
185040
  init_evaluator_lookups();
184942
185041
  init_neoscript_language_adapter();
@@ -185024,7 +185123,7 @@ import {
185024
185123
  existsSync as existsSync21,
185025
185124
  readFileSync as readFileSync28
185026
185125
  } from "node:fs";
185027
- import { extname as extname2, isAbsolute as isAbsolute4, join as join24, relative as relative11, sep as sep11 } from "node:path";
185126
+ import { extname as extname2, isAbsolute as isAbsolute4, join as join25, relative as relative11, sep as sep11 } from "node:path";
185028
185127
  function inspectNeoDoctor(workspace) {
185029
185128
  const formatCompatible = workspace.config.formatVersion === CURRENT_FORMAT_VERSION;
185030
185129
  const compiler = inspectCompilerContract();
@@ -185143,7 +185242,7 @@ function inspectSourceContract(workspace) {
185143
185242
  }
185144
185243
  }
185145
185244
  function inspectExtensionContract(root) {
185146
- const cachePath2 = join24(root, PROJECT_SOURCE_ANALYSIS_V4_CACHE_PATH);
185245
+ const cachePath2 = join25(root, PROJECT_SOURCE_ANALYSIS_V4_CACHE_PATH);
185147
185246
  if (!existsSync21(cachePath2)) {
185148
185247
  return {
185149
185248
  id: NEO_VSCODE_EXTENSION_ID,
@@ -185227,7 +185326,7 @@ function inspectTrackedBinary(root, record7, errors) {
185227
185326
  `Project file ${record7.recordId} has an invalid SHA-256 base digest.`
185228
185327
  );
185229
185328
  }
185230
- const absolute = join24(root, path);
185329
+ const absolute = join25(root, path);
185231
185330
  if (existsSync21(absolute) && !canAccess(absolute, fsConstants.R_OK)) {
185232
185331
  errors.push(`Tracked project file ${path} is not readable.`);
185233
185332
  }
@@ -186016,7 +186115,7 @@ __export(migrate_exports, {
186016
186115
  });
186017
186116
  import { randomUUID as randomUUID10 } from "node:crypto";
186018
186117
  import { existsSync as existsSync22, mkdirSync as mkdirSync16, readFileSync as readFileSync29, writeFileSync as writeFileSync17 } from "node:fs";
186019
- import { join as join25, relative as relative12 } from "node:path";
186118
+ import { join as join26, relative as relative12 } from "node:path";
186020
186119
  async function runMigrate(workspace, subcommand, positional, targetRef, json, dependencies = {}) {
186021
186120
  if (subcommand === "new") {
186022
186121
  const name = positional[0];
@@ -186025,7 +186124,7 @@ async function runMigrate(workspace, subcommand, positional, targetRef, json, de
186025
186124
  "Usage: neo migrate new <name> [--target <ClassName|project>]"
186026
186125
  );
186027
186126
  }
186028
- const migrationsDir = join25(workspace.root, "Migrations");
186127
+ const migrationsDir = join26(workspace.root, "Migrations");
186029
186128
  mkdirSync16(migrationsDir, { recursive: true });
186030
186129
  let nextOrder = 1;
186031
186130
  for (const path of listProjectSourceFilesV4(workspace.root)) {
@@ -186039,7 +186138,7 @@ async function runMigrate(workspace, subcommand, positional, targetRef, json, de
186039
186138
  nextOrder = Math.max(nextOrder, Number(migration.fileFields.order) + 1);
186040
186139
  }
186041
186140
  const relPath = migrationFileName(nextOrder, name);
186042
- const absolute = join25(workspace.root, relPath);
186141
+ const absolute = join26(workspace.root, relPath);
186043
186142
  if (existsSync22(absolute)) {
186044
186143
  throw new Error(`"${relPath}" already exists.`);
186045
186144
  }
@@ -188282,68 +188381,53 @@ var init_branch = __esm({
188282
188381
  }
188283
188382
  });
188284
188383
 
188285
- // ../src/models/localization/localization-import.ts
188384
+ // ../packages/models/src/localization/localization-import.ts
188286
188385
  var init_localization_import = __esm({
188287
- "../src/models/localization/localization-import.ts"() {
188386
+ "../packages/models/src/localization/localization-import.ts"() {
188288
188387
  "use strict";
188289
188388
  }
188290
188389
  });
188291
188390
 
188292
- // ../src/models/dialogue/dialogue-lookup-candidates.ts
188391
+ // ../packages/models/src/dialogue/dialogue-lookup-candidates.ts
188293
188392
  var init_dialogue_lookup_candidates = __esm({
188294
- "../src/models/dialogue/dialogue-lookup-candidates.ts"() {
188393
+ "../packages/models/src/dialogue/dialogue-lookup-candidates.ts"() {
188295
188394
  "use strict";
188296
188395
  }
188297
188396
  });
188298
188397
 
188299
- // ../src/models/dialogue/dialogue-record-split.ts
188398
+ // ../packages/models/src/dialogue/dialogue-record-split.ts
188300
188399
  var init_dialogue_record_split = __esm({
188301
- "../src/models/dialogue/dialogue-record-split.ts"() {
188400
+ "../packages/models/src/dialogue/dialogue-record-split.ts"() {
188302
188401
  "use strict";
188303
- init_dialogue_types2();
188304
188402
  }
188305
188403
  });
188306
188404
 
188307
- // ../src/models/dialogue/dialogue-localized-text-links.ts
188405
+ // ../packages/models/src/dialogue/dialogue-localized-text-links.ts
188308
188406
  var init_dialogue_localized_text_links = __esm({
188309
- "../src/models/dialogue/dialogue-localized-text-links.ts"() {
188407
+ "../packages/models/src/dialogue/dialogue-localized-text-links.ts"() {
188310
188408
  "use strict";
188311
- init_localized_text_create_envelope();
188312
- init_localization_types();
188313
- init_dialogue_types2();
188314
188409
  }
188315
188410
  });
188316
188411
 
188317
- // ../src/models/dialogue/dialogue-db-response-types.ts
188412
+ // ../packages/models/src/dialogue/dialogue-db-response-types.ts
188318
188413
  var init_dialogue_db_response_types = __esm({
188319
- "../src/models/dialogue/dialogue-db-response-types.ts"() {
188320
- "use strict";
188321
- init_dialogue_group_types();
188322
- init_priority_types();
188323
- }
188324
- });
188325
-
188326
- // ../src/common/error-message.ts
188327
- var init_error_message = __esm({
188328
- "../src/common/error-message.ts"() {
188414
+ "../packages/models/src/dialogue/dialogue-db-response-types.ts"() {
188329
188415
  "use strict";
188330
188416
  }
188331
188417
  });
188332
188418
 
188333
- // ../src/models/dialogue/dialogue-triggering.ts
188419
+ // ../packages/models/src/dialogue/dialogue-triggering.ts
188334
188420
  var DEFAULT_RECENCY_HALF_LIFE_SECONDS;
188335
188421
  var init_dialogue_triggering = __esm({
188336
- "../src/models/dialogue/dialogue-triggering.ts"() {
188422
+ "../packages/models/src/dialogue/dialogue-triggering.ts"() {
188337
188423
  "use strict";
188338
- init_error_message();
188339
- init_dialogue_group_types();
188340
188424
  DEFAULT_RECENCY_HALF_LIFE_SECONDS = 60 * 60 * 24;
188341
188425
  }
188342
188426
  });
188343
188427
 
188344
- // ../src/models/dialogue/index.ts
188428
+ // ../packages/models/src/dialogue/index.ts
188345
188429
  var init_dialogue = __esm({
188346
- "../src/models/dialogue/index.ts"() {
188430
+ "../packages/models/src/dialogue/index.ts"() {
188347
188431
  "use strict";
188348
188432
  init_dialogue_types2();
188349
188433
  init_dialogue_source_identifiers();
@@ -188360,17 +188444,16 @@ var init_dialogue = __esm({
188360
188444
  }
188361
188445
  });
188362
188446
 
188363
- // ../src/models/localization/localization-export.ts
188447
+ // ../packages/models/src/localization/localization-export.ts
188364
188448
  var init_localization_export = __esm({
188365
- "../src/models/localization/localization-export.ts"() {
188449
+ "../packages/models/src/localization/localization-export.ts"() {
188366
188450
  "use strict";
188367
- init_localization_types();
188368
188451
  }
188369
188452
  });
188370
188453
 
188371
- // ../src/models/localization/index.ts
188454
+ // ../packages/models/src/localization/index.ts
188372
188455
  var init_localization2 = __esm({
188373
- "../src/models/localization/index.ts"() {
188456
+ "../packages/models/src/localization/index.ts"() {
188374
188457
  "use strict";
188375
188458
  init_localization_types();
188376
188459
  init_localization_export();
@@ -188379,29 +188462,52 @@ var init_localization2 = __esm({
188379
188462
  }
188380
188463
  });
188381
188464
 
188382
- // ../src/models/unity/unity-sprite-slices.ts
188465
+ // ../packages/models/src/unity/unity-sprite-slices.ts
188383
188466
  var init_unity_sprite_slices = __esm({
188384
- "../src/models/unity/unity-sprite-slices.ts"() {
188467
+ "../packages/models/src/unity/unity-sprite-slices.ts"() {
188385
188468
  "use strict";
188386
188469
  }
188387
188470
  });
188388
188471
 
188389
- // ../src/models/unity/index.ts
188472
+ // ../packages/models/src/unity/index.ts
188390
188473
  var init_unity = __esm({
188391
- "../src/models/unity/index.ts"() {
188474
+ "../packages/models/src/unity/index.ts"() {
188392
188475
  "use strict";
188393
188476
  init_unity_import_settings();
188394
188477
  init_unity_sprite_slices();
188395
188478
  }
188396
188479
  });
188397
188480
 
188481
+ // ../src/models/project/project-types.ts
188482
+ var init_project_types2 = __esm({
188483
+ "../src/models/project/project-types.ts"() {
188484
+ "use strict";
188485
+ init_project_types();
188486
+ }
188487
+ });
188488
+
188489
+ // ../src/models/project/project-version-types.ts
188490
+ var init_project_version_types2 = __esm({
188491
+ "../src/models/project/project-version-types.ts"() {
188492
+ "use strict";
188493
+ init_project_version_types();
188494
+ }
188495
+ });
188496
+
188497
+ // ../src/models/project/index.ts
188498
+ var init_project3 = __esm({
188499
+ "../src/models/project/index.ts"() {
188500
+ "use strict";
188501
+ init_project();
188502
+ init_project_types2();
188503
+ init_project_version_types2();
188504
+ }
188505
+ });
188506
+
188398
188507
  // ../src/models/wiki/wiki-types.ts
188399
188508
  var init_wiki_types = __esm({
188400
188509
  "../src/models/wiki/wiki-types.ts"() {
188401
188510
  "use strict";
188402
- init_core_types();
188403
- init_auth_ownership_types();
188404
- init_structural_narrow();
188405
188511
  }
188406
188512
  });
188407
188513
 
@@ -188417,8 +188523,6 @@ var init_wiki = __esm({
188417
188523
  var init_interface_reference_sites = __esm({
188418
188524
  "../src/models/interfaces/interface-reference-sites.ts"() {
188419
188525
  "use strict";
188420
- init_member_kinds();
188421
- init_interface_types();
188422
188526
  }
188423
188527
  });
188424
188528
 
@@ -188426,11 +188530,6 @@ var init_interface_reference_sites = __esm({
188426
188530
  var init_interface_validation = __esm({
188427
188531
  "../src/models/interfaces/interface-validation.ts"() {
188428
188532
  "use strict";
188429
- init_member_kinds();
188430
- init_schema_identifiers();
188431
- init_interface_conformance();
188432
- init_interface_graph();
188433
- init_interface_types();
188434
188533
  }
188435
188534
  });
188436
188535
 
@@ -188453,7 +188552,7 @@ var init_models = __esm({
188453
188552
  init_dialogue();
188454
188553
  init_localization2();
188455
188554
  init_unity();
188456
- init_project();
188555
+ init_project3();
188457
188556
  init_wiki();
188458
188557
  init_interfaces();
188459
188558
  }
@@ -188729,11 +188828,9 @@ var init_project_localization_service = __esm({
188729
188828
  "use strict";
188730
188829
  init_localizable_member_value_writes();
188731
188830
  init_member_localization();
188732
- init_localization_import();
188733
188831
  init_packed_value_encoding();
188734
188832
  init_inheritance();
188735
188833
  init_members();
188736
- init_core();
188737
188834
  init_primary_localized_text_writes();
188738
188835
  init_models();
188739
188836
  init_project_version_intents();
@@ -188996,10 +189093,10 @@ var init_content = __esm({
188996
189093
  }
188997
189094
  });
188998
189095
 
188999
- // ../src/runtime/member-change-listener-runtime.ts
189096
+ // ../packages/neoscript-runtime/src/member-change-listener-runtime.ts
189000
189097
  var EMPTY, MemberChangeListenerRuntime;
189001
189098
  var init_member_change_listener_runtime = __esm({
189002
- "../src/runtime/member-change-listener-runtime.ts"() {
189099
+ "../packages/neoscript-runtime/src/member-change-listener-runtime.ts"() {
189003
189100
  "use strict";
189004
189101
  init_core();
189005
189102
  init_listener_write_index();
@@ -189159,7 +189256,7 @@ var init_member_change_listener_runtime = __esm({
189159
189256
  for (const ownerId of owners)
189160
189257
  for (const write of writes.get(ownerId) ?? []) {
189161
189258
  const slot = this.slot(write.ownerId, write.memberId);
189162
- if (slot === null || this.targetTier(slot, write.listener)?.tier !== "save")
189259
+ if (slot === null || write.operation !== "clear" && this.targetTier(slot, write.listener)?.tier !== "save")
189163
189260
  continue;
189164
189261
  const entry = map[write.ownerId] ?? {};
189165
189262
  const inherited = this.baseline(slot, "save");
@@ -189173,7 +189270,7 @@ var init_member_change_listener_runtime = __esm({
189173
189270
  const edited = editChangeListenerSet(
189174
189271
  durable,
189175
189272
  inherited.targets,
189176
- { kind: write.operation, target: write.listener },
189273
+ changeListenerWriteEdit(write),
189177
189274
  { inheritedComplete: inherited.complete }
189178
189275
  );
189179
189276
  if (!edited.changed) continue;
@@ -189265,41 +189362,48 @@ var init_member_change_listener_runtime = __esm({
189265
189362
  throw new Error(
189266
189363
  `OnChanged slot '${write.ownerId}/${write.memberId}' is not writable in this runtime.`
189267
189364
  );
189268
- let target;
189365
+ const targets = [];
189269
189366
  if (write.operation === "reset")
189270
- target = { tier: write.tier, edit: { kind: "reset" } };
189271
- else {
189367
+ targets.push({ tier: write.tier, edit: { kind: "reset" } });
189368
+ else if (write.operation === "clear") {
189369
+ const edit = changeListenerWriteEdit(write);
189370
+ if (slot.storage !== 3 /* Session */)
189371
+ targets.push({ tier: "save", edit });
189372
+ targets.push({ tier: "session", edit });
189373
+ } else {
189272
189374
  const resolved = this.targetTier(slot, write.listener);
189273
189375
  if (resolved === null)
189274
189376
  throw new Error(
189275
189377
  `OnChanged handler '${write.listener.memberId}' is incompatible with '${write.ownerId}/${write.memberId}'.`
189276
189378
  );
189277
189379
  const inSession = current("session", slot.rootId, slot.owner.id)?.[slot.memberId]?.some(
189278
- (existing2) => nsActionListenerIdentity(existing2) === nsActionListenerIdentity(resolved.target)
189380
+ (existing) => nsActionListenerIdentity(existing) === nsActionListenerIdentity(resolved.target)
189279
189381
  );
189280
- target = {
189382
+ targets.push({
189281
189383
  tier: inSession ? "session" : resolved.tier,
189282
189384
  edit: { kind: write.operation, target: resolved.target }
189283
- };
189385
+ });
189386
+ }
189387
+ for (const target of targets) {
189388
+ this.host.assertWritable(slot, target.tier);
189389
+ const existing = current(target.tier, slot.rootId, slot.owner.id);
189390
+ const explicit = existing !== void 0 && Object.hasOwn(existing, slot.memberId) ? existing[slot.memberId] : void 0;
189391
+ const baseline = this.baseline(
189392
+ slot,
189393
+ target.tier,
189394
+ target.tier !== "save" || !adopting.has(slot.owner.id)
189395
+ );
189396
+ const result = editChangeListenerSet(
189397
+ explicit,
189398
+ baseline.targets,
189399
+ target.edit,
189400
+ { inheritedComplete: baseline.complete }
189401
+ );
189402
+ if (!result.changed) continue;
189403
+ const entry = editOwner(target.tier, slot.rootId, slot.owner.id);
189404
+ if (result.targets === void 0) delete entry[slot.memberId];
189405
+ else setOwnField(entry, slot.memberId, result.targets);
189284
189406
  }
189285
- this.host.assertWritable(slot, target.tier);
189286
- const existing = current(target.tier, slot.rootId, slot.owner.id);
189287
- const explicit = existing !== void 0 && Object.hasOwn(existing, slot.memberId) ? existing[slot.memberId] : void 0;
189288
- const baseline = this.baseline(
189289
- slot,
189290
- target.tier,
189291
- target.tier !== "save" || !adopting.has(slot.owner.id)
189292
- );
189293
- const result = editChangeListenerSet(
189294
- explicit,
189295
- baseline.targets,
189296
- target.edit,
189297
- { inheritedComplete: baseline.complete }
189298
- );
189299
- if (!result.changed) continue;
189300
- const entry = editOwner(target.tier, slot.rootId, slot.owner.id);
189301
- if (result.targets === void 0) delete entry[slot.memberId];
189302
- else setOwnField(entry, slot.memberId, result.targets);
189303
189407
  }
189304
189408
  for (const tier of ["save", "session"]) {
189305
189409
  for (const [rootId, changed] of pending[tier]) {
@@ -190072,7 +190176,6 @@ var init_dialogue_dryrun_listeners = __esm({
190072
190176
  "use strict";
190073
190177
  init_listener_write_index();
190074
190178
  init_evaluateNSGetter();
190075
- init_members();
190076
190179
  init_member_change_listeners();
190077
190180
  init_member_change_listener_runtime();
190078
190181
  init_initializer_replay();
@@ -190173,7 +190276,7 @@ var init_dialogue_dryrun_listeners = __esm({
190173
190276
  this.copied = context.__copiedChangeListeners ?? this.copied;
190174
190277
  this.runtime.retireOwners(context.__removedValueIds ?? []);
190175
190278
  const listenerWrites = evaluatedWrites(result).filter(
190176
- (write) => write.kind === "changeListener" && !context.__removedValueIds?.has(write.ownerId) && (write.listener.valueId === null || !context.__removedValueIds?.has(write.listener.valueId))
190279
+ (write) => write.kind === "changeListener" && !context.__removedValueIds?.has(write.ownerId) && (write.operation === "clear" || write.listener.valueId === null || !context.__removedValueIds?.has(write.listener.valueId))
190177
190280
  );
190178
190281
  const adopted = new Set(
190179
190282
  (result.createdSessionValues ?? []).map((row) => row.id)
@@ -191298,7 +191401,7 @@ __export(dev_exports, {
191298
191401
  runDev: () => runDev
191299
191402
  });
191300
191403
  import { readdirSync as readdirSync8, statSync as statSync6, watch } from "node:fs";
191301
- import { basename as basename5, dirname as dirname15, join as join26, resolve as resolve6 } from "node:path";
191404
+ import { basename as basename5, dirname as dirname15, join as join27, resolve as resolve6 } from "node:path";
191302
191405
  import { emitKeypressEvents } from "node:readline";
191303
191406
  async function runDev(root, loadWorkspace2, options) {
191304
191407
  const session = new UnityExportSession({ reusePersistedReceipt: false });
@@ -191409,7 +191512,7 @@ function countsAsExportInput(root, relativePath, event, directories) {
191409
191512
  if (relativePath.split("/").some((part) => NEO_PROJECT_IGNORED_DIRECTORY_NAMES.has(part)))
191410
191513
  return false;
191411
191514
  if (event === "rename") {
191412
- if (statSync6(join26(root, relativePath), {
191515
+ if (statSync6(join27(root, relativePath), {
191413
191516
  throwIfNoEntry: false
191414
191517
  })?.isDirectory()) {
191415
191518
  directories.add(relativePath);
@@ -191430,7 +191533,7 @@ function countsAsExportInput(root, relativePath, event, directories) {
191430
191533
  function rememberDirectories(root, relativePath, directories) {
191431
191534
  let entries;
191432
191535
  try {
191433
- entries = readdirSync8(join26(root, relativePath), { withFileTypes: true });
191536
+ entries = readdirSync8(join27(root, relativePath), { withFileTypes: true });
191434
191537
  } catch (error) {
191435
191538
  if (error instanceof Error && "code" in error) {
191436
191539
  if (error.code === "ENOENT") return;
@@ -191488,7 +191591,7 @@ __export(resolve_exports, {
191488
191591
  runResolve: () => runResolve
191489
191592
  });
191490
191593
  import { readFileSync as readFileSync31, rmSync as rmSync13, writeFileSync as writeFileSync18 } from "node:fs";
191491
- import { join as join27, relative as relative13 } from "node:path";
191594
+ import { join as join28, relative as relative13 } from "node:path";
191492
191595
  function runResolve(workspace, side) {
191493
191596
  const sources2 = readResolvedProjectSourcesV4(workspace.root, side);
191494
191597
  const marked = sources2.filter((file) => file.marked);
@@ -191511,12 +191614,12 @@ function runResolve(workspace, side) {
191511
191614
  const conflict2 = binary?.conflict;
191512
191615
  if (binary === void 0 || conflict2 === void 0) continue;
191513
191616
  binary.path = declaredPaths.get(state.recordId) ?? binary.path;
191514
- const destination = join27(workspace.root, binary.path);
191617
+ const destination = join28(workspace.root, binary.path);
191515
191618
  if (side === "theirs") {
191516
191619
  if (conflict2.remoteSha256 !== null && conflict2.artifactPath !== void 0) {
191517
191620
  writeVerifiedBinaryDownloadV4(
191518
191621
  destination,
191519
- readFileSync31(join27(workspace.root, conflict2.artifactPath)),
191622
+ readFileSync31(join28(workspace.root, conflict2.artifactPath)),
191520
191623
  conflict2.remoteSha256
191521
191624
  );
191522
191625
  binary.sha256 = conflict2.remoteSha256;
@@ -191526,7 +191629,7 @@ function runResolve(workspace, side) {
191526
191629
  }
191527
191630
  }
191528
191631
  if (conflict2.artifactPath !== void 0) {
191529
- rmSync13(join27(workspace.root, conflict2.artifactPath), { force: true });
191632
+ rmSync13(join28(workspace.root, conflict2.artifactPath), { force: true });
191530
191633
  }
191531
191634
  delete binary.conflict;
191532
191635
  resolvedBinaries += 1;
@@ -191907,7 +192010,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
191907
192010
  async function main() {
191908
192011
  const args = parseArgs(process.argv.slice(2));
191909
192012
  if (args.command === "--version") {
191910
- console.log("0.74.0");
192013
+ console.log("0.75.1");
191911
192014
  return;
191912
192015
  }
191913
192016
  if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {