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,24 @@
1
+ export async function runInstallDawn(args, dependencies = {}) {
2
+ if (args.includes("--help") || args.includes("-h")) {
3
+ return {
4
+ code: 0,
5
+ stdout:
6
+ "Usage: aigpu install-dawn\n\nDownload and verify the portable Dawn binary for this platform.\nHonors GH_TOKEN/GITHUB_TOKEN and AIGPU_CACHE_DIR.\n",
7
+ };
8
+ }
9
+ if (args.length > 0) return { code: 1, stderr: `Unknown install-dawn option: ${args[0]}\n` };
10
+
11
+ try {
12
+ const install = dependencies.installDawn ?? (await import("@aigpu/adapter-node/install-dawn")).installDawn;
13
+ const result = await install();
14
+ return {
15
+ code: 0,
16
+ stdout: `${result.downloaded ? "Downloaded" : "Verified"} Dawn prebuild: ${result.path}\n`,
17
+ };
18
+ } catch (error) {
19
+ const details = error && typeof error === "object" ? error : {};
20
+ const code = details.code ? `${details.code}: ` : "";
21
+ const fix = details.fix ? `\n${details.fix}` : "";
22
+ return { code: 1, stderr: `${code}${String(details.message ?? error)}${fix}\n` };
23
+ }
24
+ }
@@ -0,0 +1,17 @@
1
+ export async function runInstallSoftwareRenderer(args, dependencies = {}) {
2
+ if (args.includes("--help") || args.includes("-h")) return {
3
+ code: 0,
4
+ stdout: "Usage: aigpu install-software-renderer\n\nDownload and sha256-verify the portable CPU software renderer for this platform.\nHonors AIGPU_CACHE_DIR.\n",
5
+ };
6
+ if (args.length > 0) return { code: 1, stderr: `Unknown install-software-renderer option: ${args[0]}\n` };
7
+ try {
8
+ const install = dependencies.installSoftwareRenderer ?? (await import("@aigpu/adapter-node/install-software-renderer")).installSoftwareRenderer;
9
+ const result = await install();
10
+ return { code: 0, stdout: `${result.downloaded ? "Downloaded" : "Verified"} software renderer: ${result.path}\n` };
11
+ } catch (error) {
12
+ const details = error && typeof error === "object" ? error : {};
13
+ const code = details.code ? `${details.code}: ` : "";
14
+ const fix = details.fix ? `\n${details.fix}` : "";
15
+ return { code: 1, stderr: `${code}${String(details.message ?? error)}${fix}\n` };
16
+ }
17
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ createMcpHandler,
3
+ originValidationResponse,
4
+ } from "@modelcontextprotocol/server";
5
+ import { createAIGpuMcpServer } from "./server.js";
6
+
7
+ const MAX_REQUEST_BYTES = 64 * 1024;
8
+
9
+ /**
10
+ * @param {{
11
+ * version: string,
12
+ * docs: { execute(input: unknown): unknown },
13
+ * examples: { execute(input: unknown): unknown },
14
+ * allowedOriginHostnames?: string[],
15
+ * onerror?: (error: Error) => void,
16
+ * }} options
17
+ */
18
+ export function createAIGpuMcpHttpHandler({
19
+ version,
20
+ docs,
21
+ examples,
22
+ allowedOriginHostnames = /** @type {string[]} */ ([]),
23
+ onerror,
24
+ }) {
25
+ // This route is horizontally scaled, so process-local legacy sessions cannot be routed
26
+ // reliably. Modern MCP is request-scoped and keeps the public handler stateless.
27
+ const handler = createMcpHandler(
28
+ () => createAIGpuMcpServer({ version, docs, examples, allowDownload: false }),
29
+ { legacy: "reject", onerror },
30
+ );
31
+
32
+ return {
33
+ ...handler,
34
+ async fetch(request, options) {
35
+ const rejectedOrigin = originValidationResponse(
36
+ request,
37
+ [...new Set(allowedOriginHostnames)],
38
+ );
39
+ if (rejectedOrigin) return rejectedOrigin;
40
+
41
+ const contentLength = request.headers.get("content-length");
42
+ if (contentLength !== null && (!/^\d+$/u.test(contentLength) || Number(contentLength) > MAX_REQUEST_BYTES)) {
43
+ return new Response("MCP request body is too large.\n", { status: 413 });
44
+ }
45
+ let bounded;
46
+ try {
47
+ bounded = await bufferBoundedRequest(request);
48
+ } catch (error) {
49
+ const normalized = error instanceof Error ? error : new Error(String(error));
50
+ try { onerror?.(normalized); } catch {}
51
+ return Response.json({
52
+ jsonrpc: "2.0",
53
+ error: { code: -32700, message: "Parse error: the request body could not be read" },
54
+ id: null,
55
+ }, { status: 400 });
56
+ }
57
+ if (bounded instanceof Response) return bounded;
58
+ return handler.fetch(bounded, options);
59
+ },
60
+ close: () => handler.close(),
61
+ };
62
+ }
63
+
64
+ async function bufferBoundedRequest(request) {
65
+ if (!request.body) return request;
66
+ const reader = request.body.getReader();
67
+ const chunks = [];
68
+ let size = 0;
69
+ try {
70
+ for (;;) {
71
+ const { done, value } = await reader.read();
72
+ if (done) break;
73
+ size += value.byteLength;
74
+ if (size > MAX_REQUEST_BYTES) {
75
+ await reader.cancel().catch(() => undefined);
76
+ return new Response("MCP request body is too large.\n", { status: 413 });
77
+ }
78
+ chunks.push(value);
79
+ }
80
+ } catch (error) {
81
+ await reader.cancel().catch(() => undefined);
82
+ throw error;
83
+ } finally {
84
+ reader.releaseLock();
85
+ }
86
+ const body = new Uint8Array(size);
87
+ let offset = 0;
88
+ for (const chunk of chunks) {
89
+ body.set(chunk, offset);
90
+ offset += chunk.byteLength;
91
+ }
92
+ return new Request(request, { body });
93
+ }
@@ -0,0 +1,258 @@
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
+ import { z } from "zod";
3
+
4
+ export const MCP_MAX_TEXT_BYTES = 256 * 1024;
5
+ export const MCP_MAX_READ_CHARACTERS = 64 * 1024;
6
+ export const MCP_MAX_RESULT_BYTES = 2 * 1024 * 1024;
7
+
8
+ const MCP_MAX_READ_OFFSET = 2 * 1024 * 1024;
9
+ const MCP_INLINE_JSON_BYTES = 16 * 1024;
10
+ const MCP_MAX_ERROR_MESSAGE_CHARACTERS = 4 * 1024;
11
+
12
+ const revision = z.string().regex(/^[a-f0-9]{64}$/u, "Expected a 64-character lowercase SHA-256 revision");
13
+ const exampleId = z.string().min(1).max(128).regex(/^[a-z0-9][a-z0-9-]*$/u, "Expected an example id");
14
+ const readWindow = {
15
+ offset: z.number().int().min(0).max(MCP_MAX_READ_OFFSET).default(0)
16
+ .describe("UTF-16 character offset for a paginated read"),
17
+ limit: z.number().int().min(1).max(MCP_MAX_READ_CHARACTERS).default(MCP_MAX_READ_CHARACTERS)
18
+ .describe(`Maximum UTF-16 characters to return (up to ${MCP_MAX_READ_CHARACTERS})`),
19
+ };
20
+
21
+ const docsInputSchema = z.discriminatedUnion("operation", [
22
+ z.strictObject({ operation: z.literal("search"), query: z.string().min(1).max(200) }),
23
+ z.strictObject({ operation: z.literal("read"), target: z.string().min(1).max(512), ...readWindow }),
24
+ z.strictObject({ operation: z.literal("resolve"), target: z.string().min(1).max(512) }),
25
+ z.strictObject({ operation: z.literal("list"), path: z.string().min(1).max(512).default("/") }),
26
+ z.strictObject({
27
+ operation: z.literal("grep"),
28
+ pattern: z.string().min(1).max(200),
29
+ ignoreCase: z.boolean().default(false),
30
+ package: z.string().min(1).max(128).optional(),
31
+ limit: z.number().int().min(1).max(200).default(50),
32
+ }),
33
+ z.strictObject({
34
+ operation: z.literal("symbols"),
35
+ query: z.string().min(1).max(200).optional(),
36
+ package: z.string().min(1).max(128).optional(),
37
+ limit: z.number().int().min(1).max(200).default(50),
38
+ }),
39
+ ]);
40
+
41
+ function examplesInputSchema({ allowDownload, examplesOpenWorld }) {
42
+ const offline = examplesOpenWorld ? { offline: z.boolean().default(false) } : {};
43
+ const operations = [
44
+ z.strictObject({
45
+ operation: z.literal("search"),
46
+ query: z.string().min(1).max(200),
47
+ match: z.enum(["all", "any"]).default("all"),
48
+ limit: z.number().int().min(1).max(50).default(20),
49
+ revision: revision.optional(),
50
+ ...offline,
51
+ }),
52
+ z.strictObject({ operation: z.literal("show"), id: exampleId, revision: revision.optional(), ...offline }),
53
+ z.strictObject({
54
+ operation: z.literal("read"),
55
+ id: exampleId,
56
+ path: z.string().min(1).max(1024),
57
+ revision: revision.optional(),
58
+ ...readWindow,
59
+ ...offline,
60
+ }),
61
+ ];
62
+ if (allowDownload) {
63
+ operations.push(z.strictObject({
64
+ operation: z.literal("download"),
65
+ id: exampleId,
66
+ destination: z.string().min(1).max(1024)
67
+ .describe("Relative directory beneath the configured MCP output directory"),
68
+ revision: revision.optional(),
69
+ offline: z.boolean().default(false),
70
+ }));
71
+ }
72
+ return z.discriminatedUnion("operation", operations);
73
+ }
74
+
75
+ export function createAIGpuMcpServer({
76
+ version,
77
+ docs,
78
+ examples,
79
+ allowDownload = false,
80
+ examplesOpenWorld = allowDownload,
81
+ }) {
82
+ const server = new McpServer(
83
+ { name: "aigpu", version },
84
+ {
85
+ instructions: [
86
+ "Use docs to discover and read AIGPU documentation. Use examples to find and inspect working examples.",
87
+ ...(allowDownload
88
+ ? ["Pass a relative destination beneath the configured MCP output directory when using examples.download."]
89
+ : []),
90
+ ].join(" "),
91
+ },
92
+ );
93
+
94
+ server.registerTool(
95
+ "docs",
96
+ {
97
+ title: "AIGPU documentation",
98
+ description: "Search, resolve, list, grep, and read the canonical AIGPU documentation corpus.",
99
+ inputSchema: docsInputSchema,
100
+ annotations: {
101
+ readOnlyHint: true,
102
+ destructiveHint: false,
103
+ idempotentHint: true,
104
+ openWorldHint: false,
105
+ },
106
+ },
107
+ (input, context) => {
108
+ const signal = context.mcpReq.signal;
109
+ return executeTool(() => docs.execute(input, { signal }), signal, { input, tool: "docs" });
110
+ },
111
+ );
112
+
113
+ server.registerTool(
114
+ "examples",
115
+ {
116
+ title: "AIGPU examples",
117
+ description: allowDownload
118
+ ? "Search, inspect, read, or download a verified AIGPU example beneath the configured MCP output directory."
119
+ : "Search, inspect, and read verified AIGPU examples.",
120
+ inputSchema: examplesInputSchema({ allowDownload, examplesOpenWorld }),
121
+ annotations: {
122
+ readOnlyHint: !allowDownload,
123
+ destructiveHint: false,
124
+ idempotentHint: !allowDownload,
125
+ openWorldHint: examplesOpenWorld,
126
+ },
127
+ },
128
+ (input, context) => {
129
+ const signal = context.mcpReq.signal;
130
+ return executeTool(() => examples.execute(input, { signal }), signal, { input, tool: "examples" });
131
+ },
132
+ );
133
+
134
+ return server;
135
+ }
136
+
137
+ async function executeTool(operation, signal, rendering) {
138
+ try {
139
+ const output = await operation();
140
+ return assertResultWithinLimit(renderToolOutput(output, rendering));
141
+ } catch (error) {
142
+ if (signal?.aborted) throw signal.reason ?? error;
143
+ if (error && typeof error === "object" && error.name === "AbortError") throw error;
144
+ const normalized = normalizeToolError(error);
145
+ return assertResultWithinLimit({
146
+ content: [{ type: "text", text: `${normalized.code}: ${normalized.message}` }],
147
+ structuredContent: { error: normalized },
148
+ isError: true,
149
+ });
150
+ }
151
+ }
152
+
153
+ function normalizeToolError(error) {
154
+ const rawMessage = error instanceof Error ? error.message : "Unknown tool error";
155
+ const message = rawMessage.slice(0, MCP_MAX_ERROR_MESSAGE_CHARACTERS);
156
+ if (error && typeof error === "object" && typeof error.code === "string") {
157
+ const normalized = { code: error.code, message };
158
+ const candidates = normalizeCandidates(error.candidates);
159
+ const target = typeof error.target === "string" ? error.target.slice(0, 1024) : undefined;
160
+ const lookup = typeof error.lookup === "string" ? error.lookup.slice(0, 64) : undefined;
161
+ const query = typeof error.query === "string" ? error.query.slice(0, 1024) : undefined;
162
+ const pattern = typeof error.pattern === "string" ? error.pattern.slice(0, 1024) : undefined;
163
+ return {
164
+ ...normalized,
165
+ ...(target ? { target } : {}),
166
+ ...(lookup ? { lookup } : {}),
167
+ ...(query ? { query } : {}),
168
+ ...(pattern ? { pattern } : {}),
169
+ ...(candidates ? { candidates } : {}),
170
+ };
171
+ }
172
+ if (/not found/iu.test(message)) return { code: "AIGPU-DOCS-NOT-FOUND", message };
173
+ if (/^Ambiguous symbol:/u.test(message)) return { code: "AIGPU-DOCS-AMBIGUOUS", message };
174
+ return { code: "AIGPU-TOOL-ERROR", message };
175
+ }
176
+
177
+ function renderToolOutput(output, { input, tool }) {
178
+ if (output && typeof output === "object" && output.operation === "read") {
179
+ if (typeof output.content === "string") {
180
+ const { content, ...metadata } = output;
181
+ const page = paginateText(content, input);
182
+ assertTextWithinLimit(page.content);
183
+ return {
184
+ content: [{ type: "text", text: page.content }],
185
+ structuredContent: { ...metadata, ...page.metadata },
186
+ };
187
+ }
188
+ if (output.document && typeof output.document === "object" && typeof output.document.content === "string") {
189
+ const { content, ...document } = output.document;
190
+ const page = paginateText(content, input);
191
+ assertTextWithinLimit(page.content);
192
+ return {
193
+ content: [{ type: "text", text: page.content }],
194
+ structuredContent: { ...output, document, ...page.metadata },
195
+ };
196
+ }
197
+ }
198
+ const serialized = JSON.stringify(output) ?? "null";
199
+ const operation = typeof input.operation === "string" ? input.operation : "result";
200
+ const fallback = Buffer.byteLength(serialized, "utf8") <= MCP_INLINE_JSON_BYTES
201
+ ? serialized
202
+ : `Structured ${tool}.${operation} result; inspect structuredContent for details.`;
203
+ return {
204
+ content: [{ type: "text", text: fallback }],
205
+ structuredContent: output,
206
+ };
207
+ }
208
+
209
+ function paginateText(content, input) {
210
+ const offset = input.offset ?? 0;
211
+ const limit = input.limit ?? MCP_MAX_READ_CHARACTERS;
212
+ const page = content.slice(offset, offset + limit);
213
+ const end = offset + page.length;
214
+ const truncated = end < content.length;
215
+ const includeMetadata = offset > 0 || truncated;
216
+ return {
217
+ content: page,
218
+ metadata: includeMetadata
219
+ ? {
220
+ offset,
221
+ limit,
222
+ characters: page.length,
223
+ totalCharacters: content.length,
224
+ truncated,
225
+ ...(truncated ? { nextOffset: end } : {}),
226
+ }
227
+ : {},
228
+ };
229
+ }
230
+
231
+ function normalizeCandidates(value) {
232
+ if (!Array.isArray(value)) return undefined;
233
+ const candidates = value.slice(0, 50).flatMap((candidate) => {
234
+ if (typeof candidate === "string") return [candidate.slice(0, 1024)];
235
+ if (!candidate || typeof candidate !== "object") return [];
236
+ const normalized = {};
237
+ for (const key of ["symbol", "package", "virtualPath", "repoPath", "path", "kind"]) {
238
+ if (typeof candidate[key] === "string") normalized[key] = candidate[key].slice(0, 1024);
239
+ }
240
+ return Object.keys(normalized).length > 0 ? [normalized] : [];
241
+ });
242
+ return candidates.length > 0 ? candidates : undefined;
243
+ }
244
+
245
+ function assertTextWithinLimit(content) {
246
+ if (Buffer.byteLength(content, "utf8") <= MCP_MAX_TEXT_BYTES) return;
247
+ throw resultTooLarge(`Read chunk exceeds the ${MCP_MAX_TEXT_BYTES / 1024} KiB MCP text limit; request a smaller read limit.`);
248
+ }
249
+
250
+ function assertResultWithinLimit(result) {
251
+ const bytes = Buffer.byteLength(JSON.stringify(result), "utf8");
252
+ if (bytes <= MCP_MAX_RESULT_BYTES) return result;
253
+ throw resultTooLarge(`Tool result exceeds the ${MCP_MAX_RESULT_BYTES / (1024 * 1024)} MiB MCP response limit.`);
254
+ }
255
+
256
+ function resultTooLarge(message) {
257
+ return Object.assign(new Error(message), { code: "AIGPU-MCP-RESULT-TOO-LARGE" });
258
+ }
@@ -0,0 +1,34 @@
1
+ import { realpathSync, statSync } from "node:fs";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
4
+ import { createDocsService } from "../docs/service.js";
5
+ import { LocalExamplesSource } from "../examples/local-source.js";
6
+ import { createExamplesService } from "../examples/service.js";
7
+ import { pullExample } from "../examples/pull.js";
8
+ import { createAIGpuMcpServer } from "./server.js";
9
+
10
+ export const mcpHelp = `Usage: aigpu mcp [--output-dir <absolute-directory> | --project-from-cwd]
11
+
12
+ Serve AIGPU documentation and local examples over MCP stdio. No network connection
13
+ is opened. AIGPU_EXAMPLES_DIR selects the local examples directory.
14
+ `;
15
+
16
+ export function runMcpStdio(args, { version = "0.0.0", cwd = process.cwd(), env = process.env, platform = process.platform, reportError = (error) => process.stderr.write(`aigpu mcp: ${error.message}\n`) } = {}) {
17
+ if (args.length === 1 && ["--help", "-h", "help"].includes(args[0])) return { code: 0, stdout: mcpHelp };
18
+ const usesOutputDirectory = args.length === 2 && args[0] === "--output-dir" && !!args[1];
19
+ const usesProjectCwd = args.length === 1 && args[0] === "--project-from-cwd";
20
+ if (args.length !== 0 && !usesOutputDirectory && !usesProjectCwd) return { code: 2, stderr: mcpHelp };
21
+ const configuredOutputDirectory = usesOutputDirectory ? args[1] : usesProjectCwd ? undefined : env.AIGPU_MCP_OUTPUT_DIR;
22
+ if (configuredOutputDirectory && !isAbsolute(configuredOutputDirectory)) return { code: 2, stderr: `MCP output directory must be absolute: ${configuredOutputDirectory}\n` };
23
+ let downloadRoot = usesProjectCwd ? cwd : configuredOutputDirectory;
24
+ if (downloadRoot) {
25
+ try { downloadRoot = realpathSync(downloadRoot); if (!statSync(downloadRoot).isDirectory()) throw new Error("not a directory"); }
26
+ catch { return { code: 2, stderr: `MCP output directory is not a directory: ${downloadRoot}\n` }; }
27
+ }
28
+ const source = new LocalExamplesSource({ root: env.AIGPU_EXAMPLES_DIR ?? resolve(cwd, "examples") });
29
+ const docs = createDocsService();
30
+ const allowDownload = !!downloadRoot && (platform === "linux" || platform === "darwin");
31
+ const examples = createExamplesService({ source, downloadRoot, downloadExample: allowDownload ? pullExample : undefined, platform });
32
+ serveStdio(() => createAIGpuMcpServer({ version, docs, examples, allowDownload, examplesOpenWorld: false }), { onerror: reportError });
33
+ return { code: 0 };
34
+ }
@@ -0,0 +1,62 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import pixelmatch from "pixelmatch";
5
+ import { PNG } from "pngjs";
6
+
7
+ export function rgbaToPng(bytes, width, height) {
8
+ const png = new PNG({ width, height });
9
+ png.data.set(bytes);
10
+ return png;
11
+ }
12
+
13
+ export async function writePng(path, bytes, width, height) {
14
+ await mkdir(dirname(path), { recursive: true });
15
+ await writeFile(path, PNG.sync.write(rgbaToPng(bytes, width, height)));
16
+ }
17
+
18
+ export async function comparePngSnapshot(path, bytes, width, height, options = {}) {
19
+ const actualPath = artifactPath(path, "actual");
20
+ const diffPath = artifactPath(path, "diff");
21
+
22
+ if (!existsSync(path)) {
23
+ if (!options.update) return { status: "missing", mismatchedPixels: 0, ratio: 0, actualPath, diffPath };
24
+ await writePng(path, bytes, width, height);
25
+ return { status: "created", mismatchedPixels: 0, ratio: 0, actualPath, diffPath };
26
+ }
27
+
28
+ const expected = PNG.sync.read(await readFile(path));
29
+ assertSameDimensions(path, expected, width, height);
30
+ const actual = rgbaToPng(bytes, width, height);
31
+ const diff = new PNG({ width, height });
32
+ const mismatchedPixels = pixelmatch(expected.data, actual.data, diff.data, width, height, { threshold: options.pixelmatchThreshold ?? 0.1 });
33
+ const ratio = mismatchedPixels / (width * height);
34
+ if (ratio <= (options.maxDiffRatio ?? 0)) return { status: "matched", mismatchedPixels, ratio, actualPath, diffPath };
35
+
36
+ if (options.update) {
37
+ await writePng(path, bytes, width, height);
38
+ return { status: "updated", mismatchedPixels, ratio, actualPath, diffPath };
39
+ }
40
+
41
+ await writePng(actualPath, bytes, width, height);
42
+ await writeFile(diffPath, PNG.sync.write(diff));
43
+ return { status: "different", mismatchedPixels, ratio, actualPath, diffPath };
44
+ }
45
+
46
+ export function snapshotFixit(path, actualPath, diffPath) {
47
+ return [
48
+ `Baseline: ${path}`,
49
+ `Actual: ${actualPath}`,
50
+ `Diff: ${diffPath}`,
51
+ "Fix: regenerate the committed baseline with `aigpu snapshot --update` inside the Docker GPU harness, then commit the PNG.",
52
+ ].join("\n");
53
+ }
54
+
55
+ function artifactPath(path, suffix) {
56
+ return path.replace(/\.png$/u, `.${suffix}.png`);
57
+ }
58
+
59
+ function assertSameDimensions(path, expected, width, height) {
60
+ if (expected.width === width && expected.height === height) return;
61
+ throw new Error(`${path} is ${expected.width}x${expected.height}; expected ${width}x${height}`);
62
+ }
@@ -0,0 +1,22 @@
1
+ import { SNAPSHOT_SIZE, REPRESENTATIVE_GRADIENT_WGSL } from "./shaders.js";
2
+
3
+ export const DEFAULT_SNAPSHOT_TIME = Math.PI / 4;
4
+ export const DEFAULT_SNAPSHOT_SPEED = 2;
5
+
6
+ /** @param api The `aigpu/node` module namespace: `init` plus the free functions this render needs. */
7
+ export async function renderRepresentativeSnapshot(api) {
8
+ const { init, effect, frame, target } = api;
9
+ const gpu = await init();
10
+ try {
11
+ const colorTarget = target(gpu, { size: SNAPSHOT_SIZE, format: "rgba8unorm", label: "aigpu-snapshot-gradient" });
12
+ const gradient = effect(gpu, REPRESENTATIVE_GRADIENT_WGSL, {
13
+ label: "aigpu-snapshot-gradient",
14
+ set: { speed: DEFAULT_SNAPSHOT_SPEED },
15
+ });
16
+ gradient.set({ time: DEFAULT_SNAPSHOT_TIME });
17
+ frame(gpu, (current) => current.pass({ target: colorTarget }, (encoder) => encoder.draw(gradient)));
18
+ return { pixels: await colorTarget.read(), width: SNAPSHOT_SIZE[0], height: SNAPSHOT_SIZE[1] };
19
+ } finally {
20
+ gpu.dispose();
21
+ }
22
+ }
@@ -0,0 +1,79 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { comparePngSnapshot, snapshotFixit } from "./png.js";
4
+ import { renderRepresentativeSnapshot } from "./render.js";
5
+
6
+ const DEFAULT_BASELINE = "packages/aigpu-api/tests/__snapshots__/representative-gradient.png";
7
+
8
+ export async function runSnapshotCommand(options = {}) {
9
+ if (process.env.AIGPU_DOCKER_TEST !== "1") {
10
+ return { code: 1, stderr: "aigpu snapshot must run inside the Docker GPU harness with AIGPU_DOCKER_TEST=1.\n" };
11
+ }
12
+
13
+ const parsed = parseSnapshotArgs(options.args ?? []);
14
+ if (parsed.error) return { code: 1, stderr: `${parsed.error}\n${snapshotUsage()}` };
15
+
16
+ const loaded = await loadNodeInit();
17
+ if (loaded.error) return { code: 1, stderr: loaded.error };
18
+
19
+ const baselinePath = resolve(workspaceRoot(), parsed.baselinePath ?? options.baselinePath ?? DEFAULT_BASELINE);
20
+ const rendered = await renderRepresentativeSnapshot(loaded.api);
21
+ const result = await comparePngSnapshot(baselinePath, rendered.pixels, rendered.width, rendered.height, { update: parsed.update });
22
+
23
+ if (result.status === "missing") {
24
+ return { code: 1, stderr: `Snapshot baseline is missing.\n${snapshotFixit(baselinePath, result.actualPath, result.diffPath)}\n` };
25
+ }
26
+ if (result.status === "different") {
27
+ return { code: 1, stderr: `Snapshot mismatch: ${result.mismatchedPixels} pixels differ (ratio ${result.ratio}).\n${snapshotFixit(baselinePath, result.actualPath, result.diffPath)}\n` };
28
+ }
29
+
30
+ const verb = result.status === "created" ? "created" : result.status === "updated" ? "updated" : "matched";
31
+ return { code: 0, stdout: `Snapshot ${verb}: ${baselinePath}\n` };
32
+ }
33
+
34
+ function parseSnapshotArgs(args) {
35
+ const parsed = { update: false, baselinePath: undefined, error: undefined };
36
+ for (let i = 0; i < args.length; i += 1) {
37
+ const arg = args[i];
38
+ if (arg === "--update") {
39
+ parsed.update = true;
40
+ } else if (arg === "--ci") {
41
+ parsed.update = false;
42
+ } else if (arg === "--baseline") {
43
+ const value = args[i + 1];
44
+ if (value === undefined) return { ...parsed, error: "Missing value for --baseline" };
45
+ parsed.baselinePath = value;
46
+ i += 1;
47
+ } else {
48
+ return { ...parsed, error: `Unknown snapshot option: ${arg}` };
49
+ }
50
+ }
51
+ if (process.env.CI === "true") parsed.update = false;
52
+ return parsed;
53
+ }
54
+
55
+ function snapshotUsage() {
56
+ return "Usage: aigpu snapshot [--ci] [--update] [--baseline <path>]\n";
57
+ }
58
+
59
+ async function loadNodeInit() {
60
+ try {
61
+ // The whole namespace: the render needs `init` plus the free functions it calls.
62
+ const api = await import("aigpu/node");
63
+ return { api };
64
+ } catch (error) {
65
+ if (error?.code !== "ERR_MODULE_NOT_FOUND" && error?.code !== "ERR_PACKAGE_PATH_NOT_EXPORTED") throw error;
66
+ return { error: "aigpu snapshot requires the peer package `aigpu` with its `aigpu/node` entry installed. Install it with `pnpm add aigpu` or run this command from the AIGPU workspace.\n" };
67
+ }
68
+ }
69
+
70
+ function workspaceRoot() {
71
+ const initial = process.cwd();
72
+ let current = initial;
73
+ while (!existsSync(resolve(current, "pnpm-workspace.yaml"))) {
74
+ const parent = dirname(current);
75
+ if (parent === current) return initial;
76
+ current = parent;
77
+ }
78
+ return current;
79
+ }
@@ -0,0 +1,11 @@
1
+ export const SNAPSHOT_SIZE = [16, 16];
2
+
3
+ export const REPRESENTATIVE_GRADIENT_WGSL = `
4
+ struct Params { time: f32, speed: f32 }
5
+ @group(0) @binding(0) var<uniform> params: Params;
6
+
7
+ @fragment fn main(@location(0) uv: vec2f) -> @location(0) vec4f {
8
+ let wave = sin(params.time * params.speed) * 0.5 + 0.5;
9
+ return vec4f(uv.x, uv.y, wave, 1.0);
10
+ }
11
+ `;
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "version": "0.3.1"
4
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared client-environment typing surface. Attach it to `aigpu-env.d.ts`
3
+ * via `/// <reference types="aigpu/client" />` to make `.wgsl` imports legal
4
+ * for `tsc` while runtime reflection remains the authority for validation.
5
+ */
6
+ export type AIGPUClientEnvironment = {
7
+ readonly gpu?: GPU;
8
+ };
9
+ export { wgslVitePlugin } from "@aigpu/wgsl/loader-vite";
10
+ export type { ShaderSource } from "@aigpu/wgsl";
11
+ export type { ViteLoadResult, WgslVitePluginOptions } from "@aigpu/wgsl/loader-vite";
12
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,2 @@
1
+ export { wgslVitePlugin } from "@aigpu/wgsl/loader-vite";
2
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Gpu } from "./kernel.ts";
2
+ export interface Clock {
3
+ /** Seconds since the first frame. */
4
+ readonly time: number;
5
+ /** Seconds between the last two ticks: wall-clock, or the value the last `advance()` was given. */
6
+ readonly deltaTime: number;
7
+ /** Frames opened on this gpu. Counted by `frame()`/`frameLoop()`, never by `advance()`. */
8
+ readonly frameCount: number;
9
+ /**
10
+ * Moves the clock forward by `dtSeconds` right now, and claims this frame's tick: the next
11
+ * `frame()` counts the frame but does not advance the clock again. One advance per frame, with
12
+ * the manual one winning — so an external ticker (GSAP, Motion, an XR frame callback), a
13
+ * timescale (`advance(dt * 0.5)`) or a fixed timestep drives aigpu without a second clock racing it.
14
+ */
15
+ advance(dtSeconds: number): void;
16
+ }
17
+ /**
18
+ * The frame clock of `gpu`.
19
+ *
20
+ * Without `advance()`, every `frame()` moves `time` forward by the wall-clock delta since the last
21
+ * frame — the default 0.1.x behavior. With `advance(dt)`, you own the clock for that frame.
22
+ *
23
+ * Throws `AIGPU-GPU-DISPOSED` after `gpu.dispose()`.
24
+ */
25
+ export declare function clock(gpu: Gpu): Clock;
26
+ //# sourceMappingURL=clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAWA,OAAO,EAAgB,KAAK,GAAG,EAAe,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,KAAK;IACpB,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAKD;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAErC"}