@jgengine/core 0.6.0 → 0.8.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 (330) hide show
  1. package/CHANGELOG.md +214 -2
  2. package/README.md +2 -0
  3. package/dist/ai/crowd.d.ts +36 -0
  4. package/dist/ai/crowd.js +213 -0
  5. package/dist/ai/jobBoard.d.ts +49 -0
  6. package/dist/ai/jobBoard.js +155 -0
  7. package/dist/ai/spawnDirector.d.ts +61 -0
  8. package/dist/ai/spawnDirector.js +162 -0
  9. package/dist/ai/threat.d.ts +25 -0
  10. package/dist/ai/threat.js +67 -0
  11. package/dist/anim/easing.d.ts +14 -0
  12. package/dist/anim/easing.js +55 -0
  13. package/dist/audio/audioFalloff.d.ts +38 -0
  14. package/dist/audio/audioFalloff.js +32 -0
  15. package/dist/behaviour/behaviour.d.ts +136 -0
  16. package/dist/behaviour/behaviour.js +388 -0
  17. package/dist/board/laneBoard.d.ts +63 -0
  18. package/dist/board/laneBoard.js +114 -0
  19. package/dist/board/timelineBoard.d.ts +36 -0
  20. package/dist/board/timelineBoard.js +70 -0
  21. package/dist/cards/cardPile.d.ts +64 -0
  22. package/dist/cards/cardPile.js +175 -0
  23. package/dist/cards/modifierPipeline.d.ts +33 -0
  24. package/dist/cards/modifierPipeline.js +48 -0
  25. package/dist/combat/abilityKit.d.ts +47 -0
  26. package/dist/combat/abilityKit.js +139 -0
  27. package/dist/combat/animationState.d.ts +47 -0
  28. package/dist/combat/animationState.js +101 -0
  29. package/dist/combat/attackTags.d.ts +14 -0
  30. package/dist/combat/attackTags.js +26 -0
  31. package/dist/combat/breakMeters.d.ts +32 -0
  32. package/dist/combat/breakMeters.js +51 -0
  33. package/dist/combat/comboString.d.ts +35 -0
  34. package/dist/combat/comboString.js +59 -0
  35. package/dist/combat/death.d.ts +8 -0
  36. package/dist/combat/death.js +5 -2
  37. package/dist/combat/defensiveWindow.d.ts +34 -0
  38. package/dist/combat/defensiveWindow.js +66 -0
  39. package/dist/combat/downed.d.ts +35 -0
  40. package/dist/combat/downed.js +104 -0
  41. package/dist/combat/effects.d.ts +12 -1
  42. package/dist/combat/effects.js +31 -19
  43. package/dist/combat/hitReaction.d.ts +23 -0
  44. package/dist/combat/hitReaction.js +20 -0
  45. package/dist/combat/projectiles.d.ts +42 -5
  46. package/dist/combat/projectiles.js +98 -12
  47. package/dist/combat/resistance.d.ts +13 -0
  48. package/dist/combat/resistance.js +46 -0
  49. package/dist/combat/telegraph.d.ts +31 -0
  50. package/dist/combat/telegraph.js +51 -0
  51. package/dist/commands/commandRegistry.d.ts +1 -1
  52. package/dist/commands/commandRegistry.js +2 -1
  53. package/dist/crafting/crop.d.ts +59 -0
  54. package/dist/crafting/crop.js +181 -0
  55. package/dist/crafting/production.d.ts +64 -0
  56. package/dist/crafting/production.js +130 -0
  57. package/dist/crafting/recipe.d.ts +62 -0
  58. package/dist/crafting/recipe.js +101 -0
  59. package/dist/data/dataSource.d.ts +26 -0
  60. package/dist/data/dataSource.js +93 -0
  61. package/dist/data/devProxy.d.ts +11 -0
  62. package/dist/data/devProxy.js +38 -0
  63. package/dist/data/fetchJson.d.ts +20 -0
  64. package/dist/data/fetchJson.js +43 -0
  65. package/dist/data/jsonDataSource.d.ts +4 -0
  66. package/dist/data/jsonDataSource.js +6 -0
  67. package/dist/devtools/devtools.d.ts +157 -0
  68. package/dist/devtools/devtools.js +484 -0
  69. package/dist/devtools/transformTunables.d.ts +14 -0
  70. package/dist/devtools/transformTunables.js +38 -0
  71. package/dist/economy/sharedWallet.d.ts +28 -0
  72. package/dist/economy/sharedWallet.js +62 -0
  73. package/dist/economy/techTree.d.ts +40 -0
  74. package/dist/economy/techTree.js +66 -0
  75. package/dist/game/chat.d.ts +66 -0
  76. package/dist/game/chat.js +165 -0
  77. package/dist/game/cosmetics.d.ts +25 -0
  78. package/dist/game/cosmetics.js +51 -0
  79. package/dist/game/defineGame.d.ts +10 -2
  80. package/dist/game/defineGame.js +2 -1
  81. package/dist/game/events.d.ts +87 -0
  82. package/dist/game/levelSequence.d.ts +44 -0
  83. package/dist/game/levelSequence.js +78 -0
  84. package/dist/game/lootFilter.d.ts +33 -0
  85. package/dist/game/lootFilter.js +48 -0
  86. package/dist/game/ping.d.ts +67 -0
  87. package/dist/game/ping.js +86 -0
  88. package/dist/game/playableGame.d.ts +516 -8
  89. package/dist/game/playableGame.js +6 -1
  90. package/dist/game/progression.d.ts +1 -0
  91. package/dist/game/progression.js +23 -2
  92. package/dist/game/race.d.ts +100 -0
  93. package/dist/game/race.js +236 -0
  94. package/dist/game/runDraft.d.ts +34 -0
  95. package/dist/game/runDraft.js +97 -0
  96. package/dist/game/social.d.ts +69 -0
  97. package/dist/game/social.js +138 -0
  98. package/dist/game/spawnPoints.d.ts +19 -0
  99. package/dist/game/spawnPoints.js +23 -0
  100. package/dist/game/worldItem.d.ts +95 -0
  101. package/dist/game/worldItem.js +138 -0
  102. package/dist/input/actionBindings.d.ts +10 -0
  103. package/dist/input/actionBindings.js +14 -0
  104. package/dist/input/axisInput.d.ts +43 -0
  105. package/dist/input/axisInput.js +70 -0
  106. package/dist/input/gestureSurface.d.ts +31 -0
  107. package/dist/input/gestureSurface.js +120 -0
  108. package/dist/input/pointer.d.ts +69 -0
  109. package/dist/input/pointer.js +65 -0
  110. package/dist/input/touchScheme.d.ts +83 -0
  111. package/dist/input/touchScheme.js +115 -0
  112. package/dist/interaction/contextMenu.d.ts +30 -0
  113. package/dist/interaction/contextMenu.js +22 -0
  114. package/dist/interaction/qte.d.ts +20 -0
  115. package/dist/interaction/qte.js +24 -0
  116. package/dist/interaction/skillCheck.d.ts +20 -0
  117. package/dist/interaction/skillCheck.js +26 -0
  118. package/dist/inventory/shapedGrid.d.ts +56 -0
  119. package/dist/inventory/shapedGrid.js +176 -0
  120. package/dist/inventory/storageTier.d.ts +52 -0
  121. package/dist/inventory/storageTier.js +77 -0
  122. package/dist/item/affix.d.ts +54 -0
  123. package/dist/item/affix.js +115 -0
  124. package/dist/item/durability.d.ts +51 -0
  125. package/dist/item/durability.js +78 -0
  126. package/dist/item/modularItem.d.ts +46 -0
  127. package/dist/item/modularItem.js +75 -0
  128. package/dist/meta/changelog.d.ts +1 -1
  129. package/dist/meta/changelog.js +71 -1
  130. package/dist/movement/dash.d.ts +37 -0
  131. package/dist/movement/dash.js +65 -0
  132. package/dist/movement/movementModel.d.ts +36 -3
  133. package/dist/movement/movementModel.js +81 -5
  134. package/dist/movement/voxelController.d.ts +61 -0
  135. package/dist/movement/voxelController.js +229 -0
  136. package/dist/multiplayer/chatContract.d.ts +42 -0
  137. package/dist/multiplayer/chatContract.js +57 -0
  138. package/dist/multiplayer/combatSnapshot.d.ts +45 -0
  139. package/dist/multiplayer/combatSnapshot.js +89 -0
  140. package/dist/multiplayer/identity.d.ts +13 -0
  141. package/dist/multiplayer/identity.js +20 -0
  142. package/dist/multiplayer/lagCompensation.d.ts +43 -0
  143. package/dist/multiplayer/lagCompensation.js +154 -0
  144. package/dist/multiplayer/matchmaking.d.ts +33 -0
  145. package/dist/multiplayer/matchmaking.js +60 -0
  146. package/dist/multiplayer/poseSyncGate.d.ts +1 -0
  147. package/dist/multiplayer/poseSyncGate.js +13 -1
  148. package/dist/multiplayer/presenceModel.d.ts +3 -0
  149. package/dist/multiplayer/presenceModel.js +15 -1
  150. package/dist/multiplayer/simultaneousCommit.d.ts +34 -0
  151. package/dist/multiplayer/simultaneousCommit.js +53 -0
  152. package/dist/multiplayer/voiceContract.d.ts +44 -0
  153. package/dist/multiplayer/voiceContract.js +108 -0
  154. package/dist/nav/navConstrain.d.ts +14 -0
  155. package/dist/nav/navConstrain.js +26 -0
  156. package/dist/nav/navFromEnvironment.d.ts +11 -0
  157. package/dist/nav/navFromEnvironment.js +16 -0
  158. package/dist/nav/navGrid.d.ts +56 -0
  159. package/dist/nav/navGrid.js +265 -0
  160. package/dist/nav/pathFollow.d.ts +31 -0
  161. package/dist/nav/pathFollow.js +69 -0
  162. package/dist/physics/ballisticSweep.d.ts +18 -0
  163. package/dist/physics/ballisticSweep.js +49 -0
  164. package/dist/physics/buoyancy.d.ts +49 -0
  165. package/dist/physics/buoyancy.js +112 -0
  166. package/dist/physics/carryable.d.ts +46 -0
  167. package/dist/physics/carryable.js +110 -0
  168. package/dist/physics/damageZones.d.ts +56 -0
  169. package/dist/physics/damageZones.js +107 -0
  170. package/dist/physics/forceVolume.d.ts +48 -0
  171. package/dist/physics/forceVolume.js +119 -0
  172. package/dist/physics/physicsWorld.d.ts +124 -2
  173. package/dist/physics/physicsWorld.js +493 -41
  174. package/dist/physics/ragdoll.d.ts +49 -0
  175. package/dist/physics/ragdoll.js +103 -0
  176. package/dist/physics/spatialGrid.d.ts +41 -0
  177. package/dist/physics/spatialGrid.js +143 -0
  178. package/dist/physics/structure.d.ts +83 -0
  179. package/dist/physics/structure.js +0 -0
  180. package/dist/physics/traversal.d.ts +75 -0
  181. package/dist/physics/traversal.js +138 -0
  182. package/dist/physics/vehicleBody.d.ts +99 -0
  183. package/dist/physics/vehicleBody.js +233 -0
  184. package/dist/puzzle/cellGrid.d.ts +26 -0
  185. package/dist/puzzle/cellGrid.js +110 -0
  186. package/dist/puzzle/fallingPiece.d.ts +24 -0
  187. package/dist/puzzle/fallingPiece.js +51 -0
  188. package/dist/random/nameGen.d.ts +18 -0
  189. package/dist/random/nameGen.js +35 -0
  190. package/dist/random/rng.d.ts +2 -0
  191. package/dist/random/rng.js +23 -0
  192. package/dist/runtime/adapter.d.ts +35 -0
  193. package/dist/runtime/adapter.js +37 -1
  194. package/dist/runtime/cameraDirector.d.ts +10 -0
  195. package/dist/runtime/cameraDirector.js +25 -0
  196. package/dist/runtime/gameContext.d.ts +107 -3
  197. package/dist/runtime/gameContext.js +253 -7
  198. package/dist/runtime/hostPersistence.d.ts +39 -0
  199. package/dist/runtime/hostPersistence.js +54 -0
  200. package/dist/runtime/inputSnapshot.d.ts +7 -0
  201. package/dist/runtime/inputSnapshot.js +12 -0
  202. package/dist/runtime/motionIntents.d.ts +25 -0
  203. package/dist/runtime/motionIntents.js +25 -0
  204. package/dist/runtime/persistenceScope.d.ts +32 -0
  205. package/dist/runtime/persistenceScope.js +64 -0
  206. package/dist/runtime/transport.d.ts +32 -0
  207. package/dist/scene/autoTarget.d.ts +15 -0
  208. package/dist/scene/autoTarget.js +54 -0
  209. package/dist/scene/behaviors.d.ts +13 -1
  210. package/dist/scene/behaviors.js +3 -0
  211. package/dist/scene/captureCheck.d.ts +7 -0
  212. package/dist/scene/captureCheck.js +11 -0
  213. package/dist/scene/entityStore.d.ts +9 -1
  214. package/dist/scene/entityStore.js +25 -2
  215. package/dist/scene/form.d.ts +40 -0
  216. package/dist/scene/form.js +56 -0
  217. package/dist/scene/mount.d.ts +62 -0
  218. package/dist/scene/mount.js +107 -0
  219. package/dist/scene/movementSpeed.d.ts +35 -0
  220. package/dist/scene/movementSpeed.js +20 -0
  221. package/dist/scene/objectQuery.d.ts +18 -0
  222. package/dist/scene/objectQuery.js +108 -0
  223. package/dist/scene/objectStore.d.ts +11 -0
  224. package/dist/scene/objectStore.js +109 -4
  225. package/dist/scene/paintLayer.d.ts +15 -0
  226. package/dist/scene/paintLayer.js +53 -0
  227. package/dist/scene/possession.d.ts +30 -0
  228. package/dist/scene/possession.js +51 -0
  229. package/dist/scene/roster.d.ts +25 -0
  230. package/dist/scene/roster.js +57 -0
  231. package/dist/scene/selection.d.ts +30 -0
  232. package/dist/scene/selection.js +38 -0
  233. package/dist/scene/spatial.d.ts +21 -0
  234. package/dist/scene/spatial.js +63 -1
  235. package/dist/scene/stationClaim.d.ts +43 -0
  236. package/dist/scene/stationClaim.js +109 -0
  237. package/dist/sensor/concealment.d.ts +21 -0
  238. package/dist/sensor/concealment.js +63 -0
  239. package/dist/sensor/freezeMonitor.d.ts +17 -0
  240. package/dist/sensor/freezeMonitor.js +35 -0
  241. package/dist/sensor/frustumSensor.d.ts +60 -0
  242. package/dist/sensor/frustumSensor.js +104 -0
  243. package/dist/sensor/hiddenStateProbe.d.ts +31 -0
  244. package/dist/sensor/hiddenStateProbe.js +40 -0
  245. package/dist/sensor/recordingBuffer.d.ts +29 -0
  246. package/dist/sensor/recordingBuffer.js +61 -0
  247. package/dist/sensor/revealQuery.d.ts +22 -0
  248. package/dist/sensor/revealQuery.js +36 -0
  249. package/dist/session/contestedChannel.d.ts +36 -0
  250. package/dist/session/contestedChannel.js +100 -0
  251. package/dist/session/extraction.d.ts +54 -0
  252. package/dist/session/extraction.js +108 -0
  253. package/dist/session/ring.d.ts +36 -0
  254. package/dist/session/ring.js +88 -0
  255. package/dist/session/roles.d.ts +6 -0
  256. package/dist/session/roles.js +32 -0
  257. package/dist/session/roundState.d.ts +79 -0
  258. package/dist/session/roundState.js +158 -0
  259. package/dist/stats/accumulatorMeter.d.ts +31 -0
  260. package/dist/stats/accumulatorMeter.js +81 -0
  261. package/dist/stats/eventMeter.d.ts +34 -0
  262. package/dist/stats/eventMeter.js +76 -0
  263. package/dist/stats/rollCheck.d.ts +15 -0
  264. package/dist/stats/rollCheck.js +15 -0
  265. package/dist/survival/decayMeter.d.ts +59 -0
  266. package/dist/survival/decayMeter.js +95 -0
  267. package/dist/survival/moodle.d.ts +48 -0
  268. package/dist/survival/moodle.js +91 -0
  269. package/dist/survival/regionHealth.d.ts +72 -0
  270. package/dist/survival/regionHealth.js +129 -0
  271. package/dist/tactics/fallingGrid.d.ts +62 -0
  272. package/dist/tactics/fallingGrid.js +158 -0
  273. package/dist/tactics/predictiveQuery.d.ts +34 -0
  274. package/dist/tactics/predictiveQuery.js +44 -0
  275. package/dist/tactics/snapshot.d.ts +18 -0
  276. package/dist/tactics/snapshot.js +65 -0
  277. package/dist/tactics/surface.d.ts +52 -0
  278. package/dist/tactics/surface.js +135 -0
  279. package/dist/tactics/tacticalGrid.d.ts +68 -0
  280. package/dist/tactics/tacticalGrid.js +261 -0
  281. package/dist/time/beatClock.d.ts +40 -0
  282. package/dist/time/beatClock.js +73 -0
  283. package/dist/time/simClock.d.ts +25 -1
  284. package/dist/time/simClock.js +28 -3
  285. package/dist/turn/commit.d.ts +27 -0
  286. package/dist/turn/commit.js +72 -0
  287. package/dist/turn/intent.d.ts +14 -0
  288. package/dist/turn/intent.js +29 -0
  289. package/dist/turn/turnLoop.d.ts +60 -0
  290. package/dist/turn/turnLoop.js +223 -0
  291. package/dist/world/buildPermissions.d.ts +47 -0
  292. package/dist/world/buildPermissions.js +134 -0
  293. package/dist/world/carve.d.ts +105 -0
  294. package/dist/world/carve.js +175 -0
  295. package/dist/world/connectors.d.ts +40 -0
  296. package/dist/world/connectors.js +67 -0
  297. package/dist/world/envField.d.ts +71 -0
  298. package/dist/world/envField.js +96 -0
  299. package/dist/world/environmentSummary.d.ts +53 -0
  300. package/dist/world/environmentSummary.js +129 -0
  301. package/dist/world/features.d.ts +87 -6
  302. package/dist/world/features.js +52 -2
  303. package/dist/world/fog.d.ts +40 -0
  304. package/dist/world/fog.js +137 -0
  305. package/dist/world/gridInstances.d.ts +13 -0
  306. package/dist/world/gridInstances.js +22 -0
  307. package/dist/world/markers.d.ts +52 -0
  308. package/dist/world/markers.js +96 -0
  309. package/dist/world/minimap.d.ts +42 -0
  310. package/dist/world/minimap.js +72 -0
  311. package/dist/world/placedStructureStore.d.ts +39 -0
  312. package/dist/world/placedStructureStore.js +95 -0
  313. package/dist/world/placementController.d.ts +69 -0
  314. package/dist/world/placementController.js +153 -0
  315. package/dist/world/realm.d.ts +61 -0
  316. package/dist/world/realm.js +66 -0
  317. package/dist/world/support.d.ts +27 -0
  318. package/dist/world/support.js +75 -0
  319. package/dist/world/terraform.d.ts +54 -0
  320. package/dist/world/terraform.js +186 -0
  321. package/dist/world/terrain.d.ts +23 -1
  322. package/dist/world/terrain.js +64 -1
  323. package/dist/world/voxelField.d.ts +54 -0
  324. package/dist/world/voxelField.js +241 -0
  325. package/dist/world/walls.d.ts +61 -0
  326. package/dist/world/walls.js +221 -0
  327. package/dist/world/weather.d.ts +92 -0
  328. package/dist/world/weather.js +169 -0
  329. package/llms.txt +4102 -0
  330. package/package.json +3 -2
@@ -0,0 +1,38 @@
1
+ function readImportMetaEnv() {
2
+ try {
3
+ const meta = import.meta;
4
+ return meta.env ?? {};
5
+ }
6
+ catch {
7
+ return {};
8
+ }
9
+ }
10
+ export function parseDevProxyTable(raw) {
11
+ if (raw === undefined || raw.length === 0)
12
+ return {};
13
+ try {
14
+ const parsed = JSON.parse(raw);
15
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
16
+ return {};
17
+ const entries = Object.entries(parsed).filter((entry) => typeof entry[1] === "string");
18
+ return Object.fromEntries(entries);
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ }
24
+ export const DEFAULT_DEV_PROXY_PREFIX = "/proxy";
25
+ export function proxiedUrl(target, options = {}) {
26
+ const env = readImportMetaEnv();
27
+ const dev = options.dev ?? env.DEV === true;
28
+ if (!dev)
29
+ return target;
30
+ const table = options.table ?? parseDevProxyTable(env.VITE_JGENGINE_DEV_PROXY);
31
+ const prefix = options.prefix ?? DEFAULT_DEV_PROXY_PREFIX;
32
+ for (const [routeName, base] of Object.entries(table)) {
33
+ if (target.startsWith(base)) {
34
+ return `${prefix}/${routeName}${target.slice(base.length)}`;
35
+ }
36
+ }
37
+ return target;
38
+ }
@@ -0,0 +1,20 @@
1
+ export type FetchImpl = typeof fetch;
2
+ export interface FetchJsonOptions {
3
+ method?: string;
4
+ headers?: Record<string, string>;
5
+ body?: string;
6
+ signal?: AbortSignal;
7
+ fetchImpl?: FetchImpl;
8
+ }
9
+ export declare class HttpStatusError extends Error {
10
+ readonly status: number;
11
+ readonly statusText: string;
12
+ readonly url: string;
13
+ constructor(status: number, statusText: string, url: string);
14
+ }
15
+ export declare class JsonParseError extends Error {
16
+ readonly url: string;
17
+ readonly cause: unknown;
18
+ constructor(url: string, cause: unknown);
19
+ }
20
+ export declare function fetchJson<T>(url: string, options?: FetchJsonOptions): Promise<T>;
@@ -0,0 +1,43 @@
1
+ export class HttpStatusError extends Error {
2
+ status;
3
+ statusText;
4
+ url;
5
+ constructor(status, statusText, url) {
6
+ super(`HTTP ${status} ${statusText} for ${url}`);
7
+ this.name = "HttpStatusError";
8
+ this.status = status;
9
+ this.statusText = statusText;
10
+ this.url = url;
11
+ }
12
+ }
13
+ export class JsonParseError extends Error {
14
+ url;
15
+ cause;
16
+ constructor(url, cause) {
17
+ super(`failed to parse JSON response from ${url}`);
18
+ this.name = "JsonParseError";
19
+ this.url = url;
20
+ this.cause = cause;
21
+ }
22
+ }
23
+ export async function fetchJson(url, options = {}) {
24
+ const fetchImpl = options.fetchImpl ?? fetch;
25
+ const response = await fetchImpl(url, {
26
+ method: options.method,
27
+ headers: options.headers,
28
+ body: options.body,
29
+ signal: options.signal,
30
+ });
31
+ if (!response.ok) {
32
+ throw new HttpStatusError(response.status, response.statusText, url);
33
+ }
34
+ const text = await response.text();
35
+ if (text.length === 0)
36
+ return undefined;
37
+ try {
38
+ return JSON.parse(text);
39
+ }
40
+ catch (cause) {
41
+ throw new JsonParseError(url, cause);
42
+ }
43
+ }
@@ -0,0 +1,4 @@
1
+ import { type DataSource, type DataSourceOptions } from "./dataSource.js";
2
+ import { type FetchJsonOptions } from "./fetchJson.js";
3
+ export type JsonDataSourceOptions = DataSourceOptions & Omit<FetchJsonOptions, "signal">;
4
+ export declare function createJsonDataSource<T>(url: string, options?: JsonDataSourceOptions): DataSource<T>;
@@ -0,0 +1,6 @@
1
+ import { createDataSource } from "./dataSource.js";
2
+ import { fetchJson } from "./fetchJson.js";
3
+ export function createJsonDataSource(url, options = {}) {
4
+ const { intervalMs, clock, ...fetchOptions } = options;
5
+ return createDataSource((signal) => fetchJson(url, { ...fetchOptions, signal }), { intervalMs, clock });
6
+ }
@@ -0,0 +1,157 @@
1
+ import { type ChangeSignal } from "../store/changeSignal.js";
2
+ export type DevtoolsControlKind = "slider" | "toggle" | "color" | "select" | "text";
3
+ export interface TunableOptions<T> {
4
+ min?: number;
5
+ max?: number;
6
+ step?: number;
7
+ options?: readonly T[];
8
+ label?: string;
9
+ group?: string;
10
+ onChange?: (value: T) => void;
11
+ }
12
+ export interface DevtoolsControl {
13
+ readonly name: string;
14
+ readonly kind: DevtoolsControlKind;
15
+ readonly label: string;
16
+ readonly group: string;
17
+ readonly initial: unknown;
18
+ readonly min?: number;
19
+ readonly max?: number;
20
+ readonly step?: number;
21
+ readonly options?: readonly unknown[];
22
+ read(): unknown;
23
+ write(value: unknown): void;
24
+ reset(): void;
25
+ }
26
+ export interface Tunable<T> {
27
+ readonly name: string;
28
+ readonly kind: DevtoolsControlKind;
29
+ readonly initial: T;
30
+ readonly value: T;
31
+ set(value: T): void;
32
+ reset(): void;
33
+ subscribe(listener: (value: T) => void): () => void;
34
+ }
35
+ export interface FrameStats {
36
+ fps: number;
37
+ avgFrameMs: number;
38
+ p95FrameMs: number;
39
+ maxFrameMs: number;
40
+ avgSimMs: number;
41
+ maxSimMs: number;
42
+ longFrames: number;
43
+ samples: number;
44
+ recentFrameMs: readonly number[];
45
+ }
46
+ export interface RenderSample {
47
+ drawCalls: number;
48
+ triangles: number;
49
+ geometries: number;
50
+ textures: number;
51
+ }
52
+ export interface LatencyStats {
53
+ lastMs: number;
54
+ avgMs: number;
55
+ minMs: number;
56
+ maxMs: number;
57
+ samples: number;
58
+ }
59
+ export type DevtoolsLogLevel = "log" | "info" | "warn" | "error";
60
+ export interface DevtoolsLogEntry {
61
+ at: number;
62
+ level: DevtoolsLogLevel;
63
+ message: string;
64
+ }
65
+ export interface DiscoveredEntry {
66
+ readonly id: string;
67
+ readonly table: string;
68
+ readonly key: string;
69
+ readonly kind: DevtoolsControlKind;
70
+ readonly initial: unknown;
71
+ readonly enabled: boolean;
72
+ read(): unknown;
73
+ }
74
+ export interface TunableAccessor {
75
+ initial: unknown;
76
+ get(): unknown;
77
+ set(value: unknown): void;
78
+ }
79
+ export interface DevtoolsOverrides {
80
+ enabled: string[];
81
+ values: Record<string, unknown>;
82
+ }
83
+ export interface DevtoolsSnapshot {
84
+ at: number;
85
+ frame: FrameStats | null;
86
+ render: RenderSample | null;
87
+ latency: LatencyStats | null;
88
+ logs: readonly DevtoolsLogEntry[];
89
+ probes: Record<string, unknown>;
90
+ controls: readonly {
91
+ name: string;
92
+ kind: DevtoolsControlKind;
93
+ value: unknown;
94
+ initial: unknown;
95
+ }[];
96
+ discovered: readonly {
97
+ id: string;
98
+ kind: DevtoolsControlKind;
99
+ value: unknown;
100
+ enabled: boolean;
101
+ }[];
102
+ }
103
+ export interface Devtools {
104
+ frame: {
105
+ record(sample: {
106
+ frameMs: number;
107
+ simMs: number;
108
+ }): void;
109
+ stats(): FrameStats | null;
110
+ };
111
+ render: {
112
+ record(sample: RenderSample): void;
113
+ latest(): RenderSample | null;
114
+ };
115
+ logs: {
116
+ push(level: DevtoolsLogLevel, message: string): void;
117
+ captureConsole(): void;
118
+ list(): readonly DevtoolsLogEntry[];
119
+ clear(): void;
120
+ };
121
+ latency: {
122
+ record(ms: number): void;
123
+ stats(): LatencyStats | null;
124
+ };
125
+ controls: {
126
+ register<T>(name: string, initial: T, options?: TunableOptions<T>): Tunable<T>;
127
+ list(): readonly DevtoolsControl[];
128
+ get(name: string): DevtoolsControl | null;
129
+ remove(name: string): void;
130
+ resetAll(): void;
131
+ };
132
+ discover: {
133
+ bind(table: string, key: string, accessor: TunableAccessor): void;
134
+ scanTable(table: string, candidate: unknown): number;
135
+ scanModule(exports: Record<string, unknown>): number;
136
+ list(): readonly DiscoveredEntry[];
137
+ enable(id: string): void;
138
+ disable(id: string): void;
139
+ clear(): void;
140
+ };
141
+ overrides: {
142
+ export(): DevtoolsOverrides;
143
+ apply(overrides: DevtoolsOverrides): void;
144
+ };
145
+ probes: {
146
+ register(name: string, read: () => unknown): () => void;
147
+ read(): Record<string, unknown>;
148
+ };
149
+ signal: ChangeSignal;
150
+ snapshot(): DevtoolsSnapshot;
151
+ }
152
+ export declare function formatLogMessage(args: readonly unknown[]): string;
153
+ export declare function createDevtools(): Devtools;
154
+ export declare const devtools: Devtools;
155
+ export declare function tunable<T>(name: string, initial: T, options?: TunableOptions<T>): Tunable<T>;
156
+ export declare function snapshotDevtools(): DevtoolsSnapshot;
157
+ export declare function instrumentLatency<T extends object>(target: T, methods: readonly (keyof T)[], record?: (ms: number) => void): T;