aigpu 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +85 -0
  3. package/bin/aigpu.js +15 -0
  4. package/client.d.ts +15 -0
  5. package/dist/agent-tools.d.ts +61 -0
  6. package/dist/agent-tools.d.ts.map +1 -0
  7. package/dist/agent-tools.js +107 -0
  8. package/dist/agent-tools.js.map +1 -0
  9. package/dist/agent.d.ts +56 -0
  10. package/dist/agent.d.ts.map +1 -0
  11. package/dist/agent.js +243 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/api-types.d.ts +56 -0
  14. package/dist/api-types.d.ts.map +1 -0
  15. package/dist/api-types.js +2 -0
  16. package/dist/api-types.js.map +1 -0
  17. package/dist/bind-cache.d.ts +19 -0
  18. package/dist/bind-cache.d.ts.map +1 -0
  19. package/dist/bind-cache.js +43 -0
  20. package/dist/bind-cache.js.map +1 -0
  21. package/dist/bundle.d.ts +30 -0
  22. package/dist/bundle.d.ts.map +1 -0
  23. package/dist/bundle.js +127 -0
  24. package/dist/bundle.js.map +1 -0
  25. package/dist/claim-validation-encode.d.ts +14 -0
  26. package/dist/claim-validation-encode.d.ts.map +1 -0
  27. package/dist/claim-validation-encode.js +28 -0
  28. package/dist/claim-validation-encode.js.map +1 -0
  29. package/dist/claim-validation.d.ts +73 -0
  30. package/dist/claim-validation.d.ts.map +1 -0
  31. package/dist/claim-validation.js +135 -0
  32. package/dist/claim-validation.js.map +1 -0
  33. package/dist/cli/bin/aigpu.js +101 -0
  34. package/dist/cli/lib/check/run.js +153 -0
  35. package/dist/cli/lib/docs/commands/cat.js +12 -0
  36. package/dist/cli/lib/docs/commands/find.js +180 -0
  37. package/dist/cli/lib/docs/commands/grep.js +49 -0
  38. package/dist/cli/lib/docs/commands/ls.js +41 -0
  39. package/dist/cli/lib/docs/commands/path.js +12 -0
  40. package/dist/cli/lib/docs/commands/resolve.js +41 -0
  41. package/dist/cli/lib/docs/commands/shared.js +13 -0
  42. package/dist/cli/lib/docs/commands/symbols.js +25 -0
  43. package/dist/cli/lib/docs/errors.js +8 -0
  44. package/dist/cli/lib/docs/generate/check-drift.js +61 -0
  45. package/dist/cli/lib/docs/generate/cli.js +12 -0
  46. package/dist/cli/lib/docs/generate/generate.js +113 -0
  47. package/dist/cli/lib/docs/generate/manifest.js +218 -0
  48. package/dist/cli/lib/docs/generate/skill.js +150 -0
  49. package/dist/cli/lib/docs/help.js +21 -0
  50. package/dist/cli/lib/docs/index.js +62 -0
  51. package/dist/cli/lib/docs/model.js +7 -0
  52. package/dist/cli/lib/docs/run.js +24 -0
  53. package/dist/cli/lib/docs/service.js +119 -0
  54. package/dist/cli/lib/doctor/run.js +236 -0
  55. package/dist/cli/lib/examples/errors.js +13 -0
  56. package/dist/cli/lib/examples/hashing.js +9 -0
  57. package/dist/cli/lib/examples/help.js +13 -0
  58. package/dist/cli/lib/examples/local-source.js +142 -0
  59. package/dist/cli/lib/examples/paths.js +12 -0
  60. package/dist/cli/lib/examples/pull.js +58 -0
  61. package/dist/cli/lib/examples/run.js +71 -0
  62. package/dist/cli/lib/examples/search.js +6 -0
  63. package/dist/cli/lib/examples/service.js +118 -0
  64. package/dist/cli/lib/generated/docs-manifest.generated.js +4758 -0
  65. package/dist/cli/lib/install-dawn/run.js +24 -0
  66. package/dist/cli/lib/install-software-renderer/run.js +17 -0
  67. package/dist/cli/lib/mcp/http.js +93 -0
  68. package/dist/cli/lib/mcp/server.js +258 -0
  69. package/dist/cli/lib/mcp/stdio.js +34 -0
  70. package/dist/cli/lib/snapshot/png.js +62 -0
  71. package/dist/cli/lib/snapshot/render.js +22 -0
  72. package/dist/cli/lib/snapshot/run.js +79 -0
  73. package/dist/cli/lib/snapshot/shaders.js +11 -0
  74. package/dist/cli/package.json +4 -0
  75. package/dist/client.d.ts +12 -0
  76. package/dist/client.d.ts.map +1 -0
  77. package/dist/client.js +2 -0
  78. package/dist/client.js.map +1 -0
  79. package/dist/clock.d.ts +26 -0
  80. package/dist/clock.d.ts.map +1 -0
  81. package/dist/clock.js +50 -0
  82. package/dist/clock.js.map +1 -0
  83. package/dist/compute.d.ts +41 -0
  84. package/dist/compute.d.ts.map +1 -0
  85. package/dist/compute.js +132 -0
  86. package/dist/compute.js.map +1 -0
  87. package/dist/core/render-bundle.d.ts +30 -0
  88. package/dist/core/render-bundle.d.ts.map +1 -0
  89. package/dist/core/render-bundle.js +39 -0
  90. package/dist/core/render-bundle.js.map +1 -0
  91. package/dist/core/storage-buffer.d.ts +81 -0
  92. package/dist/core/storage-buffer.d.ts.map +1 -0
  93. package/dist/core/storage-buffer.js +91 -0
  94. package/dist/core/storage-buffer.js.map +1 -0
  95. package/dist/core/structured-uniform.d.ts +33 -0
  96. package/dist/core/structured-uniform.d.ts.map +1 -0
  97. package/dist/core/structured-uniform.js +110 -0
  98. package/dist/core/structured-uniform.js.map +1 -0
  99. package/dist/core/uniform-pool-internals.d.ts +12 -0
  100. package/dist/core/uniform-pool-internals.d.ts.map +1 -0
  101. package/dist/core/uniform-pool-internals.js +24 -0
  102. package/dist/core/uniform-pool-internals.js.map +1 -0
  103. package/dist/core/uniform-pool-types.d.ts +22 -0
  104. package/dist/core/uniform-pool-types.d.ts.map +1 -0
  105. package/dist/core/uniform-pool-types.js +2 -0
  106. package/dist/core/uniform-pool-types.js.map +1 -0
  107. package/dist/core/uniform-pool.d.ts +22 -0
  108. package/dist/core/uniform-pool.d.ts.map +1 -0
  109. package/dist/core/uniform-pool.js +128 -0
  110. package/dist/core/uniform-pool.js.map +1 -0
  111. package/dist/core/uniform.d.ts +55 -0
  112. package/dist/core/uniform.d.ts.map +1 -0
  113. package/dist/core/uniform.js +64 -0
  114. package/dist/core/uniform.js.map +1 -0
  115. package/dist/core/wgsl-alignment.d.ts +24 -0
  116. package/dist/core/wgsl-alignment.d.ts.map +1 -0
  117. package/dist/core/wgsl-alignment.js +81 -0
  118. package/dist/core/wgsl-alignment.js.map +1 -0
  119. package/dist/core.d.ts +13 -0
  120. package/dist/core.d.ts.map +1 -0
  121. package/dist/core.js +7 -0
  122. package/dist/core.js.map +1 -0
  123. package/dist/dom.d.ts +37 -0
  124. package/dist/dom.d.ts.map +1 -0
  125. package/dist/dom.js +81 -0
  126. package/dist/dom.js.map +1 -0
  127. package/dist/draw-protocols.d.ts +36 -0
  128. package/dist/draw-protocols.d.ts.map +1 -0
  129. package/dist/draw-protocols.js +10 -0
  130. package/dist/draw-protocols.js.map +1 -0
  131. package/dist/draw.d.ts +248 -0
  132. package/dist/draw.d.ts.map +1 -0
  133. package/dist/draw.js +890 -0
  134. package/dist/draw.js.map +1 -0
  135. package/dist/effect.d.ts +53 -0
  136. package/dist/effect.d.ts.map +1 -0
  137. package/dist/effect.js +75 -0
  138. package/dist/effect.js.map +1 -0
  139. package/dist/entry-metadata.d.ts +16 -0
  140. package/dist/entry-metadata.d.ts.map +1 -0
  141. package/dist/entry-metadata.js +27 -0
  142. package/dist/entry-metadata.js.map +1 -0
  143. package/dist/errors.d.ts +96 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +616 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/frame-protocols.d.ts +107 -0
  148. package/dist/frame-protocols.d.ts.map +1 -0
  149. package/dist/frame-protocols.js +20 -0
  150. package/dist/frame-protocols.js.map +1 -0
  151. package/dist/frame-state.d.ts +32 -0
  152. package/dist/frame-state.d.ts.map +1 -0
  153. package/dist/frame-state.js +62 -0
  154. package/dist/frame-state.js.map +1 -0
  155. package/dist/frame.d.ts +127 -0
  156. package/dist/frame.d.ts.map +1 -0
  157. package/dist/frame.js +645 -0
  158. package/dist/frame.js.map +1 -0
  159. package/dist/group-claim.d.ts +9 -0
  160. package/dist/group-claim.d.ts.map +1 -0
  161. package/dist/group-claim.js +7 -0
  162. package/dist/group-claim.js.map +1 -0
  163. package/dist/index.d.ts +41 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +27 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/indirect.d.ts +39 -0
  168. package/dist/indirect.d.ts.map +1 -0
  169. package/dist/indirect.js +61 -0
  170. package/dist/indirect.js.map +1 -0
  171. package/dist/init-from-device.d.ts +11 -0
  172. package/dist/init-from-device.d.ts.map +1 -0
  173. package/dist/init-from-device.js +56 -0
  174. package/dist/init-from-device.js.map +1 -0
  175. package/dist/init.d.ts +12 -0
  176. package/dist/init.d.ts.map +1 -0
  177. package/dist/init.js +7 -0
  178. package/dist/init.js.map +1 -0
  179. package/dist/kernel.d.ts +104 -0
  180. package/dist/kernel.d.ts.map +1 -0
  181. package/dist/kernel.js +151 -0
  182. package/dist/kernel.js.map +1 -0
  183. package/dist/lifecycle.d.ts +10 -0
  184. package/dist/lifecycle.d.ts.map +1 -0
  185. package/dist/lifecycle.js +21 -0
  186. package/dist/lifecycle.js.map +1 -0
  187. package/dist/live-kernel.d.ts +48 -0
  188. package/dist/live-kernel.d.ts.map +1 -0
  189. package/dist/live-kernel.js +67 -0
  190. package/dist/live-kernel.js.map +1 -0
  191. package/dist/mock.d.ts +42 -0
  192. package/dist/mock.d.ts.map +1 -0
  193. package/dist/mock.js +29 -0
  194. package/dist/mock.js.map +1 -0
  195. package/dist/node.d.ts +48 -0
  196. package/dist/node.d.ts.map +1 -0
  197. package/dist/node.js +36 -0
  198. package/dist/node.js.map +1 -0
  199. package/dist/ping-pong.d.ts +19 -0
  200. package/dist/ping-pong.d.ts.map +1 -0
  201. package/dist/ping-pong.js +67 -0
  202. package/dist/ping-pong.js.map +1 -0
  203. package/dist/pipeline-store.d.ts +89 -0
  204. package/dist/pipeline-store.d.ts.map +1 -0
  205. package/dist/pipeline-store.js +366 -0
  206. package/dist/pipeline-store.js.map +1 -0
  207. package/dist/query-ring.d.ts +91 -0
  208. package/dist/query-ring.d.ts.map +1 -0
  209. package/dist/query-ring.js +178 -0
  210. package/dist/query-ring.js.map +1 -0
  211. package/dist/render-service.d.ts +23 -0
  212. package/dist/render-service.d.ts.map +1 -0
  213. package/dist/render-service.js +37 -0
  214. package/dist/render-service.js.map +1 -0
  215. package/dist/sampler.d.ts +19 -0
  216. package/dist/sampler.d.ts.map +1 -0
  217. package/dist/sampler.js +46 -0
  218. package/dist/sampler.js.map +1 -0
  219. package/dist/scene/camera.d.ts +91 -0
  220. package/dist/scene/camera.d.ts.map +1 -0
  221. package/dist/scene/camera.js +221 -0
  222. package/dist/scene/camera.js.map +1 -0
  223. package/dist/scene/geometries.d.ts +26 -0
  224. package/dist/scene/geometries.d.ts.map +1 -0
  225. package/dist/scene/geometries.js +26 -0
  226. package/dist/scene/geometries.js.map +1 -0
  227. package/dist/scene/geometry-descriptor.d.ts +120 -0
  228. package/dist/scene/geometry-descriptor.d.ts.map +1 -0
  229. package/dist/scene/geometry-descriptor.js +378 -0
  230. package/dist/scene/geometry-descriptor.js.map +1 -0
  231. package/dist/scene/geometry-recipe.d.ts +41 -0
  232. package/dist/scene/geometry-recipe.d.ts.map +1 -0
  233. package/dist/scene/geometry-recipe.js +40 -0
  234. package/dist/scene/geometry-recipe.js.map +1 -0
  235. package/dist/scene/geometry-src/camera-math.d.ts +6 -0
  236. package/dist/scene/geometry-src/camera-math.d.ts.map +1 -0
  237. package/dist/scene/geometry-src/camera-math.js +47 -0
  238. package/dist/scene/geometry-src/camera-math.js.map +1 -0
  239. package/dist/scene/geometry-src/camera.d.ts +10 -0
  240. package/dist/scene/geometry-src/camera.d.ts.map +1 -0
  241. package/dist/scene/geometry-src/camera.js +2 -0
  242. package/dist/scene/geometry-src/camera.js.map +1 -0
  243. package/dist/scene/geometry-src/capsule-data.d.ts +10 -0
  244. package/dist/scene/geometry-src/capsule-data.d.ts.map +1 -0
  245. package/dist/scene/geometry-src/capsule-data.js +61 -0
  246. package/dist/scene/geometry-src/capsule-data.js.map +1 -0
  247. package/dist/scene/geometry-src/cone-data.d.ts +13 -0
  248. package/dist/scene/geometry-src/cone-data.d.ts.map +1 -0
  249. package/dist/scene/geometry-src/cone-data.js +52 -0
  250. package/dist/scene/geometry-src/cone-data.js.map +1 -0
  251. package/dist/scene/geometry-src/cylinder-data.d.ts +14 -0
  252. package/dist/scene/geometry-src/cylinder-data.d.ts.map +1 -0
  253. package/dist/scene/geometry-src/cylinder-data.js +58 -0
  254. package/dist/scene/geometry-src/cylinder-data.js.map +1 -0
  255. package/dist/scene/geometry-src/deg-to-rad.d.ts +2 -0
  256. package/dist/scene/geometry-src/deg-to-rad.d.ts.map +1 -0
  257. package/dist/scene/geometry-src/deg-to-rad.js +4 -0
  258. package/dist/scene/geometry-src/deg-to-rad.js.map +1 -0
  259. package/dist/scene/geometry-src/disk-data.d.ts +12 -0
  260. package/dist/scene/geometry-src/disk-data.d.ts.map +1 -0
  261. package/dist/scene/geometry-src/disk-data.js +21 -0
  262. package/dist/scene/geometry-src/disk-data.js.map +1 -0
  263. package/dist/scene/geometry-src/errors.d.ts +3 -0
  264. package/dist/scene/geometry-src/errors.d.ts.map +1 -0
  265. package/dist/scene/geometry-src/errors.js +5 -0
  266. package/dist/scene/geometry-src/errors.js.map +1 -0
  267. package/dist/scene/geometry-src/icosphere-data.d.ts +8 -0
  268. package/dist/scene/geometry-src/icosphere-data.d.ts.map +1 -0
  269. package/dist/scene/geometry-src/icosphere-data.js +58 -0
  270. package/dist/scene/geometry-src/icosphere-data.js.map +1 -0
  271. package/dist/scene/geometry-src/index.d.ts +36 -0
  272. package/dist/scene/geometry-src/index.d.ts.map +1 -0
  273. package/dist/scene/geometry-src/index.js +21 -0
  274. package/dist/scene/geometry-src/index.js.map +1 -0
  275. package/dist/scene/geometry-src/mesh-box.d.ts +8 -0
  276. package/dist/scene/geometry-src/mesh-box.d.ts.map +1 -0
  277. package/dist/scene/geometry-src/mesh-box.js +57 -0
  278. package/dist/scene/geometry-src/mesh-box.js.map +1 -0
  279. package/dist/scene/geometry-src/mesh-cache.d.ts +4 -0
  280. package/dist/scene/geometry-src/mesh-cache.d.ts.map +1 -0
  281. package/dist/scene/geometry-src/mesh-cache.js +14 -0
  282. package/dist/scene/geometry-src/mesh-cache.js.map +1 -0
  283. package/dist/scene/geometry-src/mesh-capsule.d.ts +14 -0
  284. package/dist/scene/geometry-src/mesh-capsule.d.ts.map +1 -0
  285. package/dist/scene/geometry-src/mesh-capsule.js +52 -0
  286. package/dist/scene/geometry-src/mesh-capsule.js.map +1 -0
  287. package/dist/scene/geometry-src/mesh-cone.d.ts +16 -0
  288. package/dist/scene/geometry-src/mesh-cone.d.ts.map +1 -0
  289. package/dist/scene/geometry-src/mesh-cone.js +54 -0
  290. package/dist/scene/geometry-src/mesh-cone.js.map +1 -0
  291. package/dist/scene/geometry-src/mesh-cylinder.d.ts +18 -0
  292. package/dist/scene/geometry-src/mesh-cylinder.d.ts.map +1 -0
  293. package/dist/scene/geometry-src/mesh-cylinder.js +67 -0
  294. package/dist/scene/geometry-src/mesh-cylinder.js.map +1 -0
  295. package/dist/scene/geometry-src/mesh-disk.d.ts +11 -0
  296. package/dist/scene/geometry-src/mesh-disk.d.ts.map +1 -0
  297. package/dist/scene/geometry-src/mesh-disk.js +45 -0
  298. package/dist/scene/geometry-src/mesh-disk.js.map +1 -0
  299. package/dist/scene/geometry-src/mesh-dodecahedron.d.ts +4 -0
  300. package/dist/scene/geometry-src/mesh-dodecahedron.d.ts.map +1 -0
  301. package/dist/scene/geometry-src/mesh-dodecahedron.js +10 -0
  302. package/dist/scene/geometry-src/mesh-dodecahedron.js.map +1 -0
  303. package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts +7 -0
  304. package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts.map +1 -0
  305. package/dist/scene/geometry-src/mesh-fullscreen-quad.js +39 -0
  306. package/dist/scene/geometry-src/mesh-fullscreen-quad.js.map +1 -0
  307. package/dist/scene/geometry-src/mesh-icosahedron.d.ts +4 -0
  308. package/dist/scene/geometry-src/mesh-icosahedron.d.ts.map +1 -0
  309. package/dist/scene/geometry-src/mesh-icosahedron.js +10 -0
  310. package/dist/scene/geometry-src/mesh-icosahedron.js.map +1 -0
  311. package/dist/scene/geometry-src/mesh-icosphere.d.ts +11 -0
  312. package/dist/scene/geometry-src/mesh-icosphere.d.ts.map +1 -0
  313. package/dist/scene/geometry-src/mesh-icosphere.js +47 -0
  314. package/dist/scene/geometry-src/mesh-icosphere.js.map +1 -0
  315. package/dist/scene/geometry-src/mesh-octahedron.d.ts +4 -0
  316. package/dist/scene/geometry-src/mesh-octahedron.d.ts.map +1 -0
  317. package/dist/scene/geometry-src/mesh-octahedron.js +10 -0
  318. package/dist/scene/geometry-src/mesh-octahedron.js.map +1 -0
  319. package/dist/scene/geometry-src/mesh-plane.d.ts +13 -0
  320. package/dist/scene/geometry-src/mesh-plane.d.ts.map +1 -0
  321. package/dist/scene/geometry-src/mesh-plane.js +51 -0
  322. package/dist/scene/geometry-src/mesh-plane.js.map +1 -0
  323. package/dist/scene/geometry-src/mesh-ring.d.ts +12 -0
  324. package/dist/scene/geometry-src/mesh-ring.d.ts.map +1 -0
  325. package/dist/scene/geometry-src/mesh-ring.js +47 -0
  326. package/dist/scene/geometry-src/mesh-ring.js.map +1 -0
  327. package/dist/scene/geometry-src/mesh-sphere.d.ts +10 -0
  328. package/dist/scene/geometry-src/mesh-sphere.d.ts.map +1 -0
  329. package/dist/scene/geometry-src/mesh-sphere.js +51 -0
  330. package/dist/scene/geometry-src/mesh-sphere.js.map +1 -0
  331. package/dist/scene/geometry-src/mesh-tetrahedron.d.ts +5 -0
  332. package/dist/scene/geometry-src/mesh-tetrahedron.d.ts.map +1 -0
  333. package/dist/scene/geometry-src/mesh-tetrahedron.js +10 -0
  334. package/dist/scene/geometry-src/mesh-tetrahedron.js.map +1 -0
  335. package/dist/scene/geometry-src/mesh-torus.d.ts +17 -0
  336. package/dist/scene/geometry-src/mesh-torus.d.ts.map +1 -0
  337. package/dist/scene/geometry-src/mesh-torus.js +56 -0
  338. package/dist/scene/geometry-src/mesh-torus.js.map +1 -0
  339. package/dist/scene/geometry-src/mesh-types.d.ts +38 -0
  340. package/dist/scene/geometry-src/mesh-types.d.ts.map +1 -0
  341. package/dist/scene/geometry-src/mesh-types.js +2 -0
  342. package/dist/scene/geometry-src/mesh-types.js.map +1 -0
  343. package/dist/scene/geometry-src/mesh.d.ts +61 -0
  344. package/dist/scene/geometry-src/mesh.d.ts.map +1 -0
  345. package/dist/scene/geometry-src/mesh.js +49 -0
  346. package/dist/scene/geometry-src/mesh.js.map +1 -0
  347. package/dist/scene/geometry-src/orthographic-camera.d.ts +14 -0
  348. package/dist/scene/geometry-src/orthographic-camera.d.ts.map +1 -0
  349. package/dist/scene/geometry-src/orthographic-camera.js +9 -0
  350. package/dist/scene/geometry-src/orthographic-camera.js.map +1 -0
  351. package/dist/scene/geometry-src/perspective-camera.d.ts +12 -0
  352. package/dist/scene/geometry-src/perspective-camera.d.ts.map +1 -0
  353. package/dist/scene/geometry-src/perspective-camera.js +9 -0
  354. package/dist/scene/geometry-src/perspective-camera.js.map +1 -0
  355. package/dist/scene/geometry-src/plane-data.d.ts +12 -0
  356. package/dist/scene/geometry-src/plane-data.d.ts.map +1 -0
  357. package/dist/scene/geometry-src/plane-data.js +25 -0
  358. package/dist/scene/geometry-src/plane-data.js.map +1 -0
  359. package/dist/scene/geometry-src/polyhedron-data.d.ts +7 -0
  360. package/dist/scene/geometry-src/polyhedron-data.d.ts.map +1 -0
  361. package/dist/scene/geometry-src/polyhedron-data.js +42 -0
  362. package/dist/scene/geometry-src/polyhedron-data.js.map +1 -0
  363. package/dist/scene/geometry-src/polyhedron-mesh.d.ts +10 -0
  364. package/dist/scene/geometry-src/polyhedron-mesh.d.ts.map +1 -0
  365. package/dist/scene/geometry-src/polyhedron-mesh.js +37 -0
  366. package/dist/scene/geometry-src/polyhedron-mesh.js.map +1 -0
  367. package/dist/scene/geometry-src/polyhedron-seeds.d.ts +6 -0
  368. package/dist/scene/geometry-src/polyhedron-seeds.d.ts.map +1 -0
  369. package/dist/scene/geometry-src/polyhedron-seeds.js +51 -0
  370. package/dist/scene/geometry-src/polyhedron-seeds.js.map +1 -0
  371. package/dist/scene/geometry-src/primitive-data-utils.d.ts +9 -0
  372. package/dist/scene/geometry-src/primitive-data-utils.d.ts.map +1 -0
  373. package/dist/scene/geometry-src/primitive-data-utils.js +36 -0
  374. package/dist/scene/geometry-src/primitive-data-utils.js.map +1 -0
  375. package/dist/scene/geometry-src/ring-data.d.ts +13 -0
  376. package/dist/scene/geometry-src/ring-data.d.ts.map +1 -0
  377. package/dist/scene/geometry-src/ring-data.js +24 -0
  378. package/dist/scene/geometry-src/ring-data.js.map +1 -0
  379. package/dist/scene/geometry-src/sphere-data.d.ts +11 -0
  380. package/dist/scene/geometry-src/sphere-data.d.ts.map +1 -0
  381. package/dist/scene/geometry-src/sphere-data.js +31 -0
  382. package/dist/scene/geometry-src/sphere-data.js.map +1 -0
  383. package/dist/scene/geometry-src/srgb.d.ts +5 -0
  384. package/dist/scene/geometry-src/srgb.d.ts.map +1 -0
  385. package/dist/scene/geometry-src/srgb.js +23 -0
  386. package/dist/scene/geometry-src/srgb.js.map +1 -0
  387. package/dist/scene/geometry-src/torus-data.d.ts +11 -0
  388. package/dist/scene/geometry-src/torus-data.d.ts.map +1 -0
  389. package/dist/scene/geometry-src/torus-data.js +38 -0
  390. package/dist/scene/geometry-src/torus-data.js.map +1 -0
  391. package/dist/scene/geometry-src/vertex-layout.d.ts +2 -0
  392. package/dist/scene/geometry-src/vertex-layout.d.ts.map +1 -0
  393. package/dist/scene/geometry-src/vertex-layout.js +2 -0
  394. package/dist/scene/geometry-src/vertex-layout.js.map +1 -0
  395. package/dist/scene/geometry.d.ts +70 -0
  396. package/dist/scene/geometry.d.ts.map +1 -0
  397. package/dist/scene/geometry.js +71 -0
  398. package/dist/scene/geometry.js.map +1 -0
  399. package/dist/scene/orbit.d.ts +9 -0
  400. package/dist/scene/orbit.d.ts.map +1 -0
  401. package/dist/scene/orbit.js +15 -0
  402. package/dist/scene/orbit.js.map +1 -0
  403. package/dist/scene/tree/errors.d.ts +4 -0
  404. package/dist/scene/tree/errors.d.ts.map +1 -0
  405. package/dist/scene/tree/errors.js +19 -0
  406. package/dist/scene/tree/errors.js.map +1 -0
  407. package/dist/scene/tree/light.d.ts +42 -0
  408. package/dist/scene/tree/light.d.ts.map +1 -0
  409. package/dist/scene/tree/light.js +102 -0
  410. package/dist/scene/tree/light.js.map +1 -0
  411. package/dist/scene/tree/material.d.ts +79 -0
  412. package/dist/scene/tree/material.d.ts.map +1 -0
  413. package/dist/scene/tree/material.js +117 -0
  414. package/dist/scene/tree/material.js.map +1 -0
  415. package/dist/scene/tree/math.d.ts +26 -0
  416. package/dist/scene/tree/math.d.ts.map +1 -0
  417. package/dist/scene/tree/math.js +217 -0
  418. package/dist/scene/tree/math.js.map +1 -0
  419. package/dist/scene/tree/mesh-node.d.ts +17 -0
  420. package/dist/scene/tree/mesh-node.d.ts.map +1 -0
  421. package/dist/scene/tree/mesh-node.js +24 -0
  422. package/dist/scene/tree/mesh-node.js.map +1 -0
  423. package/dist/scene/tree/node.d.ts +70 -0
  424. package/dist/scene/tree/node.d.ts.map +1 -0
  425. package/dist/scene/tree/node.js +220 -0
  426. package/dist/scene/tree/node.js.map +1 -0
  427. package/dist/scene/tree/orbit-controls.d.ts +69 -0
  428. package/dist/scene/tree/orbit-controls.d.ts.map +1 -0
  429. package/dist/scene/tree/orbit-controls.js +226 -0
  430. package/dist/scene/tree/orbit-controls.js.map +1 -0
  431. package/dist/scene.d.ts +21 -0
  432. package/dist/scene.d.ts.map +1 -0
  433. package/dist/scene.js +11 -0
  434. package/dist/scene.js.map +1 -0
  435. package/dist/set-core.d.ts +50 -0
  436. package/dist/set-core.d.ts.map +1 -0
  437. package/dist/set-core.js +268 -0
  438. package/dist/set-core.js.map +1 -0
  439. package/dist/set-layouts.d.ts +20 -0
  440. package/dist/set-layouts.d.ts.map +1 -0
  441. package/dist/set-layouts.js +103 -0
  442. package/dist/set-layouts.js.map +1 -0
  443. package/dist/set-packing.d.ts +4 -0
  444. package/dist/set-packing.d.ts.map +1 -0
  445. package/dist/set-packing.js +82 -0
  446. package/dist/set-packing.js.map +1 -0
  447. package/dist/set-resources.d.ts +20 -0
  448. package/dist/set-resources.d.ts.map +1 -0
  449. package/dist/set-resources.js +140 -0
  450. package/dist/set-resources.js.map +1 -0
  451. package/dist/shader-source.d.ts +4 -0
  452. package/dist/shader-source.d.ts.map +1 -0
  453. package/dist/shader-source.js +21 -0
  454. package/dist/shader-source.js.map +1 -0
  455. package/dist/storage.d.ts +38 -0
  456. package/dist/storage.d.ts.map +1 -0
  457. package/dist/storage.js +76 -0
  458. package/dist/storage.js.map +1 -0
  459. package/dist/surface.d.ts +89 -0
  460. package/dist/surface.d.ts.map +1 -0
  461. package/dist/surface.js +243 -0
  462. package/dist/surface.js.map +1 -0
  463. package/dist/target-offscreen.d.ts +41 -0
  464. package/dist/target-offscreen.d.ts.map +1 -0
  465. package/dist/target-offscreen.js +115 -0
  466. package/dist/target-offscreen.js.map +1 -0
  467. package/dist/target-utils.d.ts +37 -0
  468. package/dist/target-utils.d.ts.map +1 -0
  469. package/dist/target-utils.js +103 -0
  470. package/dist/target-utils.js.map +1 -0
  471. package/dist/target.d.ts +65 -0
  472. package/dist/target.d.ts.map +1 -0
  473. package/dist/target.js +2 -0
  474. package/dist/target.js.map +1 -0
  475. package/dist/timer.d.ts +78 -0
  476. package/dist/timer.d.ts.map +1 -0
  477. package/dist/timer.js +261 -0
  478. package/dist/timer.js.map +1 -0
  479. package/dist/uniforms-layout.d.ts +8 -0
  480. package/dist/uniforms-layout.d.ts.map +1 -0
  481. package/dist/uniforms-layout.js +84 -0
  482. package/dist/uniforms-layout.js.map +1 -0
  483. package/dist/uniforms.d.ts +43 -0
  484. package/dist/uniforms.d.ts.map +1 -0
  485. package/dist/uniforms.js +176 -0
  486. package/dist/uniforms.js.map +1 -0
  487. package/dist/visibility.d.ts +118 -0
  488. package/dist/visibility.d.ts.map +1 -0
  489. package/dist/visibility.js +290 -0
  490. package/dist/visibility.js.map +1 -0
  491. package/package.json +131 -0
@@ -0,0 +1,118 @@
1
+ import type { Device } from "@aigpu/core";
2
+ import { FRAME_PASS_ATTACHMENT, type FramePassAttachContext, type FramePassAttachResult } from "./frame-protocols.ts";
3
+ import type { Gpu } from "./kernel.ts";
4
+ import { type QueryHostOptions } from "./query-ring.ts";
5
+ export interface VisibilityOptions {
6
+ /** Query slots. Max 4096 (WebGPU fixed limit). Default 64. */
7
+ readonly capacity?: number;
8
+ }
9
+ /** Latched result state of a visibility query: `"hidden"` only after a completed query confirmed zero passing samples. */
10
+ export type VisibilityState = "visible" | "hidden" | "unknown";
11
+ /**
12
+ * Occlusion query results for visibility culling, created by `visibility(gpu)`.
13
+ * Core WebGPU — no device feature required. Pass the instance as
14
+ * `FramePassOptions.visibility`, wrap proxy draws in `pass.occlusion(handle, body)`,
15
+ * and condition real draws on `handle.hidden`.
16
+ */
17
+ export interface Visibility {
18
+ /** Stable handle, created once outside the loop. Duplicate label → AIGPU-VIS-LABEL-DUPLICATE. */
19
+ query(label: string): VisibilityQuery;
20
+ /** Camera cut / teleport: all results become "unknown". */
21
+ reset(): void;
22
+ dispose(): void;
23
+ }
24
+ export interface VisibilityQuery {
25
+ readonly label: string;
26
+ /** true ONLY when a completed query confirmed zero passing samples (and no reset since). "unknown" and "visible" are false: the safe default is to draw. Stable for the duration of a frame. */
27
+ readonly hidden: boolean;
28
+ readonly state: "visible" | "hidden" | "unknown";
29
+ /** Frames since the last applied result; Infinity if none yet. */
30
+ readonly age: number;
31
+ reset(): void;
32
+ dispose(): void;
33
+ }
34
+ /** @internal */
35
+ export declare function createVisibility(device: Device, options?: VisibilityOptions, frameCounter?: () => number, host?: QueryHostOptions): Visibility;
36
+ /**
37
+ * Occlusion query results for visibility culling. Core WebGPU — no device feature required. Pass the
38
+ * instance as `FramePassOptions.visibility`, wrap proxy draws in `pass.occlusion(handle, body)` and
39
+ * condition the real draw on `handle.hidden`.
40
+ *
41
+ * `VisibilityQuery.age` counts frames through the kernel's frame state, which is created on demand:
42
+ * a program that never opens a frame keeps reading age `Infinity` instead of paying for the clock.
43
+ * The instance goes down with `gpu.dispose()` (resource phase) or earlier with `visibility.dispose()`.
44
+ */
45
+ export declare function visibility(gpu: Gpu, options?: VisibilityOptions): Visibility;
46
+ declare class InternalVisibilityQuery implements VisibilityQuery {
47
+ #private;
48
+ readonly label: string;
49
+ readonly owner: InternalVisibility;
50
+ constructor(label: string, owner: InternalVisibility);
51
+ get hidden(): boolean;
52
+ get state(): VisibilityState;
53
+ get age(): number;
54
+ reset(): void;
55
+ dispose(): void;
56
+ /** @internal */
57
+ get disposed(): boolean;
58
+ /** @internal Generation captured at slot allocation; results only apply when it still matches. */
59
+ get generation(): number;
60
+ /** @internal Called from the ring's apply closure, async between frames — the only state write besides reset(). */
61
+ applyResult(value: bigint, generation: number, frame: number): void;
62
+ }
63
+ /**
64
+ * Ring-1 occlusion query facade. Owns label→handle bookkeeping, contiguous
65
+ * per-frame slot allocation (slot order = allocation order, reset each frame),
66
+ * and result latching into handles; the query set + resolve/readback plumbing
67
+ * lives in the shared query ring. Capacity is a declared contract — the query
68
+ * set is bound to pass descriptors mid-frame, so it never grows.
69
+ *
70
+ * @internal
71
+ */
72
+ export declare class InternalVisibility {
73
+ #private;
74
+ readonly capacity: number;
75
+ constructor(device: Device, options: VisibilityOptions, frameCounter: () => number, host?: QueryHostOptions);
76
+ query(label: string): VisibilityQuery;
77
+ reset(): void;
78
+ dispose(): void;
79
+ /** @internal */
80
+ get disposed(): boolean;
81
+ /** @internal */
82
+ currentFrame(): number;
83
+ /**
84
+ * @internal Label-reuse rule: a disposed handle's label is freed immediately. This is safe
85
+ * because in-flight readbacks resolve results through handle *object references* captured
86
+ * per frame — never by label lookup — and a disposed handle's applyResult is a no-op, so a
87
+ * new same-label handle can never observe the old handle's stale results.
88
+ */
89
+ releaseLabel(query: InternalVisibilityQuery): void;
90
+ /** @internal Pass descriptor's occlusionQuerySet: one "occlusion"-type set owned by the shared ring. */
91
+ get querySet(): GPUQuerySet;
92
+ /**
93
+ * Frame pass attachment: validates that the pass can host occlusion queries at all, joins the
94
+ * frame's bookkeeping and hands back the query source `FramePass.occlusion()` allocates from.
95
+ *
96
+ * The depth check lives here, not in the frame: without depth testing an occlusion query passes
97
+ * for anything rasterized, so it always reports "visible" — useless for culling, and only this
98
+ * attachment knows that rule.
99
+ */
100
+ [FRAME_PASS_ATTACHMENT](ctx: FramePassAttachContext): FramePassAttachResult;
101
+ /** @internal Frame.pass hook: validates the gpu match and (re)starts per-frame slot allocation. */
102
+ attachFrame(frame: unknown, frameDevice: Device): void;
103
+ /** @internal FramePass.occlusion hook: validates the handle and allocates this frame's next contiguous slot. */
104
+ beginQuery(query: VisibilityQuery, frame: unknown): number;
105
+ /** @internal Frame.submit hook, before encoder.finish(): appends this frame's single resolve to the frame encoder. */
106
+ finalizeFrame(frame: unknown, encoder: GPUCommandEncoder): void;
107
+ /** @internal Frame.submit hook, after queue.submit succeeds: starts the non-blocking readback. */
108
+ frameSubmitted(frame: unknown): void;
109
+ /**
110
+ * @internal Frame abandon hook (a failed pass, a failed finish/submit, or Frame.cancel()): the
111
+ * frame ends without ever reaching the queue. Drops the pending encoded state so no readback can
112
+ * decode stale staging bytes as a phantom "hidden", and releases the retain this frame took when
113
+ * it opened a visibility pass — the counterpart of frameSubmitted() for frames that never submit.
114
+ */
115
+ frameAbandoned(frame: unknown): void;
116
+ }
117
+ export {};
118
+ //# sourceMappingURL=visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../src/visibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,290 @@
1
+ import { queryDuplicateError, visibilityCapacityError, visibilityCapacityLimitError, visibilityDisposedError, visibilityInvalidError, visibilityLabelDuplicateError, visibilityNoDepthError } from "./errors.js";
2
+ import { FRAME_PASS_ATTACHMENT } from "./frame-protocols.js";
3
+ import { frameState } from "./frame-state.js";
4
+ import { liveKernel, ownQueryFeature } from "./live-kernel.js";
5
+ import { createQueryRing } from "./query-ring.js";
6
+ /** WebGPU createQuerySet: "descriptor.count must be ≤ 4096" — a fixed constant, not a device limit. */
7
+ const MAX_QUERIES = 4096;
8
+ const DEFAULT_CAPACITY = 64;
9
+ /** @internal */
10
+ export function createVisibility(device, options = {}, frameCounter = () => 0, host = {}) {
11
+ return new InternalVisibility(device, options, frameCounter, host);
12
+ }
13
+ /**
14
+ * Occlusion query results for visibility culling. Core WebGPU — no device feature required. Pass the
15
+ * instance as `FramePassOptions.visibility`, wrap proxy draws in `pass.occlusion(handle, body)` and
16
+ * condition the real draw on `handle.hidden`.
17
+ *
18
+ * `VisibilityQuery.age` counts frames through the kernel's frame state, which is created on demand:
19
+ * a program that never opens a frame keeps reading age `Infinity` instead of paying for the clock.
20
+ * The instance goes down with `gpu.dispose()` (resource phase) or earlier with `visibility.dispose()`.
21
+ */
22
+ export function visibility(gpu, options = {}) {
23
+ const kernel = liveKernel(gpu, "visibility");
24
+ return ownQueryFeature(kernel, (host) => new InternalVisibility(kernel.device, options, () => frameState(kernel).frameCount, host));
25
+ }
26
+ class InternalVisibilityQuery {
27
+ label;
28
+ owner;
29
+ #state = "unknown";
30
+ /** clock(gpu).frameCount stamped when the last result applied; age = frameCount - stamp. */
31
+ #resultFrame;
32
+ /** Reset generation: results captured before a reset() carry a stale generation and are discarded at apply. */
33
+ #generation = 0;
34
+ #disposed = false;
35
+ constructor(label, owner) {
36
+ this.label = label;
37
+ this.owner = owner;
38
+ }
39
+ get hidden() { return this.#state === "hidden"; }
40
+ get state() { return this.#state; }
41
+ get age() { return this.#resultFrame === undefined ? Infinity : this.owner.currentFrame() - this.#resultFrame; }
42
+ reset() {
43
+ if (this.#disposed)
44
+ throw visibilityDisposedError("query handle", "VisibilityQuery.reset");
45
+ this.#state = "unknown";
46
+ this.#resultFrame = undefined;
47
+ // In-flight readbacks from pre-reset frames captured the previous generation; apply discards them.
48
+ this.#generation += 1;
49
+ }
50
+ dispose() {
51
+ if (this.#disposed)
52
+ return;
53
+ this.#disposed = true;
54
+ this.#state = "unknown";
55
+ this.#resultFrame = undefined;
56
+ this.owner.releaseLabel(this);
57
+ }
58
+ /** @internal */
59
+ get disposed() { return this.#disposed; }
60
+ /** @internal Generation captured at slot allocation; results only apply when it still matches. */
61
+ get generation() { return this.#generation; }
62
+ /** @internal Called from the ring's apply closure, async between frames — the only state write besides reset(). */
63
+ applyResult(value, generation, frame) {
64
+ if (this.#disposed || generation !== this.#generation)
65
+ return;
66
+ // WebGPU occlusion semantics are zero vs non-zero ONLY: "a value of 0 indicates that no samples passed;
67
+ // any other value is unspecified". Never expose the value as a count.
68
+ this.#state = value !== 0n ? "visible" : "hidden";
69
+ this.#resultFrame = frame;
70
+ }
71
+ }
72
+ /**
73
+ * Ring-1 occlusion query facade. Owns label→handle bookkeeping, contiguous
74
+ * per-frame slot allocation (slot order = allocation order, reset each frame),
75
+ * and result latching into handles; the query set + resolve/readback plumbing
76
+ * lives in the shared query ring. Capacity is a declared contract — the query
77
+ * set is bound to pass descriptors mid-frame, so it never grows.
78
+ *
79
+ * @internal
80
+ */
81
+ export class InternalVisibility {
82
+ #device;
83
+ #frameCounter;
84
+ #host;
85
+ #ring;
86
+ capacity;
87
+ /** Live (not disposed) handles by label. */
88
+ #queries = new Map();
89
+ #frame;
90
+ #frameEntries = [];
91
+ #frameUsed = new Set();
92
+ #encodedEntries;
93
+ /**
94
+ * One retain per open frame whose pass descriptors reference the ring's query set, keyed by frame
95
+ * identity. Released only when that frame reports back — submitted, failed or abandoned — because
96
+ * nothing else proves the frame's encoder is done with the query set: age does not (a Frame held
97
+ * for many frames can still be submitted), so a Frame the caller drops without submit() keeps its
98
+ * retain until gpu.dispose() or device loss, like a native encoder that never finishes.
99
+ */
100
+ #frameRetains = new Map();
101
+ #disposed = false;
102
+ constructor(device, options, frameCounter, host = {}) {
103
+ const capacity = options.capacity ?? DEFAULT_CAPACITY;
104
+ if (typeof capacity !== "number" || !Number.isInteger(capacity) || capacity < 1 || capacity > MAX_QUERIES) {
105
+ throw visibilityCapacityLimitError(capacity, MAX_QUERIES);
106
+ }
107
+ this.#device = device;
108
+ this.#frameCounter = frameCounter;
109
+ this.#host = host;
110
+ this.capacity = capacity;
111
+ this.#ring = createQueryRing(device, { type: "occlusion", capacity, label: "aigpu.visibility", trackSettled: host.trackSettled, errorSink: host.errorSink });
112
+ }
113
+ query(label) {
114
+ this.#assertUsable("Visibility.query");
115
+ if (typeof label !== "string" || label.length === 0) {
116
+ throw visibilityInvalidError(`query label received ${previewLabel(label)}; expected a non-empty string.`, `Label each queried object, e.g. vis.query("statue").`, "Visibility.query");
117
+ }
118
+ if (this.#queries.has(label))
119
+ throw visibilityLabelDuplicateError(label);
120
+ const query = new InternalVisibilityQuery(label, this);
121
+ this.#queries.set(label, query);
122
+ return query;
123
+ }
124
+ reset() {
125
+ this.#assertUsable("Visibility.reset");
126
+ for (const query of this.#queries.values())
127
+ query.reset();
128
+ }
129
+ dispose() {
130
+ if (this.#disposed)
131
+ return;
132
+ this.#disposed = true;
133
+ this.#queries.clear();
134
+ this.#frameEntries = [];
135
+ this.#frameUsed.clear();
136
+ this.#encodedEntries = undefined;
137
+ // The ring defers its destruction while the current frame still references the query set from a
138
+ // pass descriptor (released at frameSubmitted or at the next frame boundary).
139
+ this.#ring.dispose();
140
+ this.#host.onDispose?.();
141
+ }
142
+ /** @internal */
143
+ get disposed() { return this.#disposed; }
144
+ /** @internal */
145
+ currentFrame() { return this.#frameCounter(); }
146
+ /**
147
+ * @internal Label-reuse rule: a disposed handle's label is freed immediately. This is safe
148
+ * because in-flight readbacks resolve results through handle *object references* captured
149
+ * per frame — never by label lookup — and a disposed handle's applyResult is a no-op, so a
150
+ * new same-label handle can never observe the old handle's stale results.
151
+ */
152
+ releaseLabel(query) {
153
+ if (this.#queries.get(query.label) === query)
154
+ this.#queries.delete(query.label);
155
+ }
156
+ /** @internal Pass descriptor's occlusionQuerySet: one "occlusion"-type set owned by the shared ring. */
157
+ get querySet() { return this.#ring.querySet; }
158
+ /**
159
+ * Frame pass attachment: validates that the pass can host occlusion queries at all, joins the
160
+ * frame's bookkeeping and hands back the query source `FramePass.occlusion()` allocates from.
161
+ *
162
+ * The depth check lives here, not in the frame: without depth testing an occlusion query passes
163
+ * for anything rasterized, so it always reports "visible" — useless for culling, and only this
164
+ * attachment knows that rule.
165
+ */
166
+ [FRAME_PASS_ATTACHMENT](ctx) {
167
+ if (!ctx.target.depth)
168
+ throw visibilityNoDepthError();
169
+ this.attachFrame(ctx.frame, ctx.device);
170
+ return {
171
+ owner: this,
172
+ occlusion: { querySet: this.querySet, beginQuery: (query, frame) => this.beginQuery(query, frame) },
173
+ };
174
+ }
175
+ /** @internal Frame.pass hook: validates the gpu match and (re)starts per-frame slot allocation. */
176
+ attachFrame(frame, frameDevice) {
177
+ this.#assertUsable("Frame.pass");
178
+ if (frameDevice !== this.#device) {
179
+ throw visibilityInvalidError("the visibility instance belongs to a different gpu; occlusion queries cannot cross devices.", "Create one visibility(gpu) per gpu and use it only with that gpu's frames.", "Frame.pass");
180
+ }
181
+ if (frame !== this.#frame)
182
+ this.#beginFrame(frame);
183
+ // The pass descriptor's occlusionQuerySet references the ring's query set for the rest of the frame:
184
+ // keep the ring alive even if dispose() lands mid-frame. The retain is per frame, so a second
185
+ // frame opened while this one is still unsubmitted cannot release it — both keep the set alive
186
+ // until each of them is submitted or abandoned.
187
+ this.#retainRing(frame);
188
+ }
189
+ /** @internal FramePass.occlusion hook: validates the handle and allocates this frame's next contiguous slot. */
190
+ beginQuery(query, frame) {
191
+ this.#assertUsable("FramePass.occlusion");
192
+ if (!(query instanceof InternalVisibilityQuery)) {
193
+ throw visibilityInvalidError(`occlusion() received ${previewLabel(query)}; expected a VisibilityQuery from vis.query(label).`, `Create const q = vis.query("label") once from the pass's visibility instance, then p.occlusion(q, body).`, "FramePass.occlusion");
194
+ }
195
+ if (query.owner !== this) {
196
+ throw visibilityInvalidError(`query '${query.label}' belongs to a different visibility instance than the one this pass was opened with.`, "Use handles from the same visibility(gpu) instance passed as the pass's visibility option.", "FramePass.occlusion");
197
+ }
198
+ if (query.disposed)
199
+ throw visibilityDisposedError("query handle", "FramePass.occlusion");
200
+ if (frame !== this.#frame) {
201
+ throw visibilityInvalidError("the pass is not part of the current frame; occlusion() must run inside the frame that opened the pass.", "Encode occlusion scopes inside the pass callback of the current frame(gpu).", "FramePass.occlusion");
202
+ }
203
+ // Duplicate use is forbidden across passes too: cross-pass reuse of a query index silently
204
+ // overwrites the earlier result in native WebGPU, so aigpu rejects it up front.
205
+ if (this.#frameUsed.has(query))
206
+ throw queryDuplicateError(query.label);
207
+ const index = this.#frameEntries.length;
208
+ if (index >= this.capacity)
209
+ throw visibilityCapacityError(this.capacity);
210
+ this.#frameUsed.add(query);
211
+ this.#frameEntries.push({ query, generation: query.generation });
212
+ return index;
213
+ }
214
+ /** @internal Frame.submit hook, before encoder.finish(): appends this frame's single resolve to the frame encoder. */
215
+ finalizeFrame(frame, encoder) {
216
+ this.#encodedEntries = undefined;
217
+ if (this.#disposed || frame !== this.#frame || this.#frameEntries.length === 0)
218
+ return;
219
+ if (this.#ring.encodeResolve(encoder, this.#frameEntries.length))
220
+ this.#encodedEntries = [...this.#frameEntries];
221
+ }
222
+ /** @internal Frame.submit hook, after queue.submit succeeds: starts the non-blocking readback. */
223
+ frameSubmitted(frame) {
224
+ // Release *this* frame's retain first: the command buffer is submitted (or the frame was
225
+ // abandoned), so nothing it encoded references the query set anymore, and a dispose() that
226
+ // landed mid-frame can now destroy the ring. Runs before the identity check so a frame that is
227
+ // no longer the current one — another frame was opened meanwhile — still releases.
228
+ this.#releaseRing(frame);
229
+ // Results stay identity-scoped: only the current frame's encoded resolve is read back.
230
+ if (frame !== this.#frame)
231
+ return;
232
+ if (this.#disposed)
233
+ return;
234
+ const entries = this.#encodedEntries;
235
+ this.#encodedEntries = undefined;
236
+ if (!entries || entries.length === 0)
237
+ return;
238
+ this.#ring.onSubmitted((values) => {
239
+ // Latch contract: handle state only changes here (async, between frames) and via reset(),
240
+ // so reads during a frame callback are stable. The ring already applies readbacks in order.
241
+ if (this.#disposed)
242
+ return;
243
+ const frameStamp = this.#frameCounter();
244
+ for (let index = 0; index < entries.length; index++) {
245
+ const entry = entries[index];
246
+ const value = values[index];
247
+ // hidden must be *confirmed* zero: a missing value never downgrades to "hidden".
248
+ if (value !== undefined)
249
+ entry.query.applyResult(value, entry.generation, frameStamp);
250
+ }
251
+ });
252
+ }
253
+ /**
254
+ * @internal Frame abandon hook (a failed pass, a failed finish/submit, or Frame.cancel()): the
255
+ * frame ends without ever reaching the queue. Drops the pending encoded state so no readback can
256
+ * decode stale staging bytes as a phantom "hidden", and releases the retain this frame took when
257
+ * it opened a visibility pass — the counterpart of frameSubmitted() for frames that never submit.
258
+ */
259
+ frameAbandoned(frame) {
260
+ if (frame === this.#frame)
261
+ this.#encodedEntries = undefined;
262
+ this.#releaseRing(frame);
263
+ }
264
+ #beginFrame(frame) {
265
+ this.#frame = frame;
266
+ this.#frameEntries = [];
267
+ this.#frameUsed.clear();
268
+ }
269
+ #retainRing(frame) {
270
+ if (this.#frameRetains.has(frame))
271
+ return;
272
+ this.#frameRetains.set(frame, this.#ring);
273
+ this.#ring.retain();
274
+ }
275
+ #releaseRing(frame) {
276
+ const ring = this.#frameRetains.get(frame);
277
+ if (!ring)
278
+ return;
279
+ this.#frameRetains.delete(frame);
280
+ ring.release();
281
+ }
282
+ #assertUsable(where) {
283
+ if (this.#disposed)
284
+ throw visibilityDisposedError("visibility", where);
285
+ }
286
+ }
287
+ function previewLabel(value) {
288
+ return typeof value === "string" ? `'${value}'` : String(value);
289
+ }
290
+ //# sourceMappingURL=visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.js","sourceRoot":"","sources":["../src/visibility.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,131 @@
1
+ {
2
+ "name": "aigpu",
3
+ "version": "0.3.1",
4
+ "description": "GPU animations for AI agents: a small, explicit WebGPU and WGSL runtime.",
5
+ "keywords": [
6
+ "webgpu",
7
+ "graphics",
8
+ "rendering",
9
+ "aigpu",
10
+ "ai",
11
+ "agents",
12
+ "animation"
13
+ ],
14
+ "homepage": "https://github.com/hautlys/AIGpu",
15
+ "bugs": {
16
+ "url": "https://github.com/hautlys/AIGpu/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/hautlys/AIGpu.git",
21
+ "directory": "packages/aigpu-api"
22
+ },
23
+ "license": "MIT",
24
+ "author": "Matias Gonzalez <matiasngf@hotmail.com>",
25
+ "private": false,
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "sideEffects": false,
30
+ "type": "module",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./node": {
38
+ "types": "./dist/node.d.ts",
39
+ "import": "./dist/node.js",
40
+ "default": "./dist/node.js"
41
+ },
42
+ "./mock": {
43
+ "types": "./dist/mock.d.ts",
44
+ "import": "./dist/mock.js",
45
+ "default": "./dist/mock.js"
46
+ },
47
+ "./scene": {
48
+ "types": "./dist/scene.d.ts",
49
+ "import": "./dist/scene.js",
50
+ "default": "./dist/scene.js"
51
+ },
52
+ "./client": {
53
+ "types": "./client.d.ts",
54
+ "import": "./dist/client.js",
55
+ "default": "./dist/client.js"
56
+ },
57
+ "./core": {
58
+ "types": "./dist/core.d.ts",
59
+ "import": "./dist/core.js",
60
+ "default": "./dist/core.js"
61
+ },
62
+ "./dom": {
63
+ "types": "./dist/dom.d.ts",
64
+ "import": "./dist/dom.js",
65
+ "default": "./dist/dom.js"
66
+ },
67
+ "./tools": {
68
+ "types": "./dist/agent-tools.d.ts",
69
+ "import": "./dist/agent-tools.js",
70
+ "default": "./dist/agent-tools.js"
71
+ },
72
+ "./package.json": "./package.json"
73
+ },
74
+ "files": [
75
+ "client.d.ts",
76
+ "bin",
77
+ "dist",
78
+ "!dist/tsconfig.tsbuildinfo",
79
+ "README.md",
80
+ "LICENSE"
81
+ ],
82
+ "dependencies": {
83
+ "@modelcontextprotocol/server": "2.0.0",
84
+ "@webgpu/types": "^0.1.69",
85
+ "pixelmatch": "^7.2.0",
86
+ "pngjs": "^7.0.0",
87
+ "wgpu-matrix": "^3.4.2",
88
+ "zod": "^4.4.3",
89
+ "@aigpu/wgsl-std": "0.3.1",
90
+ "@aigpu/wgsl": "0.3.1",
91
+ "@aigpu/adapter-node": "0.3.1",
92
+ "@aigpu/core": "0.3.1",
93
+ "@aigpu/adapter-mock": "0.3.1"
94
+ },
95
+ "aigpuExportBundleBudgetNote": "Gzip ceilings use 512-byte granularity: each budget is the next 512-byte multiple strictly above the measured size. Regenerate with `pnpm bundle-check --update`. aigpuBundleAudience/aigpuExportBundleAudiences select the gate: \"client\" entries ship to browsers and fail on any byte over budget; \"tooling\" entries (loaders, Node runtime, CLI, package tarballs) only warn until growth passes aigpuBundleBudgetGrowthThreshold (default 5%). Tarballs measure published dist bytes with sourcemap sourcesContent stripped and *.docs.md excluded.",
96
+ "aigpuExportBundleAudiences": {
97
+ ".": "client",
98
+ "./node": "tooling",
99
+ "./mock": "tooling",
100
+ "./scene": "client",
101
+ "./client": "client",
102
+ "./core": "client",
103
+ "./dom": "client",
104
+ "./tools": "client"
105
+ },
106
+ "aigpuExportBundleBudgetsGzipBytes": {
107
+ ".": 40960,
108
+ "./node": 40960,
109
+ "./mock": 40960,
110
+ "./scene": 12800,
111
+ "./client": 512,
112
+ "./core": 3584,
113
+ "./dom": 28160,
114
+ "./tools": 5120
115
+ },
116
+ "bin": {
117
+ "aigpu": "./bin/aigpu.js"
118
+ },
119
+ "aigpuExperienceBundleBudgetsGzipBytes": {
120
+ "init-only": 1024,
121
+ "effect-only": 25600,
122
+ "triangle-low-level": 28672,
123
+ "draw-recipe-box": 30208,
124
+ "full-root": 41472
125
+ },
126
+ "aigpuSceneBundleBudgetNote": "The scene barrel retains all recipe builders after the geometry redesign; direct primitive imports retain only their selected mesh, as the experience fixtures assert.",
127
+ "scripts": {
128
+ "build": "tsc -b && node scripts/copy-cli.mjs",
129
+ "test": "cd ../.. && vitest run packages/aigpu-api"
130
+ }
131
+ }