@futdevpro/nts-dynamo 1.15.83 → 1.15.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
- package/_specifications/BACKLOG.md +92 -92
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_modules/server/errors/errors.controller.d.ts.map +1 -1
- package/build/_modules/server/errors/errors.controller.js +12 -1
- package/build/_modules/server/errors/errors.controller.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +3 -3
- package/pnpm-workspace.yaml +5 -5
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/global-settings.const.ts +109 -109
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
- package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/global-settings.interface.ts +235 -235
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -115
- package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
- package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
- package/src/_modules/ai/index.ts +23 -23
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
- package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
- package/src/_modules/data-readers/index.ts +11 -11
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
- package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -198
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
- package/src/_modules/local-vector-search/index.ts +16 -16
- package/src/_modules/logs/index.ts +11 -11
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
- package/src/_modules/mcp/index.ts +13 -13
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
- package/src/_modules/scoped-config/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
- package/src/_modules/server/errors/errors.control-service.ts +100 -100
- package/src/_modules/server/errors/errors.controller.spec.ts +268 -268
- package/src/_modules/server/errors/errors.controller.ts +527 -515
- package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
- package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
- package/src/_modules/server/server-status/server-status.controller.spec.ts +255 -255
- package/src/_modules/server/server-status/server-status.controller.ts +272 -272
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +209 -209
- package/src/_services/base/archive-data.service.ts +224 -224
- package/src/_services/base/data.service.spec.ts +729 -729
- package/src/_services/base/data.service.ts +2740 -2740
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +292 -292
- package/src/_services/core/global.service.ts +487 -487
- package/src/_services/core/memory-guard.service.spec.ts +245 -245
- package/src/_services/core/memory-guard.service.ts +481 -481
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/server/app.server.ts +1905 -1905
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +97 -97
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
- package/.dynamo/logs/cicd-pipeline/output.log +0 -2791
- package/.dynamo/logs/cicd-pipeline/status.json +0 -94
|
@@ -5,229 +5,229 @@ import { DyFM_AI_Provider, DyFM_AI_ProviderCapabilities, DyFM_AI_Config } from '
|
|
|
5
5
|
import { DyFM_DAI_EmbeddingInfo } from '@futdevpro/fsm-dynamo/ai/document-ai';
|
|
6
6
|
|
|
7
7
|
import { DyNTS_AI_CostEventCallback } from '../_models/interfaces/dynts-ai-cost-event-callback.interface';
|
|
8
|
-
import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base';
|
|
9
|
-
|
|
10
|
-
/** A mock-embedding default dimenziója (kicsi, hogy a teszt-pool gyors legyen, de elég a koszinuszhoz). */
|
|
11
|
-
export const DyNTS_AI_MOCK_EMBEDDING_DIMS: number = 64;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A mock embedding-service config-set-je. A `dims` a generált vektor dimenziója (default
|
|
15
|
-
* `DyNTS_AI_MOCK_EMBEDDING_DIMS`), az `onCostEvent` a per-call cost-event sink (FR-002 / BFR-AM-007).
|
|
16
|
-
*/
|
|
17
|
-
export interface DyNTS_AI_Embedding_MockSettings {
|
|
18
|
-
/** A generált vektor dimenziója (default `DyNTS_AI_MOCK_EMBEDDING_DIMS`). */
|
|
19
|
-
dims?: number;
|
|
20
|
-
/** Per-call cost-event callback (FR-002 / BFR-AM-007). Non-breaking: ha undefined, nincs emit. */
|
|
21
|
-
onCostEvent?: DyNTS_AI_CostEventCallback;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* `DyNTS_AI_Embedding_MockService` (BFR-AM-008) — determinisztikus, hash-alapú, fix-dimenziós,
|
|
26
|
-
* l2-normalizált pszeudo-vektor a szövegből. Provider- és hálózat-mentes → a tesztek + a tsc-/offline-
|
|
27
|
-
* smoke valódi API-kulcs nélkül futnak. Azonos `(model, text)` → azonos vektor (idempotens), így a
|
|
28
|
-
* koszinusz-keresés determinisztikusan tesztelhető. A FAM `FAM_Mock_EmbeddingProvider` workaround-ját
|
|
29
|
-
* emeli bedrock-szintre, mint újrahasználható test-double.
|
|
30
|
-
*
|
|
31
|
-
* **Cost-event (BFR-AM-007):** minden call után `emitCostEvent`-tel jelez (fake token-fogyasztás,
|
|
32
|
-
* 4 char ≈ 1 token), provider `'mock'`, callType `embedding-single` / `embedding-batch`. Így a
|
|
33
|
-
* cost-aggregáló pipeline mock-providerrel is end-to-end tesztelhető.
|
|
34
|
-
*/
|
|
35
|
-
export class DyNTS_AI_Embedding_MockService extends DyNTS_AI_Embedding_ServiceBase {
|
|
36
|
-
|
|
37
|
-
/** A mock a `LocalAI` provider-enum alá tartozik (nincs külső hívás). */
|
|
38
|
-
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.LocalAI;
|
|
39
|
-
|
|
40
|
-
/** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */
|
|
41
|
-
protected readonly costProvider: string = 'mock';
|
|
42
|
-
|
|
43
|
-
/** Mock capability-k: csak embedding (determinisztikus). */
|
|
44
|
-
readonly capabilities: DyFM_AI_ProviderCapabilities = {
|
|
45
|
-
chat: false,
|
|
46
|
-
embeddings: true,
|
|
47
|
-
imageGeneration: false,
|
|
48
|
-
vision: false,
|
|
49
|
-
audioGeneration: false,
|
|
50
|
-
audioAnalysis: false,
|
|
51
|
-
functionCalling: false,
|
|
52
|
-
streaming: false,
|
|
53
|
-
batchOperations: true,
|
|
54
|
-
supportedModelTypes: [],
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/** A generált vektor dimenziója. */
|
|
58
|
-
protected dims: number;
|
|
59
|
-
|
|
60
|
-
/** @param set opcionális dims + onCostEvent. */
|
|
61
|
-
constructor(set?: DyNTS_AI_Embedding_MockSettings) {
|
|
62
|
-
super();
|
|
8
|
+
import { DyNTS_AI_Embedding_ServiceBase } from './ai-embedding.service-base';
|
|
9
|
+
|
|
10
|
+
/** A mock-embedding default dimenziója (kicsi, hogy a teszt-pool gyors legyen, de elég a koszinuszhoz). */
|
|
11
|
+
export const DyNTS_AI_MOCK_EMBEDDING_DIMS: number = 64;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A mock embedding-service config-set-je. A `dims` a generált vektor dimenziója (default
|
|
15
|
+
* `DyNTS_AI_MOCK_EMBEDDING_DIMS`), az `onCostEvent` a per-call cost-event sink (FR-002 / BFR-AM-007).
|
|
16
|
+
*/
|
|
17
|
+
export interface DyNTS_AI_Embedding_MockSettings {
|
|
18
|
+
/** A generált vektor dimenziója (default `DyNTS_AI_MOCK_EMBEDDING_DIMS`). */
|
|
19
|
+
dims?: number;
|
|
20
|
+
/** Per-call cost-event callback (FR-002 / BFR-AM-007). Non-breaking: ha undefined, nincs emit. */
|
|
21
|
+
onCostEvent?: DyNTS_AI_CostEventCallback;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* `DyNTS_AI_Embedding_MockService` (BFR-AM-008) — determinisztikus, hash-alapú, fix-dimenziós,
|
|
26
|
+
* l2-normalizált pszeudo-vektor a szövegből. Provider- és hálózat-mentes → a tesztek + a tsc-/offline-
|
|
27
|
+
* smoke valódi API-kulcs nélkül futnak. Azonos `(model, text)` → azonos vektor (idempotens), így a
|
|
28
|
+
* koszinusz-keresés determinisztikusan tesztelhető. A FAM `FAM_Mock_EmbeddingProvider` workaround-ját
|
|
29
|
+
* emeli bedrock-szintre, mint újrahasználható test-double.
|
|
30
|
+
*
|
|
31
|
+
* **Cost-event (BFR-AM-007):** minden call után `emitCostEvent`-tel jelez (fake token-fogyasztás,
|
|
32
|
+
* 4 char ≈ 1 token), provider `'mock'`, callType `embedding-single` / `embedding-batch`. Így a
|
|
33
|
+
* cost-aggregáló pipeline mock-providerrel is end-to-end tesztelhető.
|
|
34
|
+
*/
|
|
35
|
+
export class DyNTS_AI_Embedding_MockService extends DyNTS_AI_Embedding_ServiceBase {
|
|
36
|
+
|
|
37
|
+
/** A mock a `LocalAI` provider-enum alá tartozik (nincs külső hívás). */
|
|
38
|
+
readonly aiProvider: DyFM_AI_Provider = DyFM_AI_Provider.LocalAI;
|
|
39
|
+
|
|
40
|
+
/** A cost-event provider-string (a `DyNTS_AI_CostEvent.provider` szabad-string mezőjéhez). */
|
|
41
|
+
protected readonly costProvider: string = 'mock';
|
|
42
|
+
|
|
43
|
+
/** Mock capability-k: csak embedding (determinisztikus). */
|
|
44
|
+
readonly capabilities: DyFM_AI_ProviderCapabilities = {
|
|
45
|
+
chat: false,
|
|
46
|
+
embeddings: true,
|
|
47
|
+
imageGeneration: false,
|
|
48
|
+
vision: false,
|
|
49
|
+
audioGeneration: false,
|
|
50
|
+
audioAnalysis: false,
|
|
51
|
+
functionCalling: false,
|
|
52
|
+
streaming: false,
|
|
53
|
+
batchOperations: true,
|
|
54
|
+
supportedModelTypes: [],
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** A generált vektor dimenziója. */
|
|
58
|
+
protected dims: number;
|
|
59
|
+
|
|
60
|
+
/** @param set opcionális dims + onCostEvent. */
|
|
61
|
+
constructor(set?: DyNTS_AI_Embedding_MockSettings) {
|
|
62
|
+
super();
|
|
63
63
|
this.dims = set?.dims && set.dims > 0 ? set.dims : DyNTS_AI_MOCK_EMBEDDING_DIMS;
|
|
64
|
-
|
|
65
|
-
if (set?.onCostEvent) {
|
|
66
|
-
this.onCostEvent = set.onCostEvent;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** A mock-nak nincs külső config-ja; a `setup` a dimenzió override-jára szolgál (config.dimensions). */
|
|
71
|
-
setup(config: DyFM_AI_Config): void {
|
|
64
|
+
|
|
65
|
+
if (set?.onCostEvent) {
|
|
66
|
+
this.onCostEvent = set.onCostEvent;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** A mock-nak nincs külső config-ja; a `setup` a dimenzió override-jára szolgál (config.dimensions). */
|
|
71
|
+
setup(config: DyFM_AI_Config): void {
|
|
72
72
|
const dims: unknown = Reflect.get(config ?? {}, 'dimensions');
|
|
73
|
-
|
|
74
|
-
if (typeof dims === 'number' && dims > 0) {
|
|
75
|
-
this.dims = dims;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Egy determinisztikus embedding. A `model`-t beleszövi a seed-be, hogy modell-váltás más vektort
|
|
81
|
-
* adjon (re-embed teszteléshez). `fullResponse=true` → OpenAI-alakú válasz-objektum.
|
|
82
|
-
*/
|
|
83
|
-
async createEmbedding(
|
|
84
|
-
set: {
|
|
85
|
-
text: string;
|
|
86
|
-
model: string;
|
|
87
|
-
fullResponse?: boolean;
|
|
88
|
-
issuer: string;
|
|
89
|
-
}
|
|
90
|
-
): Promise<number[] | CreateEmbeddingResponse> {
|
|
91
|
-
const start: number = Date.now();
|
|
92
|
-
const vector: number[] = this.deterministicVector(`${set.model}::${set.text ?? ''}`);
|
|
93
|
-
const durationMs: number = Date.now() - start;
|
|
94
|
-
|
|
95
|
-
this.emitMockCostEvent('embedding-single', set.model, [ set.text ?? '' ], durationMs, set.issuer);
|
|
96
|
-
|
|
97
|
-
if (set.fullResponse) {
|
|
98
|
-
return this.toResponse([ vector ], set.model, [ set.text ?? '' ]);
|
|
73
|
+
|
|
74
|
+
if (typeof dims === 'number' && dims > 0) {
|
|
75
|
+
this.dims = dims;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Egy determinisztikus embedding. A `model`-t beleszövi a seed-be, hogy modell-váltás más vektort
|
|
81
|
+
* adjon (re-embed teszteléshez). `fullResponse=true` → OpenAI-alakú válasz-objektum.
|
|
82
|
+
*/
|
|
83
|
+
async createEmbedding(
|
|
84
|
+
set: {
|
|
85
|
+
text: string;
|
|
86
|
+
model: string;
|
|
87
|
+
fullResponse?: boolean;
|
|
88
|
+
issuer: string;
|
|
89
|
+
}
|
|
90
|
+
): Promise<number[] | CreateEmbeddingResponse> {
|
|
91
|
+
const start: number = Date.now();
|
|
92
|
+
const vector: number[] = this.deterministicVector(`${set.model}::${set.text ?? ''}`);
|
|
93
|
+
const durationMs: number = Date.now() - start;
|
|
94
|
+
|
|
95
|
+
this.emitMockCostEvent('embedding-single', set.model, [ set.text ?? '' ], durationMs, set.issuer);
|
|
96
|
+
|
|
97
|
+
if (set.fullResponse) {
|
|
98
|
+
return this.toResponse([ vector ], set.model, [ set.text ?? '' ]);
|
|
99
99
|
}
|
|
100
|
-
|
|
101
|
-
return vector;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Determinisztikus batch-embedding: minden szöveghez a `(model, text)` seed-ből generál egy fix-
|
|
106
|
-
* dimenziós, l2-normalizált vektort. A `texts` sorrendje == a visszaadott `number[][]` sorrendje.
|
|
107
|
-
*/
|
|
108
|
-
async createEmbeddings(
|
|
109
|
-
set: {
|
|
110
|
-
texts: string[];
|
|
111
|
-
model: string;
|
|
112
|
-
fullResponse?: boolean;
|
|
113
|
-
issuer: string;
|
|
114
|
-
}
|
|
115
|
-
): Promise<number[][] | CreateEmbeddingResponse> {
|
|
116
|
-
const texts: string[] = set.texts ?? [];
|
|
117
|
-
const start: number = Date.now();
|
|
118
|
-
const vectors: number[][] = texts.map((text) => this.deterministicVector(`${set.model}::${text}`));
|
|
119
|
-
const durationMs: number = Date.now() - start;
|
|
120
|
-
|
|
121
|
-
this.emitMockCostEvent('embedding-batch', set.model, texts, durationMs, set.issuer);
|
|
122
|
-
|
|
123
|
-
if (set.fullResponse) {
|
|
124
|
-
return this.toResponse(vectors, set.model, texts);
|
|
100
|
+
|
|
101
|
+
return vector;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Determinisztikus batch-embedding: minden szöveghez a `(model, text)` seed-ből generál egy fix-
|
|
106
|
+
* dimenziós, l2-normalizált vektort. A `texts` sorrendje == a visszaadott `number[][]` sorrendje.
|
|
107
|
+
*/
|
|
108
|
+
async createEmbeddings(
|
|
109
|
+
set: {
|
|
110
|
+
texts: string[];
|
|
111
|
+
model: string;
|
|
112
|
+
fullResponse?: boolean;
|
|
113
|
+
issuer: string;
|
|
114
|
+
}
|
|
115
|
+
): Promise<number[][] | CreateEmbeddingResponse> {
|
|
116
|
+
const texts: string[] = set.texts ?? [];
|
|
117
|
+
const start: number = Date.now();
|
|
118
|
+
const vectors: number[][] = texts.map((text) => this.deterministicVector(`${set.model}::${text}`));
|
|
119
|
+
const durationMs: number = Date.now() - start;
|
|
120
|
+
|
|
121
|
+
this.emitMockCostEvent('embedding-batch', set.model, texts, durationMs, set.issuer);
|
|
122
|
+
|
|
123
|
+
if (set.fullResponse) {
|
|
124
|
+
return this.toResponse(vectors, set.model, texts);
|
|
125
125
|
}
|
|
126
|
-
|
|
127
|
-
return vectors;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** Embedding model-info: provider `LocalAI`, model a megadott azonosító. */
|
|
131
|
-
getEmbeddingInfo(model: string): DyFM_DAI_EmbeddingInfo {
|
|
132
|
-
return {
|
|
133
|
-
provider: DyFM_AI_Provider.LocalAI,
|
|
134
|
-
model: model,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/** A mock mindig elérhető (nincs külső függőség). */
|
|
139
|
-
async testConnection(_issuer: string): Promise<boolean> {
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// =========================================================================
|
|
144
|
-
// belső: determinisztikus vektor + cost-event + response-alak
|
|
145
|
-
// =========================================================================
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Egy determinisztikus, l2-normalizált vektor a seed-ből. A SHA-256 hash bájtjait körkörösen
|
|
149
|
-
* használja a `dims` kitöltésére, [-1, 1) tartományra képzi, majd l2-normalizál (egységhossz a
|
|
150
|
-
* koszinuszhoz). Egy második hash-bájttal kever, hogy a hosszabb dimenziókon ne ismétlődjön a minta.
|
|
151
|
-
*/
|
|
152
|
-
protected deterministicVector(seed: string): number[] {
|
|
153
|
-
const hash: Buffer = crypto.createHash('sha256').update(seed).digest();
|
|
126
|
+
|
|
127
|
+
return vectors;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Embedding model-info: provider `LocalAI`, model a megadott azonosító. */
|
|
131
|
+
getEmbeddingInfo(model: string): DyFM_DAI_EmbeddingInfo {
|
|
132
|
+
return {
|
|
133
|
+
provider: DyFM_AI_Provider.LocalAI,
|
|
134
|
+
model: model,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A mock mindig elérhető (nincs külső függőség). */
|
|
139
|
+
async testConnection(_issuer: string): Promise<boolean> {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// =========================================================================
|
|
144
|
+
// belső: determinisztikus vektor + cost-event + response-alak
|
|
145
|
+
// =========================================================================
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Egy determinisztikus, l2-normalizált vektor a seed-ből. A SHA-256 hash bájtjait körkörösen
|
|
149
|
+
* használja a `dims` kitöltésére, [-1, 1) tartományra képzi, majd l2-normalizál (egységhossz a
|
|
150
|
+
* koszinuszhoz). Egy második hash-bájttal kever, hogy a hosszabb dimenziókon ne ismétlődjön a minta.
|
|
151
|
+
*/
|
|
152
|
+
protected deterministicVector(seed: string): number[] {
|
|
153
|
+
const hash: Buffer = crypto.createHash('sha256').update(seed).digest();
|
|
154
154
|
const vector: number[] = [];
|
|
155
|
-
|
|
156
|
-
for (let i = 0; i < this.dims; i++) {
|
|
157
|
-
const byte: number = hash[i % hash.length];
|
|
158
|
-
const mix: number = hash[(i * 7 + 3) % hash.length];
|
|
155
|
+
|
|
156
|
+
for (let i = 0; i < this.dims; i++) {
|
|
157
|
+
const byte: number = hash[i % hash.length];
|
|
158
|
+
const mix: number = hash[(i * 7 + 3) % hash.length];
|
|
159
159
|
const combined: number = (byte ^ mix) & 0xff;
|
|
160
|
-
|
|
161
|
-
vector.push((combined / 255) * 2 - 1);
|
|
160
|
+
|
|
161
|
+
vector.push((combined / 255) * 2 - 1);
|
|
162
162
|
}
|
|
163
|
-
|
|
164
|
-
return this.l2Normalize(vector);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** L2-normalizálás (egységhossz). Nulla-vektor → változatlan (elkerüli a 0-osztást). */
|
|
168
|
-
protected l2Normalize(vector: number[]): number[] {
|
|
163
|
+
|
|
164
|
+
return this.l2Normalize(vector);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** L2-normalizálás (egységhossz). Nulla-vektor → változatlan (elkerüli a 0-osztást). */
|
|
168
|
+
protected l2Normalize(vector: number[]): number[] {
|
|
169
169
|
let sumSq: number = 0;
|
|
170
|
-
|
|
171
|
-
for (const value of vector) {
|
|
172
|
-
sumSq += value * value;
|
|
173
|
-
}
|
|
170
|
+
|
|
171
|
+
for (const value of vector) {
|
|
172
|
+
sumSq += value * value;
|
|
173
|
+
}
|
|
174
174
|
const norm: number = Math.sqrt(sumSq);
|
|
175
|
-
|
|
176
|
-
if (!norm) {
|
|
177
|
-
return vector;
|
|
175
|
+
|
|
176
|
+
if (!norm) {
|
|
177
|
+
return vector;
|
|
178
178
|
}
|
|
179
|
-
|
|
180
|
-
return vector.map((value) => value / norm);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** OpenAI-alakú válasz-objektum a vektorokból (a `fullResponse=true` ághoz). */
|
|
184
|
-
protected toResponse(vectors: number[][], model: string, texts: string[]): CreateEmbeddingResponse {
|
|
179
|
+
|
|
180
|
+
return vector.map((value) => value / norm);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** OpenAI-alakú válasz-objektum a vektorokból (a `fullResponse=true` ághoz). */
|
|
184
|
+
protected toResponse(vectors: number[][], model: string, texts: string[]): CreateEmbeddingResponse {
|
|
185
185
|
const tokens: number = this.estimateTokens(texts);
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
object: 'list',
|
|
189
|
-
model: model,
|
|
190
|
-
data: vectors.map((embedding, index) => ({ object: 'embedding', embedding: embedding, index: index })),
|
|
191
|
-
usage: {
|
|
192
|
-
prompt_tokens: tokens,
|
|
193
|
-
total_tokens: tokens,
|
|
194
|
-
},
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/** Cost-event emit (BFR-AM-007) fake tokennel (4 char ≈ 1 token), provider `'mock'`. */
|
|
199
|
-
protected emitMockCostEvent(
|
|
200
|
-
callType: 'embedding-single' | 'embedding-batch',
|
|
201
|
-
model: string,
|
|
202
|
-
texts: string[],
|
|
203
|
-
durationMs: number,
|
|
204
|
-
issuer: string,
|
|
205
|
-
): void {
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
object: 'list',
|
|
189
|
+
model: model,
|
|
190
|
+
data: vectors.map((embedding, index) => ({ object: 'embedding', embedding: embedding, index: index })),
|
|
191
|
+
usage: {
|
|
192
|
+
prompt_tokens: tokens,
|
|
193
|
+
total_tokens: tokens,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Cost-event emit (BFR-AM-007) fake tokennel (4 char ≈ 1 token), provider `'mock'`. */
|
|
199
|
+
protected emitMockCostEvent(
|
|
200
|
+
callType: 'embedding-single' | 'embedding-batch',
|
|
201
|
+
model: string,
|
|
202
|
+
texts: string[],
|
|
203
|
+
durationMs: number,
|
|
204
|
+
issuer: string,
|
|
205
|
+
): void {
|
|
206
206
|
const tokens: number = this.estimateTokens(texts);
|
|
207
|
-
|
|
208
|
-
this.emitCostEvent({
|
|
209
|
-
callType: callType,
|
|
210
|
-
provider: this.costProvider,
|
|
211
|
-
model: model,
|
|
212
|
-
tokensUsed: {
|
|
213
|
-
input: tokens,
|
|
214
|
-
total: tokens,
|
|
215
|
-
},
|
|
216
|
-
durationMs: durationMs,
|
|
217
|
-
issuer: issuer,
|
|
218
|
-
timestamp: new Date(),
|
|
219
|
-
estimatedCostUsd: 0,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/** Becsült (fake) token-szám: 4 char ≈ 1 token. */
|
|
224
|
-
protected estimateTokens(texts: string[]): number {
|
|
207
|
+
|
|
208
|
+
this.emitCostEvent({
|
|
209
|
+
callType: callType,
|
|
210
|
+
provider: this.costProvider,
|
|
211
|
+
model: model,
|
|
212
|
+
tokensUsed: {
|
|
213
|
+
input: tokens,
|
|
214
|
+
total: tokens,
|
|
215
|
+
},
|
|
216
|
+
durationMs: durationMs,
|
|
217
|
+
issuer: issuer,
|
|
218
|
+
timestamp: new Date(),
|
|
219
|
+
estimatedCostUsd: 0,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Becsült (fake) token-szám: 4 char ≈ 1 token. */
|
|
224
|
+
protected estimateTokens(texts: string[]): number {
|
|
225
225
|
let chars: number = 0;
|
|
226
|
-
|
|
227
|
-
for (const text of texts) {
|
|
228
|
-
chars += (text ?? '').length;
|
|
226
|
+
|
|
227
|
+
for (const text of texts) {
|
|
228
|
+
chars += (text ?? '').length;
|
|
229
229
|
}
|
|
230
|
-
|
|
231
|
-
return Math.max(1, Math.ceil(chars / 4));
|
|
232
|
-
}
|
|
233
|
-
}
|
|
230
|
+
|
|
231
|
+
return Math.max(1, Math.ceil(chars / 4));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
import { DyNTS_AI_EmbeddingProvider_Registry } from './ai-embedding-provider.registry';
|
|
2
|
-
import { DyNTS_LMStudio_Embedding_ControlService } from './lmstudio-embedding.control-service';
|
|
3
|
-
import { DyNTS_AI_Embedding_MockService } from './ai-embedding-mock.service';
|
|
4
|
-
import { DyNTS_OAI_Embedding_ControlService } from '../_modules/open-ai/_services/oai-embedding.control-service';
|
|
5
|
-
|
|
6
|
-
describe('| DyNTS_AI_EmbeddingProvider_Registry', () => {
|
|
7
|
-
|
|
8
|
-
/** Az env-mező visszaállításához (a normalizeKey env-feloldás-ágához). */
|
|
9
|
-
let savedProviderEnv: string | undefined;
|
|
10
|
-
let savedBaseUrlEnv: string | undefined;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
savedProviderEnv = process.env.AI_EMBEDDING_PROVIDER;
|
|
14
|
-
savedBaseUrlEnv = process.env.LMSTUDIO_BASE_URL;
|
|
15
|
-
delete process.env.AI_EMBEDDING_PROVIDER;
|
|
16
|
-
delete process.env.LMSTUDIO_BASE_URL;
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
if (savedProviderEnv === undefined) {
|
|
21
|
-
delete process.env.AI_EMBEDDING_PROVIDER;
|
|
22
|
-
} else {
|
|
23
|
-
process.env.AI_EMBEDDING_PROVIDER = savedProviderEnv;
|
|
24
|
-
}
|
|
25
|
-
if (savedBaseUrlEnv === undefined) {
|
|
26
|
-
delete process.env.LMSTUDIO_BASE_URL;
|
|
27
|
-
} else {
|
|
28
|
-
process.env.LMSTUDIO_BASE_URL = savedBaseUrlEnv;
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('| normalizeKey', () => {
|
|
33
|
-
it('| should resolve openai aliases', () => {
|
|
34
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('openai')).toBe('openai');
|
|
35
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('OpenAI')).toBe('openai');
|
|
36
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('open-ai')).toBe('openai');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('| should resolve lmstudio aliases', () => {
|
|
40
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('lmstudio')).toBe('lmstudio');
|
|
41
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('lm-studio')).toBe('lmstudio');
|
|
42
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('local-ai')).toBe('lmstudio');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('| should resolve mock aliases', () => {
|
|
46
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('mock')).toBe('mock');
|
|
47
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('test')).toBe('mock');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('| should default to openai when no provider and no env', () => {
|
|
51
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey()).toBe('openai');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('| should fall back to the AI_EMBEDDING_PROVIDER env var', () => {
|
|
55
|
-
process.env.AI_EMBEDDING_PROVIDER = 'mock';
|
|
56
|
-
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey()).toBe('mock');
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('| should throw on an unknown provider', () => {
|
|
60
|
-
expect(() => DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('gemini')).toThrow();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('| resolve', () => {
|
|
65
|
-
it('| should resolve the openai provider to DyNTS_OAI_Embedding_ControlService', () => {
|
|
66
|
-
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
67
|
-
provider: 'openai',
|
|
68
|
-
openAiSettings: { config: { apiKey: 'test-key' } },
|
|
69
|
-
});
|
|
70
|
-
expect(service).toBeInstanceOf(DyNTS_OAI_Embedding_ControlService);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('| should resolve the lmstudio provider to DyNTS_LMStudio_Embedding_ControlService', () => {
|
|
74
|
-
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
75
|
-
provider: 'lmstudio',
|
|
76
|
-
lmStudioSettings: { baseUrl: 'http://localhost:1234/v1' },
|
|
77
|
-
});
|
|
78
|
-
expect(service).toBeInstanceOf(DyNTS_LMStudio_Embedding_ControlService);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('| should resolve the lmstudio baseUrl from the LMSTUDIO_BASE_URL env var', () => {
|
|
82
|
-
process.env.LMSTUDIO_BASE_URL = 'http://localhost:5678/v1';
|
|
83
|
-
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'lmstudio' });
|
|
84
|
-
expect(service).toBeInstanceOf(DyNTS_LMStudio_Embedding_ControlService);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('| should throw if lmstudio is selected without a baseUrl', () => {
|
|
88
|
-
expect(() => DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'lmstudio' })).toThrow();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('| should resolve the mock provider to DyNTS_AI_Embedding_MockService', () => {
|
|
92
|
-
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'mock' });
|
|
93
|
-
expect(service).toBeInstanceOf(DyNTS_AI_Embedding_MockService);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it('| should pass the cost-event sink through to the mock provider', async () => {
|
|
97
|
-
const events: string[] = [];
|
|
98
|
-
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
99
|
-
provider: 'mock',
|
|
100
|
-
onCostEvent: (event) => events.push(event.provider),
|
|
101
|
-
});
|
|
102
|
-
await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: 'test' });
|
|
103
|
-
expect(events).toEqual(['mock']);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('| should throw on an unknown provider in resolve', () => {
|
|
107
|
-
expect(() => DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'cohere' })).toThrow();
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
});
|
|
1
|
+
import { DyNTS_AI_EmbeddingProvider_Registry } from './ai-embedding-provider.registry';
|
|
2
|
+
import { DyNTS_LMStudio_Embedding_ControlService } from './lmstudio-embedding.control-service';
|
|
3
|
+
import { DyNTS_AI_Embedding_MockService } from './ai-embedding-mock.service';
|
|
4
|
+
import { DyNTS_OAI_Embedding_ControlService } from '../_modules/open-ai/_services/oai-embedding.control-service';
|
|
5
|
+
|
|
6
|
+
describe('| DyNTS_AI_EmbeddingProvider_Registry', () => {
|
|
7
|
+
|
|
8
|
+
/** Az env-mező visszaállításához (a normalizeKey env-feloldás-ágához). */
|
|
9
|
+
let savedProviderEnv: string | undefined;
|
|
10
|
+
let savedBaseUrlEnv: string | undefined;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
savedProviderEnv = process.env.AI_EMBEDDING_PROVIDER;
|
|
14
|
+
savedBaseUrlEnv = process.env.LMSTUDIO_BASE_URL;
|
|
15
|
+
delete process.env.AI_EMBEDDING_PROVIDER;
|
|
16
|
+
delete process.env.LMSTUDIO_BASE_URL;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
if (savedProviderEnv === undefined) {
|
|
21
|
+
delete process.env.AI_EMBEDDING_PROVIDER;
|
|
22
|
+
} else {
|
|
23
|
+
process.env.AI_EMBEDDING_PROVIDER = savedProviderEnv;
|
|
24
|
+
}
|
|
25
|
+
if (savedBaseUrlEnv === undefined) {
|
|
26
|
+
delete process.env.LMSTUDIO_BASE_URL;
|
|
27
|
+
} else {
|
|
28
|
+
process.env.LMSTUDIO_BASE_URL = savedBaseUrlEnv;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('| normalizeKey', () => {
|
|
33
|
+
it('| should resolve openai aliases', () => {
|
|
34
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('openai')).toBe('openai');
|
|
35
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('OpenAI')).toBe('openai');
|
|
36
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('open-ai')).toBe('openai');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('| should resolve lmstudio aliases', () => {
|
|
40
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('lmstudio')).toBe('lmstudio');
|
|
41
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('lm-studio')).toBe('lmstudio');
|
|
42
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('local-ai')).toBe('lmstudio');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('| should resolve mock aliases', () => {
|
|
46
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('mock')).toBe('mock');
|
|
47
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('test')).toBe('mock');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('| should default to openai when no provider and no env', () => {
|
|
51
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey()).toBe('openai');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('| should fall back to the AI_EMBEDDING_PROVIDER env var', () => {
|
|
55
|
+
process.env.AI_EMBEDDING_PROVIDER = 'mock';
|
|
56
|
+
expect(DyNTS_AI_EmbeddingProvider_Registry.normalizeKey()).toBe('mock');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('| should throw on an unknown provider', () => {
|
|
60
|
+
expect(() => DyNTS_AI_EmbeddingProvider_Registry.normalizeKey('gemini')).toThrow();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('| resolve', () => {
|
|
65
|
+
it('| should resolve the openai provider to DyNTS_OAI_Embedding_ControlService', () => {
|
|
66
|
+
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
67
|
+
provider: 'openai',
|
|
68
|
+
openAiSettings: { config: { apiKey: 'test-key' } },
|
|
69
|
+
});
|
|
70
|
+
expect(service).toBeInstanceOf(DyNTS_OAI_Embedding_ControlService);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('| should resolve the lmstudio provider to DyNTS_LMStudio_Embedding_ControlService', () => {
|
|
74
|
+
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
75
|
+
provider: 'lmstudio',
|
|
76
|
+
lmStudioSettings: { baseUrl: 'http://localhost:1234/v1' },
|
|
77
|
+
});
|
|
78
|
+
expect(service).toBeInstanceOf(DyNTS_LMStudio_Embedding_ControlService);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('| should resolve the lmstudio baseUrl from the LMSTUDIO_BASE_URL env var', () => {
|
|
82
|
+
process.env.LMSTUDIO_BASE_URL = 'http://localhost:5678/v1';
|
|
83
|
+
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'lmstudio' });
|
|
84
|
+
expect(service).toBeInstanceOf(DyNTS_LMStudio_Embedding_ControlService);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('| should throw if lmstudio is selected without a baseUrl', () => {
|
|
88
|
+
expect(() => DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'lmstudio' })).toThrow();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('| should resolve the mock provider to DyNTS_AI_Embedding_MockService', () => {
|
|
92
|
+
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'mock' });
|
|
93
|
+
expect(service).toBeInstanceOf(DyNTS_AI_Embedding_MockService);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('| should pass the cost-event sink through to the mock provider', async () => {
|
|
97
|
+
const events: string[] = [];
|
|
98
|
+
const service = DyNTS_AI_EmbeddingProvider_Registry.resolve({
|
|
99
|
+
provider: 'mock',
|
|
100
|
+
onCostEvent: (event) => events.push(event.provider),
|
|
101
|
+
});
|
|
102
|
+
await service.createEmbeddings({ texts: ['x'], model: 'm', issuer: 'test' });
|
|
103
|
+
expect(events).toEqual(['mock']);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('| should throw on an unknown provider in resolve', () => {
|
|
107
|
+
expect(() => DyNTS_AI_EmbeddingProvider_Registry.resolve({ provider: 'cohere' })).toThrow();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|