@futdevpro/fsm-dynamo 1.20.92 → 1.20.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/_models/control-models/data-model-params.control-model.d.ts +0 -1
- package/build/_models/control-models/data-model-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/data-model-params.control-model.js +1 -4
- package/build/_models/control-models/data-model-params.control-model.js.map +1 -1
- package/build/_models/control-models/data-property-params.control-model.d.ts +0 -1
- package/build/_models/control-models/data-property-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/data-property-params.control-model.js +1 -4
- package/build/_models/control-models/data-property-params.control-model.js.map +1 -1
- package/build/_models/control-models/service-endpoint-settings-base.control-model.d.ts +0 -1
- package/build/_models/control-models/service-endpoint-settings-base.control-model.d.ts.map +1 -1
- package/build/_models/control-models/service-endpoint-settings-base.control-model.js +4 -4
- package/build/_models/control-models/service-endpoint-settings-base.control-model.js.map +1 -1
- package/build/_modules/data-handler/_models/data-handler-settings.control-model.d.ts +0 -3
- package/build/_modules/data-handler/_models/data-handler-settings.control-model.d.ts.map +1 -1
- package/build/_modules/data-handler/_models/data-handler-settings.control-model.js +4 -10
- package/build/_modules/data-handler/_models/data-handler-settings.control-model.js.map +1 -1
- package/build/_modules/data-handler/_models/data-list-handler.control-model.d.ts +1 -1
- package/build/_modules/data-handler/_models/data-list-handler.control-model.d.ts.map +1 -1
- package/build/_modules/data-handler/_models/data-search-handler.control-model.d.ts +1 -1
- package/build/_modules/data-handler/_models/data-search-handler.control-model.d.ts.map +1 -1
- package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.d.ts +1 -1
- package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.d.ts.map +1 -1
- package/build/_modules/data-handler/index.d.ts +3 -0
- package/build/_modules/data-handler/index.d.ts.map +1 -1
- package/build/_modules/data-handler/index.js +3 -0
- package/build/_modules/data-handler/index.js.map +1 -1
- package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.d.ts +0 -3
- package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.d.ts.map +1 -1
- package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js +4 -10
- package/build/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js.map +1 -1
- package/build/_modules/ngx-models/index.d.ts +3 -0
- package/build/_modules/ngx-models/index.d.ts.map +1 -1
- package/build/_modules/ngx-models/index.js +3 -0
- package/build/_modules/ngx-models/index.js.map +1 -1
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/build-esm/_collections/constants/data-sizes.const.js +37 -0
- package/build-esm/_collections/constants/error-defaults.const.js +17 -0
- package/build-esm/_collections/constants/global-settings.const.js +17 -0
- package/build-esm/_collections/constants/numbers.const.js +36 -0
- package/build-esm/_collections/constants/times.const.js +38 -0
- package/build-esm/_collections/utils/array.util.js +632 -0
- package/build-esm/_collections/utils/async.util.js +183 -0
- package/build-esm/_collections/utils/data.util.js +203 -0
- package/build-esm/_collections/utils/extract-error-message.util.js +183 -0
- package/build-esm/_collections/utils/json-error-helper.util.js +251 -0
- package/build-esm/_collections/utils/log.util.js +555 -0
- package/build-esm/_collections/utils/math/box-bounds.util.js +159 -0
- package/build-esm/_collections/utils/math/math.util.js +183 -0
- package/build-esm/_collections/utils/math/random.util.js +117 -0
- package/build-esm/_collections/utils/math/trigonometry.util.js +89 -0
- package/build-esm/_collections/utils/math/vector2.util.js +587 -0
- package/build-esm/_collections/utils/object.util.js +591 -0
- package/build-esm/_collections/utils/operation-authz.util.js +136 -0
- package/build-esm/_collections/utils/operation-guardrails.util.js +220 -0
- package/build-esm/_collections/utils/operation-run.util.js +81 -0
- package/build-esm/_collections/utils/operation-schema.util.js +159 -0
- package/build-esm/_collections/utils/regex/password-regex.util.js +56 -0
- package/build-esm/_collections/utils/regex/regex.util.js +1 -0
- package/build-esm/_collections/utils/regex/username-regex.util.js +28 -0
- package/build-esm/_collections/utils/require-env.util.js +90 -0
- package/build-esm/_collections/utils/round-list.util.js +108 -0
- package/build-esm/_collections/utils/secret-mask.util.js +219 -0
- package/build-esm/_collections/utils/stack.util.js +126 -0
- package/build-esm/_collections/utils/string-case.util.js +332 -0
- package/build-esm/_collections/utils/string.util.js +366 -0
- package/build-esm/_collections/utils/time.util.js +431 -0
- package/build-esm/_collections/utils/type-cloning-facility.util.js +122 -0
- package/build-esm/_collections/utils/utilities.util.js +61 -0
- package/build-esm/_collections/utils/uuid.util.js +33 -0
- package/build-esm/_enums/basic-property-type.enum.js +18 -0
- package/build-esm/_enums/data-model-type.enum.js +24 -0
- package/build-esm/_enums/environment-flag.enum.js +26 -0
- package/build-esm/_enums/error-level.enum.js +35 -0
- package/build-esm/_enums/error-status.enum.js +28 -0
- package/build-esm/_enums/http/http-call-type.enum.js +42 -0
- package/build-esm/_enums/http/http-event-type.enum.js +39 -0
- package/build-esm/_enums/http/http-response-type.enum.js +18 -0
- package/build-esm/_enums/log-style.enum.js +38 -0
- package/build-esm/_enums/operation-auth.type-enum.js +19 -0
- package/build-esm/_enums/operation-if-match.type-enum.js +17 -0
- package/build-esm/_enums/operation-patch-field.type-enum.js +40 -0
- package/build-esm/_enums/server-connection-status.enum.js +5 -0
- package/build-esm/_enums/time/day-of-week.enum.js +47 -0
- package/build-esm/_enums/time/month.enum.js +23 -0
- package/build-esm/_enums/time/relative-date.enum.js +19 -0
- package/build-esm/_models/control-models/data-model-params.control-model.js +259 -0
- package/build-esm/_models/control-models/data-model-settings.control-model.js +63 -0
- package/build-esm/_models/control-models/data-property-params.control-model.js +101 -0
- package/build-esm/_models/control-models/data-property-settings.control-model.js +61 -0
- package/build-esm/_models/control-models/error.control-model.js +787 -0
- package/build-esm/_models/control-models/http/http-error-response.control-model.js +48 -0
- package/build-esm/_models/control-models/http/http-headers.control-model.js +43 -0
- package/build-esm/_models/control-models/http/http-response.model-base.js +62 -0
- package/build-esm/_models/control-models/operation-context.control-model.js +110 -0
- package/build-esm/_models/control-models/operation-settings.control-model.js +184 -0
- package/build-esm/_models/control-models/poll.control-model.js +202 -0
- package/build-esm/_models/control-models/range-value.control-model.js +247 -0
- package/build-esm/_models/control-models/server-route-settings-base.control-model.js +19 -0
- package/build-esm/_models/control-models/server-status.control-model.js +73 -0
- package/build-esm/_models/control-models/service-endpoint-settings-base.control-model.js +110 -0
- package/build-esm/_models/data-models/errors.data-model.js +156 -0
- package/build-esm/_models/data-models/metadata.data-model.js +120 -0
- package/build-esm/_models/interfaces/box-bounds.interface.js +1 -0
- package/build-esm/_models/interfaces/environment/global-log-settings.interface.js +1 -0
- package/build-esm/_models/interfaces/environment/global-settings.interface.js +1 -0
- package/build-esm/_models/interfaces/error-defaults.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-authz-result.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-authz.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-exposure.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-guardrails.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-input-settings.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-json-schema.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-patch-field.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-patch-result.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-patch-violation.interface.js +1 -0
- package/build-esm/_models/interfaces/operation-run-result.interface.js +1 -0
- package/build-esm/_models/interfaces/paged.interface.js +1 -0
- package/build-esm/_models/interfaces/poll-handle.interface.js +1 -0
- package/build-esm/_models/interfaces/random-weight.interface.js +1 -0
- package/build-esm/_models/interfaces/route-settings.interface.js +1 -0
- package/build-esm/_models/interfaces/search-query.interface.js +1 -0
- package/build-esm/_models/interfaces/search-result.interface.js +1 -0
- package/build-esm/_models/interfaces/server-error-statistics.interface.js +1 -0
- package/build-esm/_models/interfaces/vector2.interface.js +1 -0
- package/build-esm/_models/types/db-filter.type.js +1 -0
- package/build-esm/_models/types/db-sort.type.js +1 -0
- package/build-esm/_models/types/deprecated-boolean-alias.type.js +1 -0
- package/build-esm/_models/types/ds-filter.type.js +15 -0
- package/build-esm/_models/types/ds-sort.type.js +1 -0
- package/build-esm/_modules/ai/_collections/ai-media-provenance.util.js +24 -0
- package/build-esm/_modules/ai/_collections/ai-model-ref.util.js +70 -0
- package/build-esm/_modules/ai/_collections/ai-model-registry.util.js +37 -0
- package/build-esm/_modules/ai/_enums/ai-message-role.enum.js +8 -0
- package/build-esm/_modules/ai/_enums/ai-model-type.enum.js +8 -0
- package/build-esm/_modules/ai/_enums/ai-provider.enum.js +8 -0
- package/build-esm/_modules/ai/_models/ai-call-settings.interface.js +88 -0
- package/build-esm/_modules/ai/_models/ai-config.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-embedding-request.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-embedding-response.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-image-request.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-image-response.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-llm-request.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-llm-response.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-media-file.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-media-provenance.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-message.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-model-capabilities.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-model-info.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-model-settings-schema.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-model3d-request.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-model3d-response.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-provider-capabilities.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-settings.interface.js +10 -0
- package/build-esm/_modules/ai/_models/ai-speech-request.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-speech-response.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-tool-call.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-tool-handler.type.js +1 -0
- package/build-esm/_modules/ai/_models/ai-tool-result.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-tool.interface.js +1 -0
- package/build-esm/_modules/ai/_models/ai-user-provider-config.control-model.js +31 -0
- package/build-esm/_modules/ai/_modules/anthropic/_collections/aai-models.const.js +130 -0
- package/build-esm/_modules/ai/_modules/anthropic/_enums/aai-model.enum.js +17 -0
- package/build-esm/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.js +23 -0
- package/build-esm/_modules/ai/_modules/anthropic/_models/aai-client-options.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.js +25 -0
- package/build-esm/_modules/ai/_modules/anthropic/_models/aai-user-provider-config.control-model.js +22 -0
- package/build-esm/_modules/ai/_modules/anthropic/index.js +9 -0
- package/build-esm/_modules/ai/_modules/document-ai/_models/dai-embedding-info.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/document-ai/_models/dai-vector-search-params.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/document-ai/index.js +3 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_collections/fdpai-models.const.js +38 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_enums/fdpai-model.enum.js +7 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-call-settings.control-model.js +21 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-client-options.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-settings.control-model.js +24 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/_models/fdpai-user-provider-config.control-model.js +22 -0
- package/build-esm/_modules/ai/_modules/fdp-ai/index.js +9 -0
- package/build-esm/_modules/ai/_modules/google-ai/_collections/gai-models.const.js +155 -0
- package/build-esm/_modules/ai/_modules/google-ai/_enums/gai-model.enum.js +14 -0
- package/build-esm/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.js +23 -0
- package/build-esm/_modules/ai/_modules/google-ai/_models/gai-client-options.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.js +25 -0
- package/build-esm/_modules/ai/_modules/google-ai/_models/gai-user-provider-config.control-model.js +22 -0
- package/build-esm/_modules/ai/_modules/google-ai/index.js +9 -0
- package/build-esm/_modules/ai/_modules/local-ai/_collections/lai-models.const.js +57 -0
- package/build-esm/_modules/ai/_modules/local-ai/_enums/lai-model.enum.js +5 -0
- package/build-esm/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.js +19 -0
- package/build-esm/_modules/ai/_modules/local-ai/_models/lai-client-options.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.js +22 -0
- package/build-esm/_modules/ai/_modules/local-ai/index.js +8 -0
- package/build-esm/_modules/ai/_modules/open-ai/_collections/oai-embedding-model-dimensions.const.js +6 -0
- package/build-esm/_modules/ai/_modules/open-ai/_collections/oai-models.const.js +455 -0
- package/build-esm/_modules/ai/_modules/open-ai/_enums/oai-model.enum.js +146 -0
- package/build-esm/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.js +23 -0
- package/build-esm/_modules/ai/_modules/open-ai/_models/oai-client-options.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/open-ai/_models/oai-embedding-info.interface.js +1 -0
- package/build-esm/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.js +25 -0
- package/build-esm/_modules/ai/_modules/open-ai/_models/oai-user-provider-config.control-model.js +23 -0
- package/build-esm/_modules/ai/_modules/open-ai/index.js +19 -0
- package/build-esm/_modules/ai/index.js +34 -0
- package/build-esm/_modules/application-alert/_collections/application-alert-envelope.util.js +267 -0
- package/build-esm/_modules/application-alert/_enums/application-alert-evaluation-state.type-enum.js +6 -0
- package/build-esm/_modules/application-alert/_enums/application-alert-severity.type-enum.js +8 -0
- package/build-esm/_modules/application-alert/_models/application-alert.interface.js +1 -0
- package/build-esm/_modules/application-alert/index.js +4 -0
- package/build-esm/_modules/ci-tools/_enums/cit-ci-result-code.enum.js +9 -0
- package/build-esm/_modules/ci-tools/_enums/cit-ci-step-result-code.enum.js +9 -0
- package/build-esm/_modules/ci-tools/_models/cit-ci-result-info.data-models.js +63 -0
- package/build-esm/_modules/ci-tools/_models/cit-ci-step-result.interface.js +1 -0
- package/build-esm/_modules/ci-tools/index.js +6 -0
- package/build-esm/_modules/crypto/_collections/crypto-v1.util.js +199 -0
- package/build-esm/_modules/crypto/_collections/crypto-v2.util.js +273 -0
- package/build-esm/_modules/crypto/_collections/crypto-v4.util.js +605 -0
- package/build-esm/_modules/crypto/_collections/crypto.util.js +651 -0
- package/build-esm/_modules/crypto/_models/artifact-signature.interface.js +1 -0
- package/build-esm/_modules/crypto/_services/artifact-signature.control-service.js +276 -0
- package/build-esm/_modules/crypto/index.js +11 -0
- package/build-esm/_modules/custom-data/_collections/cud-module-settings.const.js +18 -0
- package/build-esm/_modules/custom-data/_models/cud.data-model.js +30 -0
- package/build-esm/_modules/custom-data/index.js +4 -0
- package/build-esm/_modules/data-handler/_models/data-handler-settings.control-model.js +78 -0
- package/build-esm/_modules/data-handler/_models/data-handler.control-model.js +386 -0
- package/build-esm/_modules/data-handler/_models/data-list-handler-settings.control-model.js +11 -0
- package/build-esm/_modules/data-handler/_models/data-list-handler.control-model.js +222 -0
- package/build-esm/_modules/data-handler/_models/data-search-handler-settings.control-model.js +25 -0
- package/build-esm/_modules/data-handler/_models/data-search-handler.control-model.js +334 -0
- package/build-esm/_modules/data-handler/_models/list-collector-data-handler-settings.control-model.js +12 -0
- package/build-esm/_modules/data-handler/_models/list-collector-data-handler.control-model.js +243 -0
- package/build-esm/_modules/data-handler/index.js +9 -0
- package/build-esm/_modules/deployment/_collections/atomic-rollback-manifest.util.js +348 -0
- package/build-esm/_modules/deployment/_models/atomic-rollback-manifest.interface.js +1 -0
- package/build-esm/_modules/deployment/index.js +2 -0
- package/build-esm/_modules/game/_collections/audio-mixer.util.js +109 -0
- package/build-esm/_modules/game/_collections/audio-scale.util.js +100 -0
- package/build-esm/_modules/game/_enums/audio-channel.enum.js +21 -0
- package/build-esm/_modules/game/_models/audio-mixer-config.interface.js +1 -0
- package/build-esm/_modules/game/_models/audio-mixer-settings.interface.js +1 -0
- package/build-esm/_modules/game/_models/audio-mixer-state.interface.js +1 -0
- package/build-esm/_modules/game/_models/audio-mixer.control-model.js +337 -0
- package/build-esm/_modules/game/_models/audio-scale.interface.js +1 -0
- package/build-esm/_modules/game/_models/flying-effect.control-model.js +212 -0
- package/build-esm/_modules/game/_models/flying-effect.interface.js +1 -0
- package/build-esm/_modules/game/_models/seeded-random-registry.control-model.js +124 -0
- package/build-esm/_modules/game/_models/seeded-random-registry.interface.js +1 -0
- package/build-esm/_modules/game/_models/seeded-random-state.interface.js +1 -0
- package/build-esm/_modules/game/_models/seeded-random.control-model.js +261 -0
- package/build-esm/_modules/game/index.js +17 -0
- package/build-esm/_modules/location/_collections/assets/country-codes-ISO-3166.json +3239 -0
- package/build-esm/_modules/location/_collections/assets/country-divisions-ISO-3166-all-list.json +19036 -0
- package/build-esm/_modules/location/_collections/assets/country-phone-codes.json +1202 -0
- package/build-esm/_modules/location/_collections/loc-country-divisions.const.js +3 -0
- package/build-esm/_modules/location/_collections/loc-country-isos.const.js +2 -0
- package/build-esm/_modules/location/_collections/loc-regions.util.js +107 -0
- package/build-esm/_modules/location/_collections/loc.util.js +56 -0
- package/build-esm/_modules/location/_enums/loc-region.enum.js +11 -0
- package/build-esm/_modules/location/_enums/loc-sub-region.enum.js +23 -0
- package/build-esm/_modules/location/_enums/loc-subdivision-region-type.enum.js +45 -0
- package/build-esm/_modules/location/_models/loc-coordinates.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-country-division.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-country-iso.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-country-phone-code.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-division-collection.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-division-region-data.interface.js +1 -0
- package/build-esm/_modules/location/_models/loc-geo-ip-location.interface.js +1 -0
- package/build-esm/_modules/location/index.js +17 -0
- package/build-esm/_modules/messaging/_collections/msg-module-settings.const.js +44 -0
- package/build-esm/_modules/messaging/_enums/msg-attachment-type.enum.js +21 -0
- package/build-esm/_modules/messaging/_enums/msg-conversation-type.enum.js +17 -0
- package/build-esm/_modules/messaging/_enums/msg-delivery-status.enum.js +15 -0
- package/build-esm/_modules/messaging/_enums/msg-event-key.enum.js +28 -0
- package/build-esm/_modules/messaging/_enums/msg-participant-role.enum.js +17 -0
- package/build-esm/_modules/messaging/_enums/msg-provider-type.enum.js +8 -0
- package/build-esm/_modules/messaging/_enums/msg-status.enum.js +21 -0
- package/build-esm/_modules/messaging/_enums/msg-type.enum.js +19 -0
- package/build-esm/_modules/messaging/_models/msg-attachment.interface.js +1 -0
- package/build-esm/_modules/messaging/_models/msg-conversation.data-model.js +80 -0
- package/build-esm/_modules/messaging/_models/msg-mention.interface.js +1 -0
- package/build-esm/_modules/messaging/_models/msg-message.data-model.js +102 -0
- package/build-esm/_modules/messaging/_models/msg-participant.interface.js +1 -0
- package/build-esm/_modules/messaging/_models/msg-reaction.interface.js +1 -0
- package/build-esm/_modules/messaging/_models/msg-thread-info.interface.js +1 -0
- package/build-esm/_modules/messaging/_modules/agent/_enums/agt-process-step-type.enum.js +27 -0
- package/build-esm/_modules/messaging/_modules/agent/_enums/agt-tool-status.enum.js +19 -0
- package/build-esm/_modules/messaging/_modules/agent/_models/agt-process-step.interface.js +1 -0
- package/build-esm/_modules/messaging/_modules/agent/_models/agt-reasoning-info.interface.js +1 -0
- package/build-esm/_modules/messaging/_modules/agent/_models/agt-tool-usage.interface.js +1 -0
- package/build-esm/_modules/messaging/_modules/agent/index.js +7 -0
- package/build-esm/_modules/messaging/index.js +25 -0
- package/build-esm/_modules/ngx-models/_collections/angular-placeholders.js +1 -0
- package/build-esm/_modules/ngx-models/_collections/button-new-style-settings-presets.const.js +170 -0
- package/build-esm/_modules/ngx-models/_collections/dynamo-global.settings.js +88 -0
- package/build-esm/_modules/ngx-models/_enums/button-new/button-new-border-radius.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/button-new/button-new-icon-style-type.enum.js +12 -0
- package/build-esm/_modules/ngx-models/_enums/button-new/button-new-size.enum.js +15 -0
- package/build-esm/_modules/ngx-models/_enums/button-new/button-new-style-type.enum.js +17 -0
- package/build-esm/_modules/ngx-models/_enums/button-type.enum.js +35 -0
- package/build-esm/_modules/ngx-models/_enums/checkbox-label-position.enum.js +8 -0
- package/build-esm/_modules/ngx-models/_enums/container-type.enum.js +11 -0
- package/build-esm/_modules/ngx-models/_enums/errors/error-level.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/errors/error-notification-color.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/errors/error-ui-mode.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/field-appearance.enum.js +13 -0
- package/build-esm/_modules/ngx-models/_enums/field-type.enum.js +49 -0
- package/build-esm/_modules/ngx-models/_enums/file-type.enum.js +12 -0
- package/build-esm/_modules/ngx-models/_enums/flex/flex-layout-align.enum.js +21 -0
- package/build-esm/_modules/ngx-models/_enums/flex/flex-layout.enum.js +6 -0
- package/build-esm/_modules/ngx-models/_enums/form-access.enum.js +9 -0
- package/build-esm/_modules/ngx-models/_enums/form-reset-data.enum.js +12 -0
- package/build-esm/_modules/ngx-models/_enums/form-store-on.enum.js +8 -0
- package/build-esm/_modules/ngx-models/_enums/forms-new/field-new-validator-type.enum.js +21 -0
- package/build-esm/_modules/ngx-models/_enums/frames/header-item-type.enum.js +16 -0
- package/build-esm/_modules/ngx-models/_enums/frames/header-position.enum.js +11 -0
- package/build-esm/_modules/ngx-models/_enums/frames/side-nav-badge-color.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/html/input-types.enum.js +26 -0
- package/build-esm/_modules/ngx-models/_enums/material-color.enum.js +14 -0
- package/build-esm/_modules/ngx-models/_enums/material-tooltip-position.enum.js +13 -0
- package/build-esm/_modules/ngx-models/_enums/preconfigured-field-type.enum.js +8 -0
- package/build-esm/_modules/ngx-models/_enums/storage-type.enum.js +13 -0
- package/build-esm/_modules/ngx-models/_enums/validator-type.enum.js +7 -0
- package/build-esm/_modules/ngx-models/_enums/voice/audio-mime-type.enum.js +15 -0
- package/build-esm/_modules/ngx-models/_enums/voice/voice-provider-type.enum.js +32 -0
- package/build-esm/_modules/ngx-models/_enums/voice/voice-recorder-state.enum.js +21 -0
- package/build-esm/_modules/ngx-models/_models/control-models/button-new-style-settings.control-model.js +44 -0
- package/build-esm/_modules/ngx-models/_models/control-models/button-params.control-model.js +304 -0
- package/build-esm/_modules/ngx-models/_models/control-models/chat/chat-column-layout-settings.control-model.js +59 -0
- package/build-esm/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.js +94 -0
- package/build-esm/_modules/ngx-models/_models/control-models/data-handler.control-model.js +407 -0
- package/build-esm/_modules/ngx-models/_models/control-models/errors/error-notification.control-model.js +43 -0
- package/build-esm/_modules/ngx-models/_models/control-models/errors/error-settings.control-model.js +64 -0
- package/build-esm/_modules/ngx-models/_models/control-models/errors/errors-settings.control-model.js +52 -0
- package/build-esm/_modules/ngx-models/_models/control-models/field-settings.control-model.js +207 -0
- package/build-esm/_modules/ngx-models/_models/control-models/form-settings.control-model.js +275 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/checkbox-field-new-settings.control-model.js +29 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/color-picker-field-new-settings.control-model.js +36 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/date-field-new-settings.control-model.js +31 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/date-range-field-new-settings.control-model.js +46 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/datetime-field-new-settings.control-model.js +38 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/datetime-range-field-new-settings.control-model.js +48 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/emoji-picker-field-new-settings.control-model.js +21 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/field-new-settings.control-model.js +91 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/field-new-types.js +1 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/form-new-settings.control-model.js +39 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/icon-picker-field-new-settings.control-model.js +39 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/index.js +23 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/multiselect-field-new-settings.control-model.js +31 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/number-field-new-settings.control-model.js +29 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/password-field-new-settings.control-model.js +51 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/picker-field-new-option.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/radio-select-field-new-settings.control-model.js +38 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/select-field-new-settings.control-model.js +35 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/slider-field-new-settings.control-model.js +50 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/slider-range-field-new-settings.control-model.js +47 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/text-field-new-settings.control-model.js +35 -0
- package/build-esm/_modules/ngx-models/_models/control-models/forms-new/textarea-field-new-settings.control-model.js +27 -0
- package/build-esm/_modules/ngx-models/_models/control-models/frames/header-item-settings.control-model.js +44 -0
- package/build-esm/_modules/ngx-models/_models/control-models/frames/main-frame-settings.control-model.js +56 -0
- package/build-esm/_modules/ngx-models/_models/control-models/frames/side-nav-item-settings.control-model.js +58 -0
- package/build-esm/_modules/ngx-models/_models/control-models/frames/side-nav-settings.control-model.js +38 -0
- package/build-esm/_modules/ngx-models/_models/control-models/select.control-model.js +27 -0
- package/build-esm/_modules/ngx-models/_models/control-models/signal-data-list-handler-settings.control-model.js +23 -0
- package/build-esm/_modules/ngx-models/_models/control-models/signal-data-search-handler-settings.control-model.js +25 -0
- package/build-esm/_modules/ngx-models/_models/control-models/signal-list-collector-data-handler-settings.control-model.js +12 -0
- package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-providers-settings.control-model.js +22 -0
- package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-record-button-settings.control-model.js +91 -0
- package/build-esm/_modules/ngx-models/_models/control-models/voice/voice-recorder-settings.control-model.js +42 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/button-new-settings.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/confirm-settings.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/global-settings.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/select-options-custom-constructor.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/storage.service.js +40 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/speak-options.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/speak-result.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/transcribe-options.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/transcribe-result.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/voice-profile.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_models/interfaces/voice/voice-provider-init.interface.js +1 -0
- package/build-esm/_modules/ngx-models/_utils/shared.service.js +407 -0
- package/build-esm/_modules/ngx-models/index.js +89 -0
- package/build-esm/_modules/operation-control/_collections/operation-lease.util.js +323 -0
- package/build-esm/_modules/operation-control/_enums/operation-decision-code.type-enum.js +22 -0
- package/build-esm/_modules/operation-control/_enums/operation-state.type-enum.js +9 -0
- package/build-esm/_modules/operation-control/_models/operation-lease.interface.js +1 -0
- package/build-esm/_modules/operation-control/index.js +4 -0
- package/build-esm/_modules/pipe/_collections/pip-transforms.const.js +32 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-country-pipe.util.js +29 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-custom-pipe.util.js +22 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-division-pipe.util.js +21 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-json-pipe.util.js +18 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-list-pipe.util.js +19 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.js +164 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.js +16 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-range-pipe.util.js +64 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-region-pipe.util.js +22 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-replace-pipe.util.js +15 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-slider-pipe.util.js +26 -0
- package/build-esm/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.js +40 -0
- package/build-esm/_modules/pipe/_enums/pip-range-pipe-setting.enum.js +14 -0
- package/build-esm/_modules/pipe/_enums/pip.enum.js +48 -0
- package/build-esm/_modules/pipe/_models/pip-multi-pipe-settings.type.js +1 -0
- package/build-esm/_modules/pipe/_models/pip-transforms.interface.js +1 -0
- package/build-esm/_modules/pipe/index.js +22 -0
- package/build-esm/_modules/request-safety/_collections/request-safety-inspector.util.js +317 -0
- package/build-esm/_modules/request-safety/_enums/request-safety-finding.type-enum.js +39 -0
- package/build-esm/_modules/request-safety/_models/request-safety.interface.js +1 -0
- package/build-esm/_modules/request-safety/index.js +3 -0
- package/build-esm/_modules/sandbox-runtime/_collections/zero-egress-receipt.util.js +154 -0
- package/build-esm/_modules/sandbox-runtime/_collections/zero-egress-result-code.const.js +36 -0
- package/build-esm/_modules/sandbox-runtime/_enums/zero-egress-outcome.type-enum.js +11 -0
- package/build-esm/_modules/sandbox-runtime/_models/zero-egress-receipt.interface.js +1 -0
- package/build-esm/_modules/sandbox-runtime/index.js +4 -0
- package/build-esm/_modules/security/_collections/stored-secret.util.js +68 -0
- package/build-esm/_modules/security/_models/stored-secret.control-model.js +52 -0
- package/build-esm/_modules/security/index.js +7 -0
- package/build-esm/_modules/socket/_enums/sck-event-key.enum.js +18 -0
- package/build-esm/_modules/socket/_models/sck-client-params.control-model.js +47 -0
- package/build-esm/_modules/socket/_models/sck-socket-event.control-model.js +133 -0
- package/build-esm/_modules/socket/_services/sck-client.service-base.js +314 -0
- package/build-esm/_modules/socket/index.js +7 -0
- package/build-esm/_modules/state-machine/_models/state-machine-config.interface.js +1 -0
- package/build-esm/_modules/state-machine/_models/state-machine-event.interface.js +1 -0
- package/build-esm/_modules/state-machine/_models/state-machine.control-model.js +262 -0
- package/build-esm/_modules/state-machine/_models/state-transition-result.interface.js +1 -0
- package/build-esm/_modules/state-machine/_models/state-transition.interface.js +1 -0
- package/build-esm/_modules/state-machine/index.js +6 -0
- package/build-esm/_modules/test/_collections/tst-module-settings.const.js +38 -0
- package/build-esm/_modules/test/index.js +2 -0
- package/build-esm/_modules/usage/_collections/usg-module-settings.const.js +16 -0
- package/build-esm/_modules/usage/_models/usg-action.control-model.js +25 -0
- package/build-esm/_modules/usage/_models/usg-daily-usage-data.control-model.js +30 -0
- package/build-esm/_modules/usage/_models/usg-data.control-model.js +30 -0
- package/build-esm/_modules/usage/_models/usg-session.data-model.js +60 -0
- package/build-esm/_modules/usage/index.js +7 -0
- package/build-esm/index.js +108 -0
- package/package.json +85 -84
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { DyFM_RequestSafetyFinding_Type } from '../_enums/request-safety-finding.type-enum';
|
|
2
|
+
/**
|
|
3
|
+
* BFR-CTM-034 — cross-runtime, content-free request safety inspector.
|
|
4
|
+
*
|
|
5
|
+
* ⚠️ **What this is for:** a value is about to cross a boundary (browser → transport, or transport →
|
|
6
|
+
* state mutation / provider dispatch). Once it has crossed, masking it afterwards is too late — the
|
|
7
|
+
* value has already been serialized, stored or sent. This inspector runs BEFORE that, and answers a
|
|
8
|
+
* single question: *may this cross?* — without ever repeating what it saw.
|
|
9
|
+
*
|
|
10
|
+
* ⛔ **No side effects, by construction.** No logging, no network, no storage, no timers, no `Math.random`,
|
|
11
|
+
* no environment access. That is not stylistic: the inspector runs on hostile input, so anything it
|
|
12
|
+
* touched would become an attack surface, and anything it logged would re-leak the value it rejected.
|
|
13
|
+
* The same source therefore runs unchanged in a browser, a Worker and Node.
|
|
14
|
+
*
|
|
15
|
+
* Supply inert data and a trusted product policy. Reflection on a JavaScript Proxy can execute its
|
|
16
|
+
* traps; this utility contains thrown errors but cannot sandbox that code. Likewise, node/string
|
|
17
|
+
* counters do not replace a separate process/sandbox memory and CPU limit.
|
|
18
|
+
*/
|
|
19
|
+
export class DyFM_RequestSafetyInspector_Util {
|
|
20
|
+
/**
|
|
21
|
+
* Format/invisible characters that hide a value from a naive matcher while remaining meaningful to a
|
|
22
|
+
* human reader or a downstream parser: zero-width space/non-joiner/joiner, word joiner, BOM, the
|
|
23
|
+
* bidirectional overrides, and the soft hyphen.
|
|
24
|
+
*
|
|
25
|
+
* ⭐ These are removed AFTER NFKC. NFKC alone does not drop them, so a `password` key would
|
|
26
|
+
* still slip past a forbidden-key set that only normalizes.
|
|
27
|
+
*/
|
|
28
|
+
static formatObfuscators = /[\u00ad\u200b-\u200f\u202a-\u202e\u2060-\u2064\ufeff]/g;
|
|
29
|
+
/**
|
|
30
|
+
* Normalizes a string for matching: NFKC, then format-obfuscator removal, then case folding.
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ The order matters. NFKC first folds the full-width and compatibility forms (`password`,
|
|
33
|
+
* `𝐩𝐚𝐬𝐬𝐰𝐨𝐫𝐝`) onto their ASCII equivalents; only then can the invisible-character strip and the
|
|
34
|
+
* case fold see a plain string. Reversing the steps leaves obfuscated forms unmatched.
|
|
35
|
+
*/
|
|
36
|
+
static normalize(value) {
|
|
37
|
+
return `${value ?? ''}`
|
|
38
|
+
.normalize('NFKC')
|
|
39
|
+
.replace(DyFM_RequestSafetyInspector_Util.formatObfuscators, '')
|
|
40
|
+
.toLowerCase();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Inspects `input` against a caller-owned policy.
|
|
44
|
+
*
|
|
45
|
+
* Fail-closed everywhere: an invalid policy, an unsupported value type, a hostile prototype, an
|
|
46
|
+
* accessor or a blown budget all DECLINE. There is no path that returns `accepted: true` because the
|
|
47
|
+
* inspector could not decide.
|
|
48
|
+
*
|
|
49
|
+
* @returns a content-free outcome; the input itself is never echoed in any form.
|
|
50
|
+
*/
|
|
51
|
+
static inspect(input, policy) {
|
|
52
|
+
const snapshot = DyFM_RequestSafetyInspector_Util.snapshotPolicy(policy);
|
|
53
|
+
const counts = {};
|
|
54
|
+
let inspectedNodes = 0;
|
|
55
|
+
const namespace = snapshot?.namespace ?? 'unknown';
|
|
56
|
+
/** Adds only a stable namespaced finding and its aggregate count. */
|
|
57
|
+
const record = (finding) => {
|
|
58
|
+
const code = `${namespace}:${finding}`;
|
|
59
|
+
counts[code] = (counts[code] ?? 0) + 1;
|
|
60
|
+
};
|
|
61
|
+
if (!snapshot) {
|
|
62
|
+
// Invalid policy is not permission to proceed. Do not echo even its namespace.
|
|
63
|
+
const code = `unknown:${DyFM_RequestSafetyFinding_Type.invalidPolicy}`;
|
|
64
|
+
return {
|
|
65
|
+
contractVersion: 'dyfm-request-safety/1',
|
|
66
|
+
accepted: false,
|
|
67
|
+
findingCodes: [code],
|
|
68
|
+
findingCounts: { [code]: 1 },
|
|
69
|
+
inspectedNodes: 0,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
policy = snapshot;
|
|
73
|
+
const forbiddenKeys = new Set((policy.forbiddenKeys ?? []).map((key) => DyFM_RequestSafetyInspector_Util.normalize(key)));
|
|
74
|
+
// Only the active path constitutes a cycle; acyclic shared subtrees are valid JSON input.
|
|
75
|
+
const ancestors = new Set();
|
|
76
|
+
let isNodeBudgetExhausted = false;
|
|
77
|
+
/** Visits data descriptors within the shared per-call budgets. */
|
|
78
|
+
const walk = (value, depth) => {
|
|
79
|
+
if (isNodeBudgetExhausted) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (inspectedNodes >= policy.maxNodes) {
|
|
83
|
+
isNodeBudgetExhausted = true;
|
|
84
|
+
record(DyFM_RequestSafetyFinding_Type.nodeBudget);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
inspectedNodes++;
|
|
88
|
+
if (depth > policy.maxDepth) {
|
|
89
|
+
record(DyFM_RequestSafetyFinding_Type.depthBudget);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'number') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (typeof value === 'string') {
|
|
96
|
+
DyFM_RequestSafetyInspector_Util.inspectString(value, policy, record);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (typeof value === 'undefined') {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value !== 'object') {
|
|
103
|
+
// Functions, symbols and bigint are not carried by this contract.
|
|
104
|
+
record(DyFM_RequestSafetyFinding_Type.unsupportedValueType);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (ancestors.has(value)) {
|
|
108
|
+
record(DyFM_RequestSafetyFinding_Type.cycle);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const isArray = Array.isArray(value);
|
|
112
|
+
const prototype = Object.getPrototypeOf(value);
|
|
113
|
+
if (isArray ? prototype !== Array.prototype : prototype !== Object.prototype && prototype !== null) {
|
|
114
|
+
// Serialization of custom prototypes may differ from the inspected data.
|
|
115
|
+
record(DyFM_RequestSafetyFinding_Type.unsupportedPrototype);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
ancestors.add(value);
|
|
119
|
+
try {
|
|
120
|
+
// Never invoke input iterators or read property values directly, including array indices.
|
|
121
|
+
const keys = Reflect.ownKeys(value);
|
|
122
|
+
if (isArray) {
|
|
123
|
+
// Holes serialize too. Charge them arithmetically, without iterating a huge sparse array.
|
|
124
|
+
const length = DyFM_RequestSafetyInspector_Util.arrayLength(value);
|
|
125
|
+
const presentIndices = keys.filter((key) => (typeof key === 'string' && /^(?:0|[1-9]\d*)$/u.test(key) && Number(key) < length)).length;
|
|
126
|
+
const holes = length - presentIndices;
|
|
127
|
+
if (holes > policy.maxNodes - inspectedNodes) {
|
|
128
|
+
inspectedNodes = policy.maxNodes;
|
|
129
|
+
isNodeBudgetExhausted = true;
|
|
130
|
+
record(DyFM_RequestSafetyFinding_Type.nodeBudget);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
inspectedNodes += holes;
|
|
134
|
+
}
|
|
135
|
+
for (const key of keys) {
|
|
136
|
+
if (isArray && key === 'length') {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (isNodeBudgetExhausted || inspectedNodes >= policy.maxNodes) {
|
|
140
|
+
if (!isNodeBudgetExhausted) {
|
|
141
|
+
record(DyFM_RequestSafetyFinding_Type.nodeBudget);
|
|
142
|
+
isNodeBudgetExhausted = true;
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (typeof key !== 'string') {
|
|
147
|
+
inspectedNodes++;
|
|
148
|
+
record(DyFM_RequestSafetyFinding_Type.unsupportedValueType);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (forbiddenKeys.has(DyFM_RequestSafetyInspector_Util.normalize(key))) {
|
|
152
|
+
record(DyFM_RequestSafetyFinding_Type.forbiddenKey);
|
|
153
|
+
}
|
|
154
|
+
DyFM_RequestSafetyInspector_Util.inspectString(key, policy, record);
|
|
155
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
156
|
+
if (!descriptor || !('value' in descriptor)) {
|
|
157
|
+
inspectedNodes++;
|
|
158
|
+
record(DyFM_RequestSafetyFinding_Type.accessor);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
walk(descriptor.value, depth + 1);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
ancestors.delete(value);
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
try {
|
|
169
|
+
walk(input, 0);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Proxy reflection can throw. Contain its error; this is not a sandbox for arbitrary proxy code.
|
|
173
|
+
record(DyFM_RequestSafetyFinding_Type.inspectionFailure);
|
|
174
|
+
}
|
|
175
|
+
const findingCodes = Object.keys(counts).sort();
|
|
176
|
+
return {
|
|
177
|
+
contractVersion: 'dyfm-request-safety/1',
|
|
178
|
+
accepted: findingCodes.length === 0,
|
|
179
|
+
findingCodes: findingCodes,
|
|
180
|
+
findingCounts: counts,
|
|
181
|
+
inspectedNodes: inspectedNodes,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/** Checks the string budget, canaries and the caller's sensitive/capability patterns. */
|
|
185
|
+
static inspectString(value, policy, record) {
|
|
186
|
+
const normalized = DyFM_RequestSafetyInspector_Util.normalize(value);
|
|
187
|
+
if (normalized.length > policy.maxStringLength) {
|
|
188
|
+
record(DyFM_RequestSafetyFinding_Type.stringBudget);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
for (const canary of policy.canaries ?? []) {
|
|
192
|
+
if (canary.length > 0 && normalized.includes(canary)) {
|
|
193
|
+
record(DyFM_RequestSafetyFinding_Type.canary);
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (DyFM_RequestSafetyInspector_Util.matchesPattern(normalized, policy.sensitiveValuePatterns)) {
|
|
198
|
+
record(DyFM_RequestSafetyFinding_Type.sensitiveValue);
|
|
199
|
+
}
|
|
200
|
+
if (DyFM_RequestSafetyInspector_Util.matchesPattern(normalized, policy.unsupportedCapabilityPatterns)) {
|
|
201
|
+
record(DyFM_RequestSafetyFinding_Type.unsupportedCapability);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Records at most one finding per pattern group, using private per-inspection regex instances.
|
|
206
|
+
*
|
|
207
|
+
* Resetting the caller's cursor to zero was itself a mutation when it started at a nonzero offset,
|
|
208
|
+
* and threw for frozen patterns. Only the validated snapshot is mutable; the caller is never touched.
|
|
209
|
+
*/
|
|
210
|
+
static matchesPattern(normalized, patterns) {
|
|
211
|
+
for (const pattern of patterns ?? []) {
|
|
212
|
+
pattern.lastIndex = 0;
|
|
213
|
+
if (pattern.test(normalized)) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
/** Validates the entire policy before input inspection, without invoking accessors or array iterators. */
|
|
220
|
+
static snapshotPolicy(policy) {
|
|
221
|
+
try {
|
|
222
|
+
if (!policy || typeof policy !== 'object') {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const prototype = Object.getPrototypeOf(policy);
|
|
226
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const allowedKeys = [
|
|
230
|
+
'namespace', 'maxDepth', 'maxNodes', 'maxStringLength', 'forbiddenKeys',
|
|
231
|
+
'canaries', 'sensitiveValuePatterns', 'unsupportedCapabilityPatterns',
|
|
232
|
+
];
|
|
233
|
+
const values = {};
|
|
234
|
+
for (const key of Reflect.ownKeys(policy)) {
|
|
235
|
+
if (typeof key !== 'string' || !allowedKeys.includes(key)) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
const descriptor = Object.getOwnPropertyDescriptor(policy, key);
|
|
239
|
+
if (!descriptor || !('value' in descriptor)) {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
values[key] = descriptor.value;
|
|
243
|
+
}
|
|
244
|
+
if (typeof values.namespace !== 'string' || !/^[a-z][a-z0-9_.|\-]{0,63}$/iu.test(values.namespace)) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
namespace: values.namespace,
|
|
249
|
+
maxDepth: DyFM_RequestSafetyInspector_Util.positiveBudget(values.maxDepth),
|
|
250
|
+
maxNodes: DyFM_RequestSafetyInspector_Util.positiveBudget(values.maxNodes),
|
|
251
|
+
maxStringLength: DyFM_RequestSafetyInspector_Util.positiveBudget(values.maxStringLength),
|
|
252
|
+
forbiddenKeys: DyFM_RequestSafetyInspector_Util.snapshotList(values.forbiddenKeys, (entry) => {
|
|
253
|
+
if (typeof entry !== 'string') {
|
|
254
|
+
throw new Error('INVALID_POLICY');
|
|
255
|
+
}
|
|
256
|
+
return entry;
|
|
257
|
+
}),
|
|
258
|
+
canaries: DyFM_RequestSafetyInspector_Util.snapshotList(values.canaries, (entry) => {
|
|
259
|
+
if (typeof entry !== 'string') {
|
|
260
|
+
throw new Error('INVALID_POLICY');
|
|
261
|
+
}
|
|
262
|
+
return DyFM_RequestSafetyInspector_Util.normalize(entry);
|
|
263
|
+
}),
|
|
264
|
+
sensitiveValuePatterns: DyFM_RequestSafetyInspector_Util.snapshotList(values.sensitiveValuePatterns, DyFM_RequestSafetyInspector_Util.snapshotPattern),
|
|
265
|
+
unsupportedCapabilityPatterns: DyFM_RequestSafetyInspector_Util.snapshotList(values.unsupportedCapabilityPatterns, DyFM_RequestSafetyInspector_Util.snapshotPattern),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** Copies dense policy lists through data descriptors, rejecting holes, accessors and custom properties. */
|
|
273
|
+
static snapshotList(value, convert) {
|
|
274
|
+
if (value === undefined) {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype) {
|
|
278
|
+
throw new Error('INVALID_POLICY');
|
|
279
|
+
}
|
|
280
|
+
const length = DyFM_RequestSafetyInspector_Util.arrayLength(value);
|
|
281
|
+
if (Reflect.ownKeys(value).length !== length + 1) {
|
|
282
|
+
throw new Error('INVALID_POLICY');
|
|
283
|
+
}
|
|
284
|
+
const result = [];
|
|
285
|
+
for (let index = 0; index < length; index++) {
|
|
286
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
287
|
+
if (!descriptor || !('value' in descriptor)) {
|
|
288
|
+
throw new Error('INVALID_POLICY');
|
|
289
|
+
}
|
|
290
|
+
result.push(convert(descriptor.value));
|
|
291
|
+
}
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
/** Clones ordinary regexes without calling caller-defined test/source/flag members or touching lastIndex. */
|
|
295
|
+
static snapshotPattern(value) {
|
|
296
|
+
if (!(value instanceof RegExp) || Object.getPrototypeOf(value) !== RegExp.prototype ||
|
|
297
|
+
Reflect.ownKeys(value).some((key) => key !== 'lastIndex')) {
|
|
298
|
+
throw new Error('INVALID_POLICY');
|
|
299
|
+
}
|
|
300
|
+
return new RegExp(value.source, value.flags);
|
|
301
|
+
}
|
|
302
|
+
/** Narrows a required positive integer budget; errors remain inside the policy boundary. */
|
|
303
|
+
static positiveBudget(value) {
|
|
304
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
305
|
+
throw new Error('INVALID_POLICY');
|
|
306
|
+
}
|
|
307
|
+
return value;
|
|
308
|
+
}
|
|
309
|
+
/** Reads and validates only the array's own length descriptor, never an input member access. */
|
|
310
|
+
static arrayLength(value) {
|
|
311
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
312
|
+
if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0) {
|
|
313
|
+
throw new Error('INVALID_ARRAY');
|
|
314
|
+
}
|
|
315
|
+
return length;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BFR-CTM-034 — the closed, content-free finding vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* ⛔ These codes are the ONLY thing an inspection may say about *why* it declined. They deliberately
|
|
5
|
+
* describe the **class** of problem, never the offending value, key, path or pattern: a finding that
|
|
6
|
+
* echoes what it found turns a safety check into the very leak it was meant to prevent.
|
|
7
|
+
*
|
|
8
|
+
* The caller prefixes them with its own namespace, so two products can never confuse each other's
|
|
9
|
+
* findings while still sharing this vocabulary.
|
|
10
|
+
*/
|
|
11
|
+
export var DyFM_RequestSafetyFinding_Type;
|
|
12
|
+
(function (DyFM_RequestSafetyFinding_Type) {
|
|
13
|
+
/** A key matched the caller's forbidden-key set (after normalization). */
|
|
14
|
+
DyFM_RequestSafetyFinding_Type["forbiddenKey"] = "forbidden-key";
|
|
15
|
+
/** A string value matched one of the caller's sensitive-value patterns. */
|
|
16
|
+
DyFM_RequestSafetyFinding_Type["sensitiveValue"] = "sensitive-value";
|
|
17
|
+
/** A string value matched one of the caller's unsupported-capability patterns. */
|
|
18
|
+
DyFM_RequestSafetyFinding_Type["unsupportedCapability"] = "unsupported-capability";
|
|
19
|
+
/** A caller-planted canary was found — proof that a rejected value reached the boundary. */
|
|
20
|
+
DyFM_RequestSafetyFinding_Type["canary"] = "canary";
|
|
21
|
+
/** The graph contains a cycle. */
|
|
22
|
+
DyFM_RequestSafetyFinding_Type["cycle"] = "cycle";
|
|
23
|
+
/** Nesting exceeded the caller's depth budget. */
|
|
24
|
+
DyFM_RequestSafetyFinding_Type["depthBudget"] = "depth-budget";
|
|
25
|
+
/** The node count exceeded the caller's budget. */
|
|
26
|
+
DyFM_RequestSafetyFinding_Type["nodeBudget"] = "node-budget";
|
|
27
|
+
/** A string exceeded the caller's length budget. */
|
|
28
|
+
DyFM_RequestSafetyFinding_Type["stringBudget"] = "string-budget";
|
|
29
|
+
/** A property is defined by an accessor (getter/setter) — reading it could execute caller code. */
|
|
30
|
+
DyFM_RequestSafetyFinding_Type["accessor"] = "accessor";
|
|
31
|
+
/** An object's prototype is neither `Object.prototype` nor `null`. */
|
|
32
|
+
DyFM_RequestSafetyFinding_Type["unsupportedPrototype"] = "unsupported-prototype";
|
|
33
|
+
/** A value is of a type the contract does not carry (function, symbol, bigint, class instance…). */
|
|
34
|
+
DyFM_RequestSafetyFinding_Type["unsupportedValueType"] = "unsupported-value-type";
|
|
35
|
+
/** The policy itself is invalid — fail-closed, the input is never inspected. */
|
|
36
|
+
DyFM_RequestSafetyFinding_Type["invalidPolicy"] = "invalid-policy";
|
|
37
|
+
/** Reflection failed; no exception message, input fragment or stack is returned. */
|
|
38
|
+
DyFM_RequestSafetyFinding_Type["inspectionFailure"] = "inspection-failure";
|
|
39
|
+
})(DyFM_RequestSafetyFinding_Type || (DyFM_RequestSafetyFinding_Type = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { DyFM_ZeroEgressOutcome_Type } from '../_enums/zero-egress-outcome.type-enum';
|
|
2
|
+
import { DyFM_zeroEgressResultCode } from './zero-egress-result-code.const';
|
|
3
|
+
const dyfm_exactReceiptKeys = 'code,contractVersion,elapsedMs,outcome,outputBytes';
|
|
4
|
+
/** Determines whether an unknown value is a non-array object with string-addressable fields. */
|
|
5
|
+
function dyfm_isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
/** Compares all own string keys, including non-enumerable keys, with the exact receipt shape. */
|
|
9
|
+
function dyfm_hasExactReceiptKeys(value) {
|
|
10
|
+
const names = [];
|
|
11
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
12
|
+
if (typeof key !== 'string') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
16
|
+
if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
names.push(key);
|
|
20
|
+
}
|
|
21
|
+
return names.sort().join(',') === dyfm_exactReceiptKeys
|
|
22
|
+
&& Object.keys(value).sort().join(',') === dyfm_exactReceiptKeys;
|
|
23
|
+
}
|
|
24
|
+
/** Closed, immutable result-code registry indexed by its only valid terminal outcome. */
|
|
25
|
+
export const DyFM_zeroEgressResultCodesByOutcome = Object.freeze({
|
|
26
|
+
[DyFM_ZeroEgressOutcome_Type.completed]: Object.freeze([
|
|
27
|
+
DyFM_zeroEgressResultCode.completed,
|
|
28
|
+
]),
|
|
29
|
+
[DyFM_ZeroEgressOutcome_Type.cancelled]: Object.freeze([
|
|
30
|
+
DyFM_zeroEgressResultCode.cancelled,
|
|
31
|
+
DyFM_zeroEgressResultCode.cancelFallback,
|
|
32
|
+
]),
|
|
33
|
+
[DyFM_ZeroEgressOutcome_Type.timedOut]: Object.freeze([
|
|
34
|
+
DyFM_zeroEgressResultCode.timeout,
|
|
35
|
+
DyFM_zeroEgressResultCode.hostTimeout,
|
|
36
|
+
]),
|
|
37
|
+
[DyFM_ZeroEgressOutcome_Type.outputLimitExceeded]: Object.freeze([
|
|
38
|
+
DyFM_zeroEgressResultCode.outputLimit,
|
|
39
|
+
]),
|
|
40
|
+
[DyFM_ZeroEgressOutcome_Type.integrityRejected]: Object.freeze([
|
|
41
|
+
DyFM_zeroEgressResultCode.artifactIntegrity,
|
|
42
|
+
]),
|
|
43
|
+
[DyFM_ZeroEgressOutcome_Type.workerRejected]: Object.freeze([
|
|
44
|
+
DyFM_zeroEgressResultCode.workerError,
|
|
45
|
+
DyFM_zeroEgressResultCode.protocolInvalid,
|
|
46
|
+
]),
|
|
47
|
+
[DyFM_ZeroEgressOutcome_Type.hostFailed]: Object.freeze([
|
|
48
|
+
DyFM_zeroEgressResultCode.admissionDenied,
|
|
49
|
+
DyFM_zeroEgressResultCode.admissionFailed,
|
|
50
|
+
DyFM_zeroEgressResultCode.artifactBudgetInvalid,
|
|
51
|
+
DyFM_zeroEgressResultCode.artifactInvalid,
|
|
52
|
+
DyFM_zeroEgressResultCode.artifactLimit,
|
|
53
|
+
DyFM_zeroEgressResultCode.bootstrapFailed,
|
|
54
|
+
DyFM_zeroEgressResultCode.bootstrapLoadFailed,
|
|
55
|
+
DyFM_zeroEgressResultCode.bootstrapUrlRequired,
|
|
56
|
+
DyFM_zeroEgressResultCode.bootstrapUrlUntrusted,
|
|
57
|
+
DyFM_zeroEgressResultCode.browserRequired,
|
|
58
|
+
DyFM_zeroEgressResultCode.contractUnsupported,
|
|
59
|
+
DyFM_zeroEgressResultCode.epochInvalid,
|
|
60
|
+
DyFM_zeroEgressResultCode.inputBudgetInvalid,
|
|
61
|
+
DyFM_zeroEgressResultCode.inputInvalid,
|
|
62
|
+
DyFM_zeroEgressResultCode.inputLimit,
|
|
63
|
+
DyFM_zeroEgressResultCode.integrityUnavailable,
|
|
64
|
+
DyFM_zeroEgressResultCode.messageInvalid,
|
|
65
|
+
DyFM_zeroEgressResultCode.outputBudgetInvalid,
|
|
66
|
+
DyFM_zeroEgressResultCode.randomSeedInvalid,
|
|
67
|
+
DyFM_zeroEgressResultCode.readyReplayed,
|
|
68
|
+
DyFM_zeroEgressResultCode.responseInvalid,
|
|
69
|
+
DyFM_zeroEgressResultCode.runAlreadyActive,
|
|
70
|
+
DyFM_zeroEgressResultCode.runIdInvalid,
|
|
71
|
+
DyFM_zeroEgressResultCode.timeoutInvalid,
|
|
72
|
+
]),
|
|
73
|
+
});
|
|
74
|
+
const dyfm_allResultCodes = new Set(Object.values(DyFM_zeroEgressResultCodesByOutcome).flat());
|
|
75
|
+
/** Strict cross-runtime validation and content-free projection for zero-egress terminal evidence. */
|
|
76
|
+
export class DyFM_ZeroEgressReceipt_Util {
|
|
77
|
+
/** Narrows an untrusted value to one closed terminal outcome. */
|
|
78
|
+
static isOutcome(value) {
|
|
79
|
+
switch (value) {
|
|
80
|
+
case DyFM_ZeroEgressOutcome_Type.completed:
|
|
81
|
+
case DyFM_ZeroEgressOutcome_Type.cancelled:
|
|
82
|
+
case DyFM_ZeroEgressOutcome_Type.timedOut:
|
|
83
|
+
case DyFM_ZeroEgressOutcome_Type.outputLimitExceeded:
|
|
84
|
+
case DyFM_ZeroEgressOutcome_Type.integrityRejected:
|
|
85
|
+
case DyFM_ZeroEgressOutcome_Type.workerRejected:
|
|
86
|
+
case DyFM_ZeroEgressOutcome_Type.hostFailed:
|
|
87
|
+
return true;
|
|
88
|
+
default:
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Narrows an untrusted value to one closed runtime result code. */
|
|
93
|
+
static isResultCode(value) {
|
|
94
|
+
return typeof value === 'string' && dyfm_allResultCodes.has(value);
|
|
95
|
+
}
|
|
96
|
+
/** Validates that a result code belongs to exactly the supplied terminal outcome. */
|
|
97
|
+
static isOutcomeCodePair(outcome, code) {
|
|
98
|
+
return this.isOutcome(outcome)
|
|
99
|
+
&& this.isResultCode(code)
|
|
100
|
+
&& DyFM_zeroEgressResultCodesByOutcome[outcome].includes(code);
|
|
101
|
+
}
|
|
102
|
+
/** Validates and copies an exact receipt without reflecting any rejected input. */
|
|
103
|
+
static validate(value) {
|
|
104
|
+
try {
|
|
105
|
+
if (!dyfm_isRecord(value)
|
|
106
|
+
|| !dyfm_hasExactReceiptKeys(value)) {
|
|
107
|
+
return this.invalid();
|
|
108
|
+
}
|
|
109
|
+
const candidate = value;
|
|
110
|
+
if (candidate.contractVersion !== 'dyfm-zero-egress-receipt/1'
|
|
111
|
+
|| !this.isOutcome(candidate.outcome)
|
|
112
|
+
|| !this.isResultCode(candidate.code)
|
|
113
|
+
|| !this.isOutcomeCodePair(candidate.outcome, candidate.code)
|
|
114
|
+
|| !this.isDuration(candidate.elapsedMs)
|
|
115
|
+
|| !this.isByteCount(candidate.outputBytes)
|
|
116
|
+
|| (candidate.outcome !== DyFM_ZeroEgressOutcome_Type.completed
|
|
117
|
+
&& candidate.outputBytes !== 0)) {
|
|
118
|
+
return this.invalid();
|
|
119
|
+
}
|
|
120
|
+
const receipt = Object.freeze({
|
|
121
|
+
contractVersion: 'dyfm-zero-egress-receipt/1',
|
|
122
|
+
outcome: candidate.outcome,
|
|
123
|
+
code: candidate.code,
|
|
124
|
+
elapsedMs: candidate.elapsedMs,
|
|
125
|
+
outputBytes: candidate.outputBytes,
|
|
126
|
+
});
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
contractVersion: 'dyfm-zero-egress-receipt-validation/1',
|
|
129
|
+
valid: true,
|
|
130
|
+
code: 'DYFM|ZERO_EGRESS_RECEIPT|VALID',
|
|
131
|
+
receipt: receipt,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return this.invalid();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
static isDuration(value) {
|
|
139
|
+
return typeof value === 'number'
|
|
140
|
+
&& Number.isFinite(value)
|
|
141
|
+
&& value >= 0
|
|
142
|
+
&& value <= Number.MAX_SAFE_INTEGER;
|
|
143
|
+
}
|
|
144
|
+
static isByteCount(value) {
|
|
145
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
146
|
+
}
|
|
147
|
+
static invalid() {
|
|
148
|
+
return Object.freeze({
|
|
149
|
+
contractVersion: 'dyfm-zero-egress-receipt-validation/1',
|
|
150
|
+
valid: false,
|
|
151
|
+
code: 'DYFM|ZERO_EGRESS_RECEIPT|INVALID',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Closed runtime values shared by browser hosts, servers, and persisted receipt consumers. */
|
|
2
|
+
export const DyFM_zeroEgressResultCode = Object.freeze({
|
|
3
|
+
artifactBudgetInvalid: 'DYNX|SANDBOX|ARTIFACT_BUDGET_INVALID',
|
|
4
|
+
artifactIntegrity: 'DYNX|SANDBOX|ARTIFACT_INTEGRITY',
|
|
5
|
+
artifactInvalid: 'DYNX|SANDBOX|ARTIFACT_INVALID',
|
|
6
|
+
artifactLimit: 'DYNX|SANDBOX|ARTIFACT_LIMIT',
|
|
7
|
+
admissionDenied: 'DYNX|SANDBOX|ADMISSION_DENIED',
|
|
8
|
+
admissionFailed: 'DYNX|SANDBOX|ADMISSION_FAILED',
|
|
9
|
+
bootstrapFailed: 'DYNX|SANDBOX|BOOTSTRAP_FAILED',
|
|
10
|
+
bootstrapLoadFailed: 'DYNX|SANDBOX|BOOTSTRAP_LOAD_FAILED',
|
|
11
|
+
bootstrapUrlRequired: 'DYNX|SANDBOX|BOOTSTRAP_URL_REQUIRED',
|
|
12
|
+
bootstrapUrlUntrusted: 'DYNX|SANDBOX|BOOTSTRAP_URL_UNTRUSTED',
|
|
13
|
+
browserRequired: 'DYNX|SANDBOX|BROWSER_REQUIRED',
|
|
14
|
+
cancelFallback: 'DYNX|SANDBOX|CANCEL_FALLBACK',
|
|
15
|
+
cancelled: 'DYNX|SANDBOX|CANCELLED',
|
|
16
|
+
completed: 'DYNX|SANDBOX|COMPLETED',
|
|
17
|
+
contractUnsupported: 'DYNX|SANDBOX|CONTRACT_UNSUPPORTED',
|
|
18
|
+
epochInvalid: 'DYNX|SANDBOX|EPOCH_INVALID',
|
|
19
|
+
hostTimeout: 'DYNX|SANDBOX|HOST_TIMEOUT',
|
|
20
|
+
inputBudgetInvalid: 'DYNX|SANDBOX|INPUT_BUDGET_INVALID',
|
|
21
|
+
inputInvalid: 'DYNX|SANDBOX|INPUT_INVALID',
|
|
22
|
+
inputLimit: 'DYNX|SANDBOX|INPUT_LIMIT',
|
|
23
|
+
integrityUnavailable: 'DYNX|SANDBOX|INTEGRITY_UNAVAILABLE',
|
|
24
|
+
messageInvalid: 'DYNX|SANDBOX|MESSAGE_INVALID',
|
|
25
|
+
outputBudgetInvalid: 'DYNX|SANDBOX|OUTPUT_BUDGET_INVALID',
|
|
26
|
+
outputLimit: 'DYNX|SANDBOX|OUTPUT_LIMIT',
|
|
27
|
+
protocolInvalid: 'DYNX|SANDBOX|PROTOCOL_INVALID',
|
|
28
|
+
randomSeedInvalid: 'DYNX|SANDBOX|RANDOM_SEED_INVALID',
|
|
29
|
+
readyReplayed: 'DYNX|SANDBOX|READY_REPLAYED',
|
|
30
|
+
responseInvalid: 'DYNX|SANDBOX|RESPONSE_INVALID',
|
|
31
|
+
runAlreadyActive: 'DYNX|SANDBOX|RUN_ALREADY_ACTIVE',
|
|
32
|
+
runIdInvalid: 'DYNX|SANDBOX|RUN_ID_INVALID',
|
|
33
|
+
timeout: 'DYNX|SANDBOX|TIMEOUT',
|
|
34
|
+
timeoutInvalid: 'DYNX|SANDBOX|TIMEOUT_INVALID',
|
|
35
|
+
workerError: 'DYNX|SANDBOX|WORKER_ERROR',
|
|
36
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Stable terminal outcomes shared by zero-egress sandbox hosts and their consumers. */
|
|
2
|
+
export var DyFM_ZeroEgressOutcome_Type;
|
|
3
|
+
(function (DyFM_ZeroEgressOutcome_Type) {
|
|
4
|
+
DyFM_ZeroEgressOutcome_Type["completed"] = "completed";
|
|
5
|
+
DyFM_ZeroEgressOutcome_Type["cancelled"] = "cancelled";
|
|
6
|
+
DyFM_ZeroEgressOutcome_Type["timedOut"] = "timed-out";
|
|
7
|
+
DyFM_ZeroEgressOutcome_Type["outputLimitExceeded"] = "output-limit-exceeded";
|
|
8
|
+
DyFM_ZeroEgressOutcome_Type["integrityRejected"] = "integrity-rejected";
|
|
9
|
+
DyFM_ZeroEgressOutcome_Type["workerRejected"] = "worker-rejected";
|
|
10
|
+
DyFM_ZeroEgressOutcome_Type["hostFailed"] = "host-failed";
|
|
11
|
+
})(DyFM_ZeroEgressOutcome_Type || (DyFM_ZeroEgressOutcome_Type = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { DyFM_SECRET_PATTERNS, } from '../../../_collections/utils/secret-mask.util';
|
|
2
|
+
import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
|
|
3
|
+
/** Default reveal — az elso 4 + utolso 4 karakter (egysegben a secret-mask util default-javal). */
|
|
4
|
+
const DEFAULT_REVEAL = { prefix: 4, suffix: 4 };
|
|
5
|
+
/**
|
|
6
|
+
* A DyFM_StoredSecret masked-reszenek levezetese egy USER-SAJAT nyers secret-bol — ENCRYPT/DECRYPT
|
|
7
|
+
* NELKUL megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind` +
|
|
8
|
+
* a `keyLength`). A nyers ertek titkositasa NEM itt tortenik (a host/auth adja a kulcsot); ez a
|
|
9
|
+
* util csak a lathato reszt szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsanak.
|
|
10
|
+
*/
|
|
11
|
+
export class DyFM_StoredSecret_Util {
|
|
12
|
+
/**
|
|
13
|
+
* A secret fajtajanak detektalasa a kanonikus `DyFM_SECRET_PATTERNS`-szel (egysegesitett a
|
|
14
|
+
* masking-util kind-jeivel, pl. 'openai-key', 'anthropic-key', 'github-pat'). Az elso illeszkedo
|
|
15
|
+
* kind, vagy undefined ha egyik sem ismeri fel.
|
|
16
|
+
*/
|
|
17
|
+
static detectKind(rawSecret) {
|
|
18
|
+
if (!rawSecret) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
for (const pattern of DyFM_SECRET_PATTERNS) {
|
|
22
|
+
// a patternek global flag-esek (stateful lastIndex) — minden teszt elott nullazzuk
|
|
23
|
+
pattern.regex.lastIndex = 0;
|
|
24
|
+
if (pattern.regex.test(rawSecret)) {
|
|
25
|
+
pattern.regex.lastIndex = 0;
|
|
26
|
+
return pattern.kind;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A decrypt-nelkul megjelenitheto preview levezetese. Tul rovid secret-nel (vagy 0/0 reveal-nel)
|
|
33
|
+
* nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor tisztan opaque
|
|
34
|
+
* `...` preview. A `keyLength` ettol fuggetlenul mindig a nyers hossz.
|
|
35
|
+
*/
|
|
36
|
+
static derivePreview(rawSecret, reveal = DEFAULT_REVEAL) {
|
|
37
|
+
const kind = this.detectKind(rawSecret);
|
|
38
|
+
const keyLength = rawSecret ? rawSecret.length : 0;
|
|
39
|
+
const p = Math.max(0, reveal.prefix);
|
|
40
|
+
const s = Math.max(0, reveal.suffix);
|
|
41
|
+
if (!rawSecret || (p === 0 && s === 0) || rawSecret.length <= p + s + 4) {
|
|
42
|
+
return { maskedPreview: '...', keyLength: keyLength, kind: kind };
|
|
43
|
+
}
|
|
44
|
+
const head = rawSecret.slice(0, p);
|
|
45
|
+
const tail = rawSecret.slice(rawSecret.length - s);
|
|
46
|
+
return {
|
|
47
|
+
maskedPreview: `${head}...${tail}`,
|
|
48
|
+
keyLength: keyLength,
|
|
49
|
+
kind: kind,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Egy DyFM_StoredSecret osszeallitasa a USER-SAJAT nyers secret-bol — a masked-reszt levezeti,
|
|
54
|
+
* az `encryptedValue`-t a HIVO adja (a host/auth titkositja a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel;
|
|
55
|
+
* a nyers ertek itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
56
|
+
*/
|
|
57
|
+
static build(set) {
|
|
58
|
+
const preview = this.derivePreview(set.rawSecret, set.reveal ?? DEFAULT_REVEAL);
|
|
59
|
+
return new DyFM_StoredSecret({
|
|
60
|
+
label: set.label,
|
|
61
|
+
kind: preview.kind,
|
|
62
|
+
maskedPreview: preview.maskedPreview,
|
|
63
|
+
keyLength: preview.keyLength,
|
|
64
|
+
encryptedValue: set.encryptedValue,
|
|
65
|
+
isActive: true,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|