@aura3d/scripting 1.0.6

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 (139) hide show
  1. package/README.md +16 -0
  2. package/dist/AdaptiveDifficultyFixtures.d.ts +58 -0
  3. package/dist/AdaptiveDifficultyFixtures.d.ts.map +1 -0
  4. package/dist/AdaptiveDifficultyFixtures.js +228 -0
  5. package/dist/AdaptiveDifficultyFixtures.js.map +1 -0
  6. package/dist/AnalyticsPrivacyFixtures.d.ts +63 -0
  7. package/dist/AnalyticsPrivacyFixtures.d.ts.map +1 -0
  8. package/dist/AnalyticsPrivacyFixtures.js +120 -0
  9. package/dist/AnalyticsPrivacyFixtures.js.map +1 -0
  10. package/dist/Behavior.d.ts +10 -0
  11. package/dist/Behavior.d.ts.map +1 -0
  12. package/dist/Behavior.js +2 -0
  13. package/dist/Behavior.js.map +1 -0
  14. package/dist/BehaviorHost.d.ts +17 -0
  15. package/dist/BehaviorHost.d.ts.map +1 -0
  16. package/dist/BehaviorHost.js +39 -0
  17. package/dist/BehaviorHost.js.map +1 -0
  18. package/dist/BehaviorRegistry.d.ts +8 -0
  19. package/dist/BehaviorRegistry.d.ts.map +1 -0
  20. package/dist/BehaviorRegistry.js +17 -0
  21. package/dist/BehaviorRegistry.js.map +1 -0
  22. package/dist/BehaviorSystem.d.ts +26 -0
  23. package/dist/BehaviorSystem.d.ts.map +1 -0
  24. package/dist/BehaviorSystem.js +76 -0
  25. package/dist/BehaviorSystem.js.map +1 -0
  26. package/dist/BehaviorTree.d.ts +75 -0
  27. package/dist/BehaviorTree.d.ts.map +1 -0
  28. package/dist/BehaviorTree.js +204 -0
  29. package/dist/BehaviorTree.js.map +1 -0
  30. package/dist/CloudServiceFixtures.d.ts +81 -0
  31. package/dist/CloudServiceFixtures.d.ts.map +1 -0
  32. package/dist/CloudServiceFixtures.js +144 -0
  33. package/dist/CloudServiceFixtures.js.map +1 -0
  34. package/dist/CulturalBehaviorFixtures.d.ts +75 -0
  35. package/dist/CulturalBehaviorFixtures.d.ts.map +1 -0
  36. package/dist/CulturalBehaviorFixtures.js +180 -0
  37. package/dist/CulturalBehaviorFixtures.js.map +1 -0
  38. package/dist/DecisionTree.d.ts +42 -0
  39. package/dist/DecisionTree.d.ts.map +1 -0
  40. package/dist/DecisionTree.js +125 -0
  41. package/dist/DecisionTree.js.map +1 -0
  42. package/dist/GOAP.d.ts +51 -0
  43. package/dist/GOAP.d.ts.map +1 -0
  44. package/dist/GOAP.js +105 -0
  45. package/dist/GOAP.js.map +1 -0
  46. package/dist/HTN.d.ts +58 -0
  47. package/dist/HTN.d.ts.map +1 -0
  48. package/dist/HTN.js +115 -0
  49. package/dist/HTN.js.map +1 -0
  50. package/dist/LearningAgentFixtures.d.ts +60 -0
  51. package/dist/LearningAgentFixtures.d.ts.map +1 -0
  52. package/dist/LearningAgentFixtures.js +122 -0
  53. package/dist/LearningAgentFixtures.js.map +1 -0
  54. package/dist/NetworkReplicationFixtures.d.ts +82 -0
  55. package/dist/NetworkReplicationFixtures.d.ts.map +1 -0
  56. package/dist/NetworkReplicationFixtures.js +330 -0
  57. package/dist/NetworkReplicationFixtures.js.map +1 -0
  58. package/dist/Perception.d.ts +58 -0
  59. package/dist/Perception.d.ts.map +1 -0
  60. package/dist/Perception.js +111 -0
  61. package/dist/Perception.js.map +1 -0
  62. package/dist/PlayerBehaviorTelemetryFixtures.d.ts +74 -0
  63. package/dist/PlayerBehaviorTelemetryFixtures.d.ts.map +1 -0
  64. package/dist/PlayerBehaviorTelemetryFixtures.js +189 -0
  65. package/dist/PlayerBehaviorTelemetryFixtures.js.map +1 -0
  66. package/dist/ProceduralContentAdaptationFixtures.d.ts +52 -0
  67. package/dist/ProceduralContentAdaptationFixtures.d.ts.map +1 -0
  68. package/dist/ProceduralContentAdaptationFixtures.js +149 -0
  69. package/dist/ProceduralContentAdaptationFixtures.js.map +1 -0
  70. package/dist/ScriptContext.d.ts +18 -0
  71. package/dist/ScriptContext.d.ts.map +1 -0
  72. package/dist/ScriptContext.js +21 -0
  73. package/dist/ScriptContext.js.map +1 -0
  74. package/dist/StateMachine.d.ts +52 -0
  75. package/dist/StateMachine.d.ts.map +1 -0
  76. package/dist/StateMachine.js +117 -0
  77. package/dist/StateMachine.js.map +1 -0
  78. package/dist/UtilityAI.d.ts +55 -0
  79. package/dist/UtilityAI.d.ts.map +1 -0
  80. package/dist/UtilityAI.js +113 -0
  81. package/dist/UtilityAI.js.map +1 -0
  82. package/dist/VisualGraph.d.ts +20 -0
  83. package/dist/VisualGraph.d.ts.map +1 -0
  84. package/dist/VisualGraph.js +191 -0
  85. package/dist/VisualGraph.js.map +1 -0
  86. package/dist/VisualGraphContext.d.ts +123 -0
  87. package/dist/VisualGraphContext.d.ts.map +1 -0
  88. package/dist/VisualGraphContext.js +2 -0
  89. package/dist/VisualGraphContext.js.map +1 -0
  90. package/dist/VisualGraphExecutor.d.ts +16 -0
  91. package/dist/VisualGraphExecutor.d.ts.map +1 -0
  92. package/dist/VisualGraphExecutor.js +571 -0
  93. package/dist/VisualGraphExecutor.js.map +1 -0
  94. package/dist/VisualNode.d.ts +17 -0
  95. package/dist/VisualNode.d.ts.map +1 -0
  96. package/dist/VisualNode.js +24 -0
  97. package/dist/VisualNode.js.map +1 -0
  98. package/dist/VisualNodeCatalog.d.ts +14 -0
  99. package/dist/VisualNodeCatalog.d.ts.map +1 -0
  100. package/dist/VisualNodeCatalog.js +142 -0
  101. package/dist/VisualNodeCatalog.js.map +1 -0
  102. package/dist/WeaponSystem.d.ts +228 -0
  103. package/dist/WeaponSystem.d.ts.map +1 -0
  104. package/dist/WeaponSystem.js +530 -0
  105. package/dist/WeaponSystem.js.map +1 -0
  106. package/dist/index.d.ts +51 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +25 -0
  109. package/dist/index.js.map +1 -0
  110. package/package.json +13 -0
  111. package/src/AdaptiveDifficultyFixtures.ts +324 -0
  112. package/src/AnalyticsPrivacyFixtures.ts +182 -0
  113. package/src/Behavior.ts +11 -0
  114. package/src/BehaviorHost.ts +51 -0
  115. package/src/BehaviorRegistry.ts +22 -0
  116. package/src/BehaviorSystem.ts +103 -0
  117. package/src/BehaviorTree.ts +234 -0
  118. package/src/CloudServiceFixtures.ts +225 -0
  119. package/src/CulturalBehaviorFixtures.ts +262 -0
  120. package/src/DecisionTree.ts +162 -0
  121. package/src/GOAP.ts +150 -0
  122. package/src/HTN.ts +178 -0
  123. package/src/LearningAgentFixtures.ts +184 -0
  124. package/src/NetworkReplicationFixtures.ts +440 -0
  125. package/src/Perception.ts +163 -0
  126. package/src/PlayerBehaviorTelemetryFixtures.ts +257 -0
  127. package/src/ProceduralContentAdaptationFixtures.ts +205 -0
  128. package/src/ScriptContext.ts +34 -0
  129. package/src/StateMachine.ts +138 -0
  130. package/src/UtilityAI.ts +158 -0
  131. package/src/VisualGraph.ts +236 -0
  132. package/src/VisualGraphContext.ts +138 -0
  133. package/src/VisualGraphExecutor.ts +663 -0
  134. package/src/VisualNode.ts +44 -0
  135. package/src/VisualNodeCatalog.ts +195 -0
  136. package/src/WeaponSystem.ts +793 -0
  137. package/src/index.ts +175 -0
  138. package/tests/scripting.test.ts +229 -0
  139. package/tsconfig.json +7 -0
package/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # @aura3d/scripting
2
+
3
+ `@aura3d/scripting` owns behavior attachment, behavior runtime phases, script context data, behavior registries, visual graph validation, graph serialization, and deterministic visual graph execution.
4
+
5
+ ## Public API
6
+
7
+ - `Behavior`, `BehaviorHost`, `BehaviorRegistry`, `BehaviorSystem`: behavior lifecycle hooks, host ownership, factory lookup, update/fixed-update execution, and error capture.
8
+ - `ScriptContext`: structured runtime context passed into scripts.
9
+ - `VisualNode`, `VisualPort`, `validateNode`: node and port schema validation, including bounded `any` ports and default input values.
10
+ - `createVisualNode`, `listVisualNodeDefinitions`, `getVisualNodeDefinition`: deterministic visual scripting node catalog adapted from the old math, logic, flow-control, variable, and debug node surface.
11
+ - `VisualGraph`, `validateGraph`, `serializeGraph`, `deserializeGraph`: graph topology validation, typed ports, cycle rejection, and deterministic serialization.
12
+ - `VisualGraphExecutor`: dependency-ordered graph execution, typed output values, catalog node execution, and explicit Unity/Unreal visual-scripting claim blockers.
13
+
14
+ ## Verification
15
+
16
+ Behavior phases, behavior attachment, scene/ECS scripting integration, graph/node/port validation, typed values, mismatch diagnostics, serialization, cycle rejection, deterministic execution, catalog math/logic/flow nodes, and browser scripting movement are covered by `tests/unit/workstream5-input-audio-scripting-editor.test.ts`, `tests/integration/scripting-scene-ecs.test.ts`, and `tests/browser/scripting-browser.spec.ts`. Export and import consistency is covered by `pnpm verify:exports` and `pnpm verify:imports`.
@@ -0,0 +1,58 @@
1
+ export type AdaptiveDifficultyMetricType = "win-rate" | "death-rate" | "completion-time" | "damage-taken" | "damage-dealt" | "accuracy" | "resource-efficiency" | "progression-rate" | "retry-count";
2
+ export type AdaptiveDifficultyStrategy = "gradual" | "immediate" | "predictive" | "manual";
3
+ export type AdaptiveDifficultyChangeType = "enemy-health" | "enemy-damage" | "enemy-count" | "resource-drop-rate" | "experience-multiplier" | "timer-multiplier" | "checkpoint-frequency";
4
+ export interface AdaptiveDifficultyFixtureOptions {
5
+ readonly strategy?: AdaptiveDifficultyStrategy;
6
+ readonly recentDeaths?: number;
7
+ readonly completionTimeSeconds?: number;
8
+ readonly accuracy?: number;
9
+ readonly resourceEfficiency?: number;
10
+ readonly progressionRate?: number;
11
+ readonly playerSkill?: number;
12
+ readonly seed?: number;
13
+ }
14
+ export interface AdaptiveDifficultyMetricSummary {
15
+ readonly type: AdaptiveDifficultyMetricType;
16
+ readonly count: number;
17
+ readonly mean: number;
18
+ readonly median: number;
19
+ readonly standardDeviation: number;
20
+ readonly min: number;
21
+ readonly max: number;
22
+ readonly recentTrend: "improving" | "stable" | "declining";
23
+ }
24
+ export interface AdaptiveDifficultyTriggeredRule {
25
+ readonly id: string;
26
+ readonly metric: AdaptiveDifficultyMetricType;
27
+ readonly strategy: AdaptiveDifficultyStrategy;
28
+ readonly changeType: AdaptiveDifficultyChangeType;
29
+ readonly target: number;
30
+ readonly threshold: number;
31
+ readonly rawMultiplier: number;
32
+ readonly appliedMultiplier: number;
33
+ readonly cooldownSeconds: number;
34
+ readonly reason: string;
35
+ }
36
+ export interface AdaptiveDifficultyAdjustment {
37
+ readonly enemyHealth: number;
38
+ readonly enemyDamage: number;
39
+ readonly enemyCount: number;
40
+ readonly resourceDropRate: number;
41
+ readonly experienceMultiplier: number;
42
+ readonly timerMultiplier: number;
43
+ readonly checkpointMultiplier: number;
44
+ }
45
+ export interface AdaptiveDifficultyFixture {
46
+ readonly id: "external-parity-old-branch-adaptive-difficulty-fixture";
47
+ readonly source: "origin-master-ai-balancing-smart-difficulty-adapted";
48
+ readonly strategy: AdaptiveDifficultyStrategy;
49
+ readonly metrics: readonly AdaptiveDifficultyMetricSummary[];
50
+ readonly triggeredRules: readonly AdaptiveDifficultyTriggeredRule[];
51
+ readonly adjustment: AdaptiveDifficultyAdjustment;
52
+ readonly appliedChangeCount: number;
53
+ readonly blockedClaims: readonly string[];
54
+ readonly hash: string;
55
+ readonly claimBoundary: string;
56
+ }
57
+ export declare function sampleAdaptiveDifficultyFixture(options?: AdaptiveDifficultyFixtureOptions): AdaptiveDifficultyFixture;
58
+ //# sourceMappingURL=AdaptiveDifficultyFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdaptiveDifficultyFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/AdaptiveDifficultyFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ const rules = [
2
+ {
3
+ id: "death-rate-relief",
4
+ metric: "death-rate",
5
+ changeType: "enemy-damage",
6
+ direction: "above",
7
+ threshold: 0.34,
8
+ multiplier: 0.82,
9
+ target: 0.18,
10
+ reason: "Recent deaths exceed the bounded comfort threshold, so incoming damage is softened."
11
+ },
12
+ {
13
+ id: "slow-completion-timer",
14
+ metric: "completion-time",
15
+ changeType: "timer-multiplier",
16
+ direction: "above",
17
+ threshold: 92,
18
+ multiplier: 1.18,
19
+ target: 72,
20
+ reason: "Completion time is above target, so objective timers are relaxed."
21
+ },
22
+ {
23
+ id: "low-accuracy-resource-support",
24
+ metric: "accuracy",
25
+ changeType: "resource-drop-rate",
26
+ direction: "below",
27
+ threshold: 0.46,
28
+ multiplier: 1.22,
29
+ target: 0.58,
30
+ reason: "Accuracy is below target, so health/ammo resource availability is raised."
31
+ },
32
+ {
33
+ id: "high-skill-enemy-presence",
34
+ metric: "win-rate",
35
+ changeType: "enemy-count",
36
+ direction: "above",
37
+ threshold: 0.72,
38
+ multiplier: 1.1,
39
+ target: 0.58,
40
+ reason: "Win rate is above target, so bounded encounter density can increase."
41
+ },
42
+ {
43
+ id: "resource-efficiency-reward",
44
+ metric: "resource-efficiency",
45
+ changeType: "experience-multiplier",
46
+ direction: "above",
47
+ threshold: 0.68,
48
+ multiplier: 1.08,
49
+ target: 0.56,
50
+ reason: "Resource efficiency is above target, so reward pacing is slightly increased."
51
+ },
52
+ {
53
+ id: "retry-checkpoint-support",
54
+ metric: "retry-count",
55
+ changeType: "checkpoint-frequency",
56
+ direction: "above",
57
+ threshold: 2.4,
58
+ multiplier: 1.2,
59
+ target: 1.4,
60
+ reason: "Retry count is high, so checkpoint spacing is tightened."
61
+ }
62
+ ];
63
+ export function sampleAdaptiveDifficultyFixture(options = {}) {
64
+ const strategy = options.strategy ?? "gradual";
65
+ const seed = integer(options.seed ?? 0x3d2025, "seed");
66
+ const playerSkill = clamp01(finite(options.playerSkill ?? 0.42, "playerSkill"));
67
+ const recentDeaths = clamp(finite(options.recentDeaths ?? 3, "recentDeaths"), 0, 12);
68
+ const completionTimeSeconds = clamp(finite(options.completionTimeSeconds ?? 108, "completionTimeSeconds"), 15, 420);
69
+ const accuracy = clamp01(finite(options.accuracy ?? 0.41, "accuracy"));
70
+ const resourceEfficiency = clamp01(finite(options.resourceEfficiency ?? 0.74, "resourceEfficiency"));
71
+ const progressionRate = clamp01(finite(options.progressionRate ?? 0.52, "progressionRate"));
72
+ const metricSamples = {
73
+ "win-rate": sampleSeries(0.34 + playerSkill * 0.44, 0.06, seed, 0),
74
+ "death-rate": sampleSeries(recentDeaths / 8, 0.09, seed, 11),
75
+ "completion-time": sampleSeries(completionTimeSeconds, 8.5, seed, 23),
76
+ "damage-taken": sampleSeries(0.56 + recentDeaths * 0.045, 0.08, seed, 37),
77
+ "damage-dealt": sampleSeries(0.42 + accuracy * 0.45, 0.06, seed, 41),
78
+ accuracy: sampleSeries(accuracy, 0.045, seed, 53),
79
+ "resource-efficiency": sampleSeries(resourceEfficiency, 0.05, seed, 61),
80
+ "progression-rate": sampleSeries(progressionRate, 0.07, seed, 71),
81
+ "retry-count": sampleSeries(recentDeaths * 0.75, 0.28, seed, 83)
82
+ };
83
+ const metrics = Object.keys(metricSamples).map((type) => summarizeMetric(type, metricSamples[type]));
84
+ const byType = new Map(metrics.map((metric) => [metric.type, metric]));
85
+ const triggeredRules = rules
86
+ .filter((rule) => ruleTriggered(byType.get(rule.metric), rule))
87
+ .map((rule, index) => triggeredRule(rule, strategy, index));
88
+ const adjustment = applyRules(triggeredRules);
89
+ return {
90
+ id: "external-parity-old-branch-adaptive-difficulty-fixture",
91
+ source: "origin-master-ai-balancing-smart-difficulty-adapted",
92
+ strategy,
93
+ metrics,
94
+ triggeredRules,
95
+ adjustment,
96
+ appliedChangeCount: triggeredRules.length,
97
+ blockedClaims: [
98
+ "production dynamic difficulty adjustment service",
99
+ "machine-learning or reinforcement-learning personalization",
100
+ "player-profile telemetry backend",
101
+ "live economy balancing",
102
+ "Unity/Unreal AI middleware parity"
103
+ ],
104
+ hash: stableHash([
105
+ strategy,
106
+ ...metrics.map((metric) => `${metric.type}:${metric.mean}:${metric.recentTrend}`),
107
+ ...triggeredRules.map((rule) => `${rule.id}:${rule.appliedMultiplier}`),
108
+ Object.values(adjustment).join(":")
109
+ ].join("|")),
110
+ claimBoundary: "Deterministic adaptive-difficulty metric/rule telemetry adapted from old balancing and smart difficulty concepts; this is bounded runtime evidence, not production DDA, ML personalization, telemetry backend, live economy balancing, or Unity/Unreal AI middleware parity."
111
+ };
112
+ }
113
+ function summarizeMetric(type, values) {
114
+ const sorted = [...values].sort((left, right) => left - right);
115
+ const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
116
+ const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / values.length;
117
+ const firstHalf = values.slice(0, Math.max(1, Math.floor(values.length / 2)));
118
+ const secondHalf = values.slice(Math.floor(values.length / 2));
119
+ const firstMean = firstHalf.reduce((sum, value) => sum + value, 0) / firstHalf.length;
120
+ const secondMean = secondHalf.reduce((sum, value) => sum + value, 0) / secondHalf.length;
121
+ const trendDelta = secondMean - firstMean;
122
+ return {
123
+ type,
124
+ count: values.length,
125
+ mean: round(mean),
126
+ median: round(sorted[Math.floor(sorted.length / 2)] ?? mean),
127
+ standardDeviation: round(Math.sqrt(variance)),
128
+ min: round(sorted[0] ?? mean),
129
+ max: round(sorted[sorted.length - 1] ?? mean),
130
+ recentTrend: Math.abs(trendDelta) < 0.025 ? "stable" : isLowerBetter(type) ? trendDelta < 0 ? "improving" : "declining" : trendDelta > 0 ? "improving" : "declining"
131
+ };
132
+ }
133
+ function triggeredRule(rule, strategy, index) {
134
+ const smoothing = strategy === "immediate" ? 1 : strategy === "predictive" ? 0.72 : strategy === "manual" ? 0 : 0.55;
135
+ const appliedMultiplier = strategy === "manual" ? 1 : 1 + (rule.multiplier - 1) * smoothing;
136
+ return {
137
+ id: rule.id,
138
+ metric: rule.metric,
139
+ strategy,
140
+ changeType: rule.changeType,
141
+ target: rule.target,
142
+ threshold: rule.threshold,
143
+ rawMultiplier: rule.multiplier,
144
+ appliedMultiplier: round(appliedMultiplier),
145
+ cooldownSeconds: 12 + index * 4,
146
+ reason: rule.reason
147
+ };
148
+ }
149
+ function applyRules(triggeredRules) {
150
+ const adjustment = {
151
+ enemyHealth: 1,
152
+ enemyDamage: 1,
153
+ enemyCount: 1,
154
+ resourceDropRate: 1,
155
+ experienceMultiplier: 1,
156
+ timerMultiplier: 1,
157
+ checkpointMultiplier: 1
158
+ };
159
+ const mutable = { ...adjustment };
160
+ for (const rule of triggeredRules) {
161
+ if (rule.changeType === "enemy-health")
162
+ mutable.enemyHealth *= rule.appliedMultiplier;
163
+ else if (rule.changeType === "enemy-damage")
164
+ mutable.enemyDamage *= rule.appliedMultiplier;
165
+ else if (rule.changeType === "enemy-count")
166
+ mutable.enemyCount *= rule.appliedMultiplier;
167
+ else if (rule.changeType === "resource-drop-rate")
168
+ mutable.resourceDropRate *= rule.appliedMultiplier;
169
+ else if (rule.changeType === "experience-multiplier")
170
+ mutable.experienceMultiplier *= rule.appliedMultiplier;
171
+ else if (rule.changeType === "timer-multiplier")
172
+ mutable.timerMultiplier *= rule.appliedMultiplier;
173
+ else
174
+ mutable.checkpointMultiplier *= rule.appliedMultiplier;
175
+ }
176
+ return {
177
+ enemyHealth: round(mutable.enemyHealth),
178
+ enemyDamage: round(mutable.enemyDamage),
179
+ enemyCount: round(mutable.enemyCount),
180
+ resourceDropRate: round(mutable.resourceDropRate),
181
+ experienceMultiplier: round(mutable.experienceMultiplier),
182
+ timerMultiplier: round(mutable.timerMultiplier),
183
+ checkpointMultiplier: round(mutable.checkpointMultiplier)
184
+ };
185
+ }
186
+ function ruleTriggered(metric, rule) {
187
+ if (!metric)
188
+ return false;
189
+ return rule.direction === "above" ? metric.mean > rule.threshold : metric.mean < rule.threshold;
190
+ }
191
+ function sampleSeries(center, amplitude, seed, salt) {
192
+ return Array.from({ length: 9 }, (_, index) => {
193
+ const wave = Math.sin((seed + salt + index * 17) * 0.37) * amplitude;
194
+ const drift = (index - 4) * amplitude * 0.08;
195
+ return round(Math.max(0, center + wave + drift));
196
+ });
197
+ }
198
+ function isLowerBetter(type) {
199
+ return type === "death-rate" || type === "completion-time" || type === "damage-taken" || type === "retry-count";
200
+ }
201
+ function stableHash(value) {
202
+ let hash = 0x811c9dc5;
203
+ for (let index = 0; index < value.length; index += 1) {
204
+ hash ^= value.charCodeAt(index);
205
+ hash = Math.imul(hash, 0x01000193);
206
+ }
207
+ return (hash >>> 0).toString(16).padStart(8, "0");
208
+ }
209
+ function integer(value, label) {
210
+ if (!Number.isInteger(value))
211
+ throw new RangeError(`Adaptive difficulty fixture ${label} must be an integer.`);
212
+ return value;
213
+ }
214
+ function finite(value, label) {
215
+ if (!Number.isFinite(value))
216
+ throw new RangeError(`Adaptive difficulty fixture ${label} must be finite.`);
217
+ return value;
218
+ }
219
+ function clamp(value, min, max) {
220
+ return Math.max(min, Math.min(max, value));
221
+ }
222
+ function clamp01(value) {
223
+ return clamp(value, 0, 1);
224
+ }
225
+ function round(value) {
226
+ return Number(value.toFixed(4));
227
+ }
228
+ //# sourceMappingURL=AdaptiveDifficultyFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdaptiveDifficultyFixtures.js","sourceRoot":"","sources":["../../../../packages/scripting/src/AdaptiveDifficultyFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export type AnalyticsConsentCategory = "necessary" | "analytics" | "marketing" | "preferences";
2
+ export type AnalyticsProviderMode = "console" | "batched-local" | "disabled";
3
+ export interface AnalyticsPrivacyFixtureOptions {
4
+ readonly seed?: number;
5
+ readonly userId?: string;
6
+ readonly sessionId?: string;
7
+ readonly frameMs?: number;
8
+ readonly eventCount?: number;
9
+ readonly errorCount?: number;
10
+ readonly analyticsConsent?: boolean;
11
+ readonly marketingConsent?: boolean;
12
+ }
13
+ export interface AnalyticsPrivacyFixture {
14
+ readonly source: "origin-master-analytics-privacy-adapted";
15
+ readonly consent: {
16
+ readonly version: "1.0";
17
+ readonly explicitRequired: true;
18
+ readonly categories: Record<AnalyticsConsentCategory, boolean>;
19
+ readonly grantedCount: number;
20
+ readonly deniedCount: number;
21
+ readonly changeEvents: readonly {
22
+ readonly category: AnalyticsConsentCategory;
23
+ readonly granted: boolean;
24
+ readonly previous: boolean;
25
+ }[];
26
+ };
27
+ readonly anonymization: {
28
+ readonly userHash: string;
29
+ readonly sessionHash: string;
30
+ readonly emailRedacted: true;
31
+ readonly tokenRedacted: true;
32
+ readonly ipAnonymized: string;
33
+ readonly piiPatternHits: number;
34
+ };
35
+ readonly batching: {
36
+ readonly providerMode: AnalyticsProviderMode;
37
+ readonly maxBatchSize: number;
38
+ readonly queuedEvents: number;
39
+ readonly flushedBatches: number;
40
+ readonly offlineQueueEnabled: true;
41
+ readonly blockedWithoutConsent: number;
42
+ };
43
+ readonly metrics: {
44
+ readonly frameMs: number;
45
+ readonly fps: number;
46
+ readonly errorCount: number;
47
+ readonly errorsPerMinute: number;
48
+ readonly loadEvents: number;
49
+ readonly customMetricCount: number;
50
+ };
51
+ readonly productionReadiness: {
52
+ readonly consentTelemetry: true;
53
+ readonly anonymizationTelemetry: true;
54
+ readonly batchingTelemetry: true;
55
+ readonly metricsTelemetry: true;
56
+ readonly providerBoundaryTelemetry: true;
57
+ };
58
+ readonly blockedClaims: readonly string[];
59
+ readonly claimBoundary: string;
60
+ readonly hash: string;
61
+ }
62
+ export declare function sampleAnalyticsPrivacyFixture(options?: AnalyticsPrivacyFixtureOptions): AnalyticsPrivacyFixture;
63
+ //# sourceMappingURL=AnalyticsPrivacyFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsPrivacyFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/AnalyticsPrivacyFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ export function sampleAnalyticsPrivacyFixture(options = {}) {
2
+ const seed = normalizeSeed(options.seed ?? 0xa11a);
3
+ const userId = normalizeText(options.userId ?? "external-parity-runtime-player", "userId");
4
+ const sessionId = normalizeText(options.sessionId ?? "runtime-session", "sessionId");
5
+ const frameMs = positive(options.frameMs ?? 16.7, "frameMs");
6
+ const eventCount = count(options.eventCount ?? 24, "eventCount");
7
+ const errorCount = count(options.errorCount ?? 0, "errorCount");
8
+ const analyticsConsent = options.analyticsConsent ?? true;
9
+ const marketingConsent = options.marketingConsent ?? false;
10
+ const categories = {
11
+ necessary: true,
12
+ analytics: analyticsConsent,
13
+ marketing: marketingConsent,
14
+ preferences: true
15
+ };
16
+ const consentValues = Object.values(categories);
17
+ const blockedWithoutConsent = analyticsConsent ? 0 : eventCount;
18
+ const queuedEvents = analyticsConsent ? Math.min(eventCount, 50) : 0;
19
+ const flushedBatches = analyticsConsent ? Math.ceil(queuedEvents / 10) : 0;
20
+ const fps = Number((1000 / frameMs).toFixed(2));
21
+ const fixture = {
22
+ source: "origin-master-analytics-privacy-adapted",
23
+ consent: {
24
+ version: "1.0",
25
+ explicitRequired: true,
26
+ categories,
27
+ grantedCount: consentValues.filter(Boolean).length,
28
+ deniedCount: consentValues.filter((granted) => !granted).length,
29
+ changeEvents: [
30
+ { category: "analytics", granted: analyticsConsent, previous: false },
31
+ { category: "preferences", granted: true, previous: false }
32
+ ]
33
+ },
34
+ anonymization: {
35
+ userHash: stableHash(`user:${userId}:analytics`),
36
+ sessionHash: stableHash(`session:${sessionId}:analytics`),
37
+ emailRedacted: true,
38
+ tokenRedacted: true,
39
+ ipAnonymized: anonymizeIp(`198.51.${Math.floor(seededUnit(seed) * 100)}.${Math.floor(seededUnit(seed ^ 0x1979) * 240)}`),
40
+ piiPatternHits: 3
41
+ },
42
+ batching: {
43
+ providerMode: analyticsConsent ? "batched-local" : "disabled",
44
+ maxBatchSize: 50,
45
+ queuedEvents,
46
+ flushedBatches,
47
+ offlineQueueEnabled: true,
48
+ blockedWithoutConsent
49
+ },
50
+ metrics: {
51
+ frameMs: Number(frameMs.toFixed(3)),
52
+ fps,
53
+ errorCount,
54
+ errorsPerMinute: Number((errorCount / 3).toFixed(3)),
55
+ loadEvents: 3 + Math.floor(seededUnit(seed ^ 0x441) * 3),
56
+ customMetricCount: 4
57
+ },
58
+ productionReadiness: {
59
+ consentTelemetry: true,
60
+ anonymizationTelemetry: true,
61
+ batchingTelemetry: true,
62
+ metricsTelemetry: true,
63
+ providerBoundaryTelemetry: true
64
+ },
65
+ blockedClaims: [
66
+ "GDPR/CCPA compliance certification",
67
+ "production analytics SaaS integration",
68
+ "real provider delivery guarantees",
69
+ "cross-device identity graph",
70
+ "Unity Analytics parity",
71
+ "Unreal Insights/Analytics parity"
72
+ ],
73
+ claimBoundary: "This fixture ports old analytics, consent, anonymization, batching, and metrics concepts into deterministic local telemetry. It does not send analytics events, certify privacy compliance, integrate a production provider, or claim Unity Analytics or Unreal Insights parity."
74
+ };
75
+ return {
76
+ ...fixture,
77
+ hash: stableHash(JSON.stringify(fixture))
78
+ };
79
+ }
80
+ function anonymizeIp(ip) {
81
+ const octets = ip.split(".");
82
+ return `${octets[0] ?? "0"}.${octets[1] ?? "0"}.${octets[2] ?? "0"}.0`;
83
+ }
84
+ function normalizeSeed(seed) {
85
+ if (!Number.isInteger(seed) || seed < 0)
86
+ throw new Error("seed must be a non-negative integer.");
87
+ return seed >>> 0;
88
+ }
89
+ function normalizeText(value, name) {
90
+ const trimmed = value.trim();
91
+ if (trimmed.length === 0)
92
+ throw new Error(`${name} must not be empty.`);
93
+ return trimmed;
94
+ }
95
+ function positive(value, name) {
96
+ if (!Number.isFinite(value) || value <= 0)
97
+ throw new Error(`${name} must be a positive finite number.`);
98
+ return value;
99
+ }
100
+ function count(value, name) {
101
+ if (!Number.isInteger(value) || value < 0)
102
+ throw new Error(`${name} must be a non-negative integer.`);
103
+ return value;
104
+ }
105
+ function seededUnit(seed) {
106
+ let value = seed >>> 0;
107
+ value ^= value << 13;
108
+ value ^= value >>> 17;
109
+ value ^= value << 5;
110
+ return (value >>> 0) / 0xffffffff;
111
+ }
112
+ function stableHash(value) {
113
+ let hash = 2166136261;
114
+ for (let index = 0; index < value.length; index += 1) {
115
+ hash ^= value.charCodeAt(index);
116
+ hash = Math.imul(hash, 16777619);
117
+ }
118
+ return (hash >>> 0).toString(16).padStart(8, "0");
119
+ }
120
+ //# sourceMappingURL=AnalyticsPrivacyFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsPrivacyFixtures.js","sourceRoot":"","sources":["../../../../packages/scripting/src/AnalyticsPrivacyFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ScriptContext } from "./ScriptContext";
2
+ export interface Behavior {
3
+ enabled?: boolean;
4
+ onStart?(context: ScriptContext): void | Promise<void>;
5
+ onFixedUpdate?(context: ScriptContext): void | Promise<void>;
6
+ onUpdate?(context: ScriptContext): void | Promise<void>;
7
+ onDestroy?(context: ScriptContext): void | Promise<void>;
8
+ }
9
+ export type BehaviorPhase = "start" | "fixed" | "update" | "destroy";
10
+ //# sourceMappingURL=Behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Behavior.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/Behavior.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,aAAa,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Behavior.js","sourceRoot":"","sources":["../../../../packages/scripting/src/Behavior.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { Behavior } from "./Behavior";
2
+ export interface BehaviorHostOptions {
3
+ readonly target?: unknown;
4
+ }
5
+ export declare class BehaviorHost {
6
+ readonly target?: unknown;
7
+ private readonly behaviors;
8
+ private destroyed;
9
+ constructor(options?: BehaviorHostOptions);
10
+ get isDestroyed(): boolean;
11
+ attach(behavior: Behavior): void;
12
+ detach(behavior: Behavior): boolean;
13
+ list(): readonly Behavior[];
14
+ destroy(services?: ReadonlyMap<string, unknown>): Promise<void>;
15
+ private assertAlive;
16
+ }
17
+ //# sourceMappingURL=BehaviorHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorHost.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorHost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE,mBAAwB;IAI7C,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKhC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAInC,IAAI,IAAI,SAAS,QAAQ,EAAE;IAIrB,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,39 @@
1
+ import { ScriptContext } from "./ScriptContext.js";
2
+ export class BehaviorHost {
3
+ target;
4
+ behaviors = new Set();
5
+ destroyed = false;
6
+ constructor(options = {}) {
7
+ this.target = options.target;
8
+ }
9
+ get isDestroyed() {
10
+ return this.destroyed;
11
+ }
12
+ attach(behavior) {
13
+ this.assertAlive();
14
+ this.behaviors.add(behavior);
15
+ }
16
+ detach(behavior) {
17
+ return this.behaviors.delete(behavior);
18
+ }
19
+ list() {
20
+ return [...this.behaviors];
21
+ }
22
+ async destroy(services) {
23
+ if (this.destroyed) {
24
+ return;
25
+ }
26
+ this.destroyed = true;
27
+ const context = new ScriptContext({ phase: "destroy", target: this.target, services });
28
+ for (const behavior of [...this.behaviors]) {
29
+ await behavior.onDestroy?.(context);
30
+ }
31
+ this.behaviors.clear();
32
+ }
33
+ assertAlive() {
34
+ if (this.destroyed) {
35
+ throw new Error("Cannot attach behavior to a destroyed host");
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=BehaviorHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorHost.js","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorHost.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMhD,MAAM,OAAO,YAAY;IACd,MAAM,CAAW;IACT,SAAS,GAAG,IAAI,GAAG,EAAY,CAAC;IACzC,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAuC;QACnD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { Behavior } from "./Behavior";
2
+ export type BehaviorFactory<T extends Behavior = Behavior> = () => T;
3
+ export declare class BehaviorRegistry {
4
+ private readonly factories;
5
+ register(type: string, factory: BehaviorFactory): void;
6
+ create(type: string): Behavior;
7
+ }
8
+ //# sourceMappingURL=BehaviorRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorRegistry.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,CAAC;AAErE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAEhE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAOtD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;CAO/B"}