@poolzin/pool-bot 2026.1.38 → 2026.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/cli-runner/helpers.js +1 -1
  11. package/dist/agents/cli-runner.js +2 -2
  12. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  13. package/dist/agents/compaction.js +16 -2
  14. package/dist/agents/context-window-guard.js +13 -10
  15. package/dist/agents/context.js +4 -4
  16. package/dist/agents/docs-path.js +1 -1
  17. package/dist/agents/minimax-vlm.js +1 -1
  18. package/dist/agents/model-auth.js +12 -1
  19. package/dist/agents/model-catalog.js +4 -4
  20. package/dist/agents/model-selection.js +10 -4
  21. package/dist/agents/models-config.js +3 -3
  22. package/dist/agents/models-config.providers.js +147 -39
  23. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  24. package/dist/agents/pi-embedded-runner/compact.js +8 -8
  25. package/dist/agents/pi-embedded-runner/model.js +2 -2
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
  27. package/dist/agents/pi-embedded-runner/run.js +4 -4
  28. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  29. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  30. package/dist/agents/pi-model-discovery.js +10 -0
  31. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  32. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  33. package/dist/agents/pi-tools.js +10 -5
  34. package/dist/agents/pi-tools.read.js +2 -2
  35. package/dist/agents/session-file-repair.js +83 -0
  36. package/dist/agents/session-transcript-repair.js +68 -0
  37. package/dist/agents/skills/frontmatter.js +1 -1
  38. package/dist/agents/skills/workspace.js +2 -2
  39. package/dist/agents/system-prompt.js +28 -4
  40. package/dist/agents/together-models.js +127 -0
  41. package/dist/agents/tool-images.js +1 -1
  42. package/dist/agents/tool-policy.js +1 -1
  43. package/dist/agents/tools/browser-tool.js +3 -3
  44. package/dist/agents/tools/image-tool.js +2 -2
  45. package/dist/agents/tools/memory-tool.js +94 -7
  46. package/dist/agents/tools/web-search.js +1 -1
  47. package/dist/agents/workspace.js +1 -5
  48. package/dist/auto-reply/commands-registry.data.js +1 -1
  49. package/dist/auto-reply/reply/commands-context-report.js +2 -2
  50. package/dist/auto-reply/reply/commands-session.js +2 -2
  51. package/dist/auto-reply/reply/get-reply-run.js +14 -4
  52. package/dist/auto-reply/reply/groups.js +1 -1
  53. package/dist/auto-reply/reply/inbound-context.js +4 -0
  54. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  55. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  56. package/dist/auto-reply/status.js +1 -1
  57. package/dist/browser/client-fetch.js +1 -1
  58. package/dist/browser/config.js +1 -1
  59. package/dist/browser/extension-relay.js +3 -3
  60. package/dist/browser/server-context.js +2 -2
  61. package/dist/build-info.json +3 -3
  62. package/dist/canvas-host/a2ui.js +3 -3
  63. package/dist/channels/plugins/agent-tools/whatsapp-login.js +1 -17
  64. package/dist/channels/plugins/catalog.js +2 -2
  65. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  66. package/dist/channels/plugins/onboarding/signal.js +1 -1
  67. package/dist/channels/plugins/onboarding/slack.js +4 -4
  68. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  69. package/dist/channels/plugins/pairing-message.js +1 -1
  70. package/dist/cli/browser-cli-extension.js +2 -2
  71. package/dist/cli/docs-cli.js +1 -1
  72. package/dist/cli/gateway-cli/dev.js +1 -1
  73. package/dist/cli/memory-cli.js +25 -15
  74. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  75. package/dist/cli/plugins-cli.js +1 -1
  76. package/dist/cli/run-main.js +2 -2
  77. package/dist/cli/security-cli.js +1 -1
  78. package/dist/cli/tagline.js +1 -1
  79. package/dist/cli/update-cli.js +4 -4
  80. package/dist/cli/webhooks-cli.js +5 -5
  81. package/dist/commands/agents.commands.add.js +1 -1
  82. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  83. package/dist/commands/auth-choice.apply.js +4 -1
  84. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  85. package/dist/commands/auth-choice.apply.xai.js +63 -0
  86. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  87. package/dist/commands/configure.wizard.js +1 -1
  88. package/dist/commands/dashboard.js +1 -1
  89. package/dist/commands/docs.js +1 -1
  90. package/dist/commands/doctor-gateway-services.js +3 -3
  91. package/dist/commands/doctor-state-integrity.js +2 -14
  92. package/dist/commands/doctor-update.js +3 -3
  93. package/dist/commands/doctor.js +1 -1
  94. package/dist/commands/models/list.probe.js +2 -2
  95. package/dist/commands/models/list.registry.js +4 -4
  96. package/dist/commands/models/list.status-command.js +2 -2
  97. package/dist/commands/onboard-auth.config-core.js +366 -28
  98. package/dist/commands/onboard-auth.credentials.js +71 -9
  99. package/dist/commands/onboard-auth.js +3 -3
  100. package/dist/commands/onboard-auth.models.js +26 -24
  101. package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
  102. package/dist/commands/status-all/report-lines.js +1 -1
  103. package/dist/commands/status.command.js +1 -1
  104. package/dist/commands/uninstall.js +3 -3
  105. package/dist/compat/legacy-names.js +1 -1
  106. package/dist/config/io.js +3 -3
  107. package/dist/config/schema.js +1 -1
  108. package/dist/config/types.js +0 -1
  109. package/dist/config/types.memory.js +1 -0
  110. package/dist/config/version.js +4 -4
  111. package/dist/config/zod-schema.js +0 -6
  112. package/dist/daemon/constants.js +7 -7
  113. package/dist/daemon/inspect.js +6 -6
  114. package/dist/daemon/systemd-unit.js +1 -1
  115. package/dist/discord/monitor/message-handler.process.js +6 -4
  116. package/dist/gateway/client.js +0 -14
  117. package/dist/gateway/live-image-probe.js +1 -66
  118. package/dist/gateway/openai-http.js +2 -2
  119. package/dist/gateway/openresponses-http.js +4 -4
  120. package/dist/gateway/server-discovery.js +2 -2
  121. package/dist/gateway/server-http.js +1 -1
  122. package/dist/gateway/server.impl.js +2 -6
  123. package/dist/hooks/frontmatter.js +1 -1
  124. package/dist/hooks/hooks-status.js +1 -1
  125. package/dist/hooks/install.js +2 -2
  126. package/dist/hooks/loader.js +1 -1
  127. package/dist/hooks/workspace.js +3 -3
  128. package/dist/index.js +2 -2
  129. package/dist/infra/bonjour.js +3 -3
  130. package/dist/infra/path-env.js +3 -3
  131. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  132. package/dist/infra/restart.js +1 -1
  133. package/dist/infra/tailscale.js +1 -1
  134. package/dist/macos/relay.js +2 -2
  135. package/dist/media/input-files.js +1 -1
  136. package/dist/media/mime.js +4 -0
  137. package/dist/media/png-encode.js +74 -0
  138. package/dist/media-understanding/providers/image.js +2 -2
  139. package/dist/memory/backend-config.js +207 -0
  140. package/dist/memory/embeddings.js +1 -1
  141. package/dist/memory/index.js +0 -5
  142. package/dist/memory/manager.js +3 -25
  143. package/dist/memory/types.js +1 -0
  144. package/dist/node-host/runner.js +2 -2
  145. package/dist/pairing/pairing-messages.js +1 -1
  146. package/dist/plugins/discovery.js +1 -1
  147. package/dist/plugins/install.js +2 -2
  148. package/dist/plugins/update.js +1 -1
  149. package/dist/security/audit.js +2 -2
  150. package/dist/shared/text/reasoning-tags.js +52 -7
  151. package/dist/slack/monitor/message-handler/prepare.js +10 -4
  152. package/dist/slack/monitor/slash.js +10 -4
  153. package/dist/tailscale/detect.js +146 -0
  154. package/dist/telegram/bot-message-context.js +1 -1
  155. package/dist/test-helpers/workspace.js +11 -0
  156. package/dist/test-utils/channel-plugins.js +82 -0
  157. package/dist/test-utils/ports.js +73 -0
  158. package/dist/utils/shell-argv.js +61 -0
  159. package/dist/utils.js +10 -0
  160. package/dist/web/qr-image.js +1 -61
  161. package/dist/wizard/onboarding.finalize.js +7 -7
  162. package/dist/wizard/onboarding.js +3 -3
  163. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  164. package/docs/_config.yml +2 -2
  165. package/docs/_layouts/default.html +9 -9
  166. package/docs/concepts/typebox.md +1 -1
  167. package/docs/docs.json +1 -1
  168. package/docs/northflank.mdx +7 -7
  169. package/docs/railway.mdx +3 -3
  170. package/docs/render.mdx +5 -5
  171. package/docs/start/lore.md +2 -2
  172. package/extensions/bluebubbles/index.ts +2 -2
  173. package/extensions/bluebubbles/package.json +1 -1
  174. package/extensions/bluebubbles/src/accounts.ts +8 -8
  175. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  176. package/extensions/bluebubbles/src/actions.ts +5 -5
  177. package/extensions/bluebubbles/src/attachments.ts +2 -2
  178. package/extensions/bluebubbles/src/channel.ts +16 -16
  179. package/extensions/bluebubbles/src/chat.ts +2 -2
  180. package/extensions/bluebubbles/src/media-send.ts +2 -2
  181. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  182. package/extensions/bluebubbles/src/monitor.ts +5 -5
  183. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  184. package/extensions/bluebubbles/src/reactions.ts +2 -2
  185. package/extensions/bluebubbles/src/send.ts +2 -2
  186. package/extensions/copilot-proxy/README.md +1 -1
  187. package/extensions/copilot-proxy/package.json +1 -1
  188. package/extensions/diagnostics-otel/index.ts +2 -2
  189. package/extensions/diagnostics-otel/package.json +1 -1
  190. package/extensions/diagnostics-otel/src/service.ts +3 -3
  191. package/extensions/discord/index.ts +2 -2
  192. package/extensions/discord/package.json +1 -1
  193. package/extensions/google-antigravity-auth/README.md +1 -1
  194. package/extensions/google-antigravity-auth/index.ts +1 -1
  195. package/extensions/google-antigravity-auth/package.json +1 -1
  196. package/extensions/google-gemini-cli-auth/README.md +1 -1
  197. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  198. package/extensions/google-gemini-cli-auth/package.json +1 -1
  199. package/extensions/googlechat/index.ts +3 -3
  200. package/extensions/googlechat/package.json +1 -1
  201. package/extensions/googlechat/src/accounts.ts +8 -8
  202. package/extensions/googlechat/src/actions.ts +6 -6
  203. package/extensions/googlechat/src/channel.ts +21 -21
  204. package/extensions/googlechat/src/monitor.ts +8 -8
  205. package/extensions/googlechat/src/onboarding.ts +10 -10
  206. package/extensions/imessage/index.ts +2 -2
  207. package/extensions/imessage/package.json +1 -1
  208. package/extensions/line/index.ts +2 -2
  209. package/extensions/line/package.json +1 -1
  210. package/extensions/line/src/card-command.ts +2 -2
  211. package/extensions/line/src/channel.logout.test.ts +4 -4
  212. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  213. package/extensions/line/src/channel.ts +3 -3
  214. package/extensions/llm-task/README.md +3 -3
  215. package/extensions/llm-task/index.ts +2 -2
  216. package/extensions/llm-task/package.json +1 -1
  217. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  218. package/extensions/lobster/README.md +6 -6
  219. package/extensions/lobster/index.ts +2 -2
  220. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  221. package/extensions/lobster/src/lobster-tool.ts +2 -2
  222. package/extensions/matrix/index.ts +2 -2
  223. package/extensions/matrix/package.json +1 -1
  224. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  225. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  226. package/extensions/matrix/src/onboarding.ts +1 -1
  227. package/extensions/mattermost/index.ts +2 -2
  228. package/extensions/mattermost/package.json +1 -1
  229. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  230. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  231. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  232. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  233. package/extensions/mattermost/src/onboarding.ts +2 -2
  234. package/extensions/memory-core/index.ts +2 -2
  235. package/extensions/memory-core/package.json +1 -4
  236. package/extensions/memory-lancedb/index.ts +3 -3
  237. package/extensions/memory-lancedb/package.json +1 -1
  238. package/extensions/msteams/index.ts +2 -2
  239. package/extensions/msteams/package.json +1 -1
  240. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  241. package/extensions/msteams/src/channel.ts +2 -2
  242. package/extensions/msteams/src/graph-upload.ts +4 -4
  243. package/extensions/msteams/src/monitor-handler.ts +2 -2
  244. package/extensions/msteams/src/monitor.ts +2 -2
  245. package/extensions/msteams/src/onboarding.ts +9 -9
  246. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  247. package/extensions/msteams/src/send-context.ts +2 -2
  248. package/extensions/msteams/src/send.ts +4 -4
  249. package/extensions/nextcloud-talk/index.ts +2 -2
  250. package/extensions/nextcloud-talk/package.json +1 -1
  251. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  252. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  253. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  254. package/extensions/nostr/README.md +2 -2
  255. package/extensions/nostr/index.ts +5 -5
  256. package/extensions/nostr/package.json +1 -1
  257. package/extensions/nostr/src/types.ts +4 -4
  258. package/extensions/open-prose/index.ts +2 -2
  259. package/extensions/qwen-portal-auth/README.md +1 -1
  260. package/extensions/signal/index.ts +2 -2
  261. package/extensions/signal/package.json +1 -1
  262. package/extensions/slack/index.ts +2 -2
  263. package/extensions/slack/package.json +1 -1
  264. package/extensions/telegram/index.ts +2 -2
  265. package/extensions/telegram/package.json +1 -1
  266. package/extensions/telegram/src/channel.ts +2 -2
  267. package/extensions/tlon/README.md +2 -2
  268. package/extensions/tlon/index.ts +2 -2
  269. package/extensions/tlon/package.json +1 -1
  270. package/extensions/tlon/src/channel.ts +13 -13
  271. package/extensions/tlon/src/monitor/index.ts +3 -3
  272. package/extensions/tlon/src/onboarding.ts +3 -3
  273. package/extensions/tlon/src/types.ts +3 -3
  274. package/extensions/twitch/README.md +1 -1
  275. package/extensions/twitch/index.ts +2 -2
  276. package/extensions/twitch/package.json +1 -1
  277. package/extensions/twitch/src/config.ts +3 -3
  278. package/extensions/twitch/src/monitor.ts +3 -3
  279. package/extensions/twitch/src/onboarding.ts +9 -9
  280. package/extensions/twitch/src/outbound.test.ts +2 -2
  281. package/extensions/twitch/src/plugin.test.ts +2 -2
  282. package/extensions/twitch/src/plugin.ts +8 -8
  283. package/extensions/twitch/src/send.test.ts +2 -2
  284. package/extensions/twitch/src/send.ts +4 -4
  285. package/extensions/twitch/src/token.test.ts +8 -8
  286. package/extensions/twitch/src/token.ts +3 -3
  287. package/extensions/twitch/src/twitch-client.ts +3 -3
  288. package/extensions/twitch/src/types.ts +3 -3
  289. package/extensions/twitch/src/utils/markdown.ts +1 -1
  290. package/extensions/voice-call/README.md +3 -3
  291. package/extensions/voice-call/package.json +1 -1
  292. package/extensions/voice-call/src/core-bridge.ts +2 -2
  293. package/extensions/voice-call/src/response-generator.ts +1 -1
  294. package/extensions/whatsapp/index.ts +2 -2
  295. package/extensions/whatsapp/package.json +1 -1
  296. package/extensions/zalo/README.md +1 -1
  297. package/extensions/zalo/index.ts +2 -2
  298. package/extensions/zalo/package.json +1 -1
  299. package/extensions/zalo/src/accounts.ts +8 -8
  300. package/extensions/zalo/src/actions.ts +4 -4
  301. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  302. package/extensions/zalo/src/channel.ts +18 -18
  303. package/extensions/zalo/src/monitor.ts +9 -9
  304. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  305. package/extensions/zalo/src/onboarding.ts +24 -24
  306. package/extensions/zalo/src/send.ts +2 -2
  307. package/extensions/zalouser/README.md +2 -2
  308. package/extensions/zalouser/index.ts +2 -2
  309. package/extensions/zalouser/package.json +1 -1
  310. package/extensions/zalouser/src/accounts.ts +9 -9
  311. package/extensions/zalouser/src/channel.ts +24 -24
  312. package/extensions/zalouser/src/monitor.ts +4 -4
  313. package/extensions/zalouser/src/onboarding.ts +28 -28
  314. package/package.json +13 -250
  315. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  316. package/skills/tmux/scripts/find-sessions.sh +1 -1
  317. package/CHANGELOG.md +0 -200
  318. package/README-header.png +0 -0
  319. package/git-hooks/pre-commit +0 -4
  320. package/scripts/format-staged.js +0 -148
  321. package/scripts/postinstall.js +0 -300
  322. package/scripts/setup-git-hooks.js +0 -96
  323. package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
  324. package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
  325. package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
  326. package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
  327. package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
  328. package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
  329. package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
  330. package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
  331. package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
  332. package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
  333. package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
  334. package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
  335. package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
  336. package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +0 -276
@@ -1,91 +0,0 @@
1
- ---
2
- name: webgpu-threejs-tsl
3
- description: Comprehensive guide for developing WebGPU-enabled Three.js applications using TSL (Three.js Shading Language). Covers WebGPU renderer setup, TSL syntax and node materials, compute shaders, post-processing effects, and WGSL integration. Use this skill when working with Three.js WebGPU, TSL shaders, node materials, or GPU compute in Three.js.
4
- ---
5
-
6
- # WebGPU Three.js with TSL
7
-
8
- TSL (Three.js Shading Language) is a node-based shader abstraction that lets you write GPU shaders in JavaScript instead of GLSL/WGSL strings.
9
-
10
- ## Quick Start
11
-
12
- ```javascript
13
- import * as THREE from 'three/webgpu';
14
- import { color, time, oscSine } from 'three/tsl';
15
-
16
- const renderer = new THREE.WebGPURenderer();
17
- await renderer.init();
18
-
19
- const material = new THREE.MeshStandardNodeMaterial();
20
- material.colorNode = color(0xff0000).mul(oscSine(time));
21
- ```
22
-
23
- ## Skill Contents
24
-
25
- ### Documentation
26
- - `docs/core-concepts.md` - Types, operators, uniforms, control flow
27
- - `docs/materials.md` - Node materials and all properties
28
- - `docs/compute-shaders.md` - GPU compute with instanced arrays
29
- - `docs/post-processing.md` - Built-in and custom effects
30
- - `docs/wgsl-integration.md` - Custom WGSL functions
31
-
32
- ### Examples
33
- - `examples/basic-setup.js` - Minimal WebGPU project
34
- - `examples/custom-material.js` - Custom shader material
35
- - `examples/particle-system.js` - GPU compute particles
36
- - `examples/post-processing.js` - Effect pipeline
37
- - `examples/earth-shader.js` - Complete Earth with atmosphere
38
-
39
- ### Templates
40
- - `templates/webgpu-project.js` - Starter project template
41
- - `templates/compute-shader.js` - Compute shader template
42
-
43
- ### Reference
44
- - `REFERENCE.md` - Quick reference cheatsheet
45
-
46
- ## Key Concepts
47
-
48
- ### Import Pattern
49
- ```javascript
50
- // Always use the WebGPU entry point
51
- import * as THREE from 'three/webgpu';
52
- import { /* TSL functions */ } from 'three/tsl';
53
- ```
54
-
55
- ### Node Materials
56
- Replace standard material properties with TSL nodes:
57
- ```javascript
58
- material.colorNode = texture(map); // instead of material.map
59
- material.roughnessNode = float(0.5); // instead of material.roughness
60
- material.positionNode = displaced; // vertex displacement
61
- ```
62
-
63
- ### Method Chaining
64
- TSL uses method chaining for operations:
65
- ```javascript
66
- // Instead of: sin(time * 2.0 + offset) * 0.5 + 0.5
67
- time.mul(2.0).add(offset).sin().mul(0.5).add(0.5)
68
- ```
69
-
70
- ### Custom Functions
71
- Use `Fn()` for reusable shader logic:
72
- ```javascript
73
- const fresnel = Fn(([power = 2.0]) => {
74
- const nDotV = normalWorld.dot(viewDir).saturate();
75
- return float(1.0).sub(nDotV).pow(power);
76
- });
77
- ```
78
-
79
- ## When to Use This Skill
80
-
81
- - Setting up Three.js with WebGPU renderer
82
- - Creating custom shader materials with TSL
83
- - Writing GPU compute shaders
84
- - Building post-processing pipelines
85
- - Migrating from GLSL to TSL
86
- - Implementing visual effects (particles, water, terrain, etc.)
87
-
88
- ## Resources
89
-
90
- - [Three.js TSL Wiki](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language)
91
- - [WebGPU Examples](https://github.com/mrdoob/three.js/tree/master/examples) (files prefixed with `webgpu_`)
@@ -1,404 +0,0 @@
1
- # TSL Compute Shaders
2
-
3
- Compute shaders run on the GPU for parallel processing of data. TSL makes them accessible through JavaScript.
4
-
5
- ## Basic Setup
6
-
7
- ```javascript
8
- import * as THREE from 'three/webgpu';
9
- import { Fn, instancedArray, instanceIndex, vec3 } from 'three/tsl';
10
-
11
- // Create storage buffer
12
- const count = 100000;
13
- const positions = instancedArray(count, 'vec3');
14
-
15
- // Create compute shader
16
- const computeShader = Fn(() => {
17
- const position = positions.element(instanceIndex);
18
- position.x.addAssign(0.01);
19
- })().compute(count);
20
-
21
- // Execute
22
- renderer.compute(computeShader);
23
- ```
24
-
25
- ## Storage Buffers
26
-
27
- ### Instanced Arrays
28
-
29
- ```javascript
30
- import { instancedArray } from 'three/tsl';
31
-
32
- // Create typed storage buffers
33
- const positions = instancedArray(count, 'vec3');
34
- const velocities = instancedArray(count, 'vec3');
35
- const colors = instancedArray(count, 'vec4');
36
- const indices = instancedArray(count, 'uint');
37
- const values = instancedArray(count, 'float');
38
- ```
39
-
40
- ### Accessing Elements
41
-
42
- ```javascript
43
- const computeShader = Fn(() => {
44
- // Get element at current index
45
- const position = positions.element(instanceIndex);
46
- const velocity = velocities.element(instanceIndex);
47
-
48
- // Read values
49
- const x = position.x;
50
- const speed = velocity.length();
51
-
52
- // Write values
53
- position.assign(vec3(0, 0, 0));
54
- position.x.assign(1.0);
55
- position.addAssign(velocity);
56
- })().compute(count);
57
- ```
58
-
59
- ### Accessing Other Elements
60
-
61
- ```javascript
62
- const computeShader = Fn(() => {
63
- const myIndex = instanceIndex;
64
- const neighborIndex = myIndex.add(1).mod(count);
65
-
66
- const myPos = positions.element(myIndex);
67
- const neighborPos = positions.element(neighborIndex);
68
-
69
- // Calculate distance to neighbor
70
- const dist = myPos.distance(neighborPos);
71
- })().compute(count);
72
- ```
73
-
74
- ## Compute Shader Patterns
75
-
76
- ### Initialize Particles
77
-
78
- ```javascript
79
- const computeInit = Fn(() => {
80
- const position = positions.element(instanceIndex);
81
- const velocity = velocities.element(instanceIndex);
82
-
83
- // Random positions using hash
84
- position.x.assign(hash(instanceIndex).mul(10).sub(5));
85
- position.y.assign(hash(instanceIndex.add(1)).mul(10).sub(5));
86
- position.z.assign(hash(instanceIndex.add(2)).mul(10).sub(5));
87
-
88
- // Zero velocity
89
- velocity.assign(vec3(0));
90
- })().compute(count);
91
-
92
- // Run once at startup
93
- await renderer.computeAsync(computeInit);
94
- ```
95
-
96
- ### Physics Update
97
-
98
- ```javascript
99
- const gravity = uniform(-9.8);
100
- const deltaTimeUniform = uniform(0);
101
- const groundY = uniform(0);
102
-
103
- const computeUpdate = Fn(() => {
104
- const position = positions.element(instanceIndex);
105
- const velocity = velocities.element(instanceIndex);
106
- const dt = deltaTimeUniform;
107
-
108
- // Apply gravity
109
- velocity.y.addAssign(gravity.mul(dt));
110
-
111
- // Update position
112
- position.addAssign(velocity.mul(dt));
113
-
114
- // Ground collision
115
- If(position.y.lessThan(groundY), () => {
116
- position.y.assign(groundY);
117
- velocity.y.assign(velocity.y.negate().mul(0.8)); // Bounce
118
- velocity.xz.mulAssign(0.95); // Friction
119
- });
120
- })().compute(count);
121
-
122
- // In animation loop
123
- function animate() {
124
- deltaTimeUniform.value = clock.getDelta();
125
- renderer.compute(computeUpdate);
126
- renderer.render(scene, camera);
127
- }
128
- ```
129
-
130
- ### Attraction to Point
131
-
132
- ```javascript
133
- const attractorPos = uniform(new THREE.Vector3(0, 0, 0));
134
- const attractorStrength = uniform(1.0);
135
-
136
- const computeAttract = Fn(() => {
137
- const position = positions.element(instanceIndex);
138
- const velocity = velocities.element(instanceIndex);
139
-
140
- // Direction to attractor
141
- const toAttractor = attractorPos.sub(position);
142
- const distance = toAttractor.length();
143
- const direction = toAttractor.normalize();
144
-
145
- // Apply force (inverse square falloff)
146
- const force = direction.mul(attractorStrength).div(distance.mul(distance).add(0.1));
147
- velocity.addAssign(force.mul(deltaTimeUniform));
148
- })().compute(count);
149
- ```
150
-
151
- ### Neighbor Interaction (Boids-like)
152
-
153
- ```javascript
154
- const computeBoids = Fn(() => {
155
- const myPos = positions.element(instanceIndex);
156
- const myVel = velocities.element(instanceIndex);
157
-
158
- const separation = vec3(0).toVar();
159
- const alignment = vec3(0).toVar();
160
- const cohesion = vec3(0).toVar();
161
- const neighborCount = int(0).toVar();
162
-
163
- // Check nearby particles
164
- Loop(count, ({ i }) => {
165
- If(i.notEqual(instanceIndex), () => {
166
- const otherPos = positions.element(i);
167
- const otherVel = velocities.element(i);
168
- const dist = myPos.distance(otherPos);
169
-
170
- If(dist.lessThan(2.0), () => {
171
- // Separation
172
- const diff = myPos.sub(otherPos).normalize().div(dist);
173
- separation.addAssign(diff);
174
-
175
- // Alignment
176
- alignment.addAssign(otherVel);
177
-
178
- // Cohesion
179
- cohesion.addAssign(otherPos);
180
-
181
- neighborCount.addAssign(1);
182
- });
183
- });
184
- });
185
-
186
- If(neighborCount.greaterThan(0), () => {
187
- const n = neighborCount.toFloat();
188
- alignment.divAssign(n);
189
- cohesion.divAssign(n);
190
- cohesion.assign(cohesion.sub(myPos));
191
-
192
- myVel.addAssign(separation.mul(0.05));
193
- myVel.addAssign(alignment.sub(myVel).mul(0.05));
194
- myVel.addAssign(cohesion.mul(0.05));
195
- });
196
-
197
- // Limit speed
198
- const speed = myVel.length();
199
- If(speed.greaterThan(2.0), () => {
200
- myVel.assign(myVel.normalize().mul(2.0));
201
- });
202
-
203
- myPos.addAssign(myVel.mul(deltaTimeUniform));
204
- })().compute(count);
205
- ```
206
-
207
- ## Workgroups and Synchronization
208
-
209
- ### Workgroup Size
210
-
211
- ```javascript
212
- // Default workgroup size is typically 64 or 256
213
- const computeShader = Fn(() => {
214
- // shader code
215
- })().compute(count, { workgroupSize: 64 });
216
- ```
217
-
218
- ### Barriers
219
-
220
- ```javascript
221
- import { workgroupBarrier, storageBarrier, textureBarrier } from 'three/tsl';
222
-
223
- const computeShader = Fn(() => {
224
- // Write data
225
- sharedData.element(localIndex).assign(value);
226
-
227
- // Ensure all workgroup threads reach this point
228
- workgroupBarrier();
229
-
230
- // Now safe to read data written by other threads
231
- const neighborValue = sharedData.element(localIndex.add(1));
232
- })().compute(count);
233
- ```
234
-
235
- ## Atomic Operations
236
-
237
- For thread-safe read-modify-write operations:
238
-
239
- ```javascript
240
- import { atomicAdd, atomicSub, atomicMax, atomicMin, atomicAnd, atomicOr, atomicXor } from 'three/tsl';
241
-
242
- const counter = instancedArray(1, 'uint');
243
-
244
- const computeShader = Fn(() => {
245
- // Atomically increment counter
246
- atomicAdd(counter.element(0), 1);
247
-
248
- // Atomic max
249
- atomicMax(maxValue.element(0), localValue);
250
- })().compute(count);
251
- ```
252
-
253
- ## Using Compute Results in Materials
254
-
255
- ### Instanced Mesh with Computed Positions
256
-
257
- ```javascript
258
- // Create instanced mesh
259
- const geometry = new THREE.SphereGeometry(0.1, 16, 16);
260
- const material = new THREE.MeshStandardNodeMaterial();
261
-
262
- // Use computed positions
263
- material.positionNode = positions.element(instanceIndex);
264
-
265
- // Optionally use computed colors
266
- material.colorNode = colors.element(instanceIndex);
267
-
268
- const mesh = new THREE.InstancedMesh(geometry, material, count);
269
- scene.add(mesh);
270
- ```
271
-
272
- ### Points with Computed Positions
273
-
274
- ```javascript
275
- const geometry = new THREE.BufferGeometry();
276
- geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
277
-
278
- const material = new THREE.PointsNodeMaterial();
279
- material.positionNode = positions.element(instanceIndex);
280
- material.colorNode = colors.element(instanceIndex);
281
- material.sizeNode = float(5.0);
282
-
283
- const points = new THREE.Points(geometry, material);
284
- scene.add(points);
285
- ```
286
-
287
- ## Execution Methods
288
-
289
- ```javascript
290
- // Synchronous compute (blocks until complete)
291
- renderer.compute(computeShader);
292
-
293
- // Asynchronous compute (returns promise)
294
- await renderer.computeAsync(computeShader);
295
-
296
- // Multiple computes
297
- renderer.compute(computeInit);
298
- renderer.compute(computePhysics);
299
- renderer.compute(computeCollisions);
300
- ```
301
-
302
- ## Reading Back Data (GPU to CPU)
303
-
304
- ```javascript
305
- // Create buffer for readback
306
- const readBuffer = new Float32Array(count * 3);
307
-
308
- // Read data back from GPU
309
- await renderer.readRenderTargetPixelsAsync(
310
- computeTexture,
311
- 0, 0, width, height,
312
- readBuffer
313
- );
314
- ```
315
-
316
- ## Complete Example: Particle System
317
-
318
- ```javascript
319
- import * as THREE from 'three/webgpu';
320
- import {
321
- Fn, If, instancedArray, instanceIndex, uniform,
322
- vec3, float, hash, time
323
- } from 'three/tsl';
324
-
325
- // Setup
326
- const count = 50000;
327
- const positions = instancedArray(count, 'vec3');
328
- const velocities = instancedArray(count, 'vec3');
329
- const lifetimes = instancedArray(count, 'float');
330
-
331
- // Uniforms
332
- const emitterPos = uniform(new THREE.Vector3(0, 0, 0));
333
- const gravity = uniform(-2.0);
334
- const dt = uniform(0);
335
-
336
- // Initialize
337
- const computeInit = Fn(() => {
338
- const pos = positions.element(instanceIndex);
339
- const vel = velocities.element(instanceIndex);
340
- const life = lifetimes.element(instanceIndex);
341
-
342
- pos.assign(emitterPos);
343
-
344
- // Random velocity in cone
345
- const angle = hash(instanceIndex).mul(Math.PI * 2);
346
- const speed = hash(instanceIndex.add(1)).mul(2).add(1);
347
- vel.x.assign(angle.cos().mul(speed).mul(0.3));
348
- vel.y.assign(speed);
349
- vel.z.assign(angle.sin().mul(speed).mul(0.3));
350
-
351
- // Random lifetime
352
- life.assign(hash(instanceIndex.add(2)).mul(2).add(1));
353
- })().compute(count);
354
-
355
- // Update
356
- const computeUpdate = Fn(() => {
357
- const pos = positions.element(instanceIndex);
358
- const vel = velocities.element(instanceIndex);
359
- const life = lifetimes.element(instanceIndex);
360
-
361
- // Apply gravity
362
- vel.y.addAssign(gravity.mul(dt));
363
-
364
- // Update position
365
- pos.addAssign(vel.mul(dt));
366
-
367
- // Decrease lifetime
368
- life.subAssign(dt);
369
-
370
- // Respawn dead particles
371
- If(life.lessThan(0), () => {
372
- pos.assign(emitterPos);
373
- const angle = hash(instanceIndex.add(time.mul(1000))).mul(Math.PI * 2);
374
- const speed = hash(instanceIndex.add(time.mul(1000)).add(1)).mul(2).add(1);
375
- vel.x.assign(angle.cos().mul(speed).mul(0.3));
376
- vel.y.assign(speed);
377
- vel.z.assign(angle.sin().mul(speed).mul(0.3));
378
- life.assign(hash(instanceIndex.add(time.mul(1000)).add(2)).mul(2).add(1));
379
- });
380
- })().compute(count);
381
-
382
- // Material
383
- const material = new THREE.PointsNodeMaterial();
384
- material.positionNode = positions.element(instanceIndex);
385
- material.sizeNode = float(3.0);
386
- material.colorNode = vec3(1, 0.5, 0.2);
387
-
388
- // Geometry (dummy positions)
389
- const geometry = new THREE.BufferGeometry();
390
- geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
391
-
392
- const points = new THREE.Points(geometry, material);
393
- scene.add(points);
394
-
395
- // Init
396
- await renderer.computeAsync(computeInit);
397
-
398
- // Animation loop
399
- function animate() {
400
- dt.value = Math.min(clock.getDelta(), 0.1);
401
- renderer.compute(computeUpdate);
402
- renderer.render(scene, camera);
403
- }
404
- ```