@futdevpro/nts-dynamo 1.15.86 → 1.15.88

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 (358) hide show
  1. package/.c8rc.json +26 -26
  2. package/.copilot/patterns.json +7 -7
  3. package/.cursor/rules/__assistant_guide.mdc +30 -30
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  7. package/.cursor/rules/_ag_frontend.mdc +39 -39
  8. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  9. package/.cursor/rules/_ag_naming.mdc +115 -115
  10. package/.cursor/rules/_ag_should-be.mdc +6 -6
  11. package/.cursor/rules/ai_development_guide.md +60 -60
  12. package/.cursor/rules/cursor-rules.md +160 -160
  13. package/.cursor/rules/default-command.mdc +464 -464
  14. package/.cursor/rules/error_code_pattern.md +39 -39
  15. package/.cursor/rules/saved rule mcp server use.md +15 -15
  16. package/.dynamo/pipeline.cicd.config.json +4 -0
  17. package/.vscode/settings.json +10 -10
  18. package/HOWTO.md +15 -15
  19. package/LICENSE +21 -21
  20. package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
  21. package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
  22. package/_specifications/BACKLOG.md +92 -92
  23. package/_specifications/TODO.md +15 -15
  24. package/_specifications/agent.md +138 -138
  25. package/eslint.config.js +3 -3
  26. package/nodemon.json +24 -24
  27. package/package.json +5 -5
  28. package/pnpm-workspace.yaml +5 -5
  29. package/scripts/run-coverage-tests.js +28 -28
  30. package/spec/support/helpers/spec-reporter-loader.js +359 -359
  31. package/spec/support/helpers/ts-node-helper.js +93 -93
  32. package/spec/support/jasmine.coverage.json +24 -24
  33. package/spec/support/jasmine.json +24 -24
  34. package/src/_collections/archive.util.spec.ts +57 -57
  35. package/src/_collections/archive.util.ts +18 -18
  36. package/src/_collections/atlas-default-db-options.const.ts +9 -9
  37. package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
  38. package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
  39. package/src/_collections/default-not-found-page.const.spec.ts +19 -19
  40. package/src/_collections/default-not-found-page.const.ts +22 -22
  41. package/src/_collections/default-socket-path.const.spec.ts +12 -12
  42. package/src/_collections/default-socket-path.const.ts +2 -2
  43. package/src/_collections/get-environment-settings.util.spec.ts +210 -210
  44. package/src/_collections/get-environment-settings.util.ts +48 -48
  45. package/src/_collections/global-settings.const.ts +109 -109
  46. package/src/_collections/sample.env +21 -21
  47. package/src/_collections/star.controller.spec.ts +224 -224
  48. package/src/_collections/star.controller.ts +129 -129
  49. package/src/_enums/data-model-type.enum.ts +14 -14
  50. package/src/_enums/data-service-function.enum.ts +24 -24
  51. package/src/_enums/predefined-data-types.enum.ts +16 -16
  52. package/src/_enums/route-security.enum.ts +12 -12
  53. package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
  54. package/src/_models/control-models/api-call-params.control-model.ts +142 -142
  55. package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
  56. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  57. package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
  58. package/src/_models/control-models/app-params.control-model.ts +136 -136
  59. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
  60. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  61. package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
  62. package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
  63. package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
  64. package/src/_models/control-models/http-settings.control-model.ts +37 -37
  65. package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
  66. package/src/_models/control-models/system-control.control-model.ts +12 -12
  67. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  68. package/src/_models/interfaces/environment-settings.interface.ts +59 -59
  69. package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
  70. package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
  71. package/src/_models/interfaces/global-settings.interface.ts +235 -235
  72. package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
  73. package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
  74. package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
  75. package/src/_models/types/db-update.type.ts +100 -100
  76. package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
  77. package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
  78. package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
  79. package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
  80. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
  81. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
  82. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
  83. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
  84. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
  85. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
  86. package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
  87. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
  88. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
  89. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
  90. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
  91. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
  92. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
  93. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
  94. package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
  95. package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
  96. package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
  97. package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
  98. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
  99. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
  100. package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
  101. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
  102. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
  103. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
  104. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
  105. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
  106. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
  107. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
  108. package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
  109. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
  110. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
  111. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
  112. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
  113. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
  114. package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
  115. package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -115
  116. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
  117. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
  118. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
  119. package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
  120. package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
  121. package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
  122. package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
  123. package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
  124. package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
  125. package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
  126. package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
  127. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
  128. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
  129. package/src/_modules/ai/index.ts +23 -23
  130. package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
  131. package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
  132. package/src/_modules/assistant/_collections/ass.util.ts +50 -50
  133. package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
  134. package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
  135. package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
  136. package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
  137. package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
  138. package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
  139. package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
  140. package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
  141. package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
  142. package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
  143. package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
  144. package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
  145. package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
  146. package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
  147. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
  148. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
  149. package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
  150. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
  151. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
  152. package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
  153. package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
  154. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
  155. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
  156. package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
  157. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
  158. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
  159. package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
  160. package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
  161. package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
  162. package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
  163. package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
  164. package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
  165. package/src/_modules/custom-data/custom-data.controller.ts +67 -67
  166. package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
  167. package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
  168. package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
  169. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
  170. package/src/_modules/custom-data/index.ts +9 -9
  171. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
  172. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
  173. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
  174. package/src/_modules/data-readers/index.ts +11 -11
  175. package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
  176. package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
  177. package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
  178. package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
  179. package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
  180. package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
  181. package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
  182. package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
  183. package/src/_modules/defaults/index.ts +17 -17
  184. package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
  185. package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
  186. package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
  187. package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
  188. package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
  189. package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
  190. package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
  191. package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
  192. package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
  193. package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
  194. package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
  195. package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
  196. package/src/_modules/discord-assistant/index.ts +38 -38
  197. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
  198. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
  199. package/src/_modules/discord-assistant-voiced/index.ts +36 -36
  200. package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
  201. package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
  202. package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
  203. package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
  204. package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
  205. package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
  206. package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
  207. package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
  208. package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
  209. package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
  210. package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
  211. package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
  212. package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
  213. package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
  214. package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
  215. package/src/_modules/discord-bot/index.ts +36 -36
  216. package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
  217. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
  218. package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
  219. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
  220. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
  221. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
  222. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
  223. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -198
  224. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
  225. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
  226. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
  227. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
  228. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
  229. package/src/_modules/local-vector-search/index.ts +16 -16
  230. package/src/_modules/logs/index.ts +11 -11
  231. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
  232. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
  233. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
  234. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
  235. package/src/_modules/mcp/index.ts +13 -13
  236. package/src/_modules/messaging/README.md +354 -354
  237. package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
  238. package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
  239. package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
  240. package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
  241. package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
  242. package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
  243. package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
  244. package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
  245. package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
  246. package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
  247. package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
  248. package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
  249. package/src/_modules/messaging/index.ts +30 -30
  250. package/src/_modules/mock/app-extended-server.mock.ts +201 -201
  251. package/src/_modules/mock/app-integration-test.mock.ts +51 -51
  252. package/src/_modules/mock/app-params.mock.spec.ts +21 -21
  253. package/src/_modules/mock/app-params.mock.ts +9 -9
  254. package/src/_modules/mock/app-server.mock.ts +188 -188
  255. package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
  256. package/src/_modules/mock/auth-service.mock.ts +28 -28
  257. package/src/_modules/mock/controller.mock.spec.ts +26 -26
  258. package/src/_modules/mock/controller.mock.ts +16 -16
  259. package/src/_modules/mock/data-model.mock.spec.ts +111 -111
  260. package/src/_modules/mock/data-model.mock.ts +82 -82
  261. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
  262. package/src/_modules/mock/email-service-collection.mock.ts +15 -15
  263. package/src/_modules/mock/email-service.mock.spec.ts +17 -17
  264. package/src/_modules/mock/email-service.mock.ts +20 -20
  265. package/src/_modules/mock/email-template.mock.html +14 -14
  266. package/src/_modules/mock/endpoint.mock.ts +91 -91
  267. package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
  268. package/src/_modules/mock/socket-client.mock.ts +45 -45
  269. package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
  270. package/src/_modules/mock/socket-server.mock.ts +46 -46
  271. package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
  272. package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
  273. package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
  274. package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
  275. package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
  276. package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
  277. package/src/_modules/oauth2/index.ts +17 -17
  278. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
  279. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
  280. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
  281. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
  282. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
  283. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
  284. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
  285. package/src/_modules/scoped-config/index.ts +17 -17
  286. package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
  287. package/src/_modules/server/errors/errors.control-service.ts +100 -100
  288. package/src/_modules/server/errors/errors.controller.spec.ts +268 -268
  289. package/src/_modules/server/errors/errors.controller.ts +515 -515
  290. package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
  291. package/src/_modules/server/index.ts +30 -30
  292. package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
  293. package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
  294. package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
  295. package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
  296. package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
  297. package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
  298. package/src/_modules/server/server-status/server-status.controller.spec.ts +255 -255
  299. package/src/_modules/server/server-status/server-status.controller.ts +272 -272
  300. package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
  301. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
  302. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
  303. package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
  304. package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
  305. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
  306. package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
  307. package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
  308. package/src/_modules/socket/_services/socket-client.service.ts +260 -260
  309. package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
  310. package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
  311. package/src/_modules/socket/app-extended.server.ts +630 -630
  312. package/src/_modules/socket/index.ts +42 -42
  313. package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
  314. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  315. package/src/_modules/test/index.ts +11 -11
  316. package/src/_modules/test/test.controller.spec.ts +72 -72
  317. package/src/_modules/test/test.controller.ts +115 -115
  318. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  319. package/src/_modules/usage/index.ts +15 -15
  320. package/src/_modules/usage/usage.controller.spec.ts +81 -81
  321. package/src/_modules/usage/usage.controller.ts +126 -126
  322. package/src/_modules/usage/usage.data-service.spec.ts +332 -332
  323. package/src/_modules/usage/usage.data-service.ts +185 -185
  324. package/src/_services/base/api.service-base.spec.ts +125 -125
  325. package/src/_services/base/api.service-base.ts +74 -74
  326. package/src/_services/base/archive-data.service.spec.ts +209 -209
  327. package/src/_services/base/archive-data.service.ts +224 -224
  328. package/src/_services/base/data.service.spec.ts +729 -729
  329. package/src/_services/base/data.service.ts +2740 -2740
  330. package/src/_services/base/db.service.spec.ts +73 -73
  331. package/src/_services/base/db.service.ts +1575 -1575
  332. package/src/_services/base/singleton.service-base.spec.ts +28 -28
  333. package/src/_services/base/singleton.service-base.ts +24 -24
  334. package/src/_services/base/singleton.service.spec.ts +114 -114
  335. package/src/_services/base/singleton.service.ts +38 -38
  336. package/src/_services/core/api.service.spec.ts +140 -140
  337. package/src/_services/core/auth.service.spec.ts +159 -159
  338. package/src/_services/core/auth.service.ts +174 -174
  339. package/src/_services/core/email.service.spec.ts +85 -85
  340. package/src/_services/core/email.service.ts +742 -742
  341. package/src/_services/core/global.service.spec.ts +292 -292
  342. package/src/_services/core/global.service.ts +487 -487
  343. package/src/_services/core/memory-guard.service.spec.ts +245 -245
  344. package/src/_services/core/memory-guard.service.ts +481 -481
  345. package/src/_services/core/service-collection.service.spec.ts +46 -46
  346. package/src/_services/core/service-collection.service.ts +6 -6
  347. package/src/_services/route/controller.service.spec.ts +53 -53
  348. package/src/_services/route/controller.service.ts +148 -148
  349. package/src/_services/route/routing-module.service.spec.ts +98 -98
  350. package/src/_services/route/routing-module.service.ts +330 -330
  351. package/src/_services/server/app.server.ts +1912 -1912
  352. package/src/_services/shared.static-service.spec.ts +99 -99
  353. package/src/_services/shared.static-service.ts +78 -78
  354. package/src/index.ts +97 -97
  355. package/tsconfig.app.json +12 -12
  356. package/tsconfig.json +42 -42
  357. package/.dynamo/logs/cicd-pipeline/output.log +0 -2818
  358. package/.dynamo/logs/cicd-pipeline/status.json +0 -94
@@ -2,551 +2,551 @@ import * as ts from 'typescript';
2
2
 
3
3
  import { DyFM_Log } from '@futdevpro/fsm-dynamo';
4
4
 
5
- import { DyNTS_DAI_CodeChunk, DyNTS_DAI_CodeChunkType } from '../_models/interfaces/dai-code-chunk.interface';
6
-
7
- /** A kód-chunker méret-paraméterei (a FAM/CCAP konstansokkal egyező default-ok). */
8
- export interface DyNTS_DAI_CodeChunking_Options {
9
- /** Max chunk-méret karakterben (e fölött sliding-window sub-split). Default: 1500. */
10
- maxChunkSize?: number;
11
- /** Overlap karakterben a nagy-node sliding-window-ban. Default: 100. */
12
- overlap?: number;
13
- /** Minimum chunk-méret (ennél kisebb chunk-ot eldobunk a zaj ellen). Default: 50. */
14
- minChunkSize?: number;
15
- }
16
-
17
- /** Belső, normalizált méret-konfiguráció (a default-ok feloldása után). */
18
- interface DyNTS_DAI_CodeChunking_Sizing {
19
- maxChunkSize: number;
20
- overlap: number;
21
- minChunkSize: number;
22
- }
23
-
24
- /**
25
- * Belső, AST-ből kinyert szemantikus blokk (a chunkká alakítás előtti közbenső reprezentáció).
26
- */
27
- interface DyNTS_DAI_CodeBlock {
28
- /** A node forrás-szövege (JSDoc + dekorátorok kezdetétől a node végéig). */
29
- text: string;
30
- /** A chunk szemantikus típusa. */
31
- chunkType: DyNTS_DAI_CodeChunkType;
32
- /** A symbol-lánc szegmensei (pl. `['class:Foo', 'method:bar']`). */
33
- symbolSegments: string[];
34
- /** A legbelső symbol neve, ha van. */
35
- symbolName?: string;
36
- /** Karakter-kezdőpozíció a forrásban (0-alapú, inkluzív; JSDoc-ot is tartalmazza). */
37
- charStart: number;
38
- /** Karakter-végpozíció a forrásban (0-alapú, exkluzív). */
39
- charEnd: number;
40
- }
41
-
42
- /**
43
- * `DyNTS_DAI_CodeChunking_Util` (BFR-AM-005) — **AST-pontos** TypeScript/JavaScript kód-chunker
44
- * a TypeScript Compiler API-val (`ts.createSourceFile`). A FAM `FAM_TsChunker_Util` regex/brace-depth
45
- * workaround-jának **bedrock-szintű, durable** változata: a `{`/`}` számolás helyett a valódi
46
- * szintaxisfát járja be, így string-literálban / template-literálban / comment-ben lévő zárójelek
47
- * NEM tévesztik meg.
48
- *
49
- * **Chunkolási stratégia (top-level node-onként, egy chunk per szemantikus egység):**
50
- * - **import-group** — az összes egymást követő top-level `import` / `export ... from` egy chunkba
51
- * (a köztük lévő üres sorokkal együtt).
52
- * - **class** — ha belefér a `maxChunkSize`-ba, az egész osztály egy chunk (dekorátorok + JSDoc-cal);
53
- * ha NEM fér bele, **metódusonként** bomlik (osztály-fej + minden metódus külön chunk, a
54
- * `class:Foo > method:bar` symbol-lánccal).
55
- * - **interface / enum / type-alias / standalone function / top-level const(=>fn/value)** — egy chunk
56
- * per deklaráció.
57
- * - **nagy node** (a fentiek közül bármelyik, ami a metódus-bontás UTÁN is `maxChunkSize` fölötti) →
58
- * karakter-alapú **sliding-window** sub-split (örökölt `chunkType` + symbol-lánc, `subChunkIndex`-szel).
59
- * - **tiny / parse-degenerált tartalom** → egyetlen `fallback` chunk (a teljes forrás), hogy soha
60
- * ne vesszen el tartalom.
61
- *
62
- * A JSDoc + `@Decorator` MINDIG a következő node-dal együtt marad (a `node.getStart(sf, true)` a
63
- * leading-JSDoc elejétől indul, a `ts.getDecorators` a node része).
64
- *
65
- * **headingPath = kód-symbol-lánc** (a markdown-chunker heading-láncának kód-megfelelője):
66
- * `symbolPath` = a szegmensek ` > `-rel összefűzve.
67
- */
68
- export class DyNTS_DAI_CodeChunking_Util {
69
-
70
- /** A FAM/CCAP-egyeztetett default méret-konstansok. */
71
- private static readonly DEFAULT_MAX_CHUNK_SIZE: number = 1500;
72
- private static readonly DEFAULT_OVERLAP: number = 100;
73
- private static readonly DEFAULT_MIN_CHUNK_SIZE: number = 50;
74
-
75
- /**
76
- * Egy TS/JS forrás chunkolása szemantikus blokkok mentén a TS Compiler API AST-jával.
77
- * Üres / whitespace-only tartalom → üres lista. A `maxChunkSize` fölötti node-ok sliding-window-ra
78
- * bomlanak; a degenerált (parse-hiba / 0 blokk) esetet egyetlen `fallback` chunk fedi.
79
- *
80
- * @param code - A forráskód.
81
- * @param opts - Méret-paraméterek (default 1500/100/50).
82
- * @returns A szemantikus kód-chunkok listája (0-alapú `chunkIndex`-szel).
83
- */
84
- static chunkTs(code: string, opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunk[] {
85
- if (!code?.trim()) {
86
- return [];
87
- }
88
-
89
- const sizing: DyNTS_DAI_CodeChunking_Sizing = this.resolveSizing(opts);
90
-
5
+ import { DyNTS_DAI_CodeChunk, DyNTS_DAI_CodeChunkType } from '../_models/interfaces/dai-code-chunk.interface';
6
+
7
+ /** A kód-chunker méret-paraméterei (a FAM/CCAP konstansokkal egyező default-ok). */
8
+ export interface DyNTS_DAI_CodeChunking_Options {
9
+ /** Max chunk-méret karakterben (e fölött sliding-window sub-split). Default: 1500. */
10
+ maxChunkSize?: number;
11
+ /** Overlap karakterben a nagy-node sliding-window-ban. Default: 100. */
12
+ overlap?: number;
13
+ /** Minimum chunk-méret (ennél kisebb chunk-ot eldobunk a zaj ellen). Default: 50. */
14
+ minChunkSize?: number;
15
+ }
16
+
17
+ /** Belső, normalizált méret-konfiguráció (a default-ok feloldása után). */
18
+ interface DyNTS_DAI_CodeChunking_Sizing {
19
+ maxChunkSize: number;
20
+ overlap: number;
21
+ minChunkSize: number;
22
+ }
23
+
24
+ /**
25
+ * Belső, AST-ből kinyert szemantikus blokk (a chunkká alakítás előtti közbenső reprezentáció).
26
+ */
27
+ interface DyNTS_DAI_CodeBlock {
28
+ /** A node forrás-szövege (JSDoc + dekorátorok kezdetétől a node végéig). */
29
+ text: string;
30
+ /** A chunk szemantikus típusa. */
31
+ chunkType: DyNTS_DAI_CodeChunkType;
32
+ /** A symbol-lánc szegmensei (pl. `['class:Foo', 'method:bar']`). */
33
+ symbolSegments: string[];
34
+ /** A legbelső symbol neve, ha van. */
35
+ symbolName?: string;
36
+ /** Karakter-kezdőpozíció a forrásban (0-alapú, inkluzív; JSDoc-ot is tartalmazza). */
37
+ charStart: number;
38
+ /** Karakter-végpozíció a forrásban (0-alapú, exkluzív). */
39
+ charEnd: number;
40
+ }
41
+
42
+ /**
43
+ * `DyNTS_DAI_CodeChunking_Util` (BFR-AM-005) — **AST-pontos** TypeScript/JavaScript kód-chunker
44
+ * a TypeScript Compiler API-val (`ts.createSourceFile`). A FAM `FAM_TsChunker_Util` regex/brace-depth
45
+ * workaround-jának **bedrock-szintű, durable** változata: a `{`/`}` számolás helyett a valódi
46
+ * szintaxisfát járja be, így string-literálban / template-literálban / comment-ben lévő zárójelek
47
+ * NEM tévesztik meg.
48
+ *
49
+ * **Chunkolási stratégia (top-level node-onként, egy chunk per szemantikus egység):**
50
+ * - **import-group** — az összes egymást követő top-level `import` / `export ... from` egy chunkba
51
+ * (a köztük lévő üres sorokkal együtt).
52
+ * - **class** — ha belefér a `maxChunkSize`-ba, az egész osztály egy chunk (dekorátorok + JSDoc-cal);
53
+ * ha NEM fér bele, **metódusonként** bomlik (osztály-fej + minden metódus külön chunk, a
54
+ * `class:Foo > method:bar` symbol-lánccal).
55
+ * - **interface / enum / type-alias / standalone function / top-level const(=>fn/value)** — egy chunk
56
+ * per deklaráció.
57
+ * - **nagy node** (a fentiek közül bármelyik, ami a metódus-bontás UTÁN is `maxChunkSize` fölötti) →
58
+ * karakter-alapú **sliding-window** sub-split (örökölt `chunkType` + symbol-lánc, `subChunkIndex`-szel).
59
+ * - **tiny / parse-degenerált tartalom** → egyetlen `fallback` chunk (a teljes forrás), hogy soha
60
+ * ne vesszen el tartalom.
61
+ *
62
+ * A JSDoc + `@Decorator` MINDIG a következő node-dal együtt marad (a `node.getStart(sf, true)` a
63
+ * leading-JSDoc elejétől indul, a `ts.getDecorators` a node része).
64
+ *
65
+ * **headingPath = kód-symbol-lánc** (a markdown-chunker heading-láncának kód-megfelelője):
66
+ * `symbolPath` = a szegmensek ` > `-rel összefűzve.
67
+ */
68
+ export class DyNTS_DAI_CodeChunking_Util {
69
+
70
+ /** A FAM/CCAP-egyeztetett default méret-konstansok. */
71
+ private static readonly DEFAULT_MAX_CHUNK_SIZE: number = 1500;
72
+ private static readonly DEFAULT_OVERLAP: number = 100;
73
+ private static readonly DEFAULT_MIN_CHUNK_SIZE: number = 50;
74
+
75
+ /**
76
+ * Egy TS/JS forrás chunkolása szemantikus blokkok mentén a TS Compiler API AST-jával.
77
+ * Üres / whitespace-only tartalom → üres lista. A `maxChunkSize` fölötti node-ok sliding-window-ra
78
+ * bomlanak; a degenerált (parse-hiba / 0 blokk) esetet egyetlen `fallback` chunk fedi.
79
+ *
80
+ * @param code - A forráskód.
81
+ * @param opts - Méret-paraméterek (default 1500/100/50).
82
+ * @returns A szemantikus kód-chunkok listája (0-alapú `chunkIndex`-szel).
83
+ */
84
+ static chunkTs(code: string, opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunk[] {
85
+ if (!code?.trim()) {
86
+ return [];
87
+ }
88
+
89
+ const sizing: DyNTS_DAI_CodeChunking_Sizing = this.resolveSizing(opts);
90
+
91
91
  let blocks: DyNTS_DAI_CodeBlock[] = [];
92
-
93
- try {
94
- const sourceFile: ts.SourceFile = ts.createSourceFile(
95
- 'chunk-input.ts',
96
- code,
97
- ts.ScriptTarget.Latest,
98
- /* setParentNodes */ true,
99
- ts.ScriptKind.TSX
92
+
93
+ try {
94
+ const sourceFile: ts.SourceFile = ts.createSourceFile(
95
+ 'chunk-input.ts',
96
+ code,
97
+ ts.ScriptTarget.Latest,
98
+ /* setParentNodes */ true,
99
+ ts.ScriptKind.TSX
100
100
  );
101
-
102
- blocks = this.identifyBlocks(sourceFile, code, sizing);
103
- } catch (error) {
104
- // Parse-hiba (degenerált forrás) → a tiny-fallback veszi át lentebb.
105
- DyFM_Log.warn('DyNTS_DAI_CodeChunking_Util.chunkTs: AST parse failed, using fallback chunk', {
106
- error: (error as Error)?.message,
107
- });
108
- blocks = [];
109
- }
110
-
111
- // Tiny / degenerált esetek: ha nincs azonosított blokk, vagy a teljes forrás kicsi → egyetlen
112
- // fallback chunk (soha ne vesszen el tartalom).
113
- if (!blocks.length) {
114
- return this.buildFallbackChunks(code, sizing);
115
- }
116
-
117
- // A sor-pozíciókhoz a teljes forrás sortörés-offszetjei (egyszer számolva).
118
- const lineStartOffsets: number[] = this.computeLineStartOffsets(code);
119
-
101
+
102
+ blocks = this.identifyBlocks(sourceFile, code, sizing);
103
+ } catch (error) {
104
+ // Parse-hiba (degenerált forrás) → a tiny-fallback veszi át lentebb.
105
+ DyFM_Log.warn('DyNTS_DAI_CodeChunking_Util.chunkTs: AST parse failed, using fallback chunk', {
106
+ error: (error as Error)?.message,
107
+ });
108
+ blocks = [];
109
+ }
110
+
111
+ // Tiny / degenerált esetek: ha nincs azonosított blokk, vagy a teljes forrás kicsi → egyetlen
112
+ // fallback chunk (soha ne vesszen el tartalom).
113
+ if (!blocks.length) {
114
+ return this.buildFallbackChunks(code, sizing);
115
+ }
116
+
117
+ // A sor-pozíciókhoz a teljes forrás sortörés-offszetjei (egyszer számolva).
118
+ const lineStartOffsets: number[] = this.computeLineStartOffsets(code);
119
+
120
120
  const chunks: DyNTS_DAI_CodeChunk[] = [];
121
-
122
- for (const block of blocks) {
123
- // Zaj-szűrés: CSAK a névtelen `generic` blokkokat dobjuk a minChunkSize alatt. A nevesített
124
- // szemantikus deklarációk (type-alias / rövid function / class-fej / metódus / interface /
125
- // enum / variable) MINDIG saját chunkot kapnak, méretüktől függetlenül — egy `type Id = string`
126
- // teljes értékű egység. Az import-csoport sosem esik ki.
127
- if (block.chunkType === 'generic' && block.text.trim().length < sizing.minChunkSize) {
128
- continue;
129
- }
130
-
131
- if (block.text.length <= sizing.maxChunkSize) {
132
- chunks.push(this.blockToChunk(block, chunks.length, lineStartOffsets));
133
- continue;
134
- }
135
-
136
- // Túl nagy node → karakter-alapú sliding-window sub-split (örökölt symbol-lánc + chunkType).
137
- this.splitLargeBlock(block, sizing, chunks, lineStartOffsets);
138
- }
139
-
140
- // Ha minden blokk kiesett a minChunkSize-szűrőn (pl. sok apró egysoros), essünk vissza a
141
- // fallback-re, hogy ne adjunk vissza üres listát nem-üres bemenetre.
142
- if (!chunks.length) {
143
- return this.buildFallbackChunks(code, sizing);
144
- }
145
-
146
- return chunks;
147
- }
148
-
149
- /**
150
- * Dispatcher: a `filename` kiterjesztése alapján a `.ts/.tsx/.js/.jsx/.mts/.cts/.mjs/.cjs`
151
- * forrásokat az AST-chunkerre (`chunkTs`), minden mást (pl. `.md`) az adott formátum nyers
152
- * sliding-fallback-jére irányít. A markdown-specifikus chunkolás a `DyNTS_DAI_DocChunking_Util`
153
- * felelőssége (page-modell + parent-hierarchia kell hozzá), ezért azt itt NEM hívjuk —
154
- * additív marad. Nem-kód input → `fallback` chunk a tartalom megőrzéséhez.
155
- *
156
- * @param content - A fájl tartalma.
157
- * @param filename - A fájlnév (a kiterjesztés-alapú routinghoz).
158
- * @param opts - Méret-paraméterek.
159
- */
160
- static chunk(content: string, filename: string, opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunk[] {
161
- if (this.isTsLike(filename)) {
162
- return this.chunkTs(content, opts);
121
+
122
+ for (const block of blocks) {
123
+ // Zaj-szűrés: CSAK a névtelen `generic` blokkokat dobjuk a minChunkSize alatt. A nevesített
124
+ // szemantikus deklarációk (type-alias / rövid function / class-fej / metódus / interface /
125
+ // enum / variable) MINDIG saját chunkot kapnak, méretüktől függetlenül — egy `type Id = string`
126
+ // teljes értékű egység. Az import-csoport sosem esik ki.
127
+ if (block.chunkType === 'generic' && block.text.trim().length < sizing.minChunkSize) {
128
+ continue;
129
+ }
130
+
131
+ if (block.text.length <= sizing.maxChunkSize) {
132
+ chunks.push(this.blockToChunk(block, chunks.length, lineStartOffsets));
133
+ continue;
134
+ }
135
+
136
+ // Túl nagy node → karakter-alapú sliding-window sub-split (örökölt symbol-lánc + chunkType).
137
+ this.splitLargeBlock(block, sizing, chunks, lineStartOffsets);
138
+ }
139
+
140
+ // Ha minden blokk kiesett a minChunkSize-szűrőn (pl. sok apró egysoros), essünk vissza a
141
+ // fallback-re, hogy ne adjunk vissza üres listát nem-üres bemenetre.
142
+ if (!chunks.length) {
143
+ return this.buildFallbackChunks(code, sizing);
144
+ }
145
+
146
+ return chunks;
147
+ }
148
+
149
+ /**
150
+ * Dispatcher: a `filename` kiterjesztése alapján a `.ts/.tsx/.js/.jsx/.mts/.cts/.mjs/.cjs`
151
+ * forrásokat az AST-chunkerre (`chunkTs`), minden mást (pl. `.md`) az adott formátum nyers
152
+ * sliding-fallback-jére irányít. A markdown-specifikus chunkolás a `DyNTS_DAI_DocChunking_Util`
153
+ * felelőssége (page-modell + parent-hierarchia kell hozzá), ezért azt itt NEM hívjuk —
154
+ * additív marad. Nem-kód input → `fallback` chunk a tartalom megőrzéséhez.
155
+ *
156
+ * @param content - A fájl tartalma.
157
+ * @param filename - A fájlnév (a kiterjesztés-alapú routinghoz).
158
+ * @param opts - Méret-paraméterek.
159
+ */
160
+ static chunk(content: string, filename: string, opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunk[] {
161
+ if (this.isTsLike(filename)) {
162
+ return this.chunkTs(content, opts);
163
163
  }
164
-
165
- // Nem-kód (pl. .md / .txt / ismeretlen): nyers fallback chunkok — a tartalmat megőrizzük,
166
- // de NEM próbáljuk szemantikusan darabolni (a markdown-darabolás külön util-é).
167
- if (!content?.trim()) {
168
- return [];
164
+
165
+ // Nem-kód (pl. .md / .txt / ismeretlen): nyers fallback chunkok — a tartalmat megőrizzük,
166
+ // de NEM próbáljuk szemantikusan darabolni (a markdown-darabolás külön util-é).
167
+ if (!content?.trim()) {
168
+ return [];
169
169
  }
170
-
171
- return this.buildFallbackChunks(content, this.resolveSizing(opts));
172
- }
173
-
174
- /** `true`, ha a fájlnév TS/JS-szerű (a `chunkTs` AST-parsere tudja kezelni). */
175
- private static isTsLike(filename: string): boolean {
176
- return /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/i.test(filename || '');
177
- }
178
-
179
- /** A default-ok feloldása (1500/100/50) + sanity-clamp. */
180
- private static resolveSizing(opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunking_Sizing {
181
- const maxChunkSize: number = Math.max(1, opts?.maxChunkSize ?? this.DEFAULT_MAX_CHUNK_SIZE);
182
- const overlap: number = Math.max(0, Math.min(opts?.overlap ?? this.DEFAULT_OVERLAP, maxChunkSize - 1));
170
+
171
+ return this.buildFallbackChunks(content, this.resolveSizing(opts));
172
+ }
173
+
174
+ /** `true`, ha a fájlnév TS/JS-szerű (a `chunkTs` AST-parsere tudja kezelni). */
175
+ private static isTsLike(filename: string): boolean {
176
+ return /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/i.test(filename || '');
177
+ }
178
+
179
+ /** A default-ok feloldása (1500/100/50) + sanity-clamp. */
180
+ private static resolveSizing(opts?: DyNTS_DAI_CodeChunking_Options): DyNTS_DAI_CodeChunking_Sizing {
181
+ const maxChunkSize: number = Math.max(1, opts?.maxChunkSize ?? this.DEFAULT_MAX_CHUNK_SIZE);
182
+ const overlap: number = Math.max(0, Math.min(opts?.overlap ?? this.DEFAULT_OVERLAP, maxChunkSize - 1));
183
183
  const minChunkSize: number = Math.max(0, opts?.minChunkSize ?? this.DEFAULT_MIN_CHUNK_SIZE);
184
-
185
- return { maxChunkSize: maxChunkSize, overlap: overlap, minChunkSize: minChunkSize };
186
- }
187
-
188
- /**
189
- * AST-bejárás: a `SourceFile` top-level statement-jeit szemantikus blokkokká alakítja. Az
190
- * egymást követő import-okat egy `imports` blokkba vonja össze. A `maxChunkSize` fölötti
191
- * osztályt metódusonként bontja.
192
- */
193
- private static identifyBlocks(
194
- sourceFile: ts.SourceFile,
195
- code: string,
196
- sizing: DyNTS_DAI_CodeChunking_Sizing
197
- ): DyNTS_DAI_CodeBlock[] {
198
- const blocks: DyNTS_DAI_CodeBlock[] = [];
199
-
200
- // -- Import-csoport összevonás --
201
- let importStart: number = -1;
202
- let importEnd: number = -1;
203
-
204
- const flushImports: () => void = () => {
205
- if (importStart < 0) {
206
- return;
207
- }
184
+
185
+ return { maxChunkSize: maxChunkSize, overlap: overlap, minChunkSize: minChunkSize };
186
+ }
187
+
188
+ /**
189
+ * AST-bejárás: a `SourceFile` top-level statement-jeit szemantikus blokkokká alakítja. Az
190
+ * egymást követő import-okat egy `imports` blokkba vonja össze. A `maxChunkSize` fölötti
191
+ * osztályt metódusonként bontja.
192
+ */
193
+ private static identifyBlocks(
194
+ sourceFile: ts.SourceFile,
195
+ code: string,
196
+ sizing: DyNTS_DAI_CodeChunking_Sizing
197
+ ): DyNTS_DAI_CodeBlock[] {
198
+ const blocks: DyNTS_DAI_CodeBlock[] = [];
199
+
200
+ // -- Import-csoport összevonás --
201
+ let importStart: number = -1;
202
+ let importEnd: number = -1;
203
+
204
+ const flushImports: () => void = () => {
205
+ if (importStart < 0) {
206
+ return;
207
+ }
208
208
  const text: string = code.substring(importStart, importEnd);
209
-
210
- if (text.trim().length) {
211
- blocks.push({
212
- text: text,
213
- chunkType: 'imports',
214
- symbolSegments: [],
215
- symbolName: undefined,
216
- charStart: importStart,
217
- charEnd: importEnd,
218
- });
219
- }
220
- importStart = -1;
221
- importEnd = -1;
222
- };
223
-
224
- for (const statement of sourceFile.statements) {
225
- if (this.isImportLike(statement)) {
209
+
210
+ if (text.trim().length) {
211
+ blocks.push({
212
+ text: text,
213
+ chunkType: 'imports',
214
+ symbolSegments: [],
215
+ symbolName: undefined,
216
+ charStart: importStart,
217
+ charEnd: importEnd,
218
+ });
219
+ }
220
+ importStart = -1;
221
+ importEnd = -1;
222
+ };
223
+
224
+ for (const statement of sourceFile.statements) {
225
+ if (this.isImportLike(statement)) {
226
226
  const start: number = statement.getStart(sourceFile, /* includeJsDocComment */ true);
227
-
228
- if (importStart < 0) {
229
- importStart = start;
230
- }
231
- importEnd = statement.getEnd();
232
- continue;
233
- }
234
-
235
- // Más jött → import-csoport lezárása.
236
- flushImports();
237
-
238
- const detected: { chunkType: DyNTS_DAI_CodeChunkType; name?: string } = this.detectDeclaration(statement);
239
- const start: number = statement.getStart(sourceFile, /* includeJsDocComment */ true);
240
- const end: number = statement.getEnd();
241
- const text: string = code.substring(start, end);
242
- const symbolSegments: string[] = detected.name ? [ `${detected.chunkType}:${detected.name}` ] : [];
243
-
244
- // Nagy osztály → metódusonkénti bontás (osztály-fej + metódusok).
245
- if (ts.isClassDeclaration(statement) && text.length > sizing.maxChunkSize) {
246
- this.splitClassByMethods(statement, sourceFile, code, detected.name, blocks);
247
- continue;
248
- }
249
-
250
- blocks.push({
251
- text: text,
252
- chunkType: detected.chunkType,
253
- symbolSegments: symbolSegments,
254
- symbolName: detected.name,
255
- charStart: start,
256
- charEnd: end,
257
- });
227
+
228
+ if (importStart < 0) {
229
+ importStart = start;
230
+ }
231
+ importEnd = statement.getEnd();
232
+ continue;
233
+ }
234
+
235
+ // Más jött → import-csoport lezárása.
236
+ flushImports();
237
+
238
+ const detected: { chunkType: DyNTS_DAI_CodeChunkType; name?: string } = this.detectDeclaration(statement);
239
+ const start: number = statement.getStart(sourceFile, /* includeJsDocComment */ true);
240
+ const end: number = statement.getEnd();
241
+ const text: string = code.substring(start, end);
242
+ const symbolSegments: string[] = detected.name ? [ `${detected.chunkType}:${detected.name}` ] : [];
243
+
244
+ // Nagy osztály → metódusonkénti bontás (osztály-fej + metódusok).
245
+ if (ts.isClassDeclaration(statement) && text.length > sizing.maxChunkSize) {
246
+ this.splitClassByMethods(statement, sourceFile, code, detected.name, blocks);
247
+ continue;
248
+ }
249
+
250
+ blocks.push({
251
+ text: text,
252
+ chunkType: detected.chunkType,
253
+ symbolSegments: symbolSegments,
254
+ symbolName: detected.name,
255
+ charStart: start,
256
+ charEnd: end,
257
+ });
258
+ }
259
+
260
+ // Maradék import-csoport (ha a fájl import-tal végződik).
261
+ flushImports();
262
+
263
+ return blocks;
264
+ }
265
+
266
+ /** `true`, ha a statement import / re-export (`export ... from`) — az import-csoporthoz. */
267
+ private static isImportLike(statement: ts.Statement): boolean {
268
+ if (ts.isImportDeclaration(statement) || ts.isImportEqualsDeclaration(statement)) {
269
+ return true;
258
270
  }
259
-
260
- // Maradék import-csoport (ha a fájl import-tal végződik).
261
- flushImports();
262
-
263
- return blocks;
264
- }
265
-
266
- /** `true`, ha a statement import / re-export (`export ... from`) — az import-csoporthoz. */
267
- private static isImportLike(statement: ts.Statement): boolean {
268
- if (ts.isImportDeclaration(statement) || ts.isImportEqualsDeclaration(statement)) {
269
- return true;
271
+
272
+ // `export { ... } from '...'` / `export * from '...'` — csak ha van moduleSpecifier.
273
+ if (ts.isExportDeclaration(statement) && !!statement.moduleSpecifier) {
274
+ return true;
270
275
  }
271
-
272
- // `export { ... } from '...'` / `export * from '...'` — csak ha van moduleSpecifier.
273
- if (ts.isExportDeclaration(statement) && !!statement.moduleSpecifier) {
274
- return true;
276
+
277
+ return false;
278
+ }
279
+
280
+ /** Egy top-level statement → szemantikus chunk-típus + symbol-név. */
281
+ private static detectDeclaration(statement: ts.Statement): { chunkType: DyNTS_DAI_CodeChunkType; name?: string } {
282
+ if (ts.isClassDeclaration(statement)) {
283
+ return { chunkType: 'class', name: statement.name?.getText() };
275
284
  }
276
-
277
- return false;
278
- }
279
-
280
- /** Egy top-level statement → szemantikus chunk-típus + symbol-név. */
281
- private static detectDeclaration(statement: ts.Statement): { chunkType: DyNTS_DAI_CodeChunkType; name?: string } {
282
- if (ts.isClassDeclaration(statement)) {
283
- return { chunkType: 'class', name: statement.name?.getText() };
285
+
286
+ if (ts.isInterfaceDeclaration(statement)) {
287
+ return { chunkType: 'interface', name: statement.name.getText() };
284
288
  }
285
-
286
- if (ts.isInterfaceDeclaration(statement)) {
287
- return { chunkType: 'interface', name: statement.name.getText() };
289
+
290
+ if (ts.isEnumDeclaration(statement)) {
291
+ return { chunkType: 'enum', name: statement.name.getText() };
288
292
  }
289
-
290
- if (ts.isEnumDeclaration(statement)) {
291
- return { chunkType: 'enum', name: statement.name.getText() };
292
- }
293
-
294
- if (ts.isTypeAliasDeclaration(statement)) {
295
- return { chunkType: 'type', name: statement.name.getText() };
293
+
294
+ if (ts.isTypeAliasDeclaration(statement)) {
295
+ return { chunkType: 'type', name: statement.name.getText() };
296
296
  }
297
-
298
- if (ts.isFunctionDeclaration(statement)) {
299
- return { chunkType: 'function', name: statement.name?.getText() };
297
+
298
+ if (ts.isFunctionDeclaration(statement)) {
299
+ return { chunkType: 'function', name: statement.name?.getText() };
300
300
  }
301
-
302
- if (ts.isVariableStatement(statement)) {
303
- const firstDecl: ts.VariableDeclaration | undefined = statement.declarationList.declarations[0];
304
- const name: string | undefined = firstDecl && ts.isIdentifier(firstDecl.name)
305
- ? firstDecl.name.getText()
306
- : undefined;
307
- // Ha a const egy függvény/arrow → 'function', egyébként 'variable'.
308
- const initializer: ts.Expression | undefined = firstDecl?.initializer;
309
- const isFn: boolean = !!initializer
301
+
302
+ if (ts.isVariableStatement(statement)) {
303
+ const firstDecl: ts.VariableDeclaration | undefined = statement.declarationList.declarations[0];
304
+ const name: string | undefined = firstDecl && ts.isIdentifier(firstDecl.name)
305
+ ? firstDecl.name.getText()
306
+ : undefined;
307
+ // Ha a const egy függvény/arrow → 'function', egyébként 'variable'.
308
+ const initializer: ts.Expression | undefined = firstDecl?.initializer;
309
+ const isFn: boolean = !!initializer
310
310
  && (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer));
311
-
312
- return { chunkType: isFn ? 'function' : 'variable', name: name };
311
+
312
+ return { chunkType: isFn ? 'function' : 'variable', name: name };
313
313
  }
314
-
315
- return { chunkType: 'generic', name: undefined };
316
- }
317
-
318
- /**
319
- * Nagy osztály metódusonkénti bontása. Az első chunk az osztály-fej (a class-kulcsszótól az első
320
- * tag előttig, dekorátorok + JSDoc-cal), majd minden metódus / property-deklaráció külön chunk a
321
- * `class:Foo > method:bar` symbol-lánccal.
322
- */
323
- private static splitClassByMethods(
324
- classDecl: ts.ClassDeclaration,
325
- sourceFile: ts.SourceFile,
326
- code: string,
327
- className: string | undefined,
328
- blocks: DyNTS_DAI_CodeBlock[]
329
- ): void {
330
- const classSegment: string = `class:${className ?? 'anonymous'}`;
331
- const classStart: number = classDecl.getStart(sourceFile, /* includeJsDocComment */ true);
332
-
333
- const members: ts.ClassElement[] = [ ...classDecl.members ];
334
-
335
- // Osztály-fej: a class kezdetétől az első tag kezdetéig (dekorátorok/JSDoc + `class X {`-rész).
336
- const headerEnd: number = members.length
337
- ? members[0].getStart(sourceFile, /* includeJsDocComment */ true)
338
- : classDecl.getEnd();
314
+
315
+ return { chunkType: 'generic', name: undefined };
316
+ }
317
+
318
+ /**
319
+ * Nagy osztály metódusonkénti bontása. Az első chunk az osztály-fej (a class-kulcsszótól az első
320
+ * tag előttig, dekorátorok + JSDoc-cal), majd minden metódus / property-deklaráció külön chunk a
321
+ * `class:Foo > method:bar` symbol-lánccal.
322
+ */
323
+ private static splitClassByMethods(
324
+ classDecl: ts.ClassDeclaration,
325
+ sourceFile: ts.SourceFile,
326
+ code: string,
327
+ className: string | undefined,
328
+ blocks: DyNTS_DAI_CodeBlock[]
329
+ ): void {
330
+ const classSegment: string = `class:${className ?? 'anonymous'}`;
331
+ const classStart: number = classDecl.getStart(sourceFile, /* includeJsDocComment */ true);
332
+
333
+ const members: ts.ClassElement[] = [ ...classDecl.members ];
334
+
335
+ // Osztály-fej: a class kezdetétől az első tag kezdetéig (dekorátorok/JSDoc + `class X {`-rész).
336
+ const headerEnd: number = members.length
337
+ ? members[0].getStart(sourceFile, /* includeJsDocComment */ true)
338
+ : classDecl.getEnd();
339
339
  const headerText: string = code.substring(classStart, headerEnd);
340
-
341
- if (headerText.trim().length) {
342
- blocks.push({
343
- text: headerText,
344
- chunkType: 'class',
345
- symbolSegments: [ classSegment ],
346
- symbolName: className,
347
- charStart: classStart,
348
- charEnd: headerEnd,
349
- });
350
- }
351
-
352
- // Tagonkénti chunk (metódus / accessor / property).
353
- for (const member of members) {
354
- const memberStart: number = member.getStart(sourceFile, /* includeJsDocComment */ true);
355
- const memberEnd: number = member.getEnd();
340
+
341
+ if (headerText.trim().length) {
342
+ blocks.push({
343
+ text: headerText,
344
+ chunkType: 'class',
345
+ symbolSegments: [ classSegment ],
346
+ symbolName: className,
347
+ charStart: classStart,
348
+ charEnd: headerEnd,
349
+ });
350
+ }
351
+
352
+ // Tagonkénti chunk (metódus / accessor / property).
353
+ for (const member of members) {
354
+ const memberStart: number = member.getStart(sourceFile, /* includeJsDocComment */ true);
355
+ const memberEnd: number = member.getEnd();
356
356
  const memberText: string = code.substring(memberStart, memberEnd);
357
-
358
- if (!memberText.trim().length) {
359
- continue;
360
- }
361
-
362
- const memberName: string | undefined = member.name && ts.isIdentifier(member.name)
363
- ? member.name.getText()
364
- : (member.name ? member.name.getText() : undefined);
365
- const memberKind: DyNTS_DAI_CodeChunkType = this.classMemberKind(member);
366
- const memberSegment: string = memberName
367
- ? `${memberKind}:${memberName}`
368
- : memberKind;
369
-
370
- blocks.push({
371
- text: memberText,
372
- chunkType: memberKind,
373
- symbolSegments: [ classSegment, memberSegment ],
374
- symbolName: memberName,
375
- charStart: memberStart,
376
- charEnd: memberEnd,
377
- });
378
- }
379
- }
380
-
381
- /** Egy osztály-tag → chunk-típus (metódus/accessor → 'method', mező → 'variable'). */
382
- private static classMemberKind(member: ts.ClassElement): DyNTS_DAI_CodeChunkType {
383
- if (
384
- ts.isMethodDeclaration(member)
385
- || ts.isConstructorDeclaration(member)
386
- || ts.isGetAccessorDeclaration(member)
387
- || ts.isSetAccessorDeclaration(member)
388
- ) {
389
- return 'method';
357
+
358
+ if (!memberText.trim().length) {
359
+ continue;
360
+ }
361
+
362
+ const memberName: string | undefined = member.name && ts.isIdentifier(member.name)
363
+ ? member.name.getText()
364
+ : (member.name ? member.name.getText() : undefined);
365
+ const memberKind: DyNTS_DAI_CodeChunkType = this.classMemberKind(member);
366
+ const memberSegment: string = memberName
367
+ ? `${memberKind}:${memberName}`
368
+ : memberKind;
369
+
370
+ blocks.push({
371
+ text: memberText,
372
+ chunkType: memberKind,
373
+ symbolSegments: [ classSegment, memberSegment ],
374
+ symbolName: memberName,
375
+ charStart: memberStart,
376
+ charEnd: memberEnd,
377
+ });
378
+ }
379
+ }
380
+
381
+ /** Egy osztály-tag → chunk-típus (metódus/accessor → 'method', mező → 'variable'). */
382
+ private static classMemberKind(member: ts.ClassElement): DyNTS_DAI_CodeChunkType {
383
+ if (
384
+ ts.isMethodDeclaration(member)
385
+ || ts.isConstructorDeclaration(member)
386
+ || ts.isGetAccessorDeclaration(member)
387
+ || ts.isSetAccessorDeclaration(member)
388
+ ) {
389
+ return 'method';
390
390
  }
391
-
392
- return 'variable';
393
- }
394
-
395
- /** Egy belső blokk → `DyNTS_DAI_CodeChunk` (pozíció + symbol-lánc kiszámolásával). */
396
- private static blockToChunk(
397
- block: DyNTS_DAI_CodeBlock,
398
- chunkIndex: number,
399
- lineStartOffsets: number[]
400
- ): DyNTS_DAI_CodeChunk {
401
- const lineStart: number = this.lineOfOffset(block.charStart, lineStartOffsets);
391
+
392
+ return 'variable';
393
+ }
394
+
395
+ /** Egy belső blokk → `DyNTS_DAI_CodeChunk` (pozíció + symbol-lánc kiszámolásával). */
396
+ private static blockToChunk(
397
+ block: DyNTS_DAI_CodeBlock,
398
+ chunkIndex: number,
399
+ lineStartOffsets: number[]
400
+ ): DyNTS_DAI_CodeChunk {
401
+ const lineStart: number = this.lineOfOffset(block.charStart, lineStartOffsets);
402
402
  const lineEnd: number = this.lineOfOffset(Math.max(block.charStart, block.charEnd - 1), lineStartOffsets);
403
-
404
- return {
405
- content: block.text,
406
- chunkType: block.chunkType,
407
- symbolPath: block.symbolSegments.join(' > '),
408
- symbolSegments: block.symbolSegments,
409
- symbolName: block.symbolName,
410
- lineStart: lineStart,
411
- lineEnd: lineEnd,
412
- charStart: block.charStart,
413
- charEnd: block.charEnd,
414
- chunkIndex: chunkIndex,
415
- };
416
- }
417
-
418
- /**
419
- * Túl nagy blokk karakter-alapú sliding-window sub-splitje (örökölt chunkType + symbol-lánc).
420
- * Az átfedés (`overlap`) karakter-szinten, a `minChunkSize` alatti farok-chunkokat kihagyja.
421
- */
422
- private static splitLargeBlock(
423
- block: DyNTS_DAI_CodeBlock,
424
- sizing: DyNTS_DAI_CodeChunking_Sizing,
425
- out: DyNTS_DAI_CodeChunk[],
426
- lineStartOffsets: number[]
427
- ): void {
428
- const text: string = block.text;
429
- const step: number = Math.max(1, sizing.maxChunkSize - sizing.overlap);
430
- let subChunkIndex: number = 0;
431
-
432
- for (let start: number = 0; start < text.length; start += step) {
433
- const end: number = Math.min(start + sizing.maxChunkSize, text.length);
434
- const slice: string = text.substring(start, end);
435
-
436
- // A nagyon kicsi farok-chunkot (az utolsó, ami már nem éri el a minChunkSize-t) kihagyjuk,
437
- // de csak ha NEM ez az egyetlen chunk.
438
- if (slice.trim().length < sizing.minChunkSize && subChunkIndex > 0) {
439
- break;
440
- }
441
-
442
- const absoluteCharStart: number = block.charStart + start;
443
- const absoluteCharEnd: number = block.charStart + end;
444
- const lineStart: number = this.lineOfOffset(absoluteCharStart, lineStartOffsets);
445
- const lineEnd: number = this.lineOfOffset(Math.max(absoluteCharStart, absoluteCharEnd - 1), lineStartOffsets);
446
-
447
- out.push({
448
- content: slice,
449
- chunkType: block.chunkType,
450
- symbolPath: block.symbolSegments.join(' > '),
451
- symbolSegments: block.symbolSegments,
452
- symbolName: block.symbolName,
453
- lineStart: lineStart,
454
- lineEnd: lineEnd,
455
- charStart: absoluteCharStart,
456
- charEnd: absoluteCharEnd,
457
- chunkIndex: out.length,
458
- subChunkIndex: subChunkIndex,
459
- });
460
- subChunkIndex++;
461
-
462
- if (end >= text.length) {
463
- break;
464
- }
465
- }
466
- }
467
-
468
- /**
469
- * Tiny / degenerált fallback: a teljes tartalmat egy (vagy nagy bemenetnél sliding) chunkba teszi.
470
- * Soha nem ad vissza üres listát nem-üres bemenetre — a tartalom megőrzése a cél.
471
- */
472
- private static buildFallbackChunks(content: string, sizing: DyNTS_DAI_CodeChunking_Sizing): DyNTS_DAI_CodeChunk[] {
403
+
404
+ return {
405
+ content: block.text,
406
+ chunkType: block.chunkType,
407
+ symbolPath: block.symbolSegments.join(' > '),
408
+ symbolSegments: block.symbolSegments,
409
+ symbolName: block.symbolName,
410
+ lineStart: lineStart,
411
+ lineEnd: lineEnd,
412
+ charStart: block.charStart,
413
+ charEnd: block.charEnd,
414
+ chunkIndex: chunkIndex,
415
+ };
416
+ }
417
+
418
+ /**
419
+ * Túl nagy blokk karakter-alapú sliding-window sub-splitje (örökölt chunkType + symbol-lánc).
420
+ * Az átfedés (`overlap`) karakter-szinten, a `minChunkSize` alatti farok-chunkokat kihagyja.
421
+ */
422
+ private static splitLargeBlock(
423
+ block: DyNTS_DAI_CodeBlock,
424
+ sizing: DyNTS_DAI_CodeChunking_Sizing,
425
+ out: DyNTS_DAI_CodeChunk[],
426
+ lineStartOffsets: number[]
427
+ ): void {
428
+ const text: string = block.text;
429
+ const step: number = Math.max(1, sizing.maxChunkSize - sizing.overlap);
430
+ let subChunkIndex: number = 0;
431
+
432
+ for (let start: number = 0; start < text.length; start += step) {
433
+ const end: number = Math.min(start + sizing.maxChunkSize, text.length);
434
+ const slice: string = text.substring(start, end);
435
+
436
+ // A nagyon kicsi farok-chunkot (az utolsó, ami már nem éri el a minChunkSize-t) kihagyjuk,
437
+ // de csak ha NEM ez az egyetlen chunk.
438
+ if (slice.trim().length < sizing.minChunkSize && subChunkIndex > 0) {
439
+ break;
440
+ }
441
+
442
+ const absoluteCharStart: number = block.charStart + start;
443
+ const absoluteCharEnd: number = block.charStart + end;
444
+ const lineStart: number = this.lineOfOffset(absoluteCharStart, lineStartOffsets);
445
+ const lineEnd: number = this.lineOfOffset(Math.max(absoluteCharStart, absoluteCharEnd - 1), lineStartOffsets);
446
+
447
+ out.push({
448
+ content: slice,
449
+ chunkType: block.chunkType,
450
+ symbolPath: block.symbolSegments.join(' > '),
451
+ symbolSegments: block.symbolSegments,
452
+ symbolName: block.symbolName,
453
+ lineStart: lineStart,
454
+ lineEnd: lineEnd,
455
+ charStart: absoluteCharStart,
456
+ charEnd: absoluteCharEnd,
457
+ chunkIndex: out.length,
458
+ subChunkIndex: subChunkIndex,
459
+ });
460
+ subChunkIndex++;
461
+
462
+ if (end >= text.length) {
463
+ break;
464
+ }
465
+ }
466
+ }
467
+
468
+ /**
469
+ * Tiny / degenerált fallback: a teljes tartalmat egy (vagy nagy bemenetnél sliding) chunkba teszi.
470
+ * Soha nem ad vissza üres listát nem-üres bemenetre — a tartalom megőrzése a cél.
471
+ */
472
+ private static buildFallbackChunks(content: string, sizing: DyNTS_DAI_CodeChunking_Sizing): DyNTS_DAI_CodeChunk[] {
473
473
  const trimmed: string = content.trim();
474
-
475
- if (!trimmed) {
476
- return [];
477
- }
478
-
479
- const lineStartOffsets: number[] = this.computeLineStartOffsets(content);
480
-
481
- // Kis tartalom → egyetlen fallback chunk.
482
- if (content.length <= sizing.maxChunkSize) {
474
+
475
+ if (!trimmed) {
476
+ return [];
477
+ }
478
+
479
+ const lineStartOffsets: number[] = this.computeLineStartOffsets(content);
480
+
481
+ // Kis tartalom → egyetlen fallback chunk.
482
+ if (content.length <= sizing.maxChunkSize) {
483
483
  const lineEnd: number = this.lineOfOffset(Math.max(0, content.length - 1), lineStartOffsets);
484
-
485
- return [{
486
- content: content,
487
- chunkType: 'fallback',
488
- symbolPath: '',
489
- symbolSegments: [],
490
- symbolName: undefined,
491
- lineStart: 1,
492
- lineEnd: lineEnd,
493
- charStart: 0,
494
- charEnd: content.length,
495
- chunkIndex: 0,
496
- }];
497
- }
498
-
499
- // Nagy, de nem-parse-olható tartalom → sliding-window fallback.
500
- const fallbackBlock: DyNTS_DAI_CodeBlock = {
501
- text: content,
502
- chunkType: 'fallback',
503
- symbolSegments: [],
504
- symbolName: undefined,
505
- charStart: 0,
506
- charEnd: content.length,
507
- };
484
+
485
+ return [{
486
+ content: content,
487
+ chunkType: 'fallback',
488
+ symbolPath: '',
489
+ symbolSegments: [],
490
+ symbolName: undefined,
491
+ lineStart: 1,
492
+ lineEnd: lineEnd,
493
+ charStart: 0,
494
+ charEnd: content.length,
495
+ chunkIndex: 0,
496
+ }];
497
+ }
498
+
499
+ // Nagy, de nem-parse-olható tartalom → sliding-window fallback.
500
+ const fallbackBlock: DyNTS_DAI_CodeBlock = {
501
+ text: content,
502
+ chunkType: 'fallback',
503
+ symbolSegments: [],
504
+ symbolName: undefined,
505
+ charStart: 0,
506
+ charEnd: content.length,
507
+ };
508
508
  const out: DyNTS_DAI_CodeChunk[] = [];
509
-
509
+
510
510
  this.splitLargeBlock(fallbackBlock, sizing, out, lineStartOffsets);
511
-
512
- return out;
513
- }
514
-
515
- /**
516
- * A forrás minden sorának kezdő karakter-offszetje (0-alapú). A `lineStartOffsets[i]` az `i`-edik
517
- * (0-alapú) sor első karakterének abszolút pozíciója — bináris kereséssel gyors `offset → sor`
518
- * konverziót ad a chunkokhoz.
519
- */
520
- private static computeLineStartOffsets(source: string): number[] {
511
+
512
+ return out;
513
+ }
514
+
515
+ /**
516
+ * A forrás minden sorának kezdő karakter-offszetje (0-alapú). A `lineStartOffsets[i]` az `i`-edik
517
+ * (0-alapú) sor első karakterének abszolút pozíciója — bináris kereséssel gyors `offset → sor`
518
+ * konverziót ad a chunkokhoz.
519
+ */
520
+ private static computeLineStartOffsets(source: string): number[] {
521
521
  const offsets: number[] = [ 0 ];
522
-
523
- for (let i: number = 0; i < source.length; i++) {
524
- if (source[i] === '\n') {
525
- offsets.push(i + 1);
526
- }
522
+
523
+ for (let i: number = 0; i < source.length; i++) {
524
+ if (source[i] === '\n') {
525
+ offsets.push(i + 1);
526
+ }
527
527
  }
528
-
529
- return offsets;
530
- }
531
-
532
- /**
533
- * Egy abszolút karakter-offszet → 1-alapú sorszám a forrásban (bináris keresés a
534
- * `lineStartOffsets`-ben). A sor-mezők így a forrás VALÓDI soraira mutatnak (nem chunk-relatív).
535
- */
536
- private static lineOfOffset(offset: number, lineStartOffsets: number[]): number {
537
- let lo: number = 0;
528
+
529
+ return offsets;
530
+ }
531
+
532
+ /**
533
+ * Egy abszolút karakter-offszet → 1-alapú sorszám a forrásban (bináris keresés a
534
+ * `lineStartOffsets`-ben). A sor-mezők így a forrás VALÓDI soraira mutatnak (nem chunk-relatív).
535
+ */
536
+ private static lineOfOffset(offset: number, lineStartOffsets: number[]): number {
537
+ let lo: number = 0;
538
538
  let hi: number = lineStartOffsets.length - 1;
539
-
540
- while (lo < hi) {
539
+
540
+ while (lo < hi) {
541
541
  const mid: number = (lo + hi + 1) >> 1;
542
-
543
- if (lineStartOffsets[mid] <= offset) {
544
- lo = mid;
545
- } else {
546
- hi = mid - 1;
547
- }
542
+
543
+ if (lineStartOffsets[mid] <= offset) {
544
+ lo = mid;
545
+ } else {
546
+ hi = mid - 1;
547
+ }
548
548
  }
549
-
550
- return lo + 1;
551
- }
552
- }
549
+
550
+ return lo + 1;
551
+ }
552
+ }