@holoscript/std 3.1.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/__tests__/EconomicPrimitives.test.d.ts +2 -0
- package/dist/__tests__/EconomicTraits.test.d.ts +2 -0
- package/dist/__tests__/SimulationLabPrimitives.test.d.ts +2 -0
- package/dist/__tests__/collections.test.d.ts +2 -0
- package/dist/__tests__/events.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/materials.test.d.ts +2 -0
- package/dist/__tests__/math.test.d.ts +2 -0
- package/dist/__tests__/physics.test.d.ts +2 -0
- package/dist/__tests__/spatial.test.d.ts +2 -0
- package/dist/__tests__/standard-library-fundamentals.test.d.ts +2 -0
- package/dist/__tests__/standard-library-fundamentals.test.d.ts.map +1 -0
- package/dist/__tests__/string-and-time-utilities.test.d.ts +2 -0
- package/dist/__tests__/string-and-time-utilities.test.d.ts.map +1 -0
- package/dist/__tests__/string-decoupled.test.d.ts +2 -0
- package/dist/__tests__/string.test.d.ts +2 -0
- package/dist/__tests__/time.test.d.ts +2 -0
- package/dist/chunk-DZHAVOCH.js +686 -0
- package/dist/chunk-DZHAVOCH.js.map +1 -0
- package/dist/chunk-P4O3WNG2.js +287 -0
- package/dist/chunk-P4O3WNG2.js.map +1 -0
- package/dist/chunk-PFX2JM4X.js +683 -0
- package/dist/chunk-PFX2JM4X.js.map +1 -0
- package/dist/chunk-PR4QN5HX.js +43 -0
- package/dist/chunk-PR4QN5HX.js.map +1 -0
- package/dist/chunk-WS6W35YC.js +443 -0
- package/dist/chunk-WS6W35YC.js.map +1 -0
- package/dist/chunk-XBA4ARST.js +9313 -0
- package/dist/chunk-XBA4ARST.js.map +1 -0
- package/dist/chunk-XJIFG7G3.js +348 -0
- package/dist/chunk-XJIFG7G3.js.map +1 -0
- package/dist/chunk-ZXVZAQCZ.js +470 -0
- package/dist/chunk-ZXVZAQCZ.js.map +1 -0
- package/dist/collections.cjs +715 -0
- package/dist/collections.cjs.map +1 -0
- package/dist/collections.d.ts +177 -0
- package/dist/collections.js +18 -0
- package/dist/collections.js.map +1 -0
- package/dist/events.d.ts +32 -0
- package/dist/fs/__tests__/file-watch-system.test.d.ts +2 -0
- package/dist/fs/__tests__/file-watch-system.test.d.ts.map +1 -0
- package/dist/fs/__tests__/path-utilities.test.d.ts +2 -0
- package/dist/fs/__tests__/path-utilities.test.d.ts.map +1 -0
- package/dist/fs/__tests__/path.test.d.ts +2 -0
- package/dist/fs/__tests__/path.test.d.ts.map +1 -0
- package/dist/fs/fs.d.ts +288 -0
- package/dist/fs/fs.d.ts.map +1 -0
- package/dist/fs/index.cjs +9338 -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 +204 -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/watch.d.ts +133 -0
- package/dist/fs/watch.d.ts.map +1 -0
- package/dist/index.cjs +13326 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1275 -190
- package/dist/index.js.map +1 -0
- package/dist/materials.d.ts +50 -0
- package/dist/math.cjs +595 -0
- package/dist/math.cjs.map +1 -0
- package/dist/math.d.ts +162 -0
- package/dist/math.js +54 -0
- package/dist/math.js.map +1 -0
- package/dist/physics.d.ts +59 -0
- package/dist/spatial.d.ts +82 -0
- package/dist/string.basic.test.d.ts +5 -0
- package/dist/string.basic.test.d.ts.map +1 -0
- package/dist/string.cjs +422 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.ts +212 -0
- package/dist/string.d.ts.map +1 -1
- package/dist/string.js +108 -0
- package/dist/string.js.map +1 -0
- package/dist/string.test.d.ts +5 -0
- package/dist/string.test.d.ts.map +1 -0
- package/dist/time.cjs +512 -0
- package/dist/time.cjs.map +1 -0
- package/dist/time.d.ts +215 -0
- package/dist/time.js +44 -0
- package/dist/time.js.map +1 -0
- package/dist/traits/ARTraits.d.ts +14 -0
- package/dist/traits/EconomicPrimitives.cjs +335 -0
- package/dist/traits/EconomicPrimitives.cjs.map +1 -0
- package/dist/traits/EconomicPrimitives.d.ts +345 -0
- package/dist/traits/EconomicPrimitives.js +56 -0
- package/dist/traits/EconomicPrimitives.js.map +1 -0
- package/dist/traits/EconomicTraits.cjs +471 -0
- package/dist/traits/EconomicTraits.cjs.map +1 -0
- package/dist/traits/EconomicTraits.d.ts +71 -0
- package/dist/traits/EconomicTraits.js +18 -0
- package/dist/traits/EconomicTraits.js.map +1 -0
- package/dist/traits/IoTTraits.d.ts +14 -0
- package/dist/traits/SimulationLabPrimitives.d.ts +187 -0
- package/dist/traits/SimulationLabTraits.d.ts +42 -0
- package/dist/traits/VRRTraits.d.ts +150 -0
- package/dist/traits/__tests__/ARTraits.test.d.ts +2 -0
- package/dist/traits/__tests__/ARTraits.test.d.ts.map +1 -0
- package/dist/traits/__tests__/EconomicPrimitives.test.d.ts +2 -0
- package/dist/traits/__tests__/EconomicPrimitives.test.d.ts.map +1 -0
- package/dist/traits/__tests__/EconomicTraits.test.d.ts +2 -0
- package/dist/traits/__tests__/EconomicTraits.test.d.ts.map +1 -0
- package/dist/types.d.ts +202 -0
- package/dist/types.d.ts.map +1 -1
- package/error-utf8.log +6 -0
- package/error.log +0 -0
- package/package.json +35 -18
- package/src/__tests__/index.test.ts +14 -0
- package/src/__tests__/{Sprint33.test.ts → standard-library-fundamentals.test.ts} +91 -74
- package/src/__tests__/{Sprint56.test.ts → string-and-time-utilities.test.ts} +64 -64
- package/src/__tests__/string-decoupled.test.ts +6 -9
- package/src/fs/__tests__/file-watch-system.test.ts +675 -0
- package/src/fs/__tests__/path-utilities.test.ts +375 -0
- package/src/fs/__tests__/path.test.ts +287 -0
- package/src/fs/fs.ts +692 -0
- package/src/fs/index.ts +194 -0
- package/src/fs/path.ts +310 -0
- package/src/fs/watch.ts +413 -0
- package/src/index.ts +3 -1
- package/src/math.ts +1 -1
- package/src/string.basic.test.ts +1 -1
- package/src/string.test.ts +4 -4
- package/src/string.ts +32 -17
- package/src/time.ts +1 -1
- package/src/traits/ARTraits.ts +2 -2
- package/src/traits/IoTTraits.ts +2 -2
- package/src/traits/VRRTraits.ts +2 -2
- package/src/traits/__tests__/ARTraits.test.ts +8 -0
- package/src/traits/__tests__/EconomicPrimitives.test.ts +14 -0
- package/src/traits/__tests__/EconomicTraits.test.ts +16 -0
- package/src/types.ts +10 -3
- package/std_error.log +5 -0
- package/tsup.config.ts +20 -0
- package/dist/__tests__/Sprint33.test.d.ts.map +0 -1
- package/dist/__tests__/Sprint56.test.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/collections.ts"],"sourcesContent":["/**\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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
+
};
|
|
16
|
+
var __export = (target, all) => {
|
|
17
|
+
for (var name in all)
|
|
18
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
19
|
+
};
|
|
20
|
+
var __copyProps = (to, from, except, desc) => {
|
|
21
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
22
|
+
for (let key of __getOwnPropNames(from))
|
|
23
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
24
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
29
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
30
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
31
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
32
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
33
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
34
|
+
mod
|
|
35
|
+
));
|
|
36
|
+
|
|
37
|
+
export {
|
|
38
|
+
__require,
|
|
39
|
+
__commonJS,
|
|
40
|
+
__export,
|
|
41
|
+
__toESM
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chunk-PR4QN5HX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
// src/traits/EconomicTraits.ts
|
|
2
|
+
var EconomicTraits = {
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// 1. TRADEABLE
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
tradeable: {
|
|
7
|
+
name: "@tradeable",
|
|
8
|
+
description: "Makes a composition or node transferable between agents. Tracks ownership history with transaction hashes for integrity verification (P.030.04). Supports lock/unlock for escrow patterns and auction integration.",
|
|
9
|
+
params: {
|
|
10
|
+
initial_owner: {
|
|
11
|
+
type: "AgentID",
|
|
12
|
+
required: true,
|
|
13
|
+
description: "The agent who initially owns this entity."
|
|
14
|
+
},
|
|
15
|
+
transferable: {
|
|
16
|
+
type: "boolean",
|
|
17
|
+
required: false,
|
|
18
|
+
default: true,
|
|
19
|
+
description: "Whether transfers are currently allowed."
|
|
20
|
+
},
|
|
21
|
+
min_price: {
|
|
22
|
+
type: "number",
|
|
23
|
+
required: false,
|
|
24
|
+
default: 0,
|
|
25
|
+
description: "Minimum trade price (prevents value manipulation)."
|
|
26
|
+
},
|
|
27
|
+
max_history: {
|
|
28
|
+
type: "number",
|
|
29
|
+
required: false,
|
|
30
|
+
default: 50,
|
|
31
|
+
description: "Maximum ownership history entries retained."
|
|
32
|
+
},
|
|
33
|
+
requires_presence: {
|
|
34
|
+
type: "boolean",
|
|
35
|
+
required: false,
|
|
36
|
+
default: false,
|
|
37
|
+
description: "VR-specific: require spatial co-location for trade (anti-exploit, Layer 7)."
|
|
38
|
+
},
|
|
39
|
+
presence_radius: {
|
|
40
|
+
type: "number",
|
|
41
|
+
required: false,
|
|
42
|
+
default: 5,
|
|
43
|
+
description: "Maximum distance in meters for presence-based trades."
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
validator: (params) => {
|
|
47
|
+
if (!params.initial_owner || typeof params.initial_owner !== "string") return false;
|
|
48
|
+
if (params.min_price !== void 0 && params.min_price < 0) return false;
|
|
49
|
+
return true;
|
|
50
|
+
},
|
|
51
|
+
requiredPermissions: ["economy.trade"],
|
|
52
|
+
economicLayer: 0,
|
|
53
|
+
// Layer 0: Integrity
|
|
54
|
+
composesWith: ["@depreciating", "@bonding_curved", "@taxable_wealth"],
|
|
55
|
+
compiler_hints: {
|
|
56
|
+
requires_runtime: ["EconomicRuntime.executeTrade", "EconomicRuntime.verifyOwnership"],
|
|
57
|
+
thread_safety: "any"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// 2. DEPRECIATING
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
depreciating: {
|
|
64
|
+
name: "@depreciating",
|
|
65
|
+
description: "Applies time-based value decay to an entity (hard sink mechanic). Uses exponential decay: condition(t) = condition(0) * e^(-rate * t). When condition reaches destroy_threshold, the entity is consumed -- removing currency/value from circulation permanently (W.031).",
|
|
66
|
+
params: {
|
|
67
|
+
decay_rate: {
|
|
68
|
+
type: "number",
|
|
69
|
+
required: true,
|
|
70
|
+
description: "Per-second decay rate (0.0 - 1.0). E.g., 0.001 = 0.1% per second."
|
|
71
|
+
},
|
|
72
|
+
initial_condition: {
|
|
73
|
+
type: "number",
|
|
74
|
+
required: false,
|
|
75
|
+
default: 1,
|
|
76
|
+
description: "Starting condition (1.0 = mint, 0.0 = destroyed)."
|
|
77
|
+
},
|
|
78
|
+
destroy_threshold: {
|
|
79
|
+
type: "number",
|
|
80
|
+
required: false,
|
|
81
|
+
default: 0.01,
|
|
82
|
+
description: "Condition level at which the entity is destroyed."
|
|
83
|
+
},
|
|
84
|
+
repairable: {
|
|
85
|
+
type: "boolean",
|
|
86
|
+
required: false,
|
|
87
|
+
default: true,
|
|
88
|
+
description: "Whether the entity can be repaired to restore condition."
|
|
89
|
+
},
|
|
90
|
+
repair_cost_multiplier: {
|
|
91
|
+
type: "number",
|
|
92
|
+
required: false,
|
|
93
|
+
default: 0.5,
|
|
94
|
+
description: "Repair cost as a fraction of base value per unit condition."
|
|
95
|
+
},
|
|
96
|
+
emit_on_destroy: {
|
|
97
|
+
type: "string",
|
|
98
|
+
required: false,
|
|
99
|
+
default: "on_entity_destroyed",
|
|
100
|
+
description: "Event emitted when condition reaches destroy threshold."
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
validator: (params) => {
|
|
104
|
+
if (params.decay_rate === void 0 || params.decay_rate < 0 || params.decay_rate > 1)
|
|
105
|
+
return false;
|
|
106
|
+
if (params.initial_condition !== void 0 && (params.initial_condition < 0 || params.initial_condition > 1))
|
|
107
|
+
return false;
|
|
108
|
+
if (params.destroy_threshold !== void 0 && (params.destroy_threshold < 0 || params.destroy_threshold > 1))
|
|
109
|
+
return false;
|
|
110
|
+
return true;
|
|
111
|
+
},
|
|
112
|
+
requiredPermissions: ["economy.burn"],
|
|
113
|
+
economicLayer: 1,
|
|
114
|
+
// Layer 1: Flow Control (sink side)
|
|
115
|
+
composesWith: ["@tradeable", "@bonding_curved"],
|
|
116
|
+
compiler_hints: {
|
|
117
|
+
requires_runtime: ["EconomicRuntime.updateDepreciation", "EconomicRuntime.destroyEntity"],
|
|
118
|
+
thread_safety: "worker_thread",
|
|
119
|
+
performance_budget_ms: 0.1
|
|
120
|
+
// Must be fast -- called every tick
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// 3. BONDING_CURVED
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
bonding_curved: {
|
|
127
|
+
name: "@bonding_curved",
|
|
128
|
+
description: "Attaches a bonding curve to a marketplace or item category for autonomous price discovery. Price is determined by P = f(supply) where f depends on curve_type. Provides continuous liquidity via reserve pool without order books (W.035, P.030.02). Supports spatial pricing for VR trade geography.",
|
|
129
|
+
params: {
|
|
130
|
+
curve_type: {
|
|
131
|
+
type: "string",
|
|
132
|
+
required: false,
|
|
133
|
+
default: "exponential",
|
|
134
|
+
description: "Curve shape: linear | exponential | logarithmic | sigmoid.",
|
|
135
|
+
validation: (val) => ["linear", "exponential", "logarithmic", "sigmoid"].includes(val)
|
|
136
|
+
},
|
|
137
|
+
reserve_ratio: {
|
|
138
|
+
type: "number",
|
|
139
|
+
required: true,
|
|
140
|
+
description: "Base price multiplier (R in the price formula)."
|
|
141
|
+
},
|
|
142
|
+
curve_steepness: {
|
|
143
|
+
type: "number",
|
|
144
|
+
required: false,
|
|
145
|
+
default: 2,
|
|
146
|
+
description: "Controls price sensitivity to supply changes (n in P = R * S^(1/n))."
|
|
147
|
+
},
|
|
148
|
+
transaction_fee: {
|
|
149
|
+
type: "number",
|
|
150
|
+
required: false,
|
|
151
|
+
default: 0.02,
|
|
152
|
+
description: "Fee percentage per transaction (hard sink). Range: 0.0 - 0.5."
|
|
153
|
+
},
|
|
154
|
+
initial_supply: {
|
|
155
|
+
type: "number",
|
|
156
|
+
required: false,
|
|
157
|
+
default: 0,
|
|
158
|
+
description: "Initial token/item supply on the curve."
|
|
159
|
+
},
|
|
160
|
+
initial_reserve: {
|
|
161
|
+
type: "number",
|
|
162
|
+
required: false,
|
|
163
|
+
default: 0,
|
|
164
|
+
description: "Initial reserve pool balance backing the curve."
|
|
165
|
+
},
|
|
166
|
+
sigmoid_k: {
|
|
167
|
+
type: "number",
|
|
168
|
+
required: false,
|
|
169
|
+
default: 100,
|
|
170
|
+
description: "Half-saturation constant for sigmoid curves."
|
|
171
|
+
},
|
|
172
|
+
spatial_distance_factor: {
|
|
173
|
+
type: "number",
|
|
174
|
+
required: false,
|
|
175
|
+
default: 0,
|
|
176
|
+
description: "VR spatial pricing: price multiplier per unit distance from hub. 0.0 = no spatial effect. Creates emergent trade routes (P.030.02 ENRICHED)."
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
validator: (params) => {
|
|
180
|
+
if (params.reserve_ratio === void 0 || params.reserve_ratio <= 0) return false;
|
|
181
|
+
if (params.curve_steepness !== void 0 && params.curve_steepness <= 0) return false;
|
|
182
|
+
if (params.transaction_fee !== void 0 && (params.transaction_fee < 0 || params.transaction_fee > 0.5))
|
|
183
|
+
return false;
|
|
184
|
+
if (params.curve_type !== void 0) {
|
|
185
|
+
if (!["linear", "exponential", "logarithmic", "sigmoid"].includes(params.curve_type))
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
return true;
|
|
189
|
+
},
|
|
190
|
+
requiredPermissions: ["economy.set_price", "economy.trade"],
|
|
191
|
+
economicLayer: 2,
|
|
192
|
+
// Layer 2: Price Discovery
|
|
193
|
+
composesWith: ["@tradeable", "@depreciating", "@pid_controlled"],
|
|
194
|
+
compiler_hints: {
|
|
195
|
+
requires_runtime: [
|
|
196
|
+
"EconomicRuntime.bondingCurveBuy",
|
|
197
|
+
"EconomicRuntime.bondingCurveSell",
|
|
198
|
+
"EconomicRuntime.getSpotPrice"
|
|
199
|
+
],
|
|
200
|
+
thread_safety: "any",
|
|
201
|
+
performance_budget_ms: 1
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// 4. TAXABLE_WEALTH
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
taxable_wealth: {
|
|
208
|
+
name: "@taxable_wealth",
|
|
209
|
+
description: "Applies progressive logarithmic wealth taxation with optional redistribution to the lowest-wealth quintile (P.030.03, W.034). Tax = 0 below threshold, then rate = min(max_rate, log(wealth/threshold) * base_rate). Collected taxes are partially redistributed (UBI) and partially burned (hard sink).",
|
|
210
|
+
params: {
|
|
211
|
+
threshold: {
|
|
212
|
+
type: "number",
|
|
213
|
+
required: true,
|
|
214
|
+
description: "Wealth level below which no tax is levied."
|
|
215
|
+
},
|
|
216
|
+
base_rate: {
|
|
217
|
+
type: "number",
|
|
218
|
+
required: false,
|
|
219
|
+
default: 0.01,
|
|
220
|
+
description: "Base tax rate multiplied by log(wealth/threshold). Range: 0.0 - 0.1."
|
|
221
|
+
},
|
|
222
|
+
max_effective_rate: {
|
|
223
|
+
type: "number",
|
|
224
|
+
required: false,
|
|
225
|
+
default: 0.05,
|
|
226
|
+
description: "Maximum effective tax rate cap (prevents punishing engagement)."
|
|
227
|
+
},
|
|
228
|
+
collection_interval: {
|
|
229
|
+
type: "string",
|
|
230
|
+
required: false,
|
|
231
|
+
default: "daily",
|
|
232
|
+
description: "How often taxes are collected: hourly | daily | weekly.",
|
|
233
|
+
validation: (val) => ["hourly", "daily", "weekly"].includes(val)
|
|
234
|
+
},
|
|
235
|
+
enable_redistribution: {
|
|
236
|
+
type: "boolean",
|
|
237
|
+
required: false,
|
|
238
|
+
default: true,
|
|
239
|
+
description: "Whether collected tax is redistributed to lowest-wealth players."
|
|
240
|
+
},
|
|
241
|
+
redistribution_fraction: {
|
|
242
|
+
type: "number",
|
|
243
|
+
required: false,
|
|
244
|
+
default: 0.7,
|
|
245
|
+
description: "Fraction of tax redistributed (remainder burned as hard sink). Range: 0.0 - 1.0."
|
|
246
|
+
},
|
|
247
|
+
emit_on_collection: {
|
|
248
|
+
type: "string",
|
|
249
|
+
required: false,
|
|
250
|
+
default: "on_tax_collected",
|
|
251
|
+
description: "Event emitted when taxes are collected."
|
|
252
|
+
},
|
|
253
|
+
public_ledger: {
|
|
254
|
+
type: "boolean",
|
|
255
|
+
required: false,
|
|
256
|
+
default: true,
|
|
257
|
+
description: "Whether tax collections and redistribution are visible in the economy dashboard (Layer 6: Transparency, W.038)."
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
validator: (params) => {
|
|
261
|
+
if (params.threshold === void 0 || params.threshold < 0) return false;
|
|
262
|
+
if (params.base_rate !== void 0 && (params.base_rate < 0 || params.base_rate > 0.1))
|
|
263
|
+
return false;
|
|
264
|
+
if (params.max_effective_rate !== void 0 && (params.max_effective_rate < 0 || params.max_effective_rate > 1))
|
|
265
|
+
return false;
|
|
266
|
+
if (params.redistribution_fraction !== void 0 && (params.redistribution_fraction < 0 || params.redistribution_fraction > 1))
|
|
267
|
+
return false;
|
|
268
|
+
return true;
|
|
269
|
+
},
|
|
270
|
+
requiredPermissions: ["economy.tax", "economy.redistribute"],
|
|
271
|
+
economicLayer: 4,
|
|
272
|
+
// Layer 4: Redistribution
|
|
273
|
+
composesWith: ["@tradeable", "@pid_controlled"],
|
|
274
|
+
compiler_hints: {
|
|
275
|
+
requires_runtime: [
|
|
276
|
+
"EconomicRuntime.collectTax",
|
|
277
|
+
"EconomicRuntime.redistribute",
|
|
278
|
+
"EconomicRuntime.getGiniCoefficient"
|
|
279
|
+
],
|
|
280
|
+
thread_safety: "worker_thread",
|
|
281
|
+
performance_budget_ms: 5
|
|
282
|
+
// Runs on collection interval, not per-frame
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// 5. PID_CONTROLLED
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
pid_controlled: {
|
|
289
|
+
name: "@pid_controlled",
|
|
290
|
+
description: "Attaches a dual-loop PID feedback controller to regulate economic flow (P.030.01, W.032). Inner loop adjusts per-source faucet rates (fast). Outer loop adjusts inner setpoint based on total money supply (slow). Achieves <10% currency variance long-term while preserving gameplay variance.",
|
|
291
|
+
params: {
|
|
292
|
+
target_per_capita: {
|
|
293
|
+
type: "number",
|
|
294
|
+
required: true,
|
|
295
|
+
description: "Target currency per active player (outer loop setpoint)."
|
|
296
|
+
},
|
|
297
|
+
inner_kp: {
|
|
298
|
+
type: "number",
|
|
299
|
+
required: false,
|
|
300
|
+
default: 0.5,
|
|
301
|
+
description: "Inner loop proportional gain."
|
|
302
|
+
},
|
|
303
|
+
inner_ki: {
|
|
304
|
+
type: "number",
|
|
305
|
+
required: false,
|
|
306
|
+
default: 0.01,
|
|
307
|
+
description: "Inner loop integral gain."
|
|
308
|
+
},
|
|
309
|
+
inner_kd: {
|
|
310
|
+
type: "number",
|
|
311
|
+
required: false,
|
|
312
|
+
default: 0.1,
|
|
313
|
+
description: "Inner loop derivative gain."
|
|
314
|
+
},
|
|
315
|
+
outer_kp: {
|
|
316
|
+
type: "number",
|
|
317
|
+
required: false,
|
|
318
|
+
default: 0.3,
|
|
319
|
+
description: "Outer loop proportional gain."
|
|
320
|
+
},
|
|
321
|
+
outer_ki: {
|
|
322
|
+
type: "number",
|
|
323
|
+
required: false,
|
|
324
|
+
default: 5e-3,
|
|
325
|
+
description: "Outer loop integral gain."
|
|
326
|
+
},
|
|
327
|
+
outer_kd: {
|
|
328
|
+
type: "number",
|
|
329
|
+
required: false,
|
|
330
|
+
default: 0.05,
|
|
331
|
+
description: "Outer loop derivative gain."
|
|
332
|
+
},
|
|
333
|
+
update_interval: {
|
|
334
|
+
type: "number",
|
|
335
|
+
required: false,
|
|
336
|
+
default: 1,
|
|
337
|
+
description: "Controller update interval in seconds."
|
|
338
|
+
},
|
|
339
|
+
faucet_min_multiplier: {
|
|
340
|
+
type: "number",
|
|
341
|
+
required: false,
|
|
342
|
+
default: 0.1,
|
|
343
|
+
description: "Minimum faucet rate multiplier (never fully stop rewards)."
|
|
344
|
+
},
|
|
345
|
+
faucet_max_multiplier: {
|
|
346
|
+
type: "number",
|
|
347
|
+
required: false,
|
|
348
|
+
default: 2,
|
|
349
|
+
description: "Maximum faucet rate multiplier."
|
|
350
|
+
},
|
|
351
|
+
track_faucet_sink_ratio: {
|
|
352
|
+
type: "boolean",
|
|
353
|
+
required: false,
|
|
354
|
+
default: true,
|
|
355
|
+
description: "Whether to track and emit faucet/sink ratio metrics (W.031)."
|
|
356
|
+
},
|
|
357
|
+
emit_on_adjustment: {
|
|
358
|
+
type: "string",
|
|
359
|
+
required: false,
|
|
360
|
+
default: "on_faucet_adjusted",
|
|
361
|
+
description: "Event emitted when faucet rate is adjusted."
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
validator: (params) => {
|
|
365
|
+
if (params.target_per_capita === void 0 || params.target_per_capita <= 0) return false;
|
|
366
|
+
const gains = [
|
|
367
|
+
params.inner_kp,
|
|
368
|
+
params.inner_ki,
|
|
369
|
+
params.inner_kd,
|
|
370
|
+
params.outer_kp,
|
|
371
|
+
params.outer_ki,
|
|
372
|
+
params.outer_kd
|
|
373
|
+
];
|
|
374
|
+
for (const g of gains) {
|
|
375
|
+
if (g !== void 0 && (typeof g !== "number" || isNaN(g))) return false;
|
|
376
|
+
}
|
|
377
|
+
if (params.update_interval !== void 0 && params.update_interval <= 0) return false;
|
|
378
|
+
return true;
|
|
379
|
+
},
|
|
380
|
+
requiredPermissions: ["economy.tune_pid", "economy.mint", "economy.burn"],
|
|
381
|
+
economicLayer: 1,
|
|
382
|
+
// Layer 1: Flow Control
|
|
383
|
+
composesWith: ["@bonding_curved", "@taxable_wealth"],
|
|
384
|
+
compiler_hints: {
|
|
385
|
+
requires_runtime: [
|
|
386
|
+
"EconomicRuntime.updatePID",
|
|
387
|
+
"EconomicRuntime.getFaucetMultiplier",
|
|
388
|
+
"EconomicRuntime.getFaucetSinkMetrics"
|
|
389
|
+
],
|
|
390
|
+
thread_safety: "worker_thread",
|
|
391
|
+
performance_budget_ms: 0.5
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
function getEconomicTraitNames() {
|
|
396
|
+
return Object.keys(EconomicTraits).map((k) => EconomicTraits[k].name);
|
|
397
|
+
}
|
|
398
|
+
function getEconomicTrait(name) {
|
|
399
|
+
const key = name.startsWith("@") ? name.slice(1) : name;
|
|
400
|
+
return EconomicTraits[key];
|
|
401
|
+
}
|
|
402
|
+
function validateTraitComposition(traitNames) {
|
|
403
|
+
for (const name of traitNames) {
|
|
404
|
+
const trait = getEconomicTrait(name);
|
|
405
|
+
if (!trait) {
|
|
406
|
+
return `Unknown economic trait: ${name}`;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
for (const name of traitNames) {
|
|
410
|
+
const trait = getEconomicTrait(name);
|
|
411
|
+
for (const other of traitNames) {
|
|
412
|
+
if (other === name) continue;
|
|
413
|
+
const otherPrefixed = other.startsWith("@") ? other : `@${other}`;
|
|
414
|
+
if (!trait.composesWith.includes(otherPrefixed)) {
|
|
415
|
+
return `Trait ${trait.name} does not compose with ${otherPrefixed}`;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
function getRequiredPermissions(traitNames) {
|
|
422
|
+
const permissions = /* @__PURE__ */ new Set();
|
|
423
|
+
for (const name of traitNames) {
|
|
424
|
+
const trait = getEconomicTrait(name);
|
|
425
|
+
if (trait) {
|
|
426
|
+
for (const perm of trait.requiredPermissions) {
|
|
427
|
+
permissions.add(perm);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return Array.from(permissions).sort();
|
|
432
|
+
}
|
|
433
|
+
var EconomicTraits_default = EconomicTraits;
|
|
434
|
+
|
|
435
|
+
export {
|
|
436
|
+
EconomicTraits,
|
|
437
|
+
getEconomicTraitNames,
|
|
438
|
+
getEconomicTrait,
|
|
439
|
+
validateTraitComposition,
|
|
440
|
+
getRequiredPermissions,
|
|
441
|
+
EconomicTraits_default
|
|
442
|
+
};
|
|
443
|
+
//# sourceMappingURL=chunk-WS6W35YC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/traits/EconomicTraits.ts"],"sourcesContent":["/**\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"],"mappings":"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","names":[]}
|