@jgengine/core 0.11.0 → 0.13.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 (256) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/ai/populationDirector.d.ts +103 -0
  3. package/dist/ai/populationDirector.js +190 -0
  4. package/dist/ai/pursuit.d.ts +56 -0
  5. package/dist/ai/pursuit.js +53 -0
  6. package/dist/authoring.d.ts +1 -1
  7. package/dist/authoring.js +1 -1
  8. package/dist/combat/effects.d.ts +11 -4
  9. package/dist/combat/effects.js +24 -17
  10. package/dist/combat/magazine.d.ts +13 -0
  11. package/dist/combat/magazine.js +27 -0
  12. package/dist/combat/vfxPresets.d.ts +176 -0
  13. package/dist/combat/vfxPresets.js +74 -0
  14. package/dist/combat/weaponFire.d.ts +114 -0
  15. package/dist/combat/weaponFire.js +96 -0
  16. package/dist/combat.d.ts +5 -2
  17. package/dist/combat.js +4 -1
  18. package/dist/devtools/controls.d.ts +38 -0
  19. package/dist/devtools/controls.js +181 -0
  20. package/dist/devtools/devtools.d.ts +5 -197
  21. package/dist/devtools/devtools.js +38 -774
  22. package/dist/devtools/discover.d.ts +32 -0
  23. package/dist/devtools/discover.js +240 -0
  24. package/dist/devtools/fallbackSeams.d.ts +50 -0
  25. package/dist/devtools/fallbackSeams.js +111 -0
  26. package/dist/devtools/frame.d.ts +15 -0
  27. package/dist/devtools/frame.js +247 -0
  28. package/dist/devtools/logs.d.ts +15 -0
  29. package/dist/devtools/logs.js +86 -0
  30. package/dist/devtools/overrides.d.ts +16 -0
  31. package/dist/devtools/overrides.js +66 -0
  32. package/dist/devtools/types.d.ts +212 -0
  33. package/dist/devtools/types.js +1 -0
  34. package/dist/devtools/urlFlags.d.ts +22 -0
  35. package/dist/devtools/urlFlags.js +62 -0
  36. package/dist/economy/auctionBook.d.ts +122 -0
  37. package/dist/economy/auctionBook.js +213 -0
  38. package/dist/economy/priceHistory.d.ts +44 -0
  39. package/dist/economy/priceHistory.js +89 -0
  40. package/dist/economy/unlockPoints.d.ts +92 -0
  41. package/dist/economy/unlockPoints.js +103 -0
  42. package/dist/editor/commandApply.d.ts +5 -0
  43. package/dist/editor/commandApply.js +755 -0
  44. package/dist/editor/commands.d.ts +48 -3
  45. package/dist/editor/commands.js +40 -754
  46. package/dist/editor/directives.d.ts +94 -0
  47. package/dist/editor/directives.js +206 -0
  48. package/dist/editor/document.d.ts +37 -2
  49. package/dist/editor/document.js +422 -6
  50. package/dist/editor/entityCatalog.d.ts +42 -0
  51. package/dist/editor/entityCatalog.js +101 -0
  52. package/dist/editor/environment.d.ts +74 -0
  53. package/dist/editor/environment.js +169 -0
  54. package/dist/editor/index.d.ts +26 -1
  55. package/dist/editor/index.js +8 -1
  56. package/dist/editor/minimap.d.ts +31 -0
  57. package/dist/editor/minimap.js +73 -0
  58. package/dist/editor/streamer.d.ts +66 -0
  59. package/dist/editor/streamer.js +68 -0
  60. package/dist/editor/types.d.ts +143 -0
  61. package/dist/editor/world.d.ts +136 -0
  62. package/dist/editor/world.js +303 -0
  63. package/dist/game/breeding.d.ts +161 -0
  64. package/dist/game/breeding.js +181 -0
  65. package/dist/game/cameraConfig.d.ts +451 -0
  66. package/dist/game/cameraConfig.js +1 -0
  67. package/dist/game/clipRoles.d.ts +51 -0
  68. package/dist/game/clipRoles.js +142 -0
  69. package/dist/game/defineGame.d.ts +16 -9
  70. package/dist/game/defineGame.js +14 -6
  71. package/dist/game/defineSystem.d.ts +2 -0
  72. package/dist/game/defineSystem.js +2 -0
  73. package/dist/game/events.d.ts +28 -0
  74. package/dist/game/partAnimation.d.ts +78 -0
  75. package/dist/game/partAnimation.js +147 -0
  76. package/dist/game/playableGame.d.ts +72 -440
  77. package/dist/game/playableGame.js +1 -1
  78. package/dist/game/progression.d.ts +35 -0
  79. package/dist/game/progression.js +22 -1
  80. package/dist/game/quest.js +1 -3
  81. package/dist/game/tribe.d.ts +184 -0
  82. package/dist/game/tribe.js +432 -0
  83. package/dist/gameplay.d.ts +3 -1
  84. package/dist/gameplay.js +3 -1
  85. package/dist/inventory/encumbrance.d.ts +69 -0
  86. package/dist/inventory/encumbrance.js +68 -0
  87. package/dist/inventory/inventoryModel.d.ts +24 -8
  88. package/dist/inventory/inventoryModel.js +47 -8
  89. package/dist/item/durability.js +1 -3
  90. package/dist/meta/changelog.d.ts +1 -1
  91. package/dist/meta/changelog.js +48 -1
  92. package/dist/movement/movementModel.d.ts +15 -1
  93. package/dist/movement/movementModel.js +33 -15
  94. package/dist/movement/playerMovement.js +102 -2
  95. package/dist/multiplayer/combatSnapshot.js +13 -8
  96. package/dist/multiplayer/presenceModel.d.ts +2 -0
  97. package/dist/multiplayer/presenceModel.js +8 -0
  98. package/dist/physics/drivableVehicle.d.ts +2 -0
  99. package/dist/physics/drivableVehicle.js +1 -1
  100. package/dist/physics/flightDynamics.d.ts +82 -0
  101. package/dist/physics/flightDynamics.js +165 -0
  102. package/dist/physics/gravityField.d.ts +25 -0
  103. package/dist/physics/gravityField.js +41 -0
  104. package/dist/physics/kinematicVehicle.d.ts +87 -0
  105. package/dist/physics/kinematicVehicle.js +193 -11
  106. package/dist/physics/physicsWorld.d.ts +26 -0
  107. package/dist/physics/physicsWorld.js +109 -117
  108. package/dist/physics/vehicleObstacles.d.ts +44 -0
  109. package/dist/physics/vehicleObstacles.js +115 -0
  110. package/dist/random/rng.d.ts +4 -1
  111. package/dist/random/rng.js +4 -1
  112. package/dist/runtime/adapter.d.ts +13 -0
  113. package/dist/runtime/adapter.js +13 -0
  114. package/dist/runtime/context/combat.d.ts +51 -0
  115. package/dist/runtime/context/combat.js +131 -0
  116. package/dist/runtime/context/combatFx.js +15 -5
  117. package/dist/runtime/context/deathLoot.d.ts +30 -0
  118. package/dist/runtime/context/deathLoot.js +39 -0
  119. package/dist/runtime/context/player.d.ts +48 -0
  120. package/dist/runtime/context/player.js +125 -0
  121. package/dist/runtime/context/scene.d.ts +60 -0
  122. package/dist/runtime/context/scene.js +329 -0
  123. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  124. package/dist/runtime/context/snapshotCodecs.js +26 -0
  125. package/dist/runtime/descriptors/baseline.js +26 -3
  126. package/dist/runtime/descriptors/features.d.ts +5 -0
  127. package/dist/runtime/descriptors/features.js +20 -2
  128. package/dist/runtime/gameContext.d.ts +2 -428
  129. package/dist/runtime/gameContext.js +133 -500
  130. package/dist/runtime/gameContextTypes.d.ts +500 -0
  131. package/dist/runtime/gameContextTypes.js +1 -0
  132. package/dist/runtime/headlessRunner.d.ts +17 -2
  133. package/dist/runtime/headlessRunner.js +15 -0
  134. package/dist/runtime/hostPolicy.d.ts +51 -0
  135. package/dist/runtime/hostPolicy.js +68 -0
  136. package/dist/runtime/hostedGameRunner.d.ts +3 -1
  137. package/dist/runtime/hostedGameRunner.js +1 -0
  138. package/dist/runtime/hostedWorldSession.d.ts +3 -1
  139. package/dist/runtime/hostedWorldSession.js +1 -0
  140. package/dist/runtime/worldSnapshot.d.ts +13 -1
  141. package/dist/runtime/worldSnapshot.js +15 -3
  142. package/dist/scene/assetCatalog.d.ts +7 -0
  143. package/dist/scene/assetSpace.js +1 -3
  144. package/dist/scene/authoredTriggers.d.ts +50 -0
  145. package/dist/scene/authoredTriggers.js +114 -0
  146. package/dist/scene/builtinSceneKinds.js +8 -3
  147. package/dist/scene/colliders.d.ts +79 -0
  148. package/dist/scene/colliders.js +170 -0
  149. package/dist/scene/collisionMesh.d.ts +94 -0
  150. package/dist/scene/collisionMesh.js +699 -0
  151. package/dist/scene/companion.d.ts +147 -0
  152. package/dist/scene/companion.js +193 -0
  153. package/dist/scene/entityStats.d.ts +7 -9
  154. package/dist/scene/entityStats.js +19 -15
  155. package/dist/scene/sceneKinds.d.ts +16 -0
  156. package/dist/scene/sceneKinds.js +4 -0
  157. package/dist/scene/sceneRaycast.js +15 -0
  158. package/dist/stats/spawnLevelStats.d.ts +110 -0
  159. package/dist/stats/spawnLevelStats.js +140 -0
  160. package/dist/stats/statModifiers.d.ts +16 -0
  161. package/dist/stats/statModifiers.js +30 -1
  162. package/dist/stats/statPool.d.ts +70 -0
  163. package/dist/stats/statPool.js +62 -0
  164. package/dist/store/changeSignal.d.ts +3 -0
  165. package/dist/store/changeSignal.js +2 -0
  166. package/dist/store/observableKeyedStore.d.ts +2 -0
  167. package/dist/store/observableKeyedStore.js +1 -0
  168. package/dist/survival/decayMeter.js +1 -3
  169. package/dist/survival/regionHealth.js +1 -3
  170. package/dist/ui/hudLayout.d.ts +5 -0
  171. package/dist/ui/hudLayout.js +17 -1
  172. package/dist/ui/panelModel.d.ts +120 -0
  173. package/dist/ui/panelModel.js +168 -0
  174. package/dist/ui.d.ts +1 -0
  175. package/dist/ui.js +1 -0
  176. package/dist/world/authoredEntities.d.ts +29 -0
  177. package/dist/world/authoredEntities.js +29 -0
  178. package/dist/world/authoredObjects.d.ts +15 -1
  179. package/dist/world/authoredObjects.js +13 -1
  180. package/dist/world/authoredSpawn.d.ts +39 -0
  181. package/dist/world/authoredSpawn.js +37 -0
  182. package/dist/world/buildSockets.d.ts +152 -0
  183. package/dist/world/buildSockets.js +188 -0
  184. package/dist/world/buildingLots.d.ts +84 -0
  185. package/dist/world/buildingLots.js +119 -0
  186. package/dist/world/buildings.d.ts +6 -0
  187. package/dist/world/cityBlocks.d.ts +152 -0
  188. package/dist/world/cityBlocks.js +670 -0
  189. package/dist/world/cityContent.d.ts +77 -0
  190. package/dist/world/cityContent.js +261 -0
  191. package/dist/world/cityGenerator.d.ts +41 -0
  192. package/dist/world/cityGenerator.js +58 -0
  193. package/dist/world/cityGeometry.d.ts +114 -0
  194. package/dist/world/cityGeometry.js +573 -0
  195. package/dist/world/cityKind.d.ts +314 -0
  196. package/dist/world/cityKind.js +1578 -0
  197. package/dist/world/environmentSummary.js +57 -1
  198. package/dist/world/features.d.ts +53 -5
  199. package/dist/world/features.js +15 -3
  200. package/dist/world/grassKind.js +2 -2
  201. package/dist/world/markers.d.ts +50 -4
  202. package/dist/world/markers.js +49 -0
  203. package/dist/world/massing.js +1 -1
  204. package/dist/world/minimapBake.d.ts +78 -0
  205. package/dist/world/minimapBake.js +208 -0
  206. package/dist/world/minimapTrack.d.ts +17 -0
  207. package/dist/world/minimapTrack.js +22 -0
  208. package/dist/world/place.d.ts +166 -0
  209. package/dist/world/place.js +96 -0
  210. package/dist/world/placeAsset.js +3 -1
  211. package/dist/world/poleLineKind.d.ts +40 -0
  212. package/dist/world/poleLineKind.js +97 -0
  213. package/dist/world/polyline.js +9 -2
  214. package/dist/world/resourceNode.d.ts +109 -0
  215. package/dist/world/resourceNode.js +140 -0
  216. package/dist/world/roads.d.ts +19 -2
  217. package/dist/world/roads.js +60 -3
  218. package/dist/world/scatter.js +2 -20
  219. package/dist/world/streetGenerator.d.ts +159 -0
  220. package/dist/world/streetGenerator.js +684 -0
  221. package/dist/world/streets.d.ts +103 -1
  222. package/dist/world/streets.js +273 -0
  223. package/dist/world/terraform.js +58 -88
  224. package/dist/world/terrain.d.ts +65 -1
  225. package/dist/world/terrain.js +119 -2
  226. package/dist/world.d.ts +14 -5
  227. package/dist/world.js +12 -3
  228. package/package.json +1 -1
  229. package/skills/game-design/SKILL.md +28 -0
  230. package/skills/game-design/agents/openai.yaml +4 -0
  231. package/skills/game-design/references/application-playbook.md +170 -0
  232. package/skills/game-design/references/field-guide.md +288 -0
  233. package/skills/jgengine/SKILL.md +8 -4
  234. package/skills/jgengine/api.md +182 -81
  235. package/skills/jgengine/capabilities.md +104 -2
  236. package/skills/jgengine/recipes/minimal-game.md +88 -0
  237. package/skills/jgengine-combat/SKILL.md +19 -1
  238. package/skills/jgengine-combat/api.md +75 -2
  239. package/skills/jgengine-combat/capabilities.md +61 -1
  240. package/skills/jgengine-combat/recipes/portable-damage-effects.md +197 -0
  241. package/skills/jgengine-combat/recipes/portable-runtime-state.md +154 -0
  242. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  243. package/skills/jgengine-combat/recipes/portable-weapon-plumbing.md +156 -0
  244. package/skills/jgengine-combat/recipes/visible-attacks.md +81 -0
  245. package/skills/jgengine-combat/reference.md +33 -4
  246. package/skills/jgengine-gameplay/SKILL.md +8 -0
  247. package/skills/jgengine-gameplay/api.md +182 -26
  248. package/skills/jgengine-gameplay/capabilities.md +96 -2
  249. package/skills/jgengine-gameplay/recipes/portable-xp-leveling.md +168 -0
  250. package/skills/jgengine-gameplay/reference-systems.md +10 -5
  251. package/skills/jgengine-world/SKILL.md +13 -0
  252. package/skills/jgengine-world/api.md +453 -21
  253. package/skills/jgengine-world/capabilities.md +112 -2
  254. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  255. package/skills/jgengine-world/reference.md +43 -4
  256. package/skills/jgengine/reference-cartridge.md +0 -72
@@ -0,0 +1,181 @@
1
+ import { CONTROL_SCHEMA_VERSION, choiceValues, cloneValue, expandAxisMeta, inferKind, normalizeColorValue, resolveChoices, sliderBounds, validateControlValue, } from "./tunableSchema.js";
2
+ /** @internal */
3
+ export function isStructuralKind(kind) {
4
+ return kind === "vec2" || kind === "vec3" || kind === "vec4" || kind === "interval";
5
+ }
6
+ /** Create the controls subsystem that registers, validates, and mutates tunable controls, notifying on change. */
7
+ export const createControlsModule = (deps) => {
8
+ const { signal } = deps;
9
+ const controlRecords = new Map();
10
+ const validationContext = (record) => ({
11
+ min: record.min,
12
+ max: record.max,
13
+ step: record.step,
14
+ integer: record.integer,
15
+ unit: record.unit,
16
+ wrap: record.wrap,
17
+ choices: record.choices,
18
+ options: record.options,
19
+ axisBounds: record.axisBounds,
20
+ alpha: record.hasAlpha,
21
+ });
22
+ const toControl = (record) => ({
23
+ name: record.name,
24
+ kind: record.kind,
25
+ label: record.label,
26
+ group: record.group,
27
+ initial: record.initial,
28
+ min: record.min,
29
+ max: record.max,
30
+ step: record.step,
31
+ options: record.options ?? choiceValues(record.choices),
32
+ choices: record.choices,
33
+ unit: record.unit,
34
+ displayUnit: record.displayUnit,
35
+ wrap: record.wrap,
36
+ integer: record.integer,
37
+ axisLabels: record.axisBounds?.labels,
38
+ axisMin: record.axisBounds?.min,
39
+ axisMax: record.axisBounds?.max,
40
+ axisStep: record.axisBounds?.step,
41
+ hasAlpha: record.hasAlpha,
42
+ schemaVersion: record.schemaVersion,
43
+ read: () => record.value,
44
+ write: (value) => writeControl(record, value),
45
+ reset: () => {
46
+ writeControl(record, cloneValue(record.initial));
47
+ },
48
+ });
49
+ const writeControl = (record, raw) => {
50
+ const validated = validateControlValue(record.kind, raw, validationContext(record));
51
+ if (!validated.ok)
52
+ return false;
53
+ const next = validated.value;
54
+ if (isStructuralKind(record.kind)) {
55
+ if (JSON.stringify(record.value) === JSON.stringify(next))
56
+ return true;
57
+ record.value = cloneValue(next);
58
+ }
59
+ else {
60
+ if (Object.is(record.value, next))
61
+ return true;
62
+ record.value = next;
63
+ }
64
+ for (const listener of record.listeners)
65
+ listener(record.value);
66
+ signal.notify();
67
+ return true;
68
+ };
69
+ const hydrateRecord = (record, initial, options, kind) => {
70
+ record.kind = kind;
71
+ record.initial = cloneValue(initial);
72
+ record.min = undefined;
73
+ record.max = undefined;
74
+ record.step = undefined;
75
+ record.options = options?.options;
76
+ record.choices = resolveChoices(options?.options, options?.choices);
77
+ record.unit = options?.unit;
78
+ record.displayUnit = options?.displayUnit ?? options?.unit;
79
+ record.wrap = options?.wrap;
80
+ record.integer = options?.integer;
81
+ record.axisBounds = undefined;
82
+ record.hasAlpha = undefined;
83
+ record.schemaVersion = CONTROL_SCHEMA_VERSION;
84
+ if (kind === "slider" || kind === "angle") {
85
+ const bounds = sliderBounds(initial, options);
86
+ record.min = bounds.min;
87
+ record.max = bounds.max;
88
+ record.step = bounds.step;
89
+ if (kind === "angle") {
90
+ record.unit = options?.unit ?? "rad";
91
+ record.displayUnit = options?.displayUnit ?? "deg";
92
+ }
93
+ }
94
+ else if (kind === "vec2" || kind === "vec3" || kind === "vec4") {
95
+ const sample = Array.isArray(initial) ? initial : [];
96
+ record.axisBounds = expandAxisMeta(sample.length, options?.axisLabels, options?.axisMin ?? options?.min, options?.axisMax ?? options?.max, options?.axisStep ?? options?.step, sample);
97
+ }
98
+ else if (kind === "interval") {
99
+ record.min = options?.min;
100
+ record.max = options?.max;
101
+ record.step = options?.step;
102
+ record.integer = options?.integer;
103
+ }
104
+ else if (kind === "color") {
105
+ const normalized = normalizeColorValue(initial, options?.alpha);
106
+ if (normalized !== null) {
107
+ record.initial = normalized;
108
+ if (Object.is(record.value, initial) || record.value === initial) {
109
+ record.value = normalized;
110
+ }
111
+ record.hasAlpha = options?.alpha === true || normalized.length === 9;
112
+ }
113
+ }
114
+ };
115
+ const register = (name, initial, options) => {
116
+ const kind = inferKind(initial, options);
117
+ const existing = controlRecords.get(name);
118
+ const slashIndex = name.indexOf("/");
119
+ const derivedGroup = slashIndex > 0 ? name.slice(0, slashIndex) : "general";
120
+ const derivedLabel = slashIndex > 0 ? name.slice(slashIndex + 1) : name;
121
+ const record = existing !== undefined && existing.kind === kind
122
+ ? existing
123
+ : {
124
+ name,
125
+ kind,
126
+ label: "",
127
+ group: "",
128
+ initial: cloneValue(initial),
129
+ value: cloneValue(initial),
130
+ schemaVersion: CONTROL_SCHEMA_VERSION,
131
+ listeners: new Set(),
132
+ };
133
+ if (existing === undefined || existing.kind !== kind) {
134
+ record.value = cloneValue(initial);
135
+ }
136
+ record.label = options?.label ?? derivedLabel;
137
+ record.group = options?.group ?? derivedGroup;
138
+ hydrateRecord(record, initial, options, kind);
139
+ if (options?.onChange !== undefined)
140
+ record.listeners.add(options.onChange);
141
+ controlRecords.set(name, record);
142
+ signal.notify();
143
+ return {
144
+ name,
145
+ kind,
146
+ initial: record.initial,
147
+ get value() {
148
+ return record.value;
149
+ },
150
+ set: (value) => writeControl(record, value),
151
+ reset: () => {
152
+ writeControl(record, cloneValue(record.initial));
153
+ },
154
+ subscribe: (listener) => {
155
+ record.listeners.add(listener);
156
+ return () => record.listeners.delete(listener);
157
+ },
158
+ };
159
+ };
160
+ return {
161
+ controls: {
162
+ register,
163
+ list: () => [...controlRecords.values()].map(toControl),
164
+ get: (name) => {
165
+ const record = controlRecords.get(name);
166
+ return record === undefined ? null : toControl(record);
167
+ },
168
+ remove(name) {
169
+ if (controlRecords.delete(name))
170
+ signal.notify();
171
+ },
172
+ resetAll() {
173
+ for (const record of controlRecords.values())
174
+ writeControl(record, cloneValue(record.initial));
175
+ },
176
+ },
177
+ register,
178
+ writeControl,
179
+ controlRecords,
180
+ };
181
+ };
@@ -1,202 +1,10 @@
1
- import { type ChangeSignal } from "../store/changeSignal.js";
2
- import { type AngleUnit, type DevtoolsControlKind, type DevtoolsOverrides, type DiscoverySkip, type OverrideApplyDiagnostic, type ScanMeta, type TunableChoice, type TunableOptions } from "./tunableSchema.js";
1
+ import type { TunableOptions } from "./tunableSchema.js";
2
+ import type { Devtools, DevtoolsSnapshot, Tunable } from "./types.js";
3
3
  export type { AngleUnit, DevtoolsControlKind, DevtoolsOverrides, DiscoverySkip, OverrideApplyDiagnostic, TunableChoice, TunableInterval, TunableOptions, TunableVec2, TunableVec3, TunableVec4, ScanMeta, ScanFieldMeta, NormalizedColor, } from "./tunableSchema.js";
4
4
  export { CONTROL_SCHEMA_VERSION, OVERRIDES_FORMAT_VERSION, convertAngle, escapePathSegment, formatColor, joinTunablePath, normalizeAngle, normalizeColorValue, parseColor, parseOverridesPayload, splitTunablePath, unescapePathSegment, validateControlValue, } from "./tunableSchema.js";
5
- export interface DevtoolsControl {
6
- readonly name: string;
7
- readonly kind: DevtoolsControlKind;
8
- readonly label: string;
9
- readonly group: string;
10
- readonly initial: unknown;
11
- readonly min?: number;
12
- readonly max?: number;
13
- readonly step?: number;
14
- readonly options?: readonly unknown[];
15
- readonly choices?: readonly TunableChoice[];
16
- readonly unit?: AngleUnit;
17
- readonly displayUnit?: AngleUnit;
18
- readonly wrap?: boolean;
19
- readonly integer?: boolean;
20
- readonly axisLabels?: readonly string[];
21
- readonly axisMin?: readonly number[];
22
- readonly axisMax?: readonly number[];
23
- readonly axisStep?: readonly number[];
24
- readonly hasAlpha?: boolean;
25
- readonly schemaVersion: number;
26
- read(): unknown;
27
- write(value: unknown): boolean;
28
- reset(): void;
29
- }
30
- export interface Tunable<T> {
31
- readonly name: string;
32
- readonly kind: DevtoolsControlKind;
33
- readonly initial: T;
34
- readonly value: T;
35
- set(value: T): boolean;
36
- reset(): void;
37
- subscribe(listener: (value: T) => void): () => void;
38
- }
39
- export interface OverrideApplyResult {
40
- applied: number;
41
- skipped: readonly OverrideApplyDiagnostic[];
42
- diagnostics: readonly string[];
43
- }
44
- export interface FrameStats {
45
- fps: number;
46
- avgFrameMs: number;
47
- p95FrameMs: number;
48
- maxFrameMs: number;
49
- avgSimMs: number;
50
- maxSimMs: number;
51
- avgOutsideMs: number;
52
- maxOutsideMs: number;
53
- longFrames: number;
54
- samples: number;
55
- recentFrameMs: readonly number[];
56
- phases: readonly PhaseStats[];
57
- }
58
- export interface PhaseStats {
59
- name: string;
60
- avgMs: number;
61
- maxMs: number;
62
- lastMs: number;
63
- samples: number;
64
- pctOfSim: number;
65
- }
66
- export interface LongFrameEvent {
67
- at: number;
68
- frameMs: number;
69
- simMs: number;
70
- outsideMs: number;
71
- phases: readonly {
72
- name: string;
73
- ms: number;
74
- pct: number;
75
- }[];
76
- topPhase: string | null;
77
- culprit: string;
78
- reason: string;
79
- probes: Record<string, unknown>;
80
- render: RenderSample | null;
81
- }
82
- export interface RenderSample {
83
- drawCalls: number;
84
- triangles: number;
85
- geometries: number;
86
- textures: number;
87
- }
88
- export interface LatencyStats {
89
- lastMs: number;
90
- avgMs: number;
91
- minMs: number;
92
- maxMs: number;
93
- samples: number;
94
- }
95
- export type DevtoolsLogLevel = "log" | "info" | "warn" | "error";
96
- export interface DevtoolsLogEntry {
97
- at: number;
98
- level: DevtoolsLogLevel;
99
- message: string;
100
- }
101
- export interface DiscoveredEntry {
102
- readonly id: string;
103
- readonly table: string;
104
- readonly key: string;
105
- readonly kind: DevtoolsControlKind;
106
- readonly initial: unknown;
107
- readonly enabled: boolean;
108
- read(): unknown;
109
- }
110
- export interface TunableAccessor {
111
- initial: unknown;
112
- get(): unknown;
113
- set(value: unknown): void;
114
- }
115
- export interface DevtoolsSnapshot {
116
- at: number;
117
- frame: FrameStats | null;
118
- render: RenderSample | null;
119
- latency: LatencyStats | null;
120
- longFrames: readonly LongFrameEvent[];
121
- logs: readonly DevtoolsLogEntry[];
122
- probes: Record<string, unknown>;
123
- controls: readonly {
124
- name: string;
125
- kind: DevtoolsControlKind;
126
- value: unknown;
127
- initial: unknown;
128
- }[];
129
- discovered: readonly {
130
- id: string;
131
- kind: DevtoolsControlKind;
132
- value: unknown;
133
- enabled: boolean;
134
- }[];
135
- skipped: readonly DiscoverySkip[];
136
- }
137
- export interface FrameRecordSample {
138
- frameMs: number;
139
- simMs: number;
140
- phases?: Readonly<Record<string, number>>;
141
- }
142
- export interface Devtools {
143
- frame: {
144
- record(sample: FrameRecordSample): void;
145
- stats(): FrameStats | null;
146
- longFrames(): readonly LongFrameEvent[];
147
- clearLongFrames(): void;
148
- };
149
- profile: {
150
- begin(name: string): () => void;
151
- measure<T>(name: string, fn: () => T): T;
152
- add(name: string, ms: number): void;
153
- current(): Record<string, number>;
154
- reset(): void;
155
- };
156
- render: {
157
- record(sample: RenderSample): void;
158
- latest(): RenderSample | null;
159
- };
160
- logs: {
161
- push(level: DevtoolsLogLevel, message: string): void;
162
- captureConsole(): void;
163
- list(): readonly DevtoolsLogEntry[];
164
- clear(): void;
165
- };
166
- latency: {
167
- record(ms: number): void;
168
- stats(): LatencyStats | null;
169
- };
170
- controls: {
171
- register<T>(name: string, initial: T, options?: TunableOptions<T>): Tunable<T>;
172
- list(): readonly DevtoolsControl[];
173
- get(name: string): DevtoolsControl | null;
174
- remove(name: string): void;
175
- resetAll(): void;
176
- };
177
- discover: {
178
- bind(table: string, key: string, accessor: TunableAccessor, options?: TunableOptions): void;
179
- scanTable(table: string, candidate: unknown, meta?: ScanMeta): number;
180
- scanModule(exports: Record<string, unknown>, meta?: ScanMeta): number;
181
- list(): readonly DiscoveredEntry[];
182
- skipped(): readonly DiscoverySkip[];
183
- enable(id: string): void;
184
- disable(id: string): void;
185
- clear(): void;
186
- };
187
- overrides: {
188
- export(): DevtoolsOverrides;
189
- apply(overrides: DevtoolsOverrides | unknown): OverrideApplyResult;
190
- };
191
- probes: {
192
- register(name: string, read: () => unknown): () => void;
193
- read(): Record<string, unknown>;
194
- };
195
- signal: ChangeSignal;
196
- snapshot(): DevtoolsSnapshot;
197
- }
198
- export declare const LONG_FRAME_MS = 33.4;
199
- export declare function formatLogMessage(args: readonly unknown[]): string;
5
+ export type { Devtools, DevtoolsControl, DevtoolsLogEntry, DevtoolsLogLevel, DevtoolsSnapshot, DiscoveredEntry, FrameRecordSample, FrameStats, LatencyStats, LongFrameEvent, OverrideApplyResult, PhaseStats, RenderSample, Tunable, TunableAccessor, } from "./types.js";
6
+ export { LONG_FRAME_MS } from "./frame.js";
7
+ export { formatLogMessage } from "./logs.js";
200
8
  export declare function createDevtools(): Devtools;
201
9
  export declare const devtools: Devtools;
202
10
  export declare function tunable<T>(name: string, initial: T, options?: TunableOptions<T>): Tunable<T>;