@classytic/stage 0.2.0 → 0.4.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 (458) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -1
  3. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  4. package/dist/assets/index.mjs +0 -1
  5. package/dist/atomic/aufbau.d.mts +144 -0
  6. package/dist/atomic/aufbau.mjs +384 -0
  7. package/dist/atomic/elements.d.mts +67 -0
  8. package/dist/atomic/elements.mjs +785 -0
  9. package/dist/atomic/emission.d.mts +112 -0
  10. package/dist/atomic/emission.mjs +179 -0
  11. package/dist/atomic/index.d.mts +8 -0
  12. package/dist/atomic/index.mjs +9 -0
  13. package/dist/atomic/periodic.d.mts +82 -0
  14. package/dist/atomic/periodic.mjs +231 -0
  15. package/dist/atomic/properties.d.mts +100 -0
  16. package/dist/atomic/properties.mjs +574 -0
  17. package/dist/atomic/shells.d.mts +137 -0
  18. package/dist/atomic/shells.mjs +170 -0
  19. package/dist/atomic/trends.d.mts +148 -0
  20. package/dist/atomic/trends.mjs +225 -0
  21. package/dist/builder/Palette.mjs +50 -89
  22. package/dist/builder/SceneBuilder.mjs +15 -73
  23. package/dist/chem/chromatography.d.mts +66 -0
  24. package/dist/chem/chromatography.mjs +63 -0
  25. package/dist/chem/complex.d.mts +114 -0
  26. package/dist/chem/complex.mjs +234 -0
  27. package/dist/chem/cycle.d.mts +75 -0
  28. package/dist/chem/cycle.mjs +145 -0
  29. package/dist/chem/equation.d.mts +86 -0
  30. package/dist/chem/equation.mjs +168 -0
  31. package/dist/chem/formula.d.mts +90 -0
  32. package/dist/chem/formula.mjs +201 -0
  33. package/dist/chem/functional-groups.d.mts +31 -0
  34. package/dist/chem/functional-groups.mjs +187 -0
  35. package/dist/chem/hazard.d.mts +94 -0
  36. package/dist/chem/hazard.mjs +329 -0
  37. package/dist/chem/index.d.mts +34 -33
  38. package/dist/chem/index.mjs +34 -28
  39. package/dist/chem/ionic.d.mts +98 -0
  40. package/dist/chem/ionic.mjs +156 -0
  41. package/dist/chem/layout.d.mts +46 -0
  42. package/dist/chem/layout.mjs +342 -0
  43. package/dist/chem/lewis.d.mts +79 -0
  44. package/dist/chem/lewis.mjs +163 -0
  45. package/dist/chem/molecular-orbital.d.mts +114 -0
  46. package/dist/chem/molecular-orbital.mjs +201 -0
  47. package/dist/chem/molecule.d.mts +154 -0
  48. package/dist/chem/molecule.mjs +282 -0
  49. package/dist/chem/nmr.d.mts +153 -0
  50. package/dist/chem/nmr.mjs +165 -0
  51. package/dist/chem/polymer.d.mts +65 -0
  52. package/dist/chem/polymer.mjs +179 -0
  53. package/dist/chem/redox.d.mts +138 -0
  54. package/dist/chem/redox.mjs +328 -0
  55. package/dist/chem/relations.d.mts +183 -0
  56. package/dist/chem/relations.mjs +299 -0
  57. package/dist/chem/skeleton.d.mts +51 -0
  58. package/dist/chem/skeleton.mjs +186 -0
  59. package/dist/chem/solution.d.mts +116 -0
  60. package/dist/chem/solution.mjs +186 -0
  61. package/dist/chem/species.d.mts +47 -0
  62. package/dist/chem/species.mjs +128 -0
  63. package/dist/chem/stereo.d.mts +108 -0
  64. package/dist/chem/stereo.mjs +286 -0
  65. package/dist/chem/stoichiometry.d.mts +95 -0
  66. package/dist/chem/stoichiometry.mjs +145 -0
  67. package/dist/chem/synthesis.d.mts +113 -0
  68. package/dist/chem/synthesis.mjs +281 -0
  69. package/dist/chem/vsepr.d.mts +80 -0
  70. package/dist/chem/vsepr.mjs +247 -0
  71. package/dist/circuit/ac.d.mts +163 -0
  72. package/dist/circuit/ac.mjs +452 -0
  73. package/dist/circuit/dc.d.mts +92 -0
  74. package/dist/circuit/dc.mjs +333 -0
  75. package/dist/circuit/index.d.mts +5 -92
  76. package/dist/circuit/index.mjs +5 -332
  77. package/dist/circuit/network.d.mts +99 -0
  78. package/dist/circuit/network.mjs +440 -0
  79. package/dist/circuit/topology.d.mts +102 -0
  80. package/dist/circuit/topology.mjs +143 -0
  81. package/dist/colour/absorption.d.mts +79 -0
  82. package/dist/colour/absorption.mjs +137 -0
  83. package/dist/colour/index.d.mts +6 -0
  84. package/dist/colour/index.mjs +7 -0
  85. package/dist/colour/name.d.mts +14 -0
  86. package/dist/colour/name.mjs +76 -0
  87. package/dist/colour/observer.d.mts +31 -0
  88. package/dist/colour/observer.mjs +46 -0
  89. package/dist/colour/spectrum.d.mts +61 -0
  90. package/dist/colour/spectrum.mjs +108 -0
  91. package/dist/colour/srgb.d.mts +49 -0
  92. package/dist/colour/srgb.mjs +108 -0
  93. package/dist/core/constants.d.mts +138 -0
  94. package/dist/core/constants.mjs +139 -0
  95. package/dist/core/index.d.mts +4 -1
  96. package/dist/core/index.mjs +4 -1
  97. package/dist/core/math.d.mts +26 -0
  98. package/dist/core/math.mjs +37 -0
  99. package/dist/core/vec3.d.mts +94 -0
  100. package/dist/core/vec3.mjs +123 -0
  101. package/dist/core/worked.d.mts +35 -0
  102. package/dist/core/worked.mjs +44 -0
  103. package/dist/electro/cell.d.mts +102 -0
  104. package/dist/electro/cell.mjs +170 -0
  105. package/dist/electro/conductivity.d.mts +157 -0
  106. package/dist/electro/conductivity.mjs +156 -0
  107. package/dist/electro/couples.d.mts +114 -0
  108. package/dist/electro/couples.mjs +334 -0
  109. package/dist/electro/electrolysis.d.mts +96 -0
  110. package/dist/electro/electrolysis.mjs +274 -0
  111. package/dist/electro/faraday.d.mts +150 -0
  112. package/dist/electro/faraday.mjs +118 -0
  113. package/dist/electro/index.d.mts +6 -0
  114. package/dist/electro/index.mjs +7 -0
  115. package/dist/finance/accounting/adjustments.d.mts +17 -0
  116. package/dist/finance/accounting/adjustments.mjs +202 -0
  117. package/dist/finance/accounting/analysis.d.mts +8 -0
  118. package/dist/finance/accounting/analysis.mjs +205 -0
  119. package/dist/finance/accounting/clubs.d.mts +21 -0
  120. package/dist/finance/accounting/clubs.mjs +217 -0
  121. package/dist/finance/accounting/company-statements.d.mts +7 -0
  122. package/dist/finance/accounting/company-statements.mjs +150 -0
  123. package/dist/finance/accounting/harness.d.mts +7 -0
  124. package/dist/finance/accounting/harness.mjs +45 -0
  125. package/dist/finance/accounting/index.d.mts +18 -0
  126. package/dist/finance/accounting/index.mjs +18 -0
  127. package/dist/finance/accounting/journalize.d.mts +16 -0
  128. package/dist/finance/accounting/journalize.mjs +128 -0
  129. package/dist/finance/accounting/manufacturing.d.mts +8 -0
  130. package/dist/finance/accounting/manufacturing.mjs +236 -0
  131. package/dist/finance/accounting/partnership.d.mts +7 -0
  132. package/dist/finance/accounting/partnership.mjs +152 -0
  133. package/dist/finance/accounting/period-case.d.mts +6 -0
  134. package/dist/finance/accounting/period-case.mjs +71 -0
  135. package/dist/finance/accounting/post.d.mts +9 -0
  136. package/dist/finance/accounting/post.mjs +84 -0
  137. package/dist/finance/accounting/precision.d.mts +9 -0
  138. package/dist/finance/accounting/precision.mjs +15 -0
  139. package/dist/finance/accounting/rules.d.mts +21 -0
  140. package/dist/finance/accounting/rules.mjs +37 -0
  141. package/dist/finance/accounting/solve.d.mts +28 -0
  142. package/dist/finance/accounting/solve.mjs +92 -0
  143. package/dist/finance/accounting/statements.d.mts +7 -0
  144. package/dist/finance/accounting/statements.mjs +142 -0
  145. package/dist/finance/accounting/types.d.mts +649 -0
  146. package/dist/finance/accounting/validate.d.mts +7 -0
  147. package/dist/finance/accounting/validate.mjs +67 -0
  148. package/dist/finance/accounting/verification.d.mts +24 -0
  149. package/dist/finance/accounting/verification.mjs +386 -0
  150. package/dist/finance/bizsim.d.mts +75 -0
  151. package/dist/finance/bizsim.mjs +296 -0
  152. package/dist/finance/index.d.mts +95 -0
  153. package/dist/finance/index.mjs +145 -0
  154. package/dist/finance/investment-math.d.mts +7 -0
  155. package/dist/finance/investment-math.mjs +18 -0
  156. package/dist/finance/management-accounting/budgeting.d.mts +7 -0
  157. package/dist/finance/management-accounting/budgeting.mjs +189 -0
  158. package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
  159. package/dist/finance/management-accounting/cash-budget.mjs +154 -0
  160. package/dist/finance/management-accounting/costing.d.mts +8 -0
  161. package/dist/finance/management-accounting/costing.mjs +175 -0
  162. package/dist/finance/management-accounting/decisions.d.mts +8 -0
  163. package/dist/finance/management-accounting/decisions.mjs +164 -0
  164. package/dist/finance/management-accounting/index.d.mts +13 -0
  165. package/dist/finance/management-accounting/index.mjs +13 -0
  166. package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
  167. package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
  168. package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
  169. package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
  170. package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
  171. package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
  172. package/dist/finance/management-accounting/management-case.d.mts +8 -0
  173. package/dist/finance/management-accounting/management-case.mjs +91 -0
  174. package/dist/finance/management-accounting/master-budget.d.mts +7 -0
  175. package/dist/finance/management-accounting/master-budget.mjs +137 -0
  176. package/dist/finance/management-accounting/production-costing.d.mts +8 -0
  177. package/dist/finance/management-accounting/production-costing.mjs +214 -0
  178. package/dist/finance/management-accounting/types.d.mts +644 -0
  179. package/dist/finance/management-accounting/variances.d.mts +7 -0
  180. package/dist/finance/management-accounting/variances.mjs +150 -0
  181. package/dist/index.d.mts +9 -8
  182. package/dist/index.mjs +5 -5
  183. package/dist/interaction/MovableDot.mjs +19 -0
  184. package/dist/interaction/useDraggable.mjs +24 -4
  185. package/dist/math/analysis.d.mts +61 -0
  186. package/dist/math/analysis.mjs +187 -0
  187. package/dist/math/answer-check.d.mts +50 -0
  188. package/dist/math/answer-check.mjs +106 -0
  189. package/dist/math/calculus.d.mts +17 -1
  190. package/dist/math/calculus.mjs +365 -2
  191. package/dist/math/complex.d.mts +93 -0
  192. package/dist/math/complex.mjs +239 -0
  193. package/dist/math/expr.d.mts +23 -0
  194. package/dist/math/expr.mjs +36 -0
  195. package/dist/math/index.d.mts +9 -23
  196. package/dist/math/index.mjs +9 -38
  197. package/dist/math/latex.mjs +10 -1
  198. package/dist/math/parse.mjs +1 -1
  199. package/dist/math/poly.d.mts +55 -0
  200. package/dist/math/poly.mjs +273 -0
  201. package/dist/math/rearrange.d.mts +14 -0
  202. package/dist/math/rearrange.mjs +125 -0
  203. package/dist/math/solve.d.mts +21 -0
  204. package/dist/math/solve.mjs +75 -0
  205. package/dist/networking/addressing.d.mts +26 -0
  206. package/dist/networking/addressing.mjs +33 -0
  207. package/dist/networking/cloud/access.d.mts +36 -0
  208. package/dist/networking/cloud/access.mjs +95 -0
  209. package/dist/networking/cloud/containers.d.mts +43 -0
  210. package/dist/networking/cloud/containers.mjs +54 -0
  211. package/dist/networking/cloud/edge.d.mts +17 -0
  212. package/dist/networking/cloud/edge.mjs +31 -0
  213. package/dist/networking/cloud/failure-domains.d.mts +19 -0
  214. package/dist/networking/cloud/failure-domains.mjs +22 -0
  215. package/dist/networking/cloud/geo-routing.d.mts +22 -0
  216. package/dist/networking/cloud/geo-routing.mjs +64 -0
  217. package/dist/networking/cloud/index.d.mts +18 -0
  218. package/dist/networking/cloud/index.mjs +19 -0
  219. package/dist/networking/cloud/inference-reliability.d.mts +30 -0
  220. package/dist/networking/cloud/inference-reliability.mjs +76 -0
  221. package/dist/networking/cloud/inference.d.mts +118 -0
  222. package/dist/networking/cloud/inference.mjs +179 -0
  223. package/dist/networking/cloud/infrastructure.d.mts +45 -0
  224. package/dist/networking/cloud/infrastructure.mjs +96 -0
  225. package/dist/networking/cloud/observability.d.mts +24 -0
  226. package/dist/networking/cloud/observability.mjs +34 -0
  227. package/dist/networking/cloud/orchestration.d.mts +32 -0
  228. package/dist/networking/cloud/orchestration.mjs +38 -0
  229. package/dist/networking/cloud/recovery.d.mts +21 -0
  230. package/dist/networking/cloud/recovery.mjs +27 -0
  231. package/dist/networking/cloud/releases.d.mts +42 -0
  232. package/dist/networking/cloud/releases.mjs +135 -0
  233. package/dist/networking/cloud/scaling.d.mts +25 -0
  234. package/dist/networking/cloud/scaling.mjs +65 -0
  235. package/dist/networking/cloud/secrets.d.mts +39 -0
  236. package/dist/networking/cloud/secrets.mjs +68 -0
  237. package/dist/networking/cloud/server-deployment.d.mts +29 -0
  238. package/dist/networking/cloud/server-deployment.mjs +72 -0
  239. package/dist/networking/cloud/storage.d.mts +16 -0
  240. package/dist/networking/cloud/storage.mjs +58 -0
  241. package/dist/networking/cloud/vpc.d.mts +18 -0
  242. package/dist/networking/cloud/vpc.mjs +100 -0
  243. package/dist/networking/delivery.d.mts +34 -0
  244. package/dist/networking/delivery.mjs +52 -0
  245. package/dist/networking/index.d.mts +47 -0
  246. package/dist/networking/index.mjs +47 -0
  247. package/dist/networking/ipv6.d.mts +28 -0
  248. package/dist/networking/ipv6.mjs +17 -0
  249. package/dist/networking/journeys.d.mts +83 -0
  250. package/dist/networking/journeys.mjs +161 -0
  251. package/dist/networking/models/airtime.d.mts +87 -0
  252. package/dist/networking/models/airtime.mjs +130 -0
  253. package/dist/networking/models/cellular.d.mts +157 -0
  254. package/dist/networking/models/cellular.mjs +252 -0
  255. package/dist/networking/models/encapsulation.d.mts +98 -0
  256. package/dist/networking/models/encapsulation.mjs +132 -0
  257. package/dist/networking/models/handover.d.mts +116 -0
  258. package/dist/networking/models/handover.mjs +209 -0
  259. package/dist/networking/models/handshake.d.mts +90 -0
  260. package/dist/networking/models/handshake.mjs +122 -0
  261. package/dist/networking/models/index.d.mts +14 -0
  262. package/dist/networking/models/index.mjs +15 -0
  263. package/dist/networking/models/media.d.mts +82 -0
  264. package/dist/networking/models/media.mjs +188 -0
  265. package/dist/networking/models/satellite.d.mts +86 -0
  266. package/dist/networking/models/satellite.mjs +121 -0
  267. package/dist/networking/models/spectrum.d.mts +83 -0
  268. package/dist/networking/models/spectrum.mjs +235 -0
  269. package/dist/networking/models/switch.d.mts +80 -0
  270. package/dist/networking/models/switch.mjs +155 -0
  271. package/dist/networking/models/vlan.d.mts +62 -0
  272. package/dist/networking/models/vlan.mjs +100 -0
  273. package/dist/networking/models/vpn.d.mts +66 -0
  274. package/dist/networking/models/vpn.mjs +125 -0
  275. package/dist/networking/models/wifi-privacy.d.mts +82 -0
  276. package/dist/networking/models/wifi-privacy.mjs +130 -0
  277. package/dist/networking/models/wifi.d.mts +240 -0
  278. package/dist/networking/models/wifi.mjs +562 -0
  279. package/dist/networking/nat-traversal.d.mts +24 -0
  280. package/dist/networking/nat-traversal.mjs +38 -0
  281. package/dist/networking/protocols.d.mts +17 -0
  282. package/dist/networking/protocols.mjs +57 -0
  283. package/dist/networking/queue.d.mts +12 -0
  284. package/dist/networking/queue.mjs +18 -0
  285. package/dist/networking/route-learning.d.mts +23 -0
  286. package/dist/networking/route-learning.mjs +43 -0
  287. package/dist/networking/routing.d.mts +11 -0
  288. package/dist/networking/routing.mjs +25 -0
  289. package/dist/networking/signals.d.mts +26 -0
  290. package/dist/networking/signals.mjs +35 -0
  291. package/dist/networking/subnet.d.mts +49 -0
  292. package/dist/networking/subnet.mjs +89 -0
  293. package/dist/networking/tcp-reliability.d.mts +24 -0
  294. package/dist/networking/tcp-reliability.mjs +38 -0
  295. package/dist/networking/topology/contract.d.mts +123 -0
  296. package/dist/networking/topology/index.d.mts +4 -0
  297. package/dist/networking/topology/index.mjs +4 -0
  298. package/dist/networking/topology/presets.d.mts +7 -0
  299. package/dist/networking/topology/presets.mjs +302 -0
  300. package/dist/networking/topology/simulation.d.mts +8 -0
  301. package/dist/networking/topology/simulation.mjs +179 -0
  302. package/dist/networking/wireless.d.mts +11 -0
  303. package/dist/networking/wireless.mjs +17 -0
  304. package/dist/optics/imaging.d.mts +218 -0
  305. package/dist/optics/imaging.mjs +276 -0
  306. package/dist/optics/index.d.mts +7 -0
  307. package/dist/optics/index.mjs +8 -0
  308. package/dist/optics/laws.d.mts +70 -0
  309. package/dist/optics/laws.mjs +195 -0
  310. package/dist/optics/prism.d.mts +148 -0
  311. package/dist/optics/prism.mjs +197 -0
  312. package/dist/optics/refraction.d.mts +201 -0
  313. package/dist/optics/refraction.mjs +270 -0
  314. package/dist/optics/wave-optics.d.mts +171 -0
  315. package/dist/optics/wave-optics.mjs +259 -0
  316. package/dist/physics/ac/index.d.mts +183 -0
  317. package/dist/physics/ac/index.mjs +203 -0
  318. package/dist/physics/dynamics/forces.d.mts +98 -0
  319. package/dist/physics/dynamics/forces.mjs +153 -0
  320. package/dist/physics/dynamics/friction.d.mts +76 -0
  321. package/dist/physics/dynamics/friction.mjs +119 -0
  322. package/dist/physics/dynamics/system.d.mts +68 -0
  323. package/dist/physics/dynamics/system.mjs +125 -0
  324. package/dist/physics/electrostatics/index.d.mts +169 -0
  325. package/dist/physics/electrostatics/index.mjs +249 -0
  326. package/dist/physics/energy/centre-of-mass.d.mts +115 -0
  327. package/dist/physics/energy/centre-of-mass.mjs +180 -0
  328. package/dist/physics/energy/conservation.d.mts +81 -0
  329. package/dist/physics/energy/conservation.mjs +129 -0
  330. package/dist/physics/energy/power.d.mts +90 -0
  331. package/dist/physics/energy/power.mjs +167 -0
  332. package/dist/physics/energy/spring.d.mts +73 -0
  333. package/dist/physics/energy/spring.mjs +129 -0
  334. package/dist/physics/energy/store.d.mts +63 -0
  335. package/dist/physics/energy/store.mjs +108 -0
  336. package/dist/physics/energy/theorem.d.mts +65 -0
  337. package/dist/physics/energy/theorem.mjs +113 -0
  338. package/dist/physics/energy/work.d.mts +114 -0
  339. package/dist/physics/energy/work.mjs +219 -0
  340. package/dist/physics/gravitation/body.d.mts +85 -0
  341. package/dist/physics/gravitation/body.mjs +168 -0
  342. package/dist/physics/gravitation/kepler.d.mts +127 -0
  343. package/dist/physics/gravitation/kepler.mjs +216 -0
  344. package/dist/physics/gravitation/law.d.mts +117 -0
  345. package/dist/physics/gravitation/law.mjs +175 -0
  346. package/dist/physics/gravitation/orbit.d.mts +119 -0
  347. package/dist/physics/gravitation/orbit.mjs +202 -0
  348. package/dist/physics/gravitation/potential.d.mts +114 -0
  349. package/dist/physics/gravitation/potential.mjs +202 -0
  350. package/dist/physics/gravitation/variation.d.mts +97 -0
  351. package/dist/physics/gravitation/variation.mjs +175 -0
  352. package/dist/physics/index.d.mts +35 -0
  353. package/dist/physics/index.mjs +36 -0
  354. package/dist/physics/integral-sweep.d.mts +63 -0
  355. package/dist/physics/integral-sweep.mjs +126 -0
  356. package/dist/physics/kinematics/equations.d.mts +47 -0
  357. package/dist/physics/kinematics/equations.mjs +126 -0
  358. package/dist/physics/kinematics/free-fall.d.mts +53 -0
  359. package/dist/physics/kinematics/free-fall.mjs +71 -0
  360. package/dist/physics/kinematics/given.d.mts +16 -0
  361. package/dist/physics/kinematics/given.mjs +55 -0
  362. package/dist/physics/kinematics/roots.d.mts +41 -0
  363. package/dist/physics/kinematics/roots.mjs +72 -0
  364. package/dist/physics/kinematics/solve.d.mts +52 -0
  365. package/dist/physics/kinematics/solve.mjs +172 -0
  366. package/dist/physics/magnetism/biot-savart.d.mts +161 -0
  367. package/dist/physics/magnetism/biot-savart.mjs +353 -0
  368. package/dist/physics/magnetism/flux.d.mts +94 -0
  369. package/dist/physics/magnetism/flux.mjs +313 -0
  370. package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
  371. package/dist/physics/magnetism/geomagnetism.mjs +184 -0
  372. package/dist/physics/magnetism/index.d.mts +12 -0
  373. package/dist/physics/magnetism/index.mjs +74 -0
  374. package/dist/physics/magnetism/lorentz.d.mts +28 -0
  375. package/dist/physics/magnetism/lorentz.mjs +88 -0
  376. package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
  377. package/dist/physics/magnetism/magnetic-force.mjs +169 -0
  378. package/dist/physics/momentum/collide.d.mts +77 -0
  379. package/dist/physics/momentum/collide.mjs +115 -0
  380. package/dist/physics/momentum/impulse.d.mts +89 -0
  381. package/dist/physics/momentum/impulse.mjs +159 -0
  382. package/dist/physics/momentum/planar.d.mts +60 -0
  383. package/dist/physics/momentum/planar.mjs +110 -0
  384. package/dist/physics/projectile.d.mts +107 -0
  385. package/dist/physics/projectile.mjs +185 -0
  386. package/dist/physics/rotation/angular.d.mts +85 -0
  387. package/dist/physics/rotation/angular.mjs +130 -0
  388. package/dist/physics/rotation/circular.d.mts +79 -0
  389. package/dist/physics/rotation/circular.mjs +131 -0
  390. package/dist/physics/rotation/inertia.d.mts +164 -0
  391. package/dist/physics/rotation/inertia.mjs +332 -0
  392. package/dist/physics/rotation/torque.d.mts +65 -0
  393. package/dist/physics/rotation/torque.mjs +134 -0
  394. package/dist/physics/vectors.d.mts +64 -0
  395. package/dist/physics/vectors.mjs +114 -0
  396. package/dist/primitives/Dot.d.mts +2 -15
  397. package/dist/primitives/Dot.mjs +6 -4
  398. package/dist/primitives/Grid.d.mts +33 -17
  399. package/dist/primitives/Grid.mjs +89 -17
  400. package/dist/primitives/Label.d.mts +1 -14
  401. package/dist/primitives/Label.mjs +3 -2
  402. package/dist/primitives/Lines.d.mts +4 -32
  403. package/dist/primitives/Lines.mjs +10 -8
  404. package/dist/primitives/Shapes.d.mts +5 -43
  405. package/dist/primitives/Shapes.mjs +12 -10
  406. package/dist/primitives/index.d.mts +2 -2
  407. package/dist/primitives/index.mjs +2 -2
  408. package/dist/primitives/props.mjs +31 -0
  409. package/dist/quantity/index.d.mts +119 -0
  410. package/dist/quantity/index.mjs +417 -0
  411. package/dist/relation/derive.d.mts +74 -0
  412. package/dist/relation/derive.mjs +73 -0
  413. package/dist/relation/index.d.mts +56 -0
  414. package/dist/relation/index.mjs +234 -0
  415. package/dist/scene/Scene.d.mts +6 -1
  416. package/dist/scene/Scene.mjs +15 -40
  417. package/dist/scene/evaluators.mjs +1 -1
  418. package/dist/sim/thermal.mjs +45 -20
  419. package/dist/thermo/calorimetry.d.mts +207 -0
  420. package/dist/thermo/calorimetry.mjs +345 -0
  421. package/dist/thermo/cycles.d.mts +142 -0
  422. package/dist/thermo/cycles.mjs +256 -0
  423. package/dist/thermo/entropy.d.mts +87 -0
  424. package/dist/thermo/entropy.mjs +140 -0
  425. package/dist/thermo/expansion.d.mts +130 -0
  426. package/dist/thermo/expansion.mjs +178 -0
  427. package/dist/thermo/gas.d.mts +197 -0
  428. package/dist/thermo/gas.mjs +279 -0
  429. package/dist/thermo/heat-transfer.d.mts +164 -0
  430. package/dist/thermo/heat-transfer.mjs +217 -0
  431. package/dist/thermo/index.d.mts +9 -82
  432. package/dist/thermo/index.mjs +9 -132
  433. package/dist/thermo/processes.d.mts +95 -0
  434. package/dist/thermo/processes.mjs +154 -0
  435. package/dist/thermo/temperature.d.mts +174 -0
  436. package/dist/thermo/temperature.mjs +236 -0
  437. package/dist/view/Stage.mjs +4 -11
  438. package/dist/waves/damping.d.mts +224 -0
  439. package/dist/waves/damping.mjs +317 -0
  440. package/dist/waves/doppler.d.mts +72 -0
  441. package/dist/waves/doppler.mjs +125 -0
  442. package/dist/waves/index.d.mts +10 -0
  443. package/dist/waves/index.mjs +10 -0
  444. package/dist/waves/pendulum.d.mts +130 -0
  445. package/dist/waves/pendulum.mjs +211 -0
  446. package/dist/waves/pitch.d.mts +125 -0
  447. package/dist/waves/pitch.mjs +158 -0
  448. package/dist/waves/shm.d.mts +170 -0
  449. package/dist/waves/shm.mjs +279 -0
  450. package/dist/waves/springs.d.mts +103 -0
  451. package/dist/waves/springs.mjs +176 -0
  452. package/dist/waves/superposition.d.mts +124 -0
  453. package/dist/waves/superposition.mjs +196 -0
  454. package/dist/waves/wave.d.mts +154 -0
  455. package/dist/waves/wave.mjs +178 -0
  456. package/package.json +103 -23
  457. package/styles.css +125 -8
  458. package/dist/assets/kit/index.mjs +0 -4
@@ -0,0 +1,18 @@
1
+ //#region src/networking/queue.ts
2
+ function queueAtTime(arrivalPps, servicePps, bufferPackets, elapsedSeconds) {
3
+ const accumulated = Math.max(0, arrivalPps - servicePps) * Math.max(0, elapsedSeconds);
4
+ const queued = Math.min(Math.max(0, bufferPackets), accumulated);
5
+ const dropped = Math.max(0, accumulated - Math.max(0, bufferPackets));
6
+ return {
7
+ queued,
8
+ dropped,
9
+ delayMs: servicePps > 0 ? Math.round(queued / servicePps * 1e3) : 0,
10
+ state: dropped > 0 ? "dropping" : queued > 0 ? "building" : "clear"
11
+ };
12
+ }
13
+ function bottleneckQueue(arrivalPps, servicePps, bufferPackets) {
14
+ return queueAtTime(arrivalPps, servicePps, bufferPackets, 2);
15
+ }
16
+
17
+ //#endregion
18
+ export { bottleneckQueue, queueAtTime };
@@ -0,0 +1,23 @@
1
+ //#region src/networking/route-learning.d.ts
2
+ interface OspfLink {
3
+ from: string;
4
+ to: string;
5
+ cost: number;
6
+ }
7
+ interface LearnedRoute {
8
+ path: readonly string[];
9
+ metric: number;
10
+ reason: string;
11
+ }
12
+ declare function learnOspfRoute(source: string, destination: string, links: readonly OspfLink[]): LearnedRoute | null;
13
+ interface BgpCandidate {
14
+ id: string;
15
+ asPath: readonly number[];
16
+ localPreference: number;
17
+ allowed: boolean;
18
+ }
19
+ declare function selectBgpRoute(candidates: readonly BgpCandidate[]): (BgpCandidate & {
20
+ reason: string;
21
+ }) | null;
22
+ //#endregion
23
+ export { BgpCandidate, LearnedRoute, OspfLink, learnOspfRoute, selectBgpRoute };
@@ -0,0 +1,43 @@
1
+ //#region src/networking/route-learning.ts
2
+ function learnOspfRoute(source, destination, links) {
3
+ const nodes = new Set(links.flatMap((link) => [link.from, link.to]));
4
+ if (!nodes.has(source) || !nodes.has(destination)) return null;
5
+ const distance = new Map([[source, 0]]);
6
+ const previous = /* @__PURE__ */ new Map();
7
+ const unvisited = new Set(nodes);
8
+ while (unvisited.size > 0) {
9
+ const current = [...unvisited].sort((a, b) => (distance.get(a) ?? Infinity) - (distance.get(b) ?? Infinity) || a.localeCompare(b))[0];
10
+ unvisited.delete(current);
11
+ if (current === destination) break;
12
+ const currentDistance = distance.get(current);
13
+ if (currentDistance == null) break;
14
+ for (const link of links.filter((item) => item.from === current || item.to === current)) {
15
+ const neighbor = link.from === current ? link.to : link.from;
16
+ if (!unvisited.has(neighbor)) continue;
17
+ const candidate = currentDistance + Math.max(1, link.cost);
18
+ if (candidate < (distance.get(neighbor) ?? Infinity)) {
19
+ distance.set(neighbor, candidate);
20
+ previous.set(neighbor, current);
21
+ }
22
+ }
23
+ }
24
+ const metric = distance.get(destination);
25
+ if (metric == null) return null;
26
+ const path = [destination];
27
+ while (path[0] !== source) path.unshift(previous.get(path[0]));
28
+ return {
29
+ path,
30
+ metric,
31
+ reason: `Lowest accumulated link cost: ${metric}.`
32
+ };
33
+ }
34
+ function selectBgpRoute(candidates) {
35
+ const selected = candidates.filter((candidate) => candidate.allowed).sort((a, b) => b.localPreference - a.localPreference || a.asPath.length - b.asPath.length || a.id.localeCompare(b.id))[0];
36
+ return selected ? {
37
+ ...selected,
38
+ reason: "Policy preference wins first; AS-path length breaks the tie."
39
+ } : null;
40
+ }
41
+
42
+ //#endregion
43
+ export { learnOspfRoute, selectBgpRoute };
@@ -0,0 +1,11 @@
1
+ import { NetworkRoute } from "./topology/contract.mjs";
2
+
3
+ //#region src/networking/routing.d.ts
4
+ declare function parseCidr(cidr: string): {
5
+ network: number;
6
+ prefix: number;
7
+ } | undefined;
8
+ declare function cidrContains(cidr: string, ip: string): boolean;
9
+ declare function longestPrefixMatch(routes: readonly NetworkRoute[], destinationIp: string): NetworkRoute | undefined;
10
+ //#endregion
11
+ export { cidrContains, longestPrefixMatch, parseCidr };
@@ -0,0 +1,25 @@
1
+ import { ipv4ToInt } from "./subnet.mjs";
2
+
3
+ //#region src/networking/routing.ts
4
+ function parseCidr(cidr) {
5
+ const [ip, rawPrefix] = cidr.split("/");
6
+ const value = ipv4ToInt(ip ?? "");
7
+ const prefix = Number(rawPrefix);
8
+ if (value == null || !Number.isInteger(prefix) || prefix < 0 || prefix > 32) return void 0;
9
+ return {
10
+ network: value & (prefix === 0 ? 0 : 4294967295 << 32 - prefix >>> 0),
11
+ prefix
12
+ };
13
+ }
14
+ function cidrContains(cidr, ip) {
15
+ const parsed = parseCidr(cidr);
16
+ const value = ipv4ToInt(ip);
17
+ if (!parsed || value == null) return false;
18
+ return (value & (parsed.prefix === 0 ? 0 : 4294967295 << 32 - parsed.prefix >>> 0)) === parsed.network;
19
+ }
20
+ function longestPrefixMatch(routes, destinationIp) {
21
+ return routes.filter((route) => cidrContains(route.prefix, destinationIp)).sort((left, right) => (parseCidr(right.prefix)?.prefix ?? -1) - (parseCidr(left.prefix)?.prefix ?? -1) || (left.metric ?? 0) - (right.metric ?? 0))[0];
22
+ }
23
+
24
+ //#endregion
25
+ export { cidrContains, longestPrefixMatch, parseCidr };
@@ -0,0 +1,26 @@
1
+ //#region src/networking/signals.d.ts
2
+ type ModulationScheme = "ask" | "bpsk";
3
+ interface ModulationResult {
4
+ readonly bits: string;
5
+ readonly recovered: string;
6
+ readonly errors: number;
7
+ readonly symbols: readonly {
8
+ bit: "0" | "1";
9
+ amplitude: number;
10
+ phase: number;
11
+ }[];
12
+ }
13
+ declare function modulate(bits: string, scheme: ModulationScheme, noisePercent: number): ModulationResult;
14
+ type MediaKind = "voice" | "video";
15
+ type MediaQuality = "efficient" | "detailed";
16
+ interface EncodingResult {
17
+ readonly bitrateKbps: number;
18
+ readonly units: number;
19
+ readonly packets: number;
20
+ readonly received: number;
21
+ readonly lost: number;
22
+ readonly fidelity: number;
23
+ }
24
+ declare function encodeMedia(kind: MediaKind, quality: MediaQuality, lossPercent: number): EncodingResult;
25
+ //#endregion
26
+ export { EncodingResult, MediaKind, MediaQuality, ModulationResult, ModulationScheme, encodeMedia, modulate };
@@ -0,0 +1,35 @@
1
+ //#region src/networking/signals.ts
2
+ function modulate(bits, scheme, noisePercent) {
3
+ const clean = bits.replace(/[^01]/g, "").slice(0, 8) || "0";
4
+ const errorBudget = noisePercent < 20 ? 0 : noisePercent < 35 ? 1 : Math.min(2, clean.length);
5
+ const errorIndexes = new Set(Array.from({ length: errorBudget }, (_, index) => clean.length - 1 - index * 2));
6
+ return {
7
+ bits: clean,
8
+ recovered: [...clean].map((bit, index) => errorIndexes.has(index) ? bit === "1" ? "0" : "1" : bit).join(""),
9
+ errors: errorBudget,
10
+ symbols: [...clean].map((bit) => ({
11
+ bit,
12
+ amplitude: scheme === "ask" ? bit === "1" ? 1 : .35 : 1,
13
+ phase: scheme === "bpsk" && bit === "0" ? Math.PI : 0
14
+ }))
15
+ };
16
+ }
17
+ function encodeMedia(kind, quality, lossPercent) {
18
+ const detailed = quality === "detailed";
19
+ const bitrateKbps = kind === "voice" ? detailed ? 64 : 16 : detailed ? 2500 : 500;
20
+ const units = kind === "voice" ? detailed ? 16 : 8 : detailed ? 12 : 6;
21
+ const packets = kind === "voice" ? 8 : 12;
22
+ const lost = Math.min(packets, Math.round(packets * Math.max(0, lossPercent) / 100));
23
+ const received = packets - lost;
24
+ return {
25
+ bitrateKbps,
26
+ units,
27
+ packets,
28
+ received,
29
+ lost,
30
+ fidelity: Math.max(0, Math.round(received / packets * (detailed ? 100 : 78)))
31
+ };
32
+ }
33
+
34
+ //#endregion
35
+ export { encodeMedia, modulate };
@@ -0,0 +1,49 @@
1
+ //#region src/networking/subnet.d.ts
2
+ /**
3
+ * Subnetting, reduced to the one question it actually answers.
4
+ *
5
+ * "Are these two addresses on the same network?" is the whole of it, and the answer is mechanical:
6
+ * compare the first `prefix` bits. Same, and the two can talk directly. Different, and everything
7
+ * has to go through a router. Every other subnetting fact (mask, network address, broadcast, usable
8
+ * count) falls out of where that boundary sits.
9
+ *
10
+ * Students drown here because it is taught in dotted decimal, where the boundary is invisible. In
11
+ * binary it is a vertical line, and the moment it crosses the first differing bit the answer flips.
12
+ * That is the thing to show.
13
+ */
14
+ declare function ipv4ToInt(ip: string): number | undefined;
15
+ declare const intToIpv4: (value: number) => string;
16
+ /** The mask for a prefix, as a 32-bit unsigned value. /0 is all zeros. */
17
+ declare const maskFor: (prefix: number) => number;
18
+ interface Bit {
19
+ value: 0 | 1;
20
+ /** True while this bit is inside the network portion. */
21
+ network: boolean;
22
+ }
23
+ /** The 32 bits of an address, flagged by which side of the prefix boundary they fall. */
24
+ declare function bitsOf(address: string, prefix: number): Bit[] | null;
25
+ interface SubnetInfo {
26
+ address: string;
27
+ prefix: number;
28
+ mask: string;
29
+ network: string;
30
+ broadcast: string;
31
+ firstUsable: string | null;
32
+ lastUsable: string | null;
33
+ /** Addresses that can be given to a device. Excludes network and broadcast. */
34
+ usableHosts: number;
35
+ bits: Bit[];
36
+ }
37
+ declare function describe(address: string, prefix: number): SubnetInfo | null;
38
+ /** Do two addresses share a network under this prefix? */
39
+ declare function sameNetwork(a: string, b: string, prefix: number): boolean | null;
40
+ /**
41
+ * The index (0-based from the left) of the first bit where two addresses differ, or -1 when they
42
+ * are identical. This is the number the whole lab turns on: any prefix at or below it puts the two
43
+ * on the same network, and any prefix above it separates them.
44
+ */
45
+ declare function firstDifferingBit(a: string, b: string): number;
46
+ /** The largest prefix that still keeps both addresses together. */
47
+ declare function widestSharedPrefix(a: string, b: string): number;
48
+ //#endregion
49
+ export { Bit, SubnetInfo, bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix };
@@ -0,0 +1,89 @@
1
+ //#region src/networking/subnet.ts
2
+ /**
3
+ * Subnetting, reduced to the one question it actually answers.
4
+ *
5
+ * "Are these two addresses on the same network?" is the whole of it, and the answer is mechanical:
6
+ * compare the first `prefix` bits. Same, and the two can talk directly. Different, and everything
7
+ * has to go through a router. Every other subnetting fact (mask, network address, broadcast, usable
8
+ * count) falls out of where that boundary sits.
9
+ *
10
+ * Students drown here because it is taught in dotted decimal, where the boundary is invisible. In
11
+ * binary it is a vertical line, and the moment it crosses the first differing bit the answer flips.
12
+ * That is the thing to show.
13
+ */
14
+ function ipv4ToInt(ip) {
15
+ const parts = ip.split(".");
16
+ if (parts.length !== 4) return void 0;
17
+ const nums = parts.map(Number);
18
+ if (nums.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return void 0;
19
+ return nums.reduce((acc, n) => acc * 256 + n >>> 0, 0);
20
+ }
21
+ const intToIpv4 = (value) => [
22
+ 24,
23
+ 16,
24
+ 8,
25
+ 0
26
+ ].map((shift) => value >>> shift & 255).join(".");
27
+ /** The mask for a prefix, as a 32-bit unsigned value. /0 is all zeros. */
28
+ const maskFor = (prefix) => prefix <= 0 ? 0 : prefix >= 32 ? 4294967295 : 4294967295 << 32 - prefix >>> 0;
29
+ /** The 32 bits of an address, flagged by which side of the prefix boundary they fall. */
30
+ function bitsOf(address, prefix) {
31
+ const value = ipv4ToInt(address);
32
+ if (value == null) return null;
33
+ return Array.from({ length: 32 }, (_, index) => ({
34
+ value: value >>> 31 - index & 1,
35
+ network: index < prefix
36
+ }));
37
+ }
38
+ function describe(address, prefix) {
39
+ const value = ipv4ToInt(address);
40
+ const bits = bitsOf(address, prefix);
41
+ if (value == null || !bits || prefix < 0 || prefix > 32) return null;
42
+ const mask = maskFor(prefix);
43
+ const network = (value & mask) >>> 0;
44
+ const broadcast = (network | ~mask >>> 0) >>> 0;
45
+ const total = 2 ** (32 - prefix);
46
+ const usableHosts = total > 2 ? total - 2 : 0;
47
+ return {
48
+ address,
49
+ prefix,
50
+ mask: intToIpv4(mask),
51
+ network: intToIpv4(network),
52
+ broadcast: intToIpv4(broadcast),
53
+ firstUsable: usableHosts ? intToIpv4(network + 1) : null,
54
+ lastUsable: usableHosts ? intToIpv4(broadcast - 1) : null,
55
+ usableHosts,
56
+ bits
57
+ };
58
+ }
59
+ /** Do two addresses share a network under this prefix? */
60
+ function sameNetwork(a, b, prefix) {
61
+ const left = ipv4ToInt(a);
62
+ const right = ipv4ToInt(b);
63
+ if (left == null || right == null) return null;
64
+ const mask = maskFor(prefix);
65
+ return (left & mask) >>> 0 === (right & mask) >>> 0;
66
+ }
67
+ /**
68
+ * The index (0-based from the left) of the first bit where two addresses differ, or -1 when they
69
+ * are identical. This is the number the whole lab turns on: any prefix at or below it puts the two
70
+ * on the same network, and any prefix above it separates them.
71
+ */
72
+ function firstDifferingBit(a, b) {
73
+ const left = ipv4ToInt(a);
74
+ const right = ipv4ToInt(b);
75
+ if (left == null || right == null) return -1;
76
+ for (let index = 0; index < 32; index++) {
77
+ const shift = 31 - index;
78
+ if ((left >>> shift & 1) !== (right >>> shift & 1)) return index;
79
+ }
80
+ return -1;
81
+ }
82
+ /** The largest prefix that still keeps both addresses together. */
83
+ function widestSharedPrefix(a, b) {
84
+ const differing = firstDifferingBit(a, b);
85
+ return differing === -1 ? 32 : differing;
86
+ }
87
+
88
+ //#endregion
89
+ export { bitsOf, describe, firstDifferingBit, intToIpv4, ipv4ToInt, maskFor, sameNetwork, widestSharedPrefix };
@@ -0,0 +1,24 @@
1
+ //#region src/networking/tcp-reliability.d.ts
2
+ type TcpFeedback = "ack" | "triple-duplicate-ack" | "timeout";
3
+ interface TcpSenderOptions {
4
+ congestionWindow: number;
5
+ receiverWindow: number;
6
+ slowStartThreshold: number;
7
+ feedback: TcpFeedback;
8
+ }
9
+ interface TcpSenderResult {
10
+ sendWindow: number;
11
+ nextCongestionWindow: number;
12
+ nextSlowStartThreshold: number;
13
+ phase: "slow-start" | "congestion-avoidance" | "fast-recovery" | "timeout-recovery";
14
+ retransmit: boolean;
15
+ reason: string;
16
+ }
17
+ declare function advanceTcpSender({
18
+ congestionWindow,
19
+ receiverWindow,
20
+ slowStartThreshold,
21
+ feedback
22
+ }: TcpSenderOptions): TcpSenderResult;
23
+ //#endregion
24
+ export { TcpFeedback, TcpSenderOptions, TcpSenderResult, advanceTcpSender };
@@ -0,0 +1,38 @@
1
+ //#region src/networking/tcp-reliability.ts
2
+ function advanceTcpSender({ congestionWindow, receiverWindow, slowStartThreshold, feedback }) {
3
+ const cwnd = Math.max(1, Math.floor(congestionWindow));
4
+ const rwnd = Math.max(0, Math.floor(receiverWindow));
5
+ const threshold = Math.max(2, Math.floor(slowStartThreshold));
6
+ const sendWindow = Math.min(cwnd, rwnd);
7
+ if (feedback === "timeout") return {
8
+ sendWindow,
9
+ nextCongestionWindow: 1,
10
+ nextSlowStartThreshold: Math.max(2, Math.floor(cwnd / 2)),
11
+ phase: "timeout-recovery",
12
+ retransmit: true,
13
+ reason: "A timeout is strong congestion evidence: retransmit and restart cautiously."
14
+ };
15
+ if (feedback === "triple-duplicate-ack") {
16
+ const halved = Math.max(2, Math.floor(cwnd / 2));
17
+ return {
18
+ sendWindow,
19
+ nextCongestionWindow: halved,
20
+ nextSlowStartThreshold: halved,
21
+ phase: "fast-recovery",
22
+ retransmit: true,
23
+ reason: "Duplicate acknowledgements identify a gap while later data is still arriving."
24
+ };
25
+ }
26
+ const slowStart = cwnd < threshold;
27
+ return {
28
+ sendWindow,
29
+ nextCongestionWindow: slowStart ? cwnd * 2 : cwnd + 1,
30
+ nextSlowStartThreshold: threshold,
31
+ phase: slowStart ? "slow-start" : "congestion-avoidance",
32
+ retransmit: false,
33
+ reason: slowStart ? "Acknowledgements rapidly grow the congestion window." : "Acknowledgements grow the window cautiously after the threshold."
34
+ };
35
+ }
36
+
37
+ //#endregion
38
+ export { advanceTcpSender };
@@ -0,0 +1,123 @@
1
+ //#region src/networking/topology/contract.d.ts
2
+ type NetworkDeviceKind = "client" | "server" | "switch" | "router" | "access-point" | "firewall" | "load-balancer" | "dns" | "broker" | "cloud";
3
+ interface NetworkInterface {
4
+ id: string;
5
+ label?: string;
6
+ mac?: string;
7
+ addresses?: string[];
8
+ }
9
+ interface NetworkDevice {
10
+ id: string;
11
+ kind: NetworkDeviceKind;
12
+ label: string;
13
+ at: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ interfaces: NetworkInterface[];
18
+ services?: {
19
+ kind: "dhcp" | "dns" | "http" | "https" | "ftp" | "websocket";
20
+ port?: number;
21
+ label?: string;
22
+ }[];
23
+ }
24
+ interface NetworkEndpoint {
25
+ deviceId: string;
26
+ interfaceId: string;
27
+ }
28
+ interface NetworkLink {
29
+ id: string;
30
+ a: NetworkEndpoint;
31
+ b: NetworkEndpoint;
32
+ label?: string;
33
+ cost?: number;
34
+ latencyMs?: number;
35
+ bandwidthMbps?: number;
36
+ loss?: number;
37
+ mtu?: number;
38
+ state?: "up" | "down";
39
+ }
40
+ interface NetworkRoute {
41
+ id: string;
42
+ deviceId: string;
43
+ prefix: string;
44
+ via?: string;
45
+ interfaceId: string;
46
+ metric?: number;
47
+ }
48
+ interface NetworkDoc {
49
+ schemaVersion: 1;
50
+ type: "network";
51
+ devices: NetworkDevice[];
52
+ links: NetworkLink[];
53
+ routes?: NetworkRoute[];
54
+ title?: string;
55
+ }
56
+ type PacketLayerKind = "application" | "transport" | "network" | "data-link" | "physical";
57
+ interface PacketLayer {
58
+ kind: PacketLayerKind;
59
+ protocol: string;
60
+ summary: string;
61
+ fields?: Record<string, string | number>;
62
+ }
63
+ interface NetworkPacket {
64
+ id: string;
65
+ from: string;
66
+ to: string;
67
+ bytes: number;
68
+ layers: PacketLayer[];
69
+ }
70
+ type NetworkEvent = {
71
+ type: "packet-created";
72
+ at: string;
73
+ packet: NetworkPacket;
74
+ message: string;
75
+ } | {
76
+ type: "arp-requested";
77
+ at: string;
78
+ target: string;
79
+ message: string;
80
+ } | {
81
+ type: "arp-resolved";
82
+ at: string;
83
+ target: string;
84
+ message: string;
85
+ } | {
86
+ type: "route-selected";
87
+ at: string;
88
+ next: string;
89
+ prefix?: string;
90
+ message: string;
91
+ } | {
92
+ type: "frame-sent";
93
+ at: string;
94
+ linkId: string;
95
+ next: string;
96
+ packet: NetworkPacket;
97
+ message: string;
98
+ } | {
99
+ type: "frame-received";
100
+ at: string;
101
+ linkId: string;
102
+ from: string;
103
+ packet: NetworkPacket;
104
+ message: string;
105
+ } | {
106
+ type: "packet-dropped";
107
+ at: string;
108
+ reason: "unreachable" | "link-down" | "loss" | "mtu";
109
+ message: string;
110
+ } | {
111
+ type: "packet-delivered";
112
+ at: string;
113
+ packet: NetworkPacket;
114
+ message: string;
115
+ };
116
+ interface NetworkTrace {
117
+ delivered: boolean;
118
+ path: string[];
119
+ totalLatencyMs: number;
120
+ events: NetworkEvent[];
121
+ }
122
+ //#endregion
123
+ export { NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind };
@@ -0,0 +1,4 @@
1
+ import { NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind } from "./contract.mjs";
2
+ import { COMPANY_NETWORK, HOME_NETWORK } from "./presets.mjs";
3
+ import { createPacket, simulatePacket } from "./simulation.mjs";
4
+ export { COMPANY_NETWORK, HOME_NETWORK, NetworkDevice, NetworkDeviceKind, NetworkDoc, NetworkEndpoint, NetworkEvent, NetworkInterface, NetworkLink, NetworkPacket, NetworkRoute, NetworkTrace, PacketLayer, PacketLayerKind, createPacket, simulatePacket };
@@ -0,0 +1,4 @@
1
+ import { COMPANY_NETWORK, HOME_NETWORK } from "./presets.mjs";
2
+ import { createPacket, simulatePacket } from "./simulation.mjs";
3
+
4
+ export { COMPANY_NETWORK, HOME_NETWORK, createPacket, simulatePacket };
@@ -0,0 +1,7 @@
1
+ import { NetworkDoc } from "./contract.mjs";
2
+
3
+ //#region src/networking/topology/presets.d.ts
4
+ declare const HOME_NETWORK: NetworkDoc;
5
+ declare const COMPANY_NETWORK: NetworkDoc;
6
+ //#endregion
7
+ export { COMPANY_NETWORK, HOME_NETWORK };