@futdevpro/fsm-dynamo 1.20.92 → 1.20.93

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 (437) hide show
  1. package/build/_models/control-models/data-model-params.control-model.d.ts +0 -1
  2. package/build/_models/control-models/data-model-params.control-model.d.ts.map +1 -1
  3. package/build/_models/control-models/data-model-params.control-model.js +1 -4
  4. package/build/_models/control-models/data-model-params.control-model.js.map +1 -1
  5. package/build/_models/control-models/data-property-params.control-model.d.ts +0 -1
  6. package/build/_models/control-models/data-property-params.control-model.d.ts.map +1 -1
  7. package/build/_models/control-models/data-property-params.control-model.js +1 -4
  8. package/build/_models/control-models/data-property-params.control-model.js.map +1 -1
  9. package/build/_models/control-models/service-endpoint-settings-base.control-model.d.ts +0 -1
  10. package/build/_models/control-models/service-endpoint-settings-base.control-model.d.ts.map +1 -1
  11. package/build/_models/control-models/service-endpoint-settings-base.control-model.js +4 -4
  12. package/build/_models/control-models/service-endpoint-settings-base.control-model.js.map +1 -1
  13. package/build/_modules/data-handler/_models/data-handler-settings.control-model.d.ts +0 -3
  14. package/build/_modules/data-handler/_models/data-handler-settings.control-model.d.ts.map +1 -1
  15. package/build/_modules/data-handler/_models/data-handler-settings.control-model.js +4 -10
  16. package/build/_modules/data-handler/_models/data-handler-settings.control-model.js.map +1 -1
  17. package/build/_modules/data-handler/_models/data-list-handler.control-model.d.ts +1 -1
  18. package/build/_modules/data-handler/_models/data-list-handler.control-model.d.ts.map +1 -1
  19. package/build/_modules/data-handler/_models/data-search-handler.control-model.d.ts +1 -1
  20. package/build/_modules/data-handler/_models/data-search-handler.control-model.d.ts.map +1 -1
  21. package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.d.ts +1 -1
  22. package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.d.ts.map +1 -1
  23. package/build/_modules/data-handler/index.d.ts +3 -0
  24. package/build/_modules/data-handler/index.d.ts.map +1 -1
  25. package/build/_modules/data-handler/index.js +3 -0
  26. package/build/_modules/data-handler/index.js.map +1 -1
  27. package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.d.ts +0 -3
  28. package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.d.ts.map +1 -1
  29. package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js +4 -10
  30. package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js.map +1 -1
  31. package/build/_modules/ngx-models/index.d.ts +3 -0
  32. package/build/_modules/ngx-models/index.d.ts.map +1 -1
  33. package/build/_modules/ngx-models/index.js +3 -0
  34. package/build/_modules/ngx-models/index.js.map +1 -1
  35. package/build/index.d.ts +3 -0
  36. package/build/index.d.ts.map +1 -1
  37. package/build/index.js +3 -0
  38. package/build/index.js.map +1 -1
  39. package/build-esm/_collections/constants/data-sizes.const.js +37 -0
  40. package/build-esm/_collections/constants/error-defaults.const.js +17 -0
  41. package/build-esm/_collections/constants/global-settings.const.js +17 -0
  42. package/build-esm/_collections/constants/numbers.const.js +36 -0
  43. package/build-esm/_collections/constants/times.const.js +38 -0
  44. package/build-esm/_collections/utils/array.util.js +632 -0
  45. package/build-esm/_collections/utils/async.util.js +183 -0
  46. package/build-esm/_collections/utils/data.util.js +203 -0
  47. package/build-esm/_collections/utils/extract-error-message.util.js +183 -0
  48. package/build-esm/_collections/utils/json-error-helper.util.js +251 -0
  49. package/build-esm/_collections/utils/log.util.js +555 -0
  50. package/build-esm/_collections/utils/math/box-bounds.util.js +159 -0
  51. package/build-esm/_collections/utils/math/math.util.js +183 -0
  52. package/build-esm/_collections/utils/math/random.util.js +117 -0
  53. package/build-esm/_collections/utils/math/trigonometry.util.js +89 -0
  54. package/build-esm/_collections/utils/math/vector2.util.js +587 -0
  55. package/build-esm/_collections/utils/object.util.js +591 -0
  56. package/build-esm/_collections/utils/operation-authz.util.js +136 -0
  57. package/build-esm/_collections/utils/operation-guardrails.util.js +220 -0
  58. package/build-esm/_collections/utils/operation-run.util.js +81 -0
  59. package/build-esm/_collections/utils/operation-schema.util.js +159 -0
  60. package/build-esm/_collections/utils/regex/password-regex.util.js +56 -0
  61. package/build-esm/_collections/utils/regex/regex.util.js +1 -0
  62. package/build-esm/_collections/utils/regex/username-regex.util.js +28 -0
  63. package/build-esm/_collections/utils/require-env.util.js +90 -0
  64. package/build-esm/_collections/utils/round-list.util.js +108 -0
  65. package/build-esm/_collections/utils/secret-mask.util.js +219 -0
  66. package/build-esm/_collections/utils/stack.util.js +126 -0
  67. package/build-esm/_collections/utils/string-case.util.js +332 -0
  68. package/build-esm/_collections/utils/string.util.js +366 -0
  69. package/build-esm/_collections/utils/time.util.js +431 -0
  70. package/build-esm/_collections/utils/type-cloning-facility.util.js +122 -0
  71. package/build-esm/_collections/utils/utilities.util.js +61 -0
  72. package/build-esm/_collections/utils/uuid.util.js +33 -0
  73. package/build-esm/_enums/basic-property-type.enum.js +18 -0
  74. package/build-esm/_enums/data-model-type.enum.js +24 -0
  75. package/build-esm/_enums/environment-flag.enum.js +26 -0
  76. package/build-esm/_enums/error-level.enum.js +35 -0
  77. package/build-esm/_enums/error-status.enum.js +28 -0
  78. package/build-esm/_enums/http/http-call-type.enum.js +42 -0
  79. package/build-esm/_enums/http/http-event-type.enum.js +39 -0
  80. package/build-esm/_enums/http/http-response-type.enum.js +18 -0
  81. package/build-esm/_enums/log-style.enum.js +38 -0
  82. package/build-esm/_enums/operation-auth.type-enum.js +19 -0
  83. package/build-esm/_enums/operation-if-match.type-enum.js +17 -0
  84. package/build-esm/_enums/operation-patch-field.type-enum.js +40 -0
  85. package/build-esm/_enums/server-connection-status.enum.js +5 -0
  86. package/build-esm/_enums/time/day-of-week.enum.js +47 -0
  87. package/build-esm/_enums/time/month.enum.js +23 -0
  88. package/build-esm/_enums/time/relative-date.enum.js +19 -0
  89. package/build-esm/_models/control-models/data-model-params.control-model.js +259 -0
  90. package/build-esm/_models/control-models/data-model-settings.control-model.js +63 -0
  91. package/build-esm/_models/control-models/data-property-params.control-model.js +101 -0
  92. package/build-esm/_models/control-models/data-property-settings.control-model.js +61 -0
  93. package/build-esm/_models/control-models/error.control-model.js +787 -0
  94. package/build-esm/_models/control-models/http/http-error-response.control-model.js +48 -0
  95. package/build-esm/_models/control-models/http/http-headers.control-model.js +43 -0
  96. package/build-esm/_models/control-models/http/http-response.model-base.js +62 -0
  97. package/build-esm/_models/control-models/operation-context.control-model.js +110 -0
  98. package/build-esm/_models/control-models/operation-settings.control-model.js +184 -0
  99. package/build-esm/_models/control-models/poll.control-model.js +202 -0
  100. package/build-esm/_models/control-models/range-value.control-model.js +247 -0
  101. package/build-esm/_models/control-models/server-route-settings-base.control-model.js +19 -0
  102. package/build-esm/_models/control-models/server-status.control-model.js +73 -0
  103. package/build-esm/_models/control-models/service-endpoint-settings-base.control-model.js +110 -0
  104. package/build-esm/_models/data-models/errors.data-model.js +156 -0
  105. package/build-esm/_models/data-models/metadata.data-model.js +120 -0
  106. package/build-esm/_models/interfaces/box-bounds.interface.js +1 -0
  107. package/build-esm/_models/interfaces/environment/global-log-settings.interface.js +1 -0
  108. package/build-esm/_models/interfaces/environment/global-settings.interface.js +1 -0
  109. package/build-esm/_models/interfaces/error-defaults.interface.js +1 -0
  110. package/build-esm/_models/interfaces/operation-authz-result.interface.js +1 -0
  111. package/build-esm/_models/interfaces/operation-authz.interface.js +1 -0
  112. package/build-esm/_models/interfaces/operation-exposure.interface.js +1 -0
  113. package/build-esm/_models/interfaces/operation-guardrails.interface.js +1 -0
  114. package/build-esm/_models/interfaces/operation-input-settings.interface.js +1 -0
  115. package/build-esm/_models/interfaces/operation-json-schema.interface.js +1 -0
  116. package/build-esm/_models/interfaces/operation-patch-field.interface.js +1 -0
  117. package/build-esm/_models/interfaces/operation-patch-result.interface.js +1 -0
  118. package/build-esm/_models/interfaces/operation-patch-violation.interface.js +1 -0
  119. package/build-esm/_models/interfaces/operation-run-result.interface.js +1 -0
  120. package/build-esm/_models/interfaces/paged.interface.js +1 -0
  121. package/build-esm/_models/interfaces/poll-handle.interface.js +1 -0
  122. package/build-esm/_models/interfaces/random-weight.interface.js +1 -0
  123. package/build-esm/_models/interfaces/route-settings.interface.js +1 -0
  124. package/build-esm/_models/interfaces/search-query.interface.js +1 -0
  125. package/build-esm/_models/interfaces/search-result.interface.js +1 -0
  126. package/build-esm/_models/interfaces/server-error-statistics.interface.js +1 -0
  127. package/build-esm/_models/interfaces/vector2.interface.js +1 -0
  128. package/build-esm/_models/types/db-filter.type.js +1 -0
  129. package/build-esm/_models/types/db-sort.type.js +1 -0
  130. package/build-esm/_models/types/deprecated-boolean-alias.type.js +1 -0
  131. package/build-esm/_models/types/ds-filter.type.js +15 -0
  132. package/build-esm/_models/types/ds-sort.type.js +1 -0
  133. package/build-esm/_modules/ai/_collections/ai-media-provenance.util.js +24 -0
  134. package/build-esm/_modules/ai/_collections/ai-model-ref.util.js +70 -0
  135. package/build-esm/_modules/ai/_collections/ai-model-registry.util.js +37 -0
  136. package/build-esm/_modules/ai/_enums/ai-message-role.enum.js +8 -0
  137. package/build-esm/_modules/ai/_enums/ai-model-type.enum.js +8 -0
  138. package/build-esm/_modules/ai/_enums/ai-provider.enum.js +8 -0
  139. package/build-esm/_modules/ai/_models/ai-call-settings.interface.js +88 -0
  140. package/build-esm/_modules/ai/_models/ai-config.interface.js +1 -0
  141. package/build-esm/_modules/ai/_models/ai-embedding-request.interface.js +1 -0
  142. package/build-esm/_modules/ai/_models/ai-embedding-response.interface.js +1 -0
  143. package/build-esm/_modules/ai/_models/ai-image-request.interface.js +1 -0
  144. package/build-esm/_modules/ai/_models/ai-image-response.interface.js +1 -0
  145. package/build-esm/_modules/ai/_models/ai-llm-request.interface.js +1 -0
  146. package/build-esm/_modules/ai/_models/ai-llm-response.interface.js +1 -0
  147. package/build-esm/_modules/ai/_models/ai-media-file.interface.js +1 -0
  148. package/build-esm/_modules/ai/_models/ai-media-provenance.interface.js +1 -0
  149. package/build-esm/_modules/ai/_models/ai-message.interface.js +1 -0
  150. package/build-esm/_modules/ai/_models/ai-model-capabilities.interface.js +1 -0
  151. package/build-esm/_modules/ai/_models/ai-model-info.interface.js +1 -0
  152. package/build-esm/_modules/ai/_models/ai-model-settings-schema.interface.js +1 -0
  153. package/build-esm/_modules/ai/_models/ai-model3d-request.interface.js +1 -0
  154. package/build-esm/_modules/ai/_models/ai-model3d-response.interface.js +1 -0
  155. package/build-esm/_modules/ai/_models/ai-provider-capabilities.interface.js +1 -0
  156. package/build-esm/_modules/ai/_models/ai-settings.interface.js +10 -0
  157. package/build-esm/_modules/ai/_models/ai-speech-request.interface.js +1 -0
  158. package/build-esm/_modules/ai/_models/ai-speech-response.interface.js +1 -0
  159. package/build-esm/_modules/ai/_models/ai-tool-call.interface.js +1 -0
  160. package/build-esm/_modules/ai/_models/ai-tool-handler.type.js +1 -0
  161. package/build-esm/_modules/ai/_models/ai-tool-result.interface.js +1 -0
  162. package/build-esm/_modules/ai/_models/ai-tool.interface.js +1 -0
  163. package/build-esm/_modules/ai/_models/ai-user-provider-config.control-model.js +31 -0
  164. package/build-esm/_modules/ai/_modules/anthropic/_collections/aai-models.const.js +130 -0
  165. package/build-esm/_modules/ai/_modules/anthropic/_enums/aai-model.enum.js +17 -0
  166. package/build-esm/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.js +23 -0
  167. package/build-esm/_modules/ai/_modules/anthropic/_models/aai-client-options.interface.js +1 -0
  168. package/build-esm/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.js +25 -0
  169. package/build-esm/_modules/ai/_modules/anthropic/_models/aai-user-provider-config.control-model.js +22 -0
  170. package/build-esm/_modules/ai/_modules/anthropic/index.js +9 -0
  171. package/build-esm/_modules/ai/_modules/document-ai/_models/dai-embedding-info.interface.js +1 -0
  172. package/build-esm/_modules/ai/_modules/document-ai/_models/dai-vector-search-params.interface.js +1 -0
  173. package/build-esm/_modules/ai/_modules/document-ai/index.js +3 -0
  174. package/build-esm/_modules/ai/_modules/fdp-ai/_collections/fdpai-models.const.js +38 -0
  175. package/build-esm/_modules/ai/_modules/fdp-ai/_enums/fdpai-model.enum.js +7 -0
  176. package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-call-settings.control-model.js +21 -0
  177. package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-client-options.interface.js +1 -0
  178. package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-settings.control-model.js +24 -0
  179. package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-user-provider-config.control-model.js +22 -0
  180. package/build-esm/_modules/ai/_modules/fdp-ai/index.js +9 -0
  181. package/build-esm/_modules/ai/_modules/google-ai/_collections/gai-models.const.js +155 -0
  182. package/build-esm/_modules/ai/_modules/google-ai/_enums/gai-model.enum.js +14 -0
  183. package/build-esm/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.js +23 -0
  184. package/build-esm/_modules/ai/_modules/google-ai/_models/gai-client-options.interface.js +1 -0
  185. package/build-esm/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.js +25 -0
  186. package/build-esm/_modules/ai/_modules/google-ai/_models/gai-user-provider-config.control-model.js +22 -0
  187. package/build-esm/_modules/ai/_modules/google-ai/index.js +9 -0
  188. package/build-esm/_modules/ai/_modules/local-ai/_collections/lai-models.const.js +57 -0
  189. package/build-esm/_modules/ai/_modules/local-ai/_enums/lai-model.enum.js +5 -0
  190. package/build-esm/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.js +19 -0
  191. package/build-esm/_modules/ai/_modules/local-ai/_models/lai-client-options.interface.js +1 -0
  192. package/build-esm/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.js +22 -0
  193. package/build-esm/_modules/ai/_modules/local-ai/index.js +8 -0
  194. package/build-esm/_modules/ai/_modules/open-ai/_collections/oai-embedding-model-dimensions.const.js +6 -0
  195. package/build-esm/_modules/ai/_modules/open-ai/_collections/oai-models.const.js +455 -0
  196. package/build-esm/_modules/ai/_modules/open-ai/_enums/oai-model.enum.js +146 -0
  197. package/build-esm/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.js +23 -0
  198. package/build-esm/_modules/ai/_modules/open-ai/_models/oai-client-options.interface.js +1 -0
  199. package/build-esm/_modules/ai/_modules/open-ai/_models/oai-embedding-info.interface.js +1 -0
  200. package/build-esm/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.js +25 -0
  201. package/build-esm/_modules/ai/_modules/open-ai/_models/oai-user-provider-config.control-model.js +23 -0
  202. package/build-esm/_modules/ai/_modules/open-ai/index.js +19 -0
  203. package/build-esm/_modules/ai/index.js +34 -0
  204. package/build-esm/_modules/application-alert/_collections/application-alert-envelope.util.js +267 -0
  205. package/build-esm/_modules/application-alert/_enums/application-alert-evaluation-state.type-enum.js +6 -0
  206. package/build-esm/_modules/application-alert/_enums/application-alert-severity.type-enum.js +8 -0
  207. package/build-esm/_modules/application-alert/_models/application-alert.interface.js +1 -0
  208. package/build-esm/_modules/application-alert/index.js +4 -0
  209. package/build-esm/_modules/ci-tools/_enums/cit-ci-result-code.enum.js +9 -0
  210. package/build-esm/_modules/ci-tools/_enums/cit-ci-step-result-code.enum.js +9 -0
  211. package/build-esm/_modules/ci-tools/_models/cit-ci-result-info.data-models.js +63 -0
  212. package/build-esm/_modules/ci-tools/_models/cit-ci-step-result.interface.js +1 -0
  213. package/build-esm/_modules/ci-tools/index.js +6 -0
  214. package/build-esm/_modules/crypto/_collections/crypto-v1.util.js +199 -0
  215. package/build-esm/_modules/crypto/_collections/crypto-v2.util.js +273 -0
  216. package/build-esm/_modules/crypto/_collections/crypto-v4.util.js +605 -0
  217. package/build-esm/_modules/crypto/_collections/crypto.util.js +651 -0
  218. package/build-esm/_modules/crypto/_models/artifact-signature.interface.js +1 -0
  219. package/build-esm/_modules/crypto/_services/artifact-signature.control-service.js +276 -0
  220. package/build-esm/_modules/crypto/index.js +11 -0
  221. package/build-esm/_modules/custom-data/_collections/cud-module-settings.const.js +18 -0
  222. package/build-esm/_modules/custom-data/_models/cud.data-model.js +30 -0
  223. package/build-esm/_modules/custom-data/index.js +4 -0
  224. package/build-esm/_modules/data-handler/_models/data-handler-settings.control-model.js +78 -0
  225. package/build-esm/_modules/data-handler/_models/data-handler.control-model.js +386 -0
  226. package/build-esm/_modules/data-handler/_models/data-list-handler-settings.control-model.js +11 -0
  227. package/build-esm/_modules/data-handler/_models/data-list-handler.control-model.js +222 -0
  228. package/build-esm/_modules/data-handler/_models/data-search-handler-settings.control-model.js +25 -0
  229. package/build-esm/_modules/data-handler/_models/data-search-handler.control-model.js +334 -0
  230. package/build-esm/_modules/data-handler/_models/list-collector-data-handler-settings.control-model.js +12 -0
  231. package/build-esm/_modules/data-handler/_models/list-collector-data-handler.control-model.js +243 -0
  232. package/build-esm/_modules/data-handler/index.js +9 -0
  233. package/build-esm/_modules/deployment/_collections/atomic-rollback-manifest.util.js +348 -0
  234. package/build-esm/_modules/deployment/_models/atomic-rollback-manifest.interface.js +1 -0
  235. package/build-esm/_modules/deployment/index.js +2 -0
  236. package/build-esm/_modules/game/_collections/audio-mixer.util.js +109 -0
  237. package/build-esm/_modules/game/_collections/audio-scale.util.js +100 -0
  238. package/build-esm/_modules/game/_enums/audio-channel.enum.js +21 -0
  239. package/build-esm/_modules/game/_models/audio-mixer-config.interface.js +1 -0
  240. package/build-esm/_modules/game/_models/audio-mixer-settings.interface.js +1 -0
  241. package/build-esm/_modules/game/_models/audio-mixer-state.interface.js +1 -0
  242. package/build-esm/_modules/game/_models/audio-mixer.control-model.js +337 -0
  243. package/build-esm/_modules/game/_models/audio-scale.interface.js +1 -0
  244. package/build-esm/_modules/game/_models/flying-effect.control-model.js +212 -0
  245. package/build-esm/_modules/game/_models/flying-effect.interface.js +1 -0
  246. package/build-esm/_modules/game/_models/seeded-random-registry.control-model.js +124 -0
  247. package/build-esm/_modules/game/_models/seeded-random-registry.interface.js +1 -0
  248. package/build-esm/_modules/game/_models/seeded-random-state.interface.js +1 -0
  249. package/build-esm/_modules/game/_models/seeded-random.control-model.js +261 -0
  250. package/build-esm/_modules/game/index.js +17 -0
  251. package/build-esm/_modules/location/_collections/assets/country-codes-ISO-3166.json +3239 -0
  252. package/build-esm/_modules/location/_collections/assets/country-divisions-ISO-3166-all-list.json +19036 -0
  253. package/build-esm/_modules/location/_collections/assets/country-phone-codes.json +1202 -0
  254. package/build-esm/_modules/location/_collections/loc-country-divisions.const.js +3 -0
  255. package/build-esm/_modules/location/_collections/loc-country-isos.const.js +2 -0
  256. package/build-esm/_modules/location/_collections/loc-regions.util.js +107 -0
  257. package/build-esm/_modules/location/_collections/loc.util.js +56 -0
  258. package/build-esm/_modules/location/_enums/loc-region.enum.js +11 -0
  259. package/build-esm/_modules/location/_enums/loc-sub-region.enum.js +23 -0
  260. package/build-esm/_modules/location/_enums/loc-subdivision-region-type.enum.js +45 -0
  261. package/build-esm/_modules/location/_models/loc-coordinates.interface.js +1 -0
  262. package/build-esm/_modules/location/_models/loc-country-division.interface.js +1 -0
  263. package/build-esm/_modules/location/_models/loc-country-iso.interface.js +1 -0
  264. package/build-esm/_modules/location/_models/loc-country-phone-code.interface.js +1 -0
  265. package/build-esm/_modules/location/_models/loc-division-collection.interface.js +1 -0
  266. package/build-esm/_modules/location/_models/loc-division-region-data.interface.js +1 -0
  267. package/build-esm/_modules/location/_models/loc-geo-ip-location.interface.js +1 -0
  268. package/build-esm/_modules/location/index.js +17 -0
  269. package/build-esm/_modules/messaging/_collections/msg-module-settings.const.js +44 -0
  270. package/build-esm/_modules/messaging/_enums/msg-attachment-type.enum.js +21 -0
  271. package/build-esm/_modules/messaging/_enums/msg-conversation-type.enum.js +17 -0
  272. package/build-esm/_modules/messaging/_enums/msg-delivery-status.enum.js +15 -0
  273. package/build-esm/_modules/messaging/_enums/msg-event-key.enum.js +28 -0
  274. package/build-esm/_modules/messaging/_enums/msg-participant-role.enum.js +17 -0
  275. package/build-esm/_modules/messaging/_enums/msg-provider-type.enum.js +8 -0
  276. package/build-esm/_modules/messaging/_enums/msg-status.enum.js +21 -0
  277. package/build-esm/_modules/messaging/_enums/msg-type.enum.js +19 -0
  278. package/build-esm/_modules/messaging/_models/msg-attachment.interface.js +1 -0
  279. package/build-esm/_modules/messaging/_models/msg-conversation.data-model.js +80 -0
  280. package/build-esm/_modules/messaging/_models/msg-mention.interface.js +1 -0
  281. package/build-esm/_modules/messaging/_models/msg-message.data-model.js +102 -0
  282. package/build-esm/_modules/messaging/_models/msg-participant.interface.js +1 -0
  283. package/build-esm/_modules/messaging/_models/msg-reaction.interface.js +1 -0
  284. package/build-esm/_modules/messaging/_models/msg-thread-info.interface.js +1 -0
  285. package/build-esm/_modules/messaging/_modules/agent/_enums/agt-process-step-type.enum.js +27 -0
  286. package/build-esm/_modules/messaging/_modules/agent/_enums/agt-tool-status.enum.js +19 -0
  287. package/build-esm/_modules/messaging/_modules/agent/_models/agt-process-step.interface.js +1 -0
  288. package/build-esm/_modules/messaging/_modules/agent/_models/agt-reasoning-info.interface.js +1 -0
  289. package/build-esm/_modules/messaging/_modules/agent/_models/agt-tool-usage.interface.js +1 -0
  290. package/build-esm/_modules/messaging/_modules/agent/index.js +7 -0
  291. package/build-esm/_modules/messaging/index.js +25 -0
  292. package/build-esm/_modules/ngx-models/_collections/angular-placeholders.js +1 -0
  293. package/build-esm/_modules/ngx-models/_collections/button-new-style-settings-presets.const.js +170 -0
  294. package/build-esm/_modules/ngx-models/_collections/dynamo-global.settings.js +88 -0
  295. package/build-esm/_modules/ngx-models/_enums/button-new/button-new-border-radius.enum.js +14 -0
  296. package/build-esm/_modules/ngx-models/_enums/button-new/button-new-icon-style-type.enum.js +12 -0
  297. package/build-esm/_modules/ngx-models/_enums/button-new/button-new-size.enum.js +15 -0
  298. package/build-esm/_modules/ngx-models/_enums/button-new/button-new-style-type.enum.js +17 -0
  299. package/build-esm/_modules/ngx-models/_enums/button-type.enum.js +35 -0
  300. package/build-esm/_modules/ngx-models/_enums/checkbox-label-position.enum.js +8 -0
  301. package/build-esm/_modules/ngx-models/_enums/container-type.enum.js +11 -0
  302. package/build-esm/_modules/ngx-models/_enums/errors/error-level.enum.js +14 -0
  303. package/build-esm/_modules/ngx-models/_enums/errors/error-notification-color.enum.js +14 -0
  304. package/build-esm/_modules/ngx-models/_enums/errors/error-ui-mode.enum.js +14 -0
  305. package/build-esm/_modules/ngx-models/_enums/field-appearance.enum.js +13 -0
  306. package/build-esm/_modules/ngx-models/_enums/field-type.enum.js +49 -0
  307. package/build-esm/_modules/ngx-models/_enums/file-type.enum.js +12 -0
  308. package/build-esm/_modules/ngx-models/_enums/flex/flex-layout-align.enum.js +21 -0
  309. package/build-esm/_modules/ngx-models/_enums/flex/flex-layout.enum.js +6 -0
  310. package/build-esm/_modules/ngx-models/_enums/form-access.enum.js +9 -0
  311. package/build-esm/_modules/ngx-models/_enums/form-reset-data.enum.js +12 -0
  312. package/build-esm/_modules/ngx-models/_enums/form-store-on.enum.js +8 -0
  313. package/build-esm/_modules/ngx-models/_enums/forms-new/field-new-validator-type.enum.js +21 -0
  314. package/build-esm/_modules/ngx-models/_enums/frames/header-item-type.enum.js +16 -0
  315. package/build-esm/_modules/ngx-models/_enums/frames/header-position.enum.js +11 -0
  316. package/build-esm/_modules/ngx-models/_enums/frames/side-nav-badge-color.enum.js +14 -0
  317. package/build-esm/_modules/ngx-models/_enums/html/input-types.enum.js +26 -0
  318. package/build-esm/_modules/ngx-models/_enums/material-color.enum.js +14 -0
  319. package/build-esm/_modules/ngx-models/_enums/material-tooltip-position.enum.js +13 -0
  320. package/build-esm/_modules/ngx-models/_enums/preconfigured-field-type.enum.js +8 -0
  321. package/build-esm/_modules/ngx-models/_enums/storage-type.enum.js +13 -0
  322. package/build-esm/_modules/ngx-models/_enums/validator-type.enum.js +7 -0
  323. package/build-esm/_modules/ngx-models/_enums/voice/audio-mime-type.enum.js +15 -0
  324. package/build-esm/_modules/ngx-models/_enums/voice/voice-provider-type.enum.js +32 -0
  325. package/build-esm/_modules/ngx-models/_enums/voice/voice-recorder-state.enum.js +21 -0
  326. package/build-esm/_modules/ngx-models/_models/control-models/button-new-style-settings.control-model.js +44 -0
  327. package/build-esm/_modules/ngx-models/_models/control-models/button-params.control-model.js +304 -0
  328. package/build-esm/_modules/ngx-models/_models/control-models/chat/chat-column-layout-settings.control-model.js +59 -0
  329. package/build-esm/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js +94 -0
  330. package/build-esm/_modules/ngx-models/_models/control-models/data-handler.control-model.js +407 -0
  331. package/build-esm/_modules/ngx-models/_models/control-models/errors/error-notification.control-model.js +43 -0
  332. package/build-esm/_modules/ngx-models/_models/control-models/errors/error-settings.control-model.js +64 -0
  333. package/build-esm/_modules/ngx-models/_models/control-models/errors/errors-settings.control-model.js +52 -0
  334. package/build-esm/_modules/ngx-models/_models/control-models/field-settings.control-model.js +207 -0
  335. package/build-esm/_modules/ngx-models/_models/control-models/form-settings.control-model.js +275 -0
  336. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/checkbox-field-new-settings.control-model.js +29 -0
  337. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/color-picker-field-new-settings.control-model.js +36 -0
  338. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/date-field-new-settings.control-model.js +31 -0
  339. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/date-range-field-new-settings.control-model.js +46 -0
  340. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/datetime-field-new-settings.control-model.js +38 -0
  341. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/datetime-range-field-new-settings.control-model.js +48 -0
  342. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/emoji-picker-field-new-settings.control-model.js +21 -0
  343. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/field-new-settings.control-model.js +91 -0
  344. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/field-new-types.js +1 -0
  345. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/form-new-settings.control-model.js +39 -0
  346. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/icon-picker-field-new-settings.control-model.js +39 -0
  347. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/index.js +23 -0
  348. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/multiselect-field-new-settings.control-model.js +31 -0
  349. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/number-field-new-settings.control-model.js +29 -0
  350. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/password-field-new-settings.control-model.js +51 -0
  351. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/picker-field-new-option.interface.js +1 -0
  352. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/radio-select-field-new-settings.control-model.js +38 -0
  353. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/select-field-new-settings.control-model.js +35 -0
  354. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/slider-field-new-settings.control-model.js +50 -0
  355. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/slider-range-field-new-settings.control-model.js +47 -0
  356. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/text-field-new-settings.control-model.js +35 -0
  357. package/build-esm/_modules/ngx-models/_models/control-models/forms-new/textarea-field-new-settings.control-model.js +27 -0
  358. package/build-esm/_modules/ngx-models/_models/control-models/frames/header-item-settings.control-model.js +44 -0
  359. package/build-esm/_modules/ngx-models/_models/control-models/frames/main-frame-settings.control-model.js +56 -0
  360. package/build-esm/_modules/ngx-models/_models/control-models/frames/side-nav-item-settings.control-model.js +58 -0
  361. package/build-esm/_modules/ngx-models/_models/control-models/frames/side-nav-settings.control-model.js +38 -0
  362. package/build-esm/_modules/ngx-models/_models/control-models/select.control-model.js +27 -0
  363. package/build-esm/_modules/ngx-models/_models/control-models/signal-data-list-handler-settings.control-model.js +23 -0
  364. package/build-esm/_modules/ngx-models/_models/control-models/signal-data-search-handler-settings.control-model.js +25 -0
  365. package/build-esm/_modules/ngx-models/_models/control-models/signal-list-collector-data-handler-settings.control-model.js +12 -0
  366. package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-providers-settings.control-model.js +22 -0
  367. package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-record-button-settings.control-model.js +91 -0
  368. package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-recorder-settings.control-model.js +42 -0
  369. package/build-esm/_modules/ngx-models/_models/interfaces/button-new-settings.interface.js +1 -0
  370. package/build-esm/_modules/ngx-models/_models/interfaces/confirm-settings.interface.js +1 -0
  371. package/build-esm/_modules/ngx-models/_models/interfaces/global-settings.interface.js +1 -0
  372. package/build-esm/_modules/ngx-models/_models/interfaces/select-options-custom-constructor.interface.js +1 -0
  373. package/build-esm/_modules/ngx-models/_models/interfaces/storage.service.js +40 -0
  374. package/build-esm/_modules/ngx-models/_models/interfaces/voice/speak-options.interface.js +1 -0
  375. package/build-esm/_modules/ngx-models/_models/interfaces/voice/speak-result.interface.js +1 -0
  376. package/build-esm/_modules/ngx-models/_models/interfaces/voice/transcribe-options.interface.js +1 -0
  377. package/build-esm/_modules/ngx-models/_models/interfaces/voice/transcribe-result.interface.js +1 -0
  378. package/build-esm/_modules/ngx-models/_models/interfaces/voice/voice-profile.interface.js +1 -0
  379. package/build-esm/_modules/ngx-models/_models/interfaces/voice/voice-provider-init.interface.js +1 -0
  380. package/build-esm/_modules/ngx-models/_utils/shared.service.js +407 -0
  381. package/build-esm/_modules/ngx-models/index.js +89 -0
  382. package/build-esm/_modules/operation-control/_collections/operation-lease.util.js +323 -0
  383. package/build-esm/_modules/operation-control/_enums/operation-decision-code.type-enum.js +22 -0
  384. package/build-esm/_modules/operation-control/_enums/operation-state.type-enum.js +9 -0
  385. package/build-esm/_modules/operation-control/_models/operation-lease.interface.js +1 -0
  386. package/build-esm/_modules/operation-control/index.js +4 -0
  387. package/build-esm/_modules/pipe/_collections/pip-transforms.const.js +32 -0
  388. package/build-esm/_modules/pipe/_collections/utils/pip-country-pipe.util.js +29 -0
  389. package/build-esm/_modules/pipe/_collections/utils/pip-custom-pipe.util.js +22 -0
  390. package/build-esm/_modules/pipe/_collections/utils/pip-division-pipe.util.js +21 -0
  391. package/build-esm/_modules/pipe/_collections/utils/pip-json-pipe.util.js +18 -0
  392. package/build-esm/_modules/pipe/_collections/utils/pip-list-pipe.util.js +19 -0
  393. package/build-esm/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.js +164 -0
  394. package/build-esm/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.js +16 -0
  395. package/build-esm/_modules/pipe/_collections/utils/pip-range-pipe.util.js +64 -0
  396. package/build-esm/_modules/pipe/_collections/utils/pip-region-pipe.util.js +22 -0
  397. package/build-esm/_modules/pipe/_collections/utils/pip-replace-pipe.util.js +15 -0
  398. package/build-esm/_modules/pipe/_collections/utils/pip-slider-pipe.util.js +26 -0
  399. package/build-esm/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.js +40 -0
  400. package/build-esm/_modules/pipe/_enums/pip-range-pipe-setting.enum.js +14 -0
  401. package/build-esm/_modules/pipe/_enums/pip.enum.js +48 -0
  402. package/build-esm/_modules/pipe/_models/pip-multi-pipe-settings.type.js +1 -0
  403. package/build-esm/_modules/pipe/_models/pip-transforms.interface.js +1 -0
  404. package/build-esm/_modules/pipe/index.js +22 -0
  405. package/build-esm/_modules/request-safety/_collections/request-safety-inspector.util.js +317 -0
  406. package/build-esm/_modules/request-safety/_enums/request-safety-finding.type-enum.js +39 -0
  407. package/build-esm/_modules/request-safety/_models/request-safety.interface.js +1 -0
  408. package/build-esm/_modules/request-safety/index.js +3 -0
  409. package/build-esm/_modules/sandbox-runtime/_collections/zero-egress-receipt.util.js +154 -0
  410. package/build-esm/_modules/sandbox-runtime/_collections/zero-egress-result-code.const.js +36 -0
  411. package/build-esm/_modules/sandbox-runtime/_enums/zero-egress-outcome.type-enum.js +11 -0
  412. package/build-esm/_modules/sandbox-runtime/_models/zero-egress-receipt.interface.js +1 -0
  413. package/build-esm/_modules/sandbox-runtime/index.js +4 -0
  414. package/build-esm/_modules/security/_collections/stored-secret.util.js +68 -0
  415. package/build-esm/_modules/security/_models/stored-secret.control-model.js +52 -0
  416. package/build-esm/_modules/security/index.js +7 -0
  417. package/build-esm/_modules/socket/_enums/sck-event-key.enum.js +18 -0
  418. package/build-esm/_modules/socket/_models/sck-client-params.control-model.js +47 -0
  419. package/build-esm/_modules/socket/_models/sck-socket-event.control-model.js +133 -0
  420. package/build-esm/_modules/socket/_services/sck-client.service-base.js +314 -0
  421. package/build-esm/_modules/socket/index.js +7 -0
  422. package/build-esm/_modules/state-machine/_models/state-machine-config.interface.js +1 -0
  423. package/build-esm/_modules/state-machine/_models/state-machine-event.interface.js +1 -0
  424. package/build-esm/_modules/state-machine/_models/state-machine.control-model.js +262 -0
  425. package/build-esm/_modules/state-machine/_models/state-transition-result.interface.js +1 -0
  426. package/build-esm/_modules/state-machine/_models/state-transition.interface.js +1 -0
  427. package/build-esm/_modules/state-machine/index.js +6 -0
  428. package/build-esm/_modules/test/_collections/tst-module-settings.const.js +38 -0
  429. package/build-esm/_modules/test/index.js +2 -0
  430. package/build-esm/_modules/usage/_collections/usg-module-settings.const.js +16 -0
  431. package/build-esm/_modules/usage/_models/usg-action.control-model.js +25 -0
  432. package/build-esm/_modules/usage/_models/usg-daily-usage-data.control-model.js +30 -0
  433. package/build-esm/_modules/usage/_models/usg-data.control-model.js +30 -0
  434. package/build-esm/_modules/usage/_models/usg-session.data-model.js +60 -0
  435. package/build-esm/_modules/usage/index.js +7 -0
  436. package/build-esm/index.js +108 -0
  437. package/package.json +85 -84
@@ -0,0 +1,337 @@
1
+ import { DyFM_Error } from '../../../_models/control-models/error.control-model';
2
+ import { DyFM_AudioScale_Util } from '../_collections/audio-scale.util';
3
+ /**
4
+ * **Csatorna- es skala-agnosztikus** jatek-audio mixer: a projekt deklaralja a sajat
5
+ * csatornait es szamabrazolasat, a modell pedig kezeli az allapotot es kiszamolja az
6
+ * effektiv hangerot.
7
+ *
8
+ * **Miert letezik a `DyFM_AudioMixer_Util` (round-1) mellett:** az a util negy FIX csatornara
9
+ * (`music` / `ambience` / `effects`) es `0..1` skalara epul. Ez a Prototyper harom prototipusara
10
+ * igaz, de a **Hero Coordinator** csatornai `music` / `dialog` / `interface`, az ertekei pedig
11
+ * `0-100` egeszek. A fix alak ott csatorna-vesztessel es kotelezo adat-migracioval jarna.
12
+ * Ez a modell mindkettot kiszolgalja; a round-1 alak `createClassic()` presetkent tovabb el.
13
+ *
14
+ * **Rendereles-agnosztikus:** NINCS DOM, Web Audio, Angular vagy Node fuggese. A tenyleges
15
+ * lejatszas (HTMLAudioElement, Web Audio `GainNode`, vagy barmi mas) a fogyasztoe — ez a
16
+ * **modell + szamitas**.
17
+ *
18
+ * **Hasznalat (Hero Coordinator-stilus, 0-100 egesz):**
19
+ * ```typescript
20
+ * const mixer = DyFM_AudioMixer_ControlModel.createPercent(['music', 'dialog', 'interface'], {
21
+ * music: 36, dialog: 84, interface: 68,
22
+ * }, 72);
23
+ *
24
+ * let state = mixer.merge(JSON.parse(localStorage.getItem('audio') ?? 'null'));
25
+ * gainNode.gain.value = mixer.getEffectiveVolume(state, 'interface'); // MINDIG 0..1
26
+ *
27
+ * state = mixer.withChannelVolume(state, 'music', 40); // a sajat skalajan adjuk meg
28
+ * localStorage.setItem('audio', JSON.stringify(state));
29
+ * ```
30
+ *
31
+ * **Hasznalat (Prototyper-stilus, 0..1):**
32
+ * ```typescript
33
+ * const mixer = DyFM_AudioMixer_ControlModel.createClassic();
34
+ * const state = DyFM_AudioMixer_ControlModel.fromClassicSettings(legacySettings);
35
+ * ```
36
+ */
37
+ export class DyFM_AudioMixer_ControlModel {
38
+ /** A `master` fenntartott nev — nem lehet sima csatorna, mert minden csatornara szorzodik. */
39
+ static masterChannel = 'master';
40
+ /** A validalt, sajat peldany-config (a hivo altal atadott objektumtol fuggetlen masolat). */
41
+ config;
42
+ /**
43
+ * A config validalasa **konstruktor-idoben** tortenik: egy elgepelt csatorna-nev vagy hianyzo
44
+ * skala igy a jatek inditasakor derul ki, nem hangleajatszas kozben.
45
+ */
46
+ constructor(config) {
47
+ if (!config || !Array.isArray(config.channels) || !config.channels.length) {
48
+ throw new DyFM_Error({
49
+ errorCode: 'DYFM-AUDIO-MIXER-001',
50
+ message: 'DyFM_AudioMixer_ControlModel: config.channels must be a non-empty string array',
51
+ additionalContent: { config: config },
52
+ });
53
+ }
54
+ const seen = [];
55
+ for (const channel of config.channels) {
56
+ if (typeof channel !== 'string' || !channel.length) {
57
+ throw new DyFM_Error({
58
+ errorCode: 'DYFM-AUDIO-MIXER-002',
59
+ message: 'DyFM_AudioMixer_ControlModel: every channel name must be a non-empty string',
60
+ additionalContent: { channels: config.channels },
61
+ });
62
+ }
63
+ if (channel === DyFM_AudioMixer_ControlModel.masterChannel) {
64
+ throw new DyFM_Error({
65
+ errorCode: 'DYFM-AUDIO-MIXER-003',
66
+ message: 'DyFM_AudioMixer_ControlModel: "master" is reserved and must not be listed in channels',
67
+ additionalContent: { channels: config.channels },
68
+ });
69
+ }
70
+ if (seen.includes(channel)) {
71
+ throw new DyFM_Error({
72
+ errorCode: 'DYFM-AUDIO-MIXER-004',
73
+ message: 'DyFM_AudioMixer_ControlModel: duplicate channel name',
74
+ additionalContent: { channel: channel, channels: config.channels },
75
+ });
76
+ }
77
+ seen.push(channel);
78
+ }
79
+ const scale = config.scale && typeof config.scale.max === 'number'
80
+ ? { max: config.scale.max, integer: config.scale.integer === true }
81
+ : DyFM_AudioScale_Util.getUnitScale();
82
+ this.config = {
83
+ channels: [...config.channels],
84
+ scale: scale,
85
+ defaults: config.defaults ? { ...config.defaults } : {},
86
+ defaultMaster: config.defaultMaster,
87
+ defaultChannelVolume: config.defaultChannelVolume,
88
+ defaultPlayWhenUnfocused: config.defaultPlayWhenUnfocused === true,
89
+ };
90
+ }
91
+ /**
92
+ * A round-1 `DyFM_AudioMixer_Settings` alakjaval egyenerteku mixer (`music` / `ambience` /
93
+ * `effects`, `0..1` skala, 0.8 default). A Prototyper-stilusu fogyasztoknak.
94
+ */
95
+ static createClassic() {
96
+ return new DyFM_AudioMixer_ControlModel({
97
+ channels: ['music', 'ambience', 'effects'],
98
+ scale: DyFM_AudioScale_Util.getUnitScale(),
99
+ defaultMaster: DyFM_AudioScale_Util.defaultRatio,
100
+ defaultChannelVolume: DyFM_AudioScale_Util.defaultRatio,
101
+ });
102
+ }
103
+ /**
104
+ * `0-100` egesz skalaju mixer tetszoleges csatorna-keszlettel — a Hero Coordinator-stilusu
105
+ * fogyasztoknak, akik igy **adat-migracio nelkul** vehetik hasznalatba a bedrock modellt.
106
+ */
107
+ static createPercent(channels, defaults, defaultMaster) {
108
+ return new DyFM_AudioMixer_ControlModel({
109
+ channels: channels,
110
+ scale: DyFM_AudioScale_Util.getPercentScale(),
111
+ defaults: defaults,
112
+ defaultMaster: defaultMaster,
113
+ });
114
+ }
115
+ /** A round-1 fix alakot atalakitja a nyitott allapot-alakra (migracios hid). */
116
+ static fromClassicSettings(settings) {
117
+ const safe = settings ?? {};
118
+ const scale = DyFM_AudioScale_Util.getUnitScale();
119
+ return {
120
+ master: DyFM_AudioScale_Util.toUnit(safe.master, scale),
121
+ channels: {
122
+ music: DyFM_AudioScale_Util.toUnit(safe.music, scale),
123
+ ambience: DyFM_AudioScale_Util.toUnit(safe.ambience, scale),
124
+ effects: DyFM_AudioScale_Util.toUnit(safe.effects, scale),
125
+ },
126
+ muted: safe.muted === true,
127
+ // Statikus metodus -> nincs peldany-config, ezert a GLOBALIS default (`false`) ervenyes.
128
+ playWhenUnfocused: safe.playWhenUnfocused === true,
129
+ };
130
+ }
131
+ /**
132
+ * A nyitott allapot-alakot visszaalakitja a round-1 fix alakra (migracios hid visszafele).
133
+ *
134
+ * **Peldany-metodus**, mert a helyes konverziohoz ismerni kell a peldany skalajat: egy
135
+ * `0-100`-as allapotot igy is `0..1`-re normalizal, ahogy a round-1 alak varja. (Statikus
136
+ * valtozatban ez nemaan rossz erteket adna.)
137
+ *
138
+ * A klasszikus keszleten kivuli csatornak (pl. `dialog`) **elvesznek** — ez a round-1 alak
139
+ * korlatja, nem a konverzioe.
140
+ */
141
+ toClassicSettings(state) {
142
+ const safe = this.merge(state);
143
+ const scale = this.config.scale;
144
+ const classic = {
145
+ master: DyFM_AudioScale_Util.toUnit(safe.master, scale),
146
+ music: DyFM_AudioScale_Util.toUnit(safe.channels['music'], scale),
147
+ ambience: DyFM_AudioScale_Util.toUnit(safe.channels['ambience'], scale),
148
+ effects: DyFM_AudioScale_Util.toUnit(safe.channels['effects'], scale),
149
+ muted: safe.muted === true,
150
+ };
151
+ // A kapcsolot CSAK bekapcsolt allapotban irjuk ki. Igy a round-1 alakot mar hasznalo
152
+ // projektek payloadja valtozatlan marad (nem jelenik meg benne egy uj `false` mezo),
153
+ // a bekapcsolt allapot viszont tulel egy oda-vissza konverziot.
154
+ if (safe.playWhenUnfocused) {
155
+ classic.playWhenUnfocused = true;
156
+ }
157
+ return classic;
158
+ }
159
+ /** A peldany configja (masolat — a mutalasa nem hat vissza a modellre). */
160
+ getConfig() {
161
+ return {
162
+ channels: [...this.config.channels],
163
+ scale: { max: this.config.scale.max, integer: this.config.scale.integer },
164
+ defaults: { ...this.config.defaults },
165
+ defaultMaster: this.config.defaultMaster,
166
+ defaultChannelVolume: this.config.defaultChannelVolume,
167
+ };
168
+ }
169
+ /** A deklaralt csatorna-nevek (a `master` nelkul). */
170
+ getChannels() {
171
+ return [...this.config.channels];
172
+ }
173
+ /** Igaz, ha a nev a deklaralt csatornak kozott van (a `master` NEM az). */
174
+ hasChannel(channel) {
175
+ return this.config.channels.includes(channel);
176
+ }
177
+ /**
178
+ * Alapertelmezett allapot a **sajat skalan**. Minden hivas UJ objektumot ad vissza, hogy a
179
+ * hivo szabadon mutalhassa.
180
+ */
181
+ getDefaults() {
182
+ const channels = {};
183
+ for (const channel of this.config.channels) {
184
+ channels[channel] = this.getDefaultChannelVolume(channel);
185
+ }
186
+ return {
187
+ master: this.getDefaultMaster(),
188
+ channels: channels,
189
+ muted: false,
190
+ playWhenUnfocused: this.config.defaultPlayWhenUnfocused === true,
191
+ };
192
+ }
193
+ /**
194
+ * Reszleges / hianyzo / serult allapotbol teljes, ervenyes allapotot allit elo: a hianyzo
195
+ * csatornak a defaultot kapjak, az ertekek a sajat skalara szorulnak.
196
+ *
197
+ * **Ez a migracios biztositek:** egy regi payload, ami meg nem ismert egy kesobb bevezetett
198
+ * csatornat, igy is betoltheto marad. A **nem deklaralt** csatornak kiesnek — igy egy
199
+ * eltavolitott csatorna nem szivarog vissza a mentesbol. Serult (NaN / nem-szam) ertek eseten
200
+ * a csatorna DEFAULT-jat kapja, nem 0-t — egy hibas mentes ne nemitson el csendben.
201
+ *
202
+ * **Figyelem:** ez a nyitott (`channels` rekord) alakot varja. A round-1 LAPOS alakot
203
+ * (`{ master, music, ambience, effects, muted }`) eloszor a `fromClassicSettings()`-szel
204
+ * kell atalakitani — kulonben a csatornak a defaultot kapjak.
205
+ */
206
+ merge(partial) {
207
+ const defaults = this.getDefaults();
208
+ if (!partial) {
209
+ return defaults;
210
+ }
211
+ const source = partial.channels ?? {};
212
+ const channels = {};
213
+ for (const channel of this.config.channels) {
214
+ const raw = source[channel];
215
+ channels[channel] = raw === undefined || raw === null
216
+ ? defaults.channels[channel]
217
+ : DyFM_AudioScale_Util.clampToScale(raw, this.config.scale, defaults.channels[channel]);
218
+ }
219
+ const master = partial.master === undefined || partial.master === null
220
+ ? defaults.master
221
+ : DyFM_AudioScale_Util.clampToScale(partial.master, this.config.scale, defaults.master);
222
+ // A hianyzo `playWhenUnfocused` a CONFIG alapertelmezeset kapja, NEM vakon `false`-t:
223
+ // igy egy regi (mezo nelkuli) mentes betoltese nem irja felul a jatek sajat dontetet.
224
+ const playWhenUnfocused = partial.playWhenUnfocused === undefined || partial.playWhenUnfocused === null
225
+ ? defaults.playWhenUnfocused
226
+ : partial.playWhenUnfocused === true;
227
+ return {
228
+ master: master,
229
+ channels: channels,
230
+ muted: partial.muted === true,
231
+ playWhenUnfocused: playWhenUnfocused,
232
+ };
233
+ }
234
+ /**
235
+ * Egy csatorna **effektiv** hangereje `0..1`-ben — ezt varja a `HTMLAudioElement.volume` es a
236
+ * Web Audio `GainNode.gain.value`, fuggetlenul attol, milyen skalan tarol a projekt.
237
+ *
238
+ * A csatorna sajat erteke szorozva a master-rel; nemitas eseten mindig 0. A `'master'` nevre
239
+ * a master sajat (normalizalt) erteket adja vissza, nem negyzetre emelve.
240
+ *
241
+ * **Dob**, ha a csatorna nincs deklaralva — egy elgepelt csatorna-nev igy nem nemul el
242
+ * csendben, hanem azonnal kiderul (`core-rich-error-handling`).
243
+ */
244
+ getEffectiveVolume(state, channel) {
245
+ if (channel !== DyFM_AudioMixer_ControlModel.masterChannel && !this.hasChannel(channel)) {
246
+ throw new DyFM_Error({
247
+ errorCode: 'DYFM-AUDIO-MIXER-005',
248
+ message: 'DyFM_AudioMixer_ControlModel.getEffectiveVolume: unknown channel',
249
+ additionalContent: { channel: channel, declaredChannels: this.config.channels },
250
+ });
251
+ }
252
+ const safe = this.merge(state);
253
+ if (safe.muted) {
254
+ return 0;
255
+ }
256
+ const masterUnit = DyFM_AudioScale_Util.toUnit(safe.master, this.config.scale);
257
+ if (channel === DyFM_AudioMixer_ControlModel.masterChannel) {
258
+ return masterUnit;
259
+ }
260
+ const channelUnit = DyFM_AudioScale_Util.toUnit(safe.channels[channel], this.config.scale);
261
+ return DyFM_AudioScale_Util.clampUnit(channelUnit * masterUnit);
262
+ }
263
+ /**
264
+ * Egy csatorna hangerejenek beallitasa a **sajat skalan** — UJ allapot-objektumot ad vissza
265
+ * (immutable update), hogy signal-/state-alapu tarolokban is biztonsagos legyen.
266
+ */
267
+ withChannelVolume(state, channel, volume) {
268
+ if (!this.hasChannel(channel)) {
269
+ throw new DyFM_Error({
270
+ errorCode: 'DYFM-AUDIO-MIXER-006',
271
+ message: 'DyFM_AudioMixer_ControlModel.withChannelVolume: unknown channel',
272
+ additionalContent: { channel: channel, declaredChannels: this.config.channels },
273
+ });
274
+ }
275
+ const next = this.merge(state);
276
+ next.channels[channel] = DyFM_AudioScale_Util.clampToScale(volume, this.config.scale);
277
+ return next;
278
+ }
279
+ /** A master beallitasa a **sajat skalan** — UJ allapot-objektumot ad vissza. */
280
+ withMasterVolume(state, volume) {
281
+ const next = this.merge(state);
282
+ next.master = DyFM_AudioScale_Util.clampToScale(volume, this.config.scale);
283
+ return next;
284
+ }
285
+ /** Nemitas beallitasa — UJ allapot-objektumot ad vissza. */
286
+ withMuted(state, muted) {
287
+ const next = this.merge(state);
288
+ next.muted = muted === true;
289
+ return next;
290
+ }
291
+ /**
292
+ * A "szoljon-e hattervben" kapcsolo beallitasa — UJ allapot-objektumot ad vissza.
293
+ *
294
+ * A modell csak a SZANDEKOT tarolja; a tenyleges szuneteltetes a lejatszo-reteg dolga
295
+ * (`visibilitychange` / `blur`), mert ez a reteg DOM-fuggetlen.
296
+ */
297
+ withPlayWhenUnfocused(state, playWhenUnfocused) {
298
+ const next = this.merge(state);
299
+ next.playWhenUnfocused = playWhenUnfocused === true;
300
+ return next;
301
+ }
302
+ /** Ket allapot ertek szerinti egyezese (mentes-szukseg / change-detection dontesehez). */
303
+ isEqual(a, b) {
304
+ const left = this.merge(a);
305
+ const right = this.merge(b);
306
+ if (left.master !== right.master
307
+ || left.muted !== right.muted
308
+ || left.playWhenUnfocused !== right.playWhenUnfocused) {
309
+ return false;
310
+ }
311
+ for (const channel of this.config.channels) {
312
+ if (left.channels[channel] !== right.channels[channel]) {
313
+ return false;
314
+ }
315
+ }
316
+ return true;
317
+ }
318
+ /** A master alapertelmezese a sajat skalan (config, kulonben a maximum 80%-a). */
319
+ getDefaultMaster() {
320
+ if (typeof this.config.defaultMaster === 'number' && !Number.isNaN(this.config.defaultMaster)) {
321
+ return DyFM_AudioScale_Util.clampToScale(this.config.defaultMaster, this.config.scale);
322
+ }
323
+ return DyFM_AudioScale_Util.fromUnit(DyFM_AudioScale_Util.defaultRatio, this.config.scale);
324
+ }
325
+ /** Egy csatorna alapertelmezese a sajat skalan (per-csatorna, kulonben kozos, kulonben 80%). */
326
+ getDefaultChannelVolume(channel) {
327
+ const perChannel = (this.config.defaults ?? {})[channel];
328
+ if (typeof perChannel === 'number' && !Number.isNaN(perChannel)) {
329
+ return DyFM_AudioScale_Util.clampToScale(perChannel, this.config.scale);
330
+ }
331
+ if (typeof this.config.defaultChannelVolume === 'number'
332
+ && !Number.isNaN(this.config.defaultChannelVolume)) {
333
+ return DyFM_AudioScale_Util.clampToScale(this.config.defaultChannelVolume, this.config.scale);
334
+ }
335
+ return DyFM_AudioScale_Util.fromUnit(DyFM_AudioScale_Util.defaultRatio, this.config.scale);
336
+ }
337
+ }
@@ -0,0 +1,212 @@
1
+ import { DyFM_Error } from '../../../_models/control-models/error.control-model';
2
+ /** Deterministic, renderer-independent lifecycle for short-lived game presentation effects. */
3
+ export class DyFM_FlyingEffect_ControlModel {
4
+ maxItems;
5
+ defaultDurationMs;
6
+ defaultRisePx;
7
+ defaultStackGapPx;
8
+ items = [];
9
+ sequence = 0;
10
+ paused = false;
11
+ pauseStartedAtMs = null;
12
+ lastTimeMs = null;
13
+ spawnedCount = 0;
14
+ mergedCount = 0;
15
+ expiredCount = 0;
16
+ evictedCount = 0;
17
+ highWatermark = 0;
18
+ constructor(config = {}) {
19
+ this.maxItems = this.positiveInteger(config.maxItems ?? 100, 'maxItems', 'DYFM-FLYING-EFFECT-001');
20
+ this.defaultDurationMs = this.positive(config.defaultDurationMs ?? 1_400, 'defaultDurationMs');
21
+ this.defaultRisePx = this.nonNegative(config.defaultRisePx ?? 52, 'defaultRisePx');
22
+ this.defaultStackGapPx = this.nonNegative(config.defaultStackGapPx ?? 18, 'defaultStackGapPx');
23
+ }
24
+ spawn(command, nowMs) {
25
+ this.validateCommand(command);
26
+ const durationMs = this.positive(command.durationMs ?? this.defaultDurationMs, 'durationMs');
27
+ const risePx = this.nonNegative(command.risePx ?? this.defaultRisePx, 'risePx');
28
+ const stackGapPx = this.nonNegative(command.stackGapPx ?? this.defaultStackGapPx, 'stackGapPx');
29
+ const mergeKey = this.optionalKey(command.mergeKey, 'mergeKey');
30
+ const stackKey = this.resolveStackKey(command);
31
+ this.assertMonotonicTime(nowMs);
32
+ this.advanceTo(nowMs);
33
+ const effectiveNow = this.paused ? this.pauseStartedAtMs : nowMs;
34
+ const existing = mergeKey
35
+ ? this.items.find((item) => item.mergeKey === mergeKey)
36
+ : undefined;
37
+ if (existing) {
38
+ existing.text = command.text;
39
+ existing.anchor = { ...command.anchor };
40
+ existing.style = { ...(command.style ?? {}) };
41
+ existing.createdAtMs = effectiveNow;
42
+ existing.expiresAtMs = effectiveNow + durationMs;
43
+ existing.durationMs = durationMs;
44
+ existing.risePx = risePx;
45
+ existing.stackGapPx = stackGapPx;
46
+ existing.stackKey = stackKey;
47
+ this.mergedCount += 1;
48
+ return this.getSnapshots().find((item) => item.id === existing.id);
49
+ }
50
+ if (this.items.length >= this.maxItems) {
51
+ this.items.sort((a, b) => a.sequence - b.sequence);
52
+ this.items.shift();
53
+ this.evictedCount += 1;
54
+ }
55
+ const effect = {
56
+ id: `dyfm-fx-${++this.sequence}`,
57
+ sequence: this.sequence,
58
+ text: command.text,
59
+ anchor: { ...command.anchor },
60
+ style: { ...(command.style ?? {}) },
61
+ createdAtMs: effectiveNow,
62
+ expiresAtMs: effectiveNow + durationMs,
63
+ durationMs,
64
+ risePx,
65
+ stackGapPx,
66
+ stackKey,
67
+ mergeKey,
68
+ };
69
+ this.items.push(effect);
70
+ this.spawnedCount += 1;
71
+ this.highWatermark = Math.max(this.highWatermark, this.items.length);
72
+ return this.getSnapshots().find((item) => item.id === effect.id);
73
+ }
74
+ advanceTo(nowMs) {
75
+ this.assertMonotonicTime(nowMs);
76
+ this.lastTimeMs = nowMs;
77
+ if (!this.paused) {
78
+ const before = this.items.length;
79
+ this.items = this.items.filter((item) => nowMs < item.expiresAtMs);
80
+ this.expiredCount += before - this.items.length;
81
+ }
82
+ return this.getSnapshots();
83
+ }
84
+ setPaused(paused, nowMs) {
85
+ this.advanceTo(nowMs);
86
+ if (paused === this.paused) {
87
+ return this.getSnapshots();
88
+ }
89
+ if (paused) {
90
+ this.paused = true;
91
+ this.pauseStartedAtMs = nowMs;
92
+ }
93
+ else {
94
+ const frozenMs = nowMs - this.pauseStartedAtMs;
95
+ this.items.forEach((item) => {
96
+ item.createdAtMs += frozenMs;
97
+ item.expiresAtMs += frozenMs;
98
+ });
99
+ this.paused = false;
100
+ this.pauseStartedAtMs = null;
101
+ }
102
+ return this.getSnapshots();
103
+ }
104
+ clear() {
105
+ this.items = [];
106
+ }
107
+ getSnapshots() {
108
+ const renderTime = this.paused
109
+ ? this.pauseStartedAtMs
110
+ : this.lastTimeMs ?? 0;
111
+ const stackCounts = new Map();
112
+ return [...this.items]
113
+ .sort((a, b) => a.sequence - b.sequence)
114
+ .map((item) => {
115
+ const stackIndex = stackCounts.get(item.stackKey) ?? 0;
116
+ stackCounts.set(item.stackKey, stackIndex + 1);
117
+ const progress = Math.max(0, Math.min(1, (renderTime - item.createdAtMs) / item.durationMs));
118
+ return {
119
+ id: item.id,
120
+ text: item.text,
121
+ anchor: { ...item.anchor },
122
+ style: { ...item.style },
123
+ createdAtMs: item.createdAtMs,
124
+ expiresAtMs: item.expiresAtMs,
125
+ durationMs: item.durationMs,
126
+ risePx: item.risePx,
127
+ stackGapPx: item.stackGapPx,
128
+ stackKey: item.stackKey,
129
+ mergeKey: item.mergeKey,
130
+ progress,
131
+ opacity: 1 - progress,
132
+ offsetY: -(item.risePx * progress + item.stackGapPx * stackIndex),
133
+ stackIndex,
134
+ };
135
+ });
136
+ }
137
+ getDiagnostics() {
138
+ return {
139
+ activeCount: this.items.length,
140
+ highWatermark: this.highWatermark,
141
+ spawnedCount: this.spawnedCount,
142
+ mergedCount: this.mergedCount,
143
+ expiredCount: this.expiredCount,
144
+ evictedCount: this.evictedCount,
145
+ paused: this.paused,
146
+ lastTimeMs: this.lastTimeMs,
147
+ };
148
+ }
149
+ validateCommand(command) {
150
+ if (!command || typeof command.text !== 'string' || !command.text.trim()) {
151
+ this.fail('DYFM-FLYING-EFFECT-002', 'spawn text must be a non-empty string', { command });
152
+ }
153
+ if (!command.anchor || ![command.anchor.x, command.anchor.y].every(Number.isFinite)) {
154
+ this.fail('DYFM-FLYING-EFFECT-003', 'spawn anchor must contain finite x/y coordinates', { command });
155
+ }
156
+ if (command.style?.color !== undefined
157
+ && (typeof command.style.color !== 'string' || !command.style.color.trim())) {
158
+ this.fail('DYFM-FLYING-EFFECT-008', 'style.color must be a non-empty string when provided', { command });
159
+ }
160
+ if (command.style?.fontSizePx !== undefined
161
+ && (!Number.isFinite(command.style.fontSizePx) || command.style.fontSizePx <= 0)) {
162
+ this.fail('DYFM-FLYING-EFFECT-009', 'style.fontSizePx must be finite and positive when provided', { command });
163
+ }
164
+ if (command.style?.emphasis !== undefined
165
+ && !['normal', 'strong', 'critical'].includes(command.style.emphasis)) {
166
+ this.fail('DYFM-FLYING-EFFECT-010', 'style.emphasis is not supported', { command });
167
+ }
168
+ }
169
+ resolveStackKey(command) {
170
+ return this.optionalKey(command.stackKey, 'stackKey')
171
+ ?? this.optionalKey(command.mergeKey, 'mergeKey')
172
+ ?? `${command.anchor.x}:${command.anchor.y}`;
173
+ }
174
+ optionalKey(value, field) {
175
+ if (value === undefined) {
176
+ return undefined;
177
+ }
178
+ if (typeof value !== 'string' || !value.trim()) {
179
+ this.fail('DYFM-FLYING-EFFECT-004', `${field} must be a non-empty string when provided`, { value });
180
+ }
181
+ return value;
182
+ }
183
+ assertMonotonicTime(nowMs) {
184
+ if (!Number.isFinite(nowMs) || (this.lastTimeMs !== null && nowMs < this.lastTimeMs)) {
185
+ this.fail('DYFM-FLYING-EFFECT-005', 'time must be finite and monotonic', {
186
+ nowMs,
187
+ lastTimeMs: this.lastTimeMs,
188
+ });
189
+ }
190
+ }
191
+ positive(value, field) {
192
+ if (!Number.isFinite(value) || value <= 0) {
193
+ this.fail('DYFM-FLYING-EFFECT-006', `${field} must be finite and positive`, { value });
194
+ }
195
+ return value;
196
+ }
197
+ positiveInteger(value, field, code) {
198
+ if (!Number.isInteger(value) || value <= 0) {
199
+ this.fail(code, `${field} must be a positive integer`, { value });
200
+ }
201
+ return value;
202
+ }
203
+ nonNegative(value, field) {
204
+ if (!Number.isFinite(value) || value < 0) {
205
+ this.fail('DYFM-FLYING-EFFECT-007', `${field} must be finite and non-negative`, { value });
206
+ }
207
+ return value;
208
+ }
209
+ fail(code, message, additionalContent) {
210
+ throw new DyFM_Error({ errorCode: code, message: `DyFM_FlyingEffect_ControlModel: ${message}`, additionalContent });
211
+ }
212
+ }
@@ -0,0 +1,124 @@
1
+ import { DyFM_SeededRandom } from './seeded-random.control-model';
2
+ /**
3
+ * BFR-WARFACTORY-009 — **gyökér-seedelt, FÜGGETLEN RNG-stream registry.**
4
+ *
5
+ * ⚠️ **A megoldandó baj:** a `DyFM_SeededRandom` egyetlen sorozat. Ha a játék minden véletlenét
6
+ * egyetlen példányból húzza, akkor **egy harci dobás hozzáadása eltolja a térkép-generálást, a
7
+ * loot-ot, az azonosítókat és a tutorial-állapotot is** — ugyanaz a mentés más világot ad, mert
8
+ * közben egy csatában eggyel többször dobtunk. Ez a determinizmus leggyakoribb, legnehezebben
9
+ * észrevehető elvesztése.
10
+ *
11
+ * ⭐ A megoldás: **egy gyökér-seed → sok, névvel azonosított, egymástól független stream.** A
12
+ * `'combat'` csatorna fogyasztása nem érinti a `'worldgen'`-t, viszont ugyanabból a gyökér-seedből
13
+ * az egész készlet **reprodukálható**.
14
+ *
15
+ * ⚠️ **A származtatás determinisztikus és név-alapú** (`<rootSeed>::<channel>`), nem sorrend-alapú.
16
+ * Ez tudatos: ha a streameket a létrehozásuk sorrendje szerint származtatnánk, egy ÚJ csatorna
17
+ * bevezetése — vagy csak a kód átrendezése — elmozdítaná az összes utána következő sorozatot.
18
+ * Névvel a `'combat'` mindig ugyanaz, függetlenül attól, hány másik csatorna létezik.
19
+ *
20
+ * ⛔ A registry **nem** hoz létre csatornát a hívó tudta nélkül a `get()`-en kívül: az `require()`
21
+ * ismeretlen névre **dob**, mert egy elgépelt csatornanév különben csendben egy vadonatúj, üres
22
+ * sorozatot adna — és a hiba csak a reprodukálhatóság elvesztésekor derülne ki.
23
+ */
24
+ export class DyFM_SeededRandomRegistry_ControlModel {
25
+ rootSeed;
26
+ streams = new Map();
27
+ constructor(rootSeed) {
28
+ this.rootSeed = rootSeed;
29
+ }
30
+ /** Új registry egy gyökér-seedből. Csatornák igény szerint, a `get()` hívásakor jönnek létre. */
31
+ static fromRootSeed(rootSeed) {
32
+ return new DyFM_SeededRandomRegistry_ControlModel(`${rootSeed}`);
33
+ }
34
+ /**
35
+ * Registry visszatöltése mentett állapotból — minden csatorna ott folytatódik, ahol abbamaradt.
36
+ *
37
+ * @throws {Error} ha a `contractVersion` nem az ismert alak. ⚠️ Ez SZÁNDÉKOSAN dob: egy nem
38
+ * értelmezhető mentés-payload csendben elfogadva friss, üres streameket adna, és a játékos
39
+ * mentése némán más világot generálna.
40
+ */
41
+ static fromState(state) {
42
+ if (state?.contractVersion !== 'dyfm-seeded-random-registry/1') {
43
+ throw new Error('DyFM_SeededRandomRegistry: unknown or missing contractVersion.');
44
+ }
45
+ const registry = new DyFM_SeededRandomRegistry_ControlModel(`${state.rootSeed ?? ''}`);
46
+ for (const channel of Object.keys(state.channels ?? {})) {
47
+ registry.streams.set(channel, DyFM_SeededRandom.fromState(state.channels[channel]));
48
+ }
49
+ return registry;
50
+ }
51
+ /**
52
+ * Egy nevesített stream. Ugyanarra a névre **mindig ugyanaz a példány** (tehát a sorozat
53
+ * folytatódik, nem indul újra); ismeretlen névre determinisztikusan **létrehozza**.
54
+ */
55
+ get(channel) {
56
+ const name = `${channel ?? ''}`.trim();
57
+ if (!name.length) {
58
+ throw new Error('DyFM_SeededRandomRegistry: a channel name is required.');
59
+ }
60
+ const existing = this.streams.get(name);
61
+ if (existing) {
62
+ return existing;
63
+ }
64
+ // Nev-alapu szarmaztatas: a `'combat'` mindig ugyanaz, fuggetlenul attol, hany masik csatorna
65
+ // letezik es milyen sorrendben jottek letre.
66
+ const stream = DyFM_SeededRandom.fromSeed(`${this.rootSeed}::${name}`);
67
+ this.streams.set(name, stream);
68
+ return stream;
69
+ }
70
+ /**
71
+ * Egy MÁR LÉTEZŐ stream. Ismeretlen névre **dob**.
72
+ *
73
+ * ⭐ Ez a `get()` szigorú párja: ahol a hívó tudja, hogy a csatornának léteznie kell (pl. mentés
74
+ * betöltése után), ott egy elgépelt név ne csendben új, üres sorozatot adjon.
75
+ */
76
+ require(channel) {
77
+ const name = `${channel ?? ''}`.trim();
78
+ const existing = this.streams.get(name);
79
+ if (!existing) {
80
+ throw new Error(`DyFM_SeededRandomRegistry: unknown channel "${name}".`);
81
+ }
82
+ return existing;
83
+ }
84
+ /** Létezik-e már a csatorna (létrehozás NÉLKÜL). */
85
+ has(channel) {
86
+ return this.streams.has(`${channel ?? ''}`.trim());
87
+ }
88
+ /**
89
+ * A teljes registry mentheto allapota — ezt kell a save-payloadba tenni.
90
+ *
91
+ * A csatornak ABECESORRENDBEN kerulnek bele: igy ket azonos allapotu registry
92
+ * szerializalt alakja BAJTRA egyezik, ami a mentes-osszehasonlitast es a teszt-asszerciot
93
+ * determinisztikussa teszi.
94
+ */
95
+ getState() {
96
+ const channels = {};
97
+ for (const name of [...this.streams.keys()].sort()) {
98
+ channels[name] = this.streams.get(name).getState();
99
+ }
100
+ return {
101
+ contractVersion: 'dyfm-seeded-random-registry/1',
102
+ rootSeed: this.rootSeed,
103
+ channels: channels,
104
+ };
105
+ }
106
+ /**
107
+ * Fuggetlen masolat a TELJES registry-rol. A klon minden csatornaja ott folytatja, ahol az
108
+ * eredeti tart, de a ketto tovabbiakban nem befolyasolja egymast.
109
+ *
110
+ * Tipikus hasznalat: „mi lenne, ha" elore-szimulacio a fo-jatekmenet elrontasa nelkul.
111
+ */
112
+ clone() {
113
+ return DyFM_SeededRandomRegistry_ControlModel.fromState(this.getState());
114
+ }
115
+ /** Tartalom-mentes diagnosztika: a szerkezet, nem a sorozatok kimenete. */
116
+ getDiagnostics() {
117
+ const channels = [...this.streams.keys()].sort();
118
+ return {
119
+ rootSeed: this.rootSeed,
120
+ channels: channels,
121
+ channelCount: channels.length,
122
+ };
123
+ }
124
+ }