@holoscript/std 6.0.3 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/{chunk-PFX2JM4X.js → chunk-FAMOLKH3.js} +2 -1
- package/dist/{chunk-PFX2JM4X.js.map → chunk-FAMOLKH3.js.map} +1 -1
- package/dist/{chunk-7HVUYGPS.js → chunk-SOKH6FJ7.js} +37 -5
- package/dist/chunk-SOKH6FJ7.js.map +1 -0
- package/dist/{chunk-W2Q3LUCM.js → chunk-XJIFG7G3.js} +3 -3
- package/dist/chunk-XJIFG7G3.js.map +1 -0
- package/dist/collections.cjs +1 -0
- package/dist/collections.cjs.map +1 -1
- package/dist/collections.js +2 -1
- package/dist/fs/fs.d.ts +288 -0
- package/dist/fs/fs.d.ts.map +1 -0
- package/dist/fs/index.cjs +1049 -0
- package/dist/fs/index.cjs.map +1 -0
- package/dist/fs/index.d.ts +51 -0
- package/dist/fs/index.d.ts.map +1 -0
- package/dist/fs/index.js +918 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/path.d.ts +135 -0
- package/dist/fs/path.d.ts.map +1 -0
- package/dist/fs/sandbox.d.ts +49 -0
- package/dist/fs/sandbox.d.ts.map +1 -0
- package/dist/fs/watch.d.ts +133 -0
- package/dist/fs/watch.d.ts.map +1 -0
- package/dist/index.cjs +54 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/math.cjs +21 -2
- package/dist/math.cjs.map +1 -1
- package/dist/math.js +2 -1
- package/dist/string.cjs +2 -2
- package/dist/string.cjs.map +1 -1
- package/dist/string.js +2 -1
- package/dist/time.js +1 -0
- package/dist/traits/EconomicPrimitives.js +1 -0
- package/dist/traits/EconomicTraits.js +1 -0
- package/dist/traits/VRRTraits.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +24 -9
- package/CHANGELOG.md +0 -7
- package/dist/__tests__/EconomicPrimitives.test.d.ts +0 -2
- package/dist/__tests__/EconomicPrimitives.test.d.ts.map +0 -1
- package/dist/__tests__/EconomicTraits.test.d.ts +0 -2
- package/dist/__tests__/EconomicTraits.test.d.ts.map +0 -1
- package/dist/__tests__/SimulationLabPrimitives.test.d.ts +0 -2
- package/dist/__tests__/SimulationLabPrimitives.test.d.ts.map +0 -1
- package/dist/__tests__/collections.test.d.ts +0 -2
- package/dist/__tests__/collections.test.d.ts.map +0 -1
- package/dist/__tests__/events.test.d.ts +0 -2
- package/dist/__tests__/events.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/materials.test.d.ts +0 -2
- package/dist/__tests__/materials.test.d.ts.map +0 -1
- package/dist/__tests__/math.test.d.ts +0 -2
- package/dist/__tests__/math.test.d.ts.map +0 -1
- package/dist/__tests__/physics.test.d.ts +0 -2
- package/dist/__tests__/physics.test.d.ts.map +0 -1
- package/dist/__tests__/spatial.test.d.ts +0 -2
- package/dist/__tests__/spatial.test.d.ts.map +0 -1
- package/dist/__tests__/standard-library-fundamentals.test.d.ts +0 -2
- package/dist/__tests__/standard-library-fundamentals.test.d.ts.map +0 -1
- package/dist/__tests__/string-and-time-utilities.test.d.ts +0 -2
- package/dist/__tests__/string-and-time-utilities.test.d.ts.map +0 -1
- package/dist/__tests__/string-decoupled.test.d.ts +0 -2
- package/dist/__tests__/string-decoupled.test.d.ts.map +0 -1
- package/dist/__tests__/string.test.d.ts +0 -2
- package/dist/__tests__/string.test.d.ts.map +0 -1
- package/dist/__tests__/time.test.d.ts +0 -2
- package/dist/__tests__/time.test.d.ts.map +0 -1
- package/dist/chunk-7HVUYGPS.js.map +0 -1
- package/dist/chunk-W2Q3LUCM.js.map +0 -1
- package/dist/string.basic.test.d.ts +0 -5
- package/dist/string.basic.test.d.ts.map +0 -1
- package/dist/string.test.d.ts +0 -5
- package/dist/string.test.d.ts.map +0 -1
- package/dist/traits/__tests__/ARTraits.test.d.ts +0 -2
- package/dist/traits/__tests__/ARTraits.test.d.ts.map +0 -1
- package/dist/traits/__tests__/EconomicPrimitives.test.d.ts +0 -2
- package/dist/traits/__tests__/EconomicPrimitives.test.d.ts.map +0 -1
- package/dist/traits/__tests__/EconomicTraits.test.d.ts +0 -2
- package/dist/traits/__tests__/EconomicTraits.test.d.ts.map +0 -1
- package/error-utf8.log +0 -6
- package/error.log +0 -0
- package/src/__tests__/EconomicPrimitives.test.ts +0 -690
- package/src/__tests__/EconomicTraits.test.ts +0 -425
- package/src/__tests__/SimulationLabPrimitives.test.ts +0 -415
- package/src/__tests__/collections.test.ts +0 -182
- package/src/__tests__/events.test.ts +0 -135
- package/src/__tests__/index.test.ts +0 -14
- package/src/__tests__/materials.test.ts +0 -84
- package/src/__tests__/math.test.ts +0 -246
- package/src/__tests__/physics.test.ts +0 -83
- package/src/__tests__/spatial.test.ts +0 -333
- package/src/__tests__/standard-library-fundamentals.test.ts +0 -1301
- package/src/__tests__/string-and-time-utilities.test.ts +0 -1070
- package/src/__tests__/string-decoupled.test.ts +0 -14
- package/src/__tests__/string.test.ts +0 -164
- package/src/__tests__/time.test.ts +0 -110
- package/src/collections.ts +0 -850
- package/src/events.ts +0 -88
- package/src/index.ts +0 -474
- package/src/materials.ts +0 -109
- package/src/math.ts +0 -674
- package/src/physics.ts +0 -141
- package/src/spatial.ts +0 -320
- package/src/string.basic.test.ts +0 -14
- package/src/string.test.ts +0 -335
- package/src/string.ts +0 -531
- package/src/time.ts +0 -621
- package/src/traits/ARTraits.ts +0 -103
- package/src/traits/EconomicPrimitives.ts +0 -755
- package/src/traits/EconomicTraits.ts +0 -552
- package/src/traits/IoTTraits.ts +0 -102
- package/src/traits/SimulationLabPrimitives.ts +0 -650
- package/src/traits/SimulationLabTraits.ts +0 -191
- package/src/traits/VRRTraits.ts +0 -326
- package/src/traits/__tests__/ARTraits.test.ts +0 -14
- package/src/traits/__tests__/EconomicPrimitives.test.ts +0 -14
- package/src/traits/__tests__/EconomicTraits.test.ts +0 -14
- package/src/types.ts +0 -411
- package/std_error.log +0 -5
- package/tsconfig.json +0 -18
- package/tsup.config.ts +0 -17
- package/vitest.config.ts +0 -10
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/spatial.ts","../src/physics.ts","../src/materials.ts","../src/events.ts","../src/math.ts","../src/collections.ts","../src/string.ts","../src/traits/EconomicPrimitives.ts","../src/traits/EconomicTraits.ts","../src/traits/SimulationLabPrimitives.ts","../src/traits/SimulationLabTraits.ts","../src/time.ts"],"sourcesContent":["/**\n * @holoscript/std - Standard Library for HoloScript Plus\n *\n * Provides core types, math utilities, collections, string operations,\n * time management, spatial math, physics primitives, materials, and events\n * for HoloScript Plus programs.\n *\n * @example\n * ```hsplus\n * import { Vec3, createPBRMaterial, EventBus } from \"@holoscript/std\";\n *\n * let position = Vec3(0, 1, 0);\n * let steel = createPBRMaterial(\"Steel\", \"metal\");\n * let bus = new EventBus();\n * ```\n */\n\n// Re-export everything from types.js\nexport * from './types.js';\n\n// Spatial math (v4.2)\nexport {\n Vec3,\n Quaternion,\n Transform,\n Ray,\n AABB,\n distance,\n lerp as spatialLerp,\n clamp as spatialClamp,\n degToRad as spatialDegToRad,\n radToDeg as spatialRadToDeg,\n} from './spatial.js';\n\n// Physics primitives (v4.2)\nexport {\n createBoxCollider,\n createSphereCollider,\n createCapsuleCollider,\n createRigidbody,\n} from './physics.js';\nexport type {\n ColliderConfig,\n ColliderShapeType,\n RigidbodyConfig,\n ForceFieldConfig,\n ForceFieldType,\n JointConfig,\n JointType,\n RaycastHit,\n} from './physics.js';\n\n// Materials (v4.2)\nexport { MATERIAL_PRESETS, createPBRMaterial } from './materials.js';\nexport type { PBRMaterial, UnlitMaterial, TextureMapType, TextureConfig } from './materials.js';\n\n// Events (v4.2)\nexport { EventBus } from './events.js';\nexport type { EventHandler } from './events.js';\n\n// Math utilities - export objects from math.ts\nexport {\n // Constants\n PI,\n TAU,\n HALF_PI,\n EPSILON,\n DEG_TO_RAD,\n RAD_TO_DEG,\n\n // Basic math functions\n clamp,\n lerp,\n inverseLerp,\n remap,\n smoothstep,\n smootherstep,\n sign,\n fract,\n mod,\n step,\n degToRad,\n radToDeg,\n\n // Math utility objects (access methods like vec2Math.add(), vec3Math.cross(), etc.)\n vec2Math,\n vec3Math,\n quatMath,\n aabbMath,\n noise,\n random,\n} from './math.js';\n\n// Re-export with alternate names for convenience\nexport { degToRad as toRadians, radToDeg as toDegrees } from './math.js';\n\n// Collections\nexport {\n List,\n HoloMap,\n HoloSet,\n HoloMap as Map,\n HoloSet as Set,\n SpatialGrid,\n PriorityQueue,\n} from './collections.js';\n\n// String utilities\nexport {\n isBlank,\n isNotBlank,\n capitalize,\n titleCase,\n camelCase,\n pascalCase,\n snakeCase,\n kebabCase,\n constantCase,\n padLeft,\n padRight,\n center,\n truncate,\n truncateMiddle,\n repeat,\n reverse,\n count,\n containsIgnoreCase,\n startsWithIgnoreCase,\n endsWithIgnoreCase,\n removeWhitespace,\n collapseWhitespace,\n removePrefix,\n removeSuffix,\n wrap as wrapString,\n unwrap,\n lines,\n words,\n chars,\n join,\n format,\n formatNumber,\n numberWithCommas,\n formatBytes,\n formatDuration,\n escapeHtml,\n unescapeHtml,\n escapeRegex,\n slugify,\n isValidIdentifier,\n isNumeric,\n isAlphanumeric,\n isAlpha,\n randomString,\n uuid,\n indent,\n dedent,\n wordWrap,\n levenshtein,\n similarity,\n extractTraits,\n} from './string.js';\n\n// Economic primitives (v4.3)\nexport {\n // Tradeable\n generateTxHash,\n executeTrade,\n // Depreciation\n calculateDepreciation,\n depreciatedValue,\n isDestroyed,\n calculateRepairCost,\n DEFAULT_DEPRECIATION,\n // Bonding curves\n bondingCurvePrice,\n bondingCurveBuyCost,\n bondingCurveSellRefund,\n spatialPrice,\n DEFAULT_BONDING_CURVE,\n // Wealth taxation\n calculateTaxRate,\n calculateTaxAmount,\n calculateRedistribution,\n DEFAULT_WEALTH_TAX,\n // PID control\n createPIDState,\n updatePID,\n createDualLoopPIDState,\n updateDualLoopPID,\n DEFAULT_PID,\n // Faucet-sink tracking\n createFaucetSinkMetrics,\n recordFaucet,\n recordSink,\n resetMetricsPeriod,\n} from './traits/EconomicPrimitives.js';\nexport type {\n Currency,\n AgentID,\n EconomicResult,\n EconomicError,\n EconomicPermission,\n OwnershipRecord,\n TransferRecord,\n DepreciationConfig,\n BondingCurveType,\n BondingCurveConfig,\n WealthTaxConfig,\n PIDConfig,\n PIDState,\n DualLoopPIDConfig,\n DualLoopPIDState,\n FaucetSinkMetrics,\n} from './traits/EconomicPrimitives.js';\n\n// Economic traits (v4.3)\nexport {\n EconomicTraits,\n getEconomicTraitNames,\n getEconomicTrait,\n validateTraitComposition,\n getRequiredPermissions,\n} from './traits/EconomicTraits.js';\nexport type { EconomicTraitDefinition } from './traits/EconomicTraits.js';\n\n// SimulationLab primitives (v4.3)\nexport {\n // Statistics\n mean,\n variance,\n standardDeviation,\n standardError,\n cohensD,\n // Statistical tests\n tTest,\n oneSampleTTest,\n mannWhitneyU,\n chiSquaredTest,\n // Parameter sweeps\n expandSweep,\n generateSweepCombinations,\n isParameterRange,\n // Metric aggregation\n extractMetric,\n groupByParameter,\n summarizeMetrics,\n} from './traits/SimulationLabPrimitives.js';\nexport type {\n Hypothesis,\n HypothesisDirection,\n SimulationStatus,\n ParameterRange,\n ParameterSet,\n ParameterSweep,\n SimulationMetrics,\n StatisticalResult,\n ExperimentResult,\n} from './traits/SimulationLabPrimitives.js';\n\n// SimulationLab traits (v4.3)\nexport {\n SimulationLabTraits,\n getSimulationTraitNames,\n getSimulationTrait,\n} from './traits/SimulationLabTraits.js';\nexport type { SimulationTraitDefinition } from './traits/SimulationLabTraits.js';\n\n// Time utilities\nexport {\n now,\n hrTime,\n sleep,\n waitUntil,\n withTimeout,\n retry,\n debounce,\n throttle,\n measure,\n timed,\n Stopwatch,\n IntervalTimer,\n CountdownTimer,\n FrameTimer,\n schedule,\n scheduleInterval,\n scheduleFrame,\n createTicker,\n DateTime,\n} from './time.js';\n\n/**\n * Print to console (HoloScript standard output)\n */\nexport function print(...args: unknown[]): void {\n console.log(...args);\n}\n\n/**\n * Print error to console\n */\nexport function printError(...args: unknown[]): void {\n console.error(...args);\n}\n\n/**\n * Print warning to console\n */\nexport function printWarn(...args: unknown[]): void {\n console.warn(...args);\n}\n\n/**\n * Assert a condition is true\n */\nexport function assert(condition: boolean, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ?? 'Assertion failed');\n }\n}\n\n/**\n * Assert a value is not null or undefined\n */\nexport function assertDefined<T>(\n value: T | null | undefined,\n message?: string\n): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message ?? 'Value is null or undefined');\n }\n}\n\n/**\n * Unreachable code marker (for exhaustiveness checking)\n */\nexport function unreachable(message?: string): never {\n throw new Error(message ?? 'Unreachable code reached');\n}\n\n/**\n * Todo marker (throws at runtime)\n */\nexport function todo(message?: string): never {\n throw new Error(`TODO: ${message ?? 'Not implemented'}`);\n}\n\n/**\n * Deep clone an object\n */\nexport function clone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(clone) as T;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n if (value instanceof Map) {\n return new Map([...value].map(([k, v]) => [clone(k), clone(v)])) as T;\n }\n\n if (value instanceof Set) {\n return new Set([...value].map(clone)) as T;\n }\n\n const result: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n result[key] = clone((value as Record<string, unknown>)[key]);\n }\n }\n return result as T;\n}\n\n/**\n * Deep equality check\n */\nexport function equals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (typeof a !== 'object') return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => equals(item, b[i]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equals(value, b.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a) {\n if (!b.has(value)) return false;\n }\n return true;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b as object);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) =>\n equals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n}\n\n/**\n * Pipe a value through a series of functions\n */\nexport function pipe<A>(value: A): A;\nexport function pipe<A, B>(value: A, fn1: (a: A) => B): B;\nexport function pipe<A, B, C>(value: A, fn1: (a: A) => B, fn2: (b: B) => C): C;\nexport function pipe<A, B, C, D>(value: A, fn1: (a: A) => B, fn2: (b: B) => C, fn3: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n value: A,\n fn1: (a: A) => B,\n fn2: (b: B) => C,\n fn3: (c: C) => D,\n fn4: (d: D) => E\n): E;\nexport function pipe(value: unknown, ...fns: ((x: unknown) => unknown)[]): unknown {\n return fns.reduce((acc, fn) => fn(acc), value);\n}\n\n/**\n * Compose functions right to left\n */\nexport function compose<A>(): (a: A) => A;\nexport function compose<A, B>(fn1: (a: A) => B): (a: A) => B;\nexport function compose<A, B, C>(fn2: (b: B) => C, fn1: (a: A) => B): (a: A) => C;\nexport function compose<A, B, C, D>(\n fn3: (c: C) => D,\n fn2: (b: B) => C,\n fn1: (a: A) => B\n): (a: A) => D;\nexport function compose(...fns: ((x: unknown) => unknown)[]): (x: unknown) => unknown {\n return (value: unknown) => fns.reduceRight((acc, fn) => fn(acc), value);\n}\n\n/**\n * Identity function\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n\n/**\n * No-operation function\n */\nexport function noop(): void {}\n\n/**\n * Create a constant function\n */\nexport function constant<T>(value: T): () => T {\n return () => value;\n}\n","/**\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 * @holoscript/std — Spatial Module\n *\n * Provides spatial math utilities: Vec3, Quaternion, Transform, Ray, AABB, distance.\n * Used by the HoloScript runtime for spatial computing operations.\n *\n * @version 0.2.0\n * @module @holoscript/std/spatial\n */\n\n// =============================================================================\n// Vec3\n// =============================================================================\n\nexport class Vec3 {\n constructor(\n public x: number = 0,\n public y: number = 0,\n public z: number = 0\n ) {}\n\n static zero(): Vec3 {\n return new Vec3(0, 0, 0);\n }\n static one(): Vec3 {\n return new Vec3(1, 1, 1);\n }\n static up(): Vec3 {\n return new Vec3(0, 1, 0);\n }\n static down(): Vec3 {\n return new Vec3(0, -1, 0);\n }\n static forward(): Vec3 {\n return new Vec3(0, 0, -1);\n }\n static right(): Vec3 {\n return new Vec3(1, 0, 0);\n }\n\n add(other: Vec3): Vec3 {\n return new Vec3(this.x + other.x, this.y + other.y, this.z + other.z);\n }\n sub(other: Vec3): Vec3 {\n return new Vec3(this.x - other.x, this.y - other.y, this.z - other.z);\n }\n mul(s: number): Vec3 {\n return new Vec3(this.x * s, this.y * s, this.z * s);\n }\n div(s: number): Vec3 {\n return new Vec3(this.x / s, this.y / s, this.z / s);\n }\n\n dot(other: Vec3): number {\n return this.x * other.x + this.y * other.y + this.z * other.z;\n }\n cross(other: Vec3): Vec3 {\n return new Vec3(\n this.y * other.z - this.z * other.y,\n this.z * other.x - this.x * other.z,\n this.x * other.y - this.y * other.x\n );\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n normalize(): Vec3 {\n const l = this.length();\n return l > 0 ? this.div(l) : Vec3.zero();\n }\n\n distanceTo(other: Vec3): number {\n return this.sub(other).length();\n }\n lerp(other: Vec3, t: number): Vec3 {\n return this.add(other.sub(this).mul(t));\n }\n\n toArray(): [number, number, number] {\n return [this.x, this.y, this.z];\n }\n static fromArray(arr: number[]): Vec3 {\n return new Vec3(arr[0] || 0, arr[1] || 0, arr[2] || 0);\n }\n\n equals(other: Vec3, epsilon = 1e-6): boolean {\n return (\n Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.z - other.z) < epsilon\n );\n }\n\n toString(): string {\n return `Vec3(${this.x}, ${this.y}, ${this.z})`;\n }\n}\n\n// =============================================================================\n// Quaternion\n// =============================================================================\n\nexport class Quaternion {\n constructor(\n public x = 0,\n public y = 0,\n public z = 0,\n public w = 1\n ) {}\n\n static identity(): Quaternion {\n return new Quaternion(0, 0, 0, 1);\n }\n\n static fromEuler(x: number, y: number, z: number): Quaternion {\n const cx = Math.cos(x * 0.5),\n sx = Math.sin(x * 0.5);\n const cy = Math.cos(y * 0.5),\n sy = Math.sin(y * 0.5);\n const cz = Math.cos(z * 0.5),\n sz = Math.sin(z * 0.5);\n return new Quaternion(\n sx * cy * cz - cx * sy * sz,\n cx * sy * cz + sx * cy * sz,\n cx * cy * sz - sx * sy * cz,\n cx * cy * cz + sx * sy * sz\n );\n }\n\n static fromAxisAngle(axis: Vec3, angle: number): Quaternion {\n const half = angle * 0.5;\n const s = Math.sin(half);\n const n = axis.normalize();\n return new Quaternion(n.x * s, n.y * s, n.z * s, Math.cos(half));\n }\n\n multiply(other: Quaternion): Quaternion {\n return new Quaternion(\n this.w * other.x + this.x * other.w + this.y * other.z - this.z * other.y,\n this.w * other.y - this.x * other.z + this.y * other.w + this.z * other.x,\n this.w * other.z + this.x * other.y - this.y * other.x + this.z * other.w,\n this.w * other.w - this.x * other.x - this.y * other.y - this.z * other.z\n );\n }\n\n rotateVec3(v: Vec3): Vec3 {\n const u = new Vec3(this.x, this.y, this.z);\n const s = this.w;\n return u\n .mul(2 * u.dot(v))\n .add(v.mul(s * s - u.dot(u)))\n .add(u.cross(v).mul(2 * s));\n }\n\n slerp(other: Quaternion, t: number): Quaternion {\n let dot = this.x * other.x + this.y * other.y + this.z * other.z + this.w * other.w;\n const neg = dot < 0;\n if (neg) dot = -dot;\n if (dot > 0.9995) {\n // Linear interpolation for very close quaternions\n const r = new Quaternion(\n this.x + t * ((neg ? -other.x : other.x) - this.x),\n this.y + t * ((neg ? -other.y : other.y) - this.y),\n this.z + t * ((neg ? -other.z : other.z) - this.z),\n this.w + t * ((neg ? -other.w : other.w) - this.w)\n );\n const len = Math.sqrt(r.x * r.x + r.y * r.y + r.z * r.z + r.w * r.w);\n return new Quaternion(r.x / len, r.y / len, r.z / len, r.w / len);\n }\n const theta = Math.acos(dot);\n const sinTheta = Math.sin(theta);\n const a = Math.sin((1 - t) * theta) / sinTheta;\n const b = (Math.sin(t * theta) / sinTheta) * (neg ? -1 : 1);\n return new Quaternion(\n a * this.x + b * other.x,\n a * this.y + b * other.y,\n a * this.z + b * other.z,\n a * this.w + b * other.w\n );\n }\n\n normalize(): Quaternion {\n const len = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n return new Quaternion(this.x / len, this.y / len, this.z / len, this.w / len);\n }\n\n toEuler(): Vec3 {\n const sinr = 2 * (this.w * this.x + this.y * this.z);\n const cosr = 1 - 2 * (this.x * this.x + this.y * this.y);\n const sinp = 2 * (this.w * this.y - this.z * this.x);\n const siny = 2 * (this.w * this.z + this.x * this.y);\n const cosy = 1 - 2 * (this.y * this.y + this.z * this.z);\n return new Vec3(\n Math.atan2(sinr, cosr),\n Math.abs(sinp) >= 1 ? (Math.sign(sinp) * Math.PI) / 2 : Math.asin(sinp),\n Math.atan2(siny, cosy)\n );\n }\n}\n\n// =============================================================================\n// Transform\n// =============================================================================\n\nexport class Transform {\n constructor(\n public position: Vec3 = Vec3.zero(),\n public rotation: Quaternion = Quaternion.identity(),\n public scale: Vec3 = Vec3.one()\n ) {}\n\n static identity(): Transform {\n return new Transform();\n }\n\n transformPoint(point: Vec3): Vec3 {\n const scaled = new Vec3(point.x * this.scale.x, point.y * this.scale.y, point.z * this.scale.z);\n return this.rotation.rotateVec3(scaled).add(this.position);\n }\n\n transformDirection(dir: Vec3): Vec3 {\n return this.rotation.rotateVec3(dir);\n }\n}\n\n// =============================================================================\n// Ray & AABB\n// =============================================================================\n\nexport class Ray {\n constructor(\n public origin: Vec3,\n public direction: Vec3\n ) {}\n\n pointAt(t: number): Vec3 {\n return this.origin.add(this.direction.mul(t));\n }\n}\n\nexport class AABB {\n constructor(\n public min: Vec3,\n public max: Vec3\n ) {}\n\n contains(point: Vec3): boolean {\n return (\n point.x >= this.min.x &&\n point.x <= this.max.x &&\n point.y >= this.min.y &&\n point.y <= this.max.y &&\n point.z >= this.min.z &&\n point.z <= this.max.z\n );\n }\n\n intersects(other: AABB): boolean {\n return (\n this.min.x <= other.max.x &&\n this.max.x >= other.min.x &&\n this.min.y <= other.max.y &&\n this.max.y >= other.min.y &&\n this.min.z <= other.max.z &&\n this.max.z >= other.min.z\n );\n }\n\n center(): Vec3 {\n return this.min.add(this.max).div(2);\n }\n size(): Vec3 {\n return this.max.sub(this.min);\n }\n\n intersectsRay(ray: Ray): number | null {\n let tmin = (this.min.x - ray.origin.x) / ray.direction.x;\n let tmax = (this.max.x - ray.origin.x) / ray.direction.x;\n if (tmin > tmax) [tmin, tmax] = [tmax, tmin];\n\n let tymin = (this.min.y - ray.origin.y) / ray.direction.y;\n let tymax = (this.max.y - ray.origin.y) / ray.direction.y;\n if (tymin > tymax) [tymin, tymax] = [tymax, tymin];\n\n if (tmin > tymax || tymin > tmax) return null;\n tmin = Math.max(tmin, tymin);\n tmax = Math.min(tmax, tymax);\n\n let tzmin = (this.min.z - ray.origin.z) / ray.direction.z;\n let tzmax = (this.max.z - ray.origin.z) / ray.direction.z;\n if (tzmin > tzmax) [tzmin, tzmax] = [tzmax, tzmin];\n\n if (tmin > tzmax || tzmin > tmax) return null;\n return Math.max(tmin, tzmin);\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nexport function distance(a: Vec3, b: Vec3): number {\n return a.distanceTo(b);\n}\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\nexport function degToRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number): number {\n return rad * (180 / Math.PI);\n}\n","/**\n * @holoscript/std — Physics Module\n *\n * Provides physics primitives: ColliderShape, RigidbodyConfig, ForceField, Joint.\n * Runtime representations for HoloScript physics blocks.\n *\n * @version 0.2.0\n * @module @holoscript/std/physics\n */\n\nimport type { Vec3 } from './spatial.js';\n\n// =============================================================================\n// Collider Shapes\n// =============================================================================\n\nexport type ColliderShapeType =\n | 'box'\n | 'sphere'\n | 'capsule'\n | 'mesh'\n | 'convex'\n | 'cylinder'\n | 'heightfield';\n\nexport interface ColliderConfig {\n shape: ColliderShapeType;\n isTrigger: boolean;\n friction: number;\n restitution: number;\n // Shape-specific\n radius?: number;\n halfExtents?: Vec3;\n height?: number;\n meshAsset?: string;\n}\n\nexport function createBoxCollider(\n halfExtents: Vec3,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return {\n shape: 'box',\n isTrigger: false,\n friction: 0.5,\n restitution: 0.0,\n halfExtents,\n ...options,\n };\n}\n\nexport function createSphereCollider(\n radius: number,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return { shape: 'sphere', isTrigger: false, friction: 0.5, restitution: 0.0, radius, ...options };\n}\n\nexport function createCapsuleCollider(\n radius: number,\n height: number,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return {\n shape: 'capsule',\n isTrigger: false,\n friction: 0.5,\n restitution: 0.0,\n radius,\n height,\n ...options,\n };\n}\n\n// =============================================================================\n// Rigidbody\n// =============================================================================\n\nexport interface RigidbodyConfig {\n mass: number;\n useGravity: boolean;\n linearDamping: number;\n angularDamping: number;\n freezePosition: [boolean, boolean, boolean];\n freezeRotation: [boolean, boolean, boolean];\n isKinematic: boolean;\n}\n\nexport function createRigidbody(mass: number, options?: Partial<RigidbodyConfig>): RigidbodyConfig {\n return {\n mass,\n useGravity: true,\n linearDamping: 0.0,\n angularDamping: 0.05,\n freezePosition: [false, false, false],\n freezeRotation: [false, false, false],\n isKinematic: false,\n ...options,\n };\n}\n\n// =============================================================================\n// Force Fields\n// =============================================================================\n\nexport type ForceFieldType = 'directional' | 'radial' | 'vortex' | 'buoyancy';\n\nexport interface ForceFieldConfig {\n type: ForceFieldType;\n strength: number;\n direction?: Vec3;\n falloff: 'none' | 'linear' | 'quadratic';\n turbulence: number;\n}\n\n// =============================================================================\n// Joints\n// =============================================================================\n\nexport type JointType = 'hinge' | 'slider' | 'ball_socket' | 'fixed' | 'd6' | 'spring';\n\nexport interface JointConfig {\n type: JointType;\n connectedBody?: string;\n axis?: Vec3;\n limits?: [number, number];\n damping: number;\n springForce?: number;\n breakForce?: number;\n}\n\n// =============================================================================\n// Raycast Utility\n// =============================================================================\n\nexport interface RaycastHit {\n point: Vec3;\n normal: Vec3;\n distance: number;\n objectName: string;\n}\n","/**\n * @holoscript/std — Materials Module\n *\n * Provides PBR material types, texture map definitions, and material presets.\n * Maps directly to HoloScript material_block grammar constructs.\n *\n * @version 0.2.0\n * @module @holoscript/std/materials\n */\n\n// =============================================================================\n// PBR Material\n// =============================================================================\n\nexport interface PBRMaterial {\n name: string;\n baseColor: string; // hex color\n roughness: number; // 0.0 - 1.0\n metallic: number; // 0.0 - 1.0\n emissiveColor?: string;\n emissiveIntensity?: number;\n opacity?: number; // 0.0 - 1.0\n ior?: number; // Index of refraction (glass ~1.5, water ~1.33)\n subsurface?: number;\n clearcoat?: number;\n clearcoatRoughness?: number;\n // Texture maps\n albedoMap?: string;\n normalMap?: string;\n roughnessMap?: string;\n metallicMap?: string;\n emissionMap?: string;\n aoMap?: string;\n heightMap?: string;\n opacityMap?: string;\n displacementMap?: string;\n}\n\nexport interface UnlitMaterial {\n name: string;\n color: string;\n emissiveColor?: string;\n emissiveIntensity?: number;\n opacity?: number;\n texture?: string;\n}\n\n// =============================================================================\n// Material Presets\n// =============================================================================\n\nexport const MATERIAL_PRESETS: Record<string, Partial<PBRMaterial>> = {\n metal: { roughness: 0.2, metallic: 1.0 },\n wood: { roughness: 0.85, metallic: 0.0, baseColor: '#8B6914' },\n glass: { roughness: 0.05, metallic: 0.0, opacity: 0.3, ior: 1.5 },\n plastic: { roughness: 0.4, metallic: 0.0 },\n concrete: { roughness: 0.95, metallic: 0.0, baseColor: '#808080' },\n fabric: { roughness: 0.9, metallic: 0.0, subsurface: 0.2 },\n water: { roughness: 0.05, metallic: 0.0, opacity: 0.7, ior: 1.33 },\n rubber: { roughness: 0.95, metallic: 0.0, baseColor: '#222222' },\n marble: { roughness: 0.3, metallic: 0.0, baseColor: '#f0f0f0' },\n skin: { roughness: 0.6, metallic: 0.0, subsurface: 0.5 },\n foliage: { roughness: 0.8, metallic: 0.0, baseColor: '#2d5a27', subsurface: 0.3 },\n chrome: { roughness: 0.05, metallic: 1.0, baseColor: '#cccccc' },\n gold: { roughness: 0.2, metallic: 1.0, baseColor: '#ffd700' },\n copper: { roughness: 0.3, metallic: 1.0, baseColor: '#b87333' },\n ice: { roughness: 0.1, metallic: 0.0, opacity: 0.8, ior: 1.31 },\n};\n\nexport function createPBRMaterial(\n name: string,\n preset?: keyof typeof MATERIAL_PRESETS,\n overrides?: Partial<PBRMaterial>\n): PBRMaterial {\n const base = preset ? MATERIAL_PRESETS[preset] : {};\n return {\n name,\n baseColor: '#ffffff',\n roughness: 0.5,\n metallic: 0.0,\n ...base,\n ...overrides,\n };\n}\n\n// =============================================================================\n// Texture Map Types\n// =============================================================================\n\nexport type TextureMapType =\n | 'albedo_map'\n | 'normal_map'\n | 'roughness_map'\n | 'metallic_map'\n | 'emission_map'\n | 'ao_map'\n | 'height_map'\n | 'opacity_map'\n | 'displacement_map'\n | 'specular_map'\n | 'clearcoat_map';\n\nexport interface TextureConfig {\n source: string;\n tiling?: [number, number];\n offset?: [number, number];\n filter?: 'linear' | 'nearest';\n wrap?: 'repeat' | 'clamp' | 'mirror';\n}\n","/**\n * @holoscript/std — Events Module\n *\n * Provides a typed event bus for HoloScript compositions.\n * Supports emit, on, once, off, and wildcard listeners.\n *\n * @version 0.2.0\n * @module @holoscript/std/events\n */\n\nexport type EventHandler<T = any> = (data: T) => void;\n\ninterface Listener {\n handler: EventHandler;\n once: boolean;\n}\n\nexport class EventBus {\n private listeners: Map<string, Listener[]> = new Map();\n private wildcardListeners: Listener[] = [];\n\n /** Register an event listener. */\n on<T = any>(event: string, handler: EventHandler<T>): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, []);\n const listener: Listener = { handler, once: false };\n this.listeners.get(event)!.push(listener);\n return () => this.off(event, handler);\n }\n\n /** Register a one-time event listener. */\n once<T = any>(event: string, handler: EventHandler<T>): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, []);\n const listener: Listener = { handler, once: true };\n this.listeners.get(event)!.push(listener);\n return () => this.off(event, handler);\n }\n\n /** Remove an event listener. */\n off(event: string, handler: EventHandler): void {\n const list = this.listeners.get(event);\n if (!list) return;\n this.listeners.set(\n event,\n list.filter((l) => l.handler !== handler)\n );\n }\n\n /** Emit an event to all registered listeners. */\n emit<T = any>(event: string, data?: T): void {\n // Fire specific listeners\n const list = this.listeners.get(event);\n if (list) {\n const remaining: Listener[] = [];\n for (const l of list) {\n l.handler(data);\n if (!l.once) remaining.push(l);\n }\n this.listeners.set(event, remaining);\n }\n // Fire wildcard listeners\n for (const l of this.wildcardListeners) {\n l.handler({ event, data });\n }\n }\n\n /** Listen to all events. */\n onAny(handler: EventHandler<{ event: string; data: any }>): () => void {\n const listener: Listener = { handler, once: false };\n this.wildcardListeners.push(listener);\n return () => {\n this.wildcardListeners = this.wildcardListeners.filter((l) => l !== listener);\n };\n }\n\n /** Remove all listeners. */\n clear(): void {\n this.listeners.clear();\n this.wildcardListeners = [];\n }\n\n /** Get count of listeners for an event (or all events). */\n listenerCount(event?: string): number {\n if (event) return (this.listeners.get(event) || []).length;\n let total = this.wildcardListeners.length;\n for (const [, list] of this.listeners) total += list.length;\n return total;\n }\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","/**\n * @holoscript/std - Collections Module\n *\n * Provides List, Map, and Set implementations with functional operations\n * for use in HoloScript Plus programs.\n */\n\nimport type { Vec3 } from './types.js';\n\n/**\n * Immutable List with functional operations\n */\nexport class List<T> {\n private readonly items: readonly T[];\n\n constructor(items: Iterable<T> = []) {\n this.items = Array.from(items);\n }\n\n static of<T>(...items: T[]): List<T> {\n return new List(items);\n }\n\n static from<T>(iterable: Iterable<T>): List<T> {\n return new List(iterable);\n }\n\n static range(start: number, end: number, step = 1): List<number> {\n const items: number[] = [];\n for (let i = start; step > 0 ? i < end : i > end; i += step) {\n items.push(i);\n }\n return new List(items);\n }\n\n static repeat<T>(value: T, count: number): List<T> {\n return new List(Array(count).fill(value));\n }\n\n get length(): number {\n return this.items.length;\n }\n\n get isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n get(index: number): T | undefined {\n return index < 0 ? this.items[this.items.length + index] : this.items[index];\n }\n\n first(): T | undefined {\n return this.items[0];\n }\n\n last(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n map<U>(fn: (item: T, index: number) => U): List<U> {\n return new List(this.items.map(fn));\n }\n\n flatMap<U>(fn: (item: T, index: number) => List<U> | U[]): List<U> {\n const result: U[] = [];\n this.items.forEach((item, index) => {\n const mapped = fn(item, index);\n if (mapped instanceof List) {\n result.push(...mapped.toArray());\n } else {\n result.push(...mapped);\n }\n });\n return new List(result);\n }\n\n filter(predicate: (item: T, index: number) => boolean): List<T> {\n return new List(this.items.filter(predicate));\n }\n\n reject(predicate: (item: T, index: number) => boolean): List<T> {\n return this.filter((item, index) => !predicate(item, index));\n }\n\n reduce<U>(fn: (acc: U, item: T, index: number) => U, initial: U): U {\n return this.items.reduce(fn, initial);\n }\n\n fold<U>(initial: U, fn: (acc: U, item: T) => U): U {\n return this.items.reduce(fn, initial);\n }\n\n find(predicate: (item: T, index: number) => boolean): T | undefined {\n return this.items.find(predicate);\n }\n\n findIndex(predicate: (item: T, index: number) => boolean): number {\n return this.items.findIndex(predicate);\n }\n\n indexOf(item: T): number {\n return this.items.indexOf(item);\n }\n\n includes(item: T): boolean {\n return this.items.includes(item);\n }\n\n some(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.some(predicate);\n }\n\n every(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.every(predicate);\n }\n\n none(predicate: (item: T, index: number) => boolean): boolean {\n return !this.some(predicate);\n }\n\n count(predicate: (item: T, index: number) => boolean): number {\n return this.filter(predicate).length;\n }\n\n forEach(fn: (item: T, index: number) => void): void {\n this.items.forEach(fn);\n }\n\n concat(...lists: (List<T> | T[])[]): List<T> {\n const arrays = lists.map((l) => (l instanceof List ? l.toArray() : l));\n return new List([...this.items, ...arrays.flat()]);\n }\n\n append(item: T): List<T> {\n return new List([...this.items, item]);\n }\n\n prepend(item: T): List<T> {\n return new List([item, ...this.items]);\n }\n\n insert(index: number, item: T): List<T> {\n const arr = [...this.items];\n arr.splice(index, 0, item);\n return new List(arr);\n }\n\n remove(index: number): List<T> {\n const arr = [...this.items];\n arr.splice(index, 1);\n return new List(arr);\n }\n\n update(index: number, item: T): List<T> {\n const arr = [...this.items];\n arr[index] = item;\n return new List(arr);\n }\n\n slice(start?: number, end?: number): List<T> {\n return new List(this.items.slice(start, end));\n }\n\n take(n: number): List<T> {\n return this.slice(0, n);\n }\n\n takeLast(n: number): List<T> {\n return this.slice(-n);\n }\n\n takeWhile(predicate: (item: T, index: number) => boolean): List<T> {\n const result: T[] = [];\n for (let i = 0; i < this.items.length; i++) {\n if (!predicate(this.items[i], i)) break;\n result.push(this.items[i]);\n }\n return new List(result);\n }\n\n drop(n: number): List<T> {\n return this.slice(n);\n }\n\n dropLast(n: number): List<T> {\n return this.slice(0, -n);\n }\n\n dropWhile(predicate: (item: T, index: number) => boolean): List<T> {\n let startIndex = 0;\n for (let i = 0; i < this.items.length; i++) {\n if (!predicate(this.items[i], i)) break;\n startIndex = i + 1;\n }\n return this.slice(startIndex);\n }\n\n reverse(): List<T> {\n return new List([...this.items].reverse());\n }\n\n sort(compareFn?: (a: T, b: T) => number): List<T> {\n return new List([...this.items].sort(compareFn));\n }\n\n sortBy<U>(fn: (item: T) => U): List<T> {\n return this.sort((a, b) => {\n const va = fn(a);\n const vb = fn(b);\n if (va < vb) return -1;\n if (va > vb) return 1;\n return 0;\n });\n }\n\n shuffle(): List<T> {\n const arr = [...this.items];\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n return new List(arr);\n }\n\n unique(): List<T> {\n return new List([...new Set(this.items)]);\n }\n\n uniqueBy<U>(fn: (item: T) => U): List<T> {\n const seen = new Set<U>();\n const result: T[] = [];\n for (const item of this.items) {\n const key = fn(item);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(item);\n }\n }\n return new List(result);\n }\n\n groupBy<K>(fn: (item: T) => K): HoloMap<K, List<T>> {\n const groups = new Map<K, T[]>();\n for (const item of this.items) {\n const key = fn(item);\n const group = groups.get(key) || [];\n group.push(item);\n groups.set(key, group);\n }\n const result = new Map<K, List<T>>();\n for (const [key, items] of groups) {\n result.set(key, new List(items));\n }\n return new HoloMap(result);\n }\n\n partition(predicate: (item: T, index: number) => boolean): [List<T>, List<T>] {\n const pass: T[] = [];\n const fail: T[] = [];\n this.items.forEach((item, index) => {\n if (predicate(item, index)) {\n pass.push(item);\n } else {\n fail.push(item);\n }\n });\n return [new List(pass), new List(fail)];\n }\n\n zip<U>(other: List<U>): List<[T, U]> {\n const length = Math.min(this.length, other.length);\n const result: [T, U][] = [];\n for (let i = 0; i < length; i++) {\n result.push([this.items[i], other.get(i)!]);\n }\n return new List(result);\n }\n\n zipWith<U, V>(other: List<U>, fn: (a: T, b: U) => V): List<V> {\n return this.zip(other).map(([a, b]) => fn(a, b));\n }\n\n flatten<U>(this: List<List<U> | U[]>): List<U> {\n const result: U[] = [];\n for (const item of this.items) {\n if (item instanceof List) {\n result.push(...item.toArray());\n } else if (Array.isArray(item)) {\n result.push(...item);\n }\n }\n return new List(result);\n }\n\n sum(this: List<number>): number {\n return this.reduce((acc, n) => acc + n, 0);\n }\n\n min(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return Math.min(...this.items);\n }\n\n max(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return Math.max(...this.items);\n }\n\n average(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return this.sum() / this.length;\n }\n\n join(separator = ','): string {\n return this.items.join(separator);\n }\n\n toArray(): T[] {\n return [...this.items];\n }\n\n toSet(): HoloSet<T> {\n return new HoloSet(this.items);\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n toString(): string {\n return `List(${this.items.join(', ')})`;\n }\n}\n\n/**\n * Immutable Map with functional operations\n */\nexport class HoloMap<K, V> {\n private readonly _map: ReadonlyMap<K, V>;\n\n constructor(entries?: Iterable<[K, V]> | Map<K, V>) {\n this._map = entries instanceof Map ? entries : new Map(entries);\n }\n\n static of<K, V>(...entries: [K, V][]): HoloMap<K, V> {\n return new HoloMap(entries);\n }\n\n static from<K, V>(entries: Iterable<[K, V]>): HoloMap<K, V> {\n return new HoloMap(entries);\n }\n\n static fromObject<V>(obj: Record<string, V>): HoloMap<string, V> {\n return new HoloMap(Object.entries(obj));\n }\n\n get size(): number {\n return this._map.size;\n }\n\n get isEmpty(): boolean {\n return this._map.size === 0;\n }\n\n get(key: K): V | undefined {\n return this._map.get(key);\n }\n\n getOrDefault(key: K, defaultValue: V): V {\n return this._map.has(key) ? this._map.get(key)! : defaultValue;\n }\n\n has(key: K): boolean {\n return this._map.has(key);\n }\n\n set(key: K, value: V): HoloMap<K, V> {\n const newMap = new Map(this._map);\n newMap.set(key, value);\n return new HoloMap(newMap);\n }\n\n delete(key: K): HoloMap<K, V> {\n const newMap = new Map(this._map);\n newMap.delete(key);\n return new HoloMap(newMap);\n }\n\n update(key: K, fn: (value: V | undefined) => V): HoloMap<K, V> {\n return this.set(key, fn(this.get(key)));\n }\n\n merge(other: HoloMap<K, V>): HoloMap<K, V> {\n const newMap = new Map(this._map);\n for (const [key, value] of other) {\n newMap.set(key, value);\n }\n return new HoloMap(newMap);\n }\n\n keys(): List<K> {\n return new List(this._map.keys());\n }\n\n values(): List<V> {\n return new List(this._map.values());\n }\n\n entries(): List<[K, V]> {\n return new List(this._map.entries());\n }\n\n map<U>(fn: (value: V, key: K) => U): HoloMap<K, U> {\n const entries: [K, U][] = [];\n for (const [key, value] of this._map) {\n entries.push([key, fn(value, key)]);\n }\n return new HoloMap(entries);\n }\n\n mapKeys<K2>(fn: (key: K, value: V) => K2): HoloMap<K2, V> {\n const entries: [K2, V][] = [];\n for (const [key, value] of this._map) {\n entries.push([fn(key, value), value]);\n }\n return new HoloMap(entries);\n }\n\n filter(predicate: (value: V, key: K) => boolean): HoloMap<K, V> {\n const entries: [K, V][] = [];\n for (const [key, value] of this._map) {\n if (predicate(value, key)) {\n entries.push([key, value]);\n }\n }\n return new HoloMap(entries);\n }\n\n reduce<U>(fn: (acc: U, value: V, key: K) => U, initial: U): U {\n let acc = initial;\n for (const [key, value] of this._map) {\n acc = fn(acc, value, key);\n }\n return acc;\n }\n\n forEach(fn: (value: V, key: K) => void): void {\n this._map.forEach(fn);\n }\n\n find(predicate: (value: V, key: K) => boolean): [K, V] | undefined {\n for (const [key, value] of this._map) {\n if (predicate(value, key)) {\n return [key, value];\n }\n }\n return undefined;\n }\n\n some(predicate: (value: V, key: K) => boolean): boolean {\n for (const [key, value] of this._map) {\n if (predicate(value, key)) return true;\n }\n return false;\n }\n\n every(predicate: (value: V, key: K) => boolean): boolean {\n for (const [key, value] of this._map) {\n if (!predicate(value, key)) return false;\n }\n return true;\n }\n\n toObject(this: HoloMap<string, V>): Record<string, V> {\n const obj: Record<string, V> = {};\n for (const [key, value] of this._map) {\n obj[key] = value;\n }\n return obj;\n }\n\n toNativeMap(): Map<K, V> {\n return new Map(this._map);\n }\n\n [Symbol.iterator](): Iterator<[K, V]> {\n return this._map[Symbol.iterator]();\n }\n\n toString(): string {\n const entries = [...this._map].map(([k, v]) => `${k}: ${v}`).join(', ');\n return `HoloMap { ${entries} }`;\n }\n}\n\n/**\n * Immutable Set with functional operations\n */\nexport class HoloSet<T> {\n private readonly set: ReadonlySet<T>;\n\n constructor(items?: Iterable<T>) {\n this.set = new Set(items);\n }\n\n static of<T>(...items: T[]): HoloSet<T> {\n return new HoloSet(items);\n }\n\n static from<T>(iterable: Iterable<T>): HoloSet<T> {\n return new HoloSet(iterable);\n }\n\n get size(): number {\n return this.set.size;\n }\n\n get isEmpty(): boolean {\n return this.set.size === 0;\n }\n\n has(item: T): boolean {\n return this.set.has(item);\n }\n\n add(item: T): HoloSet<T> {\n const newSet = new Set(this.set);\n newSet.add(item);\n return new HoloSet(newSet);\n }\n\n delete(item: T): HoloSet<T> {\n const newSet = new Set(this.set);\n newSet.delete(item);\n return new HoloSet(newSet);\n }\n\n addAll(items: Iterable<T>): HoloSet<T> {\n const newSet = new Set(this.set);\n for (const item of items) {\n newSet.add(item);\n }\n return new HoloSet(newSet);\n }\n\n union(other: HoloSet<T>): HoloSet<T> {\n return this.addAll(other);\n }\n\n intersection(other: HoloSet<T>): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (other.has(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n difference(other: HoloSet<T>): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (!other.has(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n symmetricDifference(other: HoloSet<T>): HoloSet<T> {\n return this.difference(other).union(other.difference(this));\n }\n\n isSubsetOf(other: HoloSet<T>): boolean {\n for (const item of this.set) {\n if (!other.has(item)) return false;\n }\n return true;\n }\n\n isSupersetOf(other: HoloSet<T>): boolean {\n return other.isSubsetOf(this);\n }\n\n isDisjointFrom(other: HoloSet<T>): boolean {\n return this.intersection(other).isEmpty;\n }\n\n map<U>(fn: (item: T) => U): HoloSet<U> {\n const result = new Set<U>();\n for (const item of this.set) {\n result.add(fn(item));\n }\n return new HoloSet(result);\n }\n\n filter(predicate: (item: T) => boolean): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (predicate(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n reduce<U>(fn: (acc: U, item: T) => U, initial: U): U {\n let acc = initial;\n for (const item of this.set) {\n acc = fn(acc, item);\n }\n return acc;\n }\n\n forEach(fn: (item: T) => void): void {\n this.set.forEach(fn);\n }\n\n find(predicate: (item: T) => boolean): T | undefined {\n for (const item of this.set) {\n if (predicate(item)) return item;\n }\n return undefined;\n }\n\n some(predicate: (item: T) => boolean): boolean {\n for (const item of this.set) {\n if (predicate(item)) return true;\n }\n return false;\n }\n\n every(predicate: (item: T) => boolean): boolean {\n for (const item of this.set) {\n if (!predicate(item)) return false;\n }\n return true;\n }\n\n toArray(): T[] {\n return [...this.set];\n }\n\n toList(): List<T> {\n return new List(this.set);\n }\n\n toNativeSet(): Set<T> {\n return new Set(this.set);\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.set[Symbol.iterator]();\n }\n\n toString(): string {\n return `HoloSet { ${[...this.set].join(', ')} }`;\n }\n}\n\n/**\n * Spatial grid for efficient spatial queries (useful for game worlds)\n */\nexport class SpatialGrid<T> {\n private readonly cellSize: number;\n private readonly cells: Map<string, T[]> = new Map();\n\n constructor(cellSize: number) {\n this.cellSize = cellSize;\n }\n\n private getCellKey(x: number, y: number, z: number): string {\n const cx = Math.floor(x / this.cellSize);\n const cy = Math.floor(y / this.cellSize);\n const cz = Math.floor(z / this.cellSize);\n return `${cx},${cy},${cz}`;\n }\n\n insert(position: Vec3, item: T): void {\n const key = this.getCellKey(position.x, position.y, position.z);\n if (!this.cells.has(key)) {\n this.cells.set(key, []);\n }\n this.cells.get(key)!.push(item);\n }\n\n remove(position: Vec3, item: T): boolean {\n const key = this.getCellKey(position.x, position.y, position.z);\n const cell = this.cells.get(key);\n if (!cell) return false;\n const index = cell.indexOf(item);\n if (index === -1) return false;\n cell.splice(index, 1);\n if (cell.length === 0) {\n this.cells.delete(key);\n }\n return true;\n }\n\n query(center: Vec3, radius: number): T[] {\n const results: T[] = [];\n const cellRadius = Math.ceil(radius / this.cellSize);\n const cx = Math.floor(center.x / this.cellSize);\n const cy = Math.floor(center.y / this.cellSize);\n const cz = Math.floor(center.z / this.cellSize);\n\n for (let x = cx - cellRadius; x <= cx + cellRadius; x++) {\n for (let y = cy - cellRadius; y <= cy + cellRadius; y++) {\n for (let z = cz - cellRadius; z <= cz + cellRadius; z++) {\n const cell = this.cells.get(`${x},${y},${z}`);\n if (cell) {\n results.push(...cell);\n }\n }\n }\n }\n\n return results;\n }\n\n queryBox(min: Vec3, max: Vec3): T[] {\n const results: T[] = [];\n const minCx = Math.floor(min.x / this.cellSize);\n const minCy = Math.floor(min.y / this.cellSize);\n const minCz = Math.floor(min.z / this.cellSize);\n const maxCx = Math.floor(max.x / this.cellSize);\n const maxCy = Math.floor(max.y / this.cellSize);\n const maxCz = Math.floor(max.z / this.cellSize);\n\n for (let x = minCx; x <= maxCx; x++) {\n for (let y = minCy; y <= maxCy; y++) {\n for (let z = minCz; z <= maxCz; z++) {\n const cell = this.cells.get(`${x},${y},${z}`);\n if (cell) {\n results.push(...cell);\n }\n }\n }\n }\n\n return results;\n }\n\n clear(): void {\n this.cells.clear();\n }\n\n get cellCount(): number {\n return this.cells.size;\n }\n\n get itemCount(): number {\n let count = 0;\n for (const cell of this.cells.values()) {\n count += cell.length;\n }\n return count;\n }\n}\n\n/**\n * Priority queue (min-heap by default)\n */\nexport class PriorityQueue<T> {\n private heap: { item: T; priority: number }[] = [];\n\n constructor(private compareFn: (a: number, b: number) => number = (a, b) => a - b) {}\n\n static minHeap<T>(): PriorityQueue<T> {\n return new PriorityQueue((a, b) => a - b);\n }\n\n static maxHeap<T>(): PriorityQueue<T> {\n return new PriorityQueue((a, b) => b - a);\n }\n\n get size(): number {\n return this.heap.length;\n }\n\n get isEmpty(): boolean {\n return this.heap.length === 0;\n }\n\n enqueue(item: T, priority: number): void {\n this.heap.push({ item, priority });\n this.bubbleUp(this.heap.length - 1);\n }\n\n dequeue(): T | undefined {\n if (this.isEmpty) return undefined;\n const result = this.heap[0].item;\n const last = this.heap.pop()!;\n if (this.heap.length > 0) {\n this.heap[0] = last;\n this.bubbleDown(0);\n }\n return result;\n }\n\n peek(): T | undefined {\n return this.heap[0]?.item;\n }\n\n peekPriority(): number | undefined {\n return this.heap[0]?.priority;\n }\n\n clear(): void {\n this.heap = [];\n }\n\n private bubbleUp(index: number): void {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compareFn(this.heap[index].priority, this.heap[parentIndex].priority) >= 0) break;\n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n\n private bubbleDown(index: number): void {\n while (true) {\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n let smallest = index;\n\n if (\n leftChild < this.heap.length &&\n this.compareFn(this.heap[leftChild].priority, this.heap[smallest].priority) < 0\n ) {\n smallest = leftChild;\n }\n if (\n rightChild < this.heap.length &&\n this.compareFn(this.heap[rightChild].priority, this.heap[smallest].priority) < 0\n ) {\n smallest = rightChild;\n }\n\n if (smallest === index) break;\n [this.heap[index], this.heap[smallest]] = [this.heap[smallest], this.heap[index]];\n index = smallest;\n }\n }\n}\n\n// Convenience aliases\nexport { HoloMap as Map };\nexport { HoloSet as Set };\n","/**\n * @holoscript/std - String Module\n *\n * String manipulation utilities for HoloScript Plus programs.\n */\n\n/**\n * Check if a string is empty or only whitespace\n */\nexport function isBlank(s: string): boolean {\n return s.trim().length === 0;\n}\n\n/**\n * Check if a string is not empty and not only whitespace\n */\nexport function isNotBlank(s: string): boolean {\n return s.trim().length > 0;\n}\n\n/**\n * Capitalize the first letter of a string\n */\nexport function capitalize(s: string): string {\n if (s.length === 0) return s;\n return s[0].toUpperCase() + s.slice(1);\n}\n\n/**\n * Capitalize the first letter of each word\n */\nexport function titleCase(s: string): string {\n return s.split(/\\s+/).map(capitalize).join(' ');\n}\n\n/**\n * Convert to camelCase\n */\nexport function camelCase(s: string): string {\n return s\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^[A-Z]/, (c) => c.toLowerCase());\n}\n\n/**\n * Convert to PascalCase\n */\nexport function pascalCase(s: string): string {\n const camel = camelCase(s);\n return camel.length > 0 ? camel[0].toUpperCase() + camel.slice(1) : camel;\n}\n\n/**\n * Convert to snake_case\n */\nexport function snakeCase(s: string): string {\n return s\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\n/**\n * Convert to kebab-case\n */\nexport function kebabCase(s: string): string {\n return s\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Convert to SCREAMING_SNAKE_CASE\n */\nexport function constantCase(s: string): string {\n return snakeCase(s).toUpperCase();\n}\n\n/**\n * Pad a string on the left to reach target length\n */\nexport function padLeft(s: string, length: number, char = ' '): string {\n return s.padStart(length, char);\n}\n\n/**\n * Pad a string on the right to reach target length\n */\nexport function padRight(s: string, length: number, char = ' '): string {\n return s.padEnd(length, char);\n}\n\n/**\n * Pad a string on both sides to center it\n */\nexport function center(s: string, length: number, char = ' '): string {\n if (s.length >= length) return s;\n const totalPadding = length - s.length;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n return char.repeat(leftPadding) + s + char.repeat(rightPadding);\n}\n\n/**\n * Truncate a string to max length, adding ellipsis if needed\n */\nexport function truncate(s: string, maxLength: number, ellipsis = '...'): string {\n if (s.length <= maxLength) return s;\n return s.slice(0, maxLength - ellipsis.length) + ellipsis;\n}\n\n/**\n * Truncate a string in the middle\n */\nexport function truncateMiddle(s: string, maxLength: number, ellipsis = '...'): string {\n if (s.length <= maxLength) return s;\n const availableLength = maxLength - ellipsis.length;\n const leftLength = Math.floor(availableLength / 2);\n const rightLength = Math.ceil(availableLength / 2);\n return s.slice(0, leftLength) + ellipsis + s.slice(-rightLength);\n}\n\n/**\n * Repeat a string n times\n */\nexport function repeat(s: string, count: number): string {\n return s.repeat(count);\n}\n\n/**\n * Reverse a string\n */\nexport function reverse(s: string): string {\n return [...s].reverse().join('');\n}\n\n/**\n * Count occurrences of a substring\n */\nexport function count(s: string, substring: string): number {\n if (substring.length === 0) return 0;\n let count = 0;\n let pos = 0;\n while ((pos = s.indexOf(substring, pos)) !== -1) {\n count++;\n pos += 1;\n }\n return count;\n}\n\n/**\n * Check if string contains a substring (case-insensitive)\n */\nexport function containsIgnoreCase(s: string, substring: string): boolean {\n return s.toLowerCase().includes(substring.toLowerCase());\n}\n\n/**\n * Check if string starts with prefix (case-insensitive)\n */\nexport function startsWithIgnoreCase(s: string, prefix: string): boolean {\n return s.toLowerCase().startsWith(prefix.toLowerCase());\n}\n\n/**\n * Check if string ends with suffix (case-insensitive)\n */\nexport function endsWithIgnoreCase(s: string, suffix: string): boolean {\n return s.toLowerCase().endsWith(suffix.toLowerCase());\n}\n\n/**\n * Remove all whitespace from a string\n */\nexport function removeWhitespace(s: string): string {\n return s.replace(/\\s+/g, '');\n}\n\n/**\n * Collapse multiple spaces into single space\n */\nexport function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Remove a prefix if present\n */\nexport function removePrefix(s: string, prefix: string): string {\n return s.startsWith(prefix) ? s.slice(prefix.length) : s;\n}\n\n/**\n * Remove a suffix if present\n */\nexport function removeSuffix(s: string, suffix: string): string {\n return s.endsWith(suffix) ? s.slice(0, -suffix.length) : s;\n}\n\n/**\n * Wrap a string with prefix and suffix\n */\nexport function wrap(s: string, wrapper: string): string;\nexport function wrap(s: string, prefix: string, suffix: string): string;\nexport function wrap(s: string, prefixOrWrapper: string, suffix?: string): string {\n if (suffix === undefined) {\n return prefixOrWrapper + s + prefixOrWrapper;\n }\n return prefixOrWrapper + s + suffix;\n}\n\n/**\n * Unwrap a string by removing matching prefix and suffix\n */\nexport function unwrap(s: string, wrapper: string): string;\nexport function unwrap(s: string, prefix: string, suffix: string): string;\nexport function unwrap(s: string, prefixOrWrapper: string, suffix?: string): string {\n const prefix = prefixOrWrapper;\n const actualSuffix = suffix ?? prefixOrWrapper;\n if (s.startsWith(prefix) && s.endsWith(actualSuffix)) {\n return s.slice(prefix.length, -actualSuffix.length || undefined);\n }\n return s;\n}\n\n/**\n * Split a string into lines\n */\nexport function lines(s: string): string[] {\n return s.split(/\\r?\\n/);\n}\n\n/**\n * Split a string into words\n */\nexport function words(s: string): string[] {\n return s.split(/\\s+/).filter((w) => w.length > 0);\n}\n\n/**\n * Split a string into characters\n */\nexport function chars(s: string): string[] {\n return [...s];\n}\n\n/**\n * Join strings with a separator\n */\nexport function join(strings: string[], separator = ''): string {\n return strings.join(separator);\n}\n\n/**\n * Format a template string with values\n */\nexport function format(template: string, values: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n return key in values ? String(values[key]) : match;\n });\n}\n\n/**\n * Format a number as a string with grouping\n */\nexport function formatNumber(n: number, options: Intl.NumberFormatOptions = {}): string {\n return n.toLocaleString('en-US', options);\n}\n\n/**\n * Format a number with commas\n */\nexport function numberWithCommas(n: number): string {\n return n.toLocaleString('en-US');\n}\n\n/**\n * Format bytes as human-readable string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n if (bytes < 0) return `${bytes} B`;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];\n}\n\n/**\n * Format duration in milliseconds as human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n return `${(ms / 60000).toFixed(1)}m`;\n }\n const hours = Math.floor(ms / 3600000);\n const mins = Math.floor((ms % 3600000) / 60000);\n return `${(ms / 3600000).toFixed(1)}h`;\n}\n\n/**\n * Escape HTML special characters\n */\nexport function escapeHtml(s: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return s.replace(/[&<>\"']/g, (c) => htmlEntities[c]);\n}\n\n/**\n * Unescape HTML entities\n */\nexport function unescapeHtml(s: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n '/': '/',\n };\n return s.replace(\n /&(?:amp|lt|gt|quot|#39|#x27|#x2F);/g,\n (entity) => htmlEntities[entity] || entity\n );\n}\n\n/**\n * Escape regex special characters\n */\nexport function escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Generate a slug from a string\n */\nexport function slugify(s: string): string {\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Check if string is a valid identifier\n */\nexport function isValidIdentifier(s: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(s);\n}\n\n/**\n * Check if string is numeric\n */\nexport function isNumeric(s: string): boolean {\n return !isNaN(parseFloat(s)) && isFinite(Number(s));\n}\n\n/**\n * Check if string is alphanumeric\n */\nexport function isAlphanumeric(s: string): boolean {\n return /^[a-zA-Z0-9]+$/.test(s);\n}\n\n/**\n * Check if string is alphabetic\n */\nexport function isAlpha(s: string): boolean {\n return /^[a-zA-Z]+$/.test(s);\n}\n\n/**\n * Generate a random string\n */\nexport function randomString(\n length: number,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Indent each line of a string\n */\nexport function indent(s: string, spaces: number, char = ' '): string {\n const prefix = char.repeat(spaces);\n return s\n .split('\\n')\n .map((line) => prefix + line)\n .join('\\n');\n}\n\n/**\n * Dedent a string (remove common leading whitespace)\n */\nexport function dedent(s: string): string {\n const linesList = lines(s);\n const nonEmptyLines = linesList.filter((l) => l.trim().length > 0);\n if (nonEmptyLines.length === 0) return s;\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(/^(\\s*)/);\n return match ? match[1].length : 0;\n })\n );\n\n return linesList.map((line) => line.slice(minIndent)).join('\\n');\n}\n\n/**\n * Word wrap text to a maximum width\n */\nexport function wordWrap(s: string, maxWidth: number): string {\n const wordsList = words(s);\n const linesList: string[] = [];\n let currentLine = '';\n\n for (const word of wordsList) {\n if (currentLine.length === 0) {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= maxWidth) {\n currentLine += ' ' + word;\n } else {\n linesList.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine.length > 0) {\n linesList.push(currentLine);\n }\n\n return linesList.join('\\n');\n}\n\n/**\n * Levenshtein distance between two strings\n */\nexport function levenshtein(a: string, b: string): number {\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b[i - 1] === a[j - 1]) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n}\n\nfunction lcsLength(a: string, b: string): number {\n const n = b.length;\n const dp: number[] = new Array(n + 1).fill(0);\n for (let i = 0; i < a.length; i++) {\n let prev = 0;\n for (let j = 0; j < n; j++) {\n const tmp = dp[j + 1];\n dp[j + 1] = a[i] === b[j] ? prev + 1 : Math.max(dp[j + 1], dp[j]);\n prev = tmp;\n }\n }\n return dp[n];\n}\n\n/**\n * Check similarity between two strings (0-1) using Sorensen-Dice over LCS\n */\nexport function similarity(a: string, b: string): number {\n const total = a.length + b.length;\n if (total === 0) return 1;\n return (2 * lcsLength(a, b)) / total;\n}\n\n/**\n * Extract HoloScript trait annotations (@name) and JSX component names from code\n */\nexport function extractTraits(code: string): string[] {\n const traits = new Set<string>();\n let m: RegExpExecArray | null;\n const atRe = /@([a-zA-Z_]\\w*)/g;\n while ((m = atRe.exec(code)) !== null) traits.add(`@${m[1]}`);\n const tagRe = /<([A-Z][a-zA-Z0-9]*)\\b/g;\n while ((m = tagRe.exec(code)) !== null) traits.add(m[1]);\n return [...traits];\n}\n","/**\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","/**\n * @fileoverview Economic Trait Definitions for HoloScript\n * @module @holoscript/std/traits\n *\n * Defines five economic primitive traits that compose with existing VR traits\n * and leverage RBAC for economic permission enforcement:\n *\n * 1. @tradeable - Ownership, transfer, and trade settlement\n * 2. @depreciating - Time-based value decay (hard sink mechanic)\n * 3. @bonding_curved - Autonomous price discovery via bonding curves\n * 4. @taxable_wealth - Progressive wealth taxation with redistribution\n * 5. @pid_controlled - Dual-loop PID feedback for faucet/sink regulation\n *\n * These traits implement the research-proven mechanisms from:\n * - P.030.01 Dual-Loop PID Economy Controller\n * - P.030.02 Bonding Curve Marketplace\n * - P.030.03 Progressive Wealth Recycling\n * - W.031 Faucet-Sink Ratio as Master Variable\n * - W.032 Dual-Loop Feedback Control\n * - W.034 Wealth Tax > Income Tax for Gini Reduction\n * - W.035 Bonding Curves for Price Discovery\n *\n * RBAC Integration:\n * Each trait declares required permissions from the economy.* permission\n * category. The HoloScript compiler enforces these at compile time via\n * the existing AgentRBAC system.\n *\n * @version 1.0.0\n * @category economic\n */\n\nimport type { TraitDefinition } from '../types.js';\n\n/**\n * Extended trait definition with economic-specific metadata.\n */\nexport interface EconomicTraitDefinition extends TraitDefinition {\n /** RBAC permissions required to use this trait */\n requiredPermissions: string[];\n /** Economic layer this trait operates at (from 9-layer architecture) */\n economicLayer: number;\n /** Composability: which other economic traits this one works with */\n composesWith: string[];\n /** Compiler hints for code generation */\n compiler_hints?: {\n requires_runtime?: string[];\n thread_safety?: 'main_thread' | 'worker_thread' | 'any';\n performance_budget_ms?: number;\n };\n}\n\n// =============================================================================\n// TRAIT DEFINITIONS\n// =============================================================================\n\n/**\n * The five economic primitive traits.\n */\nexport const EconomicTraits: Record<string, EconomicTraitDefinition> = {\n // ---------------------------------------------------------------------------\n // 1. TRADEABLE\n // ---------------------------------------------------------------------------\n tradeable: {\n name: '@tradeable',\n description:\n 'Makes a composition or node transferable between agents. Tracks ownership ' +\n 'history with transaction hashes for integrity verification (P.030.04). ' +\n 'Supports lock/unlock for escrow patterns and auction integration.',\n params: {\n initial_owner: {\n type: 'AgentID',\n required: true,\n description: 'The agent who initially owns this entity.',\n },\n transferable: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether transfers are currently allowed.',\n },\n min_price: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Minimum trade price (prevents value manipulation).',\n },\n max_history: {\n type: 'number',\n required: false,\n default: 50,\n description: 'Maximum ownership history entries retained.',\n },\n requires_presence: {\n type: 'boolean',\n required: false,\n default: false,\n description: 'VR-specific: require spatial co-location for trade (anti-exploit, Layer 7).',\n },\n presence_radius: {\n type: 'number',\n required: false,\n default: 5.0,\n description: 'Maximum distance in meters for presence-based trades.',\n },\n },\n validator: (params) => {\n if (!params.initial_owner || typeof params.initial_owner !== 'string') return false;\n if (params.min_price !== undefined && params.min_price < 0) return false;\n return true;\n },\n requiredPermissions: ['economy.trade'],\n economicLayer: 0, // Layer 0: Integrity\n composesWith: ['@depreciating', '@bonding_curved', '@taxable_wealth'],\n compiler_hints: {\n requires_runtime: ['EconomicRuntime.executeTrade', 'EconomicRuntime.verifyOwnership'],\n thread_safety: 'any',\n },\n },\n\n // ---------------------------------------------------------------------------\n // 2. DEPRECIATING\n // ---------------------------------------------------------------------------\n depreciating: {\n name: '@depreciating',\n description:\n 'Applies time-based value decay to an entity (hard sink mechanic). ' +\n 'Uses exponential decay: condition(t) = condition(0) * e^(-rate * t). ' +\n 'When condition reaches destroy_threshold, the entity is consumed -- ' +\n 'removing currency/value from circulation permanently (W.031).',\n params: {\n decay_rate: {\n type: 'number',\n required: true,\n description: 'Per-second decay rate (0.0 - 1.0). E.g., 0.001 = 0.1% per second.',\n },\n initial_condition: {\n type: 'number',\n required: false,\n default: 1.0,\n description: 'Starting condition (1.0 = mint, 0.0 = destroyed).',\n },\n destroy_threshold: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Condition level at which the entity is destroyed.',\n },\n repairable: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether the entity can be repaired to restore condition.',\n },\n repair_cost_multiplier: {\n type: 'number',\n required: false,\n default: 0.5,\n description: 'Repair cost as a fraction of base value per unit condition.',\n },\n emit_on_destroy: {\n type: 'string',\n required: false,\n default: 'on_entity_destroyed',\n description: 'Event emitted when condition reaches destroy threshold.',\n },\n },\n validator: (params) => {\n if (params.decay_rate === undefined || params.decay_rate < 0 || params.decay_rate > 1)\n return false;\n if (\n params.initial_condition !== undefined &&\n (params.initial_condition < 0 || params.initial_condition > 1)\n )\n return false;\n if (\n params.destroy_threshold !== undefined &&\n (params.destroy_threshold < 0 || params.destroy_threshold > 1)\n )\n return false;\n return true;\n },\n requiredPermissions: ['economy.burn'],\n economicLayer: 1, // Layer 1: Flow Control (sink side)\n composesWith: ['@tradeable', '@bonding_curved'],\n compiler_hints: {\n requires_runtime: ['EconomicRuntime.updateDepreciation', 'EconomicRuntime.destroyEntity'],\n thread_safety: 'worker_thread',\n performance_budget_ms: 0.1, // Must be fast -- called every tick\n },\n },\n\n // ---------------------------------------------------------------------------\n // 3. BONDING_CURVED\n // ---------------------------------------------------------------------------\n bonding_curved: {\n name: '@bonding_curved',\n description:\n 'Attaches a bonding curve to a marketplace or item category for autonomous ' +\n 'price discovery. Price is determined by P = f(supply) where f depends on ' +\n 'curve_type. Provides continuous liquidity via reserve pool without order ' +\n 'books (W.035, P.030.02). Supports spatial pricing for VR trade geography.',\n params: {\n curve_type: {\n type: 'string',\n required: false,\n default: 'exponential',\n description: 'Curve shape: linear | exponential | logarithmic | sigmoid.',\n validation: (val: any) => ['linear', 'exponential', 'logarithmic', 'sigmoid'].includes(val),\n },\n reserve_ratio: {\n type: 'number',\n required: true,\n description: 'Base price multiplier (R in the price formula).',\n },\n curve_steepness: {\n type: 'number',\n required: false,\n default: 2.0,\n description: 'Controls price sensitivity to supply changes (n in P = R * S^(1/n)).',\n },\n transaction_fee: {\n type: 'number',\n required: false,\n default: 0.02,\n description: 'Fee percentage per transaction (hard sink). Range: 0.0 - 0.5.',\n },\n initial_supply: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Initial token/item supply on the curve.',\n },\n initial_reserve: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Initial reserve pool balance backing the curve.',\n },\n sigmoid_k: {\n type: 'number',\n required: false,\n default: 100,\n description: 'Half-saturation constant for sigmoid curves.',\n },\n spatial_distance_factor: {\n type: 'number',\n required: false,\n default: 0.0,\n description:\n 'VR spatial pricing: price multiplier per unit distance from hub. ' +\n '0.0 = no spatial effect. Creates emergent trade routes (P.030.02 ENRICHED).',\n },\n },\n validator: (params) => {\n if (params.reserve_ratio === undefined || params.reserve_ratio <= 0) return false;\n if (params.curve_steepness !== undefined && params.curve_steepness <= 0) return false;\n if (\n params.transaction_fee !== undefined &&\n (params.transaction_fee < 0 || params.transaction_fee > 0.5)\n )\n return false;\n if (params.curve_type !== undefined) {\n if (!['linear', 'exponential', 'logarithmic', 'sigmoid'].includes(params.curve_type))\n return false;\n }\n return true;\n },\n requiredPermissions: ['economy.set_price', 'economy.trade'],\n economicLayer: 2, // Layer 2: Price Discovery\n composesWith: ['@tradeable', '@depreciating', '@pid_controlled'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.bondingCurveBuy',\n 'EconomicRuntime.bondingCurveSell',\n 'EconomicRuntime.getSpotPrice',\n ],\n thread_safety: 'any',\n performance_budget_ms: 1.0,\n },\n },\n\n // ---------------------------------------------------------------------------\n // 4. TAXABLE_WEALTH\n // ---------------------------------------------------------------------------\n taxable_wealth: {\n name: '@taxable_wealth',\n description:\n 'Applies progressive logarithmic wealth taxation with optional redistribution ' +\n 'to the lowest-wealth quintile (P.030.03, W.034). Tax = 0 below threshold, ' +\n 'then rate = min(max_rate, log(wealth/threshold) * base_rate). Collected taxes ' +\n 'are partially redistributed (UBI) and partially burned (hard sink).',\n params: {\n threshold: {\n type: 'number',\n required: true,\n description: 'Wealth level below which no tax is levied.',\n },\n base_rate: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Base tax rate multiplied by log(wealth/threshold). Range: 0.0 - 0.1.',\n },\n max_effective_rate: {\n type: 'number',\n required: false,\n default: 0.05,\n description: 'Maximum effective tax rate cap (prevents punishing engagement).',\n },\n collection_interval: {\n type: 'string',\n required: false,\n default: 'daily',\n description: 'How often taxes are collected: hourly | daily | weekly.',\n validation: (val: any) => ['hourly', 'daily', 'weekly'].includes(val),\n },\n enable_redistribution: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether collected tax is redistributed to lowest-wealth players.',\n },\n redistribution_fraction: {\n type: 'number',\n required: false,\n default: 0.7,\n description:\n 'Fraction of tax redistributed (remainder burned as hard sink). Range: 0.0 - 1.0.',\n },\n emit_on_collection: {\n type: 'string',\n required: false,\n default: 'on_tax_collected',\n description: 'Event emitted when taxes are collected.',\n },\n public_ledger: {\n type: 'boolean',\n required: false,\n default: true,\n description:\n 'Whether tax collections and redistribution are visible in the ' +\n 'economy dashboard (Layer 6: Transparency, W.038).',\n },\n },\n validator: (params) => {\n if (params.threshold === undefined || params.threshold < 0) return false;\n if (params.base_rate !== undefined && (params.base_rate < 0 || params.base_rate > 0.1))\n return false;\n if (\n params.max_effective_rate !== undefined &&\n (params.max_effective_rate < 0 || params.max_effective_rate > 1.0)\n )\n return false;\n if (\n params.redistribution_fraction !== undefined &&\n (params.redistribution_fraction < 0 || params.redistribution_fraction > 1.0)\n )\n return false;\n return true;\n },\n requiredPermissions: ['economy.tax', 'economy.redistribute'],\n economicLayer: 4, // Layer 4: Redistribution\n composesWith: ['@tradeable', '@pid_controlled'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.collectTax',\n 'EconomicRuntime.redistribute',\n 'EconomicRuntime.getGiniCoefficient',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 5.0, // Runs on collection interval, not per-frame\n },\n },\n\n // ---------------------------------------------------------------------------\n // 5. PID_CONTROLLED\n // ---------------------------------------------------------------------------\n pid_controlled: {\n name: '@pid_controlled',\n description:\n 'Attaches a dual-loop PID feedback controller to regulate economic flow ' +\n '(P.030.01, W.032). Inner loop adjusts per-source faucet rates (fast). ' +\n 'Outer loop adjusts inner setpoint based on total money supply (slow). ' +\n 'Achieves <10% currency variance long-term while preserving gameplay variance.',\n params: {\n target_per_capita: {\n type: 'number',\n required: true,\n description: 'Target currency per active player (outer loop setpoint).',\n },\n inner_kp: {\n type: 'number',\n required: false,\n default: 0.5,\n description: 'Inner loop proportional gain.',\n },\n inner_ki: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Inner loop integral gain.',\n },\n inner_kd: {\n type: 'number',\n required: false,\n default: 0.1,\n description: 'Inner loop derivative gain.',\n },\n outer_kp: {\n type: 'number',\n required: false,\n default: 0.3,\n description: 'Outer loop proportional gain.',\n },\n outer_ki: {\n type: 'number',\n required: false,\n default: 0.005,\n description: 'Outer loop integral gain.',\n },\n outer_kd: {\n type: 'number',\n required: false,\n default: 0.05,\n description: 'Outer loop derivative gain.',\n },\n update_interval: {\n type: 'number',\n required: false,\n default: 1.0,\n description: 'Controller update interval in seconds.',\n },\n faucet_min_multiplier: {\n type: 'number',\n required: false,\n default: 0.1,\n description: 'Minimum faucet rate multiplier (never fully stop rewards).',\n },\n faucet_max_multiplier: {\n type: 'number',\n required: false,\n default: 2.0,\n description: 'Maximum faucet rate multiplier.',\n },\n track_faucet_sink_ratio: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether to track and emit faucet/sink ratio metrics (W.031).',\n },\n emit_on_adjustment: {\n type: 'string',\n required: false,\n default: 'on_faucet_adjusted',\n description: 'Event emitted when faucet rate is adjusted.',\n },\n },\n validator: (params) => {\n if (params.target_per_capita === undefined || params.target_per_capita <= 0) return false;\n // PID gains can be any real number, but should be reasonable\n const gains = [\n params.inner_kp,\n params.inner_ki,\n params.inner_kd,\n params.outer_kp,\n params.outer_ki,\n params.outer_kd,\n ];\n for (const g of gains) {\n if (g !== undefined && (typeof g !== 'number' || isNaN(g))) return false;\n }\n if (params.update_interval !== undefined && params.update_interval <= 0) return false;\n return true;\n },\n requiredPermissions: ['economy.tune_pid', 'economy.mint', 'economy.burn'],\n economicLayer: 1, // Layer 1: Flow Control\n composesWith: ['@bonding_curved', '@taxable_wealth'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.updatePID',\n 'EconomicRuntime.getFaucetMultiplier',\n 'EconomicRuntime.getFaucetSinkMetrics',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 0.5,\n },\n },\n};\n\n// =============================================================================\n// TRAIT UTILITIES\n// =============================================================================\n\n/**\n * Get all trait names as an array.\n */\nexport function getEconomicTraitNames(): string[] {\n return Object.keys(EconomicTraits).map((k) => EconomicTraits[k].name);\n}\n\n/**\n * Look up a trait definition by its @-prefixed name.\n */\nexport function getEconomicTrait(name: string): EconomicTraitDefinition | undefined {\n const key = name.startsWith('@') ? name.slice(1) : name;\n return EconomicTraits[key];\n}\n\n/**\n * Validate that a set of composed traits are compatible.\n * Returns an error message if incompatible, or null if valid.\n */\nexport function validateTraitComposition(traitNames: string[]): string | null {\n for (const name of traitNames) {\n const trait = getEconomicTrait(name);\n if (!trait) {\n return `Unknown economic trait: ${name}`;\n }\n }\n\n // Check that all traits compose with each other\n for (const name of traitNames) {\n const trait = getEconomicTrait(name)!;\n for (const other of traitNames) {\n if (other === name) continue;\n const otherPrefixed = other.startsWith('@') ? other : `@${other}`;\n if (!trait.composesWith.includes(otherPrefixed)) {\n return `Trait ${trait.name} does not compose with ${otherPrefixed}`;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get all RBAC permissions required by a set of economic traits.\n */\nexport function getRequiredPermissions(traitNames: string[]): string[] {\n const permissions = new Set<string>();\n for (const name of traitNames) {\n const trait = getEconomicTrait(name);\n if (trait) {\n for (const perm of trait.requiredPermissions) {\n permissions.add(perm);\n }\n }\n }\n return Array.from(permissions).sort();\n}\n\nexport default EconomicTraits;\n","/**\n * @fileoverview SimulationLab Primitives - Runtime math and types for hypothesis testing\n * @module @holoscript/std/simulation\n *\n * Provides the mathematical building blocks for scientific hypothesis testing\n * in HoloScript simulations. Run N epochs with parameter sweeps, collect metrics,\n * and perform statistical analysis to prove or disprove hypotheses.\n *\n * The universe gets one sample. HoloScript gives you infinite.\n *\n * @version 1.0.0\n * @category simulation\n */\n\n// =============================================================================\n// CORE TYPES\n// =============================================================================\n\n/**\n * Direction of expected effect in a hypothesis.\n */\nexport type HypothesisDirection = 'greater' | 'less' | 'different' | 'equal';\n\n/**\n * Status of a simulation run.\n */\nexport type SimulationStatus = 'pending' | 'running' | 'completed' | 'failed';\n\n/**\n * A scientific hypothesis to test.\n */\nexport interface Hypothesis {\n /** Human-readable description */\n description: string;\n /** The null hypothesis (what we're trying to reject) */\n null_hypothesis: string;\n /** The alternative hypothesis (what we're testing for) */\n alternative_hypothesis: string;\n /** Expected direction of effect */\n direction: HypothesisDirection;\n /** Significance threshold (default: 0.05) */\n alpha: number;\n}\n\n/**\n * A range of parameter values to sweep.\n */\nexport interface ParameterRange {\n /** Parameter name */\n name: string;\n /** Start value */\n min: number;\n /** End value */\n max: number;\n /** Step size */\n step: number;\n}\n\n/**\n * A set of discrete parameter values to sweep.\n */\nexport interface ParameterSet {\n /** Parameter name */\n name: string;\n /** Discrete values to test */\n values: number[];\n}\n\n/**\n * Either a range or discrete set of parameter values.\n */\nexport type ParameterSweep = ParameterRange | ParameterSet;\n\n/**\n * Metrics collected from a single simulation run.\n */\nexport interface SimulationMetrics {\n /** Named metric values */\n values: Record<string, number>;\n /** Seed used for this run */\n seed: number;\n /** Parameter values used */\n params: Record<string, number>;\n /** Wall-clock time in ms */\n durationMs: number;\n}\n\n/**\n * Result of a statistical test.\n */\nexport interface StatisticalResult {\n /** Test statistic value */\n statistic: number;\n /** p-value (probability of observing result under null hypothesis) */\n pValue: number;\n /** Whether the null hypothesis is rejected at the given alpha */\n significant: boolean;\n /** Confidence interval [lower, upper] */\n confidenceInterval: [number, number];\n /** Effect size (Cohen's d for t-test) */\n effectSize: number;\n /** Name of the test used */\n testName: string;\n /** Number of samples */\n sampleSize: number;\n}\n\n/**\n * Complete simulation experiment result.\n */\nexport interface ExperimentResult {\n /** The hypothesis tested */\n hypothesis: Hypothesis;\n /** Statistical results per metric */\n results: Record<string, StatisticalResult>;\n /** All collected metrics */\n metrics: SimulationMetrics[];\n /** Total epochs run */\n totalEpochs: number;\n /** Total wall-clock time */\n totalDurationMs: number;\n /** Status */\n status: SimulationStatus;\n /** Composition hash for reproducibility */\n compositionHash: string;\n}\n\n// =============================================================================\n// PARAMETER SWEEP GENERATION\n// =============================================================================\n\n/**\n * Check if a parameter sweep is a range (vs discrete set).\n */\nexport function isParameterRange(sweep: ParameterSweep): sweep is ParameterRange {\n return 'min' in sweep && 'max' in sweep && 'step' in sweep;\n}\n\n/**\n * Generate all values from a parameter sweep.\n */\nexport function expandSweep(sweep: ParameterSweep): number[] {\n if (!isParameterRange(sweep)) {\n return (sweep as ParameterSet).values.slice();\n }\n\n const range = sweep as ParameterRange;\n if (range.step <= 0) return [range.min];\n if (range.min > range.max) return [];\n\n const values: number[] = [];\n for (let v = range.min; v <= range.max + range.step * 0.001; v += range.step) {\n values.push(Math.round(v * 1e10) / 1e10); // Avoid floating point drift\n }\n return values;\n}\n\n/**\n * Generate all parameter combinations from multiple sweeps.\n * Returns an array of parameter maps.\n */\nexport function generateSweepCombinations(sweeps: ParameterSweep[]): Record<string, number>[] {\n if (sweeps.length === 0) return [{}];\n\n const expanded = sweeps.map((s) => ({\n name: s.name,\n values: expandSweep(s),\n }));\n\n // Cartesian product\n let combinations: Record<string, number>[] = [{}];\n\n for (const { name, values } of expanded) {\n const newCombinations: Record<string, number>[] = [];\n for (const combo of combinations) {\n for (const val of values) {\n newCombinations.push({ ...combo, [name]: val });\n }\n }\n combinations = newCombinations;\n }\n\n return combinations;\n}\n\n// =============================================================================\n// STATISTICAL FUNCTIONS\n// =============================================================================\n\n/**\n * Calculate the arithmetic mean of an array of numbers.\n */\nexport function mean(data: number[]): number {\n if (data.length === 0) return 0;\n return data.reduce((sum, v) => sum + v, 0) / data.length;\n}\n\n/**\n * Calculate the sample variance (Bessel's correction).\n */\nexport function variance(data: number[]): number {\n if (data.length < 2) return 0;\n const m = mean(data);\n const squaredDiffs = data.reduce((sum, v) => sum + (v - m) ** 2, 0);\n return squaredDiffs / (data.length - 1);\n}\n\n/**\n * Calculate the sample standard deviation.\n */\nexport function standardDeviation(data: number[]): number {\n return Math.sqrt(variance(data));\n}\n\n/**\n * Calculate the standard error of the mean.\n */\nexport function standardError(data: number[]): number {\n if (data.length === 0) return 0;\n return standardDeviation(data) / Math.sqrt(data.length);\n}\n\n/**\n * Calculate Cohen's d effect size between two groups.\n * d = (mean1 - mean2) / pooled_std\n */\nexport function cohensD(group1: number[], group2: number[]): number {\n if (group1.length < 2 || group2.length < 2) return 0;\n\n const m1 = mean(group1);\n const m2 = mean(group2);\n const v1 = variance(group1);\n const v2 = variance(group2);\n\n // Pooled standard deviation\n const n1 = group1.length;\n const n2 = group2.length;\n const pooledVar = ((n1 - 1) * v1 + (n2 - 1) * v2) / (n1 + n2 - 2);\n const pooledStd = Math.sqrt(pooledVar);\n\n if (pooledStd === 0) return 0;\n return (m1 - m2) / pooledStd;\n}\n\n/**\n * Two-sample independent t-test.\n *\n * Tests whether two groups have significantly different means.\n * Uses Welch's t-test (does not assume equal variances).\n */\nexport function tTest(\n group1: number[],\n group2: number[],\n alpha: number = 0.05,\n direction: HypothesisDirection = 'different'\n): StatisticalResult {\n const n1 = group1.length;\n const n2 = group2.length;\n\n if (n1 < 2 || n2 < 2) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n }\n\n const m1 = mean(group1);\n const m2 = mean(group2);\n const v1 = variance(group1);\n const v2 = variance(group2);\n const se = Math.sqrt(v1 / n1 + v2 / n2);\n\n if (se === 0) {\n return {\n statistic: 0,\n pValue: m1 === m2 ? 1 : 0,\n significant: m1 !== m2,\n confidenceInterval: [m1 - m2, m1 - m2],\n effectSize: 0,\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n }\n\n const t = (m1 - m2) / se;\n\n // Welch–Satterthwaite degrees of freedom\n const num = (v1 / n1 + v2 / n2) ** 2;\n const den = (v1 / n1) ** 2 / (n1 - 1) + (v2 / n2) ** 2 / (n2 - 1);\n const df = num / den;\n\n // Approximate p-value using the t-distribution CDF approximation\n const pTwoTailed = tDistPValue(Math.abs(t), df);\n let pValue: number;\n\n switch (direction) {\n case 'greater':\n pValue = t > 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'less':\n pValue = t < 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'equal':\n pValue = 1 - pTwoTailed;\n break;\n default: // 'different'\n pValue = pTwoTailed;\n }\n\n // Confidence interval for the difference in means\n const tCrit = tDistCritical(alpha, df);\n const diff = m1 - m2;\n const ci: [number, number] = [diff - tCrit * se, diff + tCrit * se];\n\n return {\n statistic: t,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: ci,\n effectSize: cohensD(group1, group2),\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n}\n\n/**\n * One-sample t-test against a known value.\n */\nexport function oneSampleTTest(\n data: number[],\n populationMean: number,\n alpha: number = 0.05,\n direction: HypothesisDirection = 'different'\n): StatisticalResult {\n const n = data.length;\n\n if (n < 2) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n }\n\n const m = mean(data);\n const se = standardError(data);\n\n if (se === 0) {\n return {\n statistic: 0,\n pValue: m === populationMean ? 1 : 0,\n significant: m !== populationMean,\n confidenceInterval: [m, m],\n effectSize: 0,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n }\n\n const t = (m - populationMean) / se;\n const df = n - 1;\n\n const pTwoTailed = tDistPValue(Math.abs(t), df);\n let pValue: number;\n\n switch (direction) {\n case 'greater':\n pValue = t > 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'less':\n pValue = t < 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n default:\n pValue = pTwoTailed;\n }\n\n const tCrit = tDistCritical(alpha, df);\n const ci: [number, number] = [m - tCrit * se, m + tCrit * se];\n\n const sd = standardDeviation(data);\n const effectSize = sd > 0 ? (m - populationMean) / sd : 0;\n\n return {\n statistic: t,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: ci,\n effectSize,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n}\n\n/**\n * Mann-Whitney U test (non-parametric alternative to t-test).\n * Tests whether one group tends to have larger values than the other.\n */\nexport function mannWhitneyU(\n group1: number[],\n group2: number[],\n alpha: number = 0.05\n): StatisticalResult {\n const n1 = group1.length;\n const n2 = group2.length;\n\n if (n1 === 0 || n2 === 0) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n }\n\n // Count how many times group1 values exceed group2 values\n let u1 = 0;\n for (const a of group1) {\n for (const b of group2) {\n if (a > b) u1++;\n else if (a === b) u1 += 0.5;\n }\n }\n\n const u2 = n1 * n2 - u1;\n const u = Math.min(u1, u2);\n\n // Normal approximation for larger samples\n const meanU = (n1 * n2) / 2;\n const sigmaU = Math.sqrt((n1 * n2 * (n1 + n2 + 1)) / 12);\n\n if (sigmaU === 0) {\n return {\n statistic: u,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n }\n\n const z = (u - meanU) / sigmaU;\n const pValue = 2 * normalCDF(-Math.abs(z)); // Two-tailed\n\n // Effect size: rank-biserial correlation r = 1 - 2U/(n1*n2)\n const effectSize = 1 - (2 * u) / (n1 * n2);\n\n return {\n statistic: u,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: [0, 0], // CI not standard for U-test\n effectSize,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n}\n\n/**\n * Chi-squared goodness-of-fit test.\n * Tests whether observed frequencies match expected frequencies.\n */\nexport function chiSquaredTest(\n observed: number[],\n expected: number[],\n alpha: number = 0.05\n): StatisticalResult {\n if (observed.length !== expected.length || observed.length === 0) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'chi_squared',\n sampleSize: 0,\n };\n }\n\n let chiSq = 0;\n let totalObserved = 0;\n\n for (let i = 0; i < observed.length; i++) {\n if (expected[i] <= 0) continue;\n chiSq += (observed[i] - expected[i]) ** 2 / expected[i];\n totalObserved += observed[i];\n }\n\n const df = observed.length - 1;\n if (df <= 0) {\n return {\n statistic: chiSq,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'chi_squared',\n sampleSize: totalObserved,\n };\n }\n\n // Approximate p-value using Wilson-Hilferty approximation\n const pValue = chiSquaredPValue(chiSq, df);\n\n // Cramér's V effect size\n const k = observed.length;\n const effectSize = totalObserved > 0 ? Math.sqrt(chiSq / (totalObserved * (k - 1))) : 0;\n\n return {\n statistic: chiSq,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: [0, 0],\n effectSize,\n testName: 'chi_squared',\n sampleSize: totalObserved,\n };\n}\n\n// =============================================================================\n// METRIC AGGREGATION\n// =============================================================================\n\n/**\n * Extract a named metric from an array of simulation results.\n */\nexport function extractMetric(results: SimulationMetrics[], metricName: string): number[] {\n return results.filter((r) => metricName in r.values).map((r) => r.values[metricName]);\n}\n\n/**\n * Group simulation results by a parameter value.\n */\nexport function groupByParameter(\n results: SimulationMetrics[],\n paramName: string\n): Map<number, SimulationMetrics[]> {\n const groups = new Map<number, SimulationMetrics[]>();\n for (const r of results) {\n const val = r.params[paramName];\n if (val === undefined) continue;\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(r);\n }\n return groups;\n}\n\n/**\n * Generate a summary of metrics across all runs.\n */\nexport function summarizeMetrics(\n results: SimulationMetrics[],\n metricName: string\n): { mean: number; std: number; min: number; max: number; n: number } {\n const values = extractMetric(results, metricName);\n if (values.length === 0) {\n return { mean: 0, std: 0, min: 0, max: 0, n: 0 };\n }\n return {\n mean: mean(values),\n std: standardDeviation(values),\n min: Math.min(...values),\n max: Math.max(...values),\n n: values.length,\n };\n}\n\n// =============================================================================\n// INTERNAL MATH HELPERS\n// =============================================================================\n\n/**\n * Standard normal CDF approximation (Abramowitz and Stegun 26.2.17).\n * Accurate to ~1.5e-7.\n */\nfunction normalCDF(x: number): number {\n if (x < -8) return 0;\n if (x > 8) return 1;\n\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n\n const sign = x < 0 ? -1 : 1;\n const absX = Math.abs(x);\n const t = 1.0 / (1.0 + p * absX);\n const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp((-absX * absX) / 2);\n\n return 0.5 * (1.0 + sign * y);\n}\n\n/**\n * Approximate two-tailed p-value from t-distribution.\n * Uses the Inamdar-Griessammer approximation for large df.\n */\nfunction tDistPValue(absT: number, df: number): number {\n if (df <= 0) return 1;\n // Convert t to approximately normal z for large df\n const z = (absT * (1 - 1 / (4 * df))) / Math.sqrt(1 + (absT * absT) / (2 * df));\n return 2 * (1 - normalCDF(z));\n}\n\n/**\n * Approximate critical t-value for a given alpha and df.\n */\nfunction tDistCritical(alpha: number, df: number): number {\n // Approximate using normal quantile adjusted for df\n const p = 1 - alpha / 2;\n // Rational approximation of the normal quantile (Beasley-Springer-Moro)\n const a = p - 0.5;\n const r = a * a;\n let z =\n (a * (2.50662823884 + r * (-18.61500062529 + r * (41.39119773534 + r * -25.44106049637)))) /\n (1 + r * (-8.4735109309 + r * (23.08336743743 + r * (-21.06224101826 + r * 3.13082909833))));\n\n // Cornish-Fisher expansion for t-distribution\n const g1 = (z ** 3 + z) / (4 * df);\n const g2 = (5 * z ** 5 + 16 * z ** 3 + 3 * z) / (96 * df * df);\n z = z + g1 + g2;\n\n return Math.abs(z);\n}\n\n/**\n * Approximate chi-squared p-value using Wilson-Hilferty.\n */\nfunction chiSquaredPValue(chiSq: number, df: number): number {\n if (df <= 0) return 1;\n if (chiSq <= 0) return 1;\n // Wilson-Hilferty transformation to normal\n const z = Math.pow(chiSq / df, 1 / 3) - (1 - 2 / (9 * df));\n const denom = Math.sqrt(2 / (9 * df));\n return 1 - normalCDF(z / denom);\n}\n","/**\n * @fileoverview SimulationLab Trait Definition for HoloScript\n * @module @holoscript/std/traits\n *\n * Defines the @simulation_lab trait that enables hypothesis testing\n * on any HoloScript composition. Attach this trait to run parameter sweeps,\n * collect metrics across N epochs, and produce statistical results.\n *\n * Composes with all economic traits for economy stress testing.\n *\n * @version 1.0.0\n * @category simulation\n */\n\nimport type { TraitDefinition } from '../types.js';\n\n/**\n * Extended trait definition with simulation-specific metadata.\n */\nexport interface SimulationTraitDefinition extends TraitDefinition {\n /** Compiler hints for batch execution */\n compiler_hints?: {\n requires_runtime?: string[];\n thread_safety?: 'main_thread' | 'worker_thread' | 'any';\n performance_budget_ms?: number;\n batch_mode?: boolean;\n };\n /** Which economic/VR traits this composes with */\n composesWith: string[];\n}\n\n// =============================================================================\n// TRAIT DEFINITION\n// =============================================================================\n\n/**\n * The SimulationLab trait.\n */\nexport const SimulationLabTraits: Record<string, SimulationTraitDefinition> = {\n simulation_lab: {\n name: '@simulation_lab',\n description:\n 'Attaches scientific hypothesis testing to any HoloScript composition. ' +\n 'Enables parameter sweeps, multi-epoch execution, statistical analysis, ' +\n 'and exportable results. The universe gets one sample — HoloScript gives ' +\n 'you infinite. Results are marketplace-sellable as verified simulation data.',\n params: {\n hypothesis: {\n type: 'string',\n required: true,\n description: 'Human-readable hypothesis description.',\n },\n null_hypothesis: {\n type: 'string',\n required: false,\n default: '',\n description: 'Formal null hypothesis (H0). Auto-generated if empty.',\n },\n alternative_hypothesis: {\n type: 'string',\n required: false,\n default: '',\n description: 'Formal alternative hypothesis (H1). Auto-generated if empty.',\n },\n direction: {\n type: 'string',\n required: false,\n default: 'different',\n description: 'Expected direction of effect: greater | less | different | equal.',\n },\n epochs: {\n type: 'number',\n required: false,\n default: 1000,\n description: 'Number of simulation runs per parameter combination. More = higher power.',\n },\n seed_start: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Starting seed for reproducibility. Seeds increment per epoch.',\n },\n confidence_level: {\n type: 'number',\n required: false,\n default: 0.95,\n description: 'Confidence level for statistical tests (0.0 - 1.0). Default 0.95 = α=0.05.',\n },\n metrics: {\n type: 'string[]',\n required: true,\n description:\n 'List of metric names to collect each epoch. Must match emitted metric events.',\n },\n statistical_test: {\n type: 'string',\n required: false,\n default: 'auto',\n description:\n 'Statistical test to use: t_test | mann_whitney_u | chi_squared | auto. ' +\n 'Auto selects based on data distribution.',\n },\n export_training_data: {\n type: 'boolean',\n required: false,\n default: false,\n description: 'Whether to export results as training data for DataForge pipeline.',\n },\n marketplace_publishable: {\n type: 'boolean',\n required: false,\n default: false,\n description:\n 'Whether to package results for marketplace listing as verified simulation data.',\n },\n max_duration_ms: {\n type: 'number',\n required: false,\n default: 300000,\n description:\n 'Maximum wall-clock time for the entire experiment (5 min default). ' +\n 'Prevents runaway simulations.',\n },\n worker_count: {\n type: 'number',\n required: false,\n default: 4,\n description: 'Number of parallel workers for epoch execution.',\n },\n },\n validator: (params) => {\n if (!params.hypothesis || typeof params.hypothesis !== 'string') return false;\n if (!params.metrics || !Array.isArray(params.metrics) || params.metrics.length === 0)\n return false;\n if (params.epochs !== undefined && (params.epochs < 1 || params.epochs > 1000000))\n return false;\n if (\n params.confidence_level !== undefined &&\n (params.confidence_level <= 0 || params.confidence_level >= 1)\n )\n return false;\n if (params.direction !== undefined) {\n if (!['greater', 'less', 'different', 'equal'].includes(params.direction)) return false;\n }\n if (params.statistical_test !== undefined) {\n if (!['t_test', 'mann_whitney_u', 'chi_squared', 'auto'].includes(params.statistical_test))\n return false;\n }\n return true;\n },\n composesWith: [\n '@tradeable',\n '@depreciating',\n '@bonding_curved',\n '@taxable_wealth',\n '@pid_controlled',\n ],\n compiler_hints: {\n requires_runtime: [\n 'SimulationRuntime.runExperiment',\n 'SimulationRuntime.collectMetrics',\n 'SimulationRuntime.runStatisticalTest',\n 'SimulationRuntime.exportResults',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 300000, // Experiment budget, not per-frame\n batch_mode: true,\n },\n },\n};\n\n// =============================================================================\n// TRAIT UTILITIES\n// =============================================================================\n\n/**\n * Get all simulation trait names.\n */\nexport function getSimulationTraitNames(): string[] {\n return Object.keys(SimulationLabTraits).map((k) => SimulationLabTraits[k].name);\n}\n\n/**\n * Look up a simulation trait definition by name.\n */\nexport function getSimulationTrait(name: string): SimulationTraitDefinition | undefined {\n const key = name.startsWith('@') ? name.slice(1) : name;\n return SimulationLabTraits[key];\n}\n\nexport default SimulationLabTraits;\n","/**\n * @holoscript/std - Time Module\n *\n * Time, timer, and scheduling utilities for HoloScript Plus programs.\n */\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function now(): number {\n return Date.now();\n}\n\n/**\n * Get high-resolution timestamp (for performance measurement)\n */\nexport function hrTime(): number {\n if (typeof performance !== 'undefined') {\n return performance.now();\n }\n return Date.now();\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wait until a condition is true\n */\nexport async function waitUntil(\n condition: () => boolean | Promise<boolean>,\n options: { timeout?: number; interval?: number } = {}\n): Promise<void> {\n const { timeout = 30000, interval = 100 } = options;\n const startTime = now();\n\n while (true) {\n if (await condition()) return;\n if (now() - startTime > timeout) {\n throw new Error('waitUntil timeout');\n }\n await sleep(interval);\n }\n}\n\n/**\n * Execute a function with timeout\n */\nexport async function withTimeout<T>(fn: () => Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n fn(),\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error('Timeout')), ms)),\n ]);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n factor?: number;\n onRetry?: (error: Error, attempt: number) => void;\n } = {}\n): Promise<T> {\n const { maxAttempts = 3, initialDelay = 1000, maxDelay = 30000, factor = 2, onRetry } = options;\n\n let lastError: Error;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) break;\n\n onRetry?.(lastError, attempt);\n await sleep(delay);\n delay = Math.min(delay * factor, maxDelay);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(fn: T, ms: number): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, ms);\n }) as T;\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(fn: T, ms: number): T {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n const elapsed = now() - lastCall;\n\n if (elapsed >= ms) {\n lastCall = now();\n fn(...args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCall = now();\n timeoutId = null;\n fn(...args);\n }, ms - elapsed);\n }\n }) as T;\n}\n\n/**\n * Measure execution time of a function\n */\nexport async function measure<T>(\n fn: () => T | Promise<T>\n): Promise<{ result: T; duration: number }> {\n const start = hrTime();\n const result = await fn();\n const duration = hrTime() - start;\n return { result, duration };\n}\n\n/**\n * Measure execution time and log it\n */\nexport async function timed<T>(label: string, fn: () => T | Promise<T>): Promise<T> {\n const start = hrTime();\n try {\n return await fn();\n } finally {\n const duration = hrTime() - start;\n void duration; // timing available for callers via return value\n }\n}\n\n/**\n * Simple stopwatch for measuring elapsed time\n */\nexport class Stopwatch {\n private startTime: number = 0;\n private pausedTime: number = 0;\n private running: boolean = false;\n\n start(): this {\n if (!this.running) {\n this.startTime = hrTime() - this.pausedTime;\n this.running = true;\n }\n return this;\n }\n\n stop(): number {\n if (this.running) {\n this.pausedTime = hrTime() - this.startTime;\n this.running = false;\n }\n return this.pausedTime;\n }\n\n reset(): this {\n this.startTime = 0;\n this.pausedTime = 0;\n this.running = false;\n return this;\n }\n\n restart(): this {\n return this.reset().start();\n }\n\n get elapsed(): number {\n if (this.running) {\n return hrTime() - this.startTime;\n }\n return this.pausedTime;\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n lap(): number {\n const elapsed = this.elapsed;\n this.restart();\n return elapsed;\n }\n}\n\n/**\n * Interval timer with pause/resume support\n */\nexport class IntervalTimer {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private callback: () => void;\n private intervalMs: number;\n private isPaused: boolean = false;\n\n constructor(callback: () => void, intervalMs: number) {\n this.callback = callback;\n this.intervalMs = intervalMs;\n }\n\n start(): this {\n if (!this.intervalId && !this.isPaused) {\n this.intervalId = setInterval(this.callback, this.intervalMs);\n }\n return this;\n }\n\n stop(): this {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.isPaused = false;\n return this;\n }\n\n pause(): this {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n this.isPaused = true;\n }\n return this;\n }\n\n resume(): this {\n if (this.isPaused) {\n this.isPaused = false;\n this.intervalId = setInterval(this.callback, this.intervalMs);\n }\n return this;\n }\n\n get running(): boolean {\n return this.intervalId !== null;\n }\n\n get paused(): boolean {\n return this.isPaused;\n }\n}\n\n/**\n * Countdown timer\n */\nexport class CountdownTimer {\n private remainingMs: number;\n private startTime: number = 0;\n private running: boolean = false;\n private onTick?: (remaining: number) => void;\n private onComplete?: () => void;\n private tickIntervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n durationMs: number,\n options: {\n onTick?: (remaining: number) => void;\n onComplete?: () => void;\n tickInterval?: number;\n } = {}\n ) {\n this.remainingMs = durationMs;\n this.onTick = options.onTick;\n this.onComplete = options.onComplete;\n\n if (options.onTick && options.tickInterval) {\n this.tickIntervalId = setInterval(() => {\n if (this.running) {\n this.onTick?.(this.remaining);\n }\n }, options.tickInterval);\n }\n }\n\n start(): this {\n if (!this.running && this.remainingMs > 0) {\n this.startTime = hrTime();\n this.running = true;\n this.scheduleCompletion();\n }\n return this;\n }\n\n pause(): this {\n if (this.running) {\n this.remainingMs = Math.max(0, this.remainingMs - (hrTime() - this.startTime));\n this.running = false;\n }\n return this;\n }\n\n resume(): this {\n return this.start();\n }\n\n reset(durationMs?: number): this {\n this.running = false;\n this.remainingMs = durationMs ?? this.remainingMs;\n return this;\n }\n\n stop(): this {\n this.running = false;\n if (this.tickIntervalId) {\n clearInterval(this.tickIntervalId);\n this.tickIntervalId = null;\n }\n return this;\n }\n\n get remaining(): number {\n if (this.running) {\n return Math.max(0, this.remainingMs - (hrTime() - this.startTime));\n }\n return this.remainingMs;\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n get isComplete(): boolean {\n return this.remaining <= 0;\n }\n\n private scheduleCompletion(): void {\n setTimeout(() => {\n if (this.running && this.remaining <= 0) {\n this.running = false;\n this.onComplete?.();\n }\n }, this.remainingMs);\n }\n}\n\n/**\n * Frame-based timer for game loops\n */\nexport class FrameTimer {\n private lastFrameTime: number = 0;\n private deltaTime: number = 0;\n private frameCount: number = 0;\n private fps: number = 0;\n private fpsUpdateInterval: number = 1000;\n private lastFpsUpdate: number = 0;\n private framesSinceLastFpsUpdate: number = 0;\n\n /**\n * Call at the start of each frame\n */\n update(): void {\n const currentTime = hrTime();\n\n if (this.lastFrameTime > 0) {\n this.deltaTime = (currentTime - this.lastFrameTime) / 1000; // Convert to seconds\n }\n\n this.lastFrameTime = currentTime;\n this.frameCount++;\n this.framesSinceLastFpsUpdate++;\n\n // Update FPS calculation\n if (currentTime - this.lastFpsUpdate >= this.fpsUpdateInterval) {\n this.fps = (this.framesSinceLastFpsUpdate * 1000) / (currentTime - this.lastFpsUpdate);\n this.lastFpsUpdate = currentTime;\n this.framesSinceLastFpsUpdate = 0;\n }\n }\n\n /**\n * Get delta time in seconds since last frame\n */\n get delta(): number {\n return this.deltaTime;\n }\n\n /**\n * Get delta time in milliseconds since last frame\n */\n get deltaMs(): number {\n return this.deltaTime * 1000;\n }\n\n /**\n * Get total frame count\n */\n get frames(): number {\n return this.frameCount;\n }\n\n /**\n * Get current FPS (frames per second)\n */\n get currentFps(): number {\n return this.fps;\n }\n\n /**\n * Get total elapsed time in seconds\n */\n get totalTime(): number {\n return this.lastFrameTime / 1000;\n }\n\n /**\n * Reset the timer\n */\n reset(): void {\n this.lastFrameTime = 0;\n this.deltaTime = 0;\n this.frameCount = 0;\n this.fps = 0;\n this.lastFpsUpdate = 0;\n this.framesSinceLastFpsUpdate = 0;\n }\n}\n\n/**\n * Schedule a callback to run after a delay\n */\nexport function schedule(callback: () => void, delayMs: number): () => void {\n const timeoutId = setTimeout(callback, delayMs);\n return () => clearTimeout(timeoutId);\n}\n\n/**\n * Schedule a callback to run at regular intervals\n */\nexport function scheduleInterval(callback: () => void, intervalMs: number): () => void {\n const intervalId = setInterval(callback, intervalMs);\n return () => clearInterval(intervalId);\n}\n\n/**\n * Schedule a callback to run on the next animation frame (browser only)\n */\nexport function scheduleFrame(callback: (timestamp: number) => void): () => void {\n if (typeof requestAnimationFrame !== 'undefined') {\n const id = requestAnimationFrame(callback);\n return () => cancelAnimationFrame(id);\n }\n // Fallback for non-browser environments\n const id = setTimeout(() => callback(hrTime()), 16);\n return () => clearTimeout(id);\n}\n\n/**\n * Create a ticker that calls a callback at a target frame rate\n */\nexport function createTicker(\n callback: (delta: number) => void,\n targetFps: number = 60\n): { start: () => void; stop: () => void } {\n const frameTime = 1000 / targetFps;\n let lastTime = 0;\n let running = false;\n let animationId: number | ReturnType<typeof setTimeout>;\n\n const tick = (currentTime: number) => {\n if (!running) return;\n\n if (lastTime > 0) {\n const delta = (currentTime - lastTime) / 1000;\n callback(delta);\n }\n lastTime = currentTime;\n\n if (typeof requestAnimationFrame !== 'undefined') {\n animationId = requestAnimationFrame(tick);\n } else {\n animationId = setTimeout(() => tick(hrTime()), frameTime);\n }\n };\n\n return {\n start: () => {\n if (!running) {\n running = true;\n lastTime = 0;\n if (typeof requestAnimationFrame !== 'undefined') {\n animationId = requestAnimationFrame(tick);\n } else {\n tick(hrTime());\n }\n }\n },\n stop: () => {\n running = false;\n if (typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(animationId as number);\n } else {\n clearTimeout(animationId as ReturnType<typeof setTimeout>);\n }\n },\n };\n}\n\n/**\n * Date/time formatting utilities\n */\nexport const DateTime = {\n /**\n * Format a date as ISO string\n */\n toISO(date: Date = new Date()): string {\n return date.toISOString();\n },\n\n /**\n * Format a date as local string\n */\n toLocal(date: Date = new Date()): string {\n return date.toLocaleString();\n },\n\n /**\n * Format a date using a pattern\n * Supports: YYYY, MM, DD, HH, mm, ss, SSS\n */\n format(date: Date, pattern: string): string {\n const pad = (n: number, width: number) => String(n).padStart(width, '0');\n\n return pattern\n .replace('YYYY', String(date.getFullYear()))\n .replace('MM', pad(date.getMonth() + 1, 2))\n .replace('DD', pad(date.getDate(), 2))\n .replace('HH', pad(date.getHours(), 2))\n .replace('mm', pad(date.getMinutes(), 2))\n .replace('ss', pad(date.getSeconds(), 2))\n .replace('SSS', pad(date.getMilliseconds(), 3));\n },\n\n /**\n * Parse a date string\n */\n parse(dateString: string): Date {\n return new Date(dateString);\n },\n\n /**\n * Get difference between two dates in various units\n */\n diff(date1: Date, date2: Date, unit: 'ms' | 's' | 'm' | 'h' | 'd' = 'ms'): number {\n const diffMs = date1.getTime() - date2.getTime();\n switch (unit) {\n case 'ms':\n return diffMs;\n case 's':\n return diffMs / 1000;\n case 'm':\n return diffMs / 60000;\n case 'h':\n return diffMs / 3600000;\n case 'd':\n return diffMs / 86400000;\n }\n },\n\n /**\n * Add time to a date\n */\n add(date: Date, amount: number, unit: 'ms' | 's' | 'm' | 'h' | 'd'): Date {\n const _ms = DateTime.diff(new Date(amount), new Date(0), 'ms');\n const multipliers = { ms: 1, s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return new Date(date.getTime() + amount * multipliers[unit]);\n },\n\n /**\n * Check if a date is today\n */\n isToday(date: Date): boolean {\n const today = new Date();\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n },\n\n /**\n * Get start of day\n */\n startOfDay(date: Date = new Date()): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n },\n\n /**\n * Get end of day\n */\n endOfDay(date: Date = new Date()): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n },\n};\n"],"mappings":"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","names":["clamp","degToRad","lerp","radToDeg","ray","clamp","lerp","degToRad","radToDeg","aabb","step","count","center","count","perm","sign","id"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/spatial.ts","../src/physics.ts","../src/materials.ts","../src/events.ts","../src/math.ts","../src/collections.ts","../src/string.ts","../src/traits/EconomicPrimitives.ts","../src/traits/EconomicTraits.ts","../src/traits/SimulationLabPrimitives.ts","../src/traits/SimulationLabTraits.ts","../src/time.ts"],"sourcesContent":["/**\n * @holoscript/std - Standard Library for HoloScript Plus\n *\n * Provides core types, math utilities, collections, string operations,\n * time management, spatial math, physics primitives, materials, and events\n * for HoloScript Plus programs.\n *\n * @example\n * ```hsplus\n * import { Vec3, createPBRMaterial, EventBus } from \"@holoscript/std\";\n *\n * let position = Vec3(0, 1, 0);\n * let steel = createPBRMaterial(\"Steel\", \"metal\");\n * let bus = new EventBus();\n * ```\n */\n\n// Re-export everything from types.js\nexport * from './types.js';\n\n// Spatial math (v4.2)\nexport {\n Vec3,\n Quaternion,\n Transform,\n Ray,\n AABB,\n distance,\n lerp as spatialLerp,\n clamp as spatialClamp,\n degToRad as spatialDegToRad,\n radToDeg as spatialRadToDeg,\n} from './spatial.js';\n\n// Physics primitives (v4.2)\nexport {\n createBoxCollider,\n createSphereCollider,\n createCapsuleCollider,\n createRigidbody,\n} from './physics.js';\nexport type {\n ColliderConfig,\n ColliderShapeType,\n RigidbodyConfig,\n ForceFieldConfig,\n ForceFieldType,\n JointConfig,\n JointType,\n RaycastHit,\n} from './physics.js';\n\n// Materials (v4.2)\nexport { MATERIAL_PRESETS, createPBRMaterial } from './materials.js';\nexport type { PBRMaterial, UnlitMaterial, TextureMapType, TextureConfig } from './materials.js';\n\n// Events (v4.2)\nexport { EventBus } from './events.js';\nexport type { EventHandler } from './events.js';\n\n// Math utilities - export objects from math.ts\nexport {\n // Constants\n PI,\n TAU,\n HALF_PI,\n EPSILON,\n DEG_TO_RAD,\n RAD_TO_DEG,\n\n // Basic math functions\n clamp,\n lerp,\n inverseLerp,\n remap,\n smoothstep,\n smootherstep,\n sign,\n fract,\n mod,\n step,\n degToRad,\n radToDeg,\n\n // Math utility objects (access methods like vec2Math.add(), vec3Math.cross(), etc.)\n vec2Math,\n vec3Math,\n quatMath,\n aabbMath,\n noise,\n random,\n} from './math.js';\n\n// Re-export with alternate names for convenience\nexport { degToRad as toRadians, radToDeg as toDegrees } from './math.js';\n\n// Collections\nexport {\n List,\n HoloMap,\n HoloSet,\n HoloMap as Map,\n HoloSet as Set,\n SpatialGrid,\n PriorityQueue,\n} from './collections.js';\n\n// String utilities\nexport {\n isBlank,\n isNotBlank,\n capitalize,\n titleCase,\n camelCase,\n pascalCase,\n snakeCase,\n kebabCase,\n constantCase,\n padLeft,\n padRight,\n center,\n truncate,\n truncateMiddle,\n repeat,\n reverse,\n count,\n containsIgnoreCase,\n startsWithIgnoreCase,\n endsWithIgnoreCase,\n removeWhitespace,\n collapseWhitespace,\n removePrefix,\n removeSuffix,\n wrap as wrapString,\n unwrap,\n lines,\n words,\n chars,\n join,\n format,\n formatNumber,\n numberWithCommas,\n formatBytes,\n formatDuration,\n escapeHtml,\n unescapeHtml,\n escapeRegex,\n slugify,\n isValidIdentifier,\n isNumeric,\n isAlphanumeric,\n isAlpha,\n randomString,\n uuid,\n indent,\n dedent,\n wordWrap,\n levenshtein,\n similarity,\n extractTraits,\n} from './string.js';\n\n// Economic primitives (v4.3)\nexport {\n // Tradeable\n generateTxHash,\n executeTrade,\n // Depreciation\n calculateDepreciation,\n depreciatedValue,\n isDestroyed,\n calculateRepairCost,\n DEFAULT_DEPRECIATION,\n // Bonding curves\n bondingCurvePrice,\n bondingCurveBuyCost,\n bondingCurveSellRefund,\n spatialPrice,\n DEFAULT_BONDING_CURVE,\n // Wealth taxation\n calculateTaxRate,\n calculateTaxAmount,\n calculateRedistribution,\n DEFAULT_WEALTH_TAX,\n // PID control\n createPIDState,\n updatePID,\n createDualLoopPIDState,\n updateDualLoopPID,\n DEFAULT_PID,\n // Faucet-sink tracking\n createFaucetSinkMetrics,\n recordFaucet,\n recordSink,\n resetMetricsPeriod,\n} from './traits/EconomicPrimitives.js';\nexport type {\n Currency,\n AgentID,\n EconomicResult,\n EconomicError,\n EconomicPermission,\n OwnershipRecord,\n TransferRecord,\n DepreciationConfig,\n BondingCurveType,\n BondingCurveConfig,\n WealthTaxConfig,\n PIDConfig,\n PIDState,\n DualLoopPIDConfig,\n DualLoopPIDState,\n FaucetSinkMetrics,\n} from './traits/EconomicPrimitives.js';\n\n// Economic traits (v4.3)\nexport {\n EconomicTraits,\n getEconomicTraitNames,\n getEconomicTrait,\n validateTraitComposition,\n getRequiredPermissions,\n} from './traits/EconomicTraits.js';\nexport type { EconomicTraitDefinition } from './traits/EconomicTraits.js';\n\n// SimulationLab primitives (v4.3)\nexport {\n // Statistics\n mean,\n variance,\n standardDeviation,\n standardError,\n cohensD,\n // Statistical tests\n tTest,\n oneSampleTTest,\n mannWhitneyU,\n chiSquaredTest,\n // Parameter sweeps\n expandSweep,\n generateSweepCombinations,\n isParameterRange,\n // Metric aggregation\n extractMetric,\n groupByParameter,\n summarizeMetrics,\n} from './traits/SimulationLabPrimitives.js';\nexport type {\n Hypothesis,\n HypothesisDirection,\n SimulationStatus,\n ParameterRange,\n ParameterSet,\n ParameterSweep,\n SimulationMetrics,\n StatisticalResult,\n ExperimentResult,\n} from './traits/SimulationLabPrimitives.js';\n\n// SimulationLab traits (v4.3)\nexport {\n SimulationLabTraits,\n getSimulationTraitNames,\n getSimulationTrait,\n} from './traits/SimulationLabTraits.js';\nexport type { SimulationTraitDefinition } from './traits/SimulationLabTraits.js';\n\n// Time utilities\nexport {\n now,\n hrTime,\n sleep,\n waitUntil,\n withTimeout,\n retry,\n debounce,\n throttle,\n measure,\n timed,\n Stopwatch,\n IntervalTimer,\n CountdownTimer,\n FrameTimer,\n schedule,\n scheduleInterval,\n scheduleFrame,\n createTicker,\n DateTime,\n} from './time.js';\n\n/**\n * Print to console (HoloScript standard output)\n */\nexport function print(...args: unknown[]): void {\n console.log(...args);\n}\n\n/**\n * Print error to console\n */\nexport function printError(...args: unknown[]): void {\n console.error(...args);\n}\n\n/**\n * Print warning to console\n */\nexport function printWarn(...args: unknown[]): void {\n console.warn(...args);\n}\n\n/**\n * Assert a condition is true\n */\nexport function assert(condition: boolean, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ?? 'Assertion failed');\n }\n}\n\n/**\n * Assert a value is not null or undefined\n */\nexport function assertDefined<T>(\n value: T | null | undefined,\n message?: string\n): asserts value is T {\n if (value === null || value === undefined) {\n throw new Error(message ?? 'Value is null or undefined');\n }\n}\n\n/**\n * Unreachable code marker (for exhaustiveness checking)\n */\nexport function unreachable(message?: string): never {\n throw new Error(message ?? 'Unreachable code reached');\n}\n\n/**\n * Todo marker (throws at runtime)\n */\nexport function todo(message?: string): never {\n throw new Error(`Not implemented: ${message ?? 'No details'}`);\n}\n\n/**\n * Deep clone an object\n */\nexport function clone<T>(value: T): T {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(clone) as T;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n if (value instanceof Map) {\n return new Map([...value].map(([k, v]) => [clone(k), clone(v)])) as T;\n }\n\n if (value instanceof Set) {\n return new Set([...value].map(clone)) as T;\n }\n\n const result: Record<string, unknown> = {};\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n result[key] = clone((value as Record<string, unknown>)[key]);\n }\n }\n return result as T;\n}\n\n/**\n * Deep equality check\n */\nexport function equals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (typeof a !== 'object') return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => equals(item, b[i]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equals(value, b.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a) {\n if (!b.has(value)) return false;\n }\n return true;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b as object);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) =>\n equals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n}\n\n/**\n * Pipe a value through a series of functions\n */\nexport function pipe<A>(value: A): A;\nexport function pipe<A, B>(value: A, fn1: (a: A) => B): B;\nexport function pipe<A, B, C>(value: A, fn1: (a: A) => B, fn2: (b: B) => C): C;\nexport function pipe<A, B, C, D>(value: A, fn1: (a: A) => B, fn2: (b: B) => C, fn3: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n value: A,\n fn1: (a: A) => B,\n fn2: (b: B) => C,\n fn3: (c: C) => D,\n fn4: (d: D) => E\n): E;\nexport function pipe(value: unknown, ...fns: ((x: unknown) => unknown)[]): unknown {\n return fns.reduce((acc, fn) => fn(acc), value);\n}\n\n/**\n * Compose functions right to left\n */\nexport function compose<A>(): (a: A) => A;\nexport function compose<A, B>(fn1: (a: A) => B): (a: A) => B;\nexport function compose<A, B, C>(fn2: (b: B) => C, fn1: (a: A) => B): (a: A) => C;\nexport function compose<A, B, C, D>(\n fn3: (c: C) => D,\n fn2: (b: B) => C,\n fn1: (a: A) => B\n): (a: A) => D;\nexport function compose(...fns: ((x: unknown) => unknown)[]): (x: unknown) => unknown {\n return (value: unknown) => fns.reduceRight((acc, fn) => fn(acc), value);\n}\n\n/**\n * Identity function\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n\n/**\n * No-operation function\n */\nexport function noop(): void {}\n\n/**\n * Create a constant function\n */\nexport function constant<T>(value: T): () => T {\n return () => value;\n}\n","/**\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 const v = [x, y] as unknown as Vec2;\n Object.defineProperty(v, 'x', {\n value: x,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperty(v, 'y', {\n value: y,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n return v;\n}\n\n/**\n * Create a Vec3\n */\nexport function vec3(x: number = 0, y: number = 0, z: number = 0): Vec3 {\n const v = [x, y, z] as unknown as Vec3;\n Object.defineProperty(v, 'x', {\n value: x,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperty(v, 'y', {\n value: y,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperty(v, 'z', {\n value: z,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n return v;\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 vec3(arr[0] || 0, arr[1] || 0, 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 * @holoscript/std — Spatial Module\n *\n * Provides spatial math utilities: Vec3, Quaternion, Transform, Ray, AABB, distance.\n * Used by the HoloScript runtime for spatial computing operations.\n *\n * @version 0.2.0\n * @module @holoscript/std/spatial\n */\n\n// =============================================================================\n// Vec3\n// =============================================================================\n\nexport class Vec3 {\n constructor(\n public x: number = 0,\n public y: number = 0,\n public z: number = 0\n ) {}\n\n static zero(): Vec3 {\n return new Vec3(0, 0, 0);\n }\n static one(): Vec3 {\n return new Vec3(1, 1, 1);\n }\n static up(): Vec3 {\n return new Vec3(0, 1, 0);\n }\n static down(): Vec3 {\n return new Vec3(0, -1, 0);\n }\n static forward(): Vec3 {\n return new Vec3(0, 0, -1);\n }\n static right(): Vec3 {\n return new Vec3(1, 0, 0);\n }\n\n add(other: Vec3): Vec3 {\n return new Vec3(this.x + other.x, this.y + other.y, this.z + other.z);\n }\n sub(other: Vec3): Vec3 {\n return new Vec3(this.x - other.x, this.y - other.y, this.z - other.z);\n }\n mul(s: number): Vec3 {\n return new Vec3(this.x * s, this.y * s, this.z * s);\n }\n div(s: number): Vec3 {\n return new Vec3(this.x / s, this.y / s, this.z / s);\n }\n\n dot(other: Vec3): number {\n return this.x * other.x + this.y * other.y + this.z * other.z;\n }\n cross(other: Vec3): Vec3 {\n return new Vec3(\n this.y * other.z - this.z * other.y,\n this.z * other.x - this.x * other.z,\n this.x * other.y - this.y * other.x\n );\n }\n\n length(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n lengthSquared(): number {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n normalize(): Vec3 {\n const l = this.length();\n return l > 0 ? this.div(l) : Vec3.zero();\n }\n\n distanceTo(other: Vec3): number {\n return this.sub(other).length();\n }\n lerp(other: Vec3, t: number): Vec3 {\n return this.add(other.sub(this).mul(t));\n }\n\n toArray(): [number, number, number] {\n return [this.x, this.y, this.z];\n }\n static fromArray(arr: number[]): Vec3 {\n return new Vec3(arr[0] || 0, arr[1] || 0, arr[2] || 0);\n }\n\n equals(other: Vec3, epsilon = 1e-6): boolean {\n return (\n Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.z - other.z) < epsilon\n );\n }\n\n toString(): string {\n return `Vec3(${this.x}, ${this.y}, ${this.z})`;\n }\n}\n\n// =============================================================================\n// Quaternion\n// =============================================================================\n\nexport class Quaternion {\n constructor(\n public x = 0,\n public y = 0,\n public z = 0,\n public w = 1\n ) {}\n\n static identity(): Quaternion {\n return new Quaternion(0, 0, 0, 1);\n }\n\n static fromEuler(x: number, y: number, z: number): Quaternion {\n const cx = Math.cos(x * 0.5),\n sx = Math.sin(x * 0.5);\n const cy = Math.cos(y * 0.5),\n sy = Math.sin(y * 0.5);\n const cz = Math.cos(z * 0.5),\n sz = Math.sin(z * 0.5);\n return new Quaternion(\n sx * cy * cz - cx * sy * sz,\n cx * sy * cz + sx * cy * sz,\n cx * cy * sz - sx * sy * cz,\n cx * cy * cz + sx * sy * sz\n );\n }\n\n static fromAxisAngle(axis: Vec3, angle: number): Quaternion {\n const half = angle * 0.5;\n const s = Math.sin(half);\n const n = axis.normalize();\n return new Quaternion(n.x * s, n.y * s, n.z * s, Math.cos(half));\n }\n\n multiply(other: Quaternion): Quaternion {\n return new Quaternion(\n this.w * other.x + this.x * other.w + this.y * other.z - this.z * other.y,\n this.w * other.y - this.x * other.z + this.y * other.w + this.z * other.x,\n this.w * other.z + this.x * other.y - this.y * other.x + this.z * other.w,\n this.w * other.w - this.x * other.x - this.y * other.y - this.z * other.z\n );\n }\n\n rotateVec3(v: Vec3): Vec3 {\n const u = new Vec3(this.x, this.y, this.z);\n const s = this.w;\n return u\n .mul(2 * u.dot(v))\n .add(v.mul(s * s - u.dot(u)))\n .add(u.cross(v).mul(2 * s));\n }\n\n slerp(other: Quaternion, t: number): Quaternion {\n let dot = this.x * other.x + this.y * other.y + this.z * other.z + this.w * other.w;\n const neg = dot < 0;\n if (neg) dot = -dot;\n if (dot > 0.9995) {\n // Linear interpolation for very close quaternions\n const r = new Quaternion(\n this.x + t * ((neg ? -other.x : other.x) - this.x),\n this.y + t * ((neg ? -other.y : other.y) - this.y),\n this.z + t * ((neg ? -other.z : other.z) - this.z),\n this.w + t * ((neg ? -other.w : other.w) - this.w)\n );\n const len = Math.sqrt(r.x * r.x + r.y * r.y + r.z * r.z + r.w * r.w);\n return new Quaternion(r.x / len, r.y / len, r.z / len, r.w / len);\n }\n const theta = Math.acos(dot);\n const sinTheta = Math.sin(theta);\n const a = Math.sin((1 - t) * theta) / sinTheta;\n const b = (Math.sin(t * theta) / sinTheta) * (neg ? -1 : 1);\n return new Quaternion(\n a * this.x + b * other.x,\n a * this.y + b * other.y,\n a * this.z + b * other.z,\n a * this.w + b * other.w\n );\n }\n\n normalize(): Quaternion {\n const len = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n return new Quaternion(this.x / len, this.y / len, this.z / len, this.w / len);\n }\n\n toEuler(): Vec3 {\n const sinr = 2 * (this.w * this.x + this.y * this.z);\n const cosr = 1 - 2 * (this.x * this.x + this.y * this.y);\n const sinp = 2 * (this.w * this.y - this.z * this.x);\n const siny = 2 * (this.w * this.z + this.x * this.y);\n const cosy = 1 - 2 * (this.y * this.y + this.z * this.z);\n return new Vec3(\n Math.atan2(sinr, cosr),\n Math.abs(sinp) >= 1 ? (Math.sign(sinp) * Math.PI) / 2 : Math.asin(sinp),\n Math.atan2(siny, cosy)\n );\n }\n}\n\n// =============================================================================\n// Transform\n// =============================================================================\n\nexport class Transform {\n constructor(\n public position: Vec3 = Vec3.zero(),\n public rotation: Quaternion = Quaternion.identity(),\n public scale: Vec3 = Vec3.one()\n ) {}\n\n static identity(): Transform {\n return new Transform();\n }\n\n transformPoint(point: Vec3): Vec3 {\n const scaled = new Vec3(point.x * this.scale.x, point.y * this.scale.y, point.z * this.scale.z);\n return this.rotation.rotateVec3(scaled).add(this.position);\n }\n\n transformDirection(dir: Vec3): Vec3 {\n return this.rotation.rotateVec3(dir);\n }\n}\n\n// =============================================================================\n// Ray & AABB\n// =============================================================================\n\nexport class Ray {\n constructor(\n public origin: Vec3,\n public direction: Vec3\n ) {}\n\n pointAt(t: number): Vec3 {\n return this.origin.add(this.direction.mul(t));\n }\n}\n\nexport class AABB {\n constructor(\n public min: Vec3,\n public max: Vec3\n ) {}\n\n contains(point: Vec3): boolean {\n return (\n point.x >= this.min.x &&\n point.x <= this.max.x &&\n point.y >= this.min.y &&\n point.y <= this.max.y &&\n point.z >= this.min.z &&\n point.z <= this.max.z\n );\n }\n\n intersects(other: AABB): boolean {\n return (\n this.min.x <= other.max.x &&\n this.max.x >= other.min.x &&\n this.min.y <= other.max.y &&\n this.max.y >= other.min.y &&\n this.min.z <= other.max.z &&\n this.max.z >= other.min.z\n );\n }\n\n center(): Vec3 {\n return this.min.add(this.max).div(2);\n }\n size(): Vec3 {\n return this.max.sub(this.min);\n }\n\n intersectsRay(ray: Ray): number | null {\n let tmin = (this.min.x - ray.origin.x) / ray.direction.x;\n let tmax = (this.max.x - ray.origin.x) / ray.direction.x;\n if (tmin > tmax) [tmin, tmax] = [tmax, tmin];\n\n let tymin = (this.min.y - ray.origin.y) / ray.direction.y;\n let tymax = (this.max.y - ray.origin.y) / ray.direction.y;\n if (tymin > tymax) [tymin, tymax] = [tymax, tymin];\n\n if (tmin > tymax || tymin > tmax) return null;\n tmin = Math.max(tmin, tymin);\n tmax = Math.min(tmax, tymax);\n\n let tzmin = (this.min.z - ray.origin.z) / ray.direction.z;\n let tzmax = (this.max.z - ray.origin.z) / ray.direction.z;\n if (tzmin > tzmax) [tzmin, tzmax] = [tzmax, tzmin];\n\n if (tmin > tzmax || tzmin > tmax) return null;\n return Math.max(tmin, tzmin);\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nexport function distance(a: Vec3, b: Vec3): number {\n return a.distanceTo(b);\n}\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\nexport function degToRad(deg: number): number {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number): number {\n return rad * (180 / Math.PI);\n}\n","/**\n * @holoscript/std — Physics Module\n *\n * Provides physics primitives: ColliderShape, RigidbodyConfig, ForceField, Joint.\n * Runtime representations for HoloScript physics blocks.\n *\n * @version 0.2.0\n * @module @holoscript/std/physics\n */\n\nimport type { Vec3 } from './spatial.js';\n\n// =============================================================================\n// Collider Shapes\n// =============================================================================\n\nexport type ColliderShapeType =\n | 'box'\n | 'sphere'\n | 'capsule'\n | 'mesh'\n | 'convex'\n | 'cylinder'\n | 'heightfield';\n\nexport interface ColliderConfig {\n shape: ColliderShapeType;\n isTrigger: boolean;\n friction: number;\n restitution: number;\n // Shape-specific\n radius?: number;\n halfExtents?: Vec3;\n height?: number;\n meshAsset?: string;\n}\n\nexport function createBoxCollider(\n halfExtents: Vec3,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return {\n shape: 'box',\n isTrigger: false,\n friction: 0.5,\n restitution: 0.0,\n halfExtents,\n ...options,\n };\n}\n\nexport function createSphereCollider(\n radius: number,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return { shape: 'sphere', isTrigger: false, friction: 0.5, restitution: 0.0, radius, ...options };\n}\n\nexport function createCapsuleCollider(\n radius: number,\n height: number,\n options?: Partial<ColliderConfig>\n): ColliderConfig {\n return {\n shape: 'capsule',\n isTrigger: false,\n friction: 0.5,\n restitution: 0.0,\n radius,\n height,\n ...options,\n };\n}\n\n// =============================================================================\n// Rigidbody\n// =============================================================================\n\nexport interface RigidbodyConfig {\n mass: number;\n useGravity: boolean;\n linearDamping: number;\n angularDamping: number;\n freezePosition: [boolean, boolean, boolean];\n freezeRotation: [boolean, boolean, boolean];\n isKinematic: boolean;\n}\n\nexport function createRigidbody(mass: number, options?: Partial<RigidbodyConfig>): RigidbodyConfig {\n return {\n mass,\n useGravity: true,\n linearDamping: 0.0,\n angularDamping: 0.05,\n freezePosition: [false, false, false],\n freezeRotation: [false, false, false],\n isKinematic: false,\n ...options,\n };\n}\n\n// =============================================================================\n// Force Fields\n// =============================================================================\n\nexport type ForceFieldType = 'directional' | 'radial' | 'vortex' | 'buoyancy';\n\nexport interface ForceFieldConfig {\n type: ForceFieldType;\n strength: number;\n direction?: Vec3;\n falloff: 'none' | 'linear' | 'quadratic';\n turbulence: number;\n}\n\n// =============================================================================\n// Joints\n// =============================================================================\n\nexport type JointType = 'hinge' | 'slider' | 'ball_socket' | 'fixed' | 'd6' | 'spring';\n\nexport interface JointConfig {\n type: JointType;\n connectedBody?: string;\n axis?: Vec3;\n limits?: [number, number];\n damping: number;\n springForce?: number;\n breakForce?: number;\n}\n\n// =============================================================================\n// Raycast Utility\n// =============================================================================\n\nexport interface RaycastHit {\n point: Vec3;\n normal: Vec3;\n distance: number;\n objectName: string;\n}\n","/**\n * @holoscript/std — Materials Module\n *\n * Provides PBR material types, texture map definitions, and material presets.\n * Maps directly to HoloScript material_block grammar constructs.\n *\n * @version 0.2.0\n * @module @holoscript/std/materials\n */\n\n// =============================================================================\n// PBR Material\n// =============================================================================\n\nexport interface PBRMaterial {\n name: string;\n baseColor: string; // hex color\n roughness: number; // 0.0 - 1.0\n metallic: number; // 0.0 - 1.0\n emissiveColor?: string;\n emissiveIntensity?: number;\n opacity?: number; // 0.0 - 1.0\n ior?: number; // Index of refraction (glass ~1.5, water ~1.33)\n subsurface?: number;\n clearcoat?: number;\n clearcoatRoughness?: number;\n // Texture maps\n albedoMap?: string;\n normalMap?: string;\n roughnessMap?: string;\n metallicMap?: string;\n emissionMap?: string;\n aoMap?: string;\n heightMap?: string;\n opacityMap?: string;\n displacementMap?: string;\n}\n\nexport interface UnlitMaterial {\n name: string;\n color: string;\n emissiveColor?: string;\n emissiveIntensity?: number;\n opacity?: number;\n texture?: string;\n}\n\n// =============================================================================\n// Material Presets\n// =============================================================================\n\nexport const MATERIAL_PRESETS: Record<string, Partial<PBRMaterial>> = {\n metal: { roughness: 0.2, metallic: 1.0 },\n wood: { roughness: 0.85, metallic: 0.0, baseColor: '#8B6914' },\n glass: { roughness: 0.05, metallic: 0.0, opacity: 0.3, ior: 1.5 },\n plastic: { roughness: 0.4, metallic: 0.0 },\n concrete: { roughness: 0.95, metallic: 0.0, baseColor: '#808080' },\n fabric: { roughness: 0.9, metallic: 0.0, subsurface: 0.2 },\n water: { roughness: 0.05, metallic: 0.0, opacity: 0.7, ior: 1.33 },\n rubber: { roughness: 0.95, metallic: 0.0, baseColor: '#222222' },\n marble: { roughness: 0.3, metallic: 0.0, baseColor: '#f0f0f0' },\n skin: { roughness: 0.6, metallic: 0.0, subsurface: 0.5 },\n foliage: { roughness: 0.8, metallic: 0.0, baseColor: '#2d5a27', subsurface: 0.3 },\n chrome: { roughness: 0.05, metallic: 1.0, baseColor: '#cccccc' },\n gold: { roughness: 0.2, metallic: 1.0, baseColor: '#ffd700' },\n copper: { roughness: 0.3, metallic: 1.0, baseColor: '#b87333' },\n ice: { roughness: 0.1, metallic: 0.0, opacity: 0.8, ior: 1.31 },\n};\n\nexport function createPBRMaterial(\n name: string,\n preset?: keyof typeof MATERIAL_PRESETS,\n overrides?: Partial<PBRMaterial>\n): PBRMaterial {\n const base = preset ? MATERIAL_PRESETS[preset] : {};\n return {\n name,\n baseColor: '#ffffff',\n roughness: 0.5,\n metallic: 0.0,\n ...base,\n ...overrides,\n };\n}\n\n// =============================================================================\n// Texture Map Types\n// =============================================================================\n\nexport type TextureMapType =\n | 'albedo_map'\n | 'normal_map'\n | 'roughness_map'\n | 'metallic_map'\n | 'emission_map'\n | 'ao_map'\n | 'height_map'\n | 'opacity_map'\n | 'displacement_map'\n | 'specular_map'\n | 'clearcoat_map';\n\nexport interface TextureConfig {\n source: string;\n tiling?: [number, number];\n offset?: [number, number];\n filter?: 'linear' | 'nearest';\n wrap?: 'repeat' | 'clamp' | 'mirror';\n}\n","/**\n * @holoscript/std — Events Module\n *\n * Provides a typed event bus for HoloScript compositions.\n * Supports emit, on, once, off, and wildcard listeners.\n *\n * @version 0.2.0\n * @module @holoscript/std/events\n */\n\nexport type EventHandler<T = any> = (data: T) => void;\n\ninterface Listener {\n handler: EventHandler;\n once: boolean;\n}\n\nexport class EventBus {\n private listeners: Map<string, Listener[]> = new Map();\n private wildcardListeners: Listener[] = [];\n\n /** Register an event listener. */\n on<T = any>(event: string, handler: EventHandler<T>): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, []);\n const listener: Listener = { handler, once: false };\n this.listeners.get(event)!.push(listener);\n return () => this.off(event, handler);\n }\n\n /** Register a one-time event listener. */\n once<T = any>(event: string, handler: EventHandler<T>): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, []);\n const listener: Listener = { handler, once: true };\n this.listeners.get(event)!.push(listener);\n return () => this.off(event, handler);\n }\n\n /** Remove an event listener. */\n off(event: string, handler: EventHandler): void {\n const list = this.listeners.get(event);\n if (!list) return;\n this.listeners.set(\n event,\n list.filter((l) => l.handler !== handler)\n );\n }\n\n /** Emit an event to all registered listeners. */\n emit<T = any>(event: string, data?: T): void {\n // Fire specific listeners\n const list = this.listeners.get(event);\n if (list) {\n const remaining: Listener[] = [];\n for (const l of list) {\n l.handler(data);\n if (!l.once) remaining.push(l);\n }\n this.listeners.set(event, remaining);\n }\n // Fire wildcard listeners\n for (const l of this.wildcardListeners) {\n l.handler({ event, data });\n }\n }\n\n /** Listen to all events. */\n onAny(handler: EventHandler<{ event: string; data: any }>): () => void {\n const listener: Listener = { handler, once: false };\n this.wildcardListeners.push(listener);\n return () => {\n this.wildcardListeners = this.wildcardListeners.filter((l) => l !== listener);\n };\n }\n\n /** Remove all listeners. */\n clear(): void {\n this.listeners.clear();\n this.wildcardListeners = [];\n }\n\n /** Get count of listeners for an event (or all events). */\n listenerCount(event?: string): number {\n if (event) return (this.listeners.get(event) || []).length;\n let total = this.wildcardListeners.length;\n for (const [, list] of this.listeners) total += list.length;\n return total;\n }\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 => vec3(a.x + b.x, a.y + b.y, 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","/**\n * @holoscript/std - Collections Module\n *\n * Provides List, Map, and Set implementations with functional operations\n * for use in HoloScript Plus programs.\n */\n\nimport type { Vec3 } from './types.js';\n\n/**\n * Immutable List with functional operations\n */\nexport class List<T> {\n private readonly items: readonly T[];\n\n constructor(items: Iterable<T> = []) {\n this.items = Array.from(items);\n }\n\n static of<T>(...items: T[]): List<T> {\n return new List(items);\n }\n\n static from<T>(iterable: Iterable<T>): List<T> {\n return new List(iterable);\n }\n\n static range(start: number, end: number, step = 1): List<number> {\n const items: number[] = [];\n for (let i = start; step > 0 ? i < end : i > end; i += step) {\n items.push(i);\n }\n return new List(items);\n }\n\n static repeat<T>(value: T, count: number): List<T> {\n return new List(Array(count).fill(value));\n }\n\n get length(): number {\n return this.items.length;\n }\n\n get isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n get(index: number): T | undefined {\n return index < 0 ? this.items[this.items.length + index] : this.items[index];\n }\n\n first(): T | undefined {\n return this.items[0];\n }\n\n last(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n map<U>(fn: (item: T, index: number) => U): List<U> {\n return new List(this.items.map(fn));\n }\n\n flatMap<U>(fn: (item: T, index: number) => List<U> | U[]): List<U> {\n const result: U[] = [];\n this.items.forEach((item, index) => {\n const mapped = fn(item, index);\n if (mapped instanceof List) {\n result.push(...mapped.toArray());\n } else {\n result.push(...mapped);\n }\n });\n return new List(result);\n }\n\n filter(predicate: (item: T, index: number) => boolean): List<T> {\n return new List(this.items.filter(predicate));\n }\n\n reject(predicate: (item: T, index: number) => boolean): List<T> {\n return this.filter((item, index) => !predicate(item, index));\n }\n\n reduce<U>(fn: (acc: U, item: T, index: number) => U, initial: U): U {\n return this.items.reduce(fn, initial);\n }\n\n fold<U>(initial: U, fn: (acc: U, item: T) => U): U {\n return this.items.reduce(fn, initial);\n }\n\n find(predicate: (item: T, index: number) => boolean): T | undefined {\n return this.items.find(predicate);\n }\n\n findIndex(predicate: (item: T, index: number) => boolean): number {\n return this.items.findIndex(predicate);\n }\n\n indexOf(item: T): number {\n return this.items.indexOf(item);\n }\n\n includes(item: T): boolean {\n return this.items.includes(item);\n }\n\n some(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.some(predicate);\n }\n\n every(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.every(predicate);\n }\n\n none(predicate: (item: T, index: number) => boolean): boolean {\n return !this.some(predicate);\n }\n\n count(predicate: (item: T, index: number) => boolean): number {\n return this.filter(predicate).length;\n }\n\n forEach(fn: (item: T, index: number) => void): void {\n this.items.forEach(fn);\n }\n\n concat(...lists: (List<T> | T[])[]): List<T> {\n const arrays = lists.map((l) => (l instanceof List ? l.toArray() : l));\n return new List([...this.items, ...arrays.flat()]);\n }\n\n append(item: T): List<T> {\n return new List([...this.items, item]);\n }\n\n prepend(item: T): List<T> {\n return new List([item, ...this.items]);\n }\n\n insert(index: number, item: T): List<T> {\n const arr = [...this.items];\n arr.splice(index, 0, item);\n return new List(arr);\n }\n\n remove(index: number): List<T> {\n const arr = [...this.items];\n arr.splice(index, 1);\n return new List(arr);\n }\n\n update(index: number, item: T): List<T> {\n const arr = [...this.items];\n arr[index] = item;\n return new List(arr);\n }\n\n slice(start?: number, end?: number): List<T> {\n return new List(this.items.slice(start, end));\n }\n\n take(n: number): List<T> {\n return this.slice(0, n);\n }\n\n takeLast(n: number): List<T> {\n return this.slice(-n);\n }\n\n takeWhile(predicate: (item: T, index: number) => boolean): List<T> {\n const result: T[] = [];\n for (let i = 0; i < this.items.length; i++) {\n if (!predicate(this.items[i], i)) break;\n result.push(this.items[i]);\n }\n return new List(result);\n }\n\n drop(n: number): List<T> {\n return this.slice(n);\n }\n\n dropLast(n: number): List<T> {\n return this.slice(0, -n);\n }\n\n dropWhile(predicate: (item: T, index: number) => boolean): List<T> {\n let startIndex = 0;\n for (let i = 0; i < this.items.length; i++) {\n if (!predicate(this.items[i], i)) break;\n startIndex = i + 1;\n }\n return this.slice(startIndex);\n }\n\n reverse(): List<T> {\n return new List([...this.items].reverse());\n }\n\n sort(compareFn?: (a: T, b: T) => number): List<T> {\n return new List([...this.items].sort(compareFn));\n }\n\n sortBy<U>(fn: (item: T) => U): List<T> {\n return this.sort((a, b) => {\n const va = fn(a);\n const vb = fn(b);\n if (va < vb) return -1;\n if (va > vb) return 1;\n return 0;\n });\n }\n\n shuffle(): List<T> {\n const arr = [...this.items];\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n return new List(arr);\n }\n\n unique(): List<T> {\n return new List([...new Set(this.items)]);\n }\n\n uniqueBy<U>(fn: (item: T) => U): List<T> {\n const seen = new Set<U>();\n const result: T[] = [];\n for (const item of this.items) {\n const key = fn(item);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(item);\n }\n }\n return new List(result);\n }\n\n groupBy<K>(fn: (item: T) => K): HoloMap<K, List<T>> {\n const groups = new Map<K, T[]>();\n for (const item of this.items) {\n const key = fn(item);\n const group = groups.get(key) || [];\n group.push(item);\n groups.set(key, group);\n }\n const result = new Map<K, List<T>>();\n for (const [key, items] of groups) {\n result.set(key, new List(items));\n }\n return new HoloMap(result);\n }\n\n partition(predicate: (item: T, index: number) => boolean): [List<T>, List<T>] {\n const pass: T[] = [];\n const fail: T[] = [];\n this.items.forEach((item, index) => {\n if (predicate(item, index)) {\n pass.push(item);\n } else {\n fail.push(item);\n }\n });\n return [new List(pass), new List(fail)];\n }\n\n zip<U>(other: List<U>): List<[T, U]> {\n const length = Math.min(this.length, other.length);\n const result: [T, U][] = [];\n for (let i = 0; i < length; i++) {\n result.push([this.items[i], other.get(i)!]);\n }\n return new List(result);\n }\n\n zipWith<U, V>(other: List<U>, fn: (a: T, b: U) => V): List<V> {\n return this.zip(other).map(([a, b]) => fn(a, b));\n }\n\n flatten<U>(this: List<List<U> | U[]>): List<U> {\n const result: U[] = [];\n for (const item of this.items) {\n if (item instanceof List) {\n result.push(...item.toArray());\n } else if (Array.isArray(item)) {\n result.push(...item);\n }\n }\n return new List(result);\n }\n\n sum(this: List<number>): number {\n return this.reduce((acc, n) => acc + n, 0);\n }\n\n min(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return Math.min(...this.items);\n }\n\n max(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return Math.max(...this.items);\n }\n\n average(this: List<number>): number | undefined {\n if (this.isEmpty) return undefined;\n return this.sum() / this.length;\n }\n\n join(separator = ','): string {\n return this.items.join(separator);\n }\n\n toArray(): T[] {\n return [...this.items];\n }\n\n toSet(): HoloSet<T> {\n return new HoloSet(this.items);\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n toString(): string {\n return `List(${this.items.join(', ')})`;\n }\n}\n\n/**\n * Immutable Map with functional operations\n */\nexport class HoloMap<K, V> {\n private readonly _map: ReadonlyMap<K, V>;\n\n constructor(entries?: Iterable<[K, V]> | Map<K, V>) {\n this._map = entries instanceof Map ? entries : new Map(entries);\n }\n\n static of<K, V>(...entries: [K, V][]): HoloMap<K, V> {\n return new HoloMap(entries);\n }\n\n static from<K, V>(entries: Iterable<[K, V]>): HoloMap<K, V> {\n return new HoloMap(entries);\n }\n\n static fromObject<V>(obj: Record<string, V>): HoloMap<string, V> {\n return new HoloMap(Object.entries(obj));\n }\n\n get size(): number {\n return this._map.size;\n }\n\n get isEmpty(): boolean {\n return this._map.size === 0;\n }\n\n get(key: K): V | undefined {\n return this._map.get(key);\n }\n\n getOrDefault(key: K, defaultValue: V): V {\n return this._map.has(key) ? this._map.get(key)! : defaultValue;\n }\n\n has(key: K): boolean {\n return this._map.has(key);\n }\n\n set(key: K, value: V): HoloMap<K, V> {\n const newMap = new Map(this._map);\n newMap.set(key, value);\n return new HoloMap(newMap);\n }\n\n delete(key: K): HoloMap<K, V> {\n const newMap = new Map(this._map);\n newMap.delete(key);\n return new HoloMap(newMap);\n }\n\n update(key: K, fn: (value: V | undefined) => V): HoloMap<K, V> {\n return this.set(key, fn(this.get(key)));\n }\n\n merge(other: HoloMap<K, V>): HoloMap<K, V> {\n const newMap = new Map(this._map);\n for (const [key, value] of other) {\n newMap.set(key, value);\n }\n return new HoloMap(newMap);\n }\n\n keys(): List<K> {\n return new List(this._map.keys());\n }\n\n values(): List<V> {\n return new List(this._map.values());\n }\n\n entries(): List<[K, V]> {\n return new List(this._map.entries());\n }\n\n map<U>(fn: (value: V, key: K) => U): HoloMap<K, U> {\n const entries: [K, U][] = [];\n for (const [key, value] of this._map) {\n entries.push([key, fn(value, key)]);\n }\n return new HoloMap(entries);\n }\n\n mapKeys<K2>(fn: (key: K, value: V) => K2): HoloMap<K2, V> {\n const entries: [K2, V][] = [];\n for (const [key, value] of this._map) {\n entries.push([fn(key, value), value]);\n }\n return new HoloMap(entries);\n }\n\n filter(predicate: (value: V, key: K) => boolean): HoloMap<K, V> {\n const entries: [K, V][] = [];\n for (const [key, value] of this._map) {\n if (predicate(value, key)) {\n entries.push([key, value]);\n }\n }\n return new HoloMap(entries);\n }\n\n reduce<U>(fn: (acc: U, value: V, key: K) => U, initial: U): U {\n let acc = initial;\n for (const [key, value] of this._map) {\n acc = fn(acc, value, key);\n }\n return acc;\n }\n\n forEach(fn: (value: V, key: K) => void): void {\n this._map.forEach(fn);\n }\n\n find(predicate: (value: V, key: K) => boolean): [K, V] | undefined {\n for (const [key, value] of this._map) {\n if (predicate(value, key)) {\n return [key, value];\n }\n }\n return undefined;\n }\n\n some(predicate: (value: V, key: K) => boolean): boolean {\n for (const [key, value] of this._map) {\n if (predicate(value, key)) return true;\n }\n return false;\n }\n\n every(predicate: (value: V, key: K) => boolean): boolean {\n for (const [key, value] of this._map) {\n if (!predicate(value, key)) return false;\n }\n return true;\n }\n\n toObject(this: HoloMap<string, V>): Record<string, V> {\n const obj: Record<string, V> = {};\n for (const [key, value] of this._map) {\n obj[key] = value;\n }\n return obj;\n }\n\n toNativeMap(): Map<K, V> {\n return new Map(this._map);\n }\n\n [Symbol.iterator](): Iterator<[K, V]> {\n return this._map[Symbol.iterator]();\n }\n\n toString(): string {\n const entries = [...this._map].map(([k, v]) => `${k}: ${v}`).join(', ');\n return `HoloMap { ${entries} }`;\n }\n}\n\n/**\n * Immutable Set with functional operations\n */\nexport class HoloSet<T> {\n private readonly set: ReadonlySet<T>;\n\n constructor(items?: Iterable<T>) {\n this.set = new Set(items);\n }\n\n static of<T>(...items: T[]): HoloSet<T> {\n return new HoloSet(items);\n }\n\n static from<T>(iterable: Iterable<T>): HoloSet<T> {\n return new HoloSet(iterable);\n }\n\n get size(): number {\n return this.set.size;\n }\n\n get isEmpty(): boolean {\n return this.set.size === 0;\n }\n\n has(item: T): boolean {\n return this.set.has(item);\n }\n\n add(item: T): HoloSet<T> {\n const newSet = new Set(this.set);\n newSet.add(item);\n return new HoloSet(newSet);\n }\n\n delete(item: T): HoloSet<T> {\n const newSet = new Set(this.set);\n newSet.delete(item);\n return new HoloSet(newSet);\n }\n\n addAll(items: Iterable<T>): HoloSet<T> {\n const newSet = new Set(this.set);\n for (const item of items) {\n newSet.add(item);\n }\n return new HoloSet(newSet);\n }\n\n union(other: HoloSet<T>): HoloSet<T> {\n return this.addAll(other);\n }\n\n intersection(other: HoloSet<T>): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (other.has(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n difference(other: HoloSet<T>): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (!other.has(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n symmetricDifference(other: HoloSet<T>): HoloSet<T> {\n return this.difference(other).union(other.difference(this));\n }\n\n isSubsetOf(other: HoloSet<T>): boolean {\n for (const item of this.set) {\n if (!other.has(item)) return false;\n }\n return true;\n }\n\n isSupersetOf(other: HoloSet<T>): boolean {\n return other.isSubsetOf(this);\n }\n\n isDisjointFrom(other: HoloSet<T>): boolean {\n return this.intersection(other).isEmpty;\n }\n\n map<U>(fn: (item: T) => U): HoloSet<U> {\n const result = new Set<U>();\n for (const item of this.set) {\n result.add(fn(item));\n }\n return new HoloSet(result);\n }\n\n filter(predicate: (item: T) => boolean): HoloSet<T> {\n const result = new Set<T>();\n for (const item of this.set) {\n if (predicate(item)) {\n result.add(item);\n }\n }\n return new HoloSet(result);\n }\n\n reduce<U>(fn: (acc: U, item: T) => U, initial: U): U {\n let acc = initial;\n for (const item of this.set) {\n acc = fn(acc, item);\n }\n return acc;\n }\n\n forEach(fn: (item: T) => void): void {\n this.set.forEach(fn);\n }\n\n find(predicate: (item: T) => boolean): T | undefined {\n for (const item of this.set) {\n if (predicate(item)) return item;\n }\n return undefined;\n }\n\n some(predicate: (item: T) => boolean): boolean {\n for (const item of this.set) {\n if (predicate(item)) return true;\n }\n return false;\n }\n\n every(predicate: (item: T) => boolean): boolean {\n for (const item of this.set) {\n if (!predicate(item)) return false;\n }\n return true;\n }\n\n toArray(): T[] {\n return [...this.set];\n }\n\n toList(): List<T> {\n return new List(this.set);\n }\n\n toNativeSet(): Set<T> {\n return new Set(this.set);\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.set[Symbol.iterator]();\n }\n\n toString(): string {\n return `HoloSet { ${[...this.set].join(', ')} }`;\n }\n}\n\n/**\n * Spatial grid for efficient spatial queries (useful for game worlds)\n */\nexport class SpatialGrid<T> {\n private readonly cellSize: number;\n private readonly cells: Map<string, T[]> = new Map();\n\n constructor(cellSize: number) {\n this.cellSize = cellSize;\n }\n\n private getCellKey(x: number, y: number, z: number): string {\n const cx = Math.floor(x / this.cellSize);\n const cy = Math.floor(y / this.cellSize);\n const cz = Math.floor(z / this.cellSize);\n return `${cx},${cy},${cz}`;\n }\n\n insert(position: Vec3, item: T): void {\n const key = this.getCellKey(position.x, position.y, position.z);\n if (!this.cells.has(key)) {\n this.cells.set(key, []);\n }\n this.cells.get(key)!.push(item);\n }\n\n remove(position: Vec3, item: T): boolean {\n const key = this.getCellKey(position.x, position.y, position.z);\n const cell = this.cells.get(key);\n if (!cell) return false;\n const index = cell.indexOf(item);\n if (index === -1) return false;\n cell.splice(index, 1);\n if (cell.length === 0) {\n this.cells.delete(key);\n }\n return true;\n }\n\n query(center: Vec3, radius: number): T[] {\n const results: T[] = [];\n const cellRadius = Math.ceil(radius / this.cellSize);\n const cx = Math.floor(center.x / this.cellSize);\n const cy = Math.floor(center.y / this.cellSize);\n const cz = Math.floor(center.z / this.cellSize);\n\n for (let x = cx - cellRadius; x <= cx + cellRadius; x++) {\n for (let y = cy - cellRadius; y <= cy + cellRadius; y++) {\n for (let z = cz - cellRadius; z <= cz + cellRadius; z++) {\n const cell = this.cells.get(`${x},${y},${z}`);\n if (cell) {\n results.push(...cell);\n }\n }\n }\n }\n\n return results;\n }\n\n queryBox(min: Vec3, max: Vec3): T[] {\n const results: T[] = [];\n const minCx = Math.floor(min.x / this.cellSize);\n const minCy = Math.floor(min.y / this.cellSize);\n const minCz = Math.floor(min.z / this.cellSize);\n const maxCx = Math.floor(max.x / this.cellSize);\n const maxCy = Math.floor(max.y / this.cellSize);\n const maxCz = Math.floor(max.z / this.cellSize);\n\n for (let x = minCx; x <= maxCx; x++) {\n for (let y = minCy; y <= maxCy; y++) {\n for (let z = minCz; z <= maxCz; z++) {\n const cell = this.cells.get(`${x},${y},${z}`);\n if (cell) {\n results.push(...cell);\n }\n }\n }\n }\n\n return results;\n }\n\n clear(): void {\n this.cells.clear();\n }\n\n get cellCount(): number {\n return this.cells.size;\n }\n\n get itemCount(): number {\n let count = 0;\n for (const cell of this.cells.values()) {\n count += cell.length;\n }\n return count;\n }\n}\n\n/**\n * Priority queue (min-heap by default)\n */\nexport class PriorityQueue<T> {\n private heap: { item: T; priority: number }[] = [];\n\n constructor(private compareFn: (a: number, b: number) => number = (a, b) => a - b) {}\n\n static minHeap<T>(): PriorityQueue<T> {\n return new PriorityQueue((a, b) => a - b);\n }\n\n static maxHeap<T>(): PriorityQueue<T> {\n return new PriorityQueue((a, b) => b - a);\n }\n\n get size(): number {\n return this.heap.length;\n }\n\n get isEmpty(): boolean {\n return this.heap.length === 0;\n }\n\n enqueue(item: T, priority: number): void {\n this.heap.push({ item, priority });\n this.bubbleUp(this.heap.length - 1);\n }\n\n dequeue(): T | undefined {\n if (this.isEmpty) return undefined;\n const result = this.heap[0].item;\n const last = this.heap.pop()!;\n if (this.heap.length > 0) {\n this.heap[0] = last;\n this.bubbleDown(0);\n }\n return result;\n }\n\n peek(): T | undefined {\n return this.heap[0]?.item;\n }\n\n peekPriority(): number | undefined {\n return this.heap[0]?.priority;\n }\n\n clear(): void {\n this.heap = [];\n }\n\n private bubbleUp(index: number): void {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2);\n if (this.compareFn(this.heap[index].priority, this.heap[parentIndex].priority) >= 0) break;\n [this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];\n index = parentIndex;\n }\n }\n\n private bubbleDown(index: number): void {\n while (true) {\n const leftChild = 2 * index + 1;\n const rightChild = 2 * index + 2;\n let smallest = index;\n\n if (\n leftChild < this.heap.length &&\n this.compareFn(this.heap[leftChild].priority, this.heap[smallest].priority) < 0\n ) {\n smallest = leftChild;\n }\n if (\n rightChild < this.heap.length &&\n this.compareFn(this.heap[rightChild].priority, this.heap[smallest].priority) < 0\n ) {\n smallest = rightChild;\n }\n\n if (smallest === index) break;\n [this.heap[index], this.heap[smallest]] = [this.heap[smallest], this.heap[index]];\n index = smallest;\n }\n }\n}\n\n// Convenience aliases\nexport { HoloMap as Map };\nexport { HoloSet as Set };\n","/**\n * @holoscript/std - String Module\n *\n * String manipulation utilities for HoloScript Plus programs.\n */\n\n/**\n * Check if a string is empty or only whitespace\n */\nexport function isBlank(s: string): boolean {\n return s.trim().length === 0;\n}\n\n/**\n * Check if a string is not empty and not only whitespace\n */\nexport function isNotBlank(s: string): boolean {\n return s.trim().length > 0;\n}\n\n/**\n * Capitalize the first letter of a string\n */\nexport function capitalize(s: string): string {\n if (s.length === 0) return s;\n return s[0].toUpperCase() + s.slice(1);\n}\n\n/**\n * Capitalize the first letter of each word\n */\nexport function titleCase(s: string): string {\n return s.split(/\\s+/).map(capitalize).join(' ');\n}\n\n/**\n * Convert to camelCase\n */\nexport function camelCase(s: string): string {\n return s\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^[A-Z]/, (c) => c.toLowerCase());\n}\n\n/**\n * Convert to PascalCase\n */\nexport function pascalCase(s: string): string {\n const camel = camelCase(s);\n return camel.length > 0 ? camel[0].toUpperCase() + camel.slice(1) : camel;\n}\n\n/**\n * Convert to snake_case\n */\nexport function snakeCase(s: string): string {\n return s\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\n/**\n * Convert to kebab-case\n */\nexport function kebabCase(s: string): string {\n return s\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Convert to SCREAMING_SNAKE_CASE\n */\nexport function constantCase(s: string): string {\n return snakeCase(s).toUpperCase();\n}\n\n/**\n * Pad a string on the left to reach target length\n */\nexport function padLeft(s: string, length: number, char = ' '): string {\n return s.padStart(length, char);\n}\n\n/**\n * Pad a string on the right to reach target length\n */\nexport function padRight(s: string, length: number, char = ' '): string {\n return s.padEnd(length, char);\n}\n\n/**\n * Pad a string on both sides to center it\n */\nexport function center(s: string, length: number, char = ' '): string {\n if (s.length >= length) return s;\n const totalPadding = length - s.length;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n return char.repeat(leftPadding) + s + char.repeat(rightPadding);\n}\n\n/**\n * Truncate a string to max length, adding ellipsis if needed\n */\nexport function truncate(s: string, maxLength: number, ellipsis = '...'): string {\n if (s.length <= maxLength) return s;\n return s.slice(0, maxLength - ellipsis.length) + ellipsis;\n}\n\n/**\n * Truncate a string in the middle\n */\nexport function truncateMiddle(s: string, maxLength: number, ellipsis = '...'): string {\n if (s.length <= maxLength) return s;\n const availableLength = maxLength - ellipsis.length;\n const leftLength = Math.floor(availableLength / 2);\n const rightLength = Math.ceil(availableLength / 2);\n return s.slice(0, leftLength) + ellipsis + s.slice(-rightLength);\n}\n\n/**\n * Repeat a string n times\n */\nexport function repeat(s: string, count: number): string {\n return s.repeat(count);\n}\n\n/**\n * Reverse a string\n */\nexport function reverse(s: string): string {\n return [...s].reverse().join('');\n}\n\n/**\n * Count occurrences of a substring\n */\nexport function count(s: string, substring: string): number {\n if (substring.length === 0) return 0;\n let count = 0;\n let pos = 0;\n while ((pos = s.indexOf(substring, pos)) !== -1) {\n count++;\n pos += 1;\n }\n return count;\n}\n\n/**\n * Check if string contains a substring (case-insensitive)\n */\nexport function containsIgnoreCase(s: string, substring: string): boolean {\n return s.toLowerCase().includes(substring.toLowerCase());\n}\n\n/**\n * Check if string starts with prefix (case-insensitive)\n */\nexport function startsWithIgnoreCase(s: string, prefix: string): boolean {\n return s.toLowerCase().startsWith(prefix.toLowerCase());\n}\n\n/**\n * Check if string ends with suffix (case-insensitive)\n */\nexport function endsWithIgnoreCase(s: string, suffix: string): boolean {\n return s.toLowerCase().endsWith(suffix.toLowerCase());\n}\n\n/**\n * Remove all whitespace from a string\n */\nexport function removeWhitespace(s: string): string {\n return s.replace(/\\s+/g, '');\n}\n\n/**\n * Collapse multiple spaces into single space\n */\nexport function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Remove a prefix if present\n */\nexport function removePrefix(s: string, prefix: string): string {\n return s.startsWith(prefix) ? s.slice(prefix.length) : s;\n}\n\n/**\n * Remove a suffix if present\n */\nexport function removeSuffix(s: string, suffix: string): string {\n return s.endsWith(suffix) ? s.slice(0, -suffix.length) : s;\n}\n\n/**\n * Wrap a string with prefix and suffix\n */\nexport function wrap(s: string, wrapper: string): string;\nexport function wrap(s: string, prefix: string, suffix: string): string;\nexport function wrap(s: string, prefixOrWrapper: string, suffix?: string): string {\n if (suffix === undefined) {\n return prefixOrWrapper + s + prefixOrWrapper;\n }\n return prefixOrWrapper + s + suffix;\n}\n\n/**\n * Unwrap a string by removing matching prefix and suffix\n */\nexport function unwrap(s: string, wrapper: string): string;\nexport function unwrap(s: string, prefix: string, suffix: string): string;\nexport function unwrap(s: string, prefixOrWrapper: string, suffix?: string): string {\n const prefix = prefixOrWrapper;\n const actualSuffix = suffix ?? prefixOrWrapper;\n if (s.startsWith(prefix) && s.endsWith(actualSuffix)) {\n return s.slice(prefix.length, -actualSuffix.length || undefined);\n }\n return s;\n}\n\n/**\n * Split a string into lines\n */\nexport function lines(s: string): string[] {\n return s.split(/\\r?\\n/);\n}\n\n/**\n * Split a string into words\n */\nexport function words(s: string): string[] {\n return s.split(/\\s+/).filter((w) => w.length > 0);\n}\n\n/**\n * Split a string into characters\n */\nexport function chars(s: string): string[] {\n return [...s];\n}\n\n/**\n * Join strings with a separator\n */\nexport function join(strings: string[], separator = ''): string {\n return strings.join(separator);\n}\n\n/**\n * Format a template string with values\n */\nexport function format(template: string, values: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n return key in values ? String(values[key]) : match;\n });\n}\n\n/**\n * Format a number as a string with grouping\n */\nexport function formatNumber(n: number, options: Intl.NumberFormatOptions = {}): string {\n return n.toLocaleString('en-US', options);\n}\n\n/**\n * Format a number with commas\n */\nexport function numberWithCommas(n: number): string {\n return n.toLocaleString('en-US');\n}\n\n/**\n * Format bytes as human-readable string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n if (bytes < 0) return `${bytes} B`;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];\n}\n\n/**\n * Format duration in milliseconds as human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) {\n return `${(ms / 60000).toFixed(1)}m`;\n }\n const _hours = Math.floor(ms / 3600000);\n const _mins = Math.floor((ms % 3600000) / 60000);\n return `${(ms / 3600000).toFixed(1)}h`;\n}\n\n/**\n * Escape HTML special characters\n */\nexport function escapeHtml(s: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return s.replace(/[&<>\"']/g, (c) => htmlEntities[c]);\n}\n\n/**\n * Unescape HTML entities\n */\nexport function unescapeHtml(s: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n '/': '/',\n };\n return s.replace(\n /&(?:amp|lt|gt|quot|#39|#x27|#x2F);/g,\n (entity) => htmlEntities[entity] || entity\n );\n}\n\n/**\n * Escape regex special characters\n */\nexport function escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Generate a slug from a string\n */\nexport function slugify(s: string): string {\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Check if string is a valid identifier\n */\nexport function isValidIdentifier(s: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(s);\n}\n\n/**\n * Check if string is numeric\n */\nexport function isNumeric(s: string): boolean {\n return !isNaN(parseFloat(s)) && isFinite(Number(s));\n}\n\n/**\n * Check if string is alphanumeric\n */\nexport function isAlphanumeric(s: string): boolean {\n return /^[a-zA-Z0-9]+$/.test(s);\n}\n\n/**\n * Check if string is alphabetic\n */\nexport function isAlpha(s: string): boolean {\n return /^[a-zA-Z]+$/.test(s);\n}\n\n/**\n * Generate a random string\n */\nexport function randomString(\n length: number,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Indent each line of a string\n */\nexport function indent(s: string, spaces: number, char = ' '): string {\n const prefix = char.repeat(spaces);\n return s\n .split('\\n')\n .map((line) => prefix + line)\n .join('\\n');\n}\n\n/**\n * Dedent a string (remove common leading whitespace)\n */\nexport function dedent(s: string): string {\n const linesList = lines(s);\n const nonEmptyLines = linesList.filter((l) => l.trim().length > 0);\n if (nonEmptyLines.length === 0) return s;\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(/^(\\s*)/);\n return match ? match[1].length : 0;\n })\n );\n\n return linesList.map((line) => line.slice(minIndent)).join('\\n');\n}\n\n/**\n * Word wrap text to a maximum width\n */\nexport function wordWrap(s: string, maxWidth: number): string {\n const wordsList = words(s);\n const linesList: string[] = [];\n let currentLine = '';\n\n for (const word of wordsList) {\n if (currentLine.length === 0) {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= maxWidth) {\n currentLine += ' ' + word;\n } else {\n linesList.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine.length > 0) {\n linesList.push(currentLine);\n }\n\n return linesList.join('\\n');\n}\n\n/**\n * Levenshtein distance between two strings\n */\nexport function levenshtein(a: string, b: string): number {\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b[i - 1] === a[j - 1]) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n}\n\nfunction lcsLength(a: string, b: string): number {\n const n = b.length;\n const dp: number[] = new Array(n + 1).fill(0);\n for (let i = 0; i < a.length; i++) {\n let prev = 0;\n for (let j = 0; j < n; j++) {\n const tmp = dp[j + 1];\n dp[j + 1] = a[i] === b[j] ? prev + 1 : Math.max(dp[j + 1], dp[j]);\n prev = tmp;\n }\n }\n return dp[n];\n}\n\n/**\n * Check similarity between two strings (0-1) using Sorensen-Dice over LCS\n */\nexport function similarity(a: string, b: string): number {\n const total = a.length + b.length;\n if (total === 0) return 1;\n return (2 * lcsLength(a, b)) / total;\n}\n\n/**\n * Extract HoloScript trait annotations (@name) and JSX component names from code\n */\nexport function extractTraits(code: string): string[] {\n const traits = new Set<string>();\n let m: RegExpExecArray | null;\n const atRe = /@([a-zA-Z_]\\w*)/g;\n while ((m = atRe.exec(code)) !== null) traits.add(`@${m[1]}`);\n const tagRe = /<([A-Z][a-zA-Z0-9]*)\\b/g;\n while ((m = tagRe.exec(code)) !== null) traits.add(m[1]);\n return [...traits];\n}\n","/**\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","/**\n * @fileoverview Economic Trait Definitions for HoloScript\n * @module @holoscript/std/traits\n *\n * Defines five economic primitive traits that compose with existing VR traits\n * and leverage RBAC for economic permission enforcement:\n *\n * 1. @tradeable - Ownership, transfer, and trade settlement\n * 2. @depreciating - Time-based value decay (hard sink mechanic)\n * 3. @bonding_curved - Autonomous price discovery via bonding curves\n * 4. @taxable_wealth - Progressive wealth taxation with redistribution\n * 5. @pid_controlled - Dual-loop PID feedback for faucet/sink regulation\n *\n * These traits implement the research-proven mechanisms from:\n * - P.030.01 Dual-Loop PID Economy Controller\n * - P.030.02 Bonding Curve Marketplace\n * - P.030.03 Progressive Wealth Recycling\n * - W.031 Faucet-Sink Ratio as Master Variable\n * - W.032 Dual-Loop Feedback Control\n * - W.034 Wealth Tax > Income Tax for Gini Reduction\n * - W.035 Bonding Curves for Price Discovery\n *\n * RBAC Integration:\n * Each trait declares required permissions from the economy.* permission\n * category. The HoloScript compiler enforces these at compile time via\n * the existing AgentRBAC system.\n *\n * @version 1.0.0\n * @category economic\n */\n\nimport type { TraitDefinition } from '../types.js';\n\n/**\n * Extended trait definition with economic-specific metadata.\n */\nexport interface EconomicTraitDefinition extends TraitDefinition {\n /** RBAC permissions required to use this trait */\n requiredPermissions: string[];\n /** Economic layer this trait operates at (from 9-layer architecture) */\n economicLayer: number;\n /** Composability: which other economic traits this one works with */\n composesWith: string[];\n /** Compiler hints for code generation */\n compiler_hints?: {\n requires_runtime?: string[];\n thread_safety?: 'main_thread' | 'worker_thread' | 'any';\n performance_budget_ms?: number;\n };\n}\n\n// =============================================================================\n// TRAIT DEFINITIONS\n// =============================================================================\n\n/**\n * The five economic primitive traits.\n */\nexport const EconomicTraits: Record<string, EconomicTraitDefinition> = {\n // ---------------------------------------------------------------------------\n // 1. TRADEABLE\n // ---------------------------------------------------------------------------\n tradeable: {\n name: '@tradeable',\n description:\n 'Makes a composition or node transferable between agents. Tracks ownership ' +\n 'history with transaction hashes for integrity verification (P.030.04). ' +\n 'Supports lock/unlock for escrow patterns and auction integration.',\n params: {\n initial_owner: {\n type: 'AgentID',\n required: true,\n description: 'The agent who initially owns this entity.',\n },\n transferable: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether transfers are currently allowed.',\n },\n min_price: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Minimum trade price (prevents value manipulation).',\n },\n max_history: {\n type: 'number',\n required: false,\n default: 50,\n description: 'Maximum ownership history entries retained.',\n },\n requires_presence: {\n type: 'boolean',\n required: false,\n default: false,\n description: 'VR-specific: require spatial co-location for trade (anti-exploit, Layer 7).',\n },\n presence_radius: {\n type: 'number',\n required: false,\n default: 5.0,\n description: 'Maximum distance in meters for presence-based trades.',\n },\n },\n validator: (params) => {\n if (!params.initial_owner || typeof params.initial_owner !== 'string') return false;\n if (params.min_price !== undefined && params.min_price < 0) return false;\n return true;\n },\n requiredPermissions: ['economy.trade'],\n economicLayer: 0, // Layer 0: Integrity\n composesWith: ['@depreciating', '@bonding_curved', '@taxable_wealth'],\n compiler_hints: {\n requires_runtime: ['EconomicRuntime.executeTrade', 'EconomicRuntime.verifyOwnership'],\n thread_safety: 'any',\n },\n },\n\n // ---------------------------------------------------------------------------\n // 2. DEPRECIATING\n // ---------------------------------------------------------------------------\n depreciating: {\n name: '@depreciating',\n description:\n 'Applies time-based value decay to an entity (hard sink mechanic). ' +\n 'Uses exponential decay: condition(t) = condition(0) * e^(-rate * t). ' +\n 'When condition reaches destroy_threshold, the entity is consumed -- ' +\n 'removing currency/value from circulation permanently (W.031).',\n params: {\n decay_rate: {\n type: 'number',\n required: true,\n description: 'Per-second decay rate (0.0 - 1.0). E.g., 0.001 = 0.1% per second.',\n },\n initial_condition: {\n type: 'number',\n required: false,\n default: 1.0,\n description: 'Starting condition (1.0 = mint, 0.0 = destroyed).',\n },\n destroy_threshold: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Condition level at which the entity is destroyed.',\n },\n repairable: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether the entity can be repaired to restore condition.',\n },\n repair_cost_multiplier: {\n type: 'number',\n required: false,\n default: 0.5,\n description: 'Repair cost as a fraction of base value per unit condition.',\n },\n emit_on_destroy: {\n type: 'string',\n required: false,\n default: 'on_entity_destroyed',\n description: 'Event emitted when condition reaches destroy threshold.',\n },\n },\n validator: (params) => {\n if (params.decay_rate === undefined || params.decay_rate < 0 || params.decay_rate > 1)\n return false;\n if (\n params.initial_condition !== undefined &&\n (params.initial_condition < 0 || params.initial_condition > 1)\n )\n return false;\n if (\n params.destroy_threshold !== undefined &&\n (params.destroy_threshold < 0 || params.destroy_threshold > 1)\n )\n return false;\n return true;\n },\n requiredPermissions: ['economy.burn'],\n economicLayer: 1, // Layer 1: Flow Control (sink side)\n composesWith: ['@tradeable', '@bonding_curved'],\n compiler_hints: {\n requires_runtime: ['EconomicRuntime.updateDepreciation', 'EconomicRuntime.destroyEntity'],\n thread_safety: 'worker_thread',\n performance_budget_ms: 0.1, // Must be fast -- called every tick\n },\n },\n\n // ---------------------------------------------------------------------------\n // 3. BONDING_CURVED\n // ---------------------------------------------------------------------------\n bonding_curved: {\n name: '@bonding_curved',\n description:\n 'Attaches a bonding curve to a marketplace or item category for autonomous ' +\n 'price discovery. Price is determined by P = f(supply) where f depends on ' +\n 'curve_type. Provides continuous liquidity via reserve pool without order ' +\n 'books (W.035, P.030.02). Supports spatial pricing for VR trade geography.',\n params: {\n curve_type: {\n type: 'string',\n required: false,\n default: 'exponential',\n description: 'Curve shape: linear | exponential | logarithmic | sigmoid.',\n validation: (val: any) => ['linear', 'exponential', 'logarithmic', 'sigmoid'].includes(val),\n },\n reserve_ratio: {\n type: 'number',\n required: true,\n description: 'Base price multiplier (R in the price formula).',\n },\n curve_steepness: {\n type: 'number',\n required: false,\n default: 2.0,\n description: 'Controls price sensitivity to supply changes (n in P = R * S^(1/n)).',\n },\n transaction_fee: {\n type: 'number',\n required: false,\n default: 0.02,\n description: 'Fee percentage per transaction (hard sink). Range: 0.0 - 0.5.',\n },\n initial_supply: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Initial token/item supply on the curve.',\n },\n initial_reserve: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Initial reserve pool balance backing the curve.',\n },\n sigmoid_k: {\n type: 'number',\n required: false,\n default: 100,\n description: 'Half-saturation constant for sigmoid curves.',\n },\n spatial_distance_factor: {\n type: 'number',\n required: false,\n default: 0.0,\n description:\n 'VR spatial pricing: price multiplier per unit distance from hub. ' +\n '0.0 = no spatial effect. Creates emergent trade routes (P.030.02 ENRICHED).',\n },\n },\n validator: (params) => {\n if (params.reserve_ratio === undefined || params.reserve_ratio <= 0) return false;\n if (params.curve_steepness !== undefined && params.curve_steepness <= 0) return false;\n if (\n params.transaction_fee !== undefined &&\n (params.transaction_fee < 0 || params.transaction_fee > 0.5)\n )\n return false;\n if (params.curve_type !== undefined) {\n if (!['linear', 'exponential', 'logarithmic', 'sigmoid'].includes(params.curve_type))\n return false;\n }\n return true;\n },\n requiredPermissions: ['economy.set_price', 'economy.trade'],\n economicLayer: 2, // Layer 2: Price Discovery\n composesWith: ['@tradeable', '@depreciating', '@pid_controlled'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.bondingCurveBuy',\n 'EconomicRuntime.bondingCurveSell',\n 'EconomicRuntime.getSpotPrice',\n ],\n thread_safety: 'any',\n performance_budget_ms: 1.0,\n },\n },\n\n // ---------------------------------------------------------------------------\n // 4. TAXABLE_WEALTH\n // ---------------------------------------------------------------------------\n taxable_wealth: {\n name: '@taxable_wealth',\n description:\n 'Applies progressive logarithmic wealth taxation with optional redistribution ' +\n 'to the lowest-wealth quintile (P.030.03, W.034). Tax = 0 below threshold, ' +\n 'then rate = min(max_rate, log(wealth/threshold) * base_rate). Collected taxes ' +\n 'are partially redistributed (UBI) and partially burned (hard sink).',\n params: {\n threshold: {\n type: 'number',\n required: true,\n description: 'Wealth level below which no tax is levied.',\n },\n base_rate: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Base tax rate multiplied by log(wealth/threshold). Range: 0.0 - 0.1.',\n },\n max_effective_rate: {\n type: 'number',\n required: false,\n default: 0.05,\n description: 'Maximum effective tax rate cap (prevents punishing engagement).',\n },\n collection_interval: {\n type: 'string',\n required: false,\n default: 'daily',\n description: 'How often taxes are collected: hourly | daily | weekly.',\n validation: (val: any) => ['hourly', 'daily', 'weekly'].includes(val),\n },\n enable_redistribution: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether collected tax is redistributed to lowest-wealth players.',\n },\n redistribution_fraction: {\n type: 'number',\n required: false,\n default: 0.7,\n description:\n 'Fraction of tax redistributed (remainder burned as hard sink). Range: 0.0 - 1.0.',\n },\n emit_on_collection: {\n type: 'string',\n required: false,\n default: 'on_tax_collected',\n description: 'Event emitted when taxes are collected.',\n },\n public_ledger: {\n type: 'boolean',\n required: false,\n default: true,\n description:\n 'Whether tax collections and redistribution are visible in the ' +\n 'economy dashboard (Layer 6: Transparency, W.038).',\n },\n },\n validator: (params) => {\n if (params.threshold === undefined || params.threshold < 0) return false;\n if (params.base_rate !== undefined && (params.base_rate < 0 || params.base_rate > 0.1))\n return false;\n if (\n params.max_effective_rate !== undefined &&\n (params.max_effective_rate < 0 || params.max_effective_rate > 1.0)\n )\n return false;\n if (\n params.redistribution_fraction !== undefined &&\n (params.redistribution_fraction < 0 || params.redistribution_fraction > 1.0)\n )\n return false;\n return true;\n },\n requiredPermissions: ['economy.tax', 'economy.redistribute'],\n economicLayer: 4, // Layer 4: Redistribution\n composesWith: ['@tradeable', '@pid_controlled'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.collectTax',\n 'EconomicRuntime.redistribute',\n 'EconomicRuntime.getGiniCoefficient',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 5.0, // Runs on collection interval, not per-frame\n },\n },\n\n // ---------------------------------------------------------------------------\n // 5. PID_CONTROLLED\n // ---------------------------------------------------------------------------\n pid_controlled: {\n name: '@pid_controlled',\n description:\n 'Attaches a dual-loop PID feedback controller to regulate economic flow ' +\n '(P.030.01, W.032). Inner loop adjusts per-source faucet rates (fast). ' +\n 'Outer loop adjusts inner setpoint based on total money supply (slow). ' +\n 'Achieves <10% currency variance long-term while preserving gameplay variance.',\n params: {\n target_per_capita: {\n type: 'number',\n required: true,\n description: 'Target currency per active player (outer loop setpoint).',\n },\n inner_kp: {\n type: 'number',\n required: false,\n default: 0.5,\n description: 'Inner loop proportional gain.',\n },\n inner_ki: {\n type: 'number',\n required: false,\n default: 0.01,\n description: 'Inner loop integral gain.',\n },\n inner_kd: {\n type: 'number',\n required: false,\n default: 0.1,\n description: 'Inner loop derivative gain.',\n },\n outer_kp: {\n type: 'number',\n required: false,\n default: 0.3,\n description: 'Outer loop proportional gain.',\n },\n outer_ki: {\n type: 'number',\n required: false,\n default: 0.005,\n description: 'Outer loop integral gain.',\n },\n outer_kd: {\n type: 'number',\n required: false,\n default: 0.05,\n description: 'Outer loop derivative gain.',\n },\n update_interval: {\n type: 'number',\n required: false,\n default: 1.0,\n description: 'Controller update interval in seconds.',\n },\n faucet_min_multiplier: {\n type: 'number',\n required: false,\n default: 0.1,\n description: 'Minimum faucet rate multiplier (never fully stop rewards).',\n },\n faucet_max_multiplier: {\n type: 'number',\n required: false,\n default: 2.0,\n description: 'Maximum faucet rate multiplier.',\n },\n track_faucet_sink_ratio: {\n type: 'boolean',\n required: false,\n default: true,\n description: 'Whether to track and emit faucet/sink ratio metrics (W.031).',\n },\n emit_on_adjustment: {\n type: 'string',\n required: false,\n default: 'on_faucet_adjusted',\n description: 'Event emitted when faucet rate is adjusted.',\n },\n },\n validator: (params) => {\n if (params.target_per_capita === undefined || params.target_per_capita <= 0) return false;\n // PID gains can be any real number, but should be reasonable\n const gains = [\n params.inner_kp,\n params.inner_ki,\n params.inner_kd,\n params.outer_kp,\n params.outer_ki,\n params.outer_kd,\n ];\n for (const g of gains) {\n if (g !== undefined && (typeof g !== 'number' || isNaN(g))) return false;\n }\n if (params.update_interval !== undefined && params.update_interval <= 0) return false;\n return true;\n },\n requiredPermissions: ['economy.tune_pid', 'economy.mint', 'economy.burn'],\n economicLayer: 1, // Layer 1: Flow Control\n composesWith: ['@bonding_curved', '@taxable_wealth'],\n compiler_hints: {\n requires_runtime: [\n 'EconomicRuntime.updatePID',\n 'EconomicRuntime.getFaucetMultiplier',\n 'EconomicRuntime.getFaucetSinkMetrics',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 0.5,\n },\n },\n};\n\n// =============================================================================\n// TRAIT UTILITIES\n// =============================================================================\n\n/**\n * Get all trait names as an array.\n */\nexport function getEconomicTraitNames(): string[] {\n return Object.keys(EconomicTraits).map((k) => EconomicTraits[k].name);\n}\n\n/**\n * Look up a trait definition by its @-prefixed name.\n */\nexport function getEconomicTrait(name: string): EconomicTraitDefinition | undefined {\n const key = name.startsWith('@') ? name.slice(1) : name;\n return EconomicTraits[key];\n}\n\n/**\n * Validate that a set of composed traits are compatible.\n * Returns an error message if incompatible, or null if valid.\n */\nexport function validateTraitComposition(traitNames: string[]): string | null {\n for (const name of traitNames) {\n const trait = getEconomicTrait(name);\n if (!trait) {\n return `Unknown economic trait: ${name}`;\n }\n }\n\n // Check that all traits compose with each other\n for (const name of traitNames) {\n const trait = getEconomicTrait(name)!;\n for (const other of traitNames) {\n if (other === name) continue;\n const otherPrefixed = other.startsWith('@') ? other : `@${other}`;\n if (!trait.composesWith.includes(otherPrefixed)) {\n return `Trait ${trait.name} does not compose with ${otherPrefixed}`;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get all RBAC permissions required by a set of economic traits.\n */\nexport function getRequiredPermissions(traitNames: string[]): string[] {\n const permissions = new Set<string>();\n for (const name of traitNames) {\n const trait = getEconomicTrait(name);\n if (trait) {\n for (const perm of trait.requiredPermissions) {\n permissions.add(perm);\n }\n }\n }\n return Array.from(permissions).sort();\n}\n\nexport default EconomicTraits;\n","/**\n * @fileoverview SimulationLab Primitives - Runtime math and types for hypothesis testing\n * @module @holoscript/std/simulation\n *\n * Provides the mathematical building blocks for scientific hypothesis testing\n * in HoloScript simulations. Run N epochs with parameter sweeps, collect metrics,\n * and perform statistical analysis to prove or disprove hypotheses.\n *\n * The universe gets one sample. HoloScript gives you infinite.\n *\n * @version 1.0.0\n * @category simulation\n */\n\n// =============================================================================\n// CORE TYPES\n// =============================================================================\n\n/**\n * Direction of expected effect in a hypothesis.\n */\nexport type HypothesisDirection = 'greater' | 'less' | 'different' | 'equal';\n\n/**\n * Status of a simulation run.\n */\nexport type SimulationStatus = 'pending' | 'running' | 'completed' | 'failed';\n\n/**\n * A scientific hypothesis to test.\n */\nexport interface Hypothesis {\n /** Human-readable description */\n description: string;\n /** The null hypothesis (what we're trying to reject) */\n null_hypothesis: string;\n /** The alternative hypothesis (what we're testing for) */\n alternative_hypothesis: string;\n /** Expected direction of effect */\n direction: HypothesisDirection;\n /** Significance threshold (default: 0.05) */\n alpha: number;\n}\n\n/**\n * A range of parameter values to sweep.\n */\nexport interface ParameterRange {\n /** Parameter name */\n name: string;\n /** Start value */\n min: number;\n /** End value */\n max: number;\n /** Step size */\n step: number;\n}\n\n/**\n * A set of discrete parameter values to sweep.\n */\nexport interface ParameterSet {\n /** Parameter name */\n name: string;\n /** Discrete values to test */\n values: number[];\n}\n\n/**\n * Either a range or discrete set of parameter values.\n */\nexport type ParameterSweep = ParameterRange | ParameterSet;\n\n/**\n * Metrics collected from a single simulation run.\n */\nexport interface SimulationMetrics {\n /** Named metric values */\n values: Record<string, number>;\n /** Seed used for this run */\n seed: number;\n /** Parameter values used */\n params: Record<string, number>;\n /** Wall-clock time in ms */\n durationMs: number;\n}\n\n/**\n * Result of a statistical test.\n */\nexport interface StatisticalResult {\n /** Test statistic value */\n statistic: number;\n /** p-value (probability of observing result under null hypothesis) */\n pValue: number;\n /** Whether the null hypothesis is rejected at the given alpha */\n significant: boolean;\n /** Confidence interval [lower, upper] */\n confidenceInterval: [number, number];\n /** Effect size (Cohen's d for t-test) */\n effectSize: number;\n /** Name of the test used */\n testName: string;\n /** Number of samples */\n sampleSize: number;\n}\n\n/**\n * Complete simulation experiment result.\n */\nexport interface ExperimentResult {\n /** The hypothesis tested */\n hypothesis: Hypothesis;\n /** Statistical results per metric */\n results: Record<string, StatisticalResult>;\n /** All collected metrics */\n metrics: SimulationMetrics[];\n /** Total epochs run */\n totalEpochs: number;\n /** Total wall-clock time */\n totalDurationMs: number;\n /** Status */\n status: SimulationStatus;\n /** Composition hash for reproducibility */\n compositionHash: string;\n}\n\n// =============================================================================\n// PARAMETER SWEEP GENERATION\n// =============================================================================\n\n/**\n * Check if a parameter sweep is a range (vs discrete set).\n */\nexport function isParameterRange(sweep: ParameterSweep): sweep is ParameterRange {\n return 'min' in sweep && 'max' in sweep && 'step' in sweep;\n}\n\n/**\n * Generate all values from a parameter sweep.\n */\nexport function expandSweep(sweep: ParameterSweep): number[] {\n if (!isParameterRange(sweep)) {\n return (sweep as ParameterSet).values.slice();\n }\n\n const range = sweep as ParameterRange;\n if (range.step <= 0) return [range.min];\n if (range.min > range.max) return [];\n\n const values: number[] = [];\n for (let v = range.min; v <= range.max + range.step * 0.001; v += range.step) {\n values.push(Math.round(v * 1e10) / 1e10); // Avoid floating point drift\n }\n return values;\n}\n\n/**\n * Generate all parameter combinations from multiple sweeps.\n * Returns an array of parameter maps.\n */\nexport function generateSweepCombinations(sweeps: ParameterSweep[]): Record<string, number>[] {\n if (sweeps.length === 0) return [{}];\n\n const expanded = sweeps.map((s) => ({\n name: s.name,\n values: expandSweep(s),\n }));\n\n // Cartesian product\n let combinations: Record<string, number>[] = [{}];\n\n for (const { name, values } of expanded) {\n const newCombinations: Record<string, number>[] = [];\n for (const combo of combinations) {\n for (const val of values) {\n newCombinations.push({ ...combo, [name]: val });\n }\n }\n combinations = newCombinations;\n }\n\n return combinations;\n}\n\n// =============================================================================\n// STATISTICAL FUNCTIONS\n// =============================================================================\n\n/**\n * Calculate the arithmetic mean of an array of numbers.\n */\nexport function mean(data: number[]): number {\n if (data.length === 0) return 0;\n return data.reduce((sum, v) => sum + v, 0) / data.length;\n}\n\n/**\n * Calculate the sample variance (Bessel's correction).\n */\nexport function variance(data: number[]): number {\n if (data.length < 2) return 0;\n const m = mean(data);\n const squaredDiffs = data.reduce((sum, v) => sum + (v - m) ** 2, 0);\n return squaredDiffs / (data.length - 1);\n}\n\n/**\n * Calculate the sample standard deviation.\n */\nexport function standardDeviation(data: number[]): number {\n return Math.sqrt(variance(data));\n}\n\n/**\n * Calculate the standard error of the mean.\n */\nexport function standardError(data: number[]): number {\n if (data.length === 0) return 0;\n return standardDeviation(data) / Math.sqrt(data.length);\n}\n\n/**\n * Calculate Cohen's d effect size between two groups.\n * d = (mean1 - mean2) / pooled_std\n */\nexport function cohensD(group1: number[], group2: number[]): number {\n if (group1.length < 2 || group2.length < 2) return 0;\n\n const m1 = mean(group1);\n const m2 = mean(group2);\n const v1 = variance(group1);\n const v2 = variance(group2);\n\n // Pooled standard deviation\n const n1 = group1.length;\n const n2 = group2.length;\n const pooledVar = ((n1 - 1) * v1 + (n2 - 1) * v2) / (n1 + n2 - 2);\n const pooledStd = Math.sqrt(pooledVar);\n\n if (pooledStd === 0) return 0;\n return (m1 - m2) / pooledStd;\n}\n\n/**\n * Two-sample independent t-test.\n *\n * Tests whether two groups have significantly different means.\n * Uses Welch's t-test (does not assume equal variances).\n */\nexport function tTest(\n group1: number[],\n group2: number[],\n alpha: number = 0.05,\n direction: HypothesisDirection = 'different'\n): StatisticalResult {\n const n1 = group1.length;\n const n2 = group2.length;\n\n if (n1 < 2 || n2 < 2) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n }\n\n const m1 = mean(group1);\n const m2 = mean(group2);\n const v1 = variance(group1);\n const v2 = variance(group2);\n const se = Math.sqrt(v1 / n1 + v2 / n2);\n\n if (se === 0) {\n return {\n statistic: 0,\n pValue: m1 === m2 ? 1 : 0,\n significant: m1 !== m2,\n confidenceInterval: [m1 - m2, m1 - m2],\n effectSize: 0,\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n }\n\n const t = (m1 - m2) / se;\n\n // Welch–Satterthwaite degrees of freedom\n const num = (v1 / n1 + v2 / n2) ** 2;\n const den = (v1 / n1) ** 2 / (n1 - 1) + (v2 / n2) ** 2 / (n2 - 1);\n const df = num / den;\n\n // Approximate p-value using the t-distribution CDF approximation\n const pTwoTailed = tDistPValue(Math.abs(t), df);\n let pValue: number;\n\n switch (direction) {\n case 'greater':\n pValue = t > 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'less':\n pValue = t < 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'equal':\n pValue = 1 - pTwoTailed;\n break;\n default: // 'different'\n pValue = pTwoTailed;\n }\n\n // Confidence interval for the difference in means\n const tCrit = tDistCritical(alpha, df);\n const diff = m1 - m2;\n const ci: [number, number] = [diff - tCrit * se, diff + tCrit * se];\n\n return {\n statistic: t,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: ci,\n effectSize: cohensD(group1, group2),\n testName: 'welch_t_test',\n sampleSize: n1 + n2,\n };\n}\n\n/**\n * One-sample t-test against a known value.\n */\nexport function oneSampleTTest(\n data: number[],\n populationMean: number,\n alpha: number = 0.05,\n direction: HypothesisDirection = 'different'\n): StatisticalResult {\n const n = data.length;\n\n if (n < 2) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n }\n\n const m = mean(data);\n const se = standardError(data);\n\n if (se === 0) {\n return {\n statistic: 0,\n pValue: m === populationMean ? 1 : 0,\n significant: m !== populationMean,\n confidenceInterval: [m, m],\n effectSize: 0,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n }\n\n const t = (m - populationMean) / se;\n const df = n - 1;\n\n const pTwoTailed = tDistPValue(Math.abs(t), df);\n let pValue: number;\n\n switch (direction) {\n case 'greater':\n pValue = t > 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n case 'less':\n pValue = t < 0 ? pTwoTailed / 2 : 1 - pTwoTailed / 2;\n break;\n default:\n pValue = pTwoTailed;\n }\n\n const tCrit = tDistCritical(alpha, df);\n const ci: [number, number] = [m - tCrit * se, m + tCrit * se];\n\n const sd = standardDeviation(data);\n const effectSize = sd > 0 ? (m - populationMean) / sd : 0;\n\n return {\n statistic: t,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: ci,\n effectSize,\n testName: 'one_sample_t_test',\n sampleSize: n,\n };\n}\n\n/**\n * Mann-Whitney U test (non-parametric alternative to t-test).\n * Tests whether one group tends to have larger values than the other.\n */\nexport function mannWhitneyU(\n group1: number[],\n group2: number[],\n alpha: number = 0.05\n): StatisticalResult {\n const n1 = group1.length;\n const n2 = group2.length;\n\n if (n1 === 0 || n2 === 0) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n }\n\n // Count how many times group1 values exceed group2 values\n let u1 = 0;\n for (const a of group1) {\n for (const b of group2) {\n if (a > b) u1++;\n else if (a === b) u1 += 0.5;\n }\n }\n\n const u2 = n1 * n2 - u1;\n const u = Math.min(u1, u2);\n\n // Normal approximation for larger samples\n const meanU = (n1 * n2) / 2;\n const sigmaU = Math.sqrt((n1 * n2 * (n1 + n2 + 1)) / 12);\n\n if (sigmaU === 0) {\n return {\n statistic: u,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n }\n\n const z = (u - meanU) / sigmaU;\n const pValue = 2 * normalCDF(-Math.abs(z)); // Two-tailed\n\n // Effect size: rank-biserial correlation r = 1 - 2U/(n1*n2)\n const effectSize = 1 - (2 * u) / (n1 * n2);\n\n return {\n statistic: u,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: [0, 0], // CI not standard for U-test\n effectSize,\n testName: 'mann_whitney_u',\n sampleSize: n1 + n2,\n };\n}\n\n/**\n * Chi-squared goodness-of-fit test.\n * Tests whether observed frequencies match expected frequencies.\n */\nexport function chiSquaredTest(\n observed: number[],\n expected: number[],\n alpha: number = 0.05\n): StatisticalResult {\n if (observed.length !== expected.length || observed.length === 0) {\n return {\n statistic: 0,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'chi_squared',\n sampleSize: 0,\n };\n }\n\n let chiSq = 0;\n let totalObserved = 0;\n\n for (let i = 0; i < observed.length; i++) {\n if (expected[i] <= 0) continue;\n chiSq += (observed[i] - expected[i]) ** 2 / expected[i];\n totalObserved += observed[i];\n }\n\n const df = observed.length - 1;\n if (df <= 0) {\n return {\n statistic: chiSq,\n pValue: 1,\n significant: false,\n confidenceInterval: [0, 0],\n effectSize: 0,\n testName: 'chi_squared',\n sampleSize: totalObserved,\n };\n }\n\n // Approximate p-value using Wilson-Hilferty approximation\n const pValue = chiSquaredPValue(chiSq, df);\n\n // Cramér's V effect size\n const k = observed.length;\n const effectSize = totalObserved > 0 ? Math.sqrt(chiSq / (totalObserved * (k - 1))) : 0;\n\n return {\n statistic: chiSq,\n pValue,\n significant: pValue < alpha,\n confidenceInterval: [0, 0],\n effectSize,\n testName: 'chi_squared',\n sampleSize: totalObserved,\n };\n}\n\n// =============================================================================\n// METRIC AGGREGATION\n// =============================================================================\n\n/**\n * Extract a named metric from an array of simulation results.\n */\nexport function extractMetric(results: SimulationMetrics[], metricName: string): number[] {\n return results.filter((r) => metricName in r.values).map((r) => r.values[metricName]);\n}\n\n/**\n * Group simulation results by a parameter value.\n */\nexport function groupByParameter(\n results: SimulationMetrics[],\n paramName: string\n): Map<number, SimulationMetrics[]> {\n const groups = new Map<number, SimulationMetrics[]>();\n for (const r of results) {\n const val = r.params[paramName];\n if (val === undefined) continue;\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(r);\n }\n return groups;\n}\n\n/**\n * Generate a summary of metrics across all runs.\n */\nexport function summarizeMetrics(\n results: SimulationMetrics[],\n metricName: string\n): { mean: number; std: number; min: number; max: number; n: number } {\n const values = extractMetric(results, metricName);\n if (values.length === 0) {\n return { mean: 0, std: 0, min: 0, max: 0, n: 0 };\n }\n return {\n mean: mean(values),\n std: standardDeviation(values),\n min: Math.min(...values),\n max: Math.max(...values),\n n: values.length,\n };\n}\n\n// =============================================================================\n// INTERNAL MATH HELPERS\n// =============================================================================\n\n/**\n * Standard normal CDF approximation (Abramowitz and Stegun 26.2.17).\n * Accurate to ~1.5e-7.\n */\nfunction normalCDF(x: number): number {\n if (x < -8) return 0;\n if (x > 8) return 1;\n\n const a1 = 0.254829592;\n const a2 = -0.284496736;\n const a3 = 1.421413741;\n const a4 = -1.453152027;\n const a5 = 1.061405429;\n const p = 0.3275911;\n\n const sign = x < 0 ? -1 : 1;\n const absX = Math.abs(x);\n const t = 1.0 / (1.0 + p * absX);\n const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp((-absX * absX) / 2);\n\n return 0.5 * (1.0 + sign * y);\n}\n\n/**\n * Approximate two-tailed p-value from t-distribution.\n * Uses the Inamdar-Griessammer approximation for large df.\n */\nfunction tDistPValue(absT: number, df: number): number {\n if (df <= 0) return 1;\n // Convert t to approximately normal z for large df\n const z = (absT * (1 - 1 / (4 * df))) / Math.sqrt(1 + (absT * absT) / (2 * df));\n return 2 * (1 - normalCDF(z));\n}\n\n/**\n * Approximate critical t-value for a given alpha and df.\n */\nfunction tDistCritical(alpha: number, df: number): number {\n // Approximate using normal quantile adjusted for df\n const p = 1 - alpha / 2;\n // Rational approximation of the normal quantile (Beasley-Springer-Moro)\n const a = p - 0.5;\n const r = a * a;\n let z =\n (a * (2.50662823884 + r * (-18.61500062529 + r * (41.39119773534 + r * -25.44106049637)))) /\n (1 + r * (-8.4735109309 + r * (23.08336743743 + r * (-21.06224101826 + r * 3.13082909833))));\n\n // Cornish-Fisher expansion for t-distribution\n const g1 = (z ** 3 + z) / (4 * df);\n const g2 = (5 * z ** 5 + 16 * z ** 3 + 3 * z) / (96 * df * df);\n z = z + g1 + g2;\n\n return Math.abs(z);\n}\n\n/**\n * Approximate chi-squared p-value using Wilson-Hilferty.\n */\nfunction chiSquaredPValue(chiSq: number, df: number): number {\n if (df <= 0) return 1;\n if (chiSq <= 0) return 1;\n // Wilson-Hilferty transformation to normal\n const z = Math.pow(chiSq / df, 1 / 3) - (1 - 2 / (9 * df));\n const denom = Math.sqrt(2 / (9 * df));\n return 1 - normalCDF(z / denom);\n}\n","/**\n * @fileoverview SimulationLab Trait Definition for HoloScript\n * @module @holoscript/std/traits\n *\n * Defines the @simulation_lab trait that enables hypothesis testing\n * on any HoloScript composition. Attach this trait to run parameter sweeps,\n * collect metrics across N epochs, and produce statistical results.\n *\n * Composes with all economic traits for economy stress testing.\n *\n * @version 1.0.0\n * @category simulation\n */\n\nimport type { TraitDefinition } from '../types.js';\n\n/**\n * Extended trait definition with simulation-specific metadata.\n */\nexport interface SimulationTraitDefinition extends TraitDefinition {\n /** Compiler hints for batch execution */\n compiler_hints?: {\n requires_runtime?: string[];\n thread_safety?: 'main_thread' | 'worker_thread' | 'any';\n performance_budget_ms?: number;\n batch_mode?: boolean;\n };\n /** Which economic/VR traits this composes with */\n composesWith: string[];\n}\n\n// =============================================================================\n// TRAIT DEFINITION\n// =============================================================================\n\n/**\n * The SimulationLab trait.\n */\nexport const SimulationLabTraits: Record<string, SimulationTraitDefinition> = {\n simulation_lab: {\n name: '@simulation_lab',\n description:\n 'Attaches scientific hypothesis testing to any HoloScript composition. ' +\n 'Enables parameter sweeps, multi-epoch execution, statistical analysis, ' +\n 'and exportable results. The universe gets one sample — HoloScript gives ' +\n 'you infinite. Results are marketplace-sellable as verified simulation data.',\n params: {\n hypothesis: {\n type: 'string',\n required: true,\n description: 'Human-readable hypothesis description.',\n },\n null_hypothesis: {\n type: 'string',\n required: false,\n default: '',\n description: 'Formal null hypothesis (H0). Auto-generated if empty.',\n },\n alternative_hypothesis: {\n type: 'string',\n required: false,\n default: '',\n description: 'Formal alternative hypothesis (H1). Auto-generated if empty.',\n },\n direction: {\n type: 'string',\n required: false,\n default: 'different',\n description: 'Expected direction of effect: greater | less | different | equal.',\n },\n epochs: {\n type: 'number',\n required: false,\n default: 1000,\n description: 'Number of simulation runs per parameter combination. More = higher power.',\n },\n seed_start: {\n type: 'number',\n required: false,\n default: 0,\n description: 'Starting seed for reproducibility. Seeds increment per epoch.',\n },\n confidence_level: {\n type: 'number',\n required: false,\n default: 0.95,\n description: 'Confidence level for statistical tests (0.0 - 1.0). Default 0.95 = α=0.05.',\n },\n metrics: {\n type: 'string[]',\n required: true,\n description:\n 'List of metric names to collect each epoch. Must match emitted metric events.',\n },\n statistical_test: {\n type: 'string',\n required: false,\n default: 'auto',\n description:\n 'Statistical test to use: t_test | mann_whitney_u | chi_squared | auto. ' +\n 'Auto selects based on data distribution.',\n },\n export_training_data: {\n type: 'boolean',\n required: false,\n default: false,\n description: 'Whether to export results as training data for DataForge pipeline.',\n },\n marketplace_publishable: {\n type: 'boolean',\n required: false,\n default: false,\n description:\n 'Whether to package results for marketplace listing as verified simulation data.',\n },\n max_duration_ms: {\n type: 'number',\n required: false,\n default: 300000,\n description:\n 'Maximum wall-clock time for the entire experiment (5 min default). ' +\n 'Prevents runaway simulations.',\n },\n worker_count: {\n type: 'number',\n required: false,\n default: 4,\n description: 'Number of parallel workers for epoch execution.',\n },\n },\n validator: (params) => {\n if (!params.hypothesis || typeof params.hypothesis !== 'string') return false;\n if (!params.metrics || !Array.isArray(params.metrics) || params.metrics.length === 0)\n return false;\n if (params.epochs !== undefined && (params.epochs < 1 || params.epochs > 1000000))\n return false;\n if (\n params.confidence_level !== undefined &&\n (params.confidence_level <= 0 || params.confidence_level >= 1)\n )\n return false;\n if (params.direction !== undefined) {\n if (!['greater', 'less', 'different', 'equal'].includes(params.direction)) return false;\n }\n if (params.statistical_test !== undefined) {\n if (!['t_test', 'mann_whitney_u', 'chi_squared', 'auto'].includes(params.statistical_test))\n return false;\n }\n return true;\n },\n composesWith: [\n '@tradeable',\n '@depreciating',\n '@bonding_curved',\n '@taxable_wealth',\n '@pid_controlled',\n ],\n compiler_hints: {\n requires_runtime: [\n 'SimulationRuntime.runExperiment',\n 'SimulationRuntime.collectMetrics',\n 'SimulationRuntime.runStatisticalTest',\n 'SimulationRuntime.exportResults',\n ],\n thread_safety: 'worker_thread',\n performance_budget_ms: 300000, // Experiment budget, not per-frame\n batch_mode: true,\n },\n },\n};\n\n// =============================================================================\n// TRAIT UTILITIES\n// =============================================================================\n\n/**\n * Get all simulation trait names.\n */\nexport function getSimulationTraitNames(): string[] {\n return Object.keys(SimulationLabTraits).map((k) => SimulationLabTraits[k].name);\n}\n\n/**\n * Look up a simulation trait definition by name.\n */\nexport function getSimulationTrait(name: string): SimulationTraitDefinition | undefined {\n const key = name.startsWith('@') ? name.slice(1) : name;\n return SimulationLabTraits[key];\n}\n\nexport default SimulationLabTraits;\n","/**\n * @holoscript/std - Time Module\n *\n * Time, timer, and scheduling utilities for HoloScript Plus programs.\n */\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function now(): number {\n return Date.now();\n}\n\n/**\n * Get high-resolution timestamp (for performance measurement)\n */\nexport function hrTime(): number {\n if (typeof performance !== 'undefined') {\n return performance.now();\n }\n return Date.now();\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wait until a condition is true\n */\nexport async function waitUntil(\n condition: () => boolean | Promise<boolean>,\n options: { timeout?: number; interval?: number } = {}\n): Promise<void> {\n const { timeout = 30000, interval = 100 } = options;\n const startTime = now();\n\n while (true) {\n if (await condition()) return;\n if (now() - startTime > timeout) {\n throw new Error('waitUntil timeout');\n }\n await sleep(interval);\n }\n}\n\n/**\n * Execute a function with timeout\n */\nexport async function withTimeout<T>(fn: () => Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n fn(),\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error('Timeout')), ms)),\n ]);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n factor?: number;\n onRetry?: (error: Error, attempt: number) => void;\n } = {}\n): Promise<T> {\n const { maxAttempts = 3, initialDelay = 1000, maxDelay = 30000, factor = 2, onRetry } = options;\n\n let lastError: Error;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) break;\n\n onRetry?.(lastError, attempt);\n await sleep(delay);\n delay = Math.min(delay * factor, maxDelay);\n }\n }\n\n throw lastError!;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(fn: T, ms: number): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, ms);\n }) as T;\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(fn: T, ms: number): T {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return ((...args: unknown[]) => {\n const elapsed = now() - lastCall;\n\n if (elapsed >= ms) {\n lastCall = now();\n fn(...args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCall = now();\n timeoutId = null;\n fn(...args);\n }, ms - elapsed);\n }\n }) as T;\n}\n\n/**\n * Measure execution time of a function\n */\nexport async function measure<T>(\n fn: () => T | Promise<T>\n): Promise<{ result: T; duration: number }> {\n const start = hrTime();\n const result = await fn();\n const duration = hrTime() - start;\n return { result, duration };\n}\n\n/**\n * Measure execution time and log it\n */\nexport async function timed<T>(label: string, fn: () => T | Promise<T>): Promise<T> {\n const start = hrTime();\n try {\n return await fn();\n } finally {\n const duration = hrTime() - start;\n void duration; // timing available for callers via return value\n }\n}\n\n/**\n * Simple stopwatch for measuring elapsed time\n */\nexport class Stopwatch {\n private startTime: number = 0;\n private pausedTime: number = 0;\n private running: boolean = false;\n\n start(): this {\n if (!this.running) {\n this.startTime = hrTime() - this.pausedTime;\n this.running = true;\n }\n return this;\n }\n\n stop(): number {\n if (this.running) {\n this.pausedTime = hrTime() - this.startTime;\n this.running = false;\n }\n return this.pausedTime;\n }\n\n reset(): this {\n this.startTime = 0;\n this.pausedTime = 0;\n this.running = false;\n return this;\n }\n\n restart(): this {\n return this.reset().start();\n }\n\n get elapsed(): number {\n if (this.running) {\n return hrTime() - this.startTime;\n }\n return this.pausedTime;\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n lap(): number {\n const elapsed = this.elapsed;\n this.restart();\n return elapsed;\n }\n}\n\n/**\n * Interval timer with pause/resume support\n */\nexport class IntervalTimer {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private callback: () => void;\n private intervalMs: number;\n private isPaused: boolean = false;\n\n constructor(callback: () => void, intervalMs: number) {\n this.callback = callback;\n this.intervalMs = intervalMs;\n }\n\n start(): this {\n if (!this.intervalId && !this.isPaused) {\n this.intervalId = setInterval(this.callback, this.intervalMs);\n }\n return this;\n }\n\n stop(): this {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.isPaused = false;\n return this;\n }\n\n pause(): this {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n this.isPaused = true;\n }\n return this;\n }\n\n resume(): this {\n if (this.isPaused) {\n this.isPaused = false;\n this.intervalId = setInterval(this.callback, this.intervalMs);\n }\n return this;\n }\n\n get running(): boolean {\n return this.intervalId !== null;\n }\n\n get paused(): boolean {\n return this.isPaused;\n }\n}\n\n/**\n * Countdown timer\n */\nexport class CountdownTimer {\n private remainingMs: number;\n private startTime: number = 0;\n private running: boolean = false;\n private onTick?: (remaining: number) => void;\n private onComplete?: () => void;\n private tickIntervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n durationMs: number,\n options: {\n onTick?: (remaining: number) => void;\n onComplete?: () => void;\n tickInterval?: number;\n } = {}\n ) {\n this.remainingMs = durationMs;\n this.onTick = options.onTick;\n this.onComplete = options.onComplete;\n\n if (options.onTick && options.tickInterval) {\n this.tickIntervalId = setInterval(() => {\n if (this.running) {\n this.onTick?.(this.remaining);\n }\n }, options.tickInterval);\n }\n }\n\n start(): this {\n if (!this.running && this.remainingMs > 0) {\n this.startTime = hrTime();\n this.running = true;\n this.scheduleCompletion();\n }\n return this;\n }\n\n pause(): this {\n if (this.running) {\n this.remainingMs = Math.max(0, this.remainingMs - (hrTime() - this.startTime));\n this.running = false;\n }\n return this;\n }\n\n resume(): this {\n return this.start();\n }\n\n reset(durationMs?: number): this {\n this.running = false;\n this.remainingMs = durationMs ?? this.remainingMs;\n return this;\n }\n\n stop(): this {\n this.running = false;\n if (this.tickIntervalId) {\n clearInterval(this.tickIntervalId);\n this.tickIntervalId = null;\n }\n return this;\n }\n\n get remaining(): number {\n if (this.running) {\n return Math.max(0, this.remainingMs - (hrTime() - this.startTime));\n }\n return this.remainingMs;\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n get isComplete(): boolean {\n return this.remaining <= 0;\n }\n\n private scheduleCompletion(): void {\n setTimeout(() => {\n if (this.running && this.remaining <= 0) {\n this.running = false;\n this.onComplete?.();\n }\n }, this.remainingMs);\n }\n}\n\n/**\n * Frame-based timer for game loops\n */\nexport class FrameTimer {\n private lastFrameTime: number = 0;\n private deltaTime: number = 0;\n private frameCount: number = 0;\n private fps: number = 0;\n private fpsUpdateInterval: number = 1000;\n private lastFpsUpdate: number = 0;\n private framesSinceLastFpsUpdate: number = 0;\n\n /**\n * Call at the start of each frame\n */\n update(): void {\n const currentTime = hrTime();\n\n if (this.lastFrameTime > 0) {\n this.deltaTime = (currentTime - this.lastFrameTime) / 1000; // Convert to seconds\n }\n\n this.lastFrameTime = currentTime;\n this.frameCount++;\n this.framesSinceLastFpsUpdate++;\n\n // Update FPS calculation\n if (currentTime - this.lastFpsUpdate >= this.fpsUpdateInterval) {\n this.fps = (this.framesSinceLastFpsUpdate * 1000) / (currentTime - this.lastFpsUpdate);\n this.lastFpsUpdate = currentTime;\n this.framesSinceLastFpsUpdate = 0;\n }\n }\n\n /**\n * Get delta time in seconds since last frame\n */\n get delta(): number {\n return this.deltaTime;\n }\n\n /**\n * Get delta time in milliseconds since last frame\n */\n get deltaMs(): number {\n return this.deltaTime * 1000;\n }\n\n /**\n * Get total frame count\n */\n get frames(): number {\n return this.frameCount;\n }\n\n /**\n * Get current FPS (frames per second)\n */\n get currentFps(): number {\n return this.fps;\n }\n\n /**\n * Get total elapsed time in seconds\n */\n get totalTime(): number {\n return this.lastFrameTime / 1000;\n }\n\n /**\n * Reset the timer\n */\n reset(): void {\n this.lastFrameTime = 0;\n this.deltaTime = 0;\n this.frameCount = 0;\n this.fps = 0;\n this.lastFpsUpdate = 0;\n this.framesSinceLastFpsUpdate = 0;\n }\n}\n\n/**\n * Schedule a callback to run after a delay\n */\nexport function schedule(callback: () => void, delayMs: number): () => void {\n const timeoutId = setTimeout(callback, delayMs);\n return () => clearTimeout(timeoutId);\n}\n\n/**\n * Schedule a callback to run at regular intervals\n */\nexport function scheduleInterval(callback: () => void, intervalMs: number): () => void {\n const intervalId = setInterval(callback, intervalMs);\n return () => clearInterval(intervalId);\n}\n\n/**\n * Schedule a callback to run on the next animation frame (browser only)\n */\nexport function scheduleFrame(callback: (timestamp: number) => void): () => void {\n if (typeof requestAnimationFrame !== 'undefined') {\n const id = requestAnimationFrame(callback);\n return () => cancelAnimationFrame(id);\n }\n // Fallback for non-browser environments\n const id = setTimeout(() => callback(hrTime()), 16);\n return () => clearTimeout(id);\n}\n\n/**\n * Create a ticker that calls a callback at a target frame rate\n */\nexport function createTicker(\n callback: (delta: number) => void,\n targetFps: number = 60\n): { start: () => void; stop: () => void } {\n const frameTime = 1000 / targetFps;\n let lastTime = 0;\n let running = false;\n let animationId: number | ReturnType<typeof setTimeout>;\n\n const tick = (currentTime: number) => {\n if (!running) return;\n\n if (lastTime > 0) {\n const delta = (currentTime - lastTime) / 1000;\n callback(delta);\n }\n lastTime = currentTime;\n\n if (typeof requestAnimationFrame !== 'undefined') {\n animationId = requestAnimationFrame(tick);\n } else {\n animationId = setTimeout(() => tick(hrTime()), frameTime);\n }\n };\n\n return {\n start: () => {\n if (!running) {\n running = true;\n lastTime = 0;\n if (typeof requestAnimationFrame !== 'undefined') {\n animationId = requestAnimationFrame(tick);\n } else {\n tick(hrTime());\n }\n }\n },\n stop: () => {\n running = false;\n if (typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(animationId as number);\n } else {\n clearTimeout(animationId as ReturnType<typeof setTimeout>);\n }\n },\n };\n}\n\n/**\n * Date/time formatting utilities\n */\nexport const DateTime = {\n /**\n * Format a date as ISO string\n */\n toISO(date: Date = new Date()): string {\n return date.toISOString();\n },\n\n /**\n * Format a date as local string\n */\n toLocal(date: Date = new Date()): string {\n return date.toLocaleString();\n },\n\n /**\n * Format a date using a pattern\n * Supports: YYYY, MM, DD, HH, mm, ss, SSS\n */\n format(date: Date, pattern: string): string {\n const pad = (n: number, width: number) => String(n).padStart(width, '0');\n\n return pattern\n .replace('YYYY', String(date.getFullYear()))\n .replace('MM', pad(date.getMonth() + 1, 2))\n .replace('DD', pad(date.getDate(), 2))\n .replace('HH', pad(date.getHours(), 2))\n .replace('mm', pad(date.getMinutes(), 2))\n .replace('ss', pad(date.getSeconds(), 2))\n .replace('SSS', pad(date.getMilliseconds(), 3));\n },\n\n /**\n * Parse a date string\n */\n parse(dateString: string): Date {\n return new Date(dateString);\n },\n\n /**\n * Get difference between two dates in various units\n */\n diff(date1: Date, date2: Date, unit: 'ms' | 's' | 'm' | 'h' | 'd' = 'ms'): number {\n const diffMs = date1.getTime() - date2.getTime();\n switch (unit) {\n case 'ms':\n return diffMs;\n case 's':\n return diffMs / 1000;\n case 'm':\n return diffMs / 60000;\n case 'h':\n return diffMs / 3600000;\n case 'd':\n return diffMs / 86400000;\n }\n },\n\n /**\n * Add time to a date\n */\n add(date: Date, amount: number, unit: 'ms' | 's' | 'm' | 'h' | 'd'): Date {\n const _ms = DateTime.diff(new Date(amount), new Date(0), 'ms');\n const multipliers = { ms: 1, s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return new Date(date.getTime() + amount * multipliers[unit]);\n },\n\n /**\n * Check if a date is today\n */\n isToday(date: Date): boolean {\n const today = new Date();\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n },\n\n /**\n * Get start of day\n */\n startOfDay(date: Date = new Date()): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n },\n\n /**\n * Get end of day\n */\n endOfDay(date: Date = new Date()): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n },\n};\n"],"mappings":"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","names":["clamp","degToRad","lerp","radToDeg","ray","clamp","lerp","degToRad","radToDeg","aabb","step","count","center","count","perm","sign","id"]}
|