@rotifer/playground 0.5.0-alpha.2 → 0.7.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 (316) hide show
  1. package/CHANGELOG.md +159 -15
  2. package/LICENSE +1 -1
  3. package/README.md +51 -23
  4. package/README.zh.md +54 -25
  5. package/dist/cloud/auth.d.ts +7 -1
  6. package/dist/cloud/auth.d.ts.map +1 -1
  7. package/dist/cloud/auth.js +65 -1
  8. package/dist/cloud/auth.js.map +1 -1
  9. package/dist/cloud/client.d.ts +4 -1
  10. package/dist/cloud/client.d.ts.map +1 -1
  11. package/dist/cloud/client.js +9 -2
  12. package/dist/cloud/client.js.map +1 -1
  13. package/dist/cloud/types.d.ts +3 -1
  14. package/dist/cloud/types.d.ts.map +1 -1
  15. package/dist/cloud/types.js.map +1 -1
  16. package/dist/commands/agent-create.d.ts.map +1 -1
  17. package/dist/commands/agent-create.js +66 -3
  18. package/dist/commands/agent-create.js.map +1 -1
  19. package/dist/commands/agent-run.d.ts.map +1 -1
  20. package/dist/commands/agent-run.js +296 -32
  21. package/dist/commands/agent-run.js.map +1 -1
  22. package/dist/commands/arena-submit.d.ts.map +1 -1
  23. package/dist/commands/arena-submit.js +45 -17
  24. package/dist/commands/arena-submit.js.map +1 -1
  25. package/dist/commands/compile.d.ts.map +1 -1
  26. package/dist/commands/compile.js +9 -3
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +13 -3
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/login.d.ts.map +1 -1
  32. package/dist/commands/login.js +23 -16
  33. package/dist/commands/login.js.map +1 -1
  34. package/dist/commands/network.js +4 -4
  35. package/dist/commands/network.js.map +1 -1
  36. package/dist/commands/publish.d.ts.map +1 -1
  37. package/dist/commands/publish.js +162 -44
  38. package/dist/commands/publish.js.map +1 -1
  39. package/dist/commands/test.d.ts.map +1 -1
  40. package/dist/commands/test.js +209 -23
  41. package/dist/commands/test.js.map +1 -1
  42. package/dist/commands/wrap.d.ts.map +1 -1
  43. package/dist/commands/wrap.js +17 -1
  44. package/dist/commands/wrap.js.map +1 -1
  45. package/dist/index.js +0 -0
  46. package/dist/runtime/network-gateway.d.ts +53 -0
  47. package/dist/runtime/network-gateway.d.ts.map +1 -0
  48. package/dist/runtime/network-gateway.js +147 -0
  49. package/dist/runtime/network-gateway.js.map +1 -0
  50. package/dist/utils/binding.d.ts +25 -0
  51. package/dist/utils/binding.d.ts.map +1 -1
  52. package/dist/utils/binding.js.map +1 -1
  53. package/dist/utils/open-browser.d.ts +10 -0
  54. package/dist/utils/open-browser.d.ts.map +1 -0
  55. package/dist/utils/open-browser.js +23 -0
  56. package/dist/utils/open-browser.js.map +1 -0
  57. package/genes/academic-writer/.cloud-manifest.json +6 -0
  58. package/genes/academic-writer/.gene-manifest.json +8 -0
  59. package/genes/academic-writer/SKILL.md +274 -0
  60. package/genes/academic-writer/phenotype.json +28 -0
  61. package/genes/ai-components/.cloud-manifest.json +6 -0
  62. package/genes/ai-components/.gene-manifest.json +8 -0
  63. package/genes/ai-components/SKILL.md +381 -0
  64. package/genes/ai-components/phenotype.json +28 -0
  65. package/genes/algorithmic-art/.cloud-manifest.json +6 -0
  66. package/genes/algorithmic-art/.gene-manifest.json +8 -0
  67. package/genes/algorithmic-art/SKILL.md +405 -0
  68. package/genes/algorithmic-art/phenotype.json +28 -0
  69. package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
  70. package/genes/answer-synthesizer/index.ts +194 -0
  71. package/genes/answer-synthesizer/phenotype.json +61 -0
  72. package/genes/api-designer/.cloud-manifest.json +6 -0
  73. package/genes/api-designer/.gene-manifest.json +8 -0
  74. package/genes/api-designer/SKILL.md +456 -0
  75. package/genes/api-designer/phenotype.json +28 -0
  76. package/genes/auto-coder/.cloud-manifest.json +6 -0
  77. package/genes/auto-coder/.gene-manifest.json +8 -0
  78. package/genes/auto-coder/SKILL.md +400 -0
  79. package/genes/auto-coder/phenotype.json +28 -0
  80. package/genes/auto-writer/.cloud-manifest.json +6 -0
  81. package/genes/auto-writer/.gene-manifest.json +8 -0
  82. package/genes/auto-writer/SKILL.md +361 -0
  83. package/genes/auto-writer/phenotype.json +28 -0
  84. package/genes/brand-personality/.cloud-manifest.json +6 -0
  85. package/genes/brand-personality/.gene-manifest.json +8 -0
  86. package/genes/brand-personality/SKILL.md +549 -0
  87. package/genes/brand-personality/phenotype.json +28 -0
  88. package/genes/business-writer/.cloud-manifest.json +6 -0
  89. package/genes/business-writer/.gene-manifest.json +8 -0
  90. package/genes/business-writer/SKILL.md +448 -0
  91. package/genes/business-writer/phenotype.json +28 -0
  92. package/genes/citation-manager/.cloud-manifest.json +6 -0
  93. package/genes/citation-manager/.gene-manifest.json +8 -0
  94. package/genes/citation-manager/SKILL.md +279 -0
  95. package/genes/citation-manager/index.ts +162 -0
  96. package/genes/citation-manager/package.json +1 -0
  97. package/genes/citation-manager/phenotype.json +50 -0
  98. package/genes/code-complexity/.cloud-manifest.json +6 -0
  99. package/genes/code-complexity/README.md +35 -0
  100. package/genes/code-complexity/index.ts +101 -0
  101. package/genes/code-complexity/phenotype.json +34 -0
  102. package/genes/copywriter/.cloud-manifest.json +6 -0
  103. package/genes/copywriter/.gene-manifest.json +8 -0
  104. package/genes/copywriter/SKILL.md +329 -0
  105. package/genes/copywriter/phenotype.json +28 -0
  106. package/genes/creative-writer/.cloud-manifest.json +6 -0
  107. package/genes/creative-writer/.gene-manifest.json +8 -0
  108. package/genes/creative-writer/SKILL.md +356 -0
  109. package/genes/creative-writer/phenotype.json +28 -0
  110. package/genes/data-modeler/.cloud-manifest.json +6 -0
  111. package/genes/data-modeler/.gene-manifest.json +8 -0
  112. package/genes/data-modeler/SKILL.md +486 -0
  113. package/genes/data-modeler/phenotype.json +28 -0
  114. package/genes/debugger/.cloud-manifest.json +6 -0
  115. package/genes/debugger/.gene-manifest.json +8 -0
  116. package/genes/debugger/SKILL.md +416 -0
  117. package/genes/debugger/phenotype.json +28 -0
  118. package/genes/design-tokens/.cloud-manifest.json +6 -0
  119. package/genes/design-tokens/.gene-manifest.json +8 -0
  120. package/genes/design-tokens/SKILL.md +222 -0
  121. package/genes/design-tokens/index.ts +128 -0
  122. package/genes/design-tokens/package.json +1 -0
  123. package/genes/design-tokens/phenotype.json +1 -0
  124. package/genes/devops-automator/.cloud-manifest.json +6 -0
  125. package/genes/devops-automator/.gene-manifest.json +8 -0
  126. package/genes/devops-automator/SKILL.md +490 -0
  127. package/genes/devops-automator/phenotype.json +28 -0
  128. package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
  129. package/genes/doc-coauthoring/.gene-manifest.json +8 -0
  130. package/genes/doc-coauthoring/SKILL.md +375 -0
  131. package/genes/doc-coauthoring/phenotype.json +28 -0
  132. package/genes/doc-retrieval/.cloud-manifest.json +6 -0
  133. package/genes/doc-retrieval/index.ts +134 -0
  134. package/genes/doc-retrieval/phenotype.json +54 -0
  135. package/genes/docs-writer/.cloud-manifest.json +6 -0
  136. package/genes/docs-writer/.gene-manifest.json +8 -0
  137. package/genes/docs-writer/SKILL.md +492 -0
  138. package/genes/docs-writer/phenotype.json +28 -0
  139. package/genes/evolve-life/.cloud-manifest.json +6 -0
  140. package/genes/evolve-life/.compile-result.json +12 -0
  141. package/genes/evolve-life/README.md +52 -0
  142. package/genes/evolve-life/gene.ir.wasm +0 -0
  143. package/genes/evolve-life/gene.wasm +0 -0
  144. package/genes/evolve-life/index.ts +255 -0
  145. package/genes/evolve-life/phenotype.json +129 -0
  146. package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
  147. package/genes/evolve-life-bitwise/.compile-result.json +12 -0
  148. package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
  149. package/genes/evolve-life-bitwise/gene.wasm +0 -0
  150. package/genes/evolve-life-bitwise/index.ts +273 -0
  151. package/genes/evolve-life-bitwise/phenotype.json +129 -0
  152. package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
  153. package/genes/evolve-life-sparse/.compile-result.json +12 -0
  154. package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
  155. package/genes/evolve-life-sparse/gene.wasm +0 -0
  156. package/genes/evolve-life-sparse/index.ts +236 -0
  157. package/genes/evolve-life-sparse/phenotype.json +129 -0
  158. package/genes/fact-checker/.cloud-manifest.json +6 -0
  159. package/genes/fact-checker/.gene-manifest.json +8 -0
  160. package/genes/fact-checker/SKILL.md +373 -0
  161. package/genes/fact-checker/phenotype.json +28 -0
  162. package/genes/genesis-code-format/.cloud-manifest.json +6 -0
  163. package/genes/genesis-code-format/package.json +1 -0
  164. package/genes/genesis-code-format/phenotype.json +1 -0
  165. package/genes/genesis-file-read/.cloud-manifest.json +6 -0
  166. package/genes/genesis-file-read/index.ts +11 -1
  167. package/genes/genesis-file-read/package.json +1 -0
  168. package/genes/genesis-file-read/phenotype.json +1 -0
  169. package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
  170. package/genes/genesis-l0-constraint/package.json +1 -0
  171. package/genes/genesis-l0-constraint/phenotype.json +1 -0
  172. package/genes/genesis-web-search/.cloud-manifest.json +2 -2
  173. package/genes/genesis-web-search/package.json +1 -0
  174. package/genes/genesis-web-search/phenotype.json +1 -0
  175. package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
  176. package/genes/genesis-web-search-lite/package.json +1 -0
  177. package/genes/genesis-web-search-lite/phenotype.json +1 -0
  178. package/genes/git-workflow/.cloud-manifest.json +6 -0
  179. package/genes/git-workflow/.gene-manifest.json +8 -0
  180. package/genes/git-workflow/SKILL.md +407 -0
  181. package/genes/git-workflow/phenotype.json +28 -0
  182. package/genes/grammar-checker/.cloud-manifest.json +6 -0
  183. package/genes/grammar-checker/.gene-manifest.json +8 -0
  184. package/genes/grammar-checker/SKILL.md +194 -0
  185. package/genes/grammar-checker/index.ts +168 -0
  186. package/genes/grammar-checker/package.json +1 -0
  187. package/genes/grammar-checker/phenotype.json +52 -0
  188. package/genes/json-validator/.cloud-manifest.json +6 -0
  189. package/genes/json-validator/README.md +42 -0
  190. package/genes/json-validator/index.ts +112 -0
  191. package/genes/json-validator/phenotype.json +42 -0
  192. package/genes/license-advisor/.cloud-manifest.json +6 -0
  193. package/genes/license-advisor/.gene-manifest.json +8 -0
  194. package/genes/license-advisor/SKILL.md +117 -0
  195. package/genes/license-advisor/phenotype.json +28 -0
  196. package/genes/logic-architect/.cloud-manifest.json +6 -0
  197. package/genes/logic-architect/.gene-manifest.json +8 -0
  198. package/genes/logic-architect/SKILL.md +451 -0
  199. package/genes/logic-architect/phenotype.json +28 -0
  200. package/genes/markdown-formatter/.cloud-manifest.json +6 -0
  201. package/genes/markdown-formatter/README.md +34 -0
  202. package/genes/markdown-formatter/index.ts +86 -0
  203. package/genes/markdown-formatter/phenotype.json +32 -0
  204. package/genes/orch/.cloud-manifest.json +6 -0
  205. package/genes/orch/.gene-manifest.json +8 -0
  206. package/genes/orch/SKILL.md +504 -0
  207. package/genes/orch/phenotype.json +28 -0
  208. package/genes/particle-barneshut/.cloud-manifest.json +6 -0
  209. package/genes/particle-barneshut/.compile-result.json +12 -0
  210. package/genes/particle-barneshut/README.md +55 -0
  211. package/genes/particle-barneshut/gene.ir.wasm +0 -0
  212. package/genes/particle-barneshut/gene.wasm +0 -0
  213. package/genes/particle-barneshut/index.ts +486 -0
  214. package/genes/particle-barneshut/phenotype.json +137 -0
  215. package/genes/particle-brute/.cloud-manifest.json +6 -0
  216. package/genes/particle-brute/.compile-result.json +12 -0
  217. package/genes/particle-brute/README.md +55 -0
  218. package/genes/particle-brute/gene.ir.wasm +0 -0
  219. package/genes/particle-brute/gene.wasm +0 -0
  220. package/genes/particle-brute/index.ts +277 -0
  221. package/genes/particle-brute/phenotype.json +137 -0
  222. package/genes/particle-spatial/.cloud-manifest.json +6 -0
  223. package/genes/particle-spatial/.compile-result.json +12 -0
  224. package/genes/particle-spatial/README.md +53 -0
  225. package/genes/particle-spatial/gene.ir.wasm +0 -0
  226. package/genes/particle-spatial/gene.wasm +0 -0
  227. package/genes/particle-spatial/index.ts +352 -0
  228. package/genes/particle-spatial/phenotype.json +137 -0
  229. package/genes/performance-optimizer/.cloud-manifest.json +6 -0
  230. package/genes/performance-optimizer/.gene-manifest.json +8 -0
  231. package/genes/performance-optimizer/SKILL.md +480 -0
  232. package/genes/performance-optimizer/phenotype.json +28 -0
  233. package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
  234. package/genes/plagiarism-checker/.gene-manifest.json +8 -0
  235. package/genes/plagiarism-checker/SKILL.md +342 -0
  236. package/genes/plagiarism-checker/phenotype.json +28 -0
  237. package/genes/product-manager/.cloud-manifest.json +6 -0
  238. package/genes/product-manager/.gene-manifest.json +8 -0
  239. package/genes/product-manager/SKILL.md +249 -0
  240. package/genes/product-manager/phenotype.json +28 -0
  241. package/genes/project-reviewer/.cloud-manifest.json +6 -0
  242. package/genes/project-reviewer/.gene-manifest.json +8 -0
  243. package/genes/project-reviewer/SKILL.md +312 -0
  244. package/genes/project-reviewer/phenotype.json +28 -0
  245. package/genes/prompt-engineer/.cloud-manifest.json +6 -0
  246. package/genes/prompt-engineer/.gene-manifest.json +8 -0
  247. package/genes/prompt-engineer/SKILL.md +411 -0
  248. package/genes/prompt-engineer/phenotype.json +28 -0
  249. package/genes/readability-analyzer/.cloud-manifest.json +6 -0
  250. package/genes/readability-analyzer/.gene-manifest.json +8 -0
  251. package/genes/readability-analyzer/SKILL.md +357 -0
  252. package/genes/readability-analyzer/index.ts +123 -0
  253. package/genes/readability-analyzer/package.json +1 -0
  254. package/genes/readability-analyzer/phenotype.json +35 -0
  255. package/genes/rotifer-protocol/SKILL.md +121 -0
  256. package/genes/security-auditor/.cloud-manifest.json +6 -0
  257. package/genes/security-auditor/.gene-manifest.json +8 -0
  258. package/genes/security-auditor/SKILL.md +494 -0
  259. package/genes/security-auditor/phenotype.json +28 -0
  260. package/genes/seo-optimizer/.cloud-manifest.json +6 -0
  261. package/genes/seo-optimizer/.gene-manifest.json +8 -0
  262. package/genes/seo-optimizer/SKILL.md +327 -0
  263. package/genes/seo-optimizer/index.ts +206 -0
  264. package/genes/seo-optimizer/package.json +1 -0
  265. package/genes/seo-optimizer/phenotype.json +1 -0
  266. package/genes/source-linker/.cloud-manifest.json +6 -0
  267. package/genes/source-linker/index.ts +88 -0
  268. package/genes/source-linker/phenotype.json +45 -0
  269. package/genes/style-optimizer/.cloud-manifest.json +6 -0
  270. package/genes/style-optimizer/.gene-manifest.json +8 -0
  271. package/genes/style-optimizer/SKILL.md +285 -0
  272. package/genes/style-optimizer/phenotype.json +28 -0
  273. package/genes/tech-lead/.cloud-manifest.json +6 -0
  274. package/genes/tech-lead/.gene-manifest.json +8 -0
  275. package/genes/tech-lead/SKILL.md +451 -0
  276. package/genes/tech-lead/phenotype.json +28 -0
  277. package/genes/test-wrap/.cloud-manifest.json +6 -0
  278. package/genes/test-wrap/.gene-manifest.json +8 -0
  279. package/genes/test-wrap/phenotype.json +28 -0
  280. package/genes/testing-strategist/.cloud-manifest.json +6 -0
  281. package/genes/testing-strategist/.gene-manifest.json +8 -0
  282. package/genes/testing-strategist/SKILL.md +500 -0
  283. package/genes/testing-strategist/phenotype.json +28 -0
  284. package/genes/text-summarizer/.cloud-manifest.json +6 -0
  285. package/genes/text-summarizer/README.md +34 -0
  286. package/genes/text-summarizer/index.ts +122 -0
  287. package/genes/text-summarizer/phenotype.json +32 -0
  288. package/genes/tone-analyzer/.cloud-manifest.json +6 -0
  289. package/genes/tone-analyzer/.gene-manifest.json +8 -0
  290. package/genes/tone-analyzer/SKILL.md +410 -0
  291. package/genes/tone-analyzer/phenotype.json +28 -0
  292. package/genes/translator/.cloud-manifest.json +6 -0
  293. package/genes/translator/.gene-manifest.json +8 -0
  294. package/genes/translator/SKILL.md +355 -0
  295. package/genes/translator/phenotype.json +28 -0
  296. package/genes/ui-components/.cloud-manifest.json +6 -0
  297. package/genes/ui-components/.gene-manifest.json +8 -0
  298. package/genes/ui-components/SKILL.md +467 -0
  299. package/genes/ui-components/phenotype.json +28 -0
  300. package/genes/uiux-designer/.cloud-manifest.json +6 -0
  301. package/genes/uiux-designer/.gene-manifest.json +8 -0
  302. package/genes/uiux-designer/SKILL.md +353 -0
  303. package/genes/uiux-designer/phenotype.json +28 -0
  304. package/genes/url-extractor/.cloud-manifest.json +6 -0
  305. package/genes/url-extractor/README.md +37 -0
  306. package/genes/url-extractor/index.ts +86 -0
  307. package/genes/url-extractor/phenotype.json +48 -0
  308. package/genes/ux-patterns/.cloud-manifest.json +6 -0
  309. package/genes/ux-patterns/.gene-manifest.json +8 -0
  310. package/genes/ux-patterns/SKILL.md +872 -0
  311. package/genes/ux-patterns/phenotype.json +28 -0
  312. package/genes/web3-components/.cloud-manifest.json +6 -0
  313. package/genes/web3-components/.gene-manifest.json +8 -0
  314. package/genes/web3-components/SKILL.md +390 -0
  315. package/genes/web3-components/phenotype.json +28 -0
  316. package/package.json +6 -5
@@ -0,0 +1,277 @@
1
+ interface Particle {
2
+ x: number;
3
+ y: number;
4
+ vx: number;
5
+ vy: number;
6
+ mass: number;
7
+ }
8
+
9
+ interface ParticleInput {
10
+ particles?: Particle[];
11
+ preset?: "solar" | "binary" | "cluster" | "collision";
12
+ count?: number;
13
+ steps?: number;
14
+ dt?: number;
15
+ G?: number;
16
+ softening?: number;
17
+ seed?: number;
18
+ }
19
+
20
+ interface ParticleOutput {
21
+ particles: Particle[];
22
+ steps_computed: number;
23
+ total_energy: number;
24
+ interactions_computed: number;
25
+ }
26
+
27
+ function mulberry32(seed: number): () => number {
28
+ let s = seed | 0;
29
+ return () => {
30
+ s = (s + 0x6d2b79f5) | 0;
31
+ let t = Math.imul(s ^ (s >>> 15), 1 | s);
32
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
33
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
34
+ };
35
+ }
36
+
37
+ function generatePreset(
38
+ preset: "solar" | "binary" | "cluster" | "collision",
39
+ count: number,
40
+ seed: number
41
+ ): Particle[] {
42
+ const rng = mulberry32(seed);
43
+ const G = 1.0;
44
+
45
+ switch (preset) {
46
+ case "solar": {
47
+ const particles: Particle[] = [];
48
+ const M_central = 100;
49
+ particles.push({ x: 0, y: 0, vx: 0, vy: 0, mass: M_central });
50
+
51
+ const nOrbiters = Math.min(count - 1, 63);
52
+ for (let i = 0; i < nOrbiters; i++) {
53
+ const r = 2 + rng() * 8;
54
+ const theta = rng() * 2 * Math.PI;
55
+ const x = r * Math.cos(theta);
56
+ const y = r * Math.sin(theta);
57
+ const v = Math.sqrt((G * M_central) / r);
58
+ const vx = -v * Math.sin(theta);
59
+ const vy = v * Math.cos(theta);
60
+ const mass = 0.1 + rng() * 0.9;
61
+ particles.push({ x, y, vx, vy, mass });
62
+ }
63
+ return particles;
64
+ }
65
+
66
+ case "binary": {
67
+ const particles: Particle[] = [];
68
+ const m1 = 50;
69
+ const m2 = 50;
70
+ const d = 4;
71
+ const r1 = (d * m2) / (m1 + m2);
72
+ const r2 = (d * m1) / (m1 + m2);
73
+ const omega = Math.sqrt((G * (m1 + m2)) / (d * d * d));
74
+ const v1 = omega * r1;
75
+ const v2 = omega * r2;
76
+
77
+ particles.push({ x: -r1, y: 0, vx: 0, vy: -v1, mass: m1 });
78
+ particles.push({ x: r2, y: 0, vx: 0, vy: v2, mass: m2 });
79
+
80
+ const nDebris = Math.min(count - 2, 62);
81
+ for (let i = 0; i < nDebris; i++) {
82
+ const r = 6 + rng() * 4;
83
+ const theta = rng() * 2 * Math.PI;
84
+ const x = r * Math.cos(theta);
85
+ const y = r * Math.sin(theta);
86
+ const v = Math.sqrt((G * (m1 + m2)) / r) * (0.8 + rng() * 0.4);
87
+ const vx = -v * Math.sin(theta);
88
+ const vy = v * Math.cos(theta);
89
+ const mass = 0.1 + rng() * 0.5;
90
+ particles.push({ x, y, vx, vy, mass });
91
+ }
92
+ return particles;
93
+ }
94
+
95
+ case "cluster": {
96
+ const particles: Particle[] = [];
97
+ const radius = 5;
98
+ for (let i = 0; i < count; i++) {
99
+ const r = radius * Math.sqrt(rng());
100
+ const theta = rng() * 2 * Math.PI;
101
+ const x = r * Math.cos(theta);
102
+ const y = r * Math.sin(theta);
103
+ const vMax = 0.3;
104
+ const vx = (rng() - 0.5) * 2 * vMax;
105
+ const vy = (rng() - 0.5) * 2 * vMax;
106
+ const mass = 0.5 + rng() * 1.5;
107
+ particles.push({ x, y, vx, vy, mass });
108
+ }
109
+ return particles;
110
+ }
111
+
112
+ case "collision": {
113
+ const particles: Particle[] = [];
114
+ const half = Math.floor(count / 2);
115
+ const sep = 10;
116
+ const vApproach = 1.5;
117
+
118
+ for (let i = 0; i < half; i++) {
119
+ const x = -sep + (rng() - 0.5) * 4;
120
+ const y = (rng() - 0.5) * 4;
121
+ const vx = vApproach + (rng() - 0.5) * 0.4;
122
+ const vy = (rng() - 0.5) * 0.4;
123
+ const mass = 0.5 + rng() * 1.5;
124
+ particles.push({ x, y, vx, vy, mass });
125
+ }
126
+ for (let i = 0; i < count - half; i++) {
127
+ const x = sep + (rng() - 0.5) * 4;
128
+ const y = (rng() - 0.5) * 4;
129
+ const vx = -vApproach + (rng() - 0.5) * 0.4;
130
+ const vy = (rng() - 0.5) * 0.4;
131
+ const mass = 0.5 + rng() * 1.5;
132
+ particles.push({ x, y, vx, vy, mass });
133
+ }
134
+ return particles;
135
+ }
136
+
137
+ default:
138
+ return generatePreset("cluster", count, seed);
139
+ }
140
+ }
141
+
142
+ function computeTotalEnergy(
143
+ particles: Particle[],
144
+ G: number,
145
+ softening: number
146
+ ): number {
147
+ let kinetic = 0;
148
+ let potential = 0;
149
+ const n = particles.length;
150
+
151
+ for (let i = 0; i < n; i++) {
152
+ const p = particles[i];
153
+ kinetic += 0.5 * p.mass * (p.vx * p.vx + p.vy * p.vy);
154
+ }
155
+
156
+ for (let i = 0; i < n; i++) {
157
+ for (let j = i + 1; j < n; j++) {
158
+ const pi = particles[i];
159
+ const pj = particles[j];
160
+ const dx = pj.x - pi.x;
161
+ const dy = pj.y - pi.y;
162
+ const rSq = dx * dx + dy * dy + softening * softening;
163
+ const r = Math.sqrt(rSq);
164
+ potential -= (G * pi.mass * pj.mass) / r;
165
+ }
166
+ }
167
+
168
+ return kinetic + potential;
169
+ }
170
+
171
+ export async function express(input: ParticleInput): Promise<ParticleOutput> {
172
+ const count = Math.max(2, Math.min(2048, input.count ?? 64));
173
+ const steps = Math.max(1, Math.min(10000, input.steps ?? 100));
174
+ const dt = input.dt ?? 0.01;
175
+ const G = input.G ?? 1.0;
176
+ const softening = input.softening ?? 0.01;
177
+ const seed = input.seed ?? 42;
178
+
179
+ let particles: Particle[];
180
+
181
+ if (input.particles && input.particles.length > 0) {
182
+ particles = input.particles.map((p) => ({
183
+ x: p.x,
184
+ y: p.y,
185
+ vx: p.vx,
186
+ vy: p.vy,
187
+ mass: p.mass,
188
+ }));
189
+ } else {
190
+ const preset = input.preset ?? "cluster";
191
+ particles = generatePreset(preset, count, seed);
192
+ }
193
+
194
+ const n = particles.length;
195
+ const pairsPerStep = (n * (n - 1)) / 2;
196
+ let interactionsComputed = 0;
197
+
198
+ const ax = new Float64Array(n);
199
+ const ay = new Float64Array(n);
200
+
201
+ for (let stepIdx = 0; stepIdx < steps; stepIdx++) {
202
+ ax.fill(0);
203
+ ay.fill(0);
204
+
205
+ for (let i = 0; i < n; i++) {
206
+ for (let j = i + 1; j < n; j++) {
207
+ const pi = particles[i];
208
+ const pj = particles[j];
209
+ const dx = pj.x - pi.x;
210
+ const dy = pj.y - pi.y;
211
+ const rSq = dx * dx + dy * dy + softening * softening;
212
+ const rSoft = Math.pow(rSq, 1.5);
213
+ const factor = G / rSoft;
214
+
215
+ const axij = factor * pj.mass * dx;
216
+ const ayij = factor * pj.mass * dy;
217
+
218
+ ax[i] += axij;
219
+ ay[i] += ayij;
220
+ ax[j] -= factor * pi.mass * dx;
221
+ ay[j] -= factor * pi.mass * dy;
222
+ }
223
+ }
224
+ interactionsComputed += pairsPerStep;
225
+
226
+ for (let i = 0; i < n; i++) {
227
+ const p = particles[i];
228
+ p.vx += 0.5 * dt * ax[i];
229
+ p.vy += 0.5 * dt * ay[i];
230
+ }
231
+
232
+ for (let i = 0; i < n; i++) {
233
+ const p = particles[i];
234
+ p.x += dt * p.vx;
235
+ p.y += dt * p.vy;
236
+ }
237
+
238
+ ax.fill(0);
239
+ ay.fill(0);
240
+
241
+ for (let i = 0; i < n; i++) {
242
+ for (let j = i + 1; j < n; j++) {
243
+ const pi = particles[i];
244
+ const pj = particles[j];
245
+ const dx = pj.x - pi.x;
246
+ const dy = pj.y - pi.y;
247
+ const rSq = dx * dx + dy * dy + softening * softening;
248
+ const rSoft = Math.pow(rSq, 1.5);
249
+ const factor = G / rSoft;
250
+
251
+ const axij = factor * pj.mass * dx;
252
+ const ayij = factor * pj.mass * dy;
253
+
254
+ ax[i] += axij;
255
+ ay[i] += ayij;
256
+ ax[j] -= factor * pi.mass * dx;
257
+ ay[j] -= factor * pi.mass * dy;
258
+ }
259
+ }
260
+ interactionsComputed += pairsPerStep;
261
+
262
+ for (let i = 0; i < n; i++) {
263
+ const p = particles[i];
264
+ p.vx += 0.5 * dt * ax[i];
265
+ p.vy += 0.5 * dt * ay[i];
266
+ }
267
+ }
268
+
269
+ const totalEnergy = computeTotalEnergy(particles, G, softening);
270
+
271
+ return {
272
+ particles,
273
+ steps_computed: steps,
274
+ total_energy: totalEnergy,
275
+ interactions_computed: interactionsComputed,
276
+ };
277
+ }
@@ -0,0 +1,137 @@
1
+ {
2
+ "domain": "sim.particle",
3
+ "description": "N-body gravitational simulation using brute-force all-pairs direct summation. Computes exact O(n^2) pairwise interactions per step — maximum accuracy baseline. Supports preset configurations (solar system, binary star, galaxy cluster, collision).",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "particles": {
8
+ "type": "array",
9
+ "description": "Initial particle states. Ignored if preset is provided.",
10
+ "items": {
11
+ "type": "object",
12
+ "properties": {
13
+ "x": {
14
+ "type": "number"
15
+ },
16
+ "y": {
17
+ "type": "number"
18
+ },
19
+ "vx": {
20
+ "type": "number"
21
+ },
22
+ "vy": {
23
+ "type": "number"
24
+ },
25
+ "mass": {
26
+ "type": "number"
27
+ }
28
+ },
29
+ "required": [
30
+ "x",
31
+ "y",
32
+ "vx",
33
+ "vy",
34
+ "mass"
35
+ ]
36
+ }
37
+ },
38
+ "preset": {
39
+ "type": "string",
40
+ "description": "Preset particle configuration",
41
+ "enum": [
42
+ "solar",
43
+ "binary",
44
+ "cluster",
45
+ "collision"
46
+ ]
47
+ },
48
+ "count": {
49
+ "type": "number",
50
+ "description": "Number of particles for preset generation",
51
+ "default": 64,
52
+ "minimum": 2,
53
+ "maximum": 2048
54
+ },
55
+ "steps": {
56
+ "type": "number",
57
+ "description": "Number of simulation steps",
58
+ "default": 100,
59
+ "minimum": 1,
60
+ "maximum": 10000
61
+ },
62
+ "dt": {
63
+ "type": "number",
64
+ "description": "Time step size",
65
+ "default": 0.01
66
+ },
67
+ "G": {
68
+ "type": "number",
69
+ "description": "Gravitational constant",
70
+ "default": 1
71
+ },
72
+ "softening": {
73
+ "type": "number",
74
+ "description": "Softening parameter to prevent singularity at close range",
75
+ "default": 0.01
76
+ },
77
+ "seed": {
78
+ "type": "number",
79
+ "description": "Random seed for preset generation (deterministic output)"
80
+ }
81
+ },
82
+ "required": []
83
+ },
84
+ "outputSchema": {
85
+ "type": "object",
86
+ "properties": {
87
+ "particles": {
88
+ "type": "array",
89
+ "description": "Final particle states after simulation",
90
+ "items": {
91
+ "type": "object",
92
+ "properties": {
93
+ "x": {
94
+ "type": "number"
95
+ },
96
+ "y": {
97
+ "type": "number"
98
+ },
99
+ "vx": {
100
+ "type": "number"
101
+ },
102
+ "vy": {
103
+ "type": "number"
104
+ },
105
+ "mass": {
106
+ "type": "number"
107
+ }
108
+ }
109
+ }
110
+ },
111
+ "steps_computed": {
112
+ "type": "number",
113
+ "description": "Actual number of simulation steps computed"
114
+ },
115
+ "total_energy": {
116
+ "type": "number",
117
+ "description": "Total system energy (kinetic + potential) at final state"
118
+ },
119
+ "interactions_computed": {
120
+ "type": "number",
121
+ "description": "Total pairwise force evaluations across all steps"
122
+ }
123
+ },
124
+ "required": [
125
+ "particles",
126
+ "steps_computed",
127
+ "total_energy",
128
+ "interactions_computed"
129
+ ]
130
+ },
131
+ "dependencies": [],
132
+ "version": "0.1.0",
133
+ "author": "rotifer-team",
134
+ "fidelity": "Native",
135
+ "transparency": "Open",
136
+ "ir_hash": "391614d239e64ad94d257ec59c079a1a060d0143b28f6edd8ec255858f961d1c"
137
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "cloud_id": "a29c1488-8591-40e9-bc9e-5edbafdd66b3",
3
+ "owner": "Rotifer Protocol",
4
+ "version": "0.1.0",
5
+ "published_at": "2026-03-17T14:13:20.276Z"
6
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "geneId": "91f0c58c3342d9853eef2747aa91cf59e23f80a5426be2ce9200a1e44a0de113",
3
+ "name": "particle-spatial",
4
+ "domain": "sim.particle",
5
+ "compiledAt": "2026-03-14T09:13:54.298Z",
6
+ "fidelity": "Native",
7
+ "wasmAvailable": true,
8
+ "irHash": "391614d239e64ad94d257ec59c079a1a060d0143b28f6edd8ec255858f961d1c",
9
+ "totalSize": 1322156,
10
+ "codeSectionSize": 956115,
11
+ "durationMs": 5868
12
+ }
@@ -0,0 +1,53 @@
1
+ # particle-spatial
2
+
3
+ Spatial hash grid N-body simulation — a pure-computation Native Gene for the Rotifer Protocol.
4
+
5
+ ## Algorithm
6
+
7
+ Partitions space into a uniform grid of fixed-size cells. For each particle, only computes gravitational forces from particles in the same cell and 8 neighboring cells (3×3 neighborhood). Long-range forces beyond the cell neighborhood are ignored.
8
+
9
+ Cell size is adaptive: `cellSize = max(2ε, 2 × √(area / n))`, scaling with the average inter-particle spacing and bounded by the softening parameter.
10
+
11
+ Integration uses the symplectic leapfrog (kick-drift-kick) scheme.
12
+
13
+ This approach trades long-range gravitational accuracy for raw speed — achieving near-O(n) performance when particles are roughly uniformly distributed. It's better suited for short-range-dominated systems (collisions, dense clusters) than for orbital mechanics where long-range gravity dominates.
14
+
15
+ ## Usage
16
+
17
+ ```bash
18
+ # Cluster preset (good fit for spatial hashing)
19
+ rotifer run particle-spatial --input '{"preset": "cluster", "count": 256}'
20
+
21
+ # Collision (where short-range forces dominate)
22
+ rotifer run particle-spatial --input '{"preset": "collision", "count": 512, "steps": 300}'
23
+
24
+ # Solar system (less accurate due to missing long-range forces)
25
+ rotifer run particle-spatial --input '{"preset": "solar"}'
26
+ ```
27
+
28
+ ## Presets
29
+
30
+ | Preset | Description |
31
+ |--------|-------------|
32
+ | `solar` | Central massive body + orbiting lighter bodies with circular velocities |
33
+ | `binary` | Two equal-mass stars in mutual orbit + debris ring |
34
+ | `cluster` | Random particles in a disk with small random velocities |
35
+ | `collision` | Two groups of particles approaching head-on |
36
+
37
+ ## Output
38
+
39
+ - `particles` — final positions and velocities of all particles
40
+ - `steps_computed` — number of simulation steps executed
41
+ - `total_energy` — total system energy (kinetic + potential) for conservation validation
42
+ - `interactions_computed` — total neighbor-cell force evaluations
43
+
44
+ ## Fitness Characteristics
45
+
46
+ | Metric | Expected |
47
+ |--------|----------|
48
+ | Success Rate | 1.0 (deterministic, no failure mode) |
49
+ | Accuracy | Low-medium (only short-range interactions, misses distant forces) |
50
+ | Complexity | ~O(n × steps) for uniform distributions |
51
+ | Interactions | Depends on particle clustering — much fewer than n² |
52
+ | Best For | Large N with short-range dominated interactions (collisions, dense clusters) |
53
+ | Weakness | Poor for orbital/long-range gravity (solar, binary) |
Binary file