@awesome-flow/ecs 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/canvas/index.cjs +5 -0
  2. package/dist/canvas/index.d.cts +2 -0
  3. package/dist/canvas/index.d.mts +2 -0
  4. package/dist/canvas/index.mjs +3 -0
  5. package/dist/canvas-C4nDXlkK.mjs +677 -0
  6. package/dist/canvas-C4nDXlkK.mjs.map +1 -0
  7. package/dist/canvas-DlWcWu05.cjs +688 -0
  8. package/dist/canvas-DlWcWu05.cjs.map +1 -0
  9. package/dist/context/index.cjs +497 -0
  10. package/dist/context/index.cjs.map +1 -0
  11. package/dist/context/index.d.cts +2 -0
  12. package/dist/context/index.d.mts +2 -0
  13. package/dist/context/index.mjs +492 -0
  14. package/dist/context/index.mjs.map +1 -0
  15. package/dist/entity-component-inspector-CNaN8Scf.mjs +79 -0
  16. package/dist/entity-component-inspector-CNaN8Scf.mjs.map +1 -0
  17. package/dist/entity-component-inspector-VlwcaUqy.cjs +90 -0
  18. package/dist/entity-component-inspector-VlwcaUqy.cjs.map +1 -0
  19. package/dist/hooks/index.cjs +19 -0
  20. package/dist/hooks/index.d.cts +2 -0
  21. package/dist/hooks/index.d.mts +2 -0
  22. package/dist/hooks/index.mjs +3 -0
  23. package/dist/id-generator-C2_8g29M.cjs +45 -0
  24. package/dist/id-generator-C2_8g29M.cjs.map +1 -0
  25. package/dist/id-generator-DDsv3NdX.mjs +34 -0
  26. package/dist/id-generator-DDsv3NdX.mjs.map +1 -0
  27. package/dist/index-B9WbxxFC.d.mts +67 -0
  28. package/dist/index-B9WbxxFC.d.mts.map +1 -0
  29. package/dist/index-BTs_8SY-.d.cts +20 -0
  30. package/dist/index-BTs_8SY-.d.cts.map +1 -0
  31. package/dist/index-C-TDFHpq.d.mts +54 -0
  32. package/dist/index-C-TDFHpq.d.mts.map +1 -0
  33. package/dist/index-CNCqWBLh.d.cts +54 -0
  34. package/dist/index-CNCqWBLh.d.cts.map +1 -0
  35. package/dist/index-CyeezgDI.d.mts +20 -0
  36. package/dist/index-CyeezgDI.d.mts.map +1 -0
  37. package/dist/index-D9zIjQH9.d.mts +1 -0
  38. package/dist/index-DCOd7jg-.d.mts +99 -0
  39. package/dist/index-DCOd7jg-.d.mts.map +1 -0
  40. package/dist/index-DGjpWDlm.d.cts +99 -0
  41. package/dist/index-DGjpWDlm.d.cts.map +1 -0
  42. package/dist/index-DLoAMD9J.d.cts +1 -0
  43. package/dist/index-YNgbjS9S.d.cts +159 -0
  44. package/dist/index-YNgbjS9S.d.cts.map +1 -0
  45. package/dist/index-_BgjSgkQ.d.mts +159 -0
  46. package/dist/index-_BgjSgkQ.d.mts.map +1 -0
  47. package/dist/index-t3_yRTa6.d.cts +67 -0
  48. package/dist/index-t3_yRTa6.d.cts.map +1 -0
  49. package/dist/index.cjs +55 -531
  50. package/dist/index.d.cts +9 -106
  51. package/dist/index.d.mts +9 -106
  52. package/dist/index.mjs +10 -520
  53. package/dist/inspectors/index.cjs +6 -0
  54. package/dist/inspectors/index.d.cts +2 -0
  55. package/dist/inspectors/index.d.mts +2 -0
  56. package/dist/inspectors/index.mjs +3 -0
  57. package/dist/node-props-BtAkmdqr.d.mts +45 -0
  58. package/dist/node-props-BtAkmdqr.d.mts.map +1 -0
  59. package/dist/node-props-DkuSwMA0.d.cts +45 -0
  60. package/dist/node-props-DkuSwMA0.d.cts.map +1 -0
  61. package/dist/node-systems-module-CPDV8u8O.d.mts +22 -0
  62. package/dist/node-systems-module-CPDV8u8O.d.mts.map +1 -0
  63. package/dist/node-systems-module-CzkoMbdF.d.cts +22 -0
  64. package/dist/node-systems-module-CzkoMbdF.d.cts.map +1 -0
  65. package/dist/node-types-BRcpbaeR.mjs +1604 -0
  66. package/dist/node-types-BRcpbaeR.mjs.map +1 -0
  67. package/dist/node-types-D_NfbsUT.cjs +1819 -0
  68. package/dist/node-types-D_NfbsUT.cjs.map +1 -0
  69. package/dist/nodes/index.cjs +10 -0
  70. package/dist/nodes/index.d.cts +3 -0
  71. package/dist/nodes/index.d.mts +3 -0
  72. package/dist/nodes/index.mjs +3 -0
  73. package/dist/template-tool-nodes-B7sT2iRc.d.cts +35 -0
  74. package/dist/template-tool-nodes-B7sT2iRc.d.cts.map +1 -0
  75. package/dist/template-tool-nodes-BwavFwMh.d.mts +35 -0
  76. package/dist/template-tool-nodes-BwavFwMh.d.mts.map +1 -0
  77. package/dist/templates/index.cjs +11 -0
  78. package/dist/templates/index.d.cts +2 -0
  79. package/dist/templates/index.d.mts +2 -0
  80. package/dist/templates/index.mjs +3 -0
  81. package/package.json +85 -25
  82. package/dist/index.cjs.map +0 -1
  83. package/dist/index.d.cts.map +0 -1
  84. package/dist/index.d.mts.map +0 -1
  85. package/dist/index.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["EntityTypeUid","IEntityProxy","Node","EcsIdGenerator","EntityNodeData","ScopeGroupNodeData","SystemsModuleNodeData","EcsFlowRepository","nodes","Map","constructor","sizeNodes","size","addSystemModuleNode","node","set","data","entityType","toString","getSystemModuleNode","get","addScopeGroupNode","scope","scopeId","getScopeGroupNode","addEntityNode","entity","entityProxy","getEntityNode","addToolNode","tool","type","getToolNode","listAllNodes","Array","from","values","EntityEventUid","EntityUpdateType","EntityTypeUid","EntityUid","IEntity","IEntityEvent","IEntityEventsManager","IEntityModel","IEntityProxy","IEntityProxyRepository","IEntityRepository","IEntityScheduler","IEntityUpdate","IEntityUpdateQueue","IEventData","PipelineCategory","PipelineCategoryName","SystemType","ISystemsModule","ISystemsModuleRepository","IPerformanceTimer","MiddlewareMetricsSummary","PerformanceTimeEntry","EcsEntitySpawnRequest","EcsEntityTypeDescriptor","EcsIdGenerator","EcsFlowRepository","INSTRUMENTATION","Symbol","for","InstrumentationListener","args","result","InstrumentedFunction","listeners","Set","original","EcsBridgeStoreName","EcsBridgeStore","getSnapshot","notify","subscribe","listener","TelemetryMetricsSource","metrics","ReadonlyMap","ReadonlyArray","clearMetrics","EntityUpdateCounts","removes","updates","EcsEventLogEntry","event","recordedAt","targets","EcsScopeSummary","entities","scopeId","scopedProxies","EcsEventStreamFilter","limit","source","target","type","EcsMetricsFilter","category","entityType","phase","PipelineMetricsSummary","avgMs","count","lastMs","maxMs","minMs","name","samples","totalMs","EcsSchedulerSnapshot","frameSubscriptions","isPaused","pendingCount","schedules","skippedEntityTypes","EcsUpdateQueueSnapshot","items","size","EcsBridgeInput","defaultScopeId","ecsFlowRepository","entityEventsManager","entityProxyRepository","entityRepository","entityScheduler","entityTypeDescriptors","entityUpdateQueue","eventLogSize","performanceTimer","systemsModuleRepository","createVersionStore","version","add","delete","notifyInstrumentedListeners","Array","from","instrumentMethod","TTarget","methodName","undefined","mutableTarget","Record","method","instrumented","bridgeInstrumentedMethod","this","apply","maybePromise","Promise","finally","isProxy","value","sameProxy","a","b","entityUid","entityTypeKey","toString","normalizeEntityTypeDescriptor","descriptor","id","normalizePhase","entryMs","entry","msPassed","endedAt","startedAt","matchesMetric","filter","toLowerCase","includes","system","EcsBridge","stores","Map","eventLog","metricEntries","updateCounts","unsubscribeInstrumentation","constructor","input","entityTypes","events","modules","proxies","queue","scheduler","scopes","subscriptions","normalized","set","instrumentRepositories","dispose","unsubscribe","splice","getEntityUpdateCounts","get","getEntitiesInScope","listAll","entity","identity","model","getEntityTypeDescriptor","idOrEntityType","key","values","find","getEntityTypeDescriptors","descriptors","explicitEntityTypes","list","keys","has","myProxy","sort","localeCompare","registerEntityTypeDescriptor","getScopes","entitiesByScope","push","entries","map","getEventStream","data","uid","origin","some","slice","getMetricEntries","flat","getMiddlewareMetrics","summaries","ms","existing","Math","min","max","getPipelineMetrics","module","length","reduce","sum","Boolean","join","getSchedulerSnapshot","getUpdateQueueSnapshot","createEntitySpawnUpdate","spawn","descriptorId","modelInput","createModel","snapshot","createSnapshot","update","enqueueEntitySpawn","enqueue","listSystemsModules","recordEvent","Date","now","bumpUpdate","counts","proxy","_args","createEcsBridge","PropsWithChildren","useMemo","EcsBridge","EcsCanvasContextOptions","EcsFlowContext","EcsFlowContextProps","EcsCanvasProviderProps","bridge","EcsCanvasProvider","t0","$","_c","children","readOnly","t1","telemetryThresholdMs","undefined","t2","Object","assign","value","t3"],"sources":["../../src/context/ecs-flow-repository.ts","../../src/context/ecs-bridge.ts","../../src/context/ecs-canvas-provider.tsx"],"sourcesContent":["import { EntityTypeUid, IEntityProxy } from '@awesome-ecs/abstract/entities';\nimport { Node } from '@xyflow/react';\nimport { EcsIdGenerator } from '../utils/id-generator';\nimport { EntityNodeData, ScopeGroupNodeData, SystemsModuleNodeData } from '../abstract/node-props';\n\nexport class EcsFlowRepository {\n private readonly nodes: Map<string, Node>;\n\n constructor() {\n this.nodes = new Map();\n }\n\n get sizeNodes(): number {\n return this.nodes.size;\n }\n\n addSystemModuleNode(node: Node<SystemsModuleNodeData>) {\n this.nodes.set(node.data.entityType.toString(), node);\n }\n\n getSystemModuleNode(entityType: EntityTypeUid): Node<SystemsModuleNodeData> {\n return this.nodes.get(entityType.toString()) as Node<SystemsModuleNodeData>;\n }\n\n addScopeGroupNode(node: Node<ScopeGroupNodeData>) {\n this.nodes.set(EcsIdGenerator.scope(node.data.scopeId), node);\n }\n\n getScopeGroupNode(scopeId: string): Node<ScopeGroupNodeData> {\n return this.nodes.get(EcsIdGenerator.scope(scopeId)) as Node<ScopeGroupNodeData>;\n }\n\n addEntityNode(node: Node<EntityNodeData>) {\n if (!node.data.entity) {\n return;\n }\n\n this.nodes.set(EcsIdGenerator.entityProxy(node.data.entity), node);\n }\n\n getEntityNode(entity: IEntityProxy): Node<EntityNodeData> {\n return this.nodes.get(EcsIdGenerator.entityProxy(entity)) as Node<EntityNodeData>;\n }\n\n addToolNode(node: Node) {\n this.nodes.set(EcsIdGenerator.tool(node.type), node);\n }\n\n getToolNode(type: string): Node {\n return this.nodes.get(EcsIdGenerator.tool(type));\n }\n\n listAllNodes(): Node[] {\n return Array.from(this.nodes.values());\n }\n}\n","import {\n EntityEventUid,\n EntityUpdateType,\n EntityTypeUid,\n EntityUid,\n IEntity,\n IEntityEvent,\n IEntityEventsManager,\n IEntityModel,\n IEntityProxy,\n IEntityProxyRepository,\n IEntityRepository,\n IEntityScheduler,\n IEntityUpdate,\n IEntityUpdateQueue,\n IEventData\n} from '@awesome-ecs/abstract/entities';\nimport { PipelineCategory, PipelineCategoryName } from '@awesome-ecs/abstract/factories';\nimport { SystemType, ISystemsModule, ISystemsModuleRepository } from '@awesome-ecs/abstract/systems';\nimport { IPerformanceTimer, MiddlewareMetricsSummary, PerformanceTimeEntry } from '@awesome-ecs/abstract/utils';\nimport { EcsEntitySpawnRequest, EcsEntityTypeDescriptor } from '../abstract/entity-type-descriptor';\nimport { EcsIdGenerator } from '../utils/id-generator';\nimport { EcsFlowRepository } from './ecs-flow-repository';\n\nconst INSTRUMENTATION = Symbol.for('@awesome-flow/ecs.bridge.instrumentation');\n\ntype InstrumentationListener = (args: unknown[], result: unknown) => void;\ntype InstrumentedFunction = ((...args: unknown[]) => unknown) & {\n [INSTRUMENTATION]?: {\n listeners: Set<InstrumentationListener>;\n original: (...args: unknown[]) => unknown;\n };\n};\n\nexport type EcsBridgeStoreName =\n | 'entities'\n | 'entityTypes'\n | 'events'\n | 'metrics'\n | 'modules'\n | 'proxies'\n | 'queue'\n | 'scheduler'\n | 'scopes'\n | 'subscriptions'\n | 'updates';\n\nexport type EcsBridgeStore = {\n getSnapshot(): number;\n notify(): void;\n subscribe(listener: () => void): () => void;\n};\n\nexport type TelemetryMetricsSource = IPerformanceTimer & {\n readonly metrics?: ReadonlyMap<string, ReadonlyArray<PerformanceTimeEntry>>;\n clearMetrics?(): void;\n};\n\nexport type EntityUpdateCounts = {\n removes: number;\n updates: number;\n};\n\nexport type EcsEventLogEntry = {\n event: IEntityEvent<IEventData>;\n recordedAt: number;\n targets: readonly IEntityProxy[];\n};\n\nexport type EcsScopeSummary = {\n entities: readonly IEntity[];\n scopeId: string;\n scopedProxies: ReadonlyMap<EntityTypeUid, IEntityProxy>;\n};\n\nexport type EcsEventStreamFilter = {\n limit?: number;\n scopeId?: string;\n source?: IEntityProxy;\n target?: IEntityProxy;\n type?: EntityEventUid;\n};\n\nexport type EcsMetricsFilter = {\n category?: PipelineCategoryName;\n entityType?: EntityTypeUid;\n phase?: SystemType | string;\n};\n\nexport type PipelineMetricsSummary = {\n avgMs: number;\n count: number;\n lastMs: number;\n maxMs: number;\n minMs: number;\n name: string;\n samples: readonly number[];\n totalMs: number;\n};\n\nexport type EcsSchedulerSnapshot = {\n frameSubscriptions: readonly IEntityProxy[];\n isPaused: boolean;\n pendingCount: number;\n schedules: readonly unknown[];\n skippedEntityTypes: readonly EntityTypeUid[];\n};\n\nexport type EcsUpdateQueueSnapshot = {\n items: readonly IEntityUpdate[];\n size: number;\n};\n\nexport type EcsBridgeInput = {\n defaultScopeId?: string;\n ecsFlowRepository?: EcsFlowRepository;\n entityEventsManager: IEntityEventsManager;\n entityProxyRepository: IEntityProxyRepository;\n entityRepository: IEntityRepository;\n entityScheduler?: IEntityScheduler;\n entityTypeDescriptors?: readonly EcsEntityTypeDescriptor[];\n entityUpdateQueue?: IEntityUpdateQueue;\n eventLogSize?: number;\n performanceTimer?: TelemetryMetricsSource;\n systemsModuleRepository: ISystemsModuleRepository;\n};\n\nfunction createVersionStore(): EcsBridgeStore {\n let version = 0;\n const listeners = new Set<() => void>();\n\n return {\n getSnapshot: () => version,\n notify: () => {\n version += 1;\n for (const listener of listeners) {\n listener();\n }\n },\n subscribe: (listener: () => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }\n };\n}\n\nfunction notifyInstrumentedListeners(listeners: Set<InstrumentationListener>, args: unknown[], result: unknown) {\n for (const listener of Array.from(listeners)) {\n listener(args, result);\n }\n}\n\nfunction instrumentMethod<TTarget extends object>(\n target: TTarget | undefined,\n methodName: string,\n listener: InstrumentationListener\n): () => void {\n if (!target) {\n return () => undefined;\n }\n\n const mutableTarget = target as Record<string, unknown>;\n const method = mutableTarget[methodName] as InstrumentedFunction | undefined;\n\n if (typeof method !== 'function') {\n return () => undefined;\n }\n\n let instrumented = method;\n if (!instrumented[INSTRUMENTATION]) {\n const original = method;\n const listeners = new Set<InstrumentationListener>();\n\n instrumented = function bridgeInstrumentedMethod(this: unknown, ...args: unknown[]) {\n const result = original.apply(this, args);\n const maybePromise = result as Promise<unknown> | undefined;\n\n if (maybePromise && typeof maybePromise.finally === 'function') {\n return maybePromise.finally(() => notifyInstrumentedListeners(listeners, args, result));\n }\n\n notifyInstrumentedListeners(listeners, args, result);\n return result;\n } as InstrumentedFunction;\n\n instrumented[INSTRUMENTATION] = { listeners, original };\n mutableTarget[methodName] = instrumented;\n }\n\n instrumented[INSTRUMENTATION].listeners.add(listener);\n\n return () => {\n instrumented[INSTRUMENTATION]?.listeners.delete(listener);\n };\n}\n\nfunction isProxy(value: unknown): value is IEntityProxy {\n return !!value && typeof value === 'object' && 'entityType' in value && 'entityUid' in value;\n}\n\nfunction sameProxy(a?: IEntityProxy, b?: IEntityProxy): boolean {\n return !!a && !!b && a.entityType === b.entityType && a.entityUid === b.entityUid;\n}\n\nfunction entityTypeKey(entityType: EntityTypeUid): string {\n return entityType.toString();\n}\n\nfunction normalizeEntityTypeDescriptor(descriptor: EcsEntityTypeDescriptor): EcsEntityTypeDescriptor & { id: string } {\n return {\n ...descriptor,\n id: descriptor.id ?? EcsIdGenerator.entityType(descriptor.entityType)\n };\n}\n\nfunction normalizePhase(phase?: SystemType | string): string | undefined {\n if (phase === undefined || phase === null) {\n return undefined;\n }\n\n if (typeof phase === 'number') {\n return SystemType[phase];\n }\n\n return phase;\n}\n\nfunction entryMs(entry: PerformanceTimeEntry): number | undefined {\n if (entry.msPassed !== undefined) {\n return entry.msPassed;\n }\n\n if (entry.endedAt !== undefined) {\n return entry.endedAt - entry.startedAt;\n }\n\n return undefined;\n}\n\nfunction matchesMetric(entry: PerformanceTimeEntry, filter?: EcsMetricsFilter): boolean {\n if (!filter) {\n return true;\n }\n\n if (filter.category && entry.category !== filter.category) {\n return false;\n }\n\n const phase = normalizePhase(filter.phase)?.toString().toLowerCase();\n if (phase && !entry.name.toLowerCase().includes(phase)) {\n return false;\n }\n\n if (filter.entityType && entry.category !== PipelineCategory.system) {\n const entityType = filter.entityType.toString().toLowerCase();\n if (!entry.name.toLowerCase().includes(entityType)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport class EcsBridge {\n readonly ecsFlowRepository: EcsFlowRepository;\n readonly entityEventsManager: IEntityEventsManager;\n readonly entityProxyRepository: IEntityProxyRepository;\n readonly entityRepository: IEntityRepository;\n readonly entityScheduler?: IEntityScheduler;\n readonly entityUpdateQueue?: IEntityUpdateQueue;\n readonly performanceTimer?: TelemetryMetricsSource;\n readonly stores: Record<EcsBridgeStoreName, EcsBridgeStore>;\n readonly systemsModuleRepository: ISystemsModuleRepository;\n\n private readonly defaultScopeId?: string;\n private readonly entityTypeDescriptors = new Map<string, EcsEntityTypeDescriptor & { id: string }>();\n private readonly eventLogSize: number;\n private readonly eventLog: EcsEventLogEntry[] = [];\n private readonly metricEntries: PerformanceTimeEntry[] = [];\n private readonly scopedProxies = new Map<string, Map<EntityTypeUid, IEntityProxy>>();\n private readonly updateCounts = new Map<EntityUid, EntityUpdateCounts>();\n private readonly unsubscribeInstrumentation: (() => void)[] = [];\n\n constructor(input: EcsBridgeInput) {\n this.ecsFlowRepository = input.ecsFlowRepository ?? new EcsFlowRepository();\n this.entityEventsManager = input.entityEventsManager;\n this.entityProxyRepository = input.entityProxyRepository;\n this.entityRepository = input.entityRepository;\n this.entityScheduler = input.entityScheduler;\n this.entityUpdateQueue = input.entityUpdateQueue;\n this.defaultScopeId = input.defaultScopeId;\n this.performanceTimer = input.performanceTimer;\n this.systemsModuleRepository = input.systemsModuleRepository;\n this.eventLogSize = input.eventLogSize ?? 250;\n this.stores = {\n entities: createVersionStore(),\n entityTypes: createVersionStore(),\n events: createVersionStore(),\n metrics: createVersionStore(),\n modules: createVersionStore(),\n proxies: createVersionStore(),\n queue: createVersionStore(),\n scheduler: createVersionStore(),\n scopes: createVersionStore(),\n subscriptions: createVersionStore(),\n updates: createVersionStore()\n };\n\n for (const descriptor of input.entityTypeDescriptors ?? []) {\n const normalized = normalizeEntityTypeDescriptor(descriptor);\n this.entityTypeDescriptors.set(normalized.id, normalized);\n }\n\n this.instrumentRepositories();\n }\n\n dispose(): void {\n for (const unsubscribe of this.unsubscribeInstrumentation.splice(0)) {\n unsubscribe();\n }\n }\n\n getEntityUpdateCounts(target: IEntityProxy | EntityUid): EntityUpdateCounts {\n const entityUid = isProxy(target) ? target.entityUid : target;\n return this.updateCounts.get(entityUid) ?? { removes: 0, updates: 0 };\n }\n\n getEntitiesInScope(scopeId: string): IEntity[] {\n return Array.from(this.entityRepository.listAll()).filter((entity) => entity.identity?.model?.scopeId === scopeId);\n }\n\n getEntityTypeDescriptor(idOrEntityType: string | EntityTypeUid): EcsEntityTypeDescriptor | undefined {\n const key = idOrEntityType.toString();\n return (\n this.entityTypeDescriptors.get(key) ??\n Array.from(this.entityTypeDescriptors.values()).find((descriptor) => entityTypeKey(descriptor.entityType) === key)\n );\n }\n\n getEntityTypeDescriptors(): EcsEntityTypeDescriptor[] {\n const descriptors = new Map<string, EcsEntityTypeDescriptor>();\n const explicitEntityTypes = new Set<string>();\n\n for (const descriptor of this.entityTypeDescriptors.values()) {\n descriptors.set(descriptor.id, descriptor);\n explicitEntityTypes.add(entityTypeKey(descriptor.entityType));\n }\n\n for (const entityType of this.systemsModuleRepository.list().keys()) {\n if (!explicitEntityTypes.has(entityTypeKey(entityType))) {\n const descriptor = normalizeEntityTypeDescriptor({ entityType });\n descriptors.set(descriptor.id, descriptor);\n }\n }\n\n for (const entity of this.entityRepository.listAll()) {\n const { entityType } = entity.myProxy;\n if (!explicitEntityTypes.has(entityTypeKey(entityType))) {\n const descriptor = normalizeEntityTypeDescriptor({ entityType });\n descriptors.set(descriptor.id, descriptor);\n }\n }\n\n return Array.from(descriptors.values()).sort((a, b) => a.entityType.toString().localeCompare(b.entityType.toString()));\n }\n\n registerEntityTypeDescriptor(descriptor: EcsEntityTypeDescriptor): EcsEntityTypeDescriptor {\n const normalized = normalizeEntityTypeDescriptor(descriptor);\n this.entityTypeDescriptors.set(normalized.id, normalized);\n this.stores.entityTypes.notify();\n return normalized;\n }\n\n getScopes(): EcsScopeSummary[] {\n const entitiesByScope = new Map<string, IEntity[]>();\n\n for (const entity of this.entityRepository.listAll()) {\n const scopeId = entity.identity?.model?.scopeId;\n if (!scopeId) {\n continue;\n }\n\n const entities = entitiesByScope.get(scopeId) ?? [];\n entities.push(entity);\n entitiesByScope.set(scopeId, entities);\n }\n\n for (const scopeId of this.scopedProxies.keys()) {\n if (!entitiesByScope.has(scopeId)) {\n entitiesByScope.set(scopeId, []);\n }\n }\n\n return Array.from(entitiesByScope.entries()).map(([scopeId, entities]) => ({\n scopeId,\n entities,\n scopedProxies: this.scopedProxies.get(scopeId) ?? new Map()\n }));\n }\n\n getEventStream(filter?: EcsEventStreamFilter): EcsEventLogEntry[] {\n const entries = this.eventLog.filter((entry) => {\n if (filter?.type !== undefined && entry.event.data.uid !== filter.type) {\n return false;\n }\n\n if (filter?.scopeId && entry.event.scopeId !== filter.scopeId) {\n return false;\n }\n\n if (filter?.source && !sameProxy(entry.event.origin, filter.source)) {\n return false;\n }\n\n if (filter?.target) {\n const targets = entry.event.target ? [entry.event.target] : entry.targets;\n if (!targets.some((target) => sameProxy(target, filter.target))) {\n return false;\n }\n }\n\n return true;\n });\n\n return filter?.limit ? entries.slice(-filter.limit) : entries;\n }\n\n getMetricEntries(filter?: EcsMetricsFilter): PerformanceTimeEntry[] {\n const entries = this.performanceTimer?.metrics\n ? Array.from(this.performanceTimer.metrics.values()).flat()\n : this.metricEntries;\n\n return entries.filter((entry) => matchesMetric(entry, filter));\n }\n\n getMiddlewareMetrics(filter?: EcsMetricsFilter): MiddlewareMetricsSummary[] {\n const summaries = new Map<string, MiddlewareMetricsSummary>();\n\n for (const entry of this.getMetricEntries(filter)) {\n const ms = entryMs(entry);\n if (ms === undefined) {\n continue;\n }\n\n const category = entry.category ?? PipelineCategory.system;\n const key = `${category}:${entry.name}`;\n const existing = summaries.get(key);\n\n if (existing) {\n existing.count += 1;\n existing.totalMs += ms;\n existing.avgMs = existing.totalMs / existing.count;\n existing.minMs = Math.min(existing.minMs, ms);\n existing.maxMs = Math.max(existing.maxMs, ms);\n existing.lastMs = ms;\n } else {\n summaries.set(key, {\n name: entry.name,\n category,\n count: 1,\n totalMs: ms,\n avgMs: ms,\n minMs: ms,\n maxMs: ms,\n lastMs: ms\n });\n }\n }\n\n return Array.from(summaries.values()).sort((a, b) => b.totalMs - a.totalMs);\n }\n\n getPipelineMetrics(entityType?: EntityTypeUid, phase?: SystemType | string): PipelineMetricsSummary | undefined {\n const entries = this.getMetricEntries({\n category: PipelineCategory.module,\n entityType,\n phase\n });\n const samples = entries.map(entryMs).filter((ms): ms is number => ms !== undefined);\n\n if (!samples.length) {\n return undefined;\n }\n\n const totalMs = samples.reduce((sum, ms) => sum + ms, 0);\n\n return {\n name: [entityType, normalizePhase(phase)].filter(Boolean).join(':') || 'pipeline',\n count: samples.length,\n totalMs,\n avgMs: totalMs / samples.length,\n minMs: Math.min(...samples),\n maxMs: Math.max(...samples),\n lastMs: samples[samples.length - 1],\n samples\n };\n }\n\n getSchedulerSnapshot(): EcsSchedulerSnapshot | undefined {\n if (!this.entityScheduler) {\n return undefined;\n }\n\n return {\n frameSubscriptions: Array.from(this.entityScheduler.frameSubscriptions),\n isPaused: this.entityScheduler.isPaused,\n pendingCount: this.entityScheduler.pendingCount,\n schedules: Array.from(this.entityScheduler.schedules),\n skippedEntityTypes: Array.from(this.entityScheduler.skippedEntityTypes)\n };\n }\n\n getUpdateQueueSnapshot(limit?: number): EcsUpdateQueueSnapshot | undefined {\n if (!this.entityUpdateQueue) {\n return undefined;\n }\n\n const items = this.entityUpdateQueue.items();\n\n return {\n items: limit ? items.slice(-limit) : items,\n size: this.entityUpdateQueue.size\n };\n }\n\n createEntitySpawnUpdate(spawn: EcsEntitySpawnRequest): IEntityUpdate {\n const descriptor = spawn.descriptorId\n ? this.getEntityTypeDescriptor(spawn.descriptorId)\n : this.getEntityTypeDescriptor(spawn.entityType);\n const entityType = descriptor?.entityType ?? spawn.entityType;\n const uid = spawn.uid ?? EcsIdGenerator.entityUid(entityType);\n const scopeId = spawn.scopeId ?? descriptor?.scopeId ?? this.defaultScopeId;\n const modelInput = {\n descriptor: descriptor ?? normalizeEntityTypeDescriptor({ entityType }),\n entityType,\n scopeId,\n uid\n };\n const model: IEntityModel = descriptor?.createModel?.(modelInput) ?? {\n uid,\n scopeId\n };\n const snapshot = descriptor?.createSnapshot?.(modelInput);\n\n return {\n type: EntityUpdateType.update,\n entity: {\n entityType,\n entityUid: model.uid\n },\n model,\n snapshot\n };\n }\n\n enqueueEntitySpawn(spawn: EcsEntitySpawnRequest): IEntityUpdate | undefined {\n if (!this.entityUpdateQueue) {\n return undefined;\n }\n\n const update = this.createEntitySpawnUpdate(spawn);\n this.entityUpdateQueue.enqueue(update);\n return update;\n }\n\n listSystemsModules(): ReadonlyMap<EntityTypeUid, ISystemsModule<IEntity>> {\n return this.systemsModuleRepository.list() as ReadonlyMap<EntityTypeUid, ISystemsModule<IEntity>>;\n }\n\n recordEvent(event: IEntityEvent<IEventData>, targets: readonly IEntityProxy[] = []): void {\n this.eventLog.push({\n event,\n targets,\n recordedAt: Date.now()\n });\n\n if (this.eventLog.length > this.eventLogSize) {\n this.eventLog.splice(0, this.eventLog.length - this.eventLogSize);\n }\n\n this.stores.events.notify();\n }\n\n private bumpUpdate(entityUid: EntityUid, key: keyof EntityUpdateCounts): void {\n const counts = this.updateCounts.get(entityUid) ?? { removes: 0, updates: 0 };\n counts[key] += 1;\n this.updateCounts.set(entityUid, counts);\n this.stores.updates.notify();\n }\n\n private instrumentRepositories(): void {\n this.unsubscribeInstrumentation.push(\n instrumentMethod(this.entityRepository, 'set', (args) => {\n const entity = args[0] as IEntity | undefined;\n if (entity?.myProxy) {\n this.bumpUpdate(entity.myProxy.entityUid, 'updates');\n }\n this.stores.entities.notify();\n this.stores.entityTypes.notify();\n this.stores.scopes.notify();\n }),\n instrumentMethod(this.entityRepository, 'delete', (args) => {\n const proxy = args[0];\n if (isProxy(proxy)) {\n this.bumpUpdate(proxy.entityUid, 'removes');\n }\n this.stores.entities.notify();\n this.stores.entityTypes.notify();\n this.stores.scopes.notify();\n }),\n instrumentMethod(this.entityRepository, 'clear', () => {\n this.stores.entities.notify();\n this.stores.entityTypes.notify();\n this.stores.scopes.notify();\n }),\n instrumentMethod(this.systemsModuleRepository, 'set', () => {\n this.stores.modules.notify();\n this.stores.entityTypes.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'register', () => {\n this.stores.proxies.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'registerMany', () => {\n this.stores.proxies.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'remove', () => {\n this.stores.proxies.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'removeAllFor', () => {\n this.stores.proxies.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'setScopedProxy', (args) => {\n const entity = args[0];\n const scopeId = args[1];\n if (isProxy(entity) && typeof scopeId === 'string') {\n const proxies = this.scopedProxies.get(scopeId) ?? new Map<EntityTypeUid, IEntityProxy>();\n proxies.set(entity.entityType, entity);\n this.scopedProxies.set(scopeId, proxies);\n }\n this.stores.proxies.notify();\n this.stores.scopes.notify();\n }),\n instrumentMethod(this.entityProxyRepository, 'removeScopedProxy', (args) => {\n const entity = args[0];\n const scopeId = args[1];\n if (isProxy(entity) && typeof scopeId === 'string') {\n const proxies = this.scopedProxies.get(scopeId);\n const existing = proxies?.get(entity.entityType);\n if (existing?.entityUid === entity.entityUid) {\n proxies.delete(entity.entityType);\n }\n if (proxies?.size === 0) {\n this.scopedProxies.delete(scopeId);\n }\n }\n this.stores.proxies.notify();\n this.stores.scopes.notify();\n }),\n instrumentMethod(this.entityEventsManager, 'subscribe', () => {\n this.stores.subscriptions.notify();\n }),\n instrumentMethod(this.entityEventsManager, 'unsubscribe', () => {\n this.stores.subscriptions.notify();\n }),\n instrumentMethod(this.entityEventsManager, 'clearSubscriptions', () => {\n this.stores.subscriptions.notify();\n }),\n instrumentMethod(this.entityEventsManager, 'clearSubscriptionsForEntity', () => {\n this.stores.subscriptions.notify();\n }),\n instrumentMethod(this.entityEventsManager, 'clearSubscriptionsForEvent', () => {\n this.stores.subscriptions.notify();\n }),\n instrumentMethod(this.performanceTimer, 'endTimer', (_args, result) => {\n const entry = result as PerformanceTimeEntry | undefined;\n if (!this.performanceTimer?.metrics && entry?.name) {\n this.metricEntries.push(entry);\n }\n this.stores.metrics.notify();\n }),\n instrumentMethod(this.entityScheduler, 'schedule', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'remove', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'clear', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'skipEntityType', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'unskipEntityType', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'pause', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityScheduler, 'resume', () => {\n this.stores.scheduler.notify();\n }),\n instrumentMethod(this.entityUpdateQueue, 'enqueue', () => {\n this.stores.queue.notify();\n }),\n instrumentMethod(this.entityUpdateQueue, 'dequeue', () => {\n this.stores.queue.notify();\n }),\n instrumentMethod(this.entityUpdateQueue, 'clear', () => {\n this.stores.queue.notify();\n })\n );\n }\n}\n\nexport function createEcsBridge(input: EcsBridgeInput): EcsBridge {\n return new EcsBridge(input);\n}\n","import { PropsWithChildren, useMemo } from 'react';\nimport { EcsBridge } from './ecs-bridge';\nimport {\n EcsCanvasContextOptions,\n EcsFlowContext,\n EcsFlowContextProps\n} from './ecs-flow-context';\n\nexport type EcsCanvasProviderProps = PropsWithChildren<\n EcsCanvasContextOptions & {\n bridge: EcsBridge;\n }\n>;\n\nexport function EcsCanvasProvider({\n bridge,\n children,\n readOnly = false,\n telemetryThresholdMs\n}: Readonly<EcsCanvasProviderProps>) {\n const value = useMemo<EcsFlowContextProps>(() => {\n return Object.assign(bridge, {\n readOnly,\n telemetryThresholdMs\n });\n }, [bridge, readOnly, telemetryThresholdMs]);\n\n return <EcsFlowContext.Provider value={value}>{children}</EcsFlowContext.Provider>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { _ as PipelineMetricsSummary, a as EcsFlowContextProps, b as EcsFlowRepository, c as EcsBridgeStore, d as EcsEventStreamFilter, f as EcsMetricsFilter, g as EntityUpdateCounts, h as EcsUpdateQueueSnapshot, i as EcsFlowContext, l as EcsBridgeStoreName, m as EcsScopeSummary, n as EcsCanvasProviderProps, o as EcsBridge, p as EcsSchedulerSnapshot, r as EcsCanvasContextOptions, s as EcsBridgeInput, t as EcsCanvasProvider, u as EcsEventLogEntry, v as TelemetryMetricsSource, y as createEcsBridge } from "../index-YNgbjS9S.cjs";
2
+ export { EcsBridge, EcsBridgeInput, EcsBridgeStore, EcsBridgeStoreName, EcsCanvasContextOptions, EcsCanvasProvider, EcsCanvasProviderProps, EcsEventLogEntry, EcsEventStreamFilter, EcsFlowContext, EcsFlowContextProps, EcsFlowRepository, EcsMetricsFilter, EcsSchedulerSnapshot, EcsScopeSummary, EcsUpdateQueueSnapshot, EntityUpdateCounts, PipelineMetricsSummary, TelemetryMetricsSource, createEcsBridge };
@@ -0,0 +1,2 @@
1
+ import { _ as PipelineMetricsSummary, a as EcsFlowContextProps, b as EcsFlowRepository, c as EcsBridgeStore, d as EcsEventStreamFilter, f as EcsMetricsFilter, g as EntityUpdateCounts, h as EcsUpdateQueueSnapshot, i as EcsFlowContext, l as EcsBridgeStoreName, m as EcsScopeSummary, n as EcsCanvasProviderProps, o as EcsBridge, p as EcsSchedulerSnapshot, r as EcsCanvasContextOptions, s as EcsBridgeInput, t as EcsCanvasProvider, u as EcsEventLogEntry, v as TelemetryMetricsSource, y as createEcsBridge } from "../index-_BgjSgkQ.mjs";
2
+ export { EcsBridge, EcsBridgeInput, EcsBridgeStore, EcsBridgeStoreName, EcsCanvasContextOptions, EcsCanvasProvider, EcsCanvasProviderProps, EcsEventLogEntry, EcsEventStreamFilter, EcsFlowContext, EcsFlowContextProps, EcsFlowRepository, EcsMetricsFilter, EcsSchedulerSnapshot, EcsScopeSummary, EcsUpdateQueueSnapshot, EntityUpdateCounts, PipelineMetricsSummary, TelemetryMetricsSource, createEcsBridge };
@@ -0,0 +1,492 @@
1
+ import { n as EcsFlowContext, t as EcsIdGenerator } from "../id-generator-DDsv3NdX.mjs";
2
+ import { c } from "react/compiler-runtime";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { SystemType } from "@awesome-ecs/abstract/systems";
5
+ import { EntityUpdateType } from "@awesome-ecs/abstract/entities";
6
+ import { PipelineCategory } from "@awesome-ecs/abstract/factories";
7
+
8
+ //#region src/context/ecs-flow-repository.ts
9
+ var EcsFlowRepository = class {
10
+ nodes;
11
+ constructor() {
12
+ this.nodes = /* @__PURE__ */ new Map();
13
+ }
14
+ get sizeNodes() {
15
+ return this.nodes.size;
16
+ }
17
+ addSystemModuleNode(node) {
18
+ this.nodes.set(node.data.entityType.toString(), node);
19
+ }
20
+ getSystemModuleNode(entityType) {
21
+ return this.nodes.get(entityType.toString());
22
+ }
23
+ addScopeGroupNode(node) {
24
+ this.nodes.set(EcsIdGenerator.scope(node.data.scopeId), node);
25
+ }
26
+ getScopeGroupNode(scopeId) {
27
+ return this.nodes.get(EcsIdGenerator.scope(scopeId));
28
+ }
29
+ addEntityNode(node) {
30
+ if (!node.data.entity) return;
31
+ this.nodes.set(EcsIdGenerator.entityProxy(node.data.entity), node);
32
+ }
33
+ getEntityNode(entity) {
34
+ return this.nodes.get(EcsIdGenerator.entityProxy(entity));
35
+ }
36
+ addToolNode(node) {
37
+ this.nodes.set(EcsIdGenerator.tool(node.type), node);
38
+ }
39
+ getToolNode(type) {
40
+ return this.nodes.get(EcsIdGenerator.tool(type));
41
+ }
42
+ listAllNodes() {
43
+ return Array.from(this.nodes.values());
44
+ }
45
+ };
46
+
47
+ //#endregion
48
+ //#region src/context/ecs-bridge.ts
49
+ const INSTRUMENTATION = Symbol.for("@awesome-flow/ecs.bridge.instrumentation");
50
+ function createVersionStore() {
51
+ let version = 0;
52
+ const listeners = /* @__PURE__ */ new Set();
53
+ return {
54
+ getSnapshot: () => version,
55
+ notify: () => {
56
+ version += 1;
57
+ for (const listener of listeners) listener();
58
+ },
59
+ subscribe: (listener) => {
60
+ listeners.add(listener);
61
+ return () => listeners.delete(listener);
62
+ }
63
+ };
64
+ }
65
+ function notifyInstrumentedListeners(listeners, args, result) {
66
+ for (const listener of Array.from(listeners)) listener(args, result);
67
+ }
68
+ function instrumentMethod(target, methodName, listener) {
69
+ if (!target) return () => void 0;
70
+ const mutableTarget = target;
71
+ const method = mutableTarget[methodName];
72
+ if (typeof method !== "function") return () => void 0;
73
+ let instrumented = method;
74
+ if (!instrumented[INSTRUMENTATION]) {
75
+ const original = method;
76
+ const listeners = /* @__PURE__ */ new Set();
77
+ instrumented = function bridgeInstrumentedMethod(...args) {
78
+ const result = original.apply(this, args);
79
+ const maybePromise = result;
80
+ if (maybePromise && typeof maybePromise.finally === "function") return maybePromise.finally(() => notifyInstrumentedListeners(listeners, args, result));
81
+ notifyInstrumentedListeners(listeners, args, result);
82
+ return result;
83
+ };
84
+ instrumented[INSTRUMENTATION] = {
85
+ listeners,
86
+ original
87
+ };
88
+ mutableTarget[methodName] = instrumented;
89
+ }
90
+ instrumented[INSTRUMENTATION].listeners.add(listener);
91
+ return () => {
92
+ instrumented[INSTRUMENTATION]?.listeners.delete(listener);
93
+ };
94
+ }
95
+ function isProxy(value) {
96
+ return !!value && typeof value === "object" && "entityType" in value && "entityUid" in value;
97
+ }
98
+ function sameProxy(a, b) {
99
+ return !!a && !!b && a.entityType === b.entityType && a.entityUid === b.entityUid;
100
+ }
101
+ function entityTypeKey(entityType) {
102
+ return entityType.toString();
103
+ }
104
+ function normalizeEntityTypeDescriptor(descriptor) {
105
+ return {
106
+ ...descriptor,
107
+ id: descriptor.id ?? EcsIdGenerator.entityType(descriptor.entityType)
108
+ };
109
+ }
110
+ function normalizePhase(phase) {
111
+ if (phase === void 0 || phase === null) return;
112
+ if (typeof phase === "number") return SystemType[phase];
113
+ return phase;
114
+ }
115
+ function entryMs(entry) {
116
+ if (entry.msPassed !== void 0) return entry.msPassed;
117
+ if (entry.endedAt !== void 0) return entry.endedAt - entry.startedAt;
118
+ }
119
+ function matchesMetric(entry, filter) {
120
+ if (!filter) return true;
121
+ if (filter.category && entry.category !== filter.category) return false;
122
+ const phase = normalizePhase(filter.phase)?.toString().toLowerCase();
123
+ if (phase && !entry.name.toLowerCase().includes(phase)) return false;
124
+ if (filter.entityType && entry.category !== PipelineCategory.system) {
125
+ const entityType = filter.entityType.toString().toLowerCase();
126
+ if (!entry.name.toLowerCase().includes(entityType)) return false;
127
+ }
128
+ return true;
129
+ }
130
+ var EcsBridge = class {
131
+ ecsFlowRepository;
132
+ entityEventsManager;
133
+ entityProxyRepository;
134
+ entityRepository;
135
+ entityScheduler;
136
+ entityUpdateQueue;
137
+ performanceTimer;
138
+ stores;
139
+ systemsModuleRepository;
140
+ defaultScopeId;
141
+ entityTypeDescriptors = /* @__PURE__ */ new Map();
142
+ eventLogSize;
143
+ eventLog = [];
144
+ metricEntries = [];
145
+ scopedProxies = /* @__PURE__ */ new Map();
146
+ updateCounts = /* @__PURE__ */ new Map();
147
+ unsubscribeInstrumentation = [];
148
+ constructor(input) {
149
+ this.ecsFlowRepository = input.ecsFlowRepository ?? new EcsFlowRepository();
150
+ this.entityEventsManager = input.entityEventsManager;
151
+ this.entityProxyRepository = input.entityProxyRepository;
152
+ this.entityRepository = input.entityRepository;
153
+ this.entityScheduler = input.entityScheduler;
154
+ this.entityUpdateQueue = input.entityUpdateQueue;
155
+ this.defaultScopeId = input.defaultScopeId;
156
+ this.performanceTimer = input.performanceTimer;
157
+ this.systemsModuleRepository = input.systemsModuleRepository;
158
+ this.eventLogSize = input.eventLogSize ?? 250;
159
+ this.stores = {
160
+ entities: createVersionStore(),
161
+ entityTypes: createVersionStore(),
162
+ events: createVersionStore(),
163
+ metrics: createVersionStore(),
164
+ modules: createVersionStore(),
165
+ proxies: createVersionStore(),
166
+ queue: createVersionStore(),
167
+ scheduler: createVersionStore(),
168
+ scopes: createVersionStore(),
169
+ subscriptions: createVersionStore(),
170
+ updates: createVersionStore()
171
+ };
172
+ for (const descriptor of input.entityTypeDescriptors ?? []) {
173
+ const normalized = normalizeEntityTypeDescriptor(descriptor);
174
+ this.entityTypeDescriptors.set(normalized.id, normalized);
175
+ }
176
+ this.instrumentRepositories();
177
+ }
178
+ dispose() {
179
+ for (const unsubscribe of this.unsubscribeInstrumentation.splice(0)) unsubscribe();
180
+ }
181
+ getEntityUpdateCounts(target) {
182
+ const entityUid = isProxy(target) ? target.entityUid : target;
183
+ return this.updateCounts.get(entityUid) ?? {
184
+ removes: 0,
185
+ updates: 0
186
+ };
187
+ }
188
+ getEntitiesInScope(scopeId) {
189
+ return Array.from(this.entityRepository.listAll()).filter((entity) => entity.identity?.model?.scopeId === scopeId);
190
+ }
191
+ getEntityTypeDescriptor(idOrEntityType) {
192
+ const key = idOrEntityType.toString();
193
+ return this.entityTypeDescriptors.get(key) ?? Array.from(this.entityTypeDescriptors.values()).find((descriptor) => entityTypeKey(descriptor.entityType) === key);
194
+ }
195
+ getEntityTypeDescriptors() {
196
+ const descriptors = /* @__PURE__ */ new Map();
197
+ const explicitEntityTypes = /* @__PURE__ */ new Set();
198
+ for (const descriptor of this.entityTypeDescriptors.values()) {
199
+ descriptors.set(descriptor.id, descriptor);
200
+ explicitEntityTypes.add(entityTypeKey(descriptor.entityType));
201
+ }
202
+ for (const entityType of this.systemsModuleRepository.list().keys()) if (!explicitEntityTypes.has(entityTypeKey(entityType))) {
203
+ const descriptor = normalizeEntityTypeDescriptor({ entityType });
204
+ descriptors.set(descriptor.id, descriptor);
205
+ }
206
+ for (const entity of this.entityRepository.listAll()) {
207
+ const { entityType } = entity.myProxy;
208
+ if (!explicitEntityTypes.has(entityTypeKey(entityType))) {
209
+ const descriptor = normalizeEntityTypeDescriptor({ entityType });
210
+ descriptors.set(descriptor.id, descriptor);
211
+ }
212
+ }
213
+ return Array.from(descriptors.values()).sort((a, b) => a.entityType.toString().localeCompare(b.entityType.toString()));
214
+ }
215
+ registerEntityTypeDescriptor(descriptor) {
216
+ const normalized = normalizeEntityTypeDescriptor(descriptor);
217
+ this.entityTypeDescriptors.set(normalized.id, normalized);
218
+ this.stores.entityTypes.notify();
219
+ return normalized;
220
+ }
221
+ getScopes() {
222
+ const entitiesByScope = /* @__PURE__ */ new Map();
223
+ for (const entity of this.entityRepository.listAll()) {
224
+ const scopeId = entity.identity?.model?.scopeId;
225
+ if (!scopeId) continue;
226
+ const entities = entitiesByScope.get(scopeId) ?? [];
227
+ entities.push(entity);
228
+ entitiesByScope.set(scopeId, entities);
229
+ }
230
+ for (const scopeId of this.scopedProxies.keys()) if (!entitiesByScope.has(scopeId)) entitiesByScope.set(scopeId, []);
231
+ return Array.from(entitiesByScope.entries()).map(([scopeId, entities]) => ({
232
+ scopeId,
233
+ entities,
234
+ scopedProxies: this.scopedProxies.get(scopeId) ?? /* @__PURE__ */ new Map()
235
+ }));
236
+ }
237
+ getEventStream(filter) {
238
+ const entries = this.eventLog.filter((entry) => {
239
+ if (filter?.type !== void 0 && entry.event.data.uid !== filter.type) return false;
240
+ if (filter?.scopeId && entry.event.scopeId !== filter.scopeId) return false;
241
+ if (filter?.source && !sameProxy(entry.event.origin, filter.source)) return false;
242
+ if (filter?.target) {
243
+ if (!(entry.event.target ? [entry.event.target] : entry.targets).some((target) => sameProxy(target, filter.target))) return false;
244
+ }
245
+ return true;
246
+ });
247
+ return filter?.limit ? entries.slice(-filter.limit) : entries;
248
+ }
249
+ getMetricEntries(filter) {
250
+ return (this.performanceTimer?.metrics ? Array.from(this.performanceTimer.metrics.values()).flat() : this.metricEntries).filter((entry) => matchesMetric(entry, filter));
251
+ }
252
+ getMiddlewareMetrics(filter) {
253
+ const summaries = /* @__PURE__ */ new Map();
254
+ for (const entry of this.getMetricEntries(filter)) {
255
+ const ms = entryMs(entry);
256
+ if (ms === void 0) continue;
257
+ const category = entry.category ?? PipelineCategory.system;
258
+ const key = `${category}:${entry.name}`;
259
+ const existing = summaries.get(key);
260
+ if (existing) {
261
+ existing.count += 1;
262
+ existing.totalMs += ms;
263
+ existing.avgMs = existing.totalMs / existing.count;
264
+ existing.minMs = Math.min(existing.minMs, ms);
265
+ existing.maxMs = Math.max(existing.maxMs, ms);
266
+ existing.lastMs = ms;
267
+ } else summaries.set(key, {
268
+ name: entry.name,
269
+ category,
270
+ count: 1,
271
+ totalMs: ms,
272
+ avgMs: ms,
273
+ minMs: ms,
274
+ maxMs: ms,
275
+ lastMs: ms
276
+ });
277
+ }
278
+ return Array.from(summaries.values()).sort((a, b) => b.totalMs - a.totalMs);
279
+ }
280
+ getPipelineMetrics(entityType, phase) {
281
+ const samples = this.getMetricEntries({
282
+ category: PipelineCategory.module,
283
+ entityType,
284
+ phase
285
+ }).map(entryMs).filter((ms) => ms !== void 0);
286
+ if (!samples.length) return;
287
+ const totalMs = samples.reduce((sum, ms) => sum + ms, 0);
288
+ return {
289
+ name: [entityType, normalizePhase(phase)].filter(Boolean).join(":") || "pipeline",
290
+ count: samples.length,
291
+ totalMs,
292
+ avgMs: totalMs / samples.length,
293
+ minMs: Math.min(...samples),
294
+ maxMs: Math.max(...samples),
295
+ lastMs: samples[samples.length - 1],
296
+ samples
297
+ };
298
+ }
299
+ getSchedulerSnapshot() {
300
+ if (!this.entityScheduler) return;
301
+ return {
302
+ frameSubscriptions: Array.from(this.entityScheduler.frameSubscriptions),
303
+ isPaused: this.entityScheduler.isPaused,
304
+ pendingCount: this.entityScheduler.pendingCount,
305
+ schedules: Array.from(this.entityScheduler.schedules),
306
+ skippedEntityTypes: Array.from(this.entityScheduler.skippedEntityTypes)
307
+ };
308
+ }
309
+ getUpdateQueueSnapshot(limit) {
310
+ if (!this.entityUpdateQueue) return;
311
+ const items = this.entityUpdateQueue.items();
312
+ return {
313
+ items: limit ? items.slice(-limit) : items,
314
+ size: this.entityUpdateQueue.size
315
+ };
316
+ }
317
+ createEntitySpawnUpdate(spawn) {
318
+ const descriptor = spawn.descriptorId ? this.getEntityTypeDescriptor(spawn.descriptorId) : this.getEntityTypeDescriptor(spawn.entityType);
319
+ const entityType = descriptor?.entityType ?? spawn.entityType;
320
+ const uid = spawn.uid ?? EcsIdGenerator.entityUid(entityType);
321
+ const scopeId = spawn.scopeId ?? descriptor?.scopeId ?? this.defaultScopeId;
322
+ const modelInput = {
323
+ descriptor: descriptor ?? normalizeEntityTypeDescriptor({ entityType }),
324
+ entityType,
325
+ scopeId,
326
+ uid
327
+ };
328
+ const model = descriptor?.createModel?.(modelInput) ?? {
329
+ uid,
330
+ scopeId
331
+ };
332
+ const snapshot = descriptor?.createSnapshot?.(modelInput);
333
+ return {
334
+ type: EntityUpdateType.update,
335
+ entity: {
336
+ entityType,
337
+ entityUid: model.uid
338
+ },
339
+ model,
340
+ snapshot
341
+ };
342
+ }
343
+ enqueueEntitySpawn(spawn) {
344
+ if (!this.entityUpdateQueue) return;
345
+ const update = this.createEntitySpawnUpdate(spawn);
346
+ this.entityUpdateQueue.enqueue(update);
347
+ return update;
348
+ }
349
+ listSystemsModules() {
350
+ return this.systemsModuleRepository.list();
351
+ }
352
+ recordEvent(event, targets = []) {
353
+ this.eventLog.push({
354
+ event,
355
+ targets,
356
+ recordedAt: Date.now()
357
+ });
358
+ if (this.eventLog.length > this.eventLogSize) this.eventLog.splice(0, this.eventLog.length - this.eventLogSize);
359
+ this.stores.events.notify();
360
+ }
361
+ bumpUpdate(entityUid, key) {
362
+ const counts = this.updateCounts.get(entityUid) ?? {
363
+ removes: 0,
364
+ updates: 0
365
+ };
366
+ counts[key] += 1;
367
+ this.updateCounts.set(entityUid, counts);
368
+ this.stores.updates.notify();
369
+ }
370
+ instrumentRepositories() {
371
+ this.unsubscribeInstrumentation.push(instrumentMethod(this.entityRepository, "set", (args) => {
372
+ const entity = args[0];
373
+ if (entity?.myProxy) this.bumpUpdate(entity.myProxy.entityUid, "updates");
374
+ this.stores.entities.notify();
375
+ this.stores.entityTypes.notify();
376
+ this.stores.scopes.notify();
377
+ }), instrumentMethod(this.entityRepository, "delete", (args) => {
378
+ const proxy = args[0];
379
+ if (isProxy(proxy)) this.bumpUpdate(proxy.entityUid, "removes");
380
+ this.stores.entities.notify();
381
+ this.stores.entityTypes.notify();
382
+ this.stores.scopes.notify();
383
+ }), instrumentMethod(this.entityRepository, "clear", () => {
384
+ this.stores.entities.notify();
385
+ this.stores.entityTypes.notify();
386
+ this.stores.scopes.notify();
387
+ }), instrumentMethod(this.systemsModuleRepository, "set", () => {
388
+ this.stores.modules.notify();
389
+ this.stores.entityTypes.notify();
390
+ }), instrumentMethod(this.entityProxyRepository, "register", () => {
391
+ this.stores.proxies.notify();
392
+ }), instrumentMethod(this.entityProxyRepository, "registerMany", () => {
393
+ this.stores.proxies.notify();
394
+ }), instrumentMethod(this.entityProxyRepository, "remove", () => {
395
+ this.stores.proxies.notify();
396
+ }), instrumentMethod(this.entityProxyRepository, "removeAllFor", () => {
397
+ this.stores.proxies.notify();
398
+ }), instrumentMethod(this.entityProxyRepository, "setScopedProxy", (args) => {
399
+ const entity = args[0];
400
+ const scopeId = args[1];
401
+ if (isProxy(entity) && typeof scopeId === "string") {
402
+ const proxies = this.scopedProxies.get(scopeId) ?? /* @__PURE__ */ new Map();
403
+ proxies.set(entity.entityType, entity);
404
+ this.scopedProxies.set(scopeId, proxies);
405
+ }
406
+ this.stores.proxies.notify();
407
+ this.stores.scopes.notify();
408
+ }), instrumentMethod(this.entityProxyRepository, "removeScopedProxy", (args) => {
409
+ const entity = args[0];
410
+ const scopeId = args[1];
411
+ if (isProxy(entity) && typeof scopeId === "string") {
412
+ const proxies = this.scopedProxies.get(scopeId);
413
+ if ((proxies?.get(entity.entityType))?.entityUid === entity.entityUid) proxies.delete(entity.entityType);
414
+ if (proxies?.size === 0) this.scopedProxies.delete(scopeId);
415
+ }
416
+ this.stores.proxies.notify();
417
+ this.stores.scopes.notify();
418
+ }), instrumentMethod(this.entityEventsManager, "subscribe", () => {
419
+ this.stores.subscriptions.notify();
420
+ }), instrumentMethod(this.entityEventsManager, "unsubscribe", () => {
421
+ this.stores.subscriptions.notify();
422
+ }), instrumentMethod(this.entityEventsManager, "clearSubscriptions", () => {
423
+ this.stores.subscriptions.notify();
424
+ }), instrumentMethod(this.entityEventsManager, "clearSubscriptionsForEntity", () => {
425
+ this.stores.subscriptions.notify();
426
+ }), instrumentMethod(this.entityEventsManager, "clearSubscriptionsForEvent", () => {
427
+ this.stores.subscriptions.notify();
428
+ }), instrumentMethod(this.performanceTimer, "endTimer", (_args, result) => {
429
+ const entry = result;
430
+ if (!this.performanceTimer?.metrics && entry?.name) this.metricEntries.push(entry);
431
+ this.stores.metrics.notify();
432
+ }), instrumentMethod(this.entityScheduler, "schedule", () => {
433
+ this.stores.scheduler.notify();
434
+ }), instrumentMethod(this.entityScheduler, "remove", () => {
435
+ this.stores.scheduler.notify();
436
+ }), instrumentMethod(this.entityScheduler, "clear", () => {
437
+ this.stores.scheduler.notify();
438
+ }), instrumentMethod(this.entityScheduler, "skipEntityType", () => {
439
+ this.stores.scheduler.notify();
440
+ }), instrumentMethod(this.entityScheduler, "unskipEntityType", () => {
441
+ this.stores.scheduler.notify();
442
+ }), instrumentMethod(this.entityScheduler, "pause", () => {
443
+ this.stores.scheduler.notify();
444
+ }), instrumentMethod(this.entityScheduler, "resume", () => {
445
+ this.stores.scheduler.notify();
446
+ }), instrumentMethod(this.entityUpdateQueue, "enqueue", () => {
447
+ this.stores.queue.notify();
448
+ }), instrumentMethod(this.entityUpdateQueue, "dequeue", () => {
449
+ this.stores.queue.notify();
450
+ }), instrumentMethod(this.entityUpdateQueue, "clear", () => {
451
+ this.stores.queue.notify();
452
+ }));
453
+ }
454
+ };
455
+ function createEcsBridge(input) {
456
+ return new EcsBridge(input);
457
+ }
458
+
459
+ //#endregion
460
+ //#region src/context/ecs-canvas-provider.tsx
461
+ function EcsCanvasProvider(t0) {
462
+ const $ = c(7);
463
+ const { bridge, children, readOnly: t1, telemetryThresholdMs } = t0;
464
+ const readOnly = t1 === void 0 ? false : t1;
465
+ let t2;
466
+ if ($[0] !== bridge || $[1] !== readOnly || $[2] !== telemetryThresholdMs) {
467
+ t2 = Object.assign(bridge, {
468
+ readOnly,
469
+ telemetryThresholdMs
470
+ });
471
+ $[0] = bridge;
472
+ $[1] = readOnly;
473
+ $[2] = telemetryThresholdMs;
474
+ $[3] = t2;
475
+ } else t2 = $[3];
476
+ const value = t2;
477
+ let t3;
478
+ if ($[4] !== children || $[5] !== value) {
479
+ t3 = /* @__PURE__ */ jsx(EcsFlowContext.Provider, {
480
+ value,
481
+ children
482
+ });
483
+ $[4] = children;
484
+ $[5] = value;
485
+ $[6] = t3;
486
+ } else t3 = $[6];
487
+ return t3;
488
+ }
489
+
490
+ //#endregion
491
+ export { EcsBridge, EcsCanvasProvider, EcsFlowContext, EcsFlowRepository, createEcsBridge };
492
+ //# sourceMappingURL=index.mjs.map