@rezless/vm 0.1.0

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.
Files changed (175) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +32 -0
  3. package/dist/builtins/base64.d.ts +25 -0
  4. package/dist/builtins/base64.d.ts.map +1 -0
  5. package/dist/builtins/base64.js +43 -0
  6. package/dist/builtins/base64.js.map +1 -0
  7. package/dist/builtins/chat.d.ts +10 -0
  8. package/dist/builtins/chat.d.ts.map +1 -0
  9. package/dist/builtins/chat.js +36 -0
  10. package/dist/builtins/chat.js.map +1 -0
  11. package/dist/builtins/dataserver.d.ts +26 -0
  12. package/dist/builtins/dataserver.d.ts.map +1 -0
  13. package/dist/builtins/dataserver.js +20 -0
  14. package/dist/builtins/dataserver.js.map +1 -0
  15. package/dist/builtins/detected.d.ts +40 -0
  16. package/dist/builtins/detected.d.ts.map +1 -0
  17. package/dist/builtins/detected.js +23 -0
  18. package/dist/builtins/detected.js.map +1 -0
  19. package/dist/builtins/hash.d.ts +6 -0
  20. package/dist/builtins/hash.d.ts.map +1 -0
  21. package/dist/builtins/hash.js +34 -0
  22. package/dist/builtins/hash.js.map +1 -0
  23. package/dist/builtins/http.d.ts +40 -0
  24. package/dist/builtins/http.d.ts.map +1 -0
  25. package/dist/builtins/http.js +87 -0
  26. package/dist/builtins/http.js.map +1 -0
  27. package/dist/builtins/identity.d.ts +14 -0
  28. package/dist/builtins/identity.d.ts.map +1 -0
  29. package/dist/builtins/identity.js +17 -0
  30. package/dist/builtins/identity.js.map +1 -0
  31. package/dist/builtins/index.d.ts +8 -0
  32. package/dist/builtins/index.d.ts.map +1 -0
  33. package/dist/builtins/index.js +232 -0
  34. package/dist/builtins/index.js.map +1 -0
  35. package/dist/builtins/inventory.d.ts +33 -0
  36. package/dist/builtins/inventory.d.ts.map +1 -0
  37. package/dist/builtins/inventory.js +134 -0
  38. package/dist/builtins/inventory.js.map +1 -0
  39. package/dist/builtins/json.d.ts +7 -0
  40. package/dist/builtins/json.d.ts.map +1 -0
  41. package/dist/builtins/json.js +690 -0
  42. package/dist/builtins/json.js.map +1 -0
  43. package/dist/builtins/link-info.d.ts +10 -0
  44. package/dist/builtins/link-info.d.ts.map +1 -0
  45. package/dist/builtins/link-info.js +26 -0
  46. package/dist/builtins/link-info.js.map +1 -0
  47. package/dist/builtins/linked.d.ts +23 -0
  48. package/dist/builtins/linked.d.ts.map +1 -0
  49. package/dist/builtins/linked.js +20 -0
  50. package/dist/builtins/linked.js.map +1 -0
  51. package/dist/builtins/linksetdata.d.ts +20 -0
  52. package/dist/builtins/linksetdata.d.ts.map +1 -0
  53. package/dist/builtins/linksetdata.js +196 -0
  54. package/dist/builtins/linksetdata.js.map +1 -0
  55. package/dist/builtins/listen.d.ts +33 -0
  56. package/dist/builtins/listen.d.ts.map +1 -0
  57. package/dist/builtins/listen.js +45 -0
  58. package/dist/builtins/listen.js.map +1 -0
  59. package/dist/builtins/lists.d.ts +37 -0
  60. package/dist/builtins/lists.d.ts.map +1 -0
  61. package/dist/builtins/lists.js +275 -0
  62. package/dist/builtins/lists.js.map +1 -0
  63. package/dist/builtins/math.d.ts +32 -0
  64. package/dist/builtins/math.d.ts.map +1 -0
  65. package/dist/builtins/math.js +104 -0
  66. package/dist/builtins/math.js.map +1 -0
  67. package/dist/builtins/object.d.ts +29 -0
  68. package/dist/builtins/object.d.ts.map +1 -0
  69. package/dist/builtins/object.js +50 -0
  70. package/dist/builtins/object.js.map +1 -0
  71. package/dist/builtins/prim-accessors.d.ts +56 -0
  72. package/dist/builtins/prim-accessors.d.ts.map +1 -0
  73. package/dist/builtins/prim-accessors.js +353 -0
  74. package/dist/builtins/prim-accessors.js.map +1 -0
  75. package/dist/builtins/prim-params.d.ts +12 -0
  76. package/dist/builtins/prim-params.d.ts.map +1 -0
  77. package/dist/builtins/prim-params.js +124 -0
  78. package/dist/builtins/prim-params.js.map +1 -0
  79. package/dist/builtins/script-control.d.ts +13 -0
  80. package/dist/builtins/script-control.d.ts.map +1 -0
  81. package/dist/builtins/script-control.js +41 -0
  82. package/dist/builtins/script-control.js.map +1 -0
  83. package/dist/builtins/strings.d.ts +23 -0
  84. package/dist/builtins/strings.d.ts.map +1 -0
  85. package/dist/builtins/strings.js +130 -0
  86. package/dist/builtins/strings.js.map +1 -0
  87. package/dist/builtins/time.d.ts +28 -0
  88. package/dist/builtins/time.d.ts.map +1 -0
  89. package/dist/builtins/time.js +54 -0
  90. package/dist/builtins/time.js.map +1 -0
  91. package/dist/clock.d.ts +75 -0
  92. package/dist/clock.d.ts.map +1 -0
  93. package/dist/clock.js +125 -0
  94. package/dist/clock.js.map +1 -0
  95. package/dist/coverage.d.ts +110 -0
  96. package/dist/coverage.d.ts.map +1 -0
  97. package/dist/coverage.js +221 -0
  98. package/dist/coverage.js.map +1 -0
  99. package/dist/dispatch.d.ts +19 -0
  100. package/dist/dispatch.d.ts.map +1 -0
  101. package/dist/dispatch.js +42 -0
  102. package/dist/dispatch.js.map +1 -0
  103. package/dist/env.d.ts +33 -0
  104. package/dist/env.d.ts.map +1 -0
  105. package/dist/env.js +76 -0
  106. package/dist/env.js.map +1 -0
  107. package/dist/generated/constants.d.ts +967 -0
  108. package/dist/generated/constants.d.ts.map +1 -0
  109. package/dist/generated/constants.js +969 -0
  110. package/dist/generated/constants.js.map +1 -0
  111. package/dist/generated/constants_table.d.ts +11 -0
  112. package/dist/generated/constants_table.d.ts.map +1 -0
  113. package/dist/generated/constants_table.js +978 -0
  114. package/dist/generated/constants_table.js.map +1 -0
  115. package/dist/generated/events.d.ts +545 -0
  116. package/dist/generated/events.d.ts.map +1 -0
  117. package/dist/generated/events.js +49 -0
  118. package/dist/generated/events.js.map +1 -0
  119. package/dist/generated/functions.d.ts +6051 -0
  120. package/dist/generated/functions.d.ts.map +1 -0
  121. package/dist/generated/functions.js +526 -0
  122. package/dist/generated/functions.js.map +1 -0
  123. package/dist/index.d.ts +21 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +11 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interpreter.d.ts +39 -0
  128. package/dist/interpreter.d.ts.map +1 -0
  129. package/dist/interpreter.js +381 -0
  130. package/dist/interpreter.js.map +1 -0
  131. package/dist/inventory.d.ts +52 -0
  132. package/dist/inventory.d.ts.map +1 -0
  133. package/dist/inventory.js +45 -0
  134. package/dist/inventory.js.map +1 -0
  135. package/dist/linkset.d.ts +89 -0
  136. package/dist/linkset.d.ts.map +1 -0
  137. package/dist/linkset.js +179 -0
  138. package/dist/linkset.js.map +1 -0
  139. package/dist/prim-params.d.ts +221 -0
  140. package/dist/prim-params.d.ts.map +1 -0
  141. package/dist/prim-params.js +852 -0
  142. package/dist/prim-params.js.map +1 -0
  143. package/dist/prim.d.ts +79 -0
  144. package/dist/prim.d.ts.map +1 -0
  145. package/dist/prim.js +96 -0
  146. package/dist/prim.js.map +1 -0
  147. package/dist/random.d.ts +16 -0
  148. package/dist/random.d.ts.map +1 -0
  149. package/dist/random.js +29 -0
  150. package/dist/random.js.map +1 -0
  151. package/dist/runtime.d.ts +108 -0
  152. package/dist/runtime.d.ts.map +1 -0
  153. package/dist/runtime.js +2 -0
  154. package/dist/runtime.js.map +1 -0
  155. package/dist/script.d.ts +248 -0
  156. package/dist/script.d.ts.map +1 -0
  157. package/dist/script.js +667 -0
  158. package/dist/script.js.map +1 -0
  159. package/dist/values/coerce.d.ts +22 -0
  160. package/dist/values/coerce.d.ts.map +1 -0
  161. package/dist/values/coerce.js +184 -0
  162. package/dist/values/coerce.js.map +1 -0
  163. package/dist/values/format.d.ts +20 -0
  164. package/dist/values/format.d.ts.map +1 -0
  165. package/dist/values/format.js +47 -0
  166. package/dist/values/format.js.map +1 -0
  167. package/dist/values/ops.d.ts +19 -0
  168. package/dist/values/ops.d.ts.map +1 -0
  169. package/dist/values/ops.js +345 -0
  170. package/dist/values/ops.js.map +1 -0
  171. package/dist/values/types.d.ts +39 -0
  172. package/dist/values/types.d.ts.map +1 -0
  173. package/dist/values/types.js +68 -0
  174. package/dist/values/types.js.map +1 -0
  175. package/package.json +52 -0
@@ -0,0 +1,179 @@
1
+ import { LinksetClock } from './clock.js';
2
+ import { Prim } from './prim.js';
3
+ import { NULL_KEY } from './values/types.js';
4
+ import { LINK_ROOT, LINK_SET, LINK_ALL_OTHERS, LINK_ALL_CHILDREN, LINK_THIS, } from './generated/constants.js';
5
+ // Re-export so `import { LINK_* } from '@rezless/vm'` keeps working.
6
+ export { LINK_ROOT, LINK_SET, LINK_ALL_OTHERS, LINK_ALL_CHILDREN, LINK_THIS };
7
+ /**
8
+ * A linkset owns the shared world state for its prims and scripts: the
9
+ * single virtual clock, the LSD store, the cross-script link_message
10
+ * capture, and the registry of prims + scripts. Per-script state stays on
11
+ * `Script` / `ScriptState`.
12
+ *
13
+ * Single-script default: when `new Script(ast, options)` is called without
14
+ * a host prim, a 1-prim/1-script linkset is auto-allocated. Existing tests
15
+ * see no behavioral change.
16
+ */
17
+ export class Linkset {
18
+ clock = new LinksetClock();
19
+ prims = [];
20
+ /** Linkset-wide LSD store (was per-script before multi-script support). */
21
+ linksetData = new Map();
22
+ /**
23
+ * Cross-script capture of every `llMessageLinked` invocation in this
24
+ * linkset. Append-only; long-running tests should call
25
+ * `clearLinkedMessages()` between scenarios to keep memory bounded.
26
+ */
27
+ linkedMessages = [];
28
+ /** Drop every captured cross-script linked-message entry. */
29
+ clearLinkedMessages() {
30
+ this.linkedMessages.length = 0;
31
+ }
32
+ owner;
33
+ constructor(opts = {}) {
34
+ this.owner = opts.owner ?? NULL_KEY;
35
+ }
36
+ /** Add a prim to the linkset; assigns a 1-based linkNumber. */
37
+ addPrim(prim) {
38
+ prim.linkset = this;
39
+ this.prims.push(prim);
40
+ this.recomputeLinkNumbers();
41
+ return prim;
42
+ }
43
+ recomputeLinkNumbers() {
44
+ if (this.prims.length === 1) {
45
+ // LSL: a lone unlinked prim reports linkNumber 0.
46
+ this.prims[0].linkNumber = 0;
47
+ return;
48
+ }
49
+ for (let i = 0; i < this.prims.length; i++) {
50
+ this.prims[i].linkNumber = i + 1;
51
+ }
52
+ }
53
+ /** Flat list of every script in every prim, in prim/inventory order. */
54
+ allScripts() {
55
+ const out = [];
56
+ for (const p of this.prims) {
57
+ for (const s of p.scripts)
58
+ out.push(s);
59
+ }
60
+ return out;
61
+ }
62
+ /** Locate the prim containing `script`, or undefined. */
63
+ primOf(script) {
64
+ return this.prims.find((p) => p.scripts.includes(script));
65
+ }
66
+ /** Resolve LINK_* / specific link number to the set of target prims. */
67
+ resolveTargets(senderLink, target) {
68
+ if (target === LINK_THIS) {
69
+ const me = this.prims.find((p) => p.linkNumber === senderLink) ?? this.prims[0];
70
+ return me ? [me] : [];
71
+ }
72
+ if (target === LINK_SET)
73
+ return [...this.prims];
74
+ if (target === LINK_ALL_OTHERS) {
75
+ return this.prims.filter((p) => p.linkNumber !== senderLink);
76
+ }
77
+ if (target === LINK_ALL_CHILDREN) {
78
+ // children = everything except root (LINK_ROOT in a real linkset; a
79
+ // lone prim has linkNumber 0 → no children).
80
+ if (this.prims.length <= 1)
81
+ return [];
82
+ return this.prims.filter((p) => p.linkNumber !== LINK_ROOT);
83
+ }
84
+ if (target >= LINK_ROOT) {
85
+ const p = this.prims.find((pp) => pp.linkNumber === target);
86
+ return p ? [p] : [];
87
+ }
88
+ if (target === 0 && this.prims.length === 1) {
89
+ // Lone unlinked prim accepts target 0 as "self".
90
+ return [this.prims[0]];
91
+ }
92
+ return [];
93
+ }
94
+ /**
95
+ * Schedule `linkset_data` events on every script in the linkset. The
96
+ * caller is expected to have already mutated the shared LSD store before
97
+ * broadcasting.
98
+ */
99
+ broadcastLinksetData(action, name, value) {
100
+ const at = this.clock.now;
101
+ for (const s of this.allScripts()) {
102
+ this.clock.schedule(s, at, 'linkset_data', { action, name, value });
103
+ }
104
+ }
105
+ /**
106
+ * Send a `link_message` according to LSL fan-out semantics.
107
+ * `senderLink` is the calling prim's link number; the event payload's
108
+ * `sender_num` is set to that value. The capture array on the linkset
109
+ * records every invocation for cross-script test assertions.
110
+ */
111
+ deliverLinkMessage(senderLink, target, num, str, id) {
112
+ this.linkedMessages.push({ target, num, str, id });
113
+ const targets = this.resolveTargets(senderLink, target);
114
+ const at = this.clock.now;
115
+ for (const p of targets) {
116
+ for (const s of p.scripts) {
117
+ this.clock.schedule(s, at, 'link_message', { sender_num: senderLink, num, str, id });
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Deliver chat to every script in the linkset whose listens match. Useful
123
+ * for region/world-level chat simulation. `Script.deliverChat` remains
124
+ * available for the single-script case (delivers only to that script).
125
+ */
126
+ deliverChat(opts) {
127
+ for (const s of this.allScripts()) {
128
+ s.matchChatListens(opts);
129
+ }
130
+ this.drainQueue();
131
+ }
132
+ /**
133
+ * Advance the shared clock by `ms` and drain every event that becomes
134
+ * due, dispatching each to its target script.
135
+ */
136
+ advanceTime(ms) {
137
+ this.clock.advance(ms);
138
+ this.drainQueue();
139
+ }
140
+ /**
141
+ * Drain due events in chronological order. Each event is delivered to
142
+ * its target script via `script.deliver(event, payload)`. If a handler
143
+ * triggers more events (timers, chained chats, …) they may become due
144
+ * inside this loop and are picked up in the next iteration.
145
+ *
146
+ * The script roster is captured once per drain. Adding a script
147
+ * mid-drain is rare (and would require an explicit prim mutation by a
148
+ * builtin); when it happens, the new script's events are simply picked
149
+ * up on the next outer drain. Worth-the-trade for avoiding an O(scripts)
150
+ * allocation per event.
151
+ */
152
+ drainQueue() {
153
+ const scripts = this.allScripts();
154
+ if (scripts.length === 0)
155
+ return;
156
+ while (true) {
157
+ const next = this.clock.takeNextDue(scripts);
158
+ if (!next)
159
+ return;
160
+ const target = next.target;
161
+ if (target.dead)
162
+ continue;
163
+ // `__reset` (from llResetOtherScript) must run regardless of the
164
+ // target's running flag — per LSL, a stopped script is still reset
165
+ // when commanded, it just stays stopped afterward.
166
+ if (!target.running && next.event !== '__reset') {
167
+ // Park for replay when the script is re-enabled. A paused script
168
+ // must not block other scripts' events, so we stash on the script
169
+ // itself rather than holding a slot in the linkset queue.
170
+ target.parkedEvents.push({ at: next.at, event: next.event, payload: next.payload });
171
+ continue;
172
+ }
173
+ // ResetScriptSignal is caught inside `Script.runHandler`; it never
174
+ // bubbles up to here, so no try/catch is needed.
175
+ target.deliver(next.event, next.payload);
176
+ }
177
+ }
178
+ }
179
+ //# sourceMappingURL=linkset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkset.js","sourceRoot":"","sources":["../src/linkset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ import type { LslValue, Rotation, Vector } from './values/types.js';
2
+ import type { Prim } from './prim.js';
3
+ /**
4
+ * Backing store for the PRIM_* family of llSetPrimitiveParams /
5
+ * llGetPrimitiveParams values. The full wiki surface is modeled here so
6
+ * that the seam in `Prim` (`getPrimParam` / `setPrimParam`) is the single
7
+ * place where every PRIM_* rule is interpreted, whether the caller is a
8
+ * direct llSetPrimitiveParams or one of the alternative accessors
9
+ * (llSetPos, llSetColor, llSitTarget, …).
10
+ */
11
+ export interface PrimParams {
12
+ position: Vector;
13
+ rotation: Rotation;
14
+ size: Vector;
15
+ /** Per-face slots. LSL uses face index `ALL_SIDES = -1` to mean "every face". */
16
+ faces: PrimFace[];
17
+ pointLight: {
18
+ enabled: boolean;
19
+ color: Vector;
20
+ intensity: number;
21
+ radius: number;
22
+ falloff: number;
23
+ };
24
+ /** Legacy mirror of `faces[i].glow`. Kept for direct field access. */
25
+ glow: number[];
26
+ omega: {
27
+ axis: Vector;
28
+ spinrate: number;
29
+ gain: number;
30
+ };
31
+ physicsShapeType: number;
32
+ flexible: {
33
+ enabled: boolean;
34
+ softness: number;
35
+ gravity: number;
36
+ friction: number;
37
+ wind: number;
38
+ tension: number;
39
+ force: Vector;
40
+ };
41
+ sculpt: {
42
+ textureKey: string;
43
+ type: number;
44
+ };
45
+ slice: Vector;
46
+ shape: PrimShape;
47
+ material: number;
48
+ tempOnRez: boolean;
49
+ castShadows: boolean;
50
+ allowUnsit: boolean;
51
+ scriptedSitOnly: boolean;
52
+ sitTarget: {
53
+ enabled: boolean;
54
+ offset: Vector;
55
+ rotation: Rotation;
56
+ };
57
+ sitFlags: number;
58
+ projector: {
59
+ texture: string;
60
+ fov: number;
61
+ focus: number;
62
+ ambiance: number;
63
+ };
64
+ clickAction: number;
65
+ damage: {
66
+ amount: number;
67
+ type: number;
68
+ };
69
+ health: number;
70
+ reflectionProbe: {
71
+ enabled: boolean;
72
+ ambiance: number;
73
+ clipDistance: number;
74
+ flags: number;
75
+ };
76
+ physicsMaterial: {
77
+ gravityMultiplier: number;
78
+ restitution: number;
79
+ friction: number;
80
+ density: number;
81
+ };
82
+ textureAnim: {
83
+ mode: number;
84
+ face: number;
85
+ sizex: number;
86
+ sizey: number;
87
+ start: number;
88
+ length: number;
89
+ rate: number;
90
+ };
91
+ passCollisions: number;
92
+ passTouches: number;
93
+ }
94
+ export interface PrimFaceMaterial {
95
+ texture: string;
96
+ textureRepeats: Vector;
97
+ textureOffsets: Vector;
98
+ textureRotation: number;
99
+ }
100
+ export interface PrimFace {
101
+ texture: string;
102
+ textureRepeats: Vector;
103
+ textureOffsets: Vector;
104
+ textureRotation: number;
105
+ color: Vector;
106
+ alpha: number;
107
+ bumpShiny: {
108
+ shiny: number;
109
+ bump: number;
110
+ };
111
+ fullBright: boolean;
112
+ glow: number;
113
+ texgen: number;
114
+ renderMaterial: string;
115
+ normal: PrimFaceMaterial;
116
+ specular: PrimFaceMaterial & {
117
+ color: Vector;
118
+ glossiness: number;
119
+ environment: number;
120
+ };
121
+ alphaMode: {
122
+ mode: number;
123
+ cutoff: number;
124
+ };
125
+ gltf: {
126
+ baseColor: PrimFaceMaterial & {
127
+ color: Vector;
128
+ alpha: number;
129
+ alphaMode: number;
130
+ alphaCutoff: number;
131
+ doubleSided: number;
132
+ };
133
+ normal: PrimFaceMaterial;
134
+ metallicRoughness: PrimFaceMaterial & {
135
+ metallic: number;
136
+ roughness: number;
137
+ };
138
+ emissive: PrimFaceMaterial & {
139
+ tint: Vector;
140
+ };
141
+ };
142
+ }
143
+ /**
144
+ * Typed-literal aliases for the kwdb PRIM_TYPE_* constants. The
145
+ * generated module exports them as `: number` so TS can't narrow on
146
+ * them; we re-pin them to their literal values here. The `as` assertions
147
+ * are runtime-asserted below so a future kwdb renumber would surface as
148
+ * a load-time failure rather than silent corruption.
149
+ */
150
+ declare const SHAPE_BOX: 0;
151
+ declare const SHAPE_CYLINDER: 1;
152
+ declare const SHAPE_PRISM: 2;
153
+ declare const SHAPE_SPHERE: 3;
154
+ declare const SHAPE_TORUS: 4;
155
+ declare const SHAPE_TUBE: 5;
156
+ declare const SHAPE_RING: 6;
157
+ declare const SHAPE_SCULPT: 7;
158
+ export type PrimShape = {
159
+ kind: typeof SHAPE_BOX | typeof SHAPE_CYLINDER | typeof SHAPE_PRISM;
160
+ hole: number;
161
+ cut: Vector;
162
+ hollow: number;
163
+ twist: Vector;
164
+ topSize: Vector;
165
+ topShear: Vector;
166
+ } | {
167
+ kind: typeof SHAPE_SPHERE;
168
+ hole: number;
169
+ cut: Vector;
170
+ hollow: number;
171
+ twist: Vector;
172
+ dimple: Vector;
173
+ } | {
174
+ kind: typeof SHAPE_TORUS | typeof SHAPE_TUBE | typeof SHAPE_RING;
175
+ hole: number;
176
+ cut: Vector;
177
+ hollow: number;
178
+ twist: Vector;
179
+ holeSize: Vector;
180
+ topShear: Vector;
181
+ advancedCut: Vector;
182
+ taper: Vector;
183
+ revolutions: number;
184
+ radiusOffset: number;
185
+ skew: number;
186
+ } | {
187
+ kind: typeof SHAPE_SCULPT;
188
+ map: string;
189
+ type: number;
190
+ };
191
+ export declare function defaultFace(): PrimFace;
192
+ export declare function defaultShape(): PrimShape;
193
+ export declare function defaultPrimParams(): PrimParams;
194
+ /**
195
+ * Slot count for a PRIM_* rule's *write* form, given the rule constant
196
+ * and (for variable-shape rules like PRIM_TYPE) the rules list + cursor
197
+ * to peek at the discriminator. Does NOT mutate the prim. Returns null
198
+ * for unsupported / unknown rule constants. Used by the walker to skip
199
+ * past rules that can't be applied (e.g. PRIM_LINK_TARGET resolved to
200
+ * an empty target set) without losing track of cursor position.
201
+ */
202
+ export declare function writePrimParamSlots(param: number, rules: ReadonlyArray<LslValue>, cursor: number): number | null;
203
+ /**
204
+ * Apply one PRIM_* rule starting at `cursor` in `rules`. Returns the
205
+ * number of slots after `param` consumed by the rule (so the walker
206
+ * advances by `1 + consumed`). Returns `null` for unsupported / unknown
207
+ * rule constants — the walker stops parsing the list, matching LSL.
208
+ */
209
+ export declare function writePrimParam(prim: Prim, param: number, rules: ReadonlyArray<LslValue>, cursor: number): number | null;
210
+ /**
211
+ * Read a single PRIM_* rule, returning the flat values it expands to and
212
+ * the number of slots after `param` consumed (face index, etc.). Returns
213
+ * `null` for unsupported constants — caller stops parsing and returns
214
+ * the prefix accumulated so far.
215
+ */
216
+ export declare function readPrimParam(prim: Prim, param: number, rules: ReadonlyArray<LslValue>, cursor: number): {
217
+ values: LslValue[];
218
+ consumed: number;
219
+ } | null;
220
+ export {};
221
+ //# sourceMappingURL=prim-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prim-params.d.ts","sourceRoot":"","sources":["../src/prim-params.ts"],"names":[],"mappings":"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"}