@holoscript/std 2.1.0 → 6.0.3

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 (159) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +197 -0
  4. package/dist/__tests__/EconomicPrimitives.test.d.ts +2 -0
  5. package/dist/__tests__/EconomicPrimitives.test.d.ts.map +1 -0
  6. package/dist/__tests__/EconomicTraits.test.d.ts +2 -0
  7. package/dist/__tests__/EconomicTraits.test.d.ts.map +1 -0
  8. package/dist/__tests__/SimulationLabPrimitives.test.d.ts +2 -0
  9. package/dist/__tests__/SimulationLabPrimitives.test.d.ts.map +1 -0
  10. package/dist/__tests__/collections.test.d.ts +2 -0
  11. package/dist/__tests__/collections.test.d.ts.map +1 -0
  12. package/dist/__tests__/events.test.d.ts +2 -0
  13. package/dist/__tests__/events.test.d.ts.map +1 -0
  14. package/dist/__tests__/index.test.d.ts +2 -0
  15. package/dist/__tests__/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/materials.test.d.ts +2 -0
  17. package/dist/__tests__/materials.test.d.ts.map +1 -0
  18. package/dist/__tests__/math.test.d.ts +2 -0
  19. package/dist/__tests__/math.test.d.ts.map +1 -0
  20. package/dist/__tests__/physics.test.d.ts +2 -0
  21. package/dist/__tests__/physics.test.d.ts.map +1 -0
  22. package/dist/__tests__/spatial.test.d.ts +2 -0
  23. package/dist/__tests__/spatial.test.d.ts.map +1 -0
  24. package/dist/__tests__/standard-library-fundamentals.test.d.ts +2 -0
  25. package/dist/__tests__/standard-library-fundamentals.test.d.ts.map +1 -0
  26. package/dist/__tests__/string-and-time-utilities.test.d.ts +2 -0
  27. package/dist/__tests__/string-and-time-utilities.test.d.ts.map +1 -0
  28. package/dist/__tests__/string-decoupled.test.d.ts +2 -0
  29. package/dist/__tests__/string-decoupled.test.d.ts.map +1 -0
  30. package/dist/__tests__/string.test.d.ts +2 -0
  31. package/dist/__tests__/string.test.d.ts.map +1 -0
  32. package/dist/__tests__/time.test.d.ts +2 -0
  33. package/dist/__tests__/time.test.d.ts.map +1 -0
  34. package/dist/chunk-7HVUYGPS.js +679 -0
  35. package/dist/chunk-7HVUYGPS.js.map +1 -0
  36. package/dist/chunk-P4O3WNG2.js +287 -0
  37. package/dist/chunk-P4O3WNG2.js.map +1 -0
  38. package/dist/chunk-PFX2JM4X.js +683 -0
  39. package/dist/chunk-PFX2JM4X.js.map +1 -0
  40. package/dist/chunk-W2Q3LUCM.js +348 -0
  41. package/dist/chunk-W2Q3LUCM.js.map +1 -0
  42. package/dist/chunk-WS6W35YC.js +443 -0
  43. package/dist/chunk-WS6W35YC.js.map +1 -0
  44. package/dist/chunk-ZXVZAQCZ.js +470 -0
  45. package/dist/chunk-ZXVZAQCZ.js.map +1 -0
  46. package/dist/collections.cjs +715 -0
  47. package/dist/collections.cjs.map +1 -0
  48. package/dist/collections.d.ts.map +1 -1
  49. package/dist/collections.js +16 -719
  50. package/dist/collections.js.map +1 -1
  51. package/dist/events.d.ts +32 -0
  52. package/dist/events.d.ts.map +1 -0
  53. package/dist/index.cjs +4101 -0
  54. package/dist/index.cjs.map +1 -0
  55. package/dist/index.d.ts +21 -9
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1270 -157
  58. package/dist/index.js.map +1 -1
  59. package/dist/materials.d.ts +50 -0
  60. package/dist/materials.d.ts.map +1 -0
  61. package/dist/math.cjs +591 -0
  62. package/dist/math.cjs.map +1 -0
  63. package/dist/math.d.ts.map +1 -1
  64. package/dist/math.js +51 -537
  65. package/dist/math.js.map +1 -1
  66. package/dist/physics.d.ts +59 -0
  67. package/dist/physics.d.ts.map +1 -0
  68. package/dist/spatial.d.ts +82 -0
  69. package/dist/spatial.d.ts.map +1 -0
  70. package/dist/string.basic.test.d.ts +5 -0
  71. package/dist/string.basic.test.d.ts.map +1 -0
  72. package/dist/string.cjs +422 -0
  73. package/dist/string.cjs.map +1 -0
  74. package/dist/string.d.ts +5 -1
  75. package/dist/string.d.ts.map +1 -1
  76. package/dist/string.js +106 -442
  77. package/dist/string.js.map +1 -1
  78. package/dist/string.test.d.ts +5 -0
  79. package/dist/string.test.d.ts.map +1 -0
  80. package/dist/time.cjs +512 -0
  81. package/dist/time.cjs.map +1 -0
  82. package/dist/time.d.ts.map +1 -1
  83. package/dist/time.js +41 -528
  84. package/dist/time.js.map +1 -1
  85. package/dist/traits/ARTraits.d.ts +14 -0
  86. package/dist/traits/ARTraits.d.ts.map +1 -0
  87. package/dist/traits/EconomicPrimitives.cjs +335 -0
  88. package/dist/traits/EconomicPrimitives.cjs.map +1 -0
  89. package/dist/traits/EconomicPrimitives.d.ts +345 -0
  90. package/dist/traits/EconomicPrimitives.d.ts.map +1 -0
  91. package/dist/traits/EconomicPrimitives.js +55 -0
  92. package/dist/traits/EconomicPrimitives.js.map +1 -0
  93. package/dist/traits/EconomicTraits.cjs +471 -0
  94. package/dist/traits/EconomicTraits.cjs.map +1 -0
  95. package/dist/traits/EconomicTraits.d.ts +71 -0
  96. package/dist/traits/EconomicTraits.d.ts.map +1 -0
  97. package/dist/traits/EconomicTraits.js +17 -0
  98. package/dist/traits/EconomicTraits.js.map +1 -0
  99. package/dist/traits/IoTTraits.d.ts +14 -0
  100. package/dist/traits/IoTTraits.d.ts.map +1 -0
  101. package/dist/traits/SimulationLabPrimitives.d.ts +187 -0
  102. package/dist/traits/SimulationLabPrimitives.d.ts.map +1 -0
  103. package/dist/traits/SimulationLabTraits.d.ts +42 -0
  104. package/dist/traits/SimulationLabTraits.d.ts.map +1 -0
  105. package/dist/traits/VRRTraits.d.ts +150 -0
  106. package/dist/traits/VRRTraits.d.ts.map +1 -0
  107. package/dist/traits/__tests__/ARTraits.test.d.ts +2 -0
  108. package/dist/traits/__tests__/ARTraits.test.d.ts.map +1 -0
  109. package/dist/traits/__tests__/EconomicPrimitives.test.d.ts +2 -0
  110. package/dist/traits/__tests__/EconomicPrimitives.test.d.ts.map +1 -0
  111. package/dist/traits/__tests__/EconomicTraits.test.d.ts +2 -0
  112. package/dist/traits/__tests__/EconomicTraits.test.d.ts.map +1 -0
  113. package/dist/types.d.ts +9 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/error-utf8.log +6 -0
  116. package/error.log +0 -0
  117. package/package.json +42 -19
  118. package/src/__tests__/EconomicPrimitives.test.ts +690 -0
  119. package/src/__tests__/EconomicTraits.test.ts +425 -0
  120. package/src/__tests__/SimulationLabPrimitives.test.ts +415 -0
  121. package/src/__tests__/collections.test.ts +182 -0
  122. package/src/__tests__/events.test.ts +135 -0
  123. package/src/__tests__/index.test.ts +14 -0
  124. package/src/__tests__/materials.test.ts +84 -0
  125. package/src/__tests__/math.test.ts +246 -0
  126. package/src/__tests__/physics.test.ts +83 -0
  127. package/src/__tests__/spatial.test.ts +333 -0
  128. package/src/__tests__/standard-library-fundamentals.test.ts +1301 -0
  129. package/src/__tests__/string-and-time-utilities.test.ts +1070 -0
  130. package/src/__tests__/string-decoupled.test.ts +14 -0
  131. package/src/__tests__/string.test.ts +164 -0
  132. package/src/__tests__/time.test.ts +110 -0
  133. package/src/collections.ts +8 -2
  134. package/src/events.ts +88 -0
  135. package/src/index.ts +161 -11
  136. package/src/materials.ts +109 -0
  137. package/src/math.ts +30 -14
  138. package/src/physics.ts +141 -0
  139. package/src/spatial.ts +320 -0
  140. package/src/string.basic.test.ts +14 -0
  141. package/src/string.test.ts +335 -0
  142. package/src/string.ts +45 -13
  143. package/src/time.ts +10 -11
  144. package/src/traits/ARTraits.ts +103 -0
  145. package/src/traits/EconomicPrimitives.ts +755 -0
  146. package/src/traits/EconomicTraits.ts +552 -0
  147. package/src/traits/IoTTraits.ts +102 -0
  148. package/src/traits/SimulationLabPrimitives.ts +650 -0
  149. package/src/traits/SimulationLabTraits.ts +191 -0
  150. package/src/traits/VRRTraits.ts +326 -0
  151. package/src/traits/__tests__/ARTraits.test.ts +14 -0
  152. package/src/traits/__tests__/EconomicPrimitives.test.ts +14 -0
  153. package/src/traits/__tests__/EconomicTraits.test.ts +14 -0
  154. package/src/types.ts +47 -12
  155. package/std_error.log +5 -0
  156. package/tsup.config.ts +17 -0
  157. package/vitest.config.ts +10 -0
  158. package/dist/types.js +0 -198
  159. package/dist/types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/math.ts"],"sourcesContent":["/**\n * Core Types for HoloScript\n *\n * Fundamental spatial and graphical types used throughout the language.\n */\n\n// =============================================================================\n// VECTOR TYPES\n// =============================================================================\n\n/**\n * 2D Vector\n */\nexport interface Vec2 {\n x: number;\n y: number;\n}\n\n/**\n * 3D Vector - The fundamental spatial type\n */\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\n/**\n * 4D Vector\n */\nexport interface Vec4 {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\n// Array representations\nexport type Vec2Array = [number, number];\nexport type Vec3Array = [number, number, number];\nexport type Vec4Array = [number, number, number, number];\n\n// =============================================================================\n// QUATERNION\n// =============================================================================\n\n/**\n * Quaternion for rotation representation\n */\nexport interface Quat {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\nexport type QuatArray = [number, number, number, number];\n\n// =============================================================================\n// TRANSFORM\n// =============================================================================\n\n/**\n * Complete 3D transform\n */\nexport interface Transform {\n position: Vec3;\n rotation: Quat;\n scale: Vec3;\n}\n\n/**\n * Euler angles (in degrees)\n */\nexport interface EulerAngles {\n x: number; // pitch\n y: number; // yaw\n z: number; // roll\n}\n\n// =============================================================================\n// COLOR\n// =============================================================================\n\n/**\n * RGB Color (0-1 range)\n */\nexport interface ColorRGB {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * RGBA Color (0-1 range)\n */\nexport interface ColorRGBA extends ColorRGB {\n a: number;\n}\n\n/**\n * HSL Color\n */\nexport interface ColorHSL {\n h: number; // 0-360\n s: number; // 0-1\n l: number; // 0-1\n}\n\n/**\n * Color can be represented multiple ways\n */\nexport type Color = string | ColorRGB | ColorRGBA | ColorHSL | number;\n\n// =============================================================================\n// BOUNDS\n// =============================================================================\n\n/**\n * Axis-Aligned Bounding Box\n */\nexport interface AABB {\n min: Vec3;\n max: Vec3;\n}\n\n/**\n * Bounding Sphere\n */\nexport interface BoundingSphere {\n center: Vec3;\n radius: number;\n}\n\n// =============================================================================\n// RAY\n// =============================================================================\n\n/**\n * Ray for raycasting\n */\nexport interface Ray {\n origin: Vec3;\n direction: Vec3;\n}\n\n/**\n * Raycast hit result\n */\nexport interface RaycastHit {\n point: Vec3;\n normal: Vec3;\n distance: number;\n objectId?: string;\n}\n\n// =============================================================================\n// UTILITY TYPES\n// =============================================================================\n\n/**\n * Nullable type helper\n */\nexport type Nullable<T> = T | null;\n\n/**\n * Optional type helper\n */\nexport type Optional<T> = T | undefined;\n\n/**\n * Deep partial type\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n// =============================================================================\n// FACTORY FUNCTIONS\n// =============================================================================\n\n/**\n * Create a Vec2\n */\nexport function vec2(x: number = 0, y: number = 0): Vec2 {\n return { x, y };\n}\n\n/**\n * Create a Vec3\n */\nexport function vec3(x: number = 0, y: number = 0, z: number = 0): Vec3 {\n return { x, y, z };\n}\n\n/**\n * Create a Vec4\n */\nexport function vec4(x: number = 0, y: number = 0, z: number = 0, w: number = 0): Vec4 {\n return { x, y, z, w };\n}\n\n/**\n * Create a Quaternion (identity by default)\n */\nexport function quat(x: number = 0, y: number = 0, z: number = 0, w: number = 1): Quat {\n return { x, y, z, w };\n}\n\n/**\n * Create a Transform\n */\nexport function transform(\n position: Vec3 = vec3(),\n rotation: Quat = quat(),\n scale: Vec3 = vec3(1, 1, 1)\n): Transform {\n return { position, rotation, scale };\n}\n\n/**\n * Create an RGB color\n */\nexport function rgb(r: number, g: number, b: number): ColorRGB {\n return { r, g, b };\n}\n\n/**\n * Create an RGBA color\n */\nexport function rgba(r: number, g: number, b: number, a: number = 1): ColorRGBA {\n return { r, g, b, a };\n}\n\n/**\n * Create an HSL color\n */\nexport function hsl(h: number, s: number, l: number): ColorHSL {\n return { h, s, l };\n}\n\n/**\n * Create an AABB\n */\nexport function aabb(min: Vec3 = vec3(), max: Vec3 = vec3()): AABB {\n return { min, max };\n}\n\n/**\n * Create a Ray\n */\nexport function ray(origin: Vec3, direction: Vec3): Ray {\n return { origin, direction };\n}\n\n// =============================================================================\n// CONVERSION UTILITIES\n// =============================================================================\n\n/**\n * Convert Vec3 to array\n */\nexport function vec3ToArray(v: Vec3): Vec3Array {\n return [v.x, v.y, v.z];\n}\n\n/**\n * Convert array to Vec3\n */\nexport function arrayToVec3(arr: Vec3Array | number[]): Vec3 {\n return { x: arr[0] || 0, y: arr[1] || 0, z: arr[2] || 0 };\n}\n\n/**\n * Convert Quat to array\n */\nexport function quatToArray(q: Quat): QuatArray {\n return [q.x, q.y, q.z, q.w];\n}\n\n/**\n * Convert array to Quat\n */\nexport function arrayToQuat(arr: QuatArray | number[]): Quat {\n return { x: arr[0] || 0, y: arr[1] || 0, z: arr[2] || 0, w: arr[3] ?? 1 };\n}\n\n/**\n * Parse color from various formats\n */\nexport function parseColor(color: Color): ColorRGBA {\n if (typeof color === 'string') {\n // Hex color\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n return {\n r: parseInt(hex[0] + hex[0], 16) / 255,\n g: parseInt(hex[1] + hex[1], 16) / 255,\n b: parseInt(hex[2] + hex[2], 16) / 255,\n a: 1,\n };\n } else if (hex.length === 6) {\n return {\n r: parseInt(hex.slice(0, 2), 16) / 255,\n g: parseInt(hex.slice(2, 4), 16) / 255,\n b: parseInt(hex.slice(4, 6), 16) / 255,\n a: 1,\n };\n } else if (hex.length === 8) {\n return {\n r: parseInt(hex.slice(0, 2), 16) / 255,\n g: parseInt(hex.slice(2, 4), 16) / 255,\n b: parseInt(hex.slice(4, 6), 16) / 255,\n a: parseInt(hex.slice(6, 8), 16) / 255,\n };\n }\n }\n // Named colors (basic support)\n const namedColors: Record<string, ColorRGBA> = {\n white: { r: 1, g: 1, b: 1, a: 1 },\n black: { r: 0, g: 0, b: 0, a: 1 },\n red: { r: 1, g: 0, b: 0, a: 1 },\n green: { r: 0, g: 1, b: 0, a: 1 },\n blue: { r: 0, g: 0, b: 1, a: 1 },\n yellow: { r: 1, g: 1, b: 0, a: 1 },\n cyan: { r: 0, g: 1, b: 1, a: 1 },\n magenta: { r: 1, g: 0, b: 1, a: 1 },\n };\n return namedColors[color.toLowerCase()] || { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (typeof color === 'number') {\n // Integer color (0xRRGGBB)\n return {\n r: ((color >> 16) & 0xff) / 255,\n g: ((color >> 8) & 0xff) / 255,\n b: (color & 0xff) / 255,\n a: 1,\n };\n }\n\n if ('h' in color) {\n // HSL to RGB conversion\n const { h, s, l } = color;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0,\n g = 0,\n b = 0;\n\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n return { r: r + m, g: g + m, b: b + m, a: 1 };\n }\n\n if ('a' in color) {\n return color;\n }\n\n return { ...color, a: 1 };\n}\n\n/**\n * Color to hex string\n */\nexport function colorToHex(color: ColorRGB | ColorRGBA): string {\n const r = Math.round(color.r * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(color.g * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(color.b * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}`;\n}\n\n// =============================================================================\n// TRAIT DEFINITIONS\n// =============================================================================\n\nexport interface TraitDefinition {\n name: string;\n description?: string;\n type?: string;\n params?: Record<string, any>;\n parameters?: Record<string, any>;\n validator?: (params: Record<string, any>) => boolean;\n validation?: any;\n}\n","/**\n * Math utilities for HoloScript\n *\n * Vector math, quaternion operations, interpolation, and noise functions.\n */\n\nimport type { Vec2, Vec3, Quat, EulerAngles, AABB } from './types.js';\nimport { vec3, quat } from './types.js';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nexport const PI = Math.PI;\nexport const TAU = Math.PI * 2;\nexport const HALF_PI = Math.PI / 2;\nexport const DEG_TO_RAD = Math.PI / 180;\nexport const RAD_TO_DEG = 180 / Math.PI;\nexport const EPSILON = 1e-6;\n\n// =============================================================================\n// BASIC MATH\n// =============================================================================\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport function inverseLerp(a: number, b: number, value: number): number {\n return (value - a) / (b - a);\n}\n\nexport function remap(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\n const t = clamp((x - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\nexport function smootherstep(edge0: number, edge1: number, x: number): number {\n const t = clamp((x - edge0) / (edge1 - edge0), 0, 1);\n return t * t * t * (t * (t * 6 - 15) + 10);\n}\n\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function fract(x: number): number {\n return x - Math.floor(x);\n}\n\nexport function sign(x: number): number {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n}\n\nexport function step(edge: number, x: number): number {\n return x < edge ? 0 : 1;\n}\n\n// =============================================================================\n// VEC2 OPERATIONS\n// =============================================================================\n\nexport const vec2Math = {\n add: (a: Vec2, b: Vec2): Vec2 => ({ x: a.x + b.x, y: a.y + b.y }),\n sub: (a: Vec2, b: Vec2): Vec2 => ({ x: a.x - b.x, y: a.y - b.y }),\n mul: (a: Vec2, s: number): Vec2 => ({ x: a.x * s, y: a.y * s }),\n div: (a: Vec2, s: number): Vec2 => ({ x: a.x / s, y: a.y / s }),\n dot: (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y,\n length: (v: Vec2): number => Math.sqrt(v.x * v.x + v.y * v.y),\n lengthSq: (v: Vec2): number => v.x * v.x + v.y * v.y,\n normalize: (v: Vec2): Vec2 => {\n const len = vec2Math.length(v);\n return len > 0 ? vec2Math.div(v, len) : { x: 0, y: 0 };\n },\n distance: (a: Vec2, b: Vec2): number => vec2Math.length(vec2Math.sub(a, b)),\n lerp: (a: Vec2, b: Vec2, t: number): Vec2 => ({\n x: lerp(a.x, b.x, t),\n y: lerp(a.y, b.y, t),\n }),\n rotate: (v: Vec2, angle: number): Vec2 => {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { x: v.x * c - v.y * s, y: v.x * s + v.y * c };\n },\n angle: (v: Vec2): number => Math.atan2(v.y, v.x),\n angleBetween: (a: Vec2, b: Vec2): number => {\n return Math.acos(clamp(vec2Math.dot(vec2Math.normalize(a), vec2Math.normalize(b)), -1, 1));\n },\n};\n\n// =============================================================================\n// VEC3 OPERATIONS\n// =============================================================================\n\nexport const vec3Math = {\n zero: (): Vec3 => vec3(0, 0, 0),\n one: (): Vec3 => vec3(1, 1, 1),\n up: (): Vec3 => vec3(0, 1, 0),\n down: (): Vec3 => vec3(0, -1, 0),\n forward: (): Vec3 => vec3(0, 0, -1),\n back: (): Vec3 => vec3(0, 0, 1),\n left: (): Vec3 => vec3(-1, 0, 0),\n right: (): Vec3 => vec3(1, 0, 0),\n\n add: (a: Vec3, b: Vec3): Vec3 => ({ x: a.x + b.x, y: a.y + b.y, z: a.z + b.z }),\n sub: (a: Vec3, b: Vec3): Vec3 => ({ x: a.x - b.x, y: a.y - b.y, z: a.z - b.z }),\n mul: (a: Vec3, s: number): Vec3 => ({ x: a.x * s, y: a.y * s, z: a.z * s }),\n div: (a: Vec3, s: number): Vec3 => ({ x: a.x / s, y: a.y / s, z: a.z / s }),\n mulVec: (a: Vec3, b: Vec3): Vec3 => ({ x: a.x * b.x, y: a.y * b.y, z: a.z * b.z }),\n\n dot: (a: Vec3, b: Vec3): number => a.x * b.x + a.y * b.y + a.z * b.z,\n\n cross: (a: Vec3, b: Vec3): Vec3 => ({\n x: a.y * b.z - a.z * b.y,\n y: a.z * b.x - a.x * b.z,\n z: a.x * b.y - a.y * b.x,\n }),\n\n length: (v: Vec3): number => Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z),\n lengthSq: (v: Vec3): number => v.x * v.x + v.y * v.y + v.z * v.z,\n\n normalize: (v: Vec3): Vec3 => {\n const len = vec3Math.length(v);\n return len > EPSILON ? vec3Math.div(v, len) : vec3(0, 0, 0);\n },\n\n distance: (a: Vec3, b: Vec3): number => vec3Math.length(vec3Math.sub(a, b)),\n distanceSq: (a: Vec3, b: Vec3): number => vec3Math.lengthSq(vec3Math.sub(a, b)),\n\n lerp: (a: Vec3, b: Vec3, t: number): Vec3 => ({\n x: lerp(a.x, b.x, t),\n y: lerp(a.y, b.y, t),\n z: lerp(a.z, b.z, t),\n }),\n\n slerp: (a: Vec3, b: Vec3, t: number): Vec3 => {\n const dot = clamp(vec3Math.dot(a, b), -1, 1);\n const theta = Math.acos(dot) * t;\n const relative = vec3Math.normalize(vec3Math.sub(b, vec3Math.mul(a, dot)));\n return vec3Math.add(vec3Math.mul(a, Math.cos(theta)), vec3Math.mul(relative, Math.sin(theta)));\n },\n\n negate: (v: Vec3): Vec3 => ({ x: -v.x, y: -v.y, z: -v.z }),\n\n abs: (v: Vec3): Vec3 => ({ x: Math.abs(v.x), y: Math.abs(v.y), z: Math.abs(v.z) }),\n\n min: (a: Vec3, b: Vec3): Vec3 => ({\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n z: Math.min(a.z, b.z),\n }),\n\n max: (a: Vec3, b: Vec3): Vec3 => ({\n x: Math.max(a.x, b.x),\n y: Math.max(a.y, b.y),\n z: Math.max(a.z, b.z),\n }),\n\n clamp: (v: Vec3, min: Vec3, max: Vec3): Vec3 => ({\n x: clamp(v.x, min.x, max.x),\n y: clamp(v.y, min.y, max.y),\n z: clamp(v.z, min.z, max.z),\n }),\n\n floor: (v: Vec3): Vec3 => ({\n x: Math.floor(v.x),\n y: Math.floor(v.y),\n z: Math.floor(v.z),\n }),\n\n ceil: (v: Vec3): Vec3 => ({\n x: Math.ceil(v.x),\n y: Math.ceil(v.y),\n z: Math.ceil(v.z),\n }),\n\n round: (v: Vec3): Vec3 => ({\n x: Math.round(v.x),\n y: Math.round(v.y),\n z: Math.round(v.z),\n }),\n\n reflect: (v: Vec3, normal: Vec3): Vec3 => {\n const dot = vec3Math.dot(v, normal);\n return vec3Math.sub(v, vec3Math.mul(normal, 2 * dot));\n },\n\n project: (v: Vec3, onto: Vec3): Vec3 => {\n const dot = vec3Math.dot(v, onto);\n const lenSq = vec3Math.lengthSq(onto);\n return vec3Math.mul(onto, dot / lenSq);\n },\n\n angle: (a: Vec3, b: Vec3): number => {\n const dot = vec3Math.dot(vec3Math.normalize(a), vec3Math.normalize(b));\n return Math.acos(clamp(dot, -1, 1));\n },\n\n equals: (a: Vec3, b: Vec3, epsilon: number = EPSILON): boolean => {\n return (\n Math.abs(a.x - b.x) < epsilon &&\n Math.abs(a.y - b.y) < epsilon &&\n Math.abs(a.z - b.z) < epsilon\n );\n },\n};\n\n// =============================================================================\n// QUATERNION OPERATIONS\n// =============================================================================\n\nexport const quatMath = {\n identity: (): Quat => quat(0, 0, 0, 1),\n\n fromAxisAngle: (axis: Vec3, angle: number): Quat => {\n const halfAngle = angle / 2;\n const s = Math.sin(halfAngle);\n const normalized = vec3Math.normalize(axis);\n return {\n x: normalized.x * s,\n y: normalized.y * s,\n z: normalized.z * s,\n w: Math.cos(halfAngle),\n };\n },\n\n fromEuler: (euler: EulerAngles): Quat => {\n const { x, y, z } = euler;\n const c1 = Math.cos(degToRad(x) / 2);\n const c2 = Math.cos(degToRad(y) / 2);\n const c3 = Math.cos(degToRad(z) / 2);\n const s1 = Math.sin(degToRad(x) / 2);\n const s2 = Math.sin(degToRad(y) / 2);\n const s3 = Math.sin(degToRad(z) / 2);\n\n return {\n x: s1 * c2 * c3 + c1 * s2 * s3,\n y: c1 * s2 * c3 - s1 * c2 * s3,\n z: c1 * c2 * s3 + s1 * s2 * c3,\n w: c1 * c2 * c3 - s1 * s2 * s3,\n };\n },\n\n toEuler: (q: Quat): EulerAngles => {\n const sinr_cosp = 2 * (q.w * q.x + q.y * q.z);\n const cosr_cosp = 1 - 2 * (q.x * q.x + q.y * q.y);\n const x = Math.atan2(sinr_cosp, cosr_cosp);\n\n const sinp = 2 * (q.w * q.y - q.z * q.x);\n let y: number;\n if (Math.abs(sinp) >= 1) {\n y = (Math.PI / 2) * Math.sign(sinp);\n } else {\n y = Math.asin(sinp);\n }\n\n const siny_cosp = 2 * (q.w * q.z + q.x * q.y);\n const cosy_cosp = 1 - 2 * (q.y * q.y + q.z * q.z);\n const z = Math.atan2(siny_cosp, cosy_cosp);\n\n return {\n x: radToDeg(x),\n y: radToDeg(y),\n z: radToDeg(z),\n };\n },\n\n multiply: (a: Quat, b: Quat): Quat => ({\n x: a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,\n y: a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,\n z: a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,\n w: a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,\n }),\n\n conjugate: (q: Quat): Quat => ({ x: -q.x, y: -q.y, z: -q.z, w: q.w }),\n\n inverse: (q: Quat): Quat => {\n const lenSq = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;\n return {\n x: -q.x / lenSq,\n y: -q.y / lenSq,\n z: -q.z / lenSq,\n w: q.w / lenSq,\n };\n },\n\n normalize: (q: Quat): Quat => {\n const len = Math.sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w);\n return { x: q.x / len, y: q.y / len, z: q.z / len, w: q.w / len };\n },\n\n dot: (a: Quat, b: Quat): number => a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w,\n\n slerp: (a: Quat, b: Quat, t: number): Quat => {\n let dot = quatMath.dot(a, b);\n\n // If dot is negative, negate one quaternion to take shorter path\n let bAdjusted = b;\n if (dot < 0) {\n bAdjusted = { x: -b.x, y: -b.y, z: -b.z, w: -b.w };\n dot = -dot;\n }\n\n if (dot > 0.9995) {\n // Linear interpolation for very close quaternions\n return quatMath.normalize({\n x: lerp(a.x, bAdjusted.x, t),\n y: lerp(a.y, bAdjusted.y, t),\n z: lerp(a.z, bAdjusted.z, t),\n w: lerp(a.w, bAdjusted.w, t),\n });\n }\n\n const theta0 = Math.acos(dot);\n const theta = theta0 * t;\n const sinTheta = Math.sin(theta);\n const sinTheta0 = Math.sin(theta0);\n\n const s0 = Math.cos(theta) - (dot * sinTheta) / sinTheta0;\n const s1 = sinTheta / sinTheta0;\n\n return {\n x: a.x * s0 + bAdjusted.x * s1,\n y: a.y * s0 + bAdjusted.y * s1,\n z: a.z * s0 + bAdjusted.z * s1,\n w: a.w * s0 + bAdjusted.w * s1,\n };\n },\n\n rotateVec3: (q: Quat, v: Vec3): Vec3 => {\n const qv = { x: q.x, y: q.y, z: q.z };\n const uv = vec3Math.cross(qv, v);\n const uuv = vec3Math.cross(qv, uv);\n return vec3Math.add(v, vec3Math.add(vec3Math.mul(uv, 2 * q.w), vec3Math.mul(uuv, 2)));\n },\n\n lookAt: (forward: Vec3, up: Vec3 = vec3(0, 1, 0)): Quat => {\n const f = vec3Math.normalize(forward);\n const r = vec3Math.normalize(vec3Math.cross(up, f));\n const u = vec3Math.cross(f, r);\n\n const trace = r.x + u.y + f.z;\n let q: Quat;\n\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1);\n q = {\n w: 0.25 / s,\n x: (u.z - f.y) * s,\n y: (f.x - r.z) * s,\n z: (r.y - u.x) * s,\n };\n } else if (r.x > u.y && r.x > f.z) {\n const s = 2 * Math.sqrt(1 + r.x - u.y - f.z);\n q = {\n w: (u.z - f.y) / s,\n x: 0.25 * s,\n y: (u.x + r.y) / s,\n z: (f.x + r.z) / s,\n };\n } else if (u.y > f.z) {\n const s = 2 * Math.sqrt(1 + u.y - r.x - f.z);\n q = {\n w: (f.x - r.z) / s,\n x: (u.x + r.y) / s,\n y: 0.25 * s,\n z: (f.y + u.z) / s,\n };\n } else {\n const s = 2 * Math.sqrt(1 + f.z - r.x - u.y);\n q = {\n w: (r.y - u.x) / s,\n x: (f.x + r.z) / s,\n y: (f.y + u.z) / s,\n z: 0.25 * s,\n };\n }\n\n return quatMath.normalize(q);\n },\n};\n\n// =============================================================================\n// AABB OPERATIONS\n// =============================================================================\n\nexport const aabbMath = {\n contains: (aabb: AABB, point: Vec3): boolean => {\n return (\n point.x >= aabb.min.x &&\n point.x <= aabb.max.x &&\n point.y >= aabb.min.y &&\n point.y <= aabb.max.y &&\n point.z >= aabb.min.z &&\n point.z <= aabb.max.z\n );\n },\n\n intersects: (a: AABB, b: AABB): boolean => {\n return (\n a.min.x <= b.max.x &&\n a.max.x >= b.min.x &&\n a.min.y <= b.max.y &&\n a.max.y >= b.min.y &&\n a.min.z <= b.max.z &&\n a.max.z >= b.min.z\n );\n },\n\n center: (aabb: AABB): Vec3 => vec3Math.mul(vec3Math.add(aabb.min, aabb.max), 0.5),\n\n size: (aabb: AABB): Vec3 => vec3Math.sub(aabb.max, aabb.min),\n\n expand: (aabb: AABB, point: Vec3): AABB => ({\n min: vec3Math.min(aabb.min, point),\n max: vec3Math.max(aabb.max, point),\n }),\n\n merge: (a: AABB, b: AABB): AABB => ({\n min: vec3Math.min(a.min, b.min),\n max: vec3Math.max(a.max, b.max),\n }),\n};\n\n// =============================================================================\n// NOISE FUNCTIONS\n// =============================================================================\n\n// Simple permutation table for noise\nconst perm = new Uint8Array(512);\nfor (let i = 0; i < 256; i++) perm[i] = perm[i + 256] = i;\nfor (let i = 255; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [perm[i], perm[j]] = [perm[j], perm[i]];\n perm[i + 256] = perm[i];\n}\n\nfunction fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10);\n}\n\nfunction grad(hash: number, x: number, y: number, z: number): number {\n const h = hash & 15;\n const u = h < 8 ? x : y;\n const v = h < 4 ? y : h === 12 || h === 14 ? x : z;\n return ((h & 1) === 0 ? u : -u) + ((h & 2) === 0 ? v : -v);\n}\n\nexport const noise = {\n /**\n * 3D Perlin noise (-1 to 1)\n */\n perlin3d: (x: number, y: number, z: number): number => {\n const X = Math.floor(x) & 255;\n const Y = Math.floor(y) & 255;\n const Z = Math.floor(z) & 255;\n\n x -= Math.floor(x);\n y -= Math.floor(y);\n z -= Math.floor(z);\n\n const u = fade(x);\n const v = fade(y);\n const w = fade(z);\n\n const A = perm[X] + Y;\n const AA = perm[A] + Z;\n const AB = perm[A + 1] + Z;\n const B = perm[X + 1] + Y;\n const BA = perm[B] + Z;\n const BB = perm[B + 1] + Z;\n\n return lerp(\n lerp(\n lerp(grad(perm[AA], x, y, z), grad(perm[BA], x - 1, y, z), u),\n lerp(grad(perm[AB], x, y - 1, z), grad(perm[BB], x - 1, y - 1, z), u),\n v\n ),\n lerp(\n lerp(grad(perm[AA + 1], x, y, z - 1), grad(perm[BA + 1], x - 1, y, z - 1), u),\n lerp(grad(perm[AB + 1], x, y - 1, z - 1), grad(perm[BB + 1], x - 1, y - 1, z - 1), u),\n v\n ),\n w\n );\n },\n\n /**\n * 2D Perlin noise (-1 to 1)\n */\n perlin2d: (x: number, y: number): number => {\n return noise.perlin3d(x, y, 0);\n },\n\n /**\n * Fractal Brownian Motion (fBm)\n */\n fbm: (\n x: number,\n y: number,\n z: number,\n octaves: number = 6,\n lacunarity: number = 2,\n gain: number = 0.5\n ): number => {\n let value = 0;\n let amplitude = 1;\n let frequency = 1;\n let maxValue = 0;\n\n for (let i = 0; i < octaves; i++) {\n value += amplitude * noise.perlin3d(x * frequency, y * frequency, z * frequency);\n maxValue += amplitude;\n amplitude *= gain;\n frequency *= lacunarity;\n }\n\n return value / maxValue;\n },\n\n /**\n * Simplex-like noise (approximation using perlin)\n */\n simplex: (x: number, y: number): number => {\n return noise.perlin2d(x * 1.2, y * 1.2);\n },\n\n /**\n * Worley/Cellular noise\n */\n worley: (x: number, y: number, z: number): number => {\n const xi = Math.floor(x);\n const yi = Math.floor(y);\n const zi = Math.floor(z);\n\n let minDist = Infinity;\n\n for (let i = -1; i <= 1; i++) {\n for (let j = -1; j <= 1; j++) {\n for (let k = -1; k <= 1; k++) {\n const cellX = xi + i;\n const cellY = yi + j;\n const cellZ = zi + k;\n\n // Pseudo-random point in cell\n const hash = perm[(perm[(perm[cellX & 255] + cellY) & 255] + cellZ) & 255];\n const px = cellX + hash / 255;\n const py = cellY + ((hash * 7) % 255) / 255;\n const pz = cellZ + ((hash * 13) % 255) / 255;\n\n const dist = (x - px) * (x - px) + (y - py) * (y - py) + (z - pz) * (z - pz);\n minDist = Math.min(minDist, dist);\n }\n }\n }\n\n return Math.sqrt(minDist);\n },\n};\n\n// =============================================================================\n// RANDOM\n// =============================================================================\n\nexport const random = {\n /**\n * Random float between 0 and 1\n */\n float: (): number => Math.random(),\n\n /**\n * Random float in range [min, max)\n */\n range: (min: number, max: number): number => min + Math.random() * (max - min),\n\n /**\n * Random integer in range [min, max]\n */\n int: (min: number, max: number): number => Math.floor(min + Math.random() * (max - min + 1)),\n\n /**\n * Random boolean with probability\n */\n bool: (probability: number = 0.5): boolean => Math.random() < probability,\n\n /**\n * Random element from array\n */\n pick: <T>(array: T[]): T => array[Math.floor(Math.random() * array.length)],\n\n /**\n * Shuffle array (Fisher-Yates)\n */\n shuffle: <T>(array: T[]): T[] => {\n const result = [...array];\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n return result;\n },\n\n /**\n * Random Vec3 in unit sphere\n */\n insideUnitSphere: (): Vec3 => {\n const theta = Math.random() * TAU;\n const phi = Math.acos(2 * Math.random() - 1);\n const r = Math.cbrt(Math.random());\n return {\n x: r * Math.sin(phi) * Math.cos(theta),\n y: r * Math.sin(phi) * Math.sin(theta),\n z: r * Math.cos(phi),\n };\n },\n\n /**\n * Random Vec3 on unit sphere surface\n */\n onUnitSphere: (): Vec3 => {\n const theta = Math.random() * TAU;\n const phi = Math.acos(2 * Math.random() - 1);\n return {\n x: Math.sin(phi) * Math.cos(theta),\n y: Math.sin(phi) * Math.sin(theta),\n z: Math.cos(phi),\n };\n },\n\n /**\n * Random Vec2 in unit circle\n */\n insideUnitCircle: (): Vec2 => {\n const theta = Math.random() * TAU;\n const r = Math.sqrt(Math.random());\n return {\n x: r * Math.cos(theta),\n y: r * Math.sin(theta),\n };\n },\n\n /**\n * Seeded random number generator\n */\n seeded: (seed: number) => {\n let s = seed;\n return () => {\n s = (s * 1103515245 + 12345) & 0x7fffffff;\n return s / 0x7fffffff;\n };\n },\n};\n"],"mappings":"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","names":["aabb"]}
@@ -0,0 +1,287 @@
1
+ // src/traits/EconomicPrimitives.ts
2
+ function generateTxHash(from, to, price, timestamp) {
3
+ let hash = 2166136261;
4
+ const input = `${from}:${to}:${price}:${timestamp}`;
5
+ for (let i = 0; i < input.length; i++) {
6
+ hash ^= input.charCodeAt(i);
7
+ hash = Math.imul(hash, 16777619);
8
+ }
9
+ return (hash >>> 0).toString(16).padStart(8, "0");
10
+ }
11
+ function executeTrade(record, buyer, price, timestamp) {
12
+ if (record.locked) {
13
+ return { ok: false, error: "TRANSFER_BLOCKED" };
14
+ }
15
+ if (price < 0) {
16
+ return { ok: false, error: "INVALID_AMOUNT" };
17
+ }
18
+ const txHash = generateTxHash(record.owner, buyer, price, timestamp);
19
+ const transfer = {
20
+ from: record.owner,
21
+ to: buyer,
22
+ price,
23
+ timestamp,
24
+ txHash
25
+ };
26
+ const history = [transfer, ...record.history].slice(0, 50);
27
+ return {
28
+ ok: true,
29
+ value: {
30
+ owner: buyer,
31
+ history,
32
+ locked: false
33
+ }
34
+ };
35
+ }
36
+ var DEFAULT_DEPRECIATION = {
37
+ decayRate: 1e-4,
38
+ // 0.01% per second (~36% per hour)
39
+ condition: 1,
40
+ destroyThreshold: 0.01,
41
+ repairable: true,
42
+ repairCostMultiplier: 0.5
43
+ };
44
+ function calculateDepreciation(initialCondition, decayRate, elapsedSeconds) {
45
+ if (decayRate <= 0) return initialCondition;
46
+ if (elapsedSeconds <= 0) return initialCondition;
47
+ return initialCondition * Math.exp(-decayRate * elapsedSeconds);
48
+ }
49
+ function depreciatedValue(baseValue, condition) {
50
+ return baseValue * Math.max(0, Math.min(1, condition));
51
+ }
52
+ function isDestroyed(condition, threshold) {
53
+ return condition <= threshold;
54
+ }
55
+ function calculateRepairCost(baseValue, currentCondition, repairCostMultiplier) {
56
+ const conditionDeficit = 1 - Math.max(0, Math.min(1, currentCondition));
57
+ return baseValue * conditionDeficit * repairCostMultiplier;
58
+ }
59
+ var DEFAULT_BONDING_CURVE = {
60
+ curveType: "exponential",
61
+ reserveRatio: 1,
62
+ curveSteepness: 2,
63
+ currentSupply: 0,
64
+ reserveBalance: 0,
65
+ transactionFee: 0.02,
66
+ // 2% hard sink
67
+ sigmoidK: 100,
68
+ spatialDistanceFactor: 0
69
+ };
70
+ function bondingCurvePrice(supply, reserveRatio, curveSteepness, curveType = "exponential", sigmoidK = 100) {
71
+ if (supply <= 0) return 0;
72
+ if (reserveRatio <= 0) return 0;
73
+ switch (curveType) {
74
+ case "linear":
75
+ return reserveRatio * supply;
76
+ case "exponential":
77
+ return reserveRatio * Math.pow(supply, 1 / curveSteepness);
78
+ case "logarithmic":
79
+ return reserveRatio * Math.log(supply + 1);
80
+ case "sigmoid": {
81
+ const sn = Math.pow(supply, curveSteepness);
82
+ const kn = Math.pow(sigmoidK, curveSteepness);
83
+ return reserveRatio * (sn / (kn + sn));
84
+ }
85
+ default:
86
+ return reserveRatio * Math.pow(supply, 1 / curveSteepness);
87
+ }
88
+ }
89
+ function bondingCurveBuyCost(config, amount) {
90
+ if (amount <= 0) return 0;
91
+ const n = Math.max(10, Math.ceil(amount));
92
+ const h = amount / n;
93
+ let sum = 0;
94
+ const s0 = config.currentSupply;
95
+ for (let i = 0; i <= n; i++) {
96
+ const s = s0 + i * h;
97
+ const p = bondingCurvePrice(
98
+ s,
99
+ config.reserveRatio,
100
+ config.curveSteepness,
101
+ config.curveType,
102
+ config.sigmoidK
103
+ );
104
+ if (i === 0 || i === n) {
105
+ sum += p;
106
+ } else if (i % 2 === 1) {
107
+ sum += 4 * p;
108
+ } else {
109
+ sum += 2 * p;
110
+ }
111
+ }
112
+ const cost = h / 3 * sum;
113
+ return cost * (1 + config.transactionFee);
114
+ }
115
+ function bondingCurveSellRefund(config, amount) {
116
+ if (amount <= 0) return 0;
117
+ if (amount > config.currentSupply) return 0;
118
+ const n = Math.max(10, Math.ceil(amount));
119
+ const h = amount / n;
120
+ let sum = 0;
121
+ const s0 = config.currentSupply - amount;
122
+ for (let i = 0; i <= n; i++) {
123
+ const s = s0 + i * h;
124
+ const p = bondingCurvePrice(
125
+ s,
126
+ config.reserveRatio,
127
+ config.curveSteepness,
128
+ config.curveType,
129
+ config.sigmoidK
130
+ );
131
+ if (i === 0 || i === n) {
132
+ sum += p;
133
+ } else if (i % 2 === 1) {
134
+ sum += 4 * p;
135
+ } else {
136
+ sum += 2 * p;
137
+ }
138
+ }
139
+ const refund = h / 3 * sum;
140
+ return refund * (1 - config.transactionFee);
141
+ }
142
+ function spatialPrice(basePrice, distanceToHub, distanceFactor) {
143
+ if (distanceFactor <= 0 || distanceToHub <= 0) return basePrice;
144
+ return basePrice * (1 + distanceFactor * distanceToHub);
145
+ }
146
+ var DEFAULT_WEALTH_TAX = {
147
+ threshold: 1e4,
148
+ baseRate: 0.01,
149
+ // 1% base
150
+ maxEffectiveRate: 0.05,
151
+ // 5% cap
152
+ collectionInterval: "daily",
153
+ enableRedistribution: true,
154
+ redistributionFraction: 0.7
155
+ // 70% redistributed, 30% burned as hard sink
156
+ };
157
+ function calculateTaxRate(wealth, threshold, baseRate, maxEffectiveRate) {
158
+ if (wealth <= threshold) return 0;
159
+ if (threshold <= 0) return 0;
160
+ const rate = Math.log(wealth / threshold) * baseRate;
161
+ return Math.min(rate, maxEffectiveRate);
162
+ }
163
+ function calculateTaxAmount(wealth, config) {
164
+ const rate = calculateTaxRate(wealth, config.threshold, config.baseRate, config.maxEffectiveRate);
165
+ return wealth * rate;
166
+ }
167
+ function calculateRedistribution(totalTaxCollected, recipientCount, redistributionFraction) {
168
+ if (recipientCount <= 0 || totalTaxCollected <= 0) {
169
+ return { perRecipient: 0, burned: totalTaxCollected };
170
+ }
171
+ const redistributed = totalTaxCollected * redistributionFraction;
172
+ const burned = totalTaxCollected - redistributed;
173
+ const perRecipient = redistributed / recipientCount;
174
+ return { perRecipient, burned };
175
+ }
176
+ var DEFAULT_PID = {
177
+ kp: 0.5,
178
+ ki: 0.01,
179
+ kd: 0.1,
180
+ setpoint: 0,
181
+ outputMin: -1,
182
+ outputMax: 1,
183
+ integralLimit: 10
184
+ };
185
+ function createPIDState() {
186
+ return {
187
+ previousError: 0,
188
+ integral: 0,
189
+ lastOutput: 0,
190
+ initialized: false
191
+ };
192
+ }
193
+ function updatePID(config, state, measurement, dt) {
194
+ if (dt <= 0) return state.lastOutput;
195
+ const error = config.setpoint - measurement;
196
+ const p = config.kp * error;
197
+ state.integral += error * dt;
198
+ state.integral = Math.max(-config.integralLimit, Math.min(config.integralLimit, state.integral));
199
+ const i = config.ki * state.integral;
200
+ let d = 0;
201
+ if (state.initialized) {
202
+ d = config.kd * ((error - state.previousError) / dt);
203
+ }
204
+ let output = p + i + d;
205
+ output = Math.max(config.outputMin, Math.min(config.outputMax, output));
206
+ state.previousError = error;
207
+ state.lastOutput = output;
208
+ state.initialized = true;
209
+ return output;
210
+ }
211
+ function createDualLoopPIDState() {
212
+ return {
213
+ innerState: createPIDState(),
214
+ outerState: createPIDState(),
215
+ faucetMultiplier: 1
216
+ };
217
+ }
218
+ function updateDualLoopPID(config, state, totalMoneySupply, currentFaucetRate, dt) {
219
+ const targetSupply = config.perCapitaTarget * config.activePlayerCount;
220
+ const outerConfig = { ...config.outerLoop, setpoint: targetSupply };
221
+ const outerOutput = updatePID(outerConfig, state.outerState, totalMoneySupply, dt);
222
+ const desiredFaucetRate = currentFaucetRate * (1 + outerOutput * 0.1);
223
+ const innerConfig = { ...config.innerLoop, setpoint: desiredFaucetRate };
224
+ const innerOutput = updatePID(innerConfig, state.innerState, currentFaucetRate, dt);
225
+ state.faucetMultiplier = Math.max(0, Math.min(2, 1 + innerOutput));
226
+ return state.faucetMultiplier;
227
+ }
228
+ function createFaucetSinkMetrics(timestamp) {
229
+ return {
230
+ totalFaucet: 0,
231
+ totalSink: 0,
232
+ ratio: 1,
233
+ velocity: 0,
234
+ periodStart: timestamp,
235
+ ratioHistory: []
236
+ };
237
+ }
238
+ function recordFaucet(metrics, amount) {
239
+ metrics.totalFaucet += amount;
240
+ metrics.ratio = metrics.totalSink > 0 ? metrics.totalFaucet / metrics.totalSink : metrics.totalFaucet > 0 ? Infinity : 1;
241
+ }
242
+ function recordSink(metrics, amount) {
243
+ metrics.totalSink += amount;
244
+ metrics.ratio = metrics.totalSink > 0 ? metrics.totalFaucet / metrics.totalSink : metrics.totalFaucet > 0 ? Infinity : 1;
245
+ }
246
+ function resetMetricsPeriod(metrics, timestamp) {
247
+ if (metrics.totalFaucet > 0 || metrics.totalSink > 0) {
248
+ metrics.ratioHistory.push(metrics.ratio);
249
+ if (metrics.ratioHistory.length > 100) {
250
+ metrics.ratioHistory.shift();
251
+ }
252
+ }
253
+ metrics.totalFaucet = 0;
254
+ metrics.totalSink = 0;
255
+ metrics.ratio = 1;
256
+ metrics.velocity = 0;
257
+ metrics.periodStart = timestamp;
258
+ }
259
+
260
+ export {
261
+ generateTxHash,
262
+ executeTrade,
263
+ DEFAULT_DEPRECIATION,
264
+ calculateDepreciation,
265
+ depreciatedValue,
266
+ isDestroyed,
267
+ calculateRepairCost,
268
+ DEFAULT_BONDING_CURVE,
269
+ bondingCurvePrice,
270
+ bondingCurveBuyCost,
271
+ bondingCurveSellRefund,
272
+ spatialPrice,
273
+ DEFAULT_WEALTH_TAX,
274
+ calculateTaxRate,
275
+ calculateTaxAmount,
276
+ calculateRedistribution,
277
+ DEFAULT_PID,
278
+ createPIDState,
279
+ updatePID,
280
+ createDualLoopPIDState,
281
+ updateDualLoopPID,
282
+ createFaucetSinkMetrics,
283
+ recordFaucet,
284
+ recordSink,
285
+ resetMetricsPeriod
286
+ };
287
+ //# sourceMappingURL=chunk-P4O3WNG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/traits/EconomicPrimitives.ts"],"sourcesContent":["/**\n * @fileoverview Economic Primitives - Runtime math and types for virtual economy self-regulation\n * @module @holoscript/std/economic\n *\n * Provides the mathematical building blocks for composable economic behaviors in HoloScript.\n * These primitives implement research-proven mechanisms from control theory, DeFi AMMs,\n * and progressive taxation -- adapted for spatial computing economies.\n *\n * References:\n * - P.030.01: Dual-Loop PID Economy Controller (Alter Aeon model)\n * - P.030.02: Bonding Curve Marketplace (DeFi AMM adaptation)\n * - P.030.03: Progressive Wealth Recycling (logarithmic tax + UBI)\n * - W.031: Faucet-Sink Ratio Is the Master Variable\n * - W.032: Dual-Loop Feedback Control Solves Long-Term Stability\n * - W.034: Wealth Tax > Income Tax for Virtual Gini Reduction\n * - W.035: Bonding Curves Provide Intrinsic Price Discovery\n *\n * @version 1.0.0\n * @category economic\n */\n\n// =============================================================================\n// CORE TYPES\n// =============================================================================\n\n/**\n * Represents an in-world currency amount. Always positive.\n * Uses number to stay compatible with HoloScript's numeric system.\n */\nexport type Currency = number;\n\n/**\n * An agent identifier (player, NPC, or system account).\n */\nexport type AgentID = string;\n\n/**\n * Result type for economic operations that can fail.\n */\nexport type EconomicResult<T> = { ok: true; value: T } | { ok: false; error: EconomicError };\n\n/**\n * Economic error codes.\n */\nexport type EconomicError =\n | 'INSUFFICIENT_FUNDS'\n | 'UNAUTHORIZED'\n | 'INVALID_AMOUNT'\n | 'BELOW_MINIMUM'\n | 'ABOVE_MAXIMUM'\n | 'ITEM_DESTROYED'\n | 'TRANSFER_BLOCKED'\n | 'CURVE_EXHAUSTED'\n | 'PID_DIVERGED'\n | 'TAX_EXEMPT'\n | 'INVALID_PARAMETER';\n\n/**\n * RBAC permission categories needed for economic operations.\n * These map to the existing HoloScript RBAC system (RBACTrait.ts).\n */\nexport type EconomicPermission =\n | 'economy.trade' // Transfer items/currency between agents\n | 'economy.mint' // Create new currency (faucet operation)\n | 'economy.burn' // Destroy currency (sink operation)\n | 'economy.set_price' // Modify prices on bonding curves\n | 'economy.tax' // Levy and collect taxes\n | 'economy.redistribute' // Distribute collected tax proceeds\n | 'economy.tune_pid' // Modify PID controller parameters\n | 'economy.audit' // View economic state and logs\n | 'economy.*'; // Full economic authority\n\n// =============================================================================\n// TRADEABLE PRIMITIVES\n// =============================================================================\n\n/**\n * Ownership record for a tradeable entity.\n */\nexport interface OwnershipRecord {\n /** Current owner */\n owner: AgentID;\n /** Transfer history (most recent first, capped at last 50) */\n history: TransferRecord[];\n /** Whether transfers are currently locked */\n locked: boolean;\n /** Optional lock reason */\n lockReason?: string;\n}\n\n/**\n * A single transfer event in the ownership history.\n */\nexport interface TransferRecord {\n from: AgentID;\n to: AgentID;\n price: Currency;\n timestamp: number;\n /** Transaction hash for integrity verification (P.030.04) */\n txHash: string;\n}\n\n/**\n * Generate a transaction hash from transfer details.\n * Uses a simple deterministic hash for in-engine verification.\n * NOT cryptographically secure -- server authority provides integrity (W.037).\n */\nexport function generateTxHash(\n from: AgentID,\n to: AgentID,\n price: Currency,\n timestamp: number\n): string {\n // Simple FNV-1a style hash for fast deterministic ID generation\n let hash = 2166136261;\n const input = `${from}:${to}:${price}:${timestamp}`;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/**\n * Execute a trade (transfer ownership for a price).\n * Returns a new OwnershipRecord if successful.\n */\nexport function executeTrade(\n record: OwnershipRecord,\n buyer: AgentID,\n price: Currency,\n timestamp: number\n): EconomicResult<OwnershipRecord> {\n if (record.locked) {\n return { ok: false, error: 'TRANSFER_BLOCKED' };\n }\n if (price < 0) {\n return { ok: false, error: 'INVALID_AMOUNT' };\n }\n\n const txHash = generateTxHash(record.owner, buyer, price, timestamp);\n\n const transfer: TransferRecord = {\n from: record.owner,\n to: buyer,\n price,\n timestamp,\n txHash,\n };\n\n // Keep history capped at 50 entries\n const history = [transfer, ...record.history].slice(0, 50);\n\n return {\n ok: true,\n value: {\n owner: buyer,\n history,\n locked: false,\n },\n };\n}\n\n// =============================================================================\n// DEPRECIATION PRIMITIVES\n// =============================================================================\n\n/**\n * Configuration for asset depreciation (hard sink mechanic).\n */\nexport interface DepreciationConfig {\n /** Per-second decay rate (0.0 - 1.0). E.g., 0.001 = 0.1% per second */\n decayRate: number;\n /** Current condition (0.0 = destroyed, 1.0 = mint condition) */\n condition: number;\n /** Minimum condition before the item is considered destroyed */\n destroyThreshold: number;\n /** Whether repairs are allowed */\n repairable: boolean;\n /** Cost multiplier for repairs (relative to original value) */\n repairCostMultiplier: number;\n}\n\n/**\n * Default depreciation configuration.\n */\nexport const DEFAULT_DEPRECIATION: DepreciationConfig = {\n decayRate: 0.0001, // 0.01% per second (~36% per hour)\n condition: 1.0,\n destroyThreshold: 0.01,\n repairable: true,\n repairCostMultiplier: 0.5,\n};\n\n/**\n * Calculate the current condition of an asset after elapsed time.\n * Uses exponential decay: condition(t) = condition(0) * e^(-rate * elapsed)\n */\nexport function calculateDepreciation(\n initialCondition: number,\n decayRate: number,\n elapsedSeconds: number\n): number {\n if (decayRate <= 0) return initialCondition;\n if (elapsedSeconds <= 0) return initialCondition;\n return initialCondition * Math.exp(-decayRate * elapsedSeconds);\n}\n\n/**\n * Calculate the effective value of an asset based on condition.\n * Value scales linearly with condition.\n */\nexport function depreciatedValue(baseValue: Currency, condition: number): Currency {\n return baseValue * Math.max(0, Math.min(1, condition));\n}\n\n/**\n * Check if an asset has been destroyed by depreciation.\n */\nexport function isDestroyed(condition: number, threshold: number): boolean {\n return condition <= threshold;\n}\n\n/**\n * Calculate repair cost to restore an asset to full condition.\n */\nexport function calculateRepairCost(\n baseValue: Currency,\n currentCondition: number,\n repairCostMultiplier: number\n): Currency {\n const conditionDeficit = 1.0 - Math.max(0, Math.min(1, currentCondition));\n return baseValue * conditionDeficit * repairCostMultiplier;\n}\n\n// =============================================================================\n// BONDING CURVE PRIMITIVES\n// =============================================================================\n\n/**\n * Bonding curve types with different economic properties.\n *\n * - linear: P = R * S (gentle, predictable)\n * - exponential: P = R * S^n (early-adopter reward)\n * - logarithmic: P = R * ln(S + 1) (stability-favoring)\n * - sigmoid: P = R * S^n / (K^n + S^n) (bounded with plateau)\n */\nexport type BondingCurveType = 'linear' | 'exponential' | 'logarithmic' | 'sigmoid';\n\n/**\n * Configuration for a bonding curve marketplace.\n */\nexport interface BondingCurveConfig {\n /** Curve type */\n curveType: BondingCurveType;\n /** Reserve ratio (base price multiplier) */\n reserveRatio: number;\n /** Curve steepness (n in P = R * S^(1/n)) */\n curveSteepness: number;\n /** Current supply */\n currentSupply: number;\n /** Reserve pool balance (collateral backing the curve) */\n reserveBalance: Currency;\n /** Transaction fee percentage (hard sink, 0-1) */\n transactionFee: number;\n /** Half-saturation constant for sigmoid curves */\n sigmoidK: number;\n /** Optional spatial distance factor for VR marketplaces */\n spatialDistanceFactor: number;\n}\n\n/**\n * Default bonding curve configuration.\n */\nexport const DEFAULT_BONDING_CURVE: BondingCurveConfig = {\n curveType: 'exponential',\n reserveRatio: 1.0,\n curveSteepness: 2.0,\n currentSupply: 0,\n reserveBalance: 0,\n transactionFee: 0.02, // 2% hard sink\n sigmoidK: 100,\n spatialDistanceFactor: 0.0,\n};\n\n/**\n * Calculate the spot price on a bonding curve given current supply.\n *\n * P = R * S^(1/n) for exponential\n * P = R * S for linear\n * P = R * ln(S+1) for logarithmic\n * P = R * S^n / (K^n + S^n) for sigmoid\n */\nexport function bondingCurvePrice(\n supply: number,\n reserveRatio: number,\n curveSteepness: number,\n curveType: BondingCurveType = 'exponential',\n sigmoidK: number = 100\n): Currency {\n if (supply <= 0) return 0;\n if (reserveRatio <= 0) return 0;\n\n switch (curveType) {\n case 'linear':\n return reserveRatio * supply;\n\n case 'exponential':\n return reserveRatio * Math.pow(supply, 1.0 / curveSteepness);\n\n case 'logarithmic':\n return reserveRatio * Math.log(supply + 1);\n\n case 'sigmoid': {\n const sn = Math.pow(supply, curveSteepness);\n const kn = Math.pow(sigmoidK, curveSteepness);\n return reserveRatio * (sn / (kn + sn));\n }\n\n default:\n return reserveRatio * Math.pow(supply, 1.0 / curveSteepness);\n }\n}\n\n/**\n * Calculate the cost to buy `amount` tokens on the bonding curve.\n * Integrates the price function from currentSupply to currentSupply + amount.\n */\nexport function bondingCurveBuyCost(config: BondingCurveConfig, amount: number): Currency {\n if (amount <= 0) return 0;\n\n // Numerical integration using Simpson's rule (good enough for game economies)\n const n = Math.max(10, Math.ceil(amount));\n const h = amount / n;\n let sum = 0;\n const s0 = config.currentSupply;\n\n for (let i = 0; i <= n; i++) {\n const s = s0 + i * h;\n const p = bondingCurvePrice(\n s,\n config.reserveRatio,\n config.curveSteepness,\n config.curveType,\n config.sigmoidK\n );\n\n if (i === 0 || i === n) {\n sum += p;\n } else if (i % 2 === 1) {\n sum += 4 * p;\n } else {\n sum += 2 * p;\n }\n }\n\n const cost = (h / 3) * sum;\n return cost * (1 + config.transactionFee); // Include fee\n}\n\n/**\n * Calculate the refund for selling `amount` tokens on the bonding curve.\n */\nexport function bondingCurveSellRefund(config: BondingCurveConfig, amount: number): Currency {\n if (amount <= 0) return 0;\n if (amount > config.currentSupply) return 0;\n\n const n = Math.max(10, Math.ceil(amount));\n const h = amount / n;\n let sum = 0;\n const s0 = config.currentSupply - amount;\n\n for (let i = 0; i <= n; i++) {\n const s = s0 + i * h;\n const p = bondingCurvePrice(\n s,\n config.reserveRatio,\n config.curveSteepness,\n config.curveType,\n config.sigmoidK\n );\n\n if (i === 0 || i === n) {\n sum += p;\n } else if (i % 2 === 1) {\n sum += 4 * p;\n } else {\n sum += 2 * p;\n }\n }\n\n const refund = (h / 3) * sum;\n return refund * (1 - config.transactionFee); // Deduct fee\n}\n\n/**\n * Apply spatial distance factor to a bonding curve price.\n * P_spatial = P_bonding * (1 + distance_factor * distance)\n * Creates emergent trade routes in VR economies (P.030.02 ENRICHED).\n */\nexport function spatialPrice(\n basePrice: Currency,\n distanceToHub: number,\n distanceFactor: number\n): Currency {\n if (distanceFactor <= 0 || distanceToHub <= 0) return basePrice;\n return basePrice * (1 + distanceFactor * distanceToHub);\n}\n\n// =============================================================================\n// TAXABLE WEALTH PRIMITIVES\n// =============================================================================\n\n/**\n * Configuration for progressive wealth taxation.\n */\nexport interface WealthTaxConfig {\n /** Wealth threshold below which no tax is levied */\n threshold: Currency;\n /** Base tax rate (multiplied by log of excess wealth) */\n baseRate: number;\n /** Maximum effective tax rate cap (prevents punishing engagement) */\n maxEffectiveRate: number;\n /** Tax collection interval description */\n collectionInterval: 'hourly' | 'daily' | 'weekly';\n /** Whether to redistribute to lowest quintile */\n enableRedistribution: boolean;\n /** Fraction of collected tax that goes to redistribution (remainder is burned as hard sink) */\n redistributionFraction: number;\n}\n\n/**\n * Default wealth tax configuration.\n */\nexport const DEFAULT_WEALTH_TAX: WealthTaxConfig = {\n threshold: 10000,\n baseRate: 0.01, // 1% base\n maxEffectiveRate: 0.05, // 5% cap\n collectionInterval: 'daily',\n enableRedistribution: true,\n redistributionFraction: 0.7, // 70% redistributed, 30% burned as hard sink\n};\n\n/**\n * Calculate the effective tax rate for a given wealth level.\n * Uses logarithmic scaling: rate = min(maxRate, log(wealth/threshold) * baseRate)\n * Returns 0 if wealth is below threshold (W.034).\n */\nexport function calculateTaxRate(\n wealth: Currency,\n threshold: Currency,\n baseRate: number,\n maxEffectiveRate: number\n): number {\n if (wealth <= threshold) return 0;\n if (threshold <= 0) return 0;\n\n const rate = Math.log(wealth / threshold) * baseRate;\n return Math.min(rate, maxEffectiveRate);\n}\n\n/**\n * Calculate the tax amount owed for a given wealth level.\n */\nexport function calculateTaxAmount(wealth: Currency, config: WealthTaxConfig): Currency {\n const rate = calculateTaxRate(wealth, config.threshold, config.baseRate, config.maxEffectiveRate);\n return wealth * rate;\n}\n\n/**\n * Calculate redistribution amounts from a tax pool.\n * Returns the per-recipient amount and the amount burned as a hard sink.\n */\nexport function calculateRedistribution(\n totalTaxCollected: Currency,\n recipientCount: number,\n redistributionFraction: number\n): { perRecipient: Currency; burned: Currency } {\n if (recipientCount <= 0 || totalTaxCollected <= 0) {\n return { perRecipient: 0, burned: totalTaxCollected };\n }\n\n const redistributed = totalTaxCollected * redistributionFraction;\n const burned = totalTaxCollected - redistributed;\n const perRecipient = redistributed / recipientCount;\n\n return { perRecipient, burned };\n}\n\n// =============================================================================\n// PID CONTROLLER PRIMITIVES\n// =============================================================================\n\n/**\n * Configuration for a PID controller (P.030.01).\n */\nexport interface PIDConfig {\n /** Proportional gain */\n kp: number;\n /** Integral gain */\n ki: number;\n /** Derivative gain */\n kd: number;\n /** Target setpoint (e.g., target money supply) */\n setpoint: number;\n /** Output limits [min, max] */\n outputMin: number;\n outputMax: number;\n /** Anti-windup integral limit */\n integralLimit: number;\n}\n\n/**\n * Internal state of a PID controller.\n */\nexport interface PIDState {\n /** Previous error (for derivative term) */\n previousError: number;\n /** Accumulated integral */\n integral: number;\n /** Last output value */\n lastOutput: number;\n /** Whether the controller has ever been updated */\n initialized: boolean;\n}\n\n/**\n * Default PID configuration for economy flow control.\n */\nexport const DEFAULT_PID: PIDConfig = {\n kp: 0.5,\n ki: 0.01,\n kd: 0.1,\n setpoint: 0,\n outputMin: -1.0,\n outputMax: 1.0,\n integralLimit: 10.0,\n};\n\n/**\n * Create initial PID state.\n */\nexport function createPIDState(): PIDState {\n return {\n previousError: 0,\n integral: 0,\n lastOutput: 0,\n initialized: false,\n };\n}\n\n/**\n * Update the PID controller with a new measurement.\n *\n * Returns the control output (e.g., faucet rate multiplier).\n * Positive output means increase faucet rate, negative means decrease.\n *\n * @param config PID configuration\n * @param state Current PID state (mutated in place for performance)\n * @param measurement Current measured value (e.g., total money supply)\n * @param dt Time delta in seconds\n * @returns The control output value\n */\nexport function updatePID(\n config: PIDConfig,\n state: PIDState,\n measurement: number,\n dt: number\n): number {\n if (dt <= 0) return state.lastOutput;\n\n const error = config.setpoint - measurement;\n\n // Proportional term\n const p = config.kp * error;\n\n // Integral term with anti-windup\n state.integral += error * dt;\n state.integral = Math.max(-config.integralLimit, Math.min(config.integralLimit, state.integral));\n const i = config.ki * state.integral;\n\n // Derivative term (skip on first update to avoid spike)\n let d = 0;\n if (state.initialized) {\n d = config.kd * ((error - state.previousError) / dt);\n }\n\n // Compute output with clamping\n let output = p + i + d;\n output = Math.max(config.outputMin, Math.min(config.outputMax, output));\n\n // Update state\n state.previousError = error;\n state.lastOutput = output;\n state.initialized = true;\n\n return output;\n}\n\n/**\n * Dual-loop PID controller configuration (P.030.01).\n *\n * Inner loop: Per-source faucet adjustment (fast response)\n * Outer loop: Global money supply targeting (slow response, adjusts inner setpoint)\n */\nexport interface DualLoopPIDConfig {\n /** Inner loop PID (fast: adjusts faucet rates) */\n innerLoop: PIDConfig;\n /** Outer loop PID (slow: adjusts inner loop setpoint based on total supply) */\n outerLoop: PIDConfig;\n /** Target total money supply */\n targetMoneySupply: number;\n /** Active player count (for per-capita targeting) */\n activePlayerCount: number;\n /** Per-capita money supply target */\n perCapitaTarget: number;\n}\n\n/**\n * State for the dual-loop PID controller.\n */\nexport interface DualLoopPIDState {\n innerState: PIDState;\n outerState: PIDState;\n /** Current effective faucet rate multiplier (0.0 - 2.0, where 1.0 = normal) */\n faucetMultiplier: number;\n}\n\n/**\n * Create initial dual-loop PID state.\n */\nexport function createDualLoopPIDState(): DualLoopPIDState {\n return {\n innerState: createPIDState(),\n outerState: createPIDState(),\n faucetMultiplier: 1.0,\n };\n}\n\n/**\n * Update the dual-loop PID controller.\n *\n * @param config Dual-loop configuration\n * @param state Current state (mutated in place)\n * @param totalMoneySupply Current total money supply\n * @param currentFaucetRate Current inflow rate\n * @param dt Time delta in seconds\n * @returns The new faucet rate multiplier\n */\nexport function updateDualLoopPID(\n config: DualLoopPIDConfig,\n state: DualLoopPIDState,\n totalMoneySupply: number,\n currentFaucetRate: number,\n dt: number\n): number {\n // Outer loop: adjust target based on total money supply vs. target\n const targetSupply = config.perCapitaTarget * config.activePlayerCount;\n const outerConfig = { ...config.outerLoop, setpoint: targetSupply };\n const outerOutput = updatePID(outerConfig, state.outerState, totalMoneySupply, dt);\n\n // Outer output adjusts inner loop setpoint (desired faucet rate)\n const desiredFaucetRate = currentFaucetRate * (1 + outerOutput * 0.1);\n\n // Inner loop: adjust faucet multiplier to achieve desired rate\n const innerConfig = { ...config.innerLoop, setpoint: desiredFaucetRate };\n const innerOutput = updatePID(innerConfig, state.innerState, currentFaucetRate, dt);\n\n // Convert inner output to faucet multiplier (0.0 - 2.0 range)\n state.faucetMultiplier = Math.max(0, Math.min(2, 1 + innerOutput));\n\n return state.faucetMultiplier;\n}\n\n// =============================================================================\n// FAUCET-SINK TRACKING\n// =============================================================================\n\n/**\n * Tracks the faucet/sink ratio -- the master variable for economy health (W.031).\n */\nexport interface FaucetSinkMetrics {\n /** Total currency created in the current period */\n totalFaucet: Currency;\n /** Total currency destroyed in the current period */\n totalSink: Currency;\n /** Current faucet/sink ratio (target: ~1.0) */\n ratio: number;\n /** Velocity of money (transactions per unit per period) */\n velocity: number;\n /** Period start timestamp */\n periodStart: number;\n /** Historical ratio samples */\n ratioHistory: number[];\n}\n\n/**\n * Create initial faucet-sink metrics.\n */\nexport function createFaucetSinkMetrics(timestamp: number): FaucetSinkMetrics {\n return {\n totalFaucet: 0,\n totalSink: 0,\n ratio: 1.0,\n velocity: 0,\n periodStart: timestamp,\n ratioHistory: [],\n };\n}\n\n/**\n * Record a faucet event (currency creation).\n */\nexport function recordFaucet(metrics: FaucetSinkMetrics, amount: Currency): void {\n metrics.totalFaucet += amount;\n metrics.ratio =\n metrics.totalSink > 0\n ? metrics.totalFaucet / metrics.totalSink\n : metrics.totalFaucet > 0\n ? Infinity\n : 1.0;\n}\n\n/**\n * Record a sink event (currency destruction).\n */\nexport function recordSink(metrics: FaucetSinkMetrics, amount: Currency): void {\n metrics.totalSink += amount;\n metrics.ratio =\n metrics.totalSink > 0\n ? metrics.totalFaucet / metrics.totalSink\n : metrics.totalFaucet > 0\n ? Infinity\n : 1.0;\n}\n\n/**\n * Reset metrics for a new period, archiving the current ratio.\n */\nexport function resetMetricsPeriod(metrics: FaucetSinkMetrics, timestamp: number): void {\n // Archive current ratio\n if (metrics.totalFaucet > 0 || metrics.totalSink > 0) {\n metrics.ratioHistory.push(metrics.ratio);\n // Keep last 100 periods\n if (metrics.ratioHistory.length > 100) {\n metrics.ratioHistory.shift();\n }\n }\n\n metrics.totalFaucet = 0;\n metrics.totalSink = 0;\n metrics.ratio = 1.0;\n metrics.velocity = 0;\n metrics.periodStart = timestamp;\n}\n"],"mappings":"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","names":[]}