diff --git a/apps/node/.env.example-aws-ec2 b/apps/node/.env.example-aws-ec2 index 11e250d1..63084b7a 100644 --- a/apps/node/.env.example-aws-ec2 +++ b/apps/node/.env.example-aws-ec2 @@ -13,6 +13,9 @@ TWIN_HOST="0.0.0.0" # TWIN_HTTP_BODY_LIMITS= # TWIN_PUBLIC_ORIGIN="https://api.example.com:3000" # TWIN_FASTIFY_PLUGIN_TIMEOUT=30000 +## Web server type [fastify, hono, native] +# TWIN_WEB_SERVER_TYPE="fastify" +# TWIN_MIME_TYPE_PROCESSORS= # Global @@ -32,9 +35,6 @@ TWIN_DEBUG=true ## Use this for custom extension variables, e.g. TWIN_MY_EXTENSION_SECRET. # TWIN_ENV_ALLOW_LIST="" -## Enable the node having a unique ID, defaults to true. -# TWIN_NODE_IDENTITY_ENABLED="true" - ## Enable multi-tenant support, defaults to false. # TWIN_TENANT_ENABLED="true" @@ -52,6 +52,9 @@ TWIN_STORAGE_FILE_ROOT="/home/ec2-user/twin-node/" ## The file name of the state file, if this file does not exist it will be created with the bootstrap process # TWIN_STATE_FILENAME="engine-state.json" +## Comma separated list of native modules to initialise, defaults to node:buffer,node:crypto,node:zlib +# TWIN_NATIVE_MODULES="node:buffer,node:crypto,node:zlib" + #----------------------------- Connector Config -----------------------------# # AWS DynamoDB @@ -162,6 +165,8 @@ TWIN_IOTA_NETWORK="testnet" TWIN_IOTA_COIN_TYPE="4218" # TWIN_IOTA_GAS_STATION_ENDPOINT="" # TWIN_IOTA_GAS_STATION_AUTH_TOKEN="" +# TWIN_IOTA_GAS_BUDGET="" +# TWIN_IOTA_GAS_RESERVATION_DURATION="" # TWIN_IOTA_IDENTITY_PACKAGE_ID="" # Hashicorp Vault Connector @@ -251,6 +256,12 @@ TWIN_LOGGING_CONNECTOR="console,entity-storage" ## Number of rotated log files to retain, defaults to 5. Set to 0 to keep all rotated files. # TWIN_LOGGING_FILE_MAX_RETAINED_FILES="5" +## OpenTelemetry runtime settings, used when TWIN_LOGGING_CONNECTOR includes "open-telemetry". +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_NAME="twin-logging" +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_VERSION="1.0.0" +# TWIN_OPEN_TELEMETRY_LOGGING_PROMETHEUS_ENDPOINT="" +# TWIN_OPEN_TELEMETRY_LOGGING_PROCESSOR="batch" + # Vault Connector ## Vault Connector [entity-storage, hashicorp] @@ -361,6 +372,32 @@ TWIN_TELEMETRY_CONNECTOR="entity-storage" # TWIN_OPEN_TELEMETRY_TRACING_ENDPOINT="" # TWIN_OPEN_TELEMETRY_TRACING_PROCESSOR="batch" +# Authorization Connector + +## Authorization Connector [entity-storage, casbin] +TWIN_AUTHORIZATION_CONNECTOR="entity-storage" + +## The model identifier to use for authorization, defaults to system. +# TWIN_AUTHORIZATION_MODEL_ID="system" + +## Maximum number of cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_CAPACITY="" + +## Time-to-idle in milliseconds for cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_TTI_MS="" + +## Path to a JSON file containing the authorization model (policies and roleInheritances) to seed at startup. +# TWIN_AUTHORIZATION_MODEL="@json:authorization-model.json" + +## How to combine the authorization model with route-derived policies: merge (default) or replace. +# TWIN_AUTHORIZATION_MODEL_MODE="merge" + +# Casbin runtime settings, used when TWIN_AUTHORIZATION_CONNECTOR="casbin". +# TWIN_CASBIN_ENDPOINT="" +# TWIN_CASBIN_CLIENT_ID="" +# TWIN_CASBIN_CLIENT_SECRET="" +# TWIN_CASBIN_TIMEOUT_MS="" + # Faucet Connector ## Faucet Connector [entity-storage, iota] @@ -421,12 +458,9 @@ TWIN_IDENTITY_CONNECTOR="iota" TWIN_IDENTITY_PROFILE_CONNECTOR="entity-storage" ## Comma separated list of public and private profile properties which can only be added, changed or removed -## by callers with one of the admin scopes. Defaults to none. +## by callers with escalated privilege. Defaults to none. # TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES="" -## Comma separated list of scopes which allow the self update denied properties to be modified, any one is sufficient. -# TWIN_IDENTITY_PROFILE_ADMIN_SCOPES="user-admin,global-admin" - # Immutable Proof ## The assertion method from the identity to use in immutable proof operations @@ -487,6 +521,12 @@ TWIN_AUTH_PROCESSOR_TYPE="entity-storage" ## The HTTP header name used to pass the API key on requests, defaults to x-api-key. # TWIN_AUTH_API_KEY_HEADER="x-api-key" +## The minimum password length for new password validation, defaults to 15. +# TWIN_AUTH_MIN_PASSWORD_LENGTH="15" + +## The maximum password length for new password validation, defaults to 128. +# TWIN_AUTH_MAX_PASSWORD_LENGTH="128" + # Messaging ## Email protocol connectors, comma-separated [pop3, imap, gmail, outlook], configured by adding mailboxes @@ -697,6 +737,9 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## The maximum dispatches of a background task attempt before it is failed as interrupted, defaults to 3, -1 for no limit. # TWIN_BACKGROUND_TASK_MAX_DISPATCH_COUNT=3 +## Enable the task scheduler regardless of which other components are active, defaults to false. +# TWIN_TASK_SCHEDULER_ENABLED="false" + ## Automation ## The type of automation action to perform, e.g. fetch @@ -747,6 +790,21 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## Comma separated list of modules to load as extensions # TWIN_EXTENSIONS="" +## Root cache directory for extension modules, defaults to .tmp +# TWIN_EXTENSIONS_CACHE_DIRECTORY=".tmp" + +## Cache time-to-live in hours for extensions loaded over https, defaults to 24 +# TWIN_EXTENSIONS_CACHE_TTL_HOURS="24" + +## Clear the extension cache on startup, defaults to false +# TWIN_EXTENSIONS_CLEAR_CACHE="false" + +## Force a refresh of cached extensions, defaults to false +# TWIN_EXTENSIONS_FORCE_REFRESH="false" + +## Maximum download size in MB for extensions loaded over https, defaults to 10 +# TWIN_EXTENSIONS_MAX_SIZE_MB="10" + # REST Paths - Use the component name e.g. for logging or dataspaceControlPlane, dataspaceDataPlane # TWIN_REST_PATH_LOGGING="/foo-logging" # TWIN_REST_PATH_DATASPACE_CONTROL_PLANE="/foo-dataspace" diff --git a/apps/node/.env.example-bootstrap-dev b/apps/node/.env.example-bootstrap-dev index 563b4934..08b10f6f 100644 --- a/apps/node/.env.example-bootstrap-dev +++ b/apps/node/.env.example-bootstrap-dev @@ -38,3 +38,6 @@ TWIN_ADMIN_USER_NAME="admin@node" # Password for Node admin login, defaults to randomly generated, check logs for the generated password TWIN_ADMIN_USER_PASSWORD="yM5?NgPPAio+TmWx" + +# Comma separated list of roles for the Node admin user, defaults to global-admin,user-admin,identity-admin,identity-profile-admin,devops (plus tenant-admin when multi-tenant is enabled) +# TWIN_ADMIN_USER_ROLES="" diff --git a/apps/node/.env.example-federated-catalogue b/apps/node/.env.example-federated-catalogue index 3e111e94..e9b7ac16 100644 --- a/apps/node/.env.example-federated-catalogue +++ b/apps/node/.env.example-federated-catalogue @@ -47,6 +47,9 @@ TWIN_HOST="0.0.0.0" # TWIN_HTTP_BODY_LIMITS= # TWIN_PUBLIC_ORIGIN="https://api.example.com:3000" # TWIN_FASTIFY_PLUGIN_TIMEOUT=30000 +## Web server type [fastify, hono, native] +# TWIN_WEB_SERVER_TYPE="fastify" +# TWIN_MIME_TYPE_PROCESSORS= # Global @@ -66,9 +69,6 @@ TWIN_DEBUG=true ## Use this for custom extension variables, e.g. TWIN_MY_EXTENSION_SECRET. # TWIN_ENV_ALLOW_LIST="" -## Enable the node having a unique ID, defaults to true. -# TWIN_NODE_IDENTITY_ENABLED="true" - ## Enable multi-tenant support, defaults to false. # TWIN_TENANT_ENABLED="true" @@ -86,6 +86,9 @@ TWIN_STORAGE_FILE_ROOT="../../.local-data/twin-node-federated-catalogue/" ## The file name of the state file, if this file does not exist it will be created with the bootstrap process # TWIN_STATE_FILENAME="engine-state.json" +## Comma separated list of native modules to initialise, defaults to node:buffer,node:crypto,node:zlib +# TWIN_NATIVE_MODULES="node:buffer,node:crypto,node:zlib" + #----------------------------- Connector Config -----------------------------# # AWS DynamoDB @@ -196,6 +199,8 @@ TWIN_STORAGE_FILE_ROOT="../../.local-data/twin-node-federated-catalogue/" # TWIN_IOTA_COIN_TYPE="4218" # TWIN_IOTA_GAS_STATION_ENDPOINT="" # TWIN_IOTA_GAS_STATION_AUTH_TOKEN="" +# TWIN_IOTA_GAS_BUDGET="" +# TWIN_IOTA_GAS_RESERVATION_DURATION="" # TWIN_IOTA_IDENTITY_PACKAGE_ID="" # Hashicorp Vault Connector @@ -273,6 +278,25 @@ TWIN_LOGGING_CONNECTOR="console,entity-storage" ## Maximum entries deleted per retention cleanup batch (entity-storage logging), defaults to 1000. # TWIN_LOGGING_RETENTION_BATCH_SIZE="1000" +## File logging connector settings (only used when TWIN_LOGGING_CONNECTOR includes "file") +## Directory to write log files into. Required when using the file logging connector. +# TWIN_LOGGING_FILE_DIRECTORY="./logs" + +## Log filename, defaults to "app.log". +# TWIN_LOGGING_FILE_FILENAME="app.log" + +## Maximum log file size in bytes before rotation, defaults to 10485760 (10 MB). Set to 0 to disable rotation. +# TWIN_LOGGING_FILE_MAX_FILE_SIZE_BYTES="10485760" + +## Number of rotated log files to retain, defaults to 5. Set to 0 to keep all rotated files. +# TWIN_LOGGING_FILE_MAX_RETAINED_FILES="5" + +## OpenTelemetry runtime settings, used when TWIN_LOGGING_CONNECTOR includes "open-telemetry". +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_NAME="twin-logging" +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_VERSION="1.0.0" +# TWIN_OPEN_TELEMETRY_LOGGING_PROMETHEUS_ENDPOINT="" +# TWIN_OPEN_TELEMETRY_LOGGING_PROCESSOR="batch" + # Vault Connector ## Vault Connector [entity-storage, hashicorp] @@ -383,6 +407,32 @@ TWIN_TELEMETRY_CONNECTOR="entity-storage" # TWIN_OPEN_TELEMETRY_TRACING_ENDPOINT="" # TWIN_OPEN_TELEMETRY_TRACING_PROCESSOR="batch" +# Authorization Connector + +## Authorization Connector [entity-storage, casbin] +TWIN_AUTHORIZATION_CONNECTOR="entity-storage" + +## The model identifier to use for authorization, defaults to system. +# TWIN_AUTHORIZATION_MODEL_ID="system" + +## Maximum number of cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_CAPACITY="" + +## Time-to-idle in milliseconds for cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_TTI_MS="" + +## Path to a JSON file containing the authorization model (policies and roleInheritances) to seed at startup. +# TWIN_AUTHORIZATION_MODEL="@json:authorization-model.json" + +## How to combine the authorization model with route-derived policies: merge (default) or replace. +# TWIN_AUTHORIZATION_MODEL_MODE="merge" + +# Casbin runtime settings, used when TWIN_AUTHORIZATION_CONNECTOR="casbin". +# TWIN_CASBIN_ENDPOINT="" +# TWIN_CASBIN_CLIENT_ID="" +# TWIN_CASBIN_CLIENT_SECRET="" +# TWIN_CASBIN_TIMEOUT_MS="" + # Faucet Connector # Not applicable for a standalone catalogue node. @@ -447,12 +497,9 @@ TWIN_IDENTITY_CONNECTOR="entity-storage" TWIN_IDENTITY_PROFILE_CONNECTOR="entity-storage" ## Comma separated list of public and private profile properties which can only be added, changed or removed -## by callers with one of the admin scopes. Defaults to none. +## by callers with escalated privilege. Defaults to none. # TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES="" -## Comma separated list of scopes which allow the self update denied properties to be modified, any one is sufficient. -# TWIN_IDENTITY_PROFILE_ADMIN_SCOPES="user-admin,global-admin" - # Immutable Proof # Not applicable for a standalone catalogue node. @@ -515,6 +562,12 @@ TWIN_AUTH_PROCESSOR_TYPE="entity-storage" ## The HTTP header name used to pass the API key on requests, defaults to x-api-key. # TWIN_AUTH_API_KEY_HEADER="x-api-key" +## The minimum password length for new password validation, defaults to 15. +# TWIN_AUTH_MIN_PASSWORD_LENGTH="15" + +## The maximum password length for new password validation, defaults to 128. +# TWIN_AUTH_MAX_PASSWORD_LENGTH="128" + # Messaging # Not applicable for a standalone catalogue node. @@ -649,6 +702,9 @@ TWIN_FEDERATED_CATALOGUE_FILTERS="filter-by-metadata" ## Required for PULL or PUSH transfers. # TWIN_DATASPACE_DATA_PLANE_PATH="dataspace" +## Whether the provider immediately starts a transfer once it has been requested. Defaults to false. +# TWIN_DATASPACE_AUTO_START_TRANSFERS="false" + ## TTL in milliseconds for caching dataspace agreements in the control plane service. # TWIN_DATASPACE_AGREEMENT_CACHE_TTL="" @@ -676,6 +732,15 @@ TWIN_FEDERATED_CATALOGUE_FILTERS="filter-by-metadata" ## Interval in milliseconds between orphaned push subscription cleanup scans. # TWIN_DATASPACE_PUSH_SUBSCRIPTION_CLEANUP_INTERVAL="" +## How long in seconds a negotiation may sit without progress before it times out. +# TWIN_DATASPACE_STALLED_NEGOTIATION_TIMEOUT="30" + +## How long in seconds a consumer transfer may sit in REQUESTED before it times out. +# TWIN_DATASPACE_STALLED_TRANSFER_TIMEOUT="30" + +## How long in seconds COMPLETED/TERMINATED transfer records are kept before removal, -1 keeps them forever. +# TWIN_DATASPACE_RETAIN_TERMINAL_TRANSFERS_FOR="2592000" + ## How long in seconds a provider transfer may remain idle before the idle policy marks it as stalled. # TWIN_DATASPACE_PROVIDER_TRANSFER_IDLE_TIMEOUT="30" @@ -722,6 +787,9 @@ TWIN_FEDERATED_CATALOGUE_FILTERS="filter-by-metadata" ## The maximum dispatches of a background task attempt before it is failed as interrupted, defaults to 3, -1 for no limit. # TWIN_BACKGROUND_TASK_MAX_DISPATCH_COUNT=3 +## Enable the task scheduler regardless of which other components are active, defaults to false. +# TWIN_TASK_SCHEDULER_ENABLED="false" + ## Automation # Not applicable for a standalone catalogue node. @@ -773,6 +841,21 @@ TWIN_FEDERATED_CATALOGUE_MUTEX_TIMEOUT="30000" ## Comma separated list of modules to load as extensions # TWIN_EXTENSIONS="" +## Root cache directory for extension modules, defaults to .tmp +# TWIN_EXTENSIONS_CACHE_DIRECTORY=".tmp" + +## Cache time-to-live in hours for extensions loaded over https, defaults to 24 +# TWIN_EXTENSIONS_CACHE_TTL_HOURS="24" + +## Clear the extension cache on startup, defaults to false +# TWIN_EXTENSIONS_CLEAR_CACHE="false" + +## Force a refresh of cached extensions, defaults to false +# TWIN_EXTENSIONS_FORCE_REFRESH="false" + +## Maximum download size in MB for extensions loaded over https, defaults to 10 +# TWIN_EXTENSIONS_MAX_SIZE_MB="10" + # REST Paths - Use the component name e.g. for logging or dataspaceControlPlane, dataspaceDataPlane # TWIN_REST_PATH_LOGGING="/foo-logging" # TWIN_REST_PATH_DATASPACE_CONTROL_PLANE="/foo-dataspace" diff --git a/apps/node/.env.example-iota-testnet b/apps/node/.env.example-iota-testnet index 02e9cf8c..7c5703a5 100644 --- a/apps/node/.env.example-iota-testnet +++ b/apps/node/.env.example-iota-testnet @@ -13,6 +13,9 @@ TWIN_HOST="0.0.0.0" # TWIN_HTTP_BODY_LIMITS= # TWIN_PUBLIC_ORIGIN="https://api.example.com:3000" # TWIN_FASTIFY_PLUGIN_TIMEOUT=30000 +## Web server type [fastify, hono, native] +# TWIN_WEB_SERVER_TYPE="fastify" +# TWIN_MIME_TYPE_PROCESSORS= # Global @@ -32,9 +35,6 @@ TWIN_DEBUG=true ## Use this for custom extension variables, e.g. TWIN_MY_EXTENSION_SECRET. # TWIN_ENV_ALLOW_LIST="" -## Enable the node having a unique ID, defaults to true. -# TWIN_NODE_IDENTITY_ENABLED="true" - ## Enable multi-tenant support, defaults to false. # TWIN_TENANT_ENABLED="true" @@ -52,6 +52,9 @@ TWIN_STORAGE_FILE_ROOT="../../.local-data/twin-node-iota/" ## The file name of the state file, if this file does not exist it will be created with the bootstrap process # TWIN_STATE_FILENAME="engine-state.json" +## Comma separated list of native modules to initialise, defaults to node:buffer,node:crypto,node:zlib +# TWIN_NATIVE_MODULES="node:buffer,node:crypto,node:zlib" + #----------------------------- Connector Config -----------------------------# # AWS DynamoDB @@ -253,6 +256,12 @@ TWIN_LOGGING_CONNECTOR="console,entity-storage" ## Number of rotated log files to retain, defaults to 5. Set to 0 to keep all rotated files. # TWIN_LOGGING_FILE_MAX_RETAINED_FILES="5" +## OpenTelemetry runtime settings, used when TWIN_LOGGING_CONNECTOR includes "open-telemetry". +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_NAME="twin-logging" +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_VERSION="1.0.0" +# TWIN_OPEN_TELEMETRY_LOGGING_PROMETHEUS_ENDPOINT="" +# TWIN_OPEN_TELEMETRY_LOGGING_PROCESSOR="batch" + # Vault Connector ## Vault Connector [entity-storage, hashicorp] @@ -363,6 +372,32 @@ TWIN_TELEMETRY_CONNECTOR="entity-storage" # TWIN_OPEN_TELEMETRY_TRACING_ENDPOINT="" # TWIN_OPEN_TELEMETRY_TRACING_PROCESSOR="batch" +# Authorization Connector + +## Authorization Connector [entity-storage, casbin] +TWIN_AUTHORIZATION_CONNECTOR="entity-storage" + +## The model identifier to use for authorization, defaults to system. +# TWIN_AUTHORIZATION_MODEL_ID="system" + +## Maximum number of cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_CAPACITY="" + +## Time-to-idle in milliseconds for cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_TTI_MS="" + +## Path to a JSON file containing the authorization model (policies and roleInheritances) to seed at startup. +# TWIN_AUTHORIZATION_MODEL="@json:authorization-model.json" + +## How to combine the authorization model with route-derived policies: merge (default) or replace. +# TWIN_AUTHORIZATION_MODEL_MODE="merge" + +# Casbin runtime settings, used when TWIN_AUTHORIZATION_CONNECTOR="casbin". +# TWIN_CASBIN_ENDPOINT="" +# TWIN_CASBIN_CLIENT_ID="" +# TWIN_CASBIN_CLIENT_SECRET="" +# TWIN_CASBIN_TIMEOUT_MS="" + # Faucet Connector ## Faucet Connector [entity-storage, iota] @@ -423,12 +458,9 @@ TWIN_IDENTITY_CONNECTOR="iota" TWIN_IDENTITY_PROFILE_CONNECTOR="entity-storage" ## Comma separated list of public and private profile properties which can only be added, changed or removed -## by callers with one of the admin scopes. Defaults to none. +## by callers with escalated privilege. Defaults to none. # TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES="" -## Comma separated list of scopes which allow the self update denied properties to be modified, any one is sufficient. -# TWIN_IDENTITY_PROFILE_ADMIN_SCOPES="user-admin,global-admin" - # Immutable Proof ## The assertion method from the identity to use in immutable proof operations @@ -489,6 +521,12 @@ TWIN_AUTH_PROCESSOR_TYPE="entity-storage" ## The HTTP header name used to pass the API key on requests, defaults to x-api-key. # TWIN_AUTH_API_KEY_HEADER="x-api-key" +## The minimum password length for new password validation, defaults to 15. +# TWIN_AUTH_MIN_PASSWORD_LENGTH="15" + +## The maximum password length for new password validation, defaults to 128. +# TWIN_AUTH_MAX_PASSWORD_LENGTH="128" + # Messaging @@ -607,7 +645,7 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" # TWIN_DATASPACE_RETAIN_ACTIVITY_LOGS_FOR="600" ## The interval in seconds for cleaning up the activity logs. -# TWIN_DATASPACE_ACTIVITY_LOGS_CLEAN_UP_INTERVAL="3600" +# TWIN_DATASPACE_ACTIVITY_LOGS_CLEANUP_INTERVAL="3600" ## Base route path for the data plane service (path only, not full URL). ## Combined with the public origin to form the data-address endpoint for PULL consumers and the inbox URL for PUSH providers. @@ -700,6 +738,9 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## The maximum dispatches of a background task attempt before it is failed as interrupted, defaults to 3, -1 for no limit. # TWIN_BACKGROUND_TASK_MAX_DISPATCH_COUNT=3 +## Enable the task scheduler regardless of which other components are active, defaults to false. +# TWIN_TASK_SCHEDULER_ENABLED="false" + ## Automation ## The type of automation action to perform, e.g. fetch @@ -750,6 +791,21 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## Comma separated list of modules to load as extensions # TWIN_EXTENSIONS="" +## Root cache directory for extension modules, defaults to .tmp +# TWIN_EXTENSIONS_CACHE_DIRECTORY=".tmp" + +## Cache time-to-live in hours for extensions loaded over https, defaults to 24 +# TWIN_EXTENSIONS_CACHE_TTL_HOURS="24" + +## Clear the extension cache on startup, defaults to false +# TWIN_EXTENSIONS_CLEAR_CACHE="false" + +## Force a refresh of cached extensions, defaults to false +# TWIN_EXTENSIONS_FORCE_REFRESH="false" + +## Maximum download size in MB for extensions loaded over https, defaults to 10 +# TWIN_EXTENSIONS_MAX_SIZE_MB="10" + # REST Paths - Use the component name e.g. for logging or dataspaceControlPlane, dataspaceDataPlane # TWIN_REST_PATH_LOGGING="/foo-logging" # TWIN_REST_PATH_DATASPACE_CONTROL_PLANE="/foo-dataspace" diff --git a/apps/node/.env.example-local-entity-storage b/apps/node/.env.example-local-entity-storage index 62ecc019..ce5981fc 100644 --- a/apps/node/.env.example-local-entity-storage +++ b/apps/node/.env.example-local-entity-storage @@ -13,6 +13,9 @@ TWIN_HOST="0.0.0.0" # TWIN_HTTP_BODY_LIMITS= # TWIN_PUBLIC_ORIGIN="https://api.example.com:3000" # TWIN_FASTIFY_PLUGIN_TIMEOUT=30000 +## Web server type [fastify, hono, native] +# TWIN_WEB_SERVER_TYPE="fastify" +# TWIN_MIME_TYPE_PROCESSORS= # Global @@ -32,9 +35,6 @@ TWIN_DEBUG=true ## Use this for custom extension variables, e.g. TWIN_MY_EXTENSION_SECRET. # TWIN_ENV_ALLOW_LIST="" -## Enable the node having a unique ID, defaults to true. -# TWIN_NODE_IDENTITY_ENABLED="true" - ## Enable multi-tenant support, defaults to false. # TWIN_TENANT_ENABLED="true" @@ -52,6 +52,9 @@ TWIN_STORAGE_FILE_ROOT="../../.local-data/twin-node-entity-storage/" ## The file name of the state file, if this file does not exist it will be created with the bootstrap process # TWIN_STATE_FILENAME="engine-state.json" +## Comma separated list of native modules to initialise, defaults to node:buffer,node:crypto,node:zlib +# TWIN_NATIVE_MODULES="node:buffer,node:crypto,node:zlib" + #----------------------------- Connector Config -----------------------------# # AWS DynamoDB @@ -162,6 +165,8 @@ TWIN_STORAGE_FILE_ROOT="../../.local-data/twin-node-entity-storage/" # TWIN_IOTA_COIN_TYPE="4218" # TWIN_IOTA_GAS_STATION_ENDPOINT="" # TWIN_IOTA_GAS_STATION_AUTH_TOKEN="" +# TWIN_IOTA_GAS_BUDGET="" +# TWIN_IOTA_GAS_RESERVATION_DURATION="" # TWIN_IOTA_IDENTITY_PACKAGE_ID="" # Hashicorp Vault Connector @@ -251,6 +256,12 @@ TWIN_LOGGING_CONNECTOR="console,entity-storage" ## Number of rotated log files to retain, defaults to 5. Set to 0 to keep all rotated files. # TWIN_LOGGING_FILE_MAX_RETAINED_FILES="5" +## OpenTelemetry runtime settings, used when TWIN_LOGGING_CONNECTOR includes "open-telemetry". +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_NAME="twin-logging" +# TWIN_OPEN_TELEMETRY_LOGGING_LOGGER_VERSION="1.0.0" +# TWIN_OPEN_TELEMETRY_LOGGING_PROMETHEUS_ENDPOINT="" +# TWIN_OPEN_TELEMETRY_LOGGING_PROCESSOR="batch" + # Vault Connector ## Vault Connector [entity-storage, hashicorp] @@ -361,6 +372,32 @@ TWIN_TELEMETRY_CONNECTOR="entity-storage" # TWIN_OPEN_TELEMETRY_TRACING_ENDPOINT="" # TWIN_OPEN_TELEMETRY_TRACING_PROCESSOR="batch" +# Authorization Connector + +## Authorization Connector [entity-storage, casbin] +TWIN_AUTHORIZATION_CONNECTOR="entity-storage" + +## The model identifier to use for authorization, defaults to system. +# TWIN_AUTHORIZATION_MODEL_ID="system" + +## Maximum number of cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_CAPACITY="" + +## Time-to-idle in milliseconds for cached authorisation check results. +# TWIN_AUTHORIZATION_CHECK_CACHE_TTI_MS="" + +## Path to a JSON file containing the authorization model (policies and roleInheritances) to seed at startup. +# TWIN_AUTHORIZATION_MODEL="@json:authorization-model.json" + +## How to combine the authorization model with route-derived policies: merge (default) or replace. +# TWIN_AUTHORIZATION_MODEL_MODE="merge" + +# Casbin runtime settings, used when TWIN_AUTHORIZATION_CONNECTOR="casbin". +# TWIN_CASBIN_ENDPOINT="" +# TWIN_CASBIN_CLIENT_ID="" +# TWIN_CASBIN_CLIENT_SECRET="" +# TWIN_CASBIN_TIMEOUT_MS="" + # Faucet Connector ## Faucet Connector [entity-storage, iota] @@ -421,12 +458,9 @@ TWIN_IDENTITY_CONNECTOR="entity-storage" TWIN_IDENTITY_PROFILE_CONNECTOR="entity-storage" ## Comma separated list of public and private profile properties which can only be added, changed or removed -## by callers with one of the admin scopes. Defaults to none. +## by callers with escalated privilege. Defaults to none. # TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES="" -## Comma separated list of scopes which allow the self update denied properties to be modified, any one is sufficient. -# TWIN_IDENTITY_PROFILE_ADMIN_SCOPES="user-admin,global-admin" - # Immutable Proof ## The assertion method from the identity to use in immutable proof operations @@ -487,6 +521,12 @@ TWIN_AUTH_PROCESSOR_TYPE="entity-storage" ## The HTTP header name used to pass the API key on requests, defaults to x-api-key. # TWIN_AUTH_API_KEY_HEADER="x-api-key" +## The minimum password length for new password validation, defaults to 15. +# TWIN_AUTH_MIN_PASSWORD_LENGTH="15" + +## The maximum password length for new password validation, defaults to 128. +# TWIN_AUTH_MAX_PASSWORD_LENGTH="128" + # Messaging ## Email protocol connectors, comma-separated [pop3, imap, gmail, outlook], configured by adding mailboxes @@ -697,6 +737,9 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## The maximum dispatches of a background task attempt before it is failed as interrupted, defaults to 3, -1 for no limit. # TWIN_BACKGROUND_TASK_MAX_DISPATCH_COUNT=3 +## Enable the task scheduler regardless of which other components are active, defaults to false. +# TWIN_TASK_SCHEDULER_ENABLED="false" + ## Automation ## The type of automation action to perform, e.g. fetch @@ -747,6 +790,21 @@ TWIN_DOCUMENT_MANAGEMENT_ENABLED="true" ## Comma separated list of modules to load as extensions # TWIN_EXTENSIONS="" +## Root cache directory for extension modules, defaults to .tmp +# TWIN_EXTENSIONS_CACHE_DIRECTORY=".tmp" + +## Cache time-to-live in hours for extensions loaded over https, defaults to 24 +# TWIN_EXTENSIONS_CACHE_TTL_HOURS="24" + +## Clear the extension cache on startup, defaults to false +# TWIN_EXTENSIONS_CLEAR_CACHE="false" + +## Force a refresh of cached extensions, defaults to false +# TWIN_EXTENSIONS_FORCE_REFRESH="false" + +## Maximum download size in MB for extensions loaded over https, defaults to 10 +# TWIN_EXTENSIONS_MAX_SIZE_MB="10" + # REST Paths - Use the component name e.g. for logging or dataspaceControlPlane, dataspaceDataPlane # TWIN_REST_PATH_LOGGING="/foo-logging" # TWIN_REST_PATH_DATASPACE_CONTROL_PLANE="/foo-dataspace" diff --git a/apps/node/package.json b/apps/node/package.json index 88c0a8b3..6c9b4d49 100644 --- a/apps/node/package.json +++ b/apps/node/package.json @@ -35,7 +35,6 @@ "@3sixty/node-core": "0.20.0-next.1" }, "devDependencies": { - "@3sixty/entity-storage-connector-memory": "next", "@3sixty/merge-locales": "next", "@3sixty/nameof-transformer": "next", "@3sixty/nameof-vitest-plugin": "next", @@ -44,11 +43,8 @@ "@types/node": "26.6.5", "@vitest/coverage-v8": "5.0.5", "concurrently": "10.0.6", - "copyfiles": "2.4.1", "nodemon": "3.1.14", "rimraf": "6.1.3", - "typedoc": "0.28.20", - "typedoc-plugin-markdown": "4.14.1", "typescript": "6.0.3", "vitest": "5.0.5" }, diff --git a/apps/node/soak/config/soak.file-local.env b/apps/node/soak/config/soak.file-local.env index ebc7fda3..d583a340 100644 --- a/apps/node/soak/config/soak.file-local.env +++ b/apps/node/soak/config/soak.file-local.env @@ -21,6 +21,7 @@ TWIN_EVENT_BUS_COMPONENT=service # --- auth --- TWIN_AUTH_ADMIN_PROCESSOR_TYPE=entity-storage TWIN_AUTH_PROCESSOR_TYPE=entity-storage +TWIN_AUTHORIZATION_CONNECTOR=entity-storage # --- health (enables the /health endpoint; the harness readiness probe uses /readyz) --- TWIN_HEALTH_ENABLED=true diff --git a/apps/node/soak/config/soak.mysql-local.env b/apps/node/soak/config/soak.mysql-local.env index 84afdbd2..73bd35bb 100644 --- a/apps/node/soak/config/soak.mysql-local.env +++ b/apps/node/soak/config/soak.mysql-local.env @@ -34,6 +34,7 @@ TWIN_EVENT_BUS_COMPONENT=service # --- auth --- TWIN_AUTH_ADMIN_PROCESSOR_TYPE=entity-storage TWIN_AUTH_PROCESSOR_TYPE=entity-storage +TWIN_AUTHORIZATION_CONNECTOR=entity-storage # --- health (enables the /health endpoint; the harness readiness probe uses /readyz) --- TWIN_HEALTH_ENABLED=true diff --git a/apps/node/soak/run-soak.mjs b/apps/node/soak/run-soak.mjs index dac354d8..5b70da6b 100644 --- a/apps/node/soak/run-soak.mjs +++ b/apps/node/soak/run-soak.mjs @@ -93,7 +93,9 @@ const cfg = { tenantApiKey: process.env.SOAK_TENANT_API_KEY ?? '9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d', adminEmail: process.env.SOAK_ADMIN_EMAIL ?? 'admin@node', adminPassword: process.env.SOAK_ADMIN_PASSWORD ?? 'Admin@Node12345!', - adminScope: process.env.SOAK_ADMIN_SCOPE ?? 'tenant-admin,user-admin' + adminRoles: + process.env.SOAK_ADMIN_ROLES ?? + 'tenant-admin,user-admin,devops,identity-admin,identity-profile-admin' }; const OUT_DIR = path.join(__dirname, '.out'); @@ -412,7 +414,7 @@ async function bootstrap(nodeEnv) { TWIN_FEATURES: 'admin-user', TWIN_ADMIN_USER_NAME: cfg.adminEmail, TWIN_ADMIN_USER_PASSWORD: cfg.adminPassword, - TWIN_ADMIN_USER_SCOPE: cfg.adminScope + TWIN_ADMIN_USER_ROLES: cfg.adminRoles }; const code = await runToCompletion(['bootstrap-dev'], bootstrapEnv); diff --git a/apps/node/ts-to-openapi.json b/apps/node/ts-to-openapi.json index b9fee467..bb8b8e07 100644 --- a/apps/node/ts-to-openapi.json +++ b/apps/node/ts-to-openapi.json @@ -12,6 +12,9 @@ { "package": "@3sixty/api-auth-entity-storage-service" }, + { + "package": "@3sixty/api-auth-service" + }, { "package": "@3sixty/identity-service" }, @@ -63,23 +66,26 @@ } ] }, - { - "package": "@3sixty/document-management-service" - }, { "package": "@3sixty/federated-catalogue-service" }, { "package": "@3sixty/dataspace-data-plane-service" }, - { - "package": "@3sixty/dataspace-data-plane-service" - }, { "package": "@3sixty/dataspace-control-plane-service" }, { "package": "@3sixty/rights-management-service" + }, + { + "package": "@3sixty/tracing-service" + }, + { + "package": "@3sixty/authorization-service" + }, + { + "package": "@3sixty/api-tenant-processor" } ], "authMethods": ["jwtBearer"], diff --git a/cspell.json b/cspell.json index 661bd5a8..4c59a004 100644 --- a/cspell.json +++ b/cspell.json @@ -76,6 +76,8 @@ "readyz", "renderable", "reqs", + "casbin", + "Casbin", "sawtooth", "scylladb", "Segoe", diff --git a/docs/architecture/authorization-defaults-diagrams.jsx b/docs/architecture/authorization-defaults-diagrams.jsx new file mode 100644 index 00000000..07b05157 --- /dev/null +++ b/docs/architecture/authorization-defaults-diagrams.jsx @@ -0,0 +1,532 @@ +const bg = '#F8F9FB'; +const surface = '#FFFFFF'; +const border = '#E2E8F0'; +const textPrimary = '#1E293B'; +const textMuted = '#64748B'; + +const roles = { + globalAdmin: { label: 'global-admin', bg: '#EDE9FE', color: '#5B21B6', border: '#C4B5FD' }, + identityAdmin: { label: 'identity-admin', bg: '#E0F2FE', color: '#0369A1', border: '#BAE6FD' }, + userAdmin: { label: 'user-admin', bg: '#CCFBF1', color: '#0F766E', border: '#99F6E4' }, + identityProfileAdmin: { + label: 'identity-profile-admin', + bg: '#FCE7F3', + color: '#BE185D', + border: '#FBCFE8' + }, + devops: { label: 'devops', bg: '#FEF3C7', color: '#92400E', border: '#FDE68A' }, + tenantAdmin: { label: 'tenant-admin', bg: '#F3E8FF', color: '#6D28D9', border: '#DDD6FE' }, + user: { label: 'user', bg: '#F1F5F9', color: '#475569', border: '#CBD5E1' } +}; + +const perms = { + identity: { color: '#0369A1', bg: 'rgba(3,105,161,0.08)' }, + user: { color: '#475569', bg: 'rgba(71,85,105,0.08)' }, + userAdmin: { color: '#15803D', bg: 'rgba(21,128,61,0.08)' }, + identityProfile: { color: '#BE185D', bg: 'rgba(190,24,93,0.08)' }, + auth: { color: '#0F766E', bg: 'rgba(15,118,110,0.08)' }, + devops: { color: '#92400E', bg: 'rgba(146,64,14,0.08)' }, + tenant: { color: '#6D28D9', bg: 'rgba(109,40,217,0.08)' } +}; + +function RoleChip({ role, small }) { + const r = roles[role]; + return ( + + {r.label} + + ); +} + +function PermChip({ ns, label }) { + const p = perms[ns]; + return ( + + {label} + + ); +} + +export function RoleHierarchyDiagram() { + const rowStyle = { + display: 'flex', + alignItems: 'center', + gap: '10px', + padding: '8px 0' + }; + + const connectorCol = { + width: '32px', + flexShrink: 0, + display: 'flex', + flexDirection: 'column', + alignItems: 'center' + }; + + const rows = [ + { role: 'identityAdmin', last: false }, + { role: 'userAdmin', last: false }, + { role: 'identityProfileAdmin', last: false }, + { role: 'devops', last: false, note: null }, + { role: 'tenantAdmin', last: false, note: 'multi-tenant mode only' }, + { role: 'user', last: true, note: 'base authenticated role' } + ]; + + return ( +
+

+ Role Hierarchy +

+ + {/* global-admin root */} +
+ + + inherits all roles below + +
+ + {/* rows */} + {rows.map(({ role, last, note }, i) => ( +
+ {/* tree connector */} +
+ {!last && ( +
+ )} + {last && ( +
+ )} +
+
+ +
+ + {role !== 'user' && ( + + → inherits + + )} + {note && ( + + {note} + + )} +
+
+ ))} +
+ ); +} + +export function PermissionNamespacesDiagram() { + const namespaces = [ + { + ns: 'identity', + label: 'identity:*', + desc: 'Identity and credential management', + role: 'identityAdmin', + items: [ + { + perm: 'identity:write', + note: 'Create/remove DIDs, VCs, proofs; revoke and reinstate credentials' + }, + { + perm: 'user:read', + note: 'Resolve DID (GET, verb fallback)', + fallback: true + }, + { + perm: 'user:write', + note: 'Verify VC/VP/proof (POST, verb fallback)', + fallback: true + } + ] + }, + { + ns: 'user', + label: 'user:*', + desc: 'Authenticated user operations', + role: 'user', + items: [ + { perm: 'user:read', note: 'Standard GET operations (verb fallback)', fallback: true }, + { + perm: 'user:write', + note: 'Standard POST/PUT/PATCH/DELETE (verb fallback); inherits user:read', + fallback: true + } + ] + }, + { + ns: 'userAdmin', + label: 'user-admin:*', + desc: 'User administration', + role: 'userAdmin', + items: [ + { perm: 'user-admin:read', note: 'Get user, get by identity, get and query audit' }, + { + perm: 'user-admin:write', + note: 'Create/update/remove user, password reset, create/update/remove audit; inherits user-admin:read' + } + ] + }, + { + ns: 'identityProfile', + label: 'identity-profile:*', + desc: 'Identity profile administration', + role: 'identityProfileAdmin', + items: [ + { perm: 'identity-profile:read', note: 'Get and list identity profiles' }, + { + perm: 'identity-profile:write', + note: 'Update and remove identity profiles; inherits identity-profile:read' + } + ] + }, + { + ns: 'auth', + label: 'authorization:*', + desc: 'Authorization policy management', + role: 'userAdmin', + items: [ + { + perm: 'authorization:read', + note: 'Get policies, roles, role assignments, inheritances, check access' + }, + { + perm: 'authorization:write', + note: 'Build model, add/remove policies, role assignments, inheritances; inherits authorization:read' + } + ] + }, + { + ns: 'devops', + label: 'health:* / logging:* / tracing:* / telemetry:*', + desc: 'Observability and infrastructure', + role: 'devops', + items: [ + { perm: 'health:read', note: 'Server health status' }, + { perm: 'logging:read', note: 'List log entries' }, + { perm: 'logging:write', note: 'Create log entries; inherits logging:read' }, + { perm: 'tracing:read', note: 'List spans, get traces' }, + { perm: 'tracing:write', note: 'Start and end spans; inherits tracing:read' }, + { perm: 'telemetry:read', note: 'Get metrics, list entries, get values' }, + { + perm: 'telemetry:write', + note: 'Create/update/remove metrics, add values; inherits telemetry:read' + } + ] + }, + { + ns: 'tenant', + label: 'tenant:*', + desc: 'Tenant administration', + role: 'tenantAdmin', + note: 'Seeded only when TWIN_TENANT_ENABLED=true', + items: [ + { perm: 'tenant:read', note: 'List and get tenants' }, + { perm: 'tenant:write', note: 'Create, update, and remove tenants; inherits tenant:read' } + ] + } + ]; + + return ( +
+ {namespaces.map(({ ns, label, desc, role, roles: multiRoles, items, note }) => { + const p = perms[ns]; + return ( +
+ {/* header */} +
+ + {label} + + {desc} + {note && ( + + {note} + + )} +
+ {multiRoles ? ( + multiRoles.map(r => ) + ) : ( + + )} +
+
+ + {/* permission rows */} +
+ {items.map((item, i) => ( +
+
+ + {item.fallback && ( + + verb fallback + + )} + {item.role && !item.fallback && } +
+ {item.note} +
+ ))} +
+
+ ); + })} +
+ ); +} + +export function VerbFallbackDiagram() { + const methods = [ + { method: 'GET', perm: 'user:read', role: 'user', inherits: null }, + { + method: 'POST / PUT / PATCH / DELETE', + perm: 'user:write', + role: 'user', + inherits: 'user:read' + } + ]; + + return ( +
+
+ {['HTTP Method', 'Permission', 'Role'].map(h => ( +
+ {h} +
+ ))} +
+ {methods.map(({ method, perm, role, inherits }, i) => ( +
+
+ {method} +
+
+ + {inherits && ( + + inherits {inherits} + + )} +
+
+ +
+
+ ))} +
+ ); +} diff --git a/docs/architecture/authorization-defaults.mdx b/docs/architecture/authorization-defaults.mdx new file mode 100644 index 00000000..f0934695 --- /dev/null +++ b/docs/architecture/authorization-defaults.mdx @@ -0,0 +1,136 @@ +--- +category: node +order: 10 +--- + +import { + RoleHierarchyDiagram, + PermissionNamespacesDiagram, + VerbFallbackDiagram +} from './authorization-defaults-diagrams.jsx'; + +# Default Authorization Seeding + +On every startup, `seedAuthorizationDefaults` derives RBAC policies from the registered REST routes and writes them to the authorization store via the authorization component. Seeding is additive - policies for operations that no longer exist are not removed, so renaming an operation leaves its old policy in the store. + +The function processes every route returned by `server.getRestRoutes()`. Routes with an explicit `defaultAuthorization` are always seeded. The verb-based fallback is only applied to routes that both require authentication (`skipAuth` is not `true` and `requiresAuthorization` is not `false`) and declare no `defaultAuthorization`. + +## Role Hierarchy + +{RoleHierarchyDiagram()} + +`global-admin` inherits every role. Every non-`user` role inherits `user`, giving all elevated roles the baseline authenticated-user permissions. + +`tenant-admin` is only seeded when the node is running in multi-tenant mode (`TWIN_TENANT_ENABLED=true`). + +## Permission Namespaces + +Each permission namespace is seeded from the routes that belong to that namespace. Write permissions inherit their read counterpart within the same namespace. + +{PermissionNamespacesDiagram()} + +### `user` - authenticated user operations + +Seeded from the verb-based fallback for routes that do not declare an explicit `defaultAuthorization`. + +| Permission | Role | Notes | +| ------------ | ------ | ------------------------------------------------------------------------ | +| `user:read` | `user` | GET routes (verb fallback) | +| `user:write` | `user` | POST / PUT / PATCH / DELETE routes (verb fallback), inherits `user:read` | + +### `identity` - identity and credential management + +Seeded from the identity service routes. + +| Permission | Role | Notes | +| ---------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `identity:write` | `identity-admin` | Create/remove DIDs, verification methods, services, also-known-as entries, VCs, presentations, proofs; revoke and reinstate VCs | + +The resolve operation falls back to verb-based `user:read`; verify operations (POST) fall back to `user:write`. Neither requires an elevated role beyond authentication. + +### `user-admin` - user administration + +Seeded from the authentication admin and audit routes. + +| Permission | Role | Notes | +| ------------------ | ------------ | ------------------------------------------------------------------------------------------------- | +| `user-admin:read` | `user-admin` | Get user, get by identity, get and query audit | +| `user-admin:write` | `user-admin` | Create/update/remove user, password reset, create/update/remove audit; inherits `user-admin:read` | + +### `identity-profile` - identity profile administration + +Seeded from the identity profile admin routes. + +| Permission | Role | Notes | +| ------------------------ | ------------------------ | --------------------------------------------------------------------- | +| `identity-profile:read` | `identity-profile-admin` | Get and list identity profiles | +| `identity-profile:write` | `identity-profile-admin` | Update and remove identity profiles; inherits `identity-profile:read` | + +### `authorization` - authorization policy management + +Seeded from the authorization service routes. + +| Permission | Role | Notes | +| --------------------- | ------------ | ---------------------------------------------------------------------------------------------- | +| `authorization:read` | `user-admin` | Check authorization, get policies, roles, role assignments, inheritance | +| `authorization:write` | `user-admin` | Build model, add/remove policies, role assignments, inheritance; inherits `authorization:read` | + +### `health` - server health + +Seeded from the health route. + +| Permission | Role | Notes | +| ------------- | -------- | -------------------- | +| `health:read` | `devops` | Server health status | + +### `logging` - log entry management + +Seeded from the logging service routes. + +| Permission | Role | Notes | +| --------------- | -------- | ------------------------------------------- | +| `logging:read` | `devops` | List log entries | +| `logging:write` | `devops` | Create log entries; inherits `logging:read` | + +### `tracing` - distributed tracing + +Seeded from the tracing service routes. + +| Permission | Role | Notes | +| --------------- | -------- | ---------------------------------------- | +| `tracing:read` | `devops` | List spans, get traces | +| `tracing:write` | `devops` | Start/end spans; inherits `tracing:read` | + +### `telemetry` - metrics and telemetry + +Seeded from the telemetry service routes. + +| Permission | Role | Notes | +| ----------------- | -------- | ------------------------------------------------------------------- | +| `telemetry:read` | `devops` | Get metrics, list entries, get values | +| `telemetry:write` | `devops` | Create/update/remove metrics, add values; inherits `telemetry:read` | + +### `tenant` - tenant administration (multi-tenant only) + +Seeded from the tenant processor routes when `TWIN_TENANT_ENABLED=true`. + +| Permission | Role | Notes | +| -------------- | -------------- | ---------------------------------------------------------- | +| `tenant:read` | `tenant-admin` | List and get tenants | +| `tenant:write` | `tenant-admin` | Create, update, and remove tenants; inherits `tenant:read` | + +## Public Routes + +Routes with `skipAuth: true` are excluded from the verb-based fallback only. If such a route also declares an explicit `defaultAuthorization`, that policy is still seeded. A route that is purely public - `skipAuth: true` with no `defaultAuthorization` - receives no seeded policy. Examples of purely public routes include the information routes (`serverInformation`, `serverSpec`, `serverLivez`, `serverReadyz`) and the public identity profile endpoint (`identityProfileGetPublic`). + +## Verb-Based Fallback + +Routes that require authentication but declare no `defaultAuthorization` receive authorization rules derived from their HTTP method: + +{VerbFallbackDiagram()} + +## Custom Model + +The seeded defaults can be extended or replaced via the `TWIN_AUTHORIZATION_MODEL` environment variable (a JSON object conforming to `IAuthorizationModel`). Set `TWIN_AUTHORIZATION_MODEL_MODE` to `merge` (default) to add custom rules on top of the defaults, or `replace` to skip the route-derived defaults and use only the custom rules. + +Because seeding is additive, `replace` mode only controls what is passed on the current startup - it cannot remove policies already written to the store in a previous run. diff --git a/docs/architecture/node-env-variables.mdx b/docs/architecture/node-env-variables.mdx index 0334d1f7..c904204e 100644 --- a/docs/architecture/node-env-variables.mdx +++ b/docs/architecture/node-env-variables.mdx @@ -40,20 +40,20 @@ When you change the prefix, all variables in this document use your custom prefi These variables are only read when running the `bootstrap-dev` CLI command. They are not used during normal server startup. -| Variable | Possible Values | Default | Notes | -| ---------------------------- | -------------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------- | -| `TWIN_FEATURES` | Comma-separated list | `admin-user,wallet` | Features to enable during bootstrap (e.g. `admin-user`). | -| `TWIN_NODE_IDENTITY` | DID string | Generated | Node identity DID. Generated if not provided. | -| `TWIN_NODE_MNEMONIC` | Mnemonic string | Generated | Node identity mnemonic. Generated if not provided. | -| `TWIN_TENANT_ID` | UUID string | Generated | Default tenant ID. | -| `TWIN_TENANT_API_KEY` | String | Generated | Default tenant API key. | -| `TWIN_ORGANIZATION_IDENTITY` | DID string | Generated | Organisation identity DID. Generated if not provided. | -| `TWIN_ORGANIZATION_MNEMONIC` | Mnemonic string | Generated | Organisation identity mnemonic. Generated if not provided. | -| `TWIN_ADMIN_USER_IDENTITY` | DID string | Generated | Admin user identity DID. Only used when `admin-user` feature is enabled. | -| `TWIN_ADMIN_USER_MNEMONIC` | Mnemonic string | Generated | Admin user mnemonic. Only used when `admin-user` feature is enabled. | -| `TWIN_ADMIN_USER_NAME` | Email or string | `admin@tenant` (multi-tenant) or `admin@node` (single tenant) | Admin user name. Only used when `admin-user` feature is enabled. | -| `TWIN_ADMIN_USER_PASSWORD` | String | Generated | Admin user password. Only used when `admin-user` feature is enabled. | -| `TWIN_ADMIN_USER_SCOPE` | Comma-separated list | `tenant-admin,user-admin` (multi-tenant) or `user-admin` (single-tenant) | Admin user permission scopes. Only used when `admin-user` feature is enabled. | +| Variable | Possible Values | Default | Notes | +| ---------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| `TWIN_FEATURES` | Comma-separated list | `admin-user,wallet` | Features to enable during bootstrap (e.g. `admin-user`). | +| `TWIN_NODE_IDENTITY` | DID string | Generated | Node identity DID. Generated if not provided. | +| `TWIN_NODE_MNEMONIC` | Mnemonic string | Generated | Node identity mnemonic. Generated if not provided. | +| `TWIN_TENANT_ID` | UUID string | Generated | Default tenant ID. | +| `TWIN_TENANT_API_KEY` | String | Generated | Default tenant API key. | +| `TWIN_ORGANIZATION_IDENTITY` | DID string | Generated | Organisation identity DID. Generated if not provided. | +| `TWIN_ORGANIZATION_MNEMONIC` | Mnemonic string | Generated | Organisation identity mnemonic. Generated if not provided. | +| `TWIN_ADMIN_USER_IDENTITY` | DID string | Generated | Admin user identity DID. Only used when `admin-user` feature is enabled. | +| `TWIN_ADMIN_USER_MNEMONIC` | Mnemonic string | Generated | Admin user mnemonic. Only used when `admin-user` feature is enabled. | +| `TWIN_ADMIN_USER_NAME` | Email or string | `admin@tenant` (multi-tenant) or `admin@node` (single tenant) | Admin user name. Only used when `admin-user` feature is enabled. | +| `TWIN_ADMIN_USER_PASSWORD` | String | Generated | Admin user password. Only used when `admin-user` feature is enabled. | +| `TWIN_ADMIN_USER_ROLES` | Comma-separated list | `global-admin,user-admin,identity-admin,identity-profile-admin,devops`, plus `tenant-admin` when multi-tenant | Admin user roles. Only used when `admin-user` feature is enabled. | ## Server Variables @@ -68,6 +68,7 @@ These variables are only read when running the `bootstrap-dev` CLI command. They | `TWIN_HTTP_EXPOSED_HEADERS` | Comma-separated headers | Runtime dependent | CORS exposed headers. | | `TWIN_HTTP_BODY_LIMITS` | Comma-separated `name=bytes` pairs | Runtime dependent | Named request body limits for REST routes, e.g. `default=2097152,large=26214400`. Unset keeps the 1 MiB default and the 25 MiB `large` built-in. | | `TWIN_FASTIFY_PLUGIN_TIMEOUT` | Integer milliseconds | `30000` | Time Fastify waits for a plugin to load before failing, passed through as the Fastify `pluginTimeout` option. | +| `TWIN_WEB_SERVER_TYPE` | `fastify`, `hono`, `native` | `fastify` | Web server implementation used to serve the API. | ## Connector and Component Selection Variables @@ -102,6 +103,12 @@ These variables are only read when running the `bootstrap-dev` CLI command. They | `TWIN_TELEMETRY_SILENT_COMPONENTS` | Comma-separated list of component class names | None | A list of components to exclude from telemetry. | | `TWIN_TRACING_CONNECTOR` | `entity-storage`, `open-telemetry`, `console`, `silent` (comma-separated for multiple) | None | Tracing connector type. When multiple values are provided, a multi-connector is created automatically as the default. | | `TWIN_TRACING_SILENT_COMPONENTS` | Comma-separated list of component class names | None | A list of components to exclude from tracing. Applies only to components which take a tracing component directly, it does not suppress a component traced by the facade, as the facade is activated on a whole factory. | +| `TWIN_AUTHORIZATION_CONNECTOR` | `entity-storage`, `casbin` | None | Authorization connector type. | +| `TWIN_AUTHORIZATION_CHECK_CACHE_CAPACITY` | Integer | None | Maximum number of cached authorisation check results. | +| `TWIN_AUTHORIZATION_CHECK_CACHE_TTI_MS` | Integer | None | Time-to-idle in milliseconds for cached authorisation check results. | +| `TWIN_AUTHORIZATION_MODEL` | `@json:` | None | Path to a JSON file containing the authorization model to seed at startup, with `policies` and `roleInheritances` arrays. | +| `TWIN_AUTHORIZATION_MODEL_MODE` | `merge`, `replace` | `merge` | How to combine `TWIN_AUTHORIZATION_MODEL` with route-derived policies. `merge` applies both; `replace` uses only the custom model. | +| `TWIN_AUTHORIZATION_MODEL_ID` | String | `system` | Model identifier used for authorization. | | `TWIN_FACADE` | `tracing` (comma-separated for multiple) | None | The facades to activate. A facade wraps every instance a factory produces so cross cutting behaviour is applied without each component knowing about it. When this is not set no facades are activated. | | `TWIN_TRACING_FACADE_FACTORIES` | Comma-separated list of factory type names | `component,nft-connector,identity-connector,attestation,notarization-connector,blob-storage,vault,wallet-connector` | The factories the tracing facade is activated on, so every instance they produce records a span for each method called on it. Replaces the default set rather than adding to it, and falls back to the defaults when the list is empty. Only applies when `TWIN_FACADE` includes `tracing` and `TWIN_TRACING_CONNECTOR` is set. | | `TWIN_TRACING_FACADE_COMPONENT_EXCLUDE_TYPES` | Comma-separated list of regular expressions | See description | Additional instance types the facade is not applied to in the `component` factory, the only factory holding the components the facade itself calls. Each pattern is matched anywhere in the type name, and a pattern cannot contain a comma. These extend the types which are always excluded, `tracing`, `telemetry`, `metrics`, `logging` and `platform`, they do not replace them. | @@ -180,8 +187,7 @@ These variables are only read when running the `bootstrap-dev` CLI command. They | `TWIN_IDENTITY_DID_RESOLUTION_CACHE_MUTEX_TIMEOUT` | Integer ms | Connector default | Mutex timeout for the DID resolution cache. Only used when `TWIN_IDENTITY_CONNECTOR=iota` and caching is enabled. | | `TWIN_IDENTITY_DID_RESOLUTION_RETRIES` | Integer | `10` | Number of times to retry resolving a DID after a write operation (create, update, or delete) to confirm propagation. Only used when `TWIN_IDENTITY_CONNECTOR=iota`. | | `TWIN_IDENTITY_DID_RESOLUTION_RETRY_DELAY` | Integer ms | `500` | Delay between DID resolution retries after a write operation. Only used when `TWIN_IDENTITY_CONNECTOR=iota`. | -| `TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES` | Comma separated list | None | Public and private profile properties which can only be added, changed or removed by callers with one of the `TWIN_IDENTITY_PROFILE_ADMIN_SCOPES`. | -| `TWIN_IDENTITY_PROFILE_ADMIN_SCOPES` | Comma separated list | `user-admin,global-admin` | Scopes which allow the `TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES` to be modified, any one is sufficient. | +| `TWIN_IDENTITY_PROFILE_SELF_UPDATE_DENIED_PROPERTIES` | Comma separated list | None | Public and private profile properties which can only be added, changed or removed by callers with escalated privilege. | | `TWIN_IMMUTABLE_PROOF_VERIFICATION_METHOD_ID` | Method id string | `immutable-proof-assertion` | Default injected by node defaults. | | `TWIN_IMMUTABLE_PROOF_TASK_RETRY_COUNT` | Integer | `5` | Number of times to retry a proof task before abandoning it. Set to `0` to disable retries. | | `TWIN_IMMUTABLE_PROOF_TASK_RETRY_INTERVAL` | Integer seconds | `5` | Interval in seconds between proof task retries. | @@ -219,6 +225,8 @@ These variables are only read when running the `bootstrap-dev` CLI command. They | `TWIN_AUTH_PROCESSOR_TYPE` | `entity-storage` | None | Authentication processor type. | | `TWIN_AUTH_SIGNING_KEY_ID` | Vault key identifier | `auth-signing` | Key used for auth signing operations. | | `TWIN_AUTH_API_KEY_HEADER` | Header name string | `x-api-key` | HTTP header name for the API key on requests. | +| `TWIN_AUTH_MIN_PASSWORD_LENGTH` | Integer | `15` | Minimum password length for new password validation. | +| `TWIN_AUTH_MAX_PASSWORD_LENGTH` | Integer | `128` | Maximum password length for new password validation. | | `TWIN_MIME_TYPE_PROCESSORS` | Comma-separated processor types | None | Additional MIME processor registrations. | | `TWIN_ROUTE_LOGGING_INCLUDE_BODY` | `true`, `false` | Uses debug value | Includes body in route logging. | | `TWIN_ROUTE_LOGGING_FULL_BASE64` | `true`, `false` | `false` | Includes full base64 payloads in route logging. | @@ -265,13 +273,14 @@ TWIN_ENV_ALLOW_LIST=restPath* ## Extension Module Loading Variables -| Variable | Possible Values | Default | Notes | -| --------------------------------- | ------------------------- | ------- | ------------------------------------------- | -| `TWIN_EXTENSIONS_MAX_SIZE_MB` | Integer MB | `10` | Maximum HTTPS extension download size. | -| `TWIN_EXTENSIONS_CLEAR_CACHE` | `true`, `false` | `false` | Clears extension cache on startup. | -| `TWIN_EXTENSIONS_CACHE_DIRECTORY` | Relative or absolute path | `.tmp` | Root cache directory for extension modules. | -| `TWIN_EXTENSIONS_CACHE_TTL_HOURS` | Integer hours | `24` | HTTPS extension cache TTL. | -| `TWIN_EXTENSIONS_FORCE_REFRESH` | `true`, `false` | `false` | Forces extension cache refresh. | +| Variable | Possible Values | Default | Notes | +| --------------------------------- | --------------------------- | ----------------------------------- | ------------------------------------------- | +| `TWIN_EXTENSIONS_MAX_SIZE_MB` | Integer MB | `10` | Maximum HTTPS extension download size. | +| `TWIN_NATIVE_MODULES` | Comma-separated module list | `node:buffer,node:crypto,node:zlib` | Native modules to initialise at startup. | +| `TWIN_EXTENSIONS_CLEAR_CACHE` | `true`, `false` | `false` | Clears extension cache on startup. | +| `TWIN_EXTENSIONS_CACHE_DIRECTORY` | Relative or absolute path | `.tmp` | Root cache directory for extension modules. | +| `TWIN_EXTENSIONS_CACHE_TTL_HOURS` | Integer hours | `24` | HTTPS extension cache TTL. | +| `TWIN_EXTENSIONS_FORCE_REFRESH` | `true`, `false` | `false` | Forces extension cache refresh. | ## Provider and Backend Variables @@ -383,3 +392,7 @@ TWIN_ENV_ALLOW_LIST=restPath* | `TWIN_OPEN_TELEMETRY_TRACING_TRACER_VERSION` | String | `1.0.0` | OpenTelemetry tracing specification version. Only used when `TWIN_TRACING_CONNECTOR=open-telemetry`. | | `TWIN_OPEN_TELEMETRY_TRACING_ENDPOINT` | URL | None | OTLP HTTP endpoint to push spans to, for example `http://localhost:4318/v1/traces`. Required when `TWIN_TRACING_CONNECTOR=open-telemetry`. | | `TWIN_OPEN_TELEMETRY_TRACING_PROCESSOR` | `batch`, `simple` | `batch` | Span processor. Use `simple` for local development; `batch` for production. Only used when `TWIN_TRACING_CONNECTOR=open-telemetry`. | +| `TWIN_CASBIN_ENDPOINT` | URL | None | Base URL of the Casbin server, for example `http://localhost:48000`. Required when `TWIN_AUTHORIZATION_CONNECTOR=casbin`. | +| `TWIN_CASBIN_CLIENT_ID` | String | None | OAuth2 client ID for authenticating with the Casbin server. Required when `TWIN_AUTHORIZATION_CONNECTOR=casbin`. | +| `TWIN_CASBIN_CLIENT_SECRET` | String | None | OAuth2 client secret for authenticating with the Casbin server. Required when `TWIN_AUTHORIZATION_CONNECTOR=casbin`. | +| `TWIN_CASBIN_TIMEOUT_MS` | Integer | None | Request timeout in milliseconds for the Casbin connector. Only used when `TWIN_AUTHORIZATION_CONNECTOR=casbin`. | diff --git a/packages/node-core/locales/en.json b/packages/node-core/locales/en.json index 1701b5f0..d039df05 100644 --- a/packages/node-core/locales/en.json +++ b/packages/node-core/locales/en.json @@ -11,6 +11,7 @@ "cliCommandParamMissing": "Parameter \"{param}\" is required for command \"{command}\"", "cliCommandParamExtra": "Parameter(s) \"{params}\" are not recognised for command \"{command}\"", "cliEnvVarMissing": "Environment variable \"{envVar}\" does not exist", + "migrationAuthorizationComponent": "Authorization is now a required component, please add it to your configuration.", "migrationIndexWriteFailed": "Failed to write the index entries for entity \"{id}\" during migration" }, "bootstrapDev": { @@ -533,12 +534,12 @@ "email": "Email", "identity": "Identity", "organization": "Organization", - "scope": "Scope" + "roles": "Roles" } }, "user-create": { "description": "Create a user", - "example": "user-create --user-identity=\"did:iota:....\" --organization-identity=\"did:iota:....\" --email=\"bob@examples.com\" --password=\"pass1234\" --scope=\"tenant-admin\" --givenName=\"Bob\" --familyName=\"Smith\"", + "example": "user-create --user-identity=\"did:iota:....\" --organization-identity=\"did:iota:....\" --email=\"bob@examples.com\" --password=\"pass1234\" --roles=\"tenant-admin\" --givenName=\"Bob\" --familyName=\"Smith\"", "params": { "env-prefix": { "description": "Prefix to use for standard .env files e.g. TWIN_." @@ -558,8 +559,8 @@ "password": { "description": "The password for the user." }, - "scope": { - "description": "List of scopes to associate with the user, comma separated." + "roles": { + "description": "List of roles to associate with the user, comma separated." }, "given-name": { "description": "The given name of the user." @@ -596,7 +597,7 @@ }, "user-update": { "description": "Update a user", - "example": "user-update --email=\"bob@examples.com\" --user-identity=\"did:iota:....\" --organization-identity=\"did:iota:....\" --scope=\"tenant-admin\" --givenName=\"Bob\" --familyName=\"Smith\"", + "example": "user-update --email=\"bob@examples.com\" --user-identity=\"did:iota:....\" --organization-identity=\"did:iota:....\" --roles=\"tenant-admin\" --givenName=\"Bob\" --familyName=\"Smith\"", "params": { "env-prefix": { "description": "Prefix to use for standard .env files e.g. TWIN_." @@ -613,8 +614,8 @@ "email": { "description": "The email address of the user." }, - "scope": { - "description": "List of scopes to associate with the user, comma separated." + "roles": { + "description": "List of roles to associate with the user, comma separated." }, "given-name": { "description": "The given name of the user." @@ -927,7 +928,6 @@ "listing": "Listing organization users", "email": "Email", "identity": "Identity", - "scope": "Scope", "count": "Total users" } }, diff --git a/packages/node-core/package.json b/packages/node-core/package.json index 70eece32..2c24499c 100644 --- a/packages/node-core/package.json +++ b/packages/node-core/package.json @@ -34,6 +34,7 @@ "@3sixty/api-models": "next", "@3sixty/api-tenant-processor": "next", "@3sixty/auditable-item-graph-service": "next", + "@3sixty/authorization-models": "next", "@3sixty/cli-core": "next", "@3sixty/context": "next", "@3sixty/core": "next", @@ -58,7 +59,6 @@ "@3sixty/nameof": "next", "@3sixty/rights-management-pap-service": "next", "@3sixty/standards-w3c-did": "next", - "@3sixty/standards-w3c-odrl": "next", "@3sixty/telemetry-connector-opentelemetry": "next", "@3sixty/tracing-connector-opentelemetry": "next", "@3sixty/tracing-facades": "next", @@ -81,12 +81,10 @@ "@3sixty/rights-management-models": "next", "@3sixty/telemetry-models": "next", "@3sixty/trust-models": "next", - "@3sixty/ts-to-openapi": "next", "@3sixty/validate-locales": "next", "@types/node": "26.6.5", "@vitest/coverage-v8": "5.0.5", "concurrently": "10.0.6", - "copyfiles": "2.4.1", "nodemon": "3.1.14", "rimraf": "6.1.3", "typedoc": "0.28.20", diff --git a/packages/node-core/src/builders/engineEnvBuilder.ts b/packages/node-core/src/builders/engineEnvBuilder.ts index ce64568d..b7348a84 100644 --- a/packages/node-core/src/builders/engineEnvBuilder.ts +++ b/packages/node-core/src/builders/engineEnvBuilder.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0. import { cpus } from "node:os"; import path from "node:path"; -import { EnvHelper, Is, Mutex } from "@3sixty/core"; +import { EnvHelper, GeneralError, Is, Mutex } from "@3sixty/core"; import type { IIotaConfig } from "@3sixty/dlt-iota"; import { EngineCloneMode, @@ -15,6 +15,8 @@ import { AttestationConnectorType, AuditableItemGraphComponentType, AuditableItemStreamComponentType, + AuthorizationComponentType, + AuthorizationConnectorType, type AutomationActionConfig, AutomationActionType, AutomationComponentType, @@ -109,9 +111,11 @@ import { } from "@3sixty/tracing-connector-opentelemetry"; import { type ITracingFacadeConfig, TracingFacade } from "@3sixty/tracing-facades"; import { + AUTHORIZATION_MODEL_ID, CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT, COMPONENT_FACTORY_TYPE_NAME, + DEFAULT_ESCALATED_PRIVILEGE_ROLE, DEFAULT_HEALTH_EXCLUDE_CLONE_COMPONENTS, DEFAULT_TRACING_FACADE_COMPONENT_EXCLUDE_TYPES, DEFAULT_TRACING_FACADE_FACTORIES, @@ -187,6 +191,7 @@ export async function buildEngineConfiguration( await configureTelemetry(coreConfig, envVars); await configureMetricsCollector(coreConfig, envVars); await configureTracing(coreConfig, envVars); + await configureAuthorization(coreConfig, envVars); await configureFacades(coreConfig, envVars); await configureMessaging(coreConfig, envVars); await configureMailbox(coreConfig, envVars); @@ -973,6 +978,53 @@ async function configureTracing( } } +/** + * Configures the authorization. + * @param coreConfig The core config. + * @param envVars The environment variables. + * @returns A promise that resolves when the authorization configuration has been applied. + */ +async function configureAuthorization( + coreConfig: IEngineConfig, + envVars: IEngineEnvironmentVariables +): Promise { + coreConfig.types.authorizationConnector ??= []; + + if (envVars.authorizationConnector === AuthorizationConnectorType.EntityStorage) { + coreConfig.types.authorizationConnector.push({ + type: AuthorizationConnectorType.EntityStorage + }); + } else if (envVars.authorizationConnector === AuthorizationConnectorType.Casbin) { + coreConfig.types.authorizationConnector.push({ + type: AuthorizationConnectorType.Casbin, + options: { + config: { + endpoint: envVars.casbinEndpoint ?? "", + clientId: envVars.casbinClientId ?? "", + clientSecret: envVars.casbinClientSecret ?? "", + timeoutMs: EnvHelper.envMs(envVars, "casbinTimeoutMs") + } + } + }); + } else { + throw new GeneralError("node", "migrationAuthorizationComponent"); + } + + if (coreConfig.types.authorizationConnector.length > 0) { + coreConfig.types.authorizationComponent ??= []; + + coreConfig.types.authorizationComponent.push({ + type: AuthorizationComponentType.Service, + options: { + config: { + checkCacheCapacity: EnvHelper.envInteger(envVars, "authorizationCheckCacheCapacity"), + checkCacheTtiMs: EnvHelper.envMs(envVars, "authorizationCheckCacheTtiMs") + } + } + }); + } +} + /** * Configures the facades. * @param coreConfig The core config. @@ -1786,15 +1838,15 @@ async function configureIdentityProfile( type: IdentityProfileComponentType.Service, options: { config: { - selfUpdateDeniedProperties: EnvHelper.envListToArray( + authorizationModelId: EnvHelper.envString( envVars, - "identityProfileSelfUpdateDeniedProperties", - undefined, - undefined + "authorizationModelId", + AUTHORIZATION_MODEL_ID ), - adminScopes: EnvHelper.envListToArray( + escalatedPrivilegeRole: DEFAULT_ESCALATED_PRIVILEGE_ROLE, + selfUpdateDeniedProperties: EnvHelper.envListToArray( envVars, - "identityProfileAdminScopes", + "identityProfileSelfUpdateDeniedProperties", undefined, undefined ) @@ -2532,6 +2584,19 @@ export function isTracingEnabled(envVars: IEngineEnvironmentVariables): boolean ); } +/** + * Checks if the authorization subsystem is required. + * Returns true when any authorization connector is configured. + * @param envVars The environment variables. + * @returns True if authorization is enabled. + */ +export function isAuthorizationRequired(envVars: IEngineEnvironmentVariables): boolean { + return ( + envVars.authorizationConnector === AuthorizationConnectorType.EntityStorage || + envVars.authorizationConnector === AuthorizationConnectorType.Casbin + ); +} + /** * Checks if the mailbox subsystem is enabled. * Returns true when any component that depends on the mailbox subsystem is enabled. diff --git a/packages/node-core/src/builders/engineServerEnvBuilder.ts b/packages/node-core/src/builders/engineServerEnvBuilder.ts index dfce0288..a8439412 100644 --- a/packages/node-core/src/builders/engineServerEnvBuilder.ts +++ b/packages/node-core/src/builders/engineServerEnvBuilder.ts @@ -14,11 +14,20 @@ import { InformationComponentType, type MimeTypeProcessorType, RestRouteProcessorType, - SocketRouteProcessorType + SocketRouteProcessorType, + WebServerType } from "@3sixty/engine-server-types"; import { TraceparentHelper } from "@3sixty/tracing-models"; -import { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from "../defaults.js"; -import { isTelemetryEnabled, isTracingEnabled } from "./engineEnvBuilder.js"; +import { + AUTHORIZATION_MODEL_ID, + CONTEXT_ID_HANDLER_FEATURE_DID, + CONTEXT_ID_HANDLER_FEATURE_TENANT +} from "../defaults.js"; +import { + isAuthorizationRequired, + isTelemetryEnabled, + isTracingEnabled +} from "./engineEnvBuilder.js"; import type { IEnvironmentVariables } from "../models/IEnvironmentVariables.js"; /** @@ -71,6 +80,7 @@ export async function buildEngineServerConfiguration( const serverConfig: IEngineServerConfig = { ...coreEngineConfig, + webServerType: EnvHelper.envChoice(envVars, "webServerType", Object.values(WebServerType)), web: webServerOptions, types: { ...coreEngineConfig.types, @@ -241,7 +251,9 @@ export async function buildEngineServerConfiguration( type: AuthenticationComponentType.EntityStorage, options: { config: { - signingKeyName: envVars.authSigningKeyId + signingKeyName: envVars.authSigningKeyId, + minPasswordLength: EnvHelper.envInteger(envVars, "authMinPasswordLength"), + maxPasswordLength: EnvHelper.envInteger(envVars, "authMaxPasswordLength") } } }); @@ -263,22 +275,60 @@ export async function buildEngineServerConfiguration( } } }); - if (tenantEnabled) { + if (isAuthorizationRequired(envVars)) { serverConfig.types.restRouteProcessor.push({ - type: RestRouteProcessorType.TenantOverride, + type: RestRouteProcessorType.Authorization, options: { - config: {} + config: { + authorizationModelId: EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ) + } } }); serverConfig.types.socketRouteProcessor.push({ - type: SocketRouteProcessorType.TenantOverride, + type: SocketRouteProcessorType.Authorization, options: { - config: {} + config: { + authorizationModelId: EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ) + } } }); + + if (tenantEnabled) { + serverConfig.types.restRouteProcessor.push({ + type: RestRouteProcessorType.TenantOverride, + options: { + config: { + authorizationModelId: EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ) + } + } + }); + serverConfig.types.socketRouteProcessor.push({ + type: SocketRouteProcessorType.TenantOverride, + options: { + config: { + authorizationModelId: EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ) + } + } + }); + } } } - if (isTelemetryEnabled(envVars)) { serverConfig.types.restRouteProcessor.push({ type: RestRouteProcessorType.Metrics, diff --git a/packages/node-core/src/commands/bootstrapDev.ts b/packages/node-core/src/commands/bootstrapDev.ts index 68fe272a..ff52738f 100644 --- a/packages/node-core/src/commands/bootstrapDev.ts +++ b/packages/node-core/src/commands/bootstrapDev.ts @@ -6,6 +6,14 @@ import { CLIDisplay } from "@3sixty/cli-core"; import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; import { Coerce, ComponentFactory, EnvHelper, GeneralError, I18n, Is } from "@3sixty/core"; import type { IEngineCore } from "@3sixty/engine-models"; +import { + DEFAULT_DEVOPS_ROLE, + DEFAULT_ESCALATED_PRIVILEGE_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE +} from "../defaults.js"; import { identityCreate } from "./identityCreate.js"; import { identityVerificationMethodCreate } from "./identityVerificationMethodCreate.js"; import { tenantCreate } from "./tenantCreate.js"; @@ -261,11 +269,24 @@ export async function bootstrapDev( tenantId: tenant?.id, email: envVars.adminUserName ?? `admin@${tenantEnabled ? "tenant" : "node"}`, password: envVars.adminUserPassword, - scope: - envVars.adminUserScope ?? + roles: + envVars.adminUserRoles ?? (tenantEnabled - ? ["global-admin", "tenant-admin", "user-admin"] - : ["global-admin", "user-admin"] + ? [ + DEFAULT_ESCALATED_PRIVILEGE_ROLE, + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ] + : [ + DEFAULT_ESCALATED_PRIVILEGE_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ] ).join(","), givenName: tenantEnabled ? "Tenant" : "Node", familyName: "Admin", diff --git a/packages/node-core/src/commands/orgUsersList.ts b/packages/node-core/src/commands/orgUsersList.ts index 35d37321..a7ac1cc6 100644 --- a/packages/node-core/src/commands/orgUsersList.ts +++ b/packages/node-core/src/commands/orgUsersList.ts @@ -77,7 +77,7 @@ export async function orgUsersList( params: { orgDid?: string; } -): Promise<{ email: string; identity: string; scope: string }[]> { +): Promise<{ email: string; identity: string }[]> { const isMultiTenant = Coerce.boolean(envVars.tenantEnabled) ?? false; let effectiveOrgDid: string | undefined = params.orgDid; if (!Is.stringValue(effectiveOrgDid) && !isMultiTenant) { @@ -97,7 +97,7 @@ export async function orgUsersList( nameofKebabCase() ); - const result: { email: string; identity: string; scope: string }[] = []; + const result: { email: string; identity: string }[] = []; const platformComponentType = engineCore.getRegisteredInstanceType("platformComponent"); const platformComponent = ComponentFactory.get(platformComponentType); @@ -112,15 +112,14 @@ export async function orgUsersList( comparison: ComparisonOperator.Equals }, undefined, - ["email", "identity", "organization", "scope"], + ["email", "identity", "organization"], cursor ); for (const user of page.entities) { if (Is.stringValue(user.email)) { result.push({ email: user.email, - identity: user.identity ?? "", - scope: user.scope ?? "" + identity: user.identity ?? "" }); CLIDisplay.break(); CLIDisplay.value( @@ -132,11 +131,6 @@ export async function orgUsersList( user.identity ?? "", 1 ); - CLIDisplay.value( - I18n.formatMessage("node.cli.commands.org-users-list.labels.scope"), - user.scope ?? "", - 1 - ); } } cursor = page.cursor; diff --git a/packages/node-core/src/commands/userCreate.ts b/packages/node-core/src/commands/userCreate.ts index 5e1e1ded..47e2d9a1 100644 --- a/packages/node-core/src/commands/userCreate.ts +++ b/packages/node-core/src/commands/userCreate.ts @@ -4,14 +4,15 @@ import type { IAuthenticationAdminComponent, IAuthenticationUser } from "@3sixty/api-auth-entity-storage-models"; -import { ScopeHelper } from "@3sixty/api-models"; +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; import { CLIDisplay, CLIUtils } from "@3sixty/cli-core"; import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; -import { Coerce, ComponentFactory, GeneralError, Guards, I18n, Is } from "@3sixty/core"; +import { Coerce, ComponentFactory, EnvHelper, GeneralError, Guards, I18n, Is } from "@3sixty/core"; import { PasswordGenerator } from "@3sixty/crypto"; import type { IEngineCore } from "@3sixty/engine-models"; import { Did, IdentityProfileConnectorFactory } from "@3sixty/identity-models"; import type { Person, WithContext } from "schema-dts"; +import { AUTHORIZATION_MODEL_ID, DEFAULT_USER_ROLE } from "../defaults.js"; import type { ICliCommandDefinition } from "../models/ICliCommandDefinition.js"; import type { IEnvironmentVariables } from "../models/IEnvironmentVariables.js"; @@ -77,9 +78,9 @@ export function getCommandDefinitionUserCreate(commandDefinitions: { required: false }, { - key: "scope", + key: "roles", type: "string", - description: I18n.formatMessage("node.cli.commands.user-create.params.scope.description"), + description: I18n.formatMessage("node.cli.commands.user-create.params.roles.description"), required: false }, { @@ -155,7 +156,7 @@ export function getCommandDefinitionUserCreate(commandDefinitions: { * @param params.tenantId The tenant ID for the user. * @param params.email The email for the user. * @param params.password The password for the user. - * @param params.scope The scope for the user. + * @param params.roles The roles for the user. * @param params.givenName The given name for the user. * @param params.familyName The family name for the user. * @param params.overwriteMode The mode to use when a user with the same identity already exists. @@ -173,7 +174,7 @@ export async function userCreate( tenantId?: string; email?: string; password?: string; - scope?: string; + roles?: string; givenName?: string; familyName?: string; overwriteMode?: "skip" | "overwrite" | "error"; @@ -187,7 +188,7 @@ export async function userCreate( organizationDid: string; email: string; password: string; - scope: string[]; + roles: string[]; givenName: string; familyName: string; } @@ -196,6 +197,11 @@ export async function userCreate( const paramsEmail = params.email; const paramsUserIdentity = params.userIdentity; const paramsOrganizationIdentity = params.organizationIdentity; + const authorizationModelId = EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ); Guards.email("userCreate", "email", paramsEmail); Did.guard("userCreate", "user-identity", paramsUserIdentity); Did.guard("userCreate", "organization-identity", paramsOrganizationIdentity); @@ -222,8 +228,17 @@ export async function userCreate( const authenticationAdminComponent = ComponentFactory.get( defaultAuthenticationAdminComponentType ); + const defaultAuthorizationComponentType = + engineCore.getRegisteredInstanceType("authorizationComponent"); + const authorizationComponent = ComponentFactory.get( + defaultAuthorizationComponentType + ); let createUser = true; + const roles = EnvHelper.commaSeparatedListToArray(params.roles); + if (roles.length === 0) { + roles.push(DEFAULT_USER_ROLE); + } const currentContextIds = (await ContextIdStore.getContextIds()) ?? {}; const returnJson = await ContextIdStore.run( @@ -262,8 +277,7 @@ export async function userCreate( email: paramsEmail, password: params.password ?? PasswordGenerator.generate(16), userIdentity: paramsUserIdentity, - organizationIdentity: paramsOrganizationIdentity, - scope: ScopeHelper.toArray(params.scope) + organizationIdentity: paramsOrganizationIdentity }; CLIDisplay.task(I18n.formatMessage("node.cli.commands.user-create.labels.storingUser")); @@ -271,8 +285,7 @@ export async function userCreate( await ContextIdStore.run( { ...currentContextIds, - [ContextIdKeys.Tenant]: params.tenantId, - scope: ScopeHelper.toString(user.scope) + [ContextIdKeys.Tenant]: params.tenantId }, async () => { if (existingUser) { @@ -280,6 +293,14 @@ export async function userCreate( } else { await authenticationAdminComponent.create(user); } + + for (const role of roles) { + await authorizationComponent.addRoleForSubject( + authorizationModelId, + paramsUserIdentity, + role + ); + } } ); @@ -319,7 +340,7 @@ export async function userCreate( organizationDid: paramsOrganizationIdentity, email: paramsEmail, password: user.password, - scope: ScopeHelper.toArray(params.scope), + roles, givenName: params.givenName ?? "", familyName: params.familyName ?? "" }; @@ -336,7 +357,7 @@ export async function userCreate( `${params.outputEnvPrefix}ORGANIZATION_DID="${params.organizationIdentity}"`, `${params.outputEnvPrefix}EMAIL="${paramsEmail}"`, `${params.outputEnvPrefix}PASSWORD="${user.password}"`, - `${params.outputEnvPrefix}SCOPE="${params.scope ?? ""}"`, + `${params.outputEnvPrefix}ROLES="${params.roles ?? ""}"`, `${params.outputEnvPrefix}GIVEN_NAME="${params.givenName ?? ""}"`, `${params.outputEnvPrefix}FAMILY_NAME="${params.familyName ?? ""}"` ], diff --git a/packages/node-core/src/commands/userGet.ts b/packages/node-core/src/commands/userGet.ts index 3b21e8e9..3ba73fd0 100644 --- a/packages/node-core/src/commands/userGet.ts +++ b/packages/node-core/src/commands/userGet.ts @@ -4,10 +4,12 @@ import type { IAuthenticationAdminComponent, IAuthenticationUser } from "@3sixty/api-auth-entity-storage-models"; +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; import { CLIDisplay } from "@3sixty/cli-core"; import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; import { Coerce, ComponentFactory, GeneralError, Guards, I18n, Is } from "@3sixty/core"; import type { IEngineCore } from "@3sixty/engine-models"; +import { AUTHORIZATION_MODEL_ID } from "../defaults.js"; import type { ICliCommandDefinition } from "../models/ICliCommandDefinition.js"; import type { IEnvironmentVariables } from "../models/IEnvironmentVariables.js"; @@ -88,16 +90,36 @@ export async function userGet( const defaultAuthenticationAdminComponentType = engineCore.getRegisteredInstanceType( "authenticationAdminComponent" ); + const authorizationModelId = envVars.authorizationModelId ?? AUTHORIZATION_MODEL_ID; const authenticationAdminComponent = ComponentFactory.get( defaultAuthenticationAdminComponentType ); + const defaultAuthorizationComponentType = + engineCore.getRegisteredInstanceType("authorizationComponent"); + const authorizationComponent = ComponentFactory.get( + defaultAuthorizationComponentType + ); CLIDisplay.task(I18n.formatMessage("node.cli.commands.user-get.labels.retrieving")); const currentContextIds = (await ContextIdStore.getContextIds()) ?? {}; - const user = await ContextIdStore.run( + const { user, roles } = await ContextIdStore.run( { ...currentContextIds, [ContextIdKeys.Tenant]: params.tenantId }, - async () => authenticationAdminComponent.get(params.email ?? "") + async () => { + const foundUser = await authenticationAdminComponent.get(params.email ?? ""); + let foundRoles: string[] | undefined; + + if (Is.stringValue(foundUser.userIdentity)) { + foundRoles = await authorizationComponent.getRolesForSubject( + authorizationModelId, + foundUser.userIdentity + ); + } + return { + user: foundUser, + roles: foundRoles + }; + } ); CLIDisplay.break(); @@ -113,8 +135,8 @@ export async function userGet( 1 ); CLIDisplay.value( - I18n.formatMessage("node.cli.commands.user-get.labels.scope"), - (user.scope ?? []).join(", "), + I18n.formatMessage("node.cli.commands.user-get.labels.roles"), + (roles ?? []).join(", "), 1 ); CLIDisplay.break(); diff --git a/packages/node-core/src/commands/userUpdate.ts b/packages/node-core/src/commands/userUpdate.ts index 39589430..4a79e729 100644 --- a/packages/node-core/src/commands/userUpdate.ts +++ b/packages/node-core/src/commands/userUpdate.ts @@ -4,13 +4,14 @@ import type { IAuthenticationAdminComponent, IAuthenticationUser } from "@3sixty/api-auth-entity-storage-models"; -import { ScopeHelper } from "@3sixty/api-models"; +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; import { CLIDisplay } from "@3sixty/cli-core"; import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; -import { Coerce, ComponentFactory, GeneralError, Guards, I18n, Is } from "@3sixty/core"; +import { Coerce, ComponentFactory, EnvHelper, GeneralError, Guards, I18n, Is } from "@3sixty/core"; import type { IEngineCore } from "@3sixty/engine-models"; import { Did, IdentityProfileConnectorFactory } from "@3sixty/identity-models"; import type { Person, WithContext } from "schema-dts"; +import { AUTHORIZATION_MODEL_ID, DEFAULT_USER_ROLE } from "../defaults.js"; import type { ICliCommandDefinition } from "../models/ICliCommandDefinition.js"; import type { IEnvironmentVariables } from "../models/IEnvironmentVariables.js"; @@ -70,9 +71,9 @@ export function getCommandDefinitionUserUpdate(commandDefinitions: { description: I18n.formatMessage("node.cli.commands.user-update.params.email.description") }, { - key: "scope", + key: "roles", type: "string", - description: I18n.formatMessage("node.cli.commands.user-update.params.scope.description"), + description: I18n.formatMessage("node.cli.commands.user-update.params.roles.description"), required: false }, { @@ -113,7 +114,7 @@ export function getCommandDefinitionUserUpdate(commandDefinitions: { * @param params.organizationIdentity The organization DID for the user. * @param params.tenantId The tenant ID for the user. * @param params.email The email for the user. - * @param params.scope The scope for the user. + * @param params.roles The roles for the user. * @param params.givenName The given name for the user. * @param params.familyName The family name for the user. * @returns The updated user details or undefined if skipped. @@ -126,7 +127,7 @@ export async function userUpdate( organizationIdentity?: string; tenantId?: string; email?: string; - scope?: string; + roles?: string; givenName?: string; familyName?: string; } @@ -135,7 +136,7 @@ export async function userUpdate( did: string; organizationDid: string; email: string; - scope: string[]; + roles: string[]; givenName: string; familyName: string; } @@ -144,6 +145,7 @@ export async function userUpdate( const paramsEmail = params.email; const paramsUserIdentity = params.userIdentity; const paramsOrganizationIdentity = params.organizationIdentity; + const authorizationModelId = envVars.authorizationModelId ?? AUTHORIZATION_MODEL_ID; Guards.email("userUpdate", "email", paramsEmail); if (Is.stringValue(paramsUserIdentity)) { @@ -175,6 +177,11 @@ export async function userUpdate( const authenticationAdminComponent = ComponentFactory.get( defaultAuthenticationAdminComponentType ); + const defaultAuthorizationComponentType = + engineCore.getRegisteredInstanceType("authorizationComponent"); + const authorizationComponent = ComponentFactory.get( + defaultAuthorizationComponentType + ); const currentContextIds = (await ContextIdStore.getContextIds()) ?? {}; const returnJson = await ContextIdStore.run( @@ -185,8 +192,7 @@ export async function userUpdate( const user: Partial = { email: paramsEmail, userIdentity: paramsUserIdentity, - organizationIdentity: paramsOrganizationIdentity, - scope: ScopeHelper.toArray(params.scope) + organizationIdentity: paramsOrganizationIdentity }; CLIDisplay.task(I18n.formatMessage("node.cli.commands.user-update.labels.storingUser")); @@ -194,6 +200,38 @@ export async function userUpdate( const existingUser = await authenticationAdminComponent.get(paramsEmail); await authenticationAdminComponent.update(user); + let currentRoles = await authorizationComponent.getRolesForSubject( + authorizationModelId, + existingUser.userIdentity + ); + + if (Is.stringValue(params.roles)) { + const roles = EnvHelper.commaSeparatedListToArray(params.roles); + if (roles.length === 0) { + roles.push(DEFAULT_USER_ROLE); + } + + const rolesToAdd = roles.filter(role => !currentRoles.includes(role)); + const rolesToRemove = currentRoles.filter(role => !roles.includes(role)); + + for (const role of rolesToAdd) { + await authorizationComponent.addRoleForSubject( + authorizationModelId, + existingUser.userIdentity, + role + ); + } + for (const role of rolesToRemove) { + await authorizationComponent.removeRoleForSubject( + authorizationModelId, + existingUser.userIdentity, + role + ); + } + + currentRoles = roles; + } + const name = `${params.givenName ?? ""} ${params.familyName ?? ""}`.trim(); const publicProfile: WithContext = { "@context": "https://schema.org", @@ -223,9 +261,7 @@ export async function userUpdate( did: params.userIdentity ?? existingUser.userIdentity, organizationDid: params.organizationIdentity ?? existingUser.organizationIdentity, email: paramsEmail, - scope: Is.stringValue(params.scope) - ? ScopeHelper.toArray(params.scope) - : existingUser.scope, + roles: currentRoles, givenName: params.givenName ?? "", familyName: params.familyName ?? "" }; diff --git a/packages/node-core/src/defaults.ts b/packages/node-core/src/defaults.ts index 0d4994ce..57054baf 100644 --- a/packages/node-core/src/defaults.ts +++ b/packages/node-core/src/defaults.ts @@ -26,6 +26,11 @@ export const TRUST_VERIFICATION_METHOD_ID = "trust-assertion"; */ export const AUTH_SIGNING_KEY_ID = "auth-signing"; +/** + * Default model identifier for authorization. + */ +export const AUTHORIZATION_MODEL_ID = "system"; + /** * Feature tag identifying the DID context ID handler. */ @@ -36,6 +41,41 @@ export const CONTEXT_ID_HANDLER_FEATURE_DID = "did"; */ export const CONTEXT_ID_HANDLER_FEATURE_TENANT = "tenant"; +/** + * Default role for escalated privileges. + */ +export const DEFAULT_ESCALATED_PRIVILEGE_ROLE = "global-admin"; + +/** + * Default role for tenant admins. + */ +export const DEFAULT_TENANT_ADMIN_ROLE = "tenant-admin"; + +/** + * Default role for user admins. + */ +export const DEFAULT_USER_ADMIN_ROLE = "user-admin"; + +/** + * Default role for identity administration. + */ +export const DEFAULT_IDENTITY_ADMIN_ROLE = "identity-admin"; + +/** + * Default role for identity profile admins. + */ +export const DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE = "identity-profile-admin"; + +/** + * Default role for devops. + */ +export const DEFAULT_DEVOPS_ROLE = "devops"; + +/** + * Default role for users. + */ +export const DEFAULT_USER_ROLE = "user"; + /** * The default component types excluded from the engine clone used by the application health * background task. Each entry is a regular expression matched against the engine config type keys. @@ -110,7 +150,8 @@ export function getEnvDefaults(envPrefix: string): { [key: string]: string } { [`${envPrefix}IMMUTABLE_PROOF_VERIFICATION_METHOD_ID`]: IMMUTABLE_PROOF_VERIFICATION_METHOD_ID, [`${envPrefix}BLOB_STORAGE_ENCRYPTION_KEY_ID`]: BLOB_STORAGE_ENCRYPTION_KEY_ID, [`${envPrefix}TRUST_VERIFICATION_METHOD_ID`]: TRUST_VERIFICATION_METHOD_ID, - [`${envPrefix}AUTH_SIGNING_KEY_ID`]: AUTH_SIGNING_KEY_ID + [`${envPrefix}AUTH_SIGNING_KEY_ID`]: AUTH_SIGNING_KEY_ID, + [`${envPrefix}AUTHORIZATION_MODEL_ID`]: AUTHORIZATION_MODEL_ID }; return envVars; } diff --git a/packages/node-core/src/index.ts b/packages/node-core/src/index.ts index 3c60307f..f08a55c6 100644 --- a/packages/node-core/src/index.ts +++ b/packages/node-core/src/index.ts @@ -5,6 +5,7 @@ export * from "./builders/engineServerEnvBuilder.js"; export * from "./builders/extensionsBuilder.js"; export * from "./cli.js"; export * from "./defaults.js"; +export * from "./models/authorizationModelMode.js"; export * from "./models/cliCommandParamType.js"; export * from "./models/IBootstrapDevEnvironmentVariables.js"; export * from "./models/ICliArgs.js"; diff --git a/packages/node-core/src/migration.ts b/packages/node-core/src/migration.ts index 1e5fbacb..e8d95713 100644 --- a/packages/node-core/src/migration.ts +++ b/packages/node-core/src/migration.ts @@ -1,12 +1,18 @@ // Copyright 2026 IOTA Stiftung. // SPDX-License-Identifier: Apache-2.0. +import type { + AuthenticationUser, + AuthenticationUserV0 +} from "@3sixty/api-auth-entity-storage-service"; import { AuditableItemGraphVertexIndexHelper, type AuditableItemGraphVertex, type AuditableItemGraphVertexIndex, type AuditableItemGraphVertexV1 } from "@3sixty/auditable-item-graph-service"; -import { EnvHelper, GeneralError, StringHelper } from "@3sixty/core"; +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; +import { ContextIdStore, type IContextIds } from "@3sixty/context"; +import { ComponentFactory, EnvHelper, GeneralError, Is, StringHelper } from "@3sixty/core"; import type { IEngineCore } from "@3sixty/engine-models"; import type { IEntitySchemaProperty } from "@3sixty/entity"; import { @@ -22,8 +28,20 @@ import { type OdrlPolicyIndex, type OdrlPolicyV0 } from "@3sixty/rights-management-pap-service"; +import { + AUTHORIZATION_MODEL_ID, + DEFAULT_DEVOPS_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_USER_ROLE +} from "./defaults.js"; import type { IEnvironmentVariables } from "./models/IEnvironmentVariables.js"; +const migrateRoles: { identity: string; roles: string[]; contextIds: IContextIds | undefined }[] = + []; + /** * Initialise schema migrations for the engine. * @param engineCore The engine core instance. @@ -37,6 +55,7 @@ export function initialiseMigrations( return; } + migrationAuthenticationUserRoles(); migrationAigIndexes(); migrationPapIndexes(); } @@ -52,8 +71,78 @@ export async function finalizeMigrations( engineCore: IEngineCore, envVars: IEnvironmentVariables ): Promise { - // This is currently a placeholder for any finalization logic that might be needed - // after all schema migrations have been processed. + if (Is.arrayValue(migrateRoles)) { + const authComponentType = engineCore.getRegisteredInstanceType("authorizationComponent"); + + const authorizationComponent = ComponentFactory.get(authComponentType); + + const migrationModelId = EnvHelper.envString( + envVars, + "authorizationModelId", + AUTHORIZATION_MODEL_ID + ); + + for (const entry of migrateRoles) { + await ContextIdStore.run(entry.contextIds ?? {}, async () => { + for (const role of entry.roles) { + await authorizationComponent.addRoleForSubject(migrationModelId, entry.identity, role); + } + }); + } + migrateRoles.length = 0; + } +} + +/** + * Perform migrations for authentication user scopes to authorization roles. + */ +function migrationAuthenticationUserRoles(): void { + const migrationV0V1: ISchemaMigration = { + removeEntityProperty: async ( + entity: AuthenticationUserV0, + removedProperties: IEntitySchemaProperty[] + ): Promise => { + // If the scope property is not being removed, we don't need to do anything + if (removedProperties.find(prop => prop.property === "scope") === undefined) { + return; + } + + let roles: string[] = []; + if (Is.stringValue(entity.scope)) { + roles = entity.scope + .split(",") + .map(role => role.trim().toLocaleLowerCase()) + .filter(role => role.length > 0); + } + if (roles.length === 0) { + roles.push(DEFAULT_USER_ROLE); + } + + // If the user has both tenant-admin and user-admin roles, we also add the new roles + // to provide access to everything they had before + if (roles.includes(DEFAULT_TENANT_ADMIN_ROLE) && roles.includes(DEFAULT_USER_ADMIN_ROLE)) { + roles.push(DEFAULT_DEVOPS_ROLE); + roles.push(DEFAULT_IDENTITY_ADMIN_ROLE); + roles.push(DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE); + } + + // We need to store the old roles in here if a migration is performed + // they will be picked up by the start method of the AuthenticationService + // and used to populate the new roles table in the correct partition. + // The same identity can exist across multiple partitions so we accumulate + // entries as an array keyed by contextIds rather than by identity alone. + const contextIds: IContextIds | undefined = await ContextIdStore.getContextIds(); + migrateRoles.push({ + identity: entity.identity, + roles, + contextIds + }); + } + }; + SchemaMigrationFactory.register( + `${nameof()}_0_1`, + () => migrationV0V1 as ISchemaMigration + ); } /** diff --git a/packages/node-core/src/models/IBootstrapDevEnvironmentVariables.ts b/packages/node-core/src/models/IBootstrapDevEnvironmentVariables.ts index c224ccbf..f5c47f7e 100644 --- a/packages/node-core/src/models/IBootstrapDevEnvironmentVariables.ts +++ b/packages/node-core/src/models/IBootstrapDevEnvironmentVariables.ts @@ -63,8 +63,8 @@ export interface IBootstrapDevEnvironmentVariables { adminUserPassword?: string; /** - * If the admin-user feature is enabled, this is a comma-separated list of scopes for the user. - * @default tenant-admin,user-admin (when tenant enabled) or user-admin (when tenant disabled) + * If the admin-user feature is enabled, this is a comma-separated list of roles for the user. + * @default global-admin,tenant-admin,user-admin,identity-admin,identity-profile-admin,devops (tenant-admin only when tenant enabled) */ - adminUserScope?: string; + adminUserRoles?: string; } diff --git a/packages/node-core/src/models/IEngineEnvironmentVariables.ts b/packages/node-core/src/models/IEngineEnvironmentVariables.ts index ad6f3e0c..4d935e9f 100644 --- a/packages/node-core/src/models/IEngineEnvironmentVariables.ts +++ b/packages/node-core/src/models/IEngineEnvironmentVariables.ts @@ -804,6 +804,62 @@ export interface IEngineEnvironmentVariables { */ openTelemetryTracingProcessor?: string; + /** + * The type of authorization connector: entity-storage, casbin. + */ + authorizationConnector?: string; + + /** + * The model identifier to use for authorization. + */ + authorizationModelId?: string; + + /** + * The base URL of the Casbin server (e.g. "http://localhost:48000"), required when using the casbin authorization connector. + */ + casbinEndpoint?: string; + + /** + * The OAuth2 client ID for authenticating with the Casbin server, required when using the casbin authorization connector. + */ + casbinClientId?: string; + + /** + * The OAuth2 client secret for authenticating with the Casbin server, required when using the casbin authorization connector. + */ + casbinClientSecret?: string; + + /** + * The request timeout in milliseconds for the Casbin authorization connector. + */ + casbinTimeoutMs?: string; + + /** + * The maximum number of cached authorisation check results. + */ + authorizationCheckCacheCapacity?: string; + + /** + * The time-to-idle in milliseconds for cached authorisation check results. + */ + authorizationCheckCacheTtiMs?: string; + + /** + * Path to a JSON file containing the authorization model to seed at startup. + * Use the @json: prefix to load the file, e.g. @json:./authorization-model.json. + * The file must contain an object with policies and roleInheritances arrays. + * Combined with or replaces the route-derived defaults depending on authorizationModelMode. + */ + authorizationModel?: string; + + /** + * Controls how authorizationModel is combined with route-derived policies at startup. + * "merge" (default): authorizationModel is applied in addition to route-derived rules. + * "replace": authorizationModel replaces route-derived rules entirely. + * @default "merge" + */ + authorizationModelMode?: string; + /** * The type of faucet connector: entity-storage, iota. */ @@ -931,16 +987,10 @@ export interface IEngineEnvironmentVariables { /** * Comma separated list of public and private profile properties which can only be added, changed - * or removed by callers with an admin scope. Defaults to none. + * or removed by callers with escalated privilege. Defaults to none. */ identityProfileSelfUpdateDeniedProperties?: string; - /** - * Comma separated list of scopes which allow the self update denied profile properties to be - * modified, any one is sufficient. Defaults to user-admin, global-admin. - */ - identityProfileAdminScopes?: string; - /** * The identity verification method id to use with immutable proofs. */ diff --git a/packages/node-core/src/models/IEngineServerEnvironmentVariables.ts b/packages/node-core/src/models/IEngineServerEnvironmentVariables.ts index 9c3d52bf..5b28995e 100644 --- a/packages/node-core/src/models/IEngineServerEnvironmentVariables.ts +++ b/packages/node-core/src/models/IEngineServerEnvironmentVariables.ts @@ -50,6 +50,11 @@ export interface IEngineServerEnvironmentVariables { */ fastifyPluginTimeout?: string; + /** + * The type of web server to use: fastify, hono, native, defaults to fastify. + */ + webServerType?: string; + /** * The type of auth admin processor to use on the API: entity-storage. */ @@ -70,6 +75,16 @@ export interface IEngineServerEnvironmentVariables { */ authApiKeyHeader?: string; + /** + * The minimum password length for new password validation. + */ + authMinPasswordLength?: string; + + /** + * The maximum password length for new password validation. + */ + authMaxPasswordLength?: string; + /** * Additional MIME type processors to include, comma separated. */ diff --git a/packages/node-core/src/models/authorizationModelMode.ts b/packages/node-core/src/models/authorizationModelMode.ts new file mode 100644 index 00000000..5d855679 --- /dev/null +++ b/packages/node-core/src/models/authorizationModelMode.ts @@ -0,0 +1,24 @@ +// Copyright 2026 IOTA Stiftung. +// SPDX-License-Identifier: Apache-2.0. + +/** + * The protocol types for modules. + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const AuthorizationModelMode = { + /** + * Merge the roles with the defaults. + */ + Merge: "merge", + + /** + * Replace the default roles. + */ + Replace: "replace" +} as const; + +/** + * The protocol type for a module. + */ +export type AuthorizationModelMode = + (typeof AuthorizationModelMode)[keyof typeof AuthorizationModelMode]; diff --git a/packages/node-core/src/models/bootstrapDevEnvironmentVariableKeys.ts b/packages/node-core/src/models/bootstrapDevEnvironmentVariableKeys.ts index 4afc445d..e740bb84 100644 --- a/packages/node-core/src/models/bootstrapDevEnvironmentVariableKeys.ts +++ b/packages/node-core/src/models/bootstrapDevEnvironmentVariableKeys.ts @@ -21,7 +21,7 @@ const bootstrapDevEnvironmentVariableKeysInternal: { adminUserMnemonic: true, adminUserName: true, adminUserPassword: true, - adminUserScope: true + adminUserRoles: true }; /** diff --git a/packages/node-core/src/models/engineEnvironmentVariableKeys.ts b/packages/node-core/src/models/engineEnvironmentVariableKeys.ts index ae468995..a87bd2e6 100644 --- a/packages/node-core/src/models/engineEnvironmentVariableKeys.ts +++ b/packages/node-core/src/models/engineEnvironmentVariableKeys.ts @@ -185,6 +185,17 @@ const engineEnvironmentVariableKeysInternal: { openTelemetryTracingTracerVersion: true, openTelemetryTracingEndpoint: true, openTelemetryTracingProcessor: true, + // authorization + authorizationConnector: true, + authorizationModelId: true, + casbinEndpoint: true, + casbinClientId: true, + casbinClientSecret: true, + casbinTimeoutMs: true, + authorizationCheckCacheCapacity: true, + authorizationCheckCacheTtiMs: true, + authorizationModel: true, + authorizationModelMode: true, tracingSilentComponents: true, // DLT / identity faucetConnector: true, @@ -202,7 +213,6 @@ const engineEnvironmentVariableKeysInternal: { identityResolverConnector: true, identityProfileConnector: true, identityProfileSelfUpdateDeniedProperties: true, - identityProfileAdminScopes: true, universalResolverEndpoint: true, // IOTA iotaFaucetEndpoint: true, diff --git a/packages/node-core/src/models/engineServerEnvironmentVariableKeys.ts b/packages/node-core/src/models/engineServerEnvironmentVariableKeys.ts index b1584874..adaf8a3a 100644 --- a/packages/node-core/src/models/engineServerEnvironmentVariableKeys.ts +++ b/packages/node-core/src/models/engineServerEnvironmentVariableKeys.ts @@ -19,11 +19,14 @@ const engineServerEnvironmentVariableKeysInternal: { httpBodyLimits: true, publicOrigin: true, fastifyPluginTimeout: true, + webServerType: true, // IEngineServerEnvironmentVariables - auth authAdminProcessorType: true, authProcessorType: true, authSigningKeyId: true, authApiKeyHeader: true, + authMinPasswordLength: true, + authMaxPasswordLength: true, // IEngineServerEnvironmentVariables - routing mimeTypeProcessors: true, routeLoggingIncludeBody: true, diff --git a/packages/node-core/src/seeding.ts b/packages/node-core/src/seeding.ts new file mode 100644 index 00000000..d22eecd9 --- /dev/null +++ b/packages/node-core/src/seeding.ts @@ -0,0 +1,214 @@ +// Copyright 2026 IOTA Stiftung. +// SPDX-License-Identifier: Apache-2.0. +import { + TenantEventType, + type IBaseRoute, + type IPlatformComponent, + type IRouteAuthorization +} from "@3sixty/api-models"; +import type { + IAuthorizationComponent, + IAuthorizationInheritance, + IAuthorizationModel, + IAuthorizationPolicy +} from "@3sixty/authorization-models"; +import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; +import { ComponentFactory, EnvHelper, Is } from "@3sixty/core"; +import type { IEngineCore, IEngineServer } from "@3sixty/engine-models"; +import { HttpMethod } from "@3sixty/web"; +import { + AUTHORIZATION_MODEL_ID, + DEFAULT_ESCALATED_PRIVILEGE_ROLE, + DEFAULT_USER_ROLE +} from "./defaults.js"; +import { AuthorizationModelMode } from "./models/authorizationModelMode.js"; +import type { IEngineEnvironmentVariables } from "./models/IEngineEnvironmentVariables.js"; + +const DEFAULT_AUTHORIZATION_READER: IRouteAuthorization = { + permission: "user:read", + role: DEFAULT_USER_ROLE +}; + +const DEFAULT_AUTHORIZATION_WRITER: IRouteAuthorization = { + permission: "user:write", + role: DEFAULT_USER_ROLE, + inherits: [DEFAULT_AUTHORIZATION_READER.permission] +}; + +/** + * Seed default authorization policies and role inheritances after the engine has started. + * Uses the platform component to execute across all tenants in multi-tenant mode. + * @param engineCore The running engine core. + * @param engineServer The running engine server. + * @param envVars The environment variables. + */ +export async function seedAuthorizationDefaults( + engineCore: IEngineCore, + engineServer: IEngineServer, + envVars: IEngineEnvironmentVariables +): Promise { + const nodeContextIds = engineCore.getContextIds() ?? {}; + if (!Is.stringValue(nodeContextIds.node)) { + return; + } + + const authComponentType = engineCore.getRegisteredInstanceType("authorizationComponent"); + const platformComponentType = engineCore.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformComponentType); + const authorizationComponent = ComponentFactory.get(authComponentType); + + const modelId = EnvHelper.envString(envVars, "authorizationModelId", AUTHORIZATION_MODEL_ID); + const rulesMode = EnvHelper.envChoice( + envVars, + "authorizationModelMode", + Object.values(AuthorizationModelMode), + AuthorizationModelMode.Merge + ); + + const customModel = EnvHelper.envObject( + envVars, + "authorizationModel" + ); + + const policies: IAuthorizationPolicy[] = []; + const roleInheritances: IAuthorizationInheritance[] = []; + + if (Is.objectValue(customModel)) { + policies.push(...(customModel.policies ?? [])); + + const escalatedRoles = new Set(); + for (const inheritance of customModel.roleInheritances ?? []) { + roleInheritances.push(inheritance); + escalatedRoles.add(inheritance.role); + } + for (const role of escalatedRoles) { + roleInheritances.push({ role: DEFAULT_ESCALATED_PRIVILEGE_ROLE, inheritsFrom: role }); + if (role !== DEFAULT_USER_ROLE) { + roleInheritances.push({ role, inheritsFrom: DEFAULT_USER_ROLE }); + } + } + } + + if (!Is.objectValue(customModel) || rulesMode === AuthorizationModelMode.Merge) { + const policyKeys = new Set(); + const inheritanceKeys = new Set(); + const roles = new Set(); + + for (const route of engineServer.getRestRoutes()) { + // Determine verb fallback: GET → reader, mutating methods → writer. + let fallback: IRouteAuthorization | undefined; + if (route.method === HttpMethod.GET) { + fallback = DEFAULT_AUTHORIZATION_READER; + } else if ( + route.method === HttpMethod.PUT || + route.method === HttpMethod.POST || + route.method === HttpMethod.PATCH || + route.method === HttpMethod.DELETE + ) { + fallback = DEFAULT_AUTHORIZATION_WRITER; + } + seedRoute(route, fallback, policies, roleInheritances, policyKeys, inheritanceKeys, roles); + } + + for (const route of engineServer.getSocketRoutes()) { + // Socket routes have no HTTP method, so fall back to reader for all authenticated routes. + seedRoute( + route, + DEFAULT_AUTHORIZATION_READER, + policies, + roleInheritances, + policyKeys, + inheritanceKeys, + roles + ); + } + + for (const role of roles) { + roleInheritances.push({ role: DEFAULT_ESCALATED_PRIVILEGE_ROLE, inheritsFrom: role }); + if (role !== DEFAULT_USER_ROLE) { + roleInheritances.push({ role, inheritsFrom: DEFAULT_USER_ROLE }); + } + } + } + + const model: IAuthorizationModel = { policies, roleInheritances }; + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + await authorizationComponent.build(modelId, model); + }); + }); + + platformComponent.registerTenantEventCallback( + "seedAuthorizationDefaults", + async (tenantId, eventType) => { + if (eventType === TenantEventType.Created) { + await ContextIdStore.run( + { ...nodeContextIds, [ContextIdKeys.Tenant]: tenantId }, + async () => { + await authorizationComponent.build(modelId, model); + } + ); + } + } + ); +} + +/** + * Merges a single route's authorization declaration into the shared accumulator sets. + * @param route The route to seed authorization for. + * @param fallbackAuthorization Authorization to apply when the route declares none. + * @param policies The policy accumulator. + * @param roleInheritances The role inheritance accumulator. + * @param policyKeys Deduplication set for policies. + * @param inheritanceKeys Deduplication set for role inheritances. + * @param roles Roles collected for escalation processing. + */ +function seedRoute( + route: IBaseRoute, + fallbackAuthorization: IRouteAuthorization | undefined, + policies: IAuthorizationPolicy[], + roleInheritances: IAuthorizationInheritance[], + policyKeys: Set, + inheritanceKeys: Set, + roles: Set +): void { + const requiresAuthorization = route.requiresAuthorization !== false && route.skipAuth !== true; + let authorization: IRouteAuthorization | undefined = route.defaultAuthorization; + + if (!Is.objectValue(authorization) && requiresAuthorization) { + authorization = fallbackAuthorization; + } + + if (Is.objectValue(authorization)) { + const policyKey = `${authorization.permission}|${route.operationId}`; + if (!policyKeys.has(policyKey)) { + policyKeys.add(policyKey); + policies.push({ + subject: authorization.permission, + object: route.operationId, + action: "execute" + }); + } + if (Is.stringValue(authorization.role)) { + const inheritKey = `${authorization.role}|${authorization.permission}`; + if (!inheritanceKeys.has(inheritKey)) { + inheritanceKeys.add(inheritKey); + roleInheritances.push({ + role: authorization.role, + inheritsFrom: authorization.permission + }); + } + roles.add(authorization.role); + } + if (Is.arrayValue(authorization.inherits)) { + for (const inheritsFrom of authorization.inherits) { + const inheritKey = `${authorization.permission}|${inheritsFrom}`; + if (!inheritanceKeys.has(inheritKey)) { + inheritanceKeys.add(inheritKey); + roleInheritances.push({ role: authorization.permission, inheritsFrom }); + } + } + } + } +} diff --git a/packages/node-core/src/start.ts b/packages/node-core/src/start.ts index ffae13f9..1bc55b16 100644 --- a/packages/node-core/src/start.ts +++ b/packages/node-core/src/start.ts @@ -24,6 +24,7 @@ import type { IEnvironmentVariables } from "./models/IEnvironmentVariables.js"; import type { INodeEngineConfig } from "./models/INodeEngineConfig.js"; import type { INodeEngineState } from "./models/INodeEngineState.js"; import type { INodeOptions } from "./models/INodeOptions.js"; +import { seedAuthorizationDefaults } from "./seeding.js"; /** * Start the engine server. @@ -132,6 +133,7 @@ export async function start( // Start the server, which also starts the engine. await server.start(); + await seedAuthorizationDefaults(engine, server, envVars); await finalizeMigrations(engine, envVars); return { diff --git a/packages/node-core/tests/authorizationSeeder.spec.ts b/packages/node-core/tests/authorizationSeeder.spec.ts new file mode 100644 index 00000000..5b1ac21b --- /dev/null +++ b/packages/node-core/tests/authorizationSeeder.spec.ts @@ -0,0 +1,473 @@ +// Copyright 2026 IOTA Stiftung. +// SPDX-License-Identifier: Apache-2.0. +import type { IPlatformComponent } from "@3sixty/api-models"; +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; +import { ContextIdStore } from "@3sixty/context"; +import { ComponentFactory, Factory } from "@3sixty/core"; +import { MemoryStateStorage } from "@3sixty/engine-core"; +import { + AuthenticationAdminComponentType, + AuthenticationComponentType +} from "@3sixty/engine-server-types"; +import { + BlobStorageConnectorType, + EntityStorageConnectorType, + IdentityConnectorType, + IdentityProfileConnectorType, + IdentityResolverConnectorType, + VaultConnectorType +} from "@3sixty/engine-types"; +import { CI_ENV_VARS } from "./setupTestEnv.js"; +import { + AUTHORIZATION_MODEL_ID, + DEFAULT_ESCALATED_PRIVILEGE_ROLE, + DEFAULT_USER_ROLE +} from "../src/defaults.js"; +import type { INodeEngineState } from "../src/models/INodeEngineState.js"; +import type { INodeOptions } from "../src/models/INodeOptions.js"; +import { + buildConfiguration, + loadEnvironmentVariables, + processEnvironmentVariables +} from "../src/node.js"; +import { start } from "../src/start.js"; +import { initialiseLocales } from "../src/utils.js"; + +const TEST_NODE_ID = + "did:iota:testnet:0x8f7b71cedde408974606e404bce76980fd17a570d03ec319788fefd5eabbe9e8"; +const TEST_NODE_ORG_ID = + "did:iota:testnet:0x7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b"; + +const basePort = Math.floor(Math.random() * 1000); +let port = 17000 + basePort; + +describe("seedAuthorizationDefaults", () => { + beforeEach(() => { + port++; + Factory.clearFactories(); + }); + + afterEach(() => { + const twin = (globalThis as { [key: string]: unknown }).__TWIN_SHARED__ as + { [key: string]: unknown } | undefined; + if (twin) { + twin.sharedObjectBuffers = {}; + } + }); + + async function startServer(envVars: { [key: string]: string }): ReturnType { + await initialiseLocales("./dist/locales/"); + const nodeOptions: INodeOptions = { + envPrefix: "TWIN_", + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }) + }; + const nodeEnvVars = await processEnvironmentVariables( + loadEnvironmentVariables(envVars, nodeOptions), + nodeOptions + ); + const { nodeEngineConfig } = await buildConfiguration(nodeEnvVars, nodeOptions, { + name: "test", + version: "0.0.0" + }); + return start(nodeOptions, nodeEngineConfig, nodeEnvVars); + } + + const baseMinimalEnvVars: { [key: string]: string } = { + TWIN_DEBUG: "true", + TWIN_SILENT: "true", + TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_SCHEMA_MIGRATION_ENABLED: "false", + TWIN_ENV_ALLOW_LIST: CI_ENV_VARS + }; + + const baseAuthEnvVars: { [key: string]: string } = { + ...baseMinimalEnvVars, + TWIN_BLOB_STORAGE_CONNECTOR_TYPE: BlobStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", + TWIN_VAULT_CONNECTOR: VaultConnectorType.EntityStorage, + TWIN_IDENTITY_CONNECTOR: IdentityConnectorType.EntityStorage, + TWIN_IDENTITY_RESOLVER_CONNECTOR: IdentityResolverConnectorType.EntityStorage, + TWIN_IDENTITY_PROFILE_CONNECTOR: IdentityProfileConnectorType.EntityStorage, + TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, + TWIN_AUTH_PROCESSOR_TYPE: AuthenticationComponentType.EntityStorage + }; + + test("seeds route-derived policies for all routes with defaultAuthorization on startup", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const protectedRoutes = routes.filter(r => r.defaultAuthorization && r.operationId); + expect(protectedRoutes.length).toBeGreaterThan(0); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + undefined, + undefined, + 1000 + ); + for (const route of protectedRoutes) { + const auth = route.defaultAuthorization; + const operationId = route.operationId; + if (auth && operationId) { + const hasPolicy = policies.some( + p => + p.subject === auth.permission && p.object === operationId && p.action === "execute" + ); + expect(hasPolicy).toBe(true); + } + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("global-admin inherits all roles derived from route defaultAuthorization", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const uniqueRoles = new Set(); + for (const route of routes) { + const role = route.defaultAuthorization?.role; + if (role) { + uniqueRoles.add(role); + } + } + expect(uniqueRoles.size).toBeGreaterThan(0); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const parentRoles = await authComponent.getParentRoles( + AUTHORIZATION_MODEL_ID, + DEFAULT_ESCALATED_PRIVILEGE_ROLE + ); + for (const role of uniqueRoles) { + expect(parentRoles).toContain(role); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("non-user roles derived from route defaultAuthorization inherit the user role", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const nonUserRoles = new Set(); + for (const route of routes) { + const role = route.defaultAuthorization?.role; + if (role && role !== DEFAULT_USER_ROLE) { + nonUserRoles.add(role); + } + } + expect(nonUserRoles.size).toBeGreaterThan(0); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + for (const role of nonUserRoles) { + const parentRoles = await authComponent.getParentRoles(AUTHORIZATION_MODEL_ID, role); + expect(parentRoles).toContain(DEFAULT_USER_ROLE); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("seeds only custom rules when authorizationModelMode is replace", async () => { + const customRules = { + policies: [{ subject: "custom-role", object: "custom-op", action: "execute" }], + roleInheritances: [] + }; + + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString(), + TWIN_AUTHORIZATION_MODEL: JSON.stringify(customRules), + TWIN_AUTHORIZATION_MODEL_MODE: "replace" + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const protectedRoute = routes.find(r => r.defaultAuthorization && r.operationId); + expect(protectedRoute).toBeDefined(); + if (!protectedRoute) { + return; + } + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + undefined, + undefined, + 1000 + ); + + const hasCustomPolicy = policies.some( + p => p.subject === "custom-role" && p.object === "custom-op" + ); + expect(hasCustomPolicy).toBe(true); + + const auth = protectedRoute.defaultAuthorization; + const operationId = protectedRoute.operationId; + if (auth && operationId) { + const hasRoutePolicy = policies.some( + p => p.subject === auth.permission && p.object === operationId + ); + expect(hasRoutePolicy).toBe(false); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("auto-derives user:read policy for GET routes without explicit defaultAuthorization", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const fallbackGetRoutes = routes.filter( + r => + r.requiresAuthorization !== false && + !r.skipAuth && + !r.defaultAuthorization && + r.method.toUpperCase() === "GET" + ); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + "user:read", + undefined, + 1000 + ); + for (const route of fallbackGetRoutes) { + const hasPolicy = policies.some( + p => + p.subject === "user:read" && p.object === route.operationId && p.action === "execute" + ); + expect( + hasPolicy, + `Expected user:read policy for route ${route.operationId} (method: ${route.method})` + ).toBe(true); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("auto-derives user:write policy for PUT/POST/PATCH/DELETE routes without explicit defaultAuthorization", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const fallbackWriteRoutes = routes.filter(r => { + const method = r.method.toUpperCase(); + return ( + r.requiresAuthorization !== false && + !r.skipAuth && + !r.defaultAuthorization && + (method === "PUT" || method === "POST" || method === "PATCH" || method === "DELETE") + ); + }); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + "user:write", + undefined, + 1000 + ); + for (const route of fallbackWriteRoutes) { + const hasPolicy = policies.some( + p => + p.subject === "user:write" && p.object === route.operationId && p.action === "execute" + ); + expect(hasPolicy).toBe(true); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("does not seed policy for route with requiresAuthorization false and no defaultAuthorization", async () => { + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString() + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const skippedRoutes = routes.filter( + r => r.requiresAuthorization === false && !r.defaultAuthorization + ); + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + undefined, + undefined, + 1000 + ); + for (const route of skippedRoutes) { + const hasPolicy = policies.some(p => p.object === route.operationId); + expect(hasPolicy).toBe(false); + } + }); + }); + + await startResult.shutdown(); + }, 30000); + + test("merges custom rules with route-derived policies when authorizationModelMode is merge", async () => { + const customRules = { + policies: [{ subject: "custom-role", object: "custom-op", action: "execute" }], + roleInheritances: [] + }; + + const startResult = await startServer({ + ...baseAuthEnvVars, + TWIN_PORT: port.toString(), + TWIN_AUTHORIZATION_MODEL: JSON.stringify(customRules), + TWIN_AUTHORIZATION_MODEL_MODE: "merge" + }); + expect(startResult).toBeDefined(); + if (!startResult) { + return; + } + + const authType = startResult.engine.getRegisteredInstanceType("authorizationComponent"); + const authComponent = ComponentFactory.get(authType); + const platformType = startResult.engine.getRegisteredInstanceType("platformComponent"); + const platformComponent = ComponentFactory.get(platformType); + const nodeContextIds = startResult.engine.getContextIds() ?? {}; + + const routes = startResult.server.getRestRoutes(); + const protectedRoute = routes.find(r => r.defaultAuthorization && r.operationId); + expect(protectedRoute).toBeDefined(); + if (!protectedRoute) { + return; + } + + await ContextIdStore.run(nodeContextIds, async () => { + await platformComponent.execute(async () => { + const { entities: policies } = await authComponent.getAllPolicies( + AUTHORIZATION_MODEL_ID, + undefined, + undefined, + 1000 + ); + + const hasCustomPolicy = policies.some( + p => p.subject === "custom-role" && p.object === "custom-op" + ); + expect(hasCustomPolicy).toBe(true); + + const auth = protectedRoute.defaultAuthorization; + const operationId = protectedRoute.operationId; + if (auth && operationId) { + const hasRoutePolicy = policies.some( + p => p.subject === auth.permission && p.object === operationId + ); + expect(hasRoutePolicy).toBe(true); + } + }); + }); + + await startResult.shutdown(); + }, 30000); +}); diff --git a/packages/node-core/tests/builders/engineEnvBuilder.spec.ts b/packages/node-core/tests/builders/engineEnvBuilder.spec.ts index 81a344d3..24e61a5c 100644 --- a/packages/node-core/tests/builders/engineEnvBuilder.spec.ts +++ b/packages/node-core/tests/builders/engineEnvBuilder.spec.ts @@ -4,6 +4,7 @@ import { cpus } from "node:os"; import type { IIotaConfig } from "@3sixty/dlt-iota"; import { EngineCloneMode, EngineLogLevel } from "@3sixty/engine-models"; import { + AuthorizationConnectorType, DataConverterConnectorType, DataExtractorConnectorType, DataProcessingComponentType, @@ -34,10 +35,23 @@ import { TrustVerifierComponentType } from "@3sixty/engine-types"; import { LogLevel } from "@3sixty/logging-models"; -import { buildEngineConfiguration } from "../../src/builders/engineEnvBuilder.js"; +import { buildEngineConfiguration as buildEngineConfigurationBase } from "../../src/builders/engineEnvBuilder.js"; import { DEFAULT_HEALTH_EXCLUDE_CLONE_COMPONENTS } from "../../src/defaults.js"; import type { IEngineEnvironmentVariables } from "../../src/models/IEngineEnvironmentVariables.js"; +const AUTH = { authorizationConnector: AuthorizationConnectorType.EntityStorage } as const; + +/** + * Builds the engine configuration with the required authorization connector set. + * @param envVars The environment variables. + * @returns The engine configuration. + */ +async function buildEngineConfiguration( + envVars: IEngineEnvironmentVariables +): ReturnType { + return buildEngineConfigurationBase({ ...AUTH, ...envVars }); +} + describe("buildEngineConfiguration - silent", () => { test("log level is left unset when silent is not enabled", async () => { const config = await buildEngineConfiguration({}); @@ -176,7 +190,7 @@ describe("buildEngineConfiguration - disableColor", () => { describe("buildEngineConfiguration - schemaMigrationEnabled", () => { test("schema migration service is registered when schemaMigrationEnabled is unset (default true)", async () => { - const config = await buildEngineConfiguration({}); + const config = await buildEngineConfiguration({ ...AUTH }); expect(config.types.schemaVersionMigrationComponent).toEqual( expect.arrayContaining([ @@ -186,7 +200,7 @@ describe("buildEngineConfiguration - schemaMigrationEnabled", () => { }); test("schema migration service is registered when schemaMigrationEnabled is 'true'", async () => { - const config = await buildEngineConfiguration({ schemaMigrationEnabled: "true" }); + const config = await buildEngineConfiguration({ ...AUTH, schemaMigrationEnabled: "true" }); expect(config.types.schemaVersionMigrationComponent).toEqual( expect.arrayContaining([ @@ -196,7 +210,7 @@ describe("buildEngineConfiguration - schemaMigrationEnabled", () => { }); test("schema migration service is registered with enabled:false when schemaMigrationEnabled is 'false'", async () => { - const config = await buildEngineConfiguration({ schemaMigrationEnabled: "false" }); + const config = await buildEngineConfiguration({ ...AUTH, schemaMigrationEnabled: "false" }); expect(config.types.schemaVersionMigrationComponent).toEqual( expect.arrayContaining([ @@ -211,7 +225,7 @@ describe("buildEngineConfiguration - schemaMigrationEnabled", () => { describe("buildEngineConfiguration - task scheduler requirement", () => { test("task scheduler is registered when only auditableItemGraphEnabled is set", async () => { - const config = await buildEngineConfiguration({ auditableItemGraphEnabled: "true" }); + const config = await buildEngineConfiguration({ ...AUTH, auditableItemGraphEnabled: "true" }); expect(config.types.taskSchedulerComponent).toEqual( expect.arrayContaining([ @@ -233,7 +247,7 @@ describe("buildEngineConfiguration - task scheduler requirement", () => { }); test("task scheduler is not registered when no dependent component is enabled", async () => { - const config = await buildEngineConfiguration({}); + const config = await buildEngineConfiguration({ ...AUTH }); expect(config.types.taskSchedulerComponent).toBeUndefined(); }); @@ -321,6 +335,7 @@ describe("buildEngineConfiguration - immutable proof task options", () => { describe("buildEngineConfiguration - IOTA DLT gas config", () => { test("iotaGasBudget and iotaGasReservationDuration env vars are wired through to the resolved config", async () => { const config = await buildEngineConfiguration({ + ...AUTH, iotaNodeEndpoint: "https://api.testnet.iota.cafe", iotaNetwork: "testnet", iotaGasBudget: "123456789", @@ -338,6 +353,7 @@ describe("buildEngineConfiguration - IOTA DLT gas config", () => { test("leaving both env vars unset preserves today's behavior (fields stay undefined)", async () => { const config = await buildEngineConfiguration({ + ...AUTH, iotaNodeEndpoint: "https://api.testnet.iota.cafe", iotaNetwork: "testnet" }); @@ -353,6 +369,7 @@ describe("buildEngineConfiguration - IOTA DLT gas config", () => { test("existing coinType and gasStation fields still resolve correctly alongside the new ones", async () => { const config = await buildEngineConfiguration({ + ...AUTH, iotaNodeEndpoint: "https://api.testnet.iota.cafe", iotaNetwork: "testnet", iotaCoinType: "4218", @@ -380,6 +397,7 @@ describe("buildEngineConfiguration - IOTA DLT gas config", () => { describe("buildEngineConfiguration - dataspace provider idle transfer policy", () => { test("provider idle policy values are wired in seconds and converted to milliseconds", async () => { const config = await buildEngineConfiguration({ + ...AUTH, dataspaceEnabled: "true", dataspaceProviderTransferIdleTimeout: "120", dataspaceProviderTransferPolicySweepInterval: "15" @@ -400,6 +418,7 @@ describe("buildEngineConfiguration - dataspace provider idle transfer policy", ( test("unset provider idle policy values keep existing behaviour unchanged", async () => { const config = await buildEngineConfiguration({ + ...AUTH, dataspaceEnabled: "true" }); @@ -451,6 +470,7 @@ describe("buildEngineConfiguration - dataspace terminal transfer retention", () describe("buildEngineConfiguration - entity storage shared mutex timeout", () => { test("entity storage mutex timeout applies to both memory and file connectors", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "memory,file", entityStorageMutexTimeout: "4321", storageFileRoot: "." @@ -475,6 +495,7 @@ describe("buildEngineConfiguration - entity storage shared mutex timeout", () => test("entity storage mutex timeout is unset when the env var is empty", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "memory,file", storageFileRoot: "." }); @@ -604,6 +625,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("postgresql pool env vars are wired to the connector config", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "postgresql", postgreSqlHost: "localhost", postgreSqlUser: "u", @@ -621,6 +643,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("postgresql pool fields are undefined when pool env vars are not set", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "postgresql", postgreSqlHost: "localhost", postgreSqlUser: "u", @@ -637,6 +660,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("mysql pool env vars are wired to the connector config", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "mysql", mySqlHost: "localhost", mySqlUser: "u", @@ -663,6 +687,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("mysql pool fields are undefined when pool env vars are not set", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "mysql", mySqlHost: "localhost", mySqlUser: "u", @@ -677,6 +702,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("mongodb pool env vars are wired to the connector config", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "mongodb", mongoDbHost: "localhost", mongoDbDatabase: "db", @@ -697,6 +723,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("mongodb pool fields are undefined when pool env vars are not set", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "mongodb", mongoDbHost: "localhost", mongoDbDatabase: "db" @@ -709,6 +736,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("scylladb pool env vars are wired to the connector config", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "scylladb", scylladbHosts: "localhost", scylladbLocalDataCenter: "dc1", @@ -723,6 +751,7 @@ describe("buildEngineConfiguration - entity storage pool options", () => { test("scylladb pool fields are undefined when pool env vars are not set", async () => { const config = await buildEngineConfiguration({ + ...AUTH, entityStorageConnectorType: "scylladb", scylladbHosts: "localhost", scylladbLocalDataCenter: "dc1", @@ -955,7 +984,7 @@ describe("buildEngineConfiguration - data processing", () => { describe("buildEngineConfiguration - logging multi-connector", () => { test("single logging connector is marked as default", async () => { - const config = await buildEngineConfiguration({ loggingConnector: "console" }); + const config = await buildEngineConfiguration({ ...AUTH, loggingConnector: "console" }); const connectors = config.types.loggingConnector ?? []; const consoleConnector = connectors.find(c => c.type === LoggingConnectorType.Console); @@ -968,6 +997,7 @@ describe("buildEngineConfiguration - logging multi-connector", () => { test("two logging connectors produce a multi connector set as the default", async () => { const config = await buildEngineConfiguration({ + ...AUTH, loggingConnector: "console,entity-storage" }); @@ -988,6 +1018,7 @@ describe("buildEngineConfiguration - logging multi-connector", () => { describe("buildEngineConfiguration - telemetry multi-connector", () => { test("single telemetry connector is marked as default and service component is registered", async () => { const config = await buildEngineConfiguration({ + ...AUTH, telemetryConnector: TelemetryConnectorType.EntityStorage }); @@ -1005,6 +1036,7 @@ describe("buildEngineConfiguration - telemetry multi-connector", () => { test("two telemetry connectors produce a multi connector set as the default", async () => { const config = await buildEngineConfiguration({ + ...AUTH, telemetryConnector: `${TelemetryConnectorType.EntityStorage},${TelemetryConnectorType.OpenTelemetry}` }); @@ -1026,6 +1058,7 @@ describe("buildEngineConfiguration - telemetry multi-connector", () => { test("silent telemetry connector is marked as default and service component is registered", async () => { const config = await buildEngineConfiguration({ + ...AUTH, telemetryConnector: TelemetryConnectorType.Silent }); @@ -1092,6 +1125,7 @@ describe("buildEngineConfiguration - telemetry metrics producers", () => { describe("buildEngineConfiguration - tracing multi-connector", () => { test("single tracing connector is marked as default and service component is registered", async () => { const config = await buildEngineConfiguration({ + ...AUTH, tracingConnector: TracingConnectorType.EntityStorage }); @@ -1109,6 +1143,7 @@ describe("buildEngineConfiguration - tracing multi-connector", () => { test("two tracing connectors produce a multi connector set as the default", async () => { const config = await buildEngineConfiguration({ + ...AUTH, tracingConnector: `${TracingConnectorType.EntityStorage},${TracingConnectorType.OpenTelemetry}` }); @@ -1130,6 +1165,7 @@ describe("buildEngineConfiguration - tracing multi-connector", () => { test("silent tracing connector is marked as default and service component is registered", async () => { const config = await buildEngineConfiguration({ + ...AUTH, tracingConnector: TracingConnectorType.Silent }); @@ -1363,9 +1399,14 @@ describe("buildEngineConfiguration - identity profile", () => { * @param config The built engine configuration. * @returns The service config, or undefined when the service component is not configured. */ - function identityProfileConfig( - config: Awaited> - ): { selfUpdateDeniedProperties?: string[]; adminScopes?: string[] } | undefined { + function identityProfileConfig(config: Awaited>): + | { + authorizationModelId?: string; + escalatedPrivilegeRole?: string; + selfUpdateDeniedProperties?: string[]; + adminScopes?: string[]; + } + | undefined { const entry = config.types.identityProfileComponent?.[0]; return entry?.type === IdentityProfileComponentType.Service ? entry.options?.config : undefined; } @@ -1376,21 +1417,23 @@ describe("buildEngineConfiguration - identity profile", () => { }); expect(identityProfileConfig(config)).toEqual({ - selfUpdateDeniedProperties: undefined, - adminScopes: undefined + authorizationModelId: "system", + escalatedPrivilegeRole: "global-admin", + selfUpdateDeniedProperties: undefined }); }); - test("uses the self update denied properties and admin scopes from the env vars", async () => { + test("uses the authorization model and self update denied properties from the env vars", async () => { const config = await buildEngineConfiguration({ identityProfileConnector: IdentityProfileConnectorType.EntityStorage, - identityProfileSelfUpdateDeniedProperties: "email, jobTitle", - identityProfileAdminScopes: "profile-admin" + authorizationModelId: "custom", + identityProfileSelfUpdateDeniedProperties: "email, jobTitle" }); expect(identityProfileConfig(config)).toEqual({ - selfUpdateDeniedProperties: ["email", "jobTitle"], - adminScopes: ["profile-admin"] + authorizationModelId: "custom", + escalatedPrivilegeRole: "global-admin", + selfUpdateDeniedProperties: ["email", "jobTitle"] }); }); diff --git a/packages/node-core/tests/builders/engineServerEnvBuilder.spec.ts b/packages/node-core/tests/builders/engineServerEnvBuilder.spec.ts index fbedbded..a75b815e 100644 --- a/packages/node-core/tests/builders/engineServerEnvBuilder.spec.ts +++ b/packages/node-core/tests/builders/engineServerEnvBuilder.spec.ts @@ -4,8 +4,10 @@ import { ContextIdKeys } from "@3sixty/context"; import { AuthenticationComponentType, RestRouteProcessorType, - SocketRouteProcessorType + SocketRouteProcessorType, + WebServerType } from "@3sixty/engine-server-types"; +import { AuthorizationConnectorType } from "@3sixty/engine-types"; import { buildEngineServerConfiguration } from "../../src/builders/engineServerEnvBuilder.js"; const SERVER_INFO = { name: "test", version: "0.0.0" }; @@ -45,7 +47,8 @@ describe("buildEngineServerConfiguration - TenantOverride processors", () => { { ...BASE_VARS, tenantEnabled: "true", - authProcessorType: AuthenticationComponentType.EntityStorage + authProcessorType: AuthenticationComponentType.EntityStorage, + authorizationConnector: AuthorizationConnectorType.EntityStorage }, contextKeys, { types: {} }, @@ -57,6 +60,34 @@ describe("buildEngineServerConfiguration - TenantOverride processors", () => { expect(restTypes).toContain(RestRouteProcessorType.TenantOverride); expect(socketTypes).toContain(SocketRouteProcessorType.TenantOverride); + expect( + config.types.restRouteProcessor?.find(p => p.type === RestRouteProcessorType.TenantOverride) + ).toMatchObject({ options: { config: { authorizationModelId: "system" } } }); + }); + + test("passes the configured authorization model to TenantOverride processors", async () => { + const contextKeys: { key: string; requiredHandlerFeatures: string[] }[] = []; + const config = await buildEngineServerConfiguration( + { + ...BASE_VARS, + tenantEnabled: "true", + authProcessorType: AuthenticationComponentType.EntityStorage, + authorizationConnector: AuthorizationConnectorType.EntityStorage, + authorizationModelId: "custom" + }, + contextKeys, + { types: {} }, + SERVER_INFO + ); + + expect( + config.types.restRouteProcessor?.find(p => p.type === RestRouteProcessorType.TenantOverride) + ).toMatchObject({ options: { config: { authorizationModelId: "custom" } } }); + expect( + config.types.socketRouteProcessor?.find( + p => p.type === SocketRouteProcessorType.TenantOverride + ) + ).toMatchObject({ options: { config: { authorizationModelId: "custom" } } }); }); test("TenantOverride processor is registered after AuthHeader processor", async () => { @@ -65,7 +96,8 @@ describe("buildEngineServerConfiguration - TenantOverride processors", () => { { ...BASE_VARS, tenantEnabled: "true", - authProcessorType: AuthenticationComponentType.EntityStorage + authProcessorType: AuthenticationComponentType.EntityStorage, + authorizationConnector: AuthorizationConnectorType.EntityStorage }, contextKeys, { types: {} }, @@ -181,3 +213,44 @@ describe("buildEngineServerConfiguration - custom web config", () => { ).rejects.toThrow("invalidEnvVarValue"); }); }); + +describe("buildEngineServerConfiguration - web server type", () => { + test("leaves the web server type unset by default", async () => { + const config = await buildEngineServerConfiguration(BASE_VARS, [], { types: {} }, SERVER_INFO); + + expect(config.webServerType).toBeUndefined(); + }); + + test("uses the web server type from the env var when set", async () => { + const config = await buildEngineServerConfiguration( + { ...BASE_VARS, webServerType: WebServerType.Hono }, + [], + { types: {} }, + SERVER_INFO + ); + + expect(config.webServerType).toBe(WebServerType.Hono); + }); + + test("uses the native web server type from the env var when set", async () => { + const config = await buildEngineServerConfiguration( + { ...BASE_VARS, webServerType: WebServerType.Native }, + [], + { types: {} }, + SERVER_INFO + ); + + expect(config.webServerType).toBe(WebServerType.Native); + }); + + test("throws when the web server type is not supported", async () => { + await expect( + buildEngineServerConfiguration( + { ...BASE_VARS, webServerType: "express" }, + [], + { types: {} }, + SERVER_INFO + ) + ).rejects.toThrow(); + }); +}); diff --git a/packages/node-core/tests/commands/bootstrapDev.spec.ts b/packages/node-core/tests/commands/bootstrapDev.spec.ts index 20a8b0d6..cda80690 100644 --- a/packages/node-core/tests/commands/bootstrapDev.spec.ts +++ b/packages/node-core/tests/commands/bootstrapDev.spec.ts @@ -224,14 +224,25 @@ describe("bootstrap-dev", () => { // Verify admin user record contains expected values for multi-tenant mode interface AuthUserRecord { email: string; - scope: string; identity: string; organization: string; } const authUsers = await readStoreRecords(dbDir, "authentication-user"); expect(authUsers).toHaveLength(1); expect(authUsers[0].email).toBe("admin@tenant"); - expect(authUsers[0].scope).toBe("global-admin,tenant-admin,user-admin"); + + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( + dbDir, + "authorization-role-assignment" + ); + expect(roleAssignments.map(r => r.role).sort()).toEqual([ + "devops", + "global-admin", + "identity-admin", + "identity-profile-admin", + "tenant-admin", + "user-admin" + ]); // Verify identity documents include the node DID interface IdentityDocRecord { @@ -276,12 +287,22 @@ describe("bootstrap-dev", () => { // Verify admin user record contains expected values for single-tenant mode interface AuthUserRecord { email: string; - scope: string; } const authUsers = await readStoreRecords(dbDir, "authentication-user"); expect(authUsers).toHaveLength(1); expect(authUsers[0].email).toBe("admin@node"); - expect(authUsers[0].scope).toBe("global-admin,user-admin"); + + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( + dbDir, + "authorization-role-assignment" + ); + expect(roleAssignments.map(r => r.role).sort()).toEqual([ + "devops", + "global-admin", + "identity-admin", + "identity-profile-admin", + "user-admin" + ]); // Verify identity documents contain both node and org DIDs stored in state interface IdentityDocRecord { @@ -423,12 +444,22 @@ describe("bootstrap-dev", () => { interface AuthUserRecord { email: string; - scope: string; } const authUsers = await readStoreRecords(dbDir, "authentication-user"); expect(authUsers).toHaveLength(1); expect(authUsers[0].email).toBe("admin@acme.com"); - expect(authUsers[0].scope).toBe("global-admin,user-admin"); + + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( + dbDir, + "authorization-role-assignment" + ); + expect(roleAssignments.map(r => r.role).sort()).toEqual([ + "devops", + "global-admin", + "identity-admin", + "identity-profile-admin", + "user-admin" + ]); interface ProfileRecord { privateProfile: { givenName: string; familyName: string; email: string }; @@ -473,12 +504,23 @@ describe("bootstrap-dev", () => { interface AuthUserRecord { email: string; - scope: string; } const authUsers = await readStoreRecords(dbDir, "authentication-user"); expect(authUsers).toHaveLength(1); expect(authUsers[0].email).toBe("admin@acme.com"); - expect(authUsers[0].scope).toBe("global-admin,tenant-admin,user-admin"); + + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( + dbDir, + "authorization-role-assignment" + ); + expect(roleAssignments.map(r => r.role).sort()).toEqual([ + "devops", + "global-admin", + "identity-admin", + "identity-profile-admin", + "tenant-admin", + "user-admin" + ]); interface ProfileRecord { privateProfile: { givenName: string; familyName: string; email: string }; diff --git a/packages/node-core/tests/commands/cliTestHelper.ts b/packages/node-core/tests/commands/cliTestHelper.ts index a11c62e6..8787a7a8 100644 --- a/packages/node-core/tests/commands/cliTestHelper.ts +++ b/packages/node-core/tests/commands/cliTestHelper.ts @@ -6,6 +6,7 @@ import { Factory } from "@3sixty/core"; import { MemoryStateStorage } from "@3sixty/engine-core"; import { AuthenticationAdminComponentType } from "@3sixty/engine-server-types"; import { + AuthorizationConnectorType, EntityStorageConnectorType, FaucetConnectorType, IdentityConnectorType, @@ -110,6 +111,7 @@ export async function executeCliCommand( TWIN_FAUCET_CONNECTOR: FaucetConnectorType.EntityStorage, TWIN_WALLET_CONNECTOR: WalletConnectorType.EntityStorage, TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, ...options.envVars } }, diff --git a/packages/node-core/tests/commands/userCreate.spec.ts b/packages/node-core/tests/commands/userCreate.spec.ts index 7312fbfa..21317350 100644 --- a/packages/node-core/tests/commands/userCreate.spec.ts +++ b/packages/node-core/tests/commands/userCreate.spec.ts @@ -14,7 +14,7 @@ interface IUserOutput { organizationDid: string; email: string; password: string; - scope: string[]; + roles: string[]; givenName: string; familyName: string; } @@ -46,7 +46,7 @@ describe.each(TENANT_MODES)("user-create in $mode mode", ({ mode, tenantEnabled await context.execute([ ...userArgs("user@example.com"), ...context.tenantArgs(), - "--scope=tenant-admin,doo", + "--roles=tenant-admin,user-admin", `--output-json=${context.dir}user.json`, `--output-env=${context.dir}user.env`, "--output-env-prefix=user" @@ -58,16 +58,26 @@ describe.each(TENANT_MODES)("user-create in $mode mode", ({ mode, tenantEnabled expect(json?.organizationDid).toEqual(valueFromEnv(env?.[1])); expect(json?.email).toEqual(valueFromEnv(env?.[2])); expect(json?.password).toEqual(valueFromEnv(env?.[3])); - expect(json?.scope.join(",")).toEqual(valueFromEnv(env?.[4])); + expect(json?.roles.join(",")).toEqual(valueFromEnv(env?.[4])); expect(json?.givenName).toEqual(valueFromEnv(env?.[5])); expect(json?.familyName).toEqual(valueFromEnv(env?.[6])); - const users = await readStoreRecords<{ email: string; scope: string; partitionId: string }>( + const users = await readStoreRecords<{ email: string; partitionId: string }>( context.dbDir, "authentication-user" ); const user = users.find(u => u.email === "user@example.com"); - expect(user?.scope).toEqual("tenant-admin,doo"); + + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( + context.dbDir, + "authorization-role-assignment" + ); + expect( + roleAssignments + .filter(r => r.subject === userIdentity) + .map(r => r.role) + .sort() + ).toEqual(["tenant-admin", "user-admin"]); const nodeIdParts = (context.state.nodeId ?? "").split(":"); const nodePartitionId = Converter.bytesToBase64Url(Converter.hexToBytes(nodeIdParts[2])); @@ -99,14 +109,14 @@ describe.each(TENANT_MODES)("user-create in $mode mode", ({ mode, tenantEnabled await context.execute([ ...userArgs("user@example.com"), ...context.tenantArgs(), - "--scope=tenant-admin", + "--roles=tenant-admin", "--overwrite-mode=overwrite", `--output-json=${context.dir}user-overwrite.json` ]); const json = await CLIUtils.readJsonFile(`${context.dir}user-overwrite.json`); expect(json?.email).toEqual("user@example.com"); - expect(json?.scope).toEqual(["tenant-admin"]); + expect(json?.roles).toEqual(["tenant-admin"]); }); test("throws when password is too short", async () => { diff --git a/packages/node-core/tests/commands/userUpdate.spec.ts b/packages/node-core/tests/commands/userUpdate.spec.ts index 66a3f1eb..fb1bfd6c 100644 --- a/packages/node-core/tests/commands/userUpdate.spec.ts +++ b/packages/node-core/tests/commands/userUpdate.spec.ts @@ -15,17 +15,22 @@ describe.each(TENANT_MODES)("user-update in $mode mode", ({ mode, tenantEnabled await context.execute([ "user-update", "--email=user@example.com", - "--scope=tenant-admin,doo", + "--roles=tenant-admin,user-admin", "--given-name=Admin", "--family-name=Node", ...context.tenantArgs() ]); - const users = await readStoreRecords<{ email: string; scope: string }>( + const roleAssignments = await readStoreRecords<{ subject: string; role: string }>( context.dbDir, - "authentication-user" + "authorization-role-assignment" ); - expect(users.find(u => u.email === "user@example.com")?.scope).toEqual("tenant-admin,doo"); + expect( + roleAssignments + .filter(r => r.subject === userIdentity) + .map(r => r.role) + .sort() + ).toEqual(["tenant-admin", "user-admin"]); const profiles = await readStoreRecords<{ identity: string; diff --git a/packages/node-core/tests/endpoints.spec.ts b/packages/node-core/tests/endpoints.spec.ts index c3dcb005..ee858f15 100644 --- a/packages/node-core/tests/endpoints.spec.ts +++ b/packages/node-core/tests/endpoints.spec.ts @@ -13,6 +13,7 @@ import { } from "@3sixty/engine-server-types"; import { AttestationConnectorType, + AuthorizationConnectorType, BlobStorageConnectorType, EntityStorageConnectorType, EventBusComponentType, @@ -32,6 +33,13 @@ import { import type { ITrustComponent } from "@3sixty/trust-models"; import { loadAndRunGroups } from "./endpoints/runner.js"; import { CI_ENV_VARS, getFreePort } from "./setupTestEnv.js"; +import { + DEFAULT_DEVOPS_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE +} from "../src/defaults.js"; import type { INodeEngineState } from "../src/models/INodeEngineState.js"; import { run } from "../src/node.js"; @@ -72,6 +80,7 @@ const SHARED_ENV_VARS: { [id: string]: string } = { TWIN_LOGGING_CONNECTOR: LoggingConnectorType.EntityStorage, TWIN_TELEMETRY_CONNECTOR: TelemetryConnectorType.EntityStorage, TWIN_TRACING_CONNECTOR: TracingConnectorType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_VAULT_CONNECTOR: VaultConnectorType.EntityStorage, TWIN_IDENTITY_CONNECTOR: IdentityConnectorType.EntityStorage, TWIN_IDENTITY_RESOLVER_CONNECTOR: IdentityResolverConnectorType.EntityStorage, @@ -150,6 +159,7 @@ describe("node-core", () => { TWIN_HEALTH_ENABLED: "true", TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, TWIN_AUTH_PROCESSOR_TYPE: AuthenticationComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_TRUST_GENERATORS: "jwt-verifiable-credential", TWIN_TRUST_VERIFIERS: "jwt-verifiable-credential", TWIN_TRUST_VERIFICATION_METHOD_ID: "trust-assertion", @@ -172,7 +182,13 @@ describe("node-core", () => { TWIN_FEATURES: "admin-user", TWIN_ADMIN_USER_NAME: TEST_ADMIN_EMAIL, TWIN_ADMIN_USER_PASSWORD: TEST_ADMIN_PASSWORD, - TWIN_ADMIN_USER_SCOPE: "tenant-admin,user-admin", + TWIN_ADMIN_USER_ROLES: [ + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ].join(","), TWIN_HEALTH_STARTUP_INTERVAL: "1" } }, @@ -249,7 +265,13 @@ describe("node-core", () => { TWIN_TENANT_ID: TEST_TENANT_ID, TWIN_ADMIN_USER_NAME: TEST_ADMIN_EMAIL, TWIN_ADMIN_USER_PASSWORD: TEST_ADMIN_PASSWORD, - TWIN_ADMIN_USER_SCOPE: "tenant-admin,user-admin", + TWIN_ADMIN_USER_ROLES: [ + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ].join(","), TWIN_HEALTH_STARTUP_INTERVAL: "500" } }, @@ -370,7 +392,13 @@ describe("node-core", () => { TWIN_TENANT_API_KEY: TEST_TENANT_API_KEY, TWIN_ADMIN_USER_NAME: TEST_ADMIN_EMAIL, TWIN_ADMIN_USER_PASSWORD: TEST_ADMIN_PASSWORD, - TWIN_ADMIN_USER_SCOPE: "tenant-admin,user-admin", + TWIN_ADMIN_USER_ROLES: [ + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ].join(","), TWIN_HEALTH_STARTUP_INTERVAL: "500" } }, @@ -468,7 +496,7 @@ describe("node-core", () => { await rm(OUTPUT_TMP_DIR_GA, { recursive: true, force: true }); Factory.clearFactories(); - // Phase 1: Bootstrap admin user receives global-admin scope so it can use override-tenant. + // Phase 1: Bootstrap admin user receives global-admin role so it can use override-tenant. const bootstrapState: INodeEngineState = {}; await run( { @@ -481,7 +509,7 @@ describe("node-core", () => { TWIN_TENANT_API_KEY: TEST_GA_TENANT_API_KEY, TWIN_ADMIN_USER_NAME: TEST_ADMIN_EMAIL, TWIN_ADMIN_USER_PASSWORD: TEST_ADMIN_PASSWORD, - TWIN_ADMIN_USER_SCOPE: "tenant-admin,user-admin,global-admin", + TWIN_ADMIN_USER_ROLES: "tenant-admin,user-admin,global-admin", TWIN_HEALTH_STARTUP_INTERVAL: "500" } }, @@ -572,7 +600,13 @@ describe("node-core", () => { TWIN_TENANT_API_KEY: TEST_TENANT_API_KEY, TWIN_ADMIN_USER_NAME: TEST_ADMIN_EMAIL, TWIN_ADMIN_USER_PASSWORD: TEST_ADMIN_PASSWORD, - TWIN_ADMIN_USER_SCOPE: "tenant-admin,user-admin", + TWIN_ADMIN_USER_ROLES: [ + DEFAULT_TENANT_ADMIN_ROLE, + DEFAULT_USER_ADMIN_ROLE, + DEFAULT_IDENTITY_ADMIN_ROLE, + DEFAULT_IDENTITY_PROFILE_ADMIN_ROLE, + DEFAULT_DEVOPS_ROLE + ].join(","), TWIN_HEALTH_STARTUP_INTERVAL: "500" } }, diff --git a/packages/node-core/tests/endpoints/groups/authorization.json b/packages/node-core/tests/endpoints/groups/authorization.json new file mode 100644 index 00000000..6a6c9234 --- /dev/null +++ b/packages/node-core/tests/endpoints/groups/authorization.json @@ -0,0 +1,179 @@ +{ + "group": "Authorization", + "steps": [ + { + "description": "POST /authorization/check — 400 missing subject", + "method": "POST", + "path": "/authorization/system/check", + "body": { "object": "/data", "action": "read" }, + "expectedStatus": 400 + }, + { + "description": "POST /authorization/policy — 400 missing object", + "method": "POST", + "path": "/authorization/system/policy", + "body": { "subject": "test-subject", "action": "read" }, + "expectedStatus": 400 + }, + { + "description": "POST /authorization/policy — add policy", + "method": "POST", + "path": "/authorization/system/policy", + "body": { "subject": "test-subject", "object": "/data", "action": "read" }, + "expectedStatus": 204 + }, + { + "description": "POST /authorization/policy — add second policy", + "method": "POST", + "path": "/authorization/system/policy", + "body": { "subject": "test-subject", "object": "/data", "action": "write" }, + "expectedStatus": 204 + }, + { + "description": "GET /authorization/policy — list all policies", + "method": "GET", + "path": "/authorization/system/policy", + "expectedStatus": 200, + "assert": { "body.entities": "isDefined" } + }, + { + "description": "GET /authorization/policy/:subject — get policies for subject", + "method": "GET", + "path": "/authorization/system/policy/test-subject", + "expectedStatus": 200, + "assert": { "body.entities": "isDefined" } + }, + { + "description": "POST /authorization/check — allowed after policy added", + "method": "POST", + "path": "/authorization/system/check", + "body": { "subject": "test-subject", "object": "/data", "action": "read" }, + "expectedStatus": 200, + "assert": { "body.allowed": true } + }, + { + "description": "POST /authorization/check — not allowed for unknown action", + "method": "POST", + "path": "/authorization/system/check", + "body": { "subject": "test-subject", "object": "/data", "action": "delete" }, + "expectedStatus": 200, + "assert": { "body.allowed": false } + }, + { + "description": "POST /authorization/policy/remove — remove one policy", + "method": "POST", + "path": "/authorization/system/policy/remove", + "body": { "subject": "test-subject", "object": "/data", "action": "write" }, + "expectedStatus": 204 + }, + { + "description": "GET /authorization/roles — list all roles (empty initially)", + "method": "GET", + "path": "/authorization/system/roles", + "expectedStatus": 200, + "assert": { "body.roles": "isDefined" } + }, + { + "description": "POST /authorization/subject/:subject/role — 400 missing role", + "method": "POST", + "path": "/authorization/system/subject/test-subject/role", + "body": {}, + "expectedStatus": 400 + }, + { + "description": "POST /authorization/subject/:subject/role — add editor role", + "method": "POST", + "path": "/authorization/system/subject/test-subject/role", + "body": { "role": "editor" }, + "expectedStatus": 204 + }, + { + "description": "POST /authorization/subject/:subject/role — add viewer role", + "method": "POST", + "path": "/authorization/system/subject/test-subject/role", + "body": { "role": "viewer" }, + "expectedStatus": 204 + }, + { + "description": "GET /authorization/subject/:subject/roles — get roles for subject", + "method": "GET", + "path": "/authorization/system/subject/test-subject/roles", + "expectedStatus": 200, + "assert": { "body.roles": "isDefined" } + }, + { + "description": "GET /authorization/subject/:subject/role/:role — has editor role", + "method": "GET", + "path": "/authorization/system/subject/test-subject/role/editor", + "expectedStatus": 200, + "assert": { "body.hasRole": true } + }, + { + "description": "GET /authorization/subject/:subject/role/:role — does not have admin role", + "method": "GET", + "path": "/authorization/system/subject/test-subject/role/admin", + "expectedStatus": 200, + "assert": { "body.hasRole": false } + }, + { + "description": "GET /authorization/role/:role/subjects — get subjects for editor role", + "method": "GET", + "path": "/authorization/system/role/editor/subjects", + "expectedStatus": 200, + "assert": { "body.subjects": "isDefined" } + }, + { + "description": "DELETE /authorization/subject/:subject/role/:role — remove viewer role", + "method": "DELETE", + "path": "/authorization/system/subject/test-subject/role/viewer", + "expectedStatus": 204 + }, + { + "description": "GET /authorization/subject/:subject/role/:role — no longer has viewer role", + "method": "GET", + "path": "/authorization/system/subject/test-subject/role/viewer", + "expectedStatus": 200, + "assert": { "body.hasRole": false } + }, + { + "description": "POST /authorization/role/:role/inherit — add inheritance editor inherits viewer", + "method": "POST", + "path": "/authorization/system/role/editor/inherit", + "body": { "inheritsFrom": "viewer" }, + "expectedStatus": 204 + }, + { + "description": "GET /authorization/role/:role/parents — get parent roles for editor", + "method": "GET", + "path": "/authorization/system/role/editor/parents", + "expectedStatus": 200, + "assert": { "body.roles": "isDefined" } + }, + { + "description": "GET /authorization/role/:role/children — get child roles for viewer", + "method": "GET", + "path": "/authorization/system/role/viewer/children", + "expectedStatus": 200, + "assert": { "body.roles": "isDefined" } + }, + { + "description": "DELETE /authorization/role/:role/inherit/:inheritsFrom — remove inheritance", + "method": "DELETE", + "path": "/authorization/system/role/editor/inherit/viewer", + "expectedStatus": 204 + }, + { + "description": "DELETE /authorization/subject/:subject/roles — remove all roles for subject", + "method": "DELETE", + "path": "/authorization/system/subject/test-subject/roles", + "expectedStatus": 204 + }, + { + "description": "GET /authorization/subject/:subject/roles — empty after remove all", + "method": "GET", + "path": "/authorization/system/subject/test-subject/roles", + "expectedStatus": 200, + "assert": { "body.roles": "isDefined" } + } + ] +} diff --git a/packages/node-core/tests/endpoints/groups/global-admin-unauthorized.json b/packages/node-core/tests/endpoints/groups/global-admin-unauthorized.json index 19dd0147..ce057d4e 100644 --- a/packages/node-core/tests/endpoints/groups/global-admin-unauthorized.json +++ b/packages/node-core/tests/endpoints/groups/global-admin-unauthorized.json @@ -10,20 +10,26 @@ "capture": { "regularUserDid": "body.id" } }, { - "description": "POST /authentication/admin/users - create user without global-admin scope", + "description": "POST /authentication/admin/users - create user without global-admin role", "method": "POST", "path": "/authentication/admin/users", "body": { "email": "regular-user@node", "password": "Regular@Node12345!", "userIdentity": "{{regularUserDid}}", - "organizationIdentity": "{{adminOrgIdentity}}", - "scope": ["tenant-admin"] + "organizationIdentity": "{{adminOrgIdentity}}" }, "expectedStatus": 201 }, { - "description": "POST /authentication/login - login as regular user (no global-admin scope)", + "description": "POST /authorization/system/subject/:subject/role - assign tenant-admin role", + "method": "POST", + "path": "/authorization/system/subject/{{regularUserDid}}/role", + "body": { "role": "tenant-admin" }, + "expectedStatus": 204 + }, + { + "description": "POST /authentication/login - login as regular user (no global-admin role)", "method": "POST", "path": "/authentication/login", "apiKey": true, @@ -32,7 +38,13 @@ "capture": { "authToken": "cookie:access_token" } }, { - "description": "POST /aig?override-tenant - rejected without global-admin scope", + "description": "GET /authentication/admin/users/:email - rejected for user-only role", + "method": "GET", + "path": "/authentication/admin/users/{{adminEmail}}", + "expectedStatus": 403 + }, + { + "description": "POST /aig?override-tenant - rejected without global-admin role", "method": "POST", "path": "/aig?override-tenant={{secondTenantId}}", "body": { diff --git a/packages/node-core/tests/endpoints/groups/identity-profile-self-update.json b/packages/node-core/tests/endpoints/groups/identity-profile-self-update.json index 6da31a63..1e1d78e2 100644 --- a/packages/node-core/tests/endpoints/groups/identity-profile-self-update.json +++ b/packages/node-core/tests/endpoints/groups/identity-profile-self-update.json @@ -10,18 +10,24 @@ "capture": { "profileUserDid": "body.id" } }, { - "description": "POST /authentication/admin/users - create profile test user without admin scope", + "description": "POST /authentication/admin/users - create profile test user without escalated privilege", "method": "POST", "path": "/authentication/admin/users", "body": { "email": "profile-user@node", "password": "Profile@Node12345!", "userIdentity": "{{profileUserDid}}", - "organizationIdentity": "{{adminOrgIdentity}}", - "scope": ["read-only"] + "organizationIdentity": "{{adminOrgIdentity}}" }, "expectedStatus": 201 }, + { + "description": "POST /authorization/system/subject/:subject/role - assign user role", + "method": "POST", + "path": "/authorization/system/subject/{{profileUserDid}}/role", + "body": { "role": "user" }, + "expectedStatus": 204 + }, { "description": "POST /authentication/login - login as profile test user", "method": "POST", @@ -32,7 +38,7 @@ "capture": { "authToken": "cookie:access_token" } }, { - "description": "POST /identity/profile - 401 setting denied property without admin scope", + "description": "POST /identity/profile - 401 setting denied property without escalated privilege", "method": "POST", "path": "/identity/profile", "body": { @@ -59,7 +65,7 @@ "expectedStatus": 204 }, { - "description": "PUT /identity/profile - 401 adding denied property without admin scope", + "description": "PUT /identity/profile - 401 adding denied property without escalated privilege", "method": "PUT", "path": "/identity/profile", "body": { @@ -105,7 +111,7 @@ "capture": { "authToken": "cookie:access_token" } }, { - "description": "PUT /identity/profile - 401 changing denied property without admin scope", + "description": "PUT /identity/profile - 401 changing denied property without escalated privilege", "method": "PUT", "path": "/identity/profile", "body": { diff --git a/packages/node-core/tests/endpoints/groups/identity.json b/packages/node-core/tests/endpoints/groups/identity.json index fa91aa04..7b7d40ea 100644 --- a/packages/node-core/tests/endpoints/groups/identity.json +++ b/packages/node-core/tests/endpoints/groups/identity.json @@ -87,14 +87,14 @@ "capture": { "proofData": "body" } }, { - "description": "GET /identity/:identity/verifiable-credential/revoke/1", - "method": "GET", + "description": "POST /identity/:identity/verifiable-credential/revoke/1", + "method": "POST", "path": "/identity/{{testIdentity}}/verifiable-credential/revoke/1", "expectedStatus": 204 }, { - "description": "GET /identity/:identity/verifiable-credential/unrevoke/1", - "method": "GET", + "description": "POST /identity/:identity/verifiable-credential/unrevoke/1", + "method": "POST", "path": "/identity/{{testIdentity}}/verifiable-credential/unrevoke/1", "expectedStatus": 204 }, diff --git a/packages/node-core/tests/endpoints/index.json b/packages/node-core/tests/endpoints/index.json index 064c6bf6..0be52d11 100644 --- a/packages/node-core/tests/endpoints/index.json +++ b/packages/node-core/tests/endpoints/index.json @@ -4,6 +4,7 @@ "logging", "telemetry", "tracing", + "authorization", "blob", "identity", "identity-profile-self-update", diff --git a/packages/node-core/tests/facades.spec.ts b/packages/node-core/tests/facades.spec.ts index f7159a15..59209cb5 100644 --- a/packages/node-core/tests/facades.spec.ts +++ b/packages/node-core/tests/facades.spec.ts @@ -5,6 +5,7 @@ import { ComponentFactory, Factory } from "@3sixty/core"; import { MemoryStateStorage } from "@3sixty/engine-core"; import { EngineCloneMode } from "@3sixty/engine-models"; import { + AuthorizationConnectorType, EntityStorageConnectorType, FacadeType, TracingComponentType, @@ -13,12 +14,13 @@ import { import { TracingFacade, TracingFacadeAttributes } from "@3sixty/tracing-facades"; import { type ISpan, SpanStatus, TracingConnectorFactory } from "@3sixty/tracing-models"; import { CI_ENV_VARS, getFreePort } from "./setupTestEnv.js"; -import { buildEngineConfiguration } from "../src/builders/engineEnvBuilder.js"; +import { buildEngineConfiguration as buildEngineConfigurationBase } from "../src/builders/engineEnvBuilder.js"; import { DEFAULT_TRACING_FACADE_COMPONENT_EXCLUDE_TYPES, DEFAULT_TRACING_FACADE_FACTORIES, TRACING_FACADE_NAME } from "../src/defaults.js"; +import type { IEngineEnvironmentVariables } from "../src/models/IEngineEnvironmentVariables.js"; import { run } from "../src/node.js"; const TEST_NODE_ID = "did:iota:testnet:0x1234"; @@ -27,6 +29,20 @@ const TEST_ORG_ID = const CHILD_SERVICE = "child-service"; const PARENT_SERVICE = "parent-service"; +/** + * Builds the engine configuration with the required authorization connector set. + * @param envVars The environment variables. + * @returns The engine configuration. + */ +async function buildEngineConfiguration( + envVars: IEngineEnvironmentVariables +): ReturnType { + return buildEngineConfigurationBase({ + authorizationConnector: AuthorizationConnectorType.EntityStorage, + ...envVars + }); +} + describe("buildEngineConfiguration - tracing facades", () => { test("activates the facade on the default factories when the tracing facade is requested", async () => { const config = await buildEngineConfiguration({ @@ -222,6 +238,7 @@ async function traceEndpointCalls( TWIN_SILENT: "true", TWIN_PORT: String(port), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_TRACING_CONNECTOR: TracingConnectorType.EntityStorage, TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS, @@ -495,6 +512,7 @@ async function traceComponentCalls( TWIN_SILENT: "true", TWIN_PORT: String(await getFreePort()), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_TRACING_CONNECTOR: TracingConnectorType.EntityStorage, TWIN_FACADE: FacadeType.Tracing, TWIN_SCHEMA_MIGRATION_ENABLED: "false", diff --git a/packages/node-core/tests/index.spec.ts b/packages/node-core/tests/index.spec.ts index cc5ff40a..f6b855d5 100644 --- a/packages/node-core/tests/index.spec.ts +++ b/packages/node-core/tests/index.spec.ts @@ -141,6 +141,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, TWIN_SCHEMA_MIGRATION_ENABLED: "false", + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS } }); @@ -165,6 +166,7 @@ describe("node-core", () => { TWIN_DISABLE_COLOR: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS } @@ -194,6 +196,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS } @@ -222,6 +225,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS } @@ -271,6 +275,7 @@ describe("node-core", () => { TWIN_AUTOMATION_ACTION_TYPES: "fetch", TWIN_HEALTH_ENABLED: "true", TWIN_SCHEMA_MIGRATION_ENABLED: "false", + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS } }); @@ -312,6 +317,7 @@ describe("node-core", () => { TWIN_AUDITABLE_ITEM_STREAM_ENABLED: "true", TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, TWIN_AUTH_PROCESSOR_TYPE: AuthenticationComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_BLOB_STORAGE_ENABLE_ENCRYPTION: "true", TWIN_DOCUMENT_MANAGEMENT_ENABLED: "true", TWIN_TRUST_GENERATORS: "jwt-verifiable-credential", @@ -370,6 +376,7 @@ describe("node-core", () => { TWIN_AUDITABLE_ITEM_STREAM_ENABLED: "true", TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, TWIN_AUTH_PROCESSOR_TYPE: AuthenticationComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_BLOB_STORAGE_ENABLE_ENCRYPTION: "true", TWIN_DOCUMENT_MANAGEMENT_ENABLED: "true", TWIN_TRUST_GENERATORS: "jwt-verifiable-credential", @@ -417,6 +424,7 @@ describe("node-core", () => { TWIN_EVENT_BUS_CONNECTOR: EventBusConnectorType.Local, TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, TWIN_AUTH_PROCESSOR_TYPE: AuthenticationComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_TRUST_GENERATORS: "jwt-verifiable-credential", TWIN_TRUST_VERIFIERS: "jwt-verifiable-credential", TWIN_TRUST_VERIFICATION_METHOD_ID: "trust-assertion", @@ -446,6 +454,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false" }; @@ -480,18 +489,37 @@ describe("node-core", () => { "engine-logging-service", "schema-version-service", "platform-service", + "authorization-service", "did-context-id-handler", "information-service" ]); const buildRestRoutes = startResult?.server?.getRestRoutes() ?? []; - expect(buildRestRoutes.map(r => r.path)).toEqual([ - "/", - "/favicon.ico", - "/info", - "/livez", - "/readyz", - "/spec" + expect(buildRestRoutes.map(r => `${r.method.padEnd(8, " ")} ${r.path}`)).toEqual([ + "GET /", + "GET /favicon.ico", + "GET /info", + "GET /livez", + "GET /readyz", + "GET /spec", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children" ]); await startResult?.shutdown(); @@ -507,6 +535,7 @@ describe("node-core", () => { TWIN_LOGGING_CONNECTOR: LoggingConnectorType.EntityStorage, TWIN_TELEMETRY_CONNECTOR: TelemetryConnectorType.EntityStorage, TWIN_TRACING_CONNECTOR: TracingConnectorType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_VAULT_CONNECTOR: VaultConnectorType.EntityStorage, TWIN_IDENTITY_CONNECTOR: IdentityConnectorType.EntityStorage, TWIN_IDENTITY_RESOLVER_CONNECTOR: IdentityResolverConnectorType.EntityStorage, @@ -579,15 +608,6 @@ describe("node-core", () => { expect(startResult).toBeDefined(); - // Wait for the server to start - await waitForServer(port); - - const res = await fetch(`http://localhost:${port}/info`); - expect(await res.json()).toEqual({ - name: "foo", - version: "0.0.0" - }); - expect(ComponentFactory.names()).toEqual([ "engine-logging-service", "schema-version-service", @@ -599,6 +619,7 @@ describe("node-core", () => { "telemetry-service", "tracing-service", "metrics-collector-service", + "authorization-service", "automation-service", "messaging-admin-service", "messaging-service", @@ -654,6 +675,7 @@ describe("node-core", () => { "POST /authentication/logout", "POST /authentication/refresh", "PUT /authentication/password", + "GET /authentication/policy", "POST /authentication/admin/users", "PUT /authentication/admin/users/:email", "PUT /authentication/admin/users/:email/password", @@ -679,6 +701,24 @@ describe("node-core", () => { "PUT /tracing/:spanId", "GET /tracing", "GET /tracing/trace/:traceId", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children", "POST /automation/trigger/:trigger", "POST /automation", "DELETE /automation/:actionId", @@ -702,8 +742,8 @@ describe("node-core", () => { "POST /identity/:identity/verifiable-credential/:verificationMethodId", "POST /identity/verifiable-credential/verify/document", "GET /identity/verifiable-credential/verify", - "GET /identity/:identity/verifiable-credential/revoke/:revocationIndex", - "GET /identity/:identity/verifiable-credential/unrevoke/:revocationIndex", + "POST /identity/:identity/verifiable-credential/revoke/:revocationIndex", + "POST /identity/:identity/verifiable-credential/unrevoke/:revocationIndex", "POST /identity/:identity/verifiable-presentation/:verificationMethodId", "POST /identity/verifiable-presentation/verify/document", "GET /identity/verifiable-presentation/verify", @@ -878,6 +918,7 @@ describe("node-core", () => { TWIN_LOGGING_CONNECTOR: LoggingConnectorType.EntityStorage, TWIN_TELEMETRY_CONNECTOR: TelemetryConnectorType.EntityStorage, TWIN_TRACING_CONNECTOR: TracingConnectorType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_VAULT_CONNECTOR: VaultConnectorType.EntityStorage, TWIN_IDENTITY_CONNECTOR: IdentityConnectorType.EntityStorage, TWIN_IDENTITY_RESOLVER_CONNECTOR: IdentityResolverConnectorType.EntityStorage, @@ -965,6 +1006,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false" }; @@ -1024,18 +1066,37 @@ describe("node-core", () => { "engine-logging-service", "schema-version-service", "platform-service", + "authorization-service", "did-context-id-handler", "information-service" ]); const buildRestRoutes = startResult?.server?.getRestRoutes() ?? []; - expect(buildRestRoutes.map(r => r.path)).toEqual([ - "/", - "/favicon.ico", - "/info", - "/livez", - "/readyz", - "/spec" + expect(buildRestRoutes.map(r => `${r.method.padEnd(8, " ")} ${r.path}`)).toEqual([ + "GET /", + "GET /favicon.ico", + "GET /info", + "GET /livez", + "GET /readyz", + "GET /spec", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children" ]); await startResult?.shutdown(); @@ -1047,6 +1108,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false" }; @@ -1087,18 +1149,37 @@ describe("node-core", () => { "engine-logging-service", "schema-version-service", "platform-service", + "authorization-service", "did-context-id-handler", "information-service" ]); const buildRestRoutes = startResult?.server?.getRestRoutes() ?? []; - expect(buildRestRoutes.map(r => r.path)).toEqual([ - "/", - "/favicon.ico", - "/info", - "/livez", - "/readyz", - "/spec" + expect(buildRestRoutes.map(r => `${r.method.padEnd(8, " ")} ${r.path}`)).toEqual([ + "GET /", + "GET /favicon.ico", + "GET /info", + "GET /livez", + "GET /readyz", + "GET /spec", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children" ]); await startResult?.shutdown(); @@ -1110,6 +1191,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false" }; @@ -1150,18 +1232,37 @@ describe("node-core", () => { "engine-logging-service", "schema-version-service", "platform-service", + "authorization-service", "did-context-id-handler", "information-service" ]); const buildRestRoutes = startResult?.server?.getRestRoutes() ?? []; - expect(buildRestRoutes.map(r => r.path)).toEqual([ - "/", - "/favicon.ico", - "/info", - "/livez", - "/readyz", - "/spec" + expect(buildRestRoutes.map(r => `${r.method.padEnd(8, " ")} ${r.path}`)).toEqual([ + "GET /", + "GET /favicon.ico", + "GET /info", + "GET /livez", + "GET /readyz", + "GET /spec", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children" ]); await startResult?.shutdown(); @@ -1173,6 +1274,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_TEST_EMBEDDED: "@text:tests/fixtures/embedded.txt", TWIN_ENV_ALLOW_LIST: [CI_ENV_VARS, "TWIN_TEST_EMBEDDED"].filter(Boolean).join(",") @@ -1209,6 +1311,7 @@ describe("node-core", () => { TWIN_DEBUG: "true", TWIN_SILENT: "true", TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_TEST_EMBEDDED: "@json:tests/fixtures/embedded.json", TWIN_ENV_ALLOW_LIST: [CI_ENV_VARS, "TWIN_TEST_EMBEDDED"].filter(Boolean).join(",") @@ -1248,6 +1351,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_EXTENSIONS: "./tests/fixtures//myExtension.js" }; @@ -1286,18 +1390,37 @@ describe("node-core", () => { "engine-logging-service", "schema-version-service", "platform-service", + "authorization-service", "did-context-id-handler", "information-service" ]); const buildRestRoutes = startResult?.server?.getRestRoutes() ?? []; - expect(buildRestRoutes.map(r => r.path)).toEqual([ - "/", - "/favicon.ico", - "/info", - "/livez", - "/readyz", - "/spec" + expect(buildRestRoutes.map(r => `${r.method.padEnd(8, " ")} ${r.path}`)).toEqual([ + "GET /", + "GET /favicon.ico", + "GET /info", + "GET /livez", + "GET /readyz", + "GET /spec", + "POST /authorization/:modelId", + "POST /authorization/:modelId/check", + "POST /authorization/:modelId/policy", + "POST /authorization/:modelId/policy/remove", + "GET /authorization/:modelId/policy", + "GET /authorization/:modelId/roles", + "POST /authorization/:modelId/roles/has", + "GET /authorization/:modelId/policy/:subject", + "POST /authorization/:modelId/subject/:subject/role", + "DELETE /authorization/:modelId/subject/:subject/role/:role", + "DELETE /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/roles", + "GET /authorization/:modelId/subject/:subject/role/:role", + "GET /authorization/:modelId/role/:role/subjects", + "POST /authorization/:modelId/role/:role/inherit", + "DELETE /authorization/:modelId/role/:role/inherit/:inheritsFrom", + "GET /authorization/:modelId/role/:role/parents", + "GET /authorization/:modelId/role/:role/children" ]); await startResult?.shutdown(); @@ -1391,6 +1514,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_EXTENSIONS: "./tests/.tmp/index/first-extension.js,./tests/.tmp/index/second-extension.js" @@ -1483,6 +1607,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_EXTENSIONS: "./tests/.tmp/index/lifecycle-test.js" }; @@ -1599,6 +1724,7 @@ describe("node-core", () => { TWIN_SILENT: "true", TWIN_PORT: port.toString(), TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: "entity-storage", TWIN_SCHEMA_MIGRATION_ENABLED: "false", TWIN_EXTENSIONS: "./tests/.tmp/index/cache-test.js", TWIN_EXTENSIONS_CACHE_DIRECTORY: customCacheDir diff --git a/packages/node-core/tests/migration.spec.ts b/packages/node-core/tests/migration.spec.ts index ce6661f8..a7b51f79 100644 --- a/packages/node-core/tests/migration.spec.ts +++ b/packages/node-core/tests/migration.spec.ts @@ -8,7 +8,9 @@ import { initSchema as initSchemaAuditableItemGraph } from "@3sixty/auditable-it import { ContextIdStore } from "@3sixty/context"; import { BaseError, Factory } from "@3sixty/core"; import { MemoryStateStorage } from "@3sixty/engine-core"; +import { AuthenticationAdminComponentType } from "@3sixty/engine-server-types"; import { + AuthorizationConnectorType, BackgroundTaskComponentType, EntityStorageComponentType, EntityStorageConnectorType, @@ -117,6 +119,7 @@ const TEST_TENANT_ID_B = "b2222222222222222222222222222222"; const BASE_ENV: { [id: string]: string } = { TWIN_SILENT: "true", TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_ENV_ALLOW_LIST: CI_ENV_VARS }; @@ -1408,3 +1411,479 @@ describe("migration - index rebuilds", () => { }); }); }); + +describe("migration - scope to roles", () => { + beforeAll(async () => { + const storage = await ContextIdStore.getStorage(); + const realGetStore = storage.getStore.bind(storage); + vi.spyOn(storage, "getStore").mockImplementation(() => { + const ctx = realGetStore(); + return !ctx || Object.keys(ctx).length === 0 ? { node: TEST_NODE_ID } : ctx; + }); + }); + + afterAll(() => { + vi.restoreAllMocks(); + }); + + beforeEach(() => { + Factory.clearFactories(); + }); + + test("Migrates V0 user scope to authorization role assignments on node start", async () => { + await ContextIdStore.run({ node: TEST_NODE_ID }, async () => { + const PORT_1 = await getFreePort(); + const PORT_2 = await getFreePort(); + + const AUTH_ENV: { [id: string]: string } = { + ...BASE_ENV, + TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage + }; + + // Run 1: initialise schema-version records. After startup, back-date + // AuthenticationUser to v0 and seed V0 users that carry a scope field. + const run1 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_ENV, TWIN_PORT: String(PORT_1) }, + extendConfig: async (unusedEnvVars, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + // Back-date the AuthenticationUser schema-version record to v0 so run 2 + // detects it as needing migration. + const svConnector = + EntityStorageConnectorFactory.get< + MemoryEntityStorageConnector<{ schemaName: string; version: number }> + >("schema-version"); + const svRecords = await svConnector.getStore(); + const svRecord = svRecords.find(r => r.schemaName === "AuthenticationUser"); + if (svRecord) { + await svConnector.set({ ...svRecord, version: 0 }); + } + + // Seed two V0 users with comma-separated scope fields. The V0 schema is used + // so schema validation does not strip the scope property. + // partitionContextIds must match the engine-created connector (["node"] in single-tenant). + const seedConnector = new MemoryEntityStorageConnector<{ + email: string; + password: string; + salt: string; + identity: string; + organization: string; + scope: string; + }>({ + entitySchema: "AuthenticationUserV0", + partitionContextIds: ["node"], + config: { storageKey: "authentication-user" } + }); + await seedConnector.setBatch([ + { + email: "user1@test.com", + password: "hashed1", + salt: "salt1", + identity: "did:twin:user1", + organization: TEST_NODE_ORG_ID, + scope: "global-admin,user-admin" + }, + { + email: "user2@test.com", + password: "hashed2", + salt: "salt2", + identity: "did:twin:user2", + organization: TEST_NODE_ORG_ID, + scope: "tenant-admin" + }, + { + email: "user3@test.com", + password: "hashed3", + salt: "salt3", + identity: "did:twin:user3", + organization: TEST_NODE_ORG_ID, + scope: "" + } + ]); + + await run1?.shutdown(); + + // Run 2: restart. SchemaVersionService detects AuthenticationUser v0 → v1. + // The removeEntityProperty handler splits scope into roles and writes them to + let run2; + try { + run2 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_ENV, TWIN_PORT: String(PORT_2) }, + extendConfig: async (unusedEnvVars2, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + // AuthenticationUser schema version must have advanced to 1. + const versionConnector = EntityStorageConnectorFactory.get("schema-version"); + const { entities: versionRecords } = await versionConnector.query(); + const migrationRecord = (versionRecords ?? []).find( + r => (r as { schemaName: string }).schemaName === "AuthenticationUser" + ) as { version: number } | undefined; + expect(migrationRecord?.version).toBe(1); + + // Migrated users must not carry the scope field. + const userConnector = EntityStorageConnectorFactory.get("authentication-user"); + const { entities: users } = await userConnector.query(); + expect(users).toHaveLength(3); + for (const user of users ?? []) { + expect((user as { scope?: unknown }).scope).toBeUndefined(); + } + + // Authorization role assignments must have been created for every scope entry. + // user1: "global-admin,user-admin" → 2 assignments + // user2: "tenant-admin" → 1 assignment + // user3: "" (empty scope) → falls back to "user" → 1 assignment + const roleConnector = EntityStorageConnectorFactory.get("authorization-role-assignment"); + const { entities: assignments } = await roleConnector.query(); + const rows = (assignments ?? []) as { + id: string; + modelId: string; + subject: string; + role: string; + }[]; + + const findAssignment = ( + identity: string, + role: string + ): { id: string; modelId: string; subject: string; role: string } | undefined => + rows.find(r => r.subject === identity && r.role === role); + + expect(rows).toHaveLength(4); + expect(findAssignment("did:twin:user1", "global-admin")).toBeDefined(); + expect(findAssignment("did:twin:user1", "user-admin")).toBeDefined(); + expect(findAssignment("did:twin:user2", "tenant-admin")).toBeDefined(); + expect(findAssignment("did:twin:user3", "user")).toBeDefined(); + + // All assignments must use the default migration model ID. + expect(rows.every(r => r.modelId === "system")).toBe(true); + } finally { + await run2?.shutdown(); + } + }); + }); + + test("Adds devops, identity-admin and identity-profile-admin when user has both tenant-admin and user-admin", async () => { + await ContextIdStore.run({ node: TEST_NODE_ID }, async () => { + const PORT_1 = await getFreePort(); + const PORT_2 = await getFreePort(); + + const AUTH_ENV: { [id: string]: string } = { + ...BASE_ENV, + TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage + }; + + const run1 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_ENV, TWIN_PORT: String(PORT_1) }, + extendConfig: async (unusedEnvVars, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + // Clear stores from the previous test so migration only processes the user + // seeded in this test and the assertion on role-assignment count is exact. + const prevAuthConnector = EntityStorageConnectorFactory.get("authentication-user"); + const { entities: prevUsers } = await prevAuthConnector.query(); + for (const user of prevUsers ?? []) { + await prevAuthConnector.remove((user as { email: string }).email); + } + const prevRoleConnector = EntityStorageConnectorFactory.get("authorization-role-assignment"); + const { entities: prevRoles } = await prevRoleConnector.query(); + for (const role of prevRoles ?? []) { + await prevRoleConnector.remove((role as { id: string }).id); + } + + const svConnector = + EntityStorageConnectorFactory.get< + MemoryEntityStorageConnector<{ schemaName: string; version: number }> + >("schema-version"); + const svRecords = await svConnector.getStore(); + const svRecord = svRecords.find(r => r.schemaName === "AuthenticationUser"); + if (svRecord) { + await svConnector.set({ ...svRecord, version: 0 }); + } + + // Seed one user with both tenant-admin and user-admin to trigger the promotion branch. + const seedConnector = new MemoryEntityStorageConnector<{ + email: string; + password: string; + salt: string; + identity: string; + organization: string; + scope: string; + }>({ + entitySchema: "AuthenticationUserV0", + partitionContextIds: ["node"], + config: { storageKey: "authentication-user" } + }); + await seedConnector.setBatch([ + { + email: "combo@test.com", + password: "hashed", + salt: "salt", + identity: "did:twin:combo", + organization: TEST_NODE_ORG_ID, + scope: "tenant-admin,user-admin" + } + ]); + + await run1?.shutdown(); + + let run2; + try { + run2 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_ENV, TWIN_PORT: String(PORT_2) }, + extendConfig: async (unusedEnvVars2, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + const roleConnector = EntityStorageConnectorFactory.get("authorization-role-assignment"); + const { entities: assignments } = await roleConnector.query(); + const rows = (assignments ?? []) as { + id: string; + modelId: string; + subject: string; + role: string; + }[]; + + // tenant-admin + user-admin → 2 original + 3 promoted = 5 total + expect(rows).toHaveLength(5); + for (const role of [ + "tenant-admin", + "user-admin", + "devops", + "identity-admin", + "identity-profile-admin" + ]) { + expect( + rows.some(r => r.subject === "did:twin:combo" && r.role === role), + `expected role "${role}"` + ).toBe(true); + } + expect(rows.every(r => r.modelId === "system")).toBe(true); + } finally { + await run2?.shutdown(); + } + }); + }); +}); + +describe("migration - scope to roles multi-tenant", () => { + beforeAll(async () => { + const storage = await ContextIdStore.getStorage(); + const realGetStore = storage.getStore.bind(storage); + vi.spyOn(storage, "getStore").mockImplementation(() => { + const ctx = realGetStore(); + return !ctx || Object.keys(ctx).length === 0 + ? { node: TEST_NODE_ID, tenant: TEST_TENANT_ID_A } + : ctx; + }); + }); + + afterAll(() => { + vi.restoreAllMocks(); + }); + + beforeEach(() => { + Factory.clearFactories(); + }); + + test("Migrates V0 user scope to role assignments isolated by tenant partition", async () => { + const PORT_1 = await getFreePort(); + const PORT_2 = await getFreePort(); + + const AUTH_MT_ENV: { [id: string]: string } = { + ...MULTI_TENANT_BASE_ENV, + TWIN_AUTH_ADMIN_PROCESSOR_TYPE: AuthenticationAdminComponentType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage + }; + + // Run 1: initialise schema-version records then back-date AuthenticationUser to v0. + const run1 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_MT_ENV, TWIN_PORT: String(PORT_1) }, + extendConfig: async (unusedEnvVars, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + const svConnector = + EntityStorageConnectorFactory.get< + MemoryEntityStorageConnector<{ schemaName: string; version: number }> + >("schema-version"); + const svRecords = await svConnector.getStore(); + const svRecord = svRecords.find(r => r.schemaName === "AuthenticationUser"); + if (svRecord) { + await svConnector.set({ ...svRecord, version: 0 }); + } + + // Seed one user per tenant using its own partition context so the migration + // handler captures the correct contextIds for each and replays them into the + // right authorization partition. + await ContextIdStore.run({ node: TEST_NODE_ID, tenant: TEST_TENANT_ID_A }, async () => { + const seedA = new MemoryEntityStorageConnector<{ + email: string; + password: string; + salt: string; + identity: string; + organization: string; + scope: string; + }>({ + entitySchema: "AuthenticationUserV0", + partitionContextIds: ["node", "tenant"], + config: { storageKey: "authentication-user" } + }); + await seedA.setBatch([ + { + email: "userA@test.com", + password: "hashedA", + salt: "saltA", + identity: "did:twin:userA", + organization: TEST_NODE_ORG_ID, + scope: "global-admin" + } + ]); + }); + + await ContextIdStore.run({ node: TEST_NODE_ID, tenant: TEST_TENANT_ID_B }, async () => { + const seedB = new MemoryEntityStorageConnector<{ + email: string; + password: string; + salt: string; + identity: string; + organization: string; + scope: string; + }>({ + entitySchema: "AuthenticationUserV0", + partitionContextIds: ["node", "tenant"], + config: { storageKey: "authentication-user" } + }); + await seedB.setBatch([ + { + email: "userB@test.com", + password: "hashedB", + salt: "saltB", + identity: "did:twin:userB", + organization: TEST_NODE_ORG_ID, + scope: "tenant-admin" + } + ]); + }); + + await run1?.shutdown(); + + // Run 2: restart. Migration runs once per tenant partition. The contextIds captured + // during each partition's removeEntityProperty call include the tenant ID, so + // AuthorizationService.start() writes each role assignment into the correct partition. + let run2; + try { + run2 = await run({ + localesDirectory: LOCALES_DIR, + stateStorage: new MemoryStateStorage(false, { + nodeId: TEST_NODE_ID, + nodeOrganizationId: TEST_NODE_ORG_ID + }), + disableProcessExitOnFailure: true, + envVars: { ...AUTH_MT_ENV, TWIN_PORT: String(PORT_2) }, + extendConfig: async (unusedEnvVars2, config) => { + config.types.schemaVersionMigrationComponent = [ + { type: SchemaVersionMigrationComponentType.Service } + ]; + config.types.backgroundTaskComponent = [{ type: BackgroundTaskComponentType.Service }]; + } + }); + + // Schema version must have advanced to 1. + const versionConnector = EntityStorageConnectorFactory.get("schema-version"); + const { entities: versionRecords } = await versionConnector.query(); + const migrationRecord = (versionRecords ?? []).find( + r => (r as { schemaName: string }).schemaName === "AuthenticationUser" + ) as { version: number } | undefined; + expect(migrationRecord?.version).toBe(1); + + // Tenant A: user must have global-admin role, isolated to tenant A's partition. + const roleConnector = EntityStorageConnectorFactory.get("authorization-role-assignment"); + const { entities: assignmentsA } = await ContextIdStore.run( + { node: TEST_NODE_ID, tenant: TEST_TENANT_ID_A }, + async () => roleConnector.query() + ); + const rowsA = (assignmentsA ?? []) as { + id: string; + modelId: string; + subject: string; + role: string; + }[]; + expect(rowsA).toHaveLength(1); + expect(rowsA[0].subject).toBe("did:twin:userA"); + expect(rowsA[0].role).toBe("global-admin"); + expect(rowsA[0].modelId).toBe("system"); + + // Tenant B: user must have tenant-admin role, isolated to tenant B's partition. + const { entities: assignmentsB } = await ContextIdStore.run( + { node: TEST_NODE_ID, tenant: TEST_TENANT_ID_B }, + async () => roleConnector.query() + ); + const rowsB = (assignmentsB ?? []) as { + id: string; + modelId: string; + subject: string; + role: string; + }[]; + expect(rowsB).toHaveLength(1); + expect(rowsB[0].subject).toBe("did:twin:userB"); + expect(rowsB[0].role).toBe("tenant-admin"); + expect(rowsB[0].modelId).toBe("system"); + } finally { + await run2?.shutdown(); + } + }); +}); diff --git a/packages/node-core/tests/migrationRoles.spec.ts b/packages/node-core/tests/migrationRoles.spec.ts new file mode 100644 index 00000000..6f3f9540 --- /dev/null +++ b/packages/node-core/tests/migrationRoles.spec.ts @@ -0,0 +1,298 @@ +// Copyright 2026 IOTA Stiftung. +// SPDX-License-Identifier: Apache-2.0. +import type { IAuthorizationComponent } from "@3sixty/authorization-models"; +import { ContextIdStore } from "@3sixty/context"; +import { ComponentFactory, GeneralError } from "@3sixty/core"; +import type { IEngineCore } from "@3sixty/engine-models"; +import type { IEntitySchemaProperty } from "@3sixty/entity"; +import type { ISchemaMigration } from "@3sixty/entity-storage-models"; +import { SchemaMigrationFactory } from "@3sixty/entity-storage-models"; +import { AUTHORIZATION_MODEL_ID } from "../src/defaults.js"; +import { finalizeMigrations, initialiseMigrations } from "../src/migration.js"; + +const MIGRATION_KEY = "AuthenticationUser_0_1"; +const AUTH_COMPONENT_TYPE = "test-authorization-component"; + +type RemoveEntityPropertyFn = NonNullable; + +const SCOPE_PROP = [{ property: "scope" } as unknown as IEntitySchemaProperty]; + +describe("initialiseMigrations", () => { + let callRemoveEntityProperty: RemoveEntityPropertyFn; + let mockEngineCore: IEngineCore; + let mockAddRoleForSubject: ReturnType; + let getRegisteredInstanceTypeOptional: ReturnType; + + beforeAll(() => { + getRegisteredInstanceTypeOptional = vi.fn().mockReturnValue(AUTH_COMPONENT_TYPE); + mockEngineCore = { + getRegisteredInstanceTypeOptional, + getRegisteredInstanceType: vi.fn().mockReturnValue(AUTH_COMPONENT_TYPE) + } as unknown as IEngineCore; + + mockAddRoleForSubject = vi.fn().mockResolvedValue(undefined); + ComponentFactory.register( + AUTH_COMPONENT_TYPE, + () => + ({ + addRoleForSubject: mockAddRoleForSubject + }) as unknown as IAuthorizationComponent + ); + + initialiseMigrations(mockEngineCore, {}); + const migration = SchemaMigrationFactory.get(MIGRATION_KEY); + const { removeEntityProperty } = migration; + if (!removeEntityProperty) { + throw new Error("removeEntityProperty not registered on migration"); + } + callRemoveEntityProperty = removeEntityProperty; + }); + + afterAll(() => { + try { + SchemaMigrationFactory.unregister(MIGRATION_KEY); + } catch { + // Ignore if already removed. + } + try { + ComponentFactory.unregister(AUTH_COMPONENT_TYPE); + } catch { + // Ignore if already removed. + } + }); + + afterEach(async () => { + // Drain any queued roles accumulated during the test to prevent cross-test pollution. + await finalizeMigrations(mockEngineCore, {}); + mockAddRoleForSubject.mockClear(); + }); + + test("registers the AuthenticationUser_0_1 migration with SchemaMigrationFactory", () => { + expect(typeof callRemoveEntityProperty).toBe("function"); + }); + + test("removeEntityProperty is a no-op when scope is not in removedProperties", async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "admin" }, []); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).not.toHaveBeenCalled(); + }); + + test("removeEntityProperty is a no-op when removedProperties contains other fields but not scope", async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "admin" }, [ + { property: "password" } as unknown as IEntitySchemaProperty + ]); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).not.toHaveBeenCalled(); + }); + + test("initialiseMigrations is a no-op when schema migration is disabled", () => { + SchemaMigrationFactory.clear(); + initialiseMigrations(mockEngineCore, { schemaMigrationEnabled: "false" }); + expect(SchemaMigrationFactory.names()).toHaveLength(0); + }); + + test("removeEntityProperty splits comma-separated scope into individual roles", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty( + { identity: "did:twin:user1", scope: "global-admin,user-admin" }, + SCOPE_PROP + ); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(2); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "global-admin" + ); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "user-admin" + ); + }); + + test("removeEntityProperty trims whitespace and lowercases roles", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty( + { identity: "did:twin:user1", scope: " ADMIN , User " }, + SCOPE_PROP + ); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(2); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "admin" + ); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "user" + ); + }); + + test("removeEntityProperty falls back to user role when scope is an empty string", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "" }, SCOPE_PROP); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(1); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "user" + ); + }); + + test("removeEntityProperty falls back to user role when scope contains only whitespace", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: " , " }, SCOPE_PROP); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(1); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "user" + ); + }); +}); + +describe("finalizeMigrations", () => { + let callRemoveEntityProperty: RemoveEntityPropertyFn; + let mockEngineCore: IEngineCore; + let mockAddRoleForSubject: ReturnType; + + beforeAll(() => { + mockAddRoleForSubject = vi.fn().mockResolvedValue(undefined); + ComponentFactory.register( + `${AUTH_COMPONENT_TYPE}-finalize`, + () => + ({ + addRoleForSubject: mockAddRoleForSubject + }) as unknown as IAuthorizationComponent + ); + + const getRegisteredInstanceTypeOptional = vi + .fn() + .mockReturnValue(`${AUTH_COMPONENT_TYPE}-finalize`); + mockEngineCore = { + getRegisteredInstanceTypeOptional, + getRegisteredInstanceType: vi.fn().mockReturnValue(`${AUTH_COMPONENT_TYPE}-finalize`) + } as unknown as IEngineCore; + + initialiseMigrations(mockEngineCore, {}); + const migration = SchemaMigrationFactory.get(MIGRATION_KEY); + const { removeEntityProperty } = migration; + if (!removeEntityProperty) { + throw new Error("removeEntityProperty not registered on migration"); + } + callRemoveEntityProperty = removeEntityProperty; + }); + + afterAll(() => { + try { + SchemaMigrationFactory.unregister(MIGRATION_KEY); + } catch { + // Ignore if already removed. + } + try { + ComponentFactory.unregister(`${AUTH_COMPONENT_TYPE}-finalize`); + } catch { + // Ignore if already removed. + } + }); + + afterEach(async () => { + // Drain any leftover queued roles. + await finalizeMigrations(mockEngineCore, {}); + mockAddRoleForSubject.mockClear(); + }); + + test("throws when roles are queued but no authorization component is registered", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "admin" }, SCOPE_PROP); + }); + const engineCoreNoAuth: IEngineCore = { + getRegisteredInstanceTypeOptional: vi.fn().mockReturnValue(undefined), + getRegisteredInstanceType: vi.fn().mockImplementation(() => { + throw new GeneralError("node", "componentNotFound"); + }) + } as unknown as IEngineCore; + await expect(finalizeMigrations(engineCoreNoAuth, {})).rejects.toBeInstanceOf(GeneralError); + }); + + test("is a no-op when no roles have been queued", async () => { + // migrateRoles is empty - drained by afterEach from the previous test. + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).not.toHaveBeenCalled(); + }); + + test("calls addRoleForSubject for every queued role", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty( + { identity: "did:twin:user1", scope: "admin,user" }, + SCOPE_PROP + ); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(2); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "admin" + ); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "user" + ); + }); + + test("processes roles for multiple identities", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty( + { identity: "did:twin:user1", scope: "global-admin" }, + SCOPE_PROP + ); + await callRemoveEntityProperty( + { identity: "did:twin:user2", scope: "tenant-admin" }, + SCOPE_PROP + ); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(2); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user1", + "global-admin" + ); + expect(mockAddRoleForSubject).toHaveBeenCalledWith( + AUTHORIZATION_MODEL_ID, + "did:twin:user2", + "tenant-admin" + ); + }); + + test("uses the authorizationModelId env var when provided", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "admin" }, SCOPE_PROP); + }); + await finalizeMigrations(mockEngineCore, { authorizationModelId: "custom-model" }); + expect(mockAddRoleForSubject).toHaveBeenCalledWith("custom-model", "did:twin:user1", "admin"); + }); + + test("drains the queue so a second call is a no-op", async () => { + await ContextIdStore.run({ node: "test-node" }, async () => { + await callRemoveEntityProperty({ identity: "did:twin:user1", scope: "admin" }, SCOPE_PROP); + }); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).toHaveBeenCalledTimes(1); + + mockAddRoleForSubject.mockClear(); + await finalizeMigrations(mockEngineCore, {}); + expect(mockAddRoleForSubject).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/node-core/tests/n2n.spec.ts b/packages/node-core/tests/n2n.spec.ts index 37a70cd4..9b413f16 100644 --- a/packages/node-core/tests/n2n.spec.ts +++ b/packages/node-core/tests/n2n.spec.ts @@ -5,6 +5,7 @@ import path from "node:path"; import { ComponentFactory, Factory } from "@3sixty/core"; import { MemoryStateStorage } from "@3sixty/engine-core"; import { + AuthorizationConnectorType, EntityStorageConnectorType, IdentityConnectorType, IdentityResolverConnectorType, @@ -61,6 +62,7 @@ const BASE_ENV: { [id: string]: string } = { TWIN_VAULT_CONNECTOR: VaultConnectorType.EntityStorage, TWIN_IDENTITY_CONNECTOR: IdentityConnectorType.EntityStorage, TWIN_IDENTITY_RESOLVER_CONNECTOR: IdentityResolverConnectorType.EntityStorage, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_ENV_ALLOW_LIST: CI_ENV_VARS }; diff --git a/packages/node-core/tests/startup.spec.ts b/packages/node-core/tests/startup.spec.ts index ce156376..de4f0858 100644 --- a/packages/node-core/tests/startup.spec.ts +++ b/packages/node-core/tests/startup.spec.ts @@ -5,7 +5,7 @@ import { ContextIdStore } from "@3sixty/context"; import { ComponentFactory, Factory } from "@3sixty/core"; import { SchemaAliasHelper } from "@3sixty/data-core"; import { MemoryStateStorage } from "@3sixty/engine-core"; -import { EntityStorageConnectorType } from "@3sixty/engine-types"; +import { AuthorizationConnectorType, EntityStorageConnectorType } from "@3sixty/engine-types"; import { entity, EntitySchemaFactory, EntitySchemaHelper, property } from "@3sixty/entity"; import { MemoryEntityStorageConnector } from "@3sixty/entity-storage-connector-memory"; import { CI_ENV_VARS, getFreePort } from "./setupTestEnv.js"; @@ -45,6 +45,7 @@ const TEST_API_KEY_B = "d0000000000000000000000000000002"; const BASE_ENV: { [id: string]: string } = { TWIN_SILENT: "true", TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_TENANT_ENABLED: "true", TWIN_ENV_ALLOW_LIST: CI_ENV_VARS }; diff --git a/packages/node-core/tests/systemMetrics.spec.ts b/packages/node-core/tests/systemMetrics.spec.ts index 72091ea4..a38ad845 100644 --- a/packages/node-core/tests/systemMetrics.spec.ts +++ b/packages/node-core/tests/systemMetrics.spec.ts @@ -3,7 +3,7 @@ import { ContextIdKeys, ContextIdStore } from "@3sixty/context"; import { ComponentFactory, Factory } from "@3sixty/core"; import { MemoryStateStorage } from "@3sixty/engine-core"; -import { EntityStorageConnectorType } from "@3sixty/engine-types"; +import { AuthorizationConnectorType, EntityStorageConnectorType } from "@3sixty/engine-types"; import type { ITelemetryComponent } from "@3sixty/telemetry-models"; import { CI_ENV_VARS, getFreePort } from "./setupTestEnv.js"; import { run } from "../src/node.js"; @@ -43,6 +43,7 @@ describe("System metrics E2E", () => { envVars: { TWIN_SILENT: "true", TWIN_PORT: BASE_PORT.toString(), + TWIN_AUTHORIZATION_CONNECTOR: AuthorizationConnectorType.EntityStorage, TWIN_ENTITY_STORAGE_CONNECTOR_TYPE: EntityStorageConnectorType.Memory, TWIN_TELEMETRY_CONNECTOR: "entity-storage", // Large interval so only the startup tick fires during the test diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ad8f2ad..9e678f84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -245,9 +245,6 @@ importers: specifier: 0.20.0-next.1 version: link:../../packages/node-core devDependencies: - '@3sixty/entity-storage-connector-memory': - specifier: next - version: 0.20.0-next.0 '@3sixty/merge-locales': specifier: next version: 0.20.0-next.2 @@ -272,21 +269,12 @@ importers: concurrently: specifier: 10.0.6 version: 10.0.6 - copyfiles: - specifier: 2.4.1 - version: 2.4.1 nodemon: specifier: 3.1.14 version: 3.1.14 rimraf: specifier: 6.1.3 version: 6.1.3 - typedoc: - specifier: 0.28.20 - version: 0.28.20(typescript@6.0.3) - typedoc-plugin-markdown: - specifier: 4.14.1 - version: 4.14.1(typedoc@0.28.20(typescript@6.0.3)) typescript: specifier: 6.0.3 version: 6.0.3 @@ -298,19 +286,22 @@ importers: dependencies: '@3sixty/api-auth-entity-storage-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/api-auth-entity-storage-service': specifier: next - version: 0.20.0-next.0(supports-color@10.2.2) + version: 0.20.0-next.1 '@3sixty/api-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/api-tenant-processor': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/auditable-item-graph-service': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 + '@3sixty/authorization-models': + specifier: next + version: 0.20.0-next.1 '@3sixty/cli-core': specifier: next version: 0.20.0-next.2 @@ -325,52 +316,52 @@ importers: version: 0.20.0-next.2 '@3sixty/data-core': specifier: next - version: 0.20.0-next.2 + version: 0.20.0-next.3 '@3sixty/data-json-ld': specifier: next - version: 0.20.0-next.2 + version: 0.20.0-next.3 '@3sixty/dlt-account': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/dlt-iota': specifier: next - version: 0.20.0-next.0(typescript@6.0.3) + version: 0.20.0-next.1(typescript@6.0.3) '@3sixty/engine': specifier: next - version: 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + version: 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/engine-core': specifier: next - version: 0.20.0-next.1 + version: 0.20.0-next.2 '@3sixty/engine-models': specifier: next - version: 0.20.0-next.1 + version: 0.20.0-next.2 '@3sixty/engine-server': specifier: next - version: 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + version: 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/engine-server-types': specifier: next - version: 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + version: 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/engine-types': specifier: next - version: 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + version: 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/entity': specifier: next version: 0.20.0-next.2 '@3sixty/entity-storage-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/identity-connector-entity-storage': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/identity-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/logging-connector-opentelemetry': specifier: next - version: 0.20.0-next.0(@opentelemetry/api@1.9.1) + version: 0.20.0-next.1(@opentelemetry/api@1.9.1) '@3sixty/logging-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/modules': specifier: next version: 0.20.0-next.2 @@ -378,35 +369,32 @@ importers: specifier: next version: 0.20.0-next.2 '@3sixty/rights-management-pap-service': - specifier: next - version: 0.20.0-next.0 - '@3sixty/standards-w3c-did': specifier: next version: 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': + '@3sixty/standards-w3c-did': specifier: next - version: 0.20.0-next.1 + version: 0.20.0-next.2 '@3sixty/telemetry-connector-opentelemetry': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/tracing-connector-opentelemetry': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/tracing-facades': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/tracing-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/vault-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/wallet-connector-entity-storage': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/wallet-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/web': specifier: next version: 0.20.0-next.2 @@ -419,16 +407,16 @@ importers: devDependencies: '@3sixty/automation-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/dataspace-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/entity-storage-connector-memory': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/federated-catalogue-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/merge-locales': specifier: next version: 0.20.0-next.2 @@ -440,16 +428,13 @@ importers: version: 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(@vitest/coverage-v8@5.0.5)(vite@8.3.4(@types/node@26.6.5)(jiti@2.7.0)) '@3sixty/rights-management-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/telemetry-models': specifier: next - version: 0.20.0-next.0 + version: 0.20.0-next.1 '@3sixty/trust-models': specifier: next - version: 0.20.0-next.0 - '@3sixty/ts-to-openapi': - specifier: next - version: 0.20.0-next.4 + version: 0.20.0-next.1 '@3sixty/validate-locales': specifier: next version: 0.20.0-next.2 @@ -462,9 +447,6 @@ importers: concurrently: specifier: 10.0.6 version: 10.0.6 - copyfiles: - specifier: 2.4.1 - version: 2.4.1 nodemon: specifier: 3.1.14 version: 3.1.14 @@ -500,148 +482,188 @@ packages: graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 typescript: ^5.0.0 || ^6.0.0 - '@3sixty/api-auth-entity-storage-models@0.20.0-next.0': - resolution: {integrity: sha512-eJENhp2tXu35W4TxLYCZy06mT2T07FPQUeACi9v842YQdI/Gzt3cA60kcRW+EBKSLXYnuTkD1G8sexT/BJHryw==} + '@3sixty/api-auth-entity-storage-models@0.20.0-next.1': + resolution: {integrity: sha512-dM0GiVdtk98PpxnqqNjySpma9qEvtjsbYw1OZm14GLznUs9I/rgf6UI2RAYotACjMXMRKcljewIiIC0RRFZa3Q==} + engines: {node: '>=24.0.0'} + + '@3sixty/api-auth-entity-storage-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-yA295aQfFj68Bd/edQm1LfjqE0AaiSIfPw+lMh85d4G1r/YzxpkTGSFqzUwkCP7xFdYA+bZhFUAWW9pYrpqz6Q==} + engines: {node: '>=24.0.0'} + + '@3sixty/api-auth-entity-storage-service@0.20.0-next.1': + resolution: {integrity: sha512-yRcyDHhcaanu4q2DjwsSSZ4C/cUMwbZ48a5AxCmyqdc2PB7RA+2AU6ak3ciPGCz1NlJUZbyzhzJfyDZwzI9UHA==} + engines: {node: '>=24.0.0'} + + '@3sixty/api-auth-models@0.20.0-next.1': + resolution: {integrity: sha512-KbzkoxveWHguZufLUPD6DnosHxqVQQvR4nPCzKZ8bey4oWPeJmviDvso3KXjYRk0pb2BtP8N1eTl9XgTuibB2Q==} engines: {node: '>=24.0.0'} - '@3sixty/api-auth-entity-storage-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-QdeKN37n/A/4zMfFKlxer3v47C/07cK7k9AvmLzDYJRekIUVNDDlHBtFPVqKJyu4jQwfmn7akwa0Gr3M0YBP8A==} + '@3sixty/api-auth-service@0.20.0-next.1': + resolution: {integrity: sha512-N24mw0iX47OnP9oE+YWefP6u/6qQy+/MNYdBkColqI1mvGACjpI0xT2/bpso5ZC//+9mXlpKHwEzj72MUvyRCg==} engines: {node: '>=24.0.0'} - '@3sixty/api-auth-entity-storage-service@0.20.0-next.0': - resolution: {integrity: sha512-t8R1uHbF2WpphJE7dJje8YHSE1LcaNCNDVdXa7avUY2MdO5n8MFB2Z51LZ819c3miJ1j//TsP4ERCrjTt4C5Gw==} + '@3sixty/api-core-server@0.20.0-next.1': + resolution: {integrity: sha512-WfiTBDTLcuKo81MRzRxHDpo3v9euRvltJVA7lXT80mDpIbu1BBl55whSRsma/dcQ9JjqU3Jr5Q4b9uaRwCoWNQ==} engines: {node: '>=24.0.0'} - '@3sixty/api-core@0.20.0-next.0': - resolution: {integrity: sha512-tPyKJpr7Odcaa99U1dfCvy0UUiV7sZH7rBsFBJ5obXdlSXd0/aC6Sh2iFJpMShkr0NLTB7v4PhKE75BDvz/Qyw==} + '@3sixty/api-core@0.20.0-next.1': + resolution: {integrity: sha512-gd6IJEufB6C7Sjv3G+BRPKP7UiZ1NTSUdJqD2nD5JSU9mJ41PwhkZ1PArV5PODUXUI8A/f93g463WxTlYf8Vgw==} engines: {node: '>=24.0.0'} - '@3sixty/api-models@0.20.0-next.0': - resolution: {integrity: sha512-AShxxmk3JR5dvLyC3zXYsBb4FZbtoNYsRlB2TUynLk4epOSZcZN+p8Ya+cMM+vsbLT8joA/Jk8TC9fPSEKSk3g==} + '@3sixty/api-models@0.20.0-next.1': + resolution: {integrity: sha512-1KmZs1JOKJKqo1UEpIgWblBcnefBQ/L027HPcck7gqYp/pDJT93/OOPPv0VwHccDY4C/UN0ZhC1oD4TPv+2k3Q==} engines: {node: '>=24.0.0'} - '@3sixty/api-processors@0.20.0-next.0': - resolution: {integrity: sha512-3LWV6EcdXXYoo5zNeLgOJbGanC/ezHr4vlM4CUC9CXeeYw2V4EL22IoVjehWqvTBuCCNdngcr9gOjM7xdhVZNg==} + '@3sixty/api-processors@0.20.0-next.1': + resolution: {integrity: sha512-4AHoJH0ptvEMloN12KkZKyeHePnHUaNE0V/+IyT90WO+JzY1mJFD8U4nN8oq9uVlLSrY9BJK+xIXLOYIp1dd4w==} engines: {node: '>=24.0.0'} - '@3sixty/api-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-3ka4h3Lq+SjZmH9Ud43m1DvAEBjcCgjDlUy6XHt1lTfDjYMVKdw4N2xDSRVGO9QqpOxXv91+489pQd097Tvihg==} + '@3sixty/api-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-kqwK5t6hUsn3zpOCkmxFLM4ydfszXgGfNw0kCp17shkvywwED5VGltSUcBWtzoEPkVEqJ7azji9YZ6n1zYw7Ow==} engines: {node: '>=24.0.0'} - '@3sixty/api-server-fastify@0.20.0-next.0': - resolution: {integrity: sha512-5D4A+tWpaK6vehufvUZu8FWExvPU8s6Lx2F7o6fHmX1YuW/ZfBGL+sxc/gR1/PlS6T8e8/iEIhNWjojPsrVUyw==} + '@3sixty/api-server-fastify@0.20.0-next.1': + resolution: {integrity: sha512-y1D5Mr8odZHvikxRjst0upGuXMb+dow5dB6FfUgwJ2hiBzEGOedIkz4lsc+mr1p/bWGyIH8WHWMNlT8l28v7hA==} engines: {node: '>=24.0.0'} - '@3sixty/api-service@0.20.0-next.0': - resolution: {integrity: sha512-9ifuIEDau6NsxD0BSPUVmyFayJNtx8icePZ3DDT2QZopqwWj0qkHxyMYtfnFWAP/g6WaKgNTn3KcvHpJTyXPTA==} + '@3sixty/api-server-hono@0.20.0-next.1': + resolution: {integrity: sha512-IrpAdHZjx3pDNxUVu7k/SoxGc06DKICwF4Ko+Ouy4NTz14Wgyl8gmm0zMuTg1Kk5wQ7O2giDz3lxfjz4asq08w==} engines: {node: '>=24.0.0'} - '@3sixty/api-tenant-processor@0.20.0-next.0': - resolution: {integrity: sha512-WG2QQwQg4SwlRmgmxAzGKhAYliw6BgsHRdb8AQ3oNdiQg7vC4UJayRzQT3T2NwXkNgsc6pu8LlhQAeWr/rjyVg==} + '@3sixty/api-server-native@0.20.0-next.1': + resolution: {integrity: sha512-qo5g+eyXMSULCdkvPDC/tamE+Sb7LtoOCLFF/y3b1JsxgywJ/VTd0OHRJghU0K3WP/IEAAWQ/PpXJUPcQhD11w==} engines: {node: '>=24.0.0'} - '@3sixty/attestation-connector-nft@0.20.0-next.0': - resolution: {integrity: sha512-fR2uOECGAOpHStw4Z5+5VNQ5NUSdk4zNDtDP5u7aUlcInmWk4sM+IZ1P9soQC1UGCg2PF7+O75OM3Cyw3fvVwQ==} + '@3sixty/api-service@0.20.0-next.1': + resolution: {integrity: sha512-trp2PbbfaPRkiE8/nLtS+tWGiu7lxzsCc19YSz3PARAzpwGLMy1gDFtGVz5O4qJbpY0kNv1+ujPUD+dkuXWuiQ==} engines: {node: '>=24.0.0'} - '@3sixty/attestation-models@0.20.0-next.0': - resolution: {integrity: sha512-30A7QHitq9VVvhHwnHYwwG3ozoGVleOFvua/i2GGssP6fJZK8Dmb1CvH9mrCyiONyVZ1RudzCLG+31cz9UseFg==} + '@3sixty/api-tenant-processor@0.20.0-next.1': + resolution: {integrity: sha512-KKFguJ2wC6o1BOkuIoKbBwMck2D2T/Xil61gi++CFtMdcSS2tMbkvYpGYkngrpSwwnaGwtihAJ+UDO7DbjYSyA==} engines: {node: '>=24.0.0'} - '@3sixty/attestation-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-u2moDen0aXM/tvgEC1Kcow0dZ9rsi4gDHvKFVtpi4xa4zNSJoxYv2msPKaElVrvCM5F80uei6gfTI6mFa3Q7iA==} + '@3sixty/attestation-connector-nft@0.20.0-next.1': + resolution: {integrity: sha512-aPhByDgQ8yJXiNWk2Yr32NzNxIAtseSMpSHTsaA0ufUFcN9FNe/PWODxFpv2IOPNd2hRfDeecltYC2hwAZ/7gw==} engines: {node: '>=24.0.0'} - '@3sixty/attestation-service@0.20.0-next.0': - resolution: {integrity: sha512-1UVHLp7D16CxJYGyPy/OCmnLoEPbiPOqM32updugs5TYt2ax5C2/3ZZ52RUoYLXuzsNUwNyISiNGvN3Tf2eO+g==} + '@3sixty/attestation-models@0.20.0-next.1': + resolution: {integrity: sha512-FHH6RBuzuw9/bf2WXo14/NaXK+4SixNCubGdc261E6CNJEv8twoPvG7LIdO91rUyHUkQxk75qJ+dz8ubyvRysA==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-graph-models@0.20.0-next.0': - resolution: {integrity: sha512-+48s2UgzTUgweaUcb5CWj29lZ23gPPb+CLSu8oq8s/HAecFdEXoSOSavYbwuNn62pt7p2Lrh6nQSzZ8K8TdBlA==} + '@3sixty/attestation-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-Nw1d+LYNvAObZRkZx9JDMPdQXRoeSoBuc71xaohw5cevBqXooEtAY0xiBXSZL7X2IJyhZFGuL7YGShFIBGwxeg==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-graph-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-z1IFlQjBESpChF0MvuOVFE3NtDVqicUM3wCDtIvhVRxdWGTkngamLjYLka2JQ+TMaX6vBZLv9MMvImC/VMZA1Q==} + '@3sixty/attestation-service@0.20.0-next.1': + resolution: {integrity: sha512-HtFQYjjUOpGAwNwO2yCxegQQCDRoWEt+UD4/w5deT2dab/JfkjLfkn0ACVfRU/j5c5eznZcUlQG1G8rxG/oFww==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-graph-service@0.20.0-next.0': - resolution: {integrity: sha512-AcXVhg2dYIZzKy8WQj4kojyFrqwO0mZGryuwDSpZgncalBG/nHWqRDjSleRqde06ONfVDulmqnWkQXsPKAaX8g==} + '@3sixty/auditable-item-graph-models@0.20.0-next.1': + resolution: {integrity: sha512-U2ab/QU+XBAg84NiONIBgMXC+COXYsn/VqHtTS3yFf6uU1hX49jiqWw2lH3gRlr/KGseaQ0l5Bo3/K9/s1xcaQ==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-stream-models@0.20.0-next.0': - resolution: {integrity: sha512-eBUeq0+e3J4zm8635ok8pGHyXzXleaHVoyv+oGYlFGrbJJa2RtLxi4aLAi1RG2x9Vva07Xk2Y9Aj4tq7SHj7kw==} + '@3sixty/auditable-item-graph-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-0q89KbrTZfpzHe0sURwbRH109mTV59HdcNZpplQkK8OAoDb0DMEhxeqFiuAUu2Y7/96uaHbrMwgOMa1YDNcHDw==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-stream-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-XlTUkHUuoM+yqY7kFUxtB74eVPy/K5RDrKupUV9nWlXYQWXpdM8DE1SQXcKMQT2aedZfcsGVMrw773JW3UFzaA==} + '@3sixty/auditable-item-graph-service@0.20.0-next.1': + resolution: {integrity: sha512-bJM2vyKEfT/l0zWx7walKAlwoTdGE//vwUwKB7Uj0pSUtRNbz7+1hIn0pmCIboXcFI7fYmK5tpmGS5Ve7W7GUw==} engines: {node: '>=24.0.0'} - '@3sixty/auditable-item-stream-service@0.20.0-next.0': - resolution: {integrity: sha512-pfAb97XXrn7TVFuf5DKo7cPrbucfNxIGpk5TKml8oCOU3p0FkpCSWOZ3tqZP6rTSebuATRkYW6Ul6hZeGJfiWg==} + '@3sixty/auditable-item-stream-models@0.20.0-next.1': + resolution: {integrity: sha512-b5/RJUJDnLNzjQvoBmitar3Z8cJtHAbFcUVZke+BT8TKRYtVU+gdTFyUnba7fxzO/o/40vCPm69PTW/7YPXc2Q==} engines: {node: '>=24.0.0'} - '@3sixty/automation-actions@0.20.0-next.0': - resolution: {integrity: sha512-1xMrF/xnRTWIqDQaI/j6C6spIqTCdDibFwnnqqGNWNhqujkBY1gOVDRm9lo1FjgHR7f0QKegB6D5q2SWj/BvRA==} + '@3sixty/auditable-item-stream-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-DoVaDjERYUtkHhP1DDWU8z5wLVByYn2WEsN+bomAhAS//FikWfw5kZ+oQ4DSknDk53zODzicx5qtcSf5YdS76A==} engines: {node: '>=24.0.0'} - '@3sixty/automation-models@0.20.0-next.0': - resolution: {integrity: sha512-z64CRqJPClNurLHGT85ZCccQ98LqzmteB61MwMuih9LWQNrPgTfkM6/mSiy1cXanUvll8loBFfUnHJ7YchqsIg==} + '@3sixty/auditable-item-stream-service@0.20.0-next.1': + resolution: {integrity: sha512-HAoS4htMLiYAoExz9rAwt+0KcxLKMHyWvJNLN3lR1uDAPKPMbjc3pv0UqnH0cOMgoV3SFaA07HNMYio1uPdvhg==} engines: {node: '>=24.0.0'} - '@3sixty/automation-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-y81kN/Do/bSoT4tz2qpG2iJnU8/bMCdXetuncb6vqAhs98kdG/0HIwJq7h+05M7Yj3fBrbCWJSA0fXARgCnebw==} + '@3sixty/authorization-connector-casbin@0.20.0-next.1': + resolution: {integrity: sha512-urV9NcO6XJ3GgJM1qzAJg955yppVqj7/hgQWVEDmgOQP1aaI0FgKnXgXTOLUp0f8dORuAKsZxW+6wq/cGxUWYg==} engines: {node: '>=24.0.0'} - '@3sixty/automation-service@0.20.0-next.0': - resolution: {integrity: sha512-8gI8K5Tc8DaRSx0v01zFdEC4EZIkuHa8Kc5cxUa1HBU2drvmIvbQQDsSmnDmT2ptDTiYu2GeznLr2z+e56waMA==} + '@3sixty/authorization-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-/rg8zGbzkZJu12c5Klg+Uq33LTCcixFQ+nhsa8Z1IZ1ntvXjIjGbWQEoyiyq0/RRCB5TLOUcXId7cUBi1tJhGQ==} engines: {node: '>=24.0.0'} - '@3sixty/background-task-models@0.20.0-next.0': - resolution: {integrity: sha512-CDLBSjZaTb81FFCV5OscA5G4gEAQb5zaKK4H9BcQiJnTf1k8U1BGeU+O5U+H9PM1v3Trm3h7eEqFhMbXKLonIQ==} + '@3sixty/authorization-models@0.20.0-next.1': + resolution: {integrity: sha512-t8MsVzRm6AmlNUtENJLym7bW0zR8dwqZ920gErKRFGknbNH4eoh5fmxLH+4zA1EOmgohn//xSKP8UR9uxdRHNA==} engines: {node: '>=24.0.0'} - '@3sixty/background-task-scheduler@0.20.0-next.0': - resolution: {integrity: sha512-SRpka5SP6woyPBGJaPCiXTHJf3a4ob2RpVTEu/iOOcaW2kaFOilf9g5UAmslM4+NVLmgNHZGuL4f18pqLV/2zg==} + '@3sixty/authorization-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-vZcGORo0PGVlpeDvc7dKN5LuCj1F41FsL62hZiWCuTL4dQZC9vpbm3kedu72tgsoefAJVDI9uwAce+vn1tdyIQ==} engines: {node: '>=24.0.0'} - '@3sixty/background-task-service@0.20.0-next.0': - resolution: {integrity: sha512-NlJX4ooiPhaDfhhYNwfT+dBz6z2tsZQDgwutz4T2DNWng9fIlArXorESLXP9yn1UqR0+tI7hK9P5QguU8JHVzw==} + '@3sixty/authorization-service@0.20.0-next.1': + resolution: {integrity: sha512-zjyQS4l16ZG+X2B/pxpvTtKNAdjp4c58rcV970t6plVIaYKxa6H0gKd3B0oMSOZQ8GY1tnp6XbxUlrcsaPBbmw==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-aws-s3@0.20.0-next.0': - resolution: {integrity: sha512-S4HEabKD1CNtDCyXGe6/Xq+Z7xQndpAtTqsjIFs2eYpMl81vGLy0RE6M804WqZxAig6H5/8KB1ceQJkNQJjlBA==} + '@3sixty/automation-actions@0.20.0-next.1': + resolution: {integrity: sha512-1kRe8G+3LgHZiHFMdc4BpIADkF3pYAgdgD0StggcYtBUQ1wGY9ElNBNEVTkM0rx4dGFAw8BwtOBMVlaHmR07Jg==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-azure@0.20.0-next.0': - resolution: {integrity: sha512-CulApdbMFJ57y6sklrAEhTBhthuLTyKWcN+d2qNKJDzg3eJDlrxRQbrYvtVxkwYIlkcM3Eq3x50SJkWX2dnmuw==} + '@3sixty/automation-models@0.20.0-next.1': + resolution: {integrity: sha512-o6+fYcrLu7CyyJn/zyM3E1sxeXMZhd3F7i7T6s6TFsV//BrQB/agfW5v9Vn8c3VHgI0BO2kQxzc1cK6LZT6P+Q==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-file@0.20.0-next.0': - resolution: {integrity: sha512-i7Gi1DwRIww5Qh+0JVPNOM1OQsZO7yjaRUKxP+VSraqHrv3u831bn5sv0ZXTur+GqVIJ2SMNwMGBP2r5NUwADg==} + '@3sixty/automation-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-JaTsKYtrd1xLhZDdv2g0nR7kd6Hqq5g6hL5qbhrF14HIeaeYd0nAhJIoTgA6Yb7QNd2/k9JTmyVvGxbNzOV++g==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-gcp@0.20.0-next.0': - resolution: {integrity: sha512-VTbC3uAzquJ/KJusTdqie9HrEFS88sS7ZBMwrcsypE1ZZI4bPILP19VNwEZWGUO+FW72w4dhb7ApJewnQBnA+g==} + '@3sixty/automation-service@0.20.0-next.1': + resolution: {integrity: sha512-9P0USiWzjmgq+kuBdiTQ+j2O1Sc90vCnsQXcr6A7qYI60pc789cAh8sooS+FnWmmaVh/Co8Q+r0mgnPvOPDbyg==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-ipfs@0.20.0-next.0': - resolution: {integrity: sha512-yUWF6a/1NbAE1gfy29jj5EwqUt2d89d3xY0I4p6zv4aAUvm9qBks3vKTWTJUOrlz1l/0vKZDIDVFUS+wscQ3cg==} + '@3sixty/background-task-models@0.20.0-next.1': + resolution: {integrity: sha512-GUfVa5aIINeKCU7FOFiFj433BlkY5LF+mNN6ZrlPCGFE2n68bzHL8romVw1RJxb6ocVIXgt7nJ0XWMO2+ALHXA==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-connector-memory@0.20.0-next.0': - resolution: {integrity: sha512-fBZ+gU6Qhjy4/+odyEYJRvQeKnW9ERQ6/QHJt9dwCZ9DvYzvSIk2vRedpLeS9CFE7iOCfttI38RnT+0yyeVwHA==} + '@3sixty/background-task-scheduler@0.20.0-next.1': + resolution: {integrity: sha512-ws2B5tWslCdVKqUkGz9/WlURu4Fiq5ai51PPL1IIc3/n41TIeUF/tDxrMTxLmllX8QzkqWKH+1JMxl9bnNpkEA==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-models@0.20.0-next.0': - resolution: {integrity: sha512-GYfbemjn7jH04Kgn+2AeLbQ3jZyi595g5q/cBRXMDK46L8CG34VlBCdN6G9oiHU6Ub588ar8zvn5JMyi4DJrnw==} + '@3sixty/background-task-service@0.20.0-next.1': + resolution: {integrity: sha512-Z/88zoVrtBtFr7dCvxOY2N5qGYT9sXLP0LyWWbQHJ6DAieuDi2QjN0GF2IqmOagKdzD3nA23JPp0o+Hs6n70/g==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-6Nv741s+TkRHOMLrnUQL/g0MV/Svx3nFbbsEC2hTa2W2cqzauIuFFyt3ShaW2q9LrZIb1ufU1YTac0mFs7gWOg==} + '@3sixty/blob-storage-connector-aws-s3@0.20.0-next.1': + resolution: {integrity: sha512-72/qu/3mkqx5grlp02aCVGsiDZlM0qpBGPMSjaFuFEE++rcawowUOSQubG8D8iMoYKYD1/WOrD6WXhhqRaufGw==} engines: {node: '>=24.0.0'} - '@3sixty/blob-storage-service@0.20.0-next.0': - resolution: {integrity: sha512-HXz7e5YNid+iKz63nxt791a9x9IMVBN5J8R74VeylWPaan0Jpc55d6vmvois0nUvM2v7EdRfoMXxXzl8gNDO3Q==} + '@3sixty/blob-storage-connector-azure@0.20.0-next.1': + resolution: {integrity: sha512-mb4Zu7dsBeVReu09yMsiRIUb7+sQLxv3lcqPMlfYX4fRYGD2tzHjPp4+0/3nmC+g1wwbg7v4M/Oia0f1El0rNA==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-connector-file@0.20.0-next.1': + resolution: {integrity: sha512-QU2IuKbror23ITP0Qz+bk2LanS9OoM6FRSF6UqwPIM3vcbJSz/rEM1l0CCZMVo75O2uGU6uOgijPd9C615DXtw==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-connector-gcp@0.20.0-next.1': + resolution: {integrity: sha512-0rQYkapog3HN7nb2CGSBqqg55n79jYLljur+CyKeFXKGWIY9thYkEJeCPXvIrCX5qmBFI8a/KfX7EosjBYvQEQ==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-connector-ipfs@0.20.0-next.1': + resolution: {integrity: sha512-BTh0ztLJqyXMZsnTkHgMfYiNrqFKA8vDB7nrLloaCjFlYEUuySXGoc34DqC7Fj23bvFThUrec7IOOhizlG0D0w==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-connector-memory@0.20.0-next.1': + resolution: {integrity: sha512-/d0TTgK20he1XuVYPMbtrd8EyiGaZA92EurgTtpGuj85hiy5/Ctb9/tE4PHOImwaYdAWxGY9MVx5jlQc9m6jBg==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-models@0.20.0-next.1': + resolution: {integrity: sha512-pqm+iTR0YsRmXT03zi2m0CfEfG9/WCh9UFKi8Bi9jjPGZGzBOKXnMk3r2CIO7hecjdWq/o95q2M5Nqb1qphREg==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-BtURwjeJ1DhRhUpbyOjf3iJ1Jb33xqEyGYiF7KMPb6XuFxAtzN3O8mtOPgZjMOvrMdf9U1lBBOPxSp+2p9GkBQ==} + engines: {node: '>=24.0.0'} + + '@3sixty/blob-storage-service@0.20.0-next.1': + resolution: {integrity: sha512-fsu2h6H116+NBUoiQgmzeEaqWY9cvvJd6cUeBmum2b9HkGj0N3gRjGYRJYBd79GJxjZFGx+yTkGwXUL9KNGTkQ==} engines: {node: '>=24.0.0'} '@3sixty/cli-core@0.20.0-next.2': @@ -660,292 +682,292 @@ packages: resolution: {integrity: sha512-0tLDaAs5j3NDob9PcmTGP7SBBr2BUnmmgj7/EuvGZNXB1qDV9+ZlYbI2R6KSf8FtGs+S1VsOohgRoqIIBoGvgQ==} engines: {node: '>=24.0.0'} - '@3sixty/data-core@0.20.0-next.2': - resolution: {integrity: sha512-xn/powX6C5rDZs9jl3y4urvzyx07UcUwDFqKv+zoBMr4XKx599n4z3Adb+/gk0bkreEjXHomeo8zkel7HEatJw==} + '@3sixty/data-core@0.20.0-next.3': + resolution: {integrity: sha512-lqV/EM9n/O5U7Wuq1SNSJQPtpTiiKKL1QlmrekO78aLS6qLiolxQv5cRiN55eGdU/46hBxl7akvvzgtTa9HeJQ==} engines: {node: '>=24.0.0'} - '@3sixty/data-json-ld@0.20.0-next.2': - resolution: {integrity: sha512-1wjE0SrC71K7wk4hH4CLYwnPvLhXnTMpJNNm4/Y760htmf/2to6mE58O5RLsUEQPOPa0okvtwPSZTXj8RkVftw==} + '@3sixty/data-json-ld@0.20.0-next.3': + resolution: {integrity: sha512-YdmQ1h1DYVTCq+IZ2kG6p5M5ht0+Lc/Ij54tU3MkCgarA0jgRkCSaC6i37KVeMEMsslOJlhwaNhzxG4QoszPOQ==} engines: {node: '>=24.0.0'} - '@3sixty/data-json-path@0.20.0-next.2': - resolution: {integrity: sha512-VGXfIxzmwfsDt4b/hb7mymbpp1grcMSVvcOfGR9as7QDcazMYXO76lJWrOpcx0nwXbFwylurpzc8CycVqWe6cw==} + '@3sixty/data-json-path@0.20.0-next.3': + resolution: {integrity: sha512-5FguKap+8vsQk6mMCV2WCt+BQR8xTS39y7mXxaXk7W1IwDy59B4K7AZsB38ZmuqSBRHWZMdHr0tXvTcuix/WlQ==} engines: {node: '>=24.0.0'} - '@3sixty/data-processing-converters@0.20.0-next.0': - resolution: {integrity: sha512-P58ucje1vgEHW/uVcPNSg3JE/e/dvejvzfDo4FSB2rYbWDSY5wlpab3ymwjMSInO+3RkqbeD7rSO9BAnQZDLJA==} + '@3sixty/data-processing-converters@0.20.0-next.1': + resolution: {integrity: sha512-iGqCvxwx9s2Z/Z0dzmOSA5J5EpaFKnlZ/3iUXsujrIOKxgU05uAz++oBuz4RdBqyRgBa+fHDeEKOuFokU2afnw==} engines: {node: '>=24.0.0'} - '@3sixty/data-processing-extractors@0.20.0-next.0': - resolution: {integrity: sha512-LDT2zb8fywnBrV3EDyQ9Qe60fJ5hTGTy3DoCyV27SJ/2DrwtraMfzYp6V5GXHxErZ/cTzuD69lplE3T/kvQg3w==} + '@3sixty/data-processing-extractors@0.20.0-next.1': + resolution: {integrity: sha512-E3G1gbFSyILIE7f1U04X/S36QgU9O5/3oeetcd46d2ljVXI3mq4MuuhYCaHgPc+UHM8GnfYiiH/iUjoAlnvWiA==} engines: {node: '>=24.0.0'} - '@3sixty/data-processing-models@0.20.0-next.0': - resolution: {integrity: sha512-lagm3n6yxQAzNAte/xxDylnKjgst1KIYSVvAm1D5q9YV5z0DCuimWlSIbDRRibtmIwhXMshs5jifU0Ip0U/UIw==} + '@3sixty/data-processing-models@0.20.0-next.1': + resolution: {integrity: sha512-UTpOJwHYLtSOEHm70TFalaWbSbiN3+5nnOuxGDN9nnMecbW83CDwllmbDGfv52LDKK1B9Mjq2hv0siOZnDejfQ==} engines: {node: '>=24.0.0'} - '@3sixty/data-processing-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-QqZtb62vWJyQGv2257mmq4U94WFTfWxQjUEngmRiBAaCCWn+DHT/A+vsB4Z1f7PskIR6KLPRLr4q3J1XOA0Maw==} + '@3sixty/data-processing-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-IFVLGzDqwerrG4Gfes18uhy7qt8lc7ySA8k+LDXtzZUnDyWmOkJchRlx8CsmSNa5+YOKReoOCrIfz/eWf+z4Uw==} engines: {node: '>=24.0.0'} - '@3sixty/data-processing-service@0.20.0-next.0': - resolution: {integrity: sha512-fkdV2/regfE+/nFzqWgCZO1Le23gPXBOHXL+TG5kUJWf/Ehm87OVrKEeeECljXaH5iTqIo2O6xL/GkTIkBo9hQ==} + '@3sixty/data-processing-service@0.20.0-next.1': + resolution: {integrity: sha512-VTWTTimL5q7Sd/VLuaaQss0lLkV4PwBaWDFR2reOQG+SNjFmVZnqGb7fSnFff13cEPuQlHV0QeAshsLi2Qrhtw==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-app-runner@0.20.0-next.0': - resolution: {integrity: sha512-WVN8AVCokMEDTsWzTfcR3ZFuBZQkUYm9Zx/XafUsR+Yt/NF/vSQAFUtyxfLDo7fQBedjgNT5n63UooEiQB5v+w==} + '@3sixty/dataspace-app-runner@0.20.0-next.1': + resolution: {integrity: sha512-8392Zb1XVtKqEbERiv1oewKVoJCTSjwpb4g2hHMMU/Tc5rdJsk367lBDv+vUdkbigMhVHJHACJVntIcppkYxog==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-control-plane-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-VLk5gYeXWq55FIambM9yFhp5sWX8vITvT9wrS/biSbgcYI5Y/yi1O8WAoNJpXqQmQQL7IpH40Y8CrI3FsBEDDg==} + '@3sixty/dataspace-control-plane-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-/xdS0f/1j4sGyJ2jaw9zHIZyenY8fnMjbbYQ6fDIovregqQfDKcxgDXJTbe35INg6mxa8rc6aF9ROigKkMA2Gg==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-control-plane-service@0.20.0-next.0': - resolution: {integrity: sha512-PlyhGeAj511DNmn4+W3h1+vXO+axA2ZnMXfPmyUbtZUUZel5+KnCSZSHR5/3v5hXlLK86PMqCdpKkf53nu0D9Q==} + '@3sixty/dataspace-control-plane-service@0.20.0-next.1': + resolution: {integrity: sha512-xD6L/xV/5sjBDmVuVC4Ijx07HaiZ4SfknkIp9oPbaDwffAMrG9ummpzakMF6Q3YZ7Tgb2s2Uej2e0aF6KohMfA==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-data-plane-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-rxDh5kaCWNarg3PEsOemeFErQ+n2aMQkLkfub6ETPj2DFZK8Nf9mmXnlUa9NMuj6extO6WoLUWY05bQJl6y7Bw==} + '@3sixty/dataspace-data-plane-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-UVxBERMXoDm38XRKdsX2OU2uZVNCSh4Mebo6naAwDogiRZIzZUaIq0jdTrampxweyHk2ZJC8+8o92viBvEJFtA==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-data-plane-service@0.20.0-next.0': - resolution: {integrity: sha512-gXenP3DycMEekMO76YGYvsG5LM96zkjeIdnWRsAII6pkA6unqH+FGQy9cXZHlenEfD6WFA5FgNyXhlRA/p+p2g==} + '@3sixty/dataspace-data-plane-service@0.20.0-next.1': + resolution: {integrity: sha512-HKsqd3d5Gil3tLBpMvUVa1lbd9sHQ24+F3C7D5jLX3bZhd9RCV+TxraUOaog86rh0NusKAuxFBG/cqKzeJ+S/g==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-data-plane-socket-client@0.20.0-next.0': - resolution: {integrity: sha512-lf+a6fR/PFB5F0x5TALEJjM1t49ZXub/JLNJGNdw6zW/45pnl5ve/eTl3YYkVKAEaQwiGA/QkmlrQMpH5MGr2A==} + '@3sixty/dataspace-data-plane-socket-client@0.20.0-next.1': + resolution: {integrity: sha512-SjoQ5ztadQtYBKWMui+BbDf1+vadp5T9R8h1FnEKxqGX0C3KB7QhfKnZIGeCVAvWQP81xsX3OR2HJ26EcqxOLw==} engines: {node: '>=24.0.0'} - '@3sixty/dataspace-models@0.20.0-next.0': - resolution: {integrity: sha512-okG6GnJvwvFLh4zLu9B1wbYmIoYaE3AaK+wlWfIGiuvBPFACxUkdlAHyhTkwiK1+St5rNzgZDpXocFx/OnjA/Q==} + '@3sixty/dataspace-models@0.20.0-next.1': + resolution: {integrity: sha512-fDQpha2OHzhIXxswC8gcdQ/W/po3qqtUNi5aB2VvbOD/bB9nESvdrm04Pn9fqa6FgqY2M1soAvU4IPHcXJQMgQ==} engines: {node: '>=24.0.0'} - '@3sixty/dlt-account@0.20.0-next.0': - resolution: {integrity: sha512-D4C5H51ogS+QzhOegcYLcnk608cJtdAZEZ199BSHKbTz9r35YetSuOdHn0FeHm6fHsGf9mF7SIbId1LCUlTlZQ==} + '@3sixty/dlt-account@0.20.0-next.1': + resolution: {integrity: sha512-vmI5iL3p2y0AqsRr/P+r5jLF7PADe39L67OnR/aEka6iOo5Kd+p+APKE3Rsb/NbKFW2YFaaULPv9e30/W0KVDA==} engines: {node: '>=24.0.0'} - '@3sixty/dlt-iota@0.20.0-next.0': - resolution: {integrity: sha512-6BJnJ0tQ+MjNIbUewjYV/n0gIq2/zx7VnHQIi5K0qPTvoD94WtdQ2zz2crh8Pe1Mv5NMqYjjAS52kVs07qOGFw==} + '@3sixty/dlt-iota@0.20.0-next.1': + resolution: {integrity: sha512-X3GEK1xTuQIYvMoZ7/s9Y1pShb9NLbzy/gwDVgNkdc28rGOKg5iFJnNHXuK4qVBSi1vgsNy+VNwYJI2oiZjSkA==} engines: {node: '>=24.0.0'} - '@3sixty/document-management-models@0.20.0-next.0': - resolution: {integrity: sha512-+VXjBv/NlmEyX3hVKqpdfUQYOLc+eF7dw5sw4vUdTx6MHWjUUmsMVmhRQRZ2BGykEjVFKpOsd+6cM7kWb/SUeA==} + '@3sixty/document-management-models@0.20.0-next.1': + resolution: {integrity: sha512-vABF80laJL41+wnJSrVaukqw+98R0g7gaf/KuKU0W2hrC0PBiXn8nDmiYUsnpvPvsVwWFW0cn8kHad5B9kpVaA==} engines: {node: '>=24.0.0'} - '@3sixty/document-management-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-srfTUlMDrwlT5PyNe6e9itd82iiUVwp4PSI2EmhwY1Wn8AdPcN/wNJHNIAc+N4kAXhq8KFrrTfPV64oCPNlYHg==} + '@3sixty/document-management-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-9YwMJ7zRHlIbi6K74tMAGAhjxtfMcofT2swGdg4TWo5BXhwSuhTSk9sGHhaJFRbEtUchYk3sl4OwnLBqXtqqng==} engines: {node: '>=24.0.0'} - '@3sixty/document-management-service@0.20.0-next.0': - resolution: {integrity: sha512-UkawuqheyDTo1P++/Ey6kF+MdM7hZ3KptyclfPTO2ODPFJRdgfMKblLIiebDfUHI2fIeKu4qZ3NqSz4LmKHtkA==} + '@3sixty/document-management-service@0.20.0-next.1': + resolution: {integrity: sha512-nJzOhYvCYfYlMU3313Q+CfKgYwl2GkRdIIiA3jcDQT5m/wK5Si0ifzG69P+Z/cclCyzPbJ/Q8p2FQUJ/60YKAQ==} engines: {node: '>=24.0.0'} - '@3sixty/engine-core@0.20.0-next.1': - resolution: {integrity: sha512-UHLIbRFDzy36qflG+B5j21tmiPEbT5uXYAtdiB6DZyRzV1oL0DY3alzWblywjFg0l8DevWpLxm8v7sNtWGXwqA==} + '@3sixty/engine-core@0.20.0-next.2': + resolution: {integrity: sha512-2vwei3BdDhBZcBhlsLA6aTUIf5zxSeJyLyy21gfEHSm7+fTju4KDeJ+fk1Jd+lTlgQSDHG9RWssLCryXwluQ5Q==} engines: {node: '>=24.0.0'} - '@3sixty/engine-models@0.20.0-next.1': - resolution: {integrity: sha512-ilR2HwIJ3Jwu+ikNJc/uiVN9PQrm8Ln9ku8bYztt2Ja9OiOzc+vFQRz/9iXPV7UUfH/nMWjxu1O5BrzhOxERiQ==} + '@3sixty/engine-models@0.20.0-next.2': + resolution: {integrity: sha512-Ja1JPEma0/BBA4JX7Eg7IGuO2r7YXnOxRZB6NvthkJ/qpfLhEFbf85qBASUAUnsaHWfOpFPDWH84952W+xq6jA==} engines: {node: '>=24.0.0'} - '@3sixty/engine-server-types@0.20.0-next.1': - resolution: {integrity: sha512-g08dDbuRFcsArtuNHOdLXiV2fJABDVYm8nyg1pMbeaswXT1ARYI2y0wEfaVvfkfVmaGb29UkelzUAEJo67PbUw==} + '@3sixty/engine-server-types@0.20.0-next.2': + resolution: {integrity: sha512-kZkqXIXwApmiJDioVxyEtFHwlOJk6u34SY5hZMQ3JuyKc10BVOPojJmdrdvKUPB2xu9Id9rD+nRqbRPzfQTOKQ==} engines: {node: '>=24.0.0'} - '@3sixty/engine-server@0.20.0-next.1': - resolution: {integrity: sha512-Auzkv28Kq++g0TTfN8uXN8n8Qi8Dd2nviBcR41Y7m6UNpifv/W8MO9c8otraWjn/9SdsAr1ZD97+t7BmyXnM0A==} + '@3sixty/engine-server@0.20.0-next.2': + resolution: {integrity: sha512-BX6Z3FWqwd/ga+fsn0/SCAtisZIQ5X7LiYp9AR2sBEApEsEyFUJyijSFs7rUDk2lDdx2felZrw9dHL09CbVuJw==} engines: {node: '>=24.0.0'} - '@3sixty/engine-types@0.20.0-next.1': - resolution: {integrity: sha512-xNgERFH+zRB4Vtt8/LgOzac9tKFSX88ZP3n+ZJdb/tAMzWlDk0khl6Ow8NUbaOg72udCjmTAXeKvhIxvaUjLQQ==} + '@3sixty/engine-types@0.20.0-next.2': + resolution: {integrity: sha512-RyGaH7oiibUdf1OX/zT7T8UTi+0HhmWRVxjJh5Mr7Nsozc/djgin8hjU5ZKZfjq37seI1ZgrddbOfkEwceroxQ==} engines: {node: '>=24.0.0'} - '@3sixty/engine@0.20.0-next.1': - resolution: {integrity: sha512-g9e9HlOja1qdGdB+evf5lNV93s7GgYfqhAcwJ5eEE+D+BvBEpImVfFbxOzvZibhdddVfs4LC/WU57iA5RROitQ==} + '@3sixty/engine@0.20.0-next.2': + resolution: {integrity: sha512-+QBHiev1E0iJjeyu85J1IqkdK4nhfjsrYsN55FNbZyGYNLYhqrxghAfvzEYs2A6+bQHqHT8r8fckb4ckGfaz8w==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-cosmosdb@0.20.0-next.0': - resolution: {integrity: sha512-04Vdbcp5leblBPwlUBN94CbAY2TjAbvNMRe4eX0xym0I/imw+8QwpVaYyvyzWGZU+NDX1GZ8Je2y7kt3hpJbaA==} + '@3sixty/entity-storage-connector-cosmosdb@0.20.0-next.1': + resolution: {integrity: sha512-rZoKR9S76zBLNnrt/0/gRfuhItbb0fiFRQQ9kj/0M2YmGXCyQHVdZ31+h2ZraRKqH+RevVz1YhRHmWsd7QKVaA==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-dynamodb@0.20.0-next.0': - resolution: {integrity: sha512-cTtg5d7cPQHX4h+vtMYWDANluvpvb/3zOPwRvAcxy6+o01MZfntqsykWgSuo4nJxJm5a6qUpNzrqzqRjiCUqWA==} + '@3sixty/entity-storage-connector-dynamodb@0.20.0-next.1': + resolution: {integrity: sha512-GHE/upaBOWXug/bBwJCNJrujP9gfGZ7PuvKn1mTcmzURGVvZYWaRY7m+MRq0Ap9YeD4RH933D3oO6y7TvkchPg==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-file@0.20.0-next.0': - resolution: {integrity: sha512-4KJz/rgmgf7z49rj8l/MQ48tNwla1EWT7Wn/T22qeeukM9eBUYlcPb4M1RyoSn2fOhFNaT0Dc+tFU5j+zPpWQA==} + '@3sixty/entity-storage-connector-file@0.20.0-next.1': + resolution: {integrity: sha512-Px5iaUsoK5Bxxq6bdS6uq0iPJqSJonytsrtQBPgGg8kJc4dndvT2y6a9jRREd3gep+RYWVX9hvySMcSr07Gl7g==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-gcp-firestore@0.20.0-next.0': - resolution: {integrity: sha512-gQy6eGMI/Ak/c2x/qj7G6Hvj1ZhkJ6FHsziek7vMeCr4LjMjTwWYMeymyWTx+hC9BxaH0SveOvStjHtS8KDOYw==} + '@3sixty/entity-storage-connector-gcp-firestore@0.20.0-next.1': + resolution: {integrity: sha512-1hHzWjpH7fZAr8bmiaKmMFeve40P5e3ddwPL/PLsuqZpZP9AZiWftk+PmlLQ4tnJgKW8MFk09TWIRv4yFuDkrg==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-memory@0.20.0-next.0': - resolution: {integrity: sha512-jN76Ljx3Xmqx6sng1aBR6WE66mcxUxEwWON5CzBjBRq21PvJdS7jFmXz6JPJH387dRzy5ar76W9yenrES5ajrQ==} + '@3sixty/entity-storage-connector-memory@0.20.0-next.1': + resolution: {integrity: sha512-IEDnCJGk/DlH3jHajIG+s5SQ36ZhR0Mjo38ISXJKmXbQlcl4CtNfh3Ac/1isBt7cbL2FU4ZeJGOL1pVFAa4xlQ==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-mongodb@0.20.0-next.0': - resolution: {integrity: sha512-F9hzwup/pFZqmUHJfAlM32HdQwEca69M4u5a8d5ldP62VPcfTtNvUfekLdbO1nuqNHL5oa4/lkyvsaYBCtN4Qg==} + '@3sixty/entity-storage-connector-mongodb@0.20.0-next.1': + resolution: {integrity: sha512-NEfIyCDfkG2zteUIYT4zLJU7Gbo7Ue6yMfZl9f7erHL1y/tri1zT8v7Q2lTMRrlGj3Hj93IZcRW963ncZorGGg==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-mysql@0.20.0-next.0': - resolution: {integrity: sha512-gV869EI6shFASdsnfqZQzS0BYbSZqkJQN5yjrAGXLdAJC7ZNorVdIfwnAjg92AiGnLvxaIKqK+Gx2lo3QuRVfw==} + '@3sixty/entity-storage-connector-mysql@0.20.0-next.1': + resolution: {integrity: sha512-eqzg1Hi5p6ILDrkqG/k/WeWdeA0qXL64SZb1gs660hOrPf9gJymXNr7Df3WznAUTe6aia7ranV4pBVaqsF+ovg==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-postgresql@0.20.0-next.0': - resolution: {integrity: sha512-1sKRntmf9R2pCXKaSV+g5jKmkDDd7R1GiGuq+nQZYZ7yFJuUqgbEeNfugfXKWouX3fXn7stsB+B7RRsbrzyaTg==} + '@3sixty/entity-storage-connector-postgresql@0.20.0-next.1': + resolution: {integrity: sha512-mDzH+EB+T8NV+KW1w6K3lljsC/Exj/zConNK4JuvVYECk9oIK7v0vFszLix6JD0neykY18ZsN/mE27TvHbhBuA==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-connector-scylladb@0.20.0-next.0': - resolution: {integrity: sha512-uW9VQXr4WgkIJcyz8w+KtofPypOxtGFXSLiZ9AUPzzhlx9s6juUalfHLx8qQ0Sf8laqFr3rm1MvLprVYABbppw==} + '@3sixty/entity-storage-connector-scylladb@0.20.0-next.1': + resolution: {integrity: sha512-2YOSx9Zl3ibF6v2Qj5kXSRhdwiU6YoBigKgNBDZXldj+Q6ISAqdzGi79zepm//sj8wqX87jYL/GJSH6FWVy4oA==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-models@0.20.0-next.0': - resolution: {integrity: sha512-IG5JgBzpNScXF2+XExjFYLnSSbsFfYGCERXMx6JpB1NRzD7XvwmUWUkvBxGjcXhayEqnE0eEiEdXRp7Xevt3Iw==} + '@3sixty/entity-storage-models@0.20.0-next.1': + resolution: {integrity: sha512-Ruf3cG2VOipevsG1WnZjxya/MIu0M4XNaEwZ7O/inbje+vkdf0PHDyHqxcFXMXOTX+U8dvD+z7SPitfsBp/Tvg==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-V9H1JoWYdQcIQUJSuidknBpztDsh1BO5K6JVAzL9TdxPZQunvE3MffNCl/kIlw3CKM2o/n9/nbecFZbr5kaESA==} + '@3sixty/entity-storage-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-QC/3vspO+LW9C6u8rKEM76X14Xg8qG8Z37Lcidv7kNDa7K0UHUmTw/71NOd+3uwgDuv7okN7bH4VcqoKvwAagw==} engines: {node: '>=24.0.0'} - '@3sixty/entity-storage-service@0.20.0-next.0': - resolution: {integrity: sha512-wOCoLXIUujtVCeROTwScf3kYp4BqNC1/R3BC5JZinp8i9NDVSRxHb9/ekU3EZaKTezVcsIUnBkJ1EPgN7rNElA==} + '@3sixty/entity-storage-service@0.20.0-next.1': + resolution: {integrity: sha512-H3LoZjV0jjFeh3nS3V5NHSWTsNo5/KCrr+TBOf9kr4Kh6+knS9Z4fJo3f6Gwg5u2kvlY8Lk4jqFof01nIjAsiA==} engines: {node: '>=24.0.0'} '@3sixty/entity@0.20.0-next.2': resolution: {integrity: sha512-iq8T0sVI+FGheo7SXmoEPtUAgSIvej7NSy06vD3od5a84WyHzTHsf4nlvV97VDegFyUxXjAhKS5WjLK8tbjFdA==} engines: {node: '>=24.0.0'} - '@3sixty/event-bus-connector-local@0.20.0-next.0': - resolution: {integrity: sha512-dyMWj6AJQ0e1l73LxWo7S6BorLWOzQVH2MvIfitmLwP7MJvsqJvwJlpJvWPtXNB3Kab5RQSoIkmqBDLbihbxbA==} + '@3sixty/event-bus-connector-local@0.20.0-next.1': + resolution: {integrity: sha512-LEtlZd6/eXk2XXGd2BDxLC5OXfuh7MUNCL47/wVNLsSKdf8Qt8uYRZTdtvW080id9YHixg+ZYyQvt2Yd8C7MdQ==} engines: {node: '>=24.0.0'} - '@3sixty/event-bus-models@0.20.0-next.0': - resolution: {integrity: sha512-6M+HJD0/lSuep58x4R3uv3DGTV3btQDwrbI2fJXJFW7OQ3BEQ0eyty9wGg6zlrctBgRh4HFguAqpwz3kTkLYkw==} + '@3sixty/event-bus-models@0.20.0-next.1': + resolution: {integrity: sha512-Yfn3diA7WXr2sxPc8KPGJotfv4OsVWnD682Iwg0NC3qYRvK7yLfRGLoTBAnCeGvNWgmPQm89ns98W4mLDPjaxA==} engines: {node: '>=24.0.0'} - '@3sixty/event-bus-service@0.20.0-next.0': - resolution: {integrity: sha512-kj0eRfyL+ldPyy2j0/wuQLxYtTfXmUDUzQWp2vjb1o6fkAqe++x6B0U4LiJG8gS2RBjD+VL3U1jfl7lAoUxUHw==} + '@3sixty/event-bus-service@0.20.0-next.1': + resolution: {integrity: sha512-EAbstJEk+1Qxb84CSRIRxqA7PsQwvOgzJJpjJ3JxUydD4akpZ8nKyCdDimK87bP3aU7HA24oSO1xWdXH9OOWfA==} engines: {node: '>=24.0.0'} - '@3sixty/event-bus-socket-client@0.20.0-next.0': - resolution: {integrity: sha512-KUWDLKEYF9PQzVg4XKMCpCiaAeqeGzAjlia+AyeFrqxnBJHChXpSZuIWvymsH1INPG/dWy6DxGosvje3NP5HeQ==} + '@3sixty/event-bus-socket-client@0.20.0-next.1': + resolution: {integrity: sha512-9QTnsDPfoGxg5Q3CzyGO9jvwvyvRfURFhy2GJAfxx01K9fBkchTE08Hh/Cc4ZbcnLxsxJ2771eqZ52m+uu5a2A==} engines: {node: '>=24.0.0'} - '@3sixty/federated-catalogue-filters@0.20.0-next.0': - resolution: {integrity: sha512-AOGie820JbFwI41F3/ljdH03DMTDwcNHPJYeGeeAW+mIlgkmPS/LievzqqxR/waznlAp4C3gEeIPldrf+cwFNA==} + '@3sixty/federated-catalogue-filters@0.20.0-next.1': + resolution: {integrity: sha512-bRxM4uWw/NeN8MzHjhLACTmyeRyWMtEmMrUryzSQKQEBrUdOsYvZhqZF5ViSKfN1GGWrCQkDtb1URIi+sQ57dg==} engines: {node: '>=24.0.0'} - '@3sixty/federated-catalogue-models@0.20.0-next.0': - resolution: {integrity: sha512-bCEUCgswDKc2ZkGt2Unb/qWCe5V4NjbVQurDeBLUr8kfjkqDuprIJlyLaqxRxMEyp2KulZhjCIS18Ybtch+ryg==} + '@3sixty/federated-catalogue-models@0.20.0-next.1': + resolution: {integrity: sha512-7Rt++BZVyw28G/7NLAGXo5gRqyiiYr7KTRDvzvcZxPfQkDY6/UzI+p+0OuZjgth27vCkKQFFb8At/1K2DJcD0A==} engines: {node: '>=24.0.0'} - '@3sixty/federated-catalogue-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-FO1bSNqil2keQnmD0/+c/CwrDwG6yOA8PszdVpeVjS3cHe6GGK6j1OQt9yMMsw31J3LwI5MZ5C0zwLJOqqbrNg==} + '@3sixty/federated-catalogue-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-Ueou3LrjGo/PAQ9ZZT49Da7cHQHoLw5lvQEnBhMBfQTyuXI3VXjYFvSMYgRJz7zvtZGY+oDSk/+d3960/fON5g==} engines: {node: '>=24.0.0'} - '@3sixty/federated-catalogue-service@0.20.0-next.0': - resolution: {integrity: sha512-hr62dFp02cGHZbqbf8ta5YD4OksQOY4S5FQt24EKbqrj4ysnXnswVAufNW158c44RnW1kVxidcD9lJ2bdR7teg==} + '@3sixty/federated-catalogue-service@0.20.0-next.1': + resolution: {integrity: sha512-lYsHcrzMjjI303rjvXCHJWe2xrcbhiS2ibb4M5+li2vDBbOyRwg272jsM4onRXyQ6HCgTqpBj00Nr5uYi5xgxg==} engines: {node: '>=24.0.0'} - '@3sixty/identity-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-8Fu54gfd6rYpqlBTh51ZpmVz9FicsiUc+OTBz1NdchiI2UjuMQ+rvk1JvSXMmUm1xqyc+tzDx7EkFixDiHD87Q==} + '@3sixty/identity-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-Sgk1F/uRnh+aPAecxutvN0VtfXjWsELcDbXeNEZGRVzVAm89qtLCwA/592jPcFUjn7OCpy1QgBlSt/KtPoJfdQ==} engines: {node: '>=24.0.0'} - '@3sixty/identity-connector-iota@0.20.0-next.0': - resolution: {integrity: sha512-0i/WzpnKcS8xq2BGXXAhcnke8sPNellHelI7Qk9cMDpkZQbhnuRMyfLLQCOOnmIVL7V/aMvic3uM/6Fc+fPmvQ==} + '@3sixty/identity-connector-iota@0.20.0-next.1': + resolution: {integrity: sha512-iUbtzvuRnPE6qu0T88+ApasCnPSOy35UD72TkuAG0fOiPPywvuTKy8boS5tPMM4teGYL9DFrG6bRU/fkBPXhgA==} engines: {node: '>=24.0.0'} - '@3sixty/identity-connector-universal@0.20.0-next.0': - resolution: {integrity: sha512-pFvPOlipvR1ZgSIjtmzrWHMHiK+VTmC48hbqml3ddglkUOTrYWSE0A7wcGMW5kBJuSgiQaPBsMUbiw6BbPw4QA==} + '@3sixty/identity-connector-universal@0.20.0-next.1': + resolution: {integrity: sha512-GAavUqzJ1Pqh/i1J3V6tFPVJzqQtIP46hyiyQ+am3vei2iPUJ762cI9XqB/4slVPo/GwL1JckzaXEIBQRmzy4Q==} engines: {node: '>=24.0.0'} - '@3sixty/identity-models@0.20.0-next.0': - resolution: {integrity: sha512-+06Wxw1syPT84ywv/9tdzWQ3NF92qP6XUfocVvKsznxGvMGl2coyYFCzzE4flSQYC9HhppBTfGED6vBKiokozQ==} + '@3sixty/identity-models@0.20.0-next.1': + resolution: {integrity: sha512-4aayTHgERVAYvEdCeYSloOEhhoFfGMFoAPQNm/+VPUTxpr6x8My7p+IgKiOLWmdt3TETiyx7MJERXKbhoiYrOg==} engines: {node: '>=24.0.0'} - '@3sixty/identity-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-Fsk9U8H3FkBKrpmQKidyiwSf15T5VOQ7J9fVevw+EMn565KbtjkkD/kqsjFwoa4JzKhkeEcCoeVzO7ORu4CfoA==} + '@3sixty/identity-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-aCgn1SaMEq2PCa7YfudHInNlifMJazmPF8Qohyen3gSpRFtvmbVgRnGhZO/JM3f4DZ/8qYhUjPUs6EbX8FfRaw==} engines: {node: '>=24.0.0'} - '@3sixty/identity-service@0.20.0-next.0': - resolution: {integrity: sha512-Fw/9GaENWYJ5mS4MzP2o5LE1/Iufa633cQVn/kf/ajHqRajs6zrhuUViSkDbTOuGDfmvtGWoiK7NDZXZA3I8EQ==} + '@3sixty/identity-service@0.20.0-next.1': + resolution: {integrity: sha512-0BInEh/OYCdmwnIB2bclj7lUth4H44xZDGFsra9xTjZuW/epZbB+H1V0VS81jrP6lFFiJ0l/WOF5cO/XMmGA/A==} engines: {node: '>=24.0.0'} - '@3sixty/immutable-proof-models@0.20.0-next.0': - resolution: {integrity: sha512-+KxdhhYFO6Rzp7ppDyo6LlwtNJvCRfjy6lkXB6ajJyQeHf/4ZSoQ1/U01x8wc2lkkMpc+bpXojFjN1Ig6/gqLQ==} + '@3sixty/immutable-proof-models@0.20.0-next.1': + resolution: {integrity: sha512-WFwoEasRXY9unFrTu9CzHXWpSgZA6tCgUgAlOVwH8LqF0HlzFi9Nv3Igcvqdf51FXoKLjth6KatdGPGABr8cnA==} engines: {node: '>=24.0.0'} - '@3sixty/immutable-proof-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-kPOm/hK0FjNIYnR8uWXAsDwcgMweQQLk4opGbrjIRQVLNTR15p3VtpOU9k7/zD/tpZVR+T199C5oWx8K9t5l+w==} + '@3sixty/immutable-proof-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-s7lnot7H7TGtK2EXIxKfcC1bKkhDhR2WN0RxbXXSxhJG4tNlf8sP8NrOMX21FV/BAGwq8R2qANk7ljnuk//vdg==} engines: {node: '>=24.0.0'} - '@3sixty/immutable-proof-service@0.20.0-next.0': - resolution: {integrity: sha512-McghwdtYqpA8JpgSgidqx21d9qcLd2Z4ZHkOxZAkJTK8xh0y/JZ9eItnEyAAmgVOJ9O6PACrTVoXpw5f7f+5GA==} + '@3sixty/immutable-proof-service@0.20.0-next.1': + resolution: {integrity: sha512-26SYXFz6vE/Y+bw7xs6d+dDf7h78yzIVfwWZELLgGH+gNeCYU3+JgGrjQm6+GvdWAmZaVfqXdloL4lTLsJspBg==} engines: {node: '>=24.0.0'} - '@3sixty/immutable-proof-task@0.20.0-next.0': - resolution: {integrity: sha512-ktfTt/wBGN2VRRXXs3nyiNcQg6EzBKe0OU6/Uiz9LkKmIeMBhL4Ph72SyxETJrdEXfhv3YKAs6kBWc0PIZz3jA==} + '@3sixty/immutable-proof-task@0.20.0-next.1': + resolution: {integrity: sha512-NZLQYgTISZ1byxtXDpMJXeTSA6X+/ZHboIEHw6Vc/2+LB3+WGmESZHXvDIP3yoK+Hxe8rbo/5k2AdnCvEzExlA==} engines: {node: '>=24.0.0'} - '@3sixty/logging-connector-console@0.20.0-next.0': - resolution: {integrity: sha512-UKVLVwRAyn0ItxAeajLUtZuoYVTC2Md6+QQa54/gyA7ntuTWzbIKY2HSft+ioWPbCXcAQ5WVnRp6xT+L64nMyQ==} + '@3sixty/logging-connector-console@0.20.0-next.1': + resolution: {integrity: sha512-y1sbV+BmE3mm+dkMyXZ74stqx8RXahNpEQaYNnCCL+pgnSjkXaKf8VM83YVY09qEraxQmCDp9G1lUWjj7Ctmmg==} engines: {node: '>=24.0.0'} - '@3sixty/logging-connector-elk@0.20.0-next.0': - resolution: {integrity: sha512-JfninvySpZsjdlk9oDcfA/YKIm99PM6+RdGVhOITZv/nE88IgQ08uKjEubpGp2r9diQN3E48rtKt2KmdfEbj4Q==} + '@3sixty/logging-connector-elk@0.20.0-next.1': + resolution: {integrity: sha512-WWDc0+gU4TrVvDRdns4SrxmL+NVJPVa2TknqKZzDfEmgg0sPI1WiGSA35uLoEUOkK0uvw6QewB3ZwIlgnFy2sQ==} engines: {node: '>=24.0.0'} - '@3sixty/logging-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-sb3hUaMjjGS7cRjfCBjulpG4korFKIQTrjiPOQ0hKjvQBge1hFpxdAftBo3Ml2kRJHAOxdUffvR3LQRGKwZDxw==} + '@3sixty/logging-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-sYmwxTkQxdRE3O6KPEiJfix2HuY/aJysAHW/Do5U/x4FYffC9Bf0keBHNR5pyKAgBqsUuV2SfQMn5haW+SSbRg==} engines: {node: '>=24.0.0'} - '@3sixty/logging-connector-file@0.20.0-next.0': - resolution: {integrity: sha512-CFMrxdmSfl1n44O7tctXWNMQUANKWbRQzxfpq+K210zNggbZJ6BCba0jO0ePUB0uIQqWnx7ipEMZD7XHjZ/ECw==} + '@3sixty/logging-connector-file@0.20.0-next.1': + resolution: {integrity: sha512-R8wxbhdGBn0hzjFAeFdJs5GbKJrJvR7n4KeSiI22LGKh1GsJfBAMKbbPsuMI4Gr4jhq9fXfWuKtyy0Dg/8PSKg==} engines: {node: '>=24.0.0'} - '@3sixty/logging-connector-opentelemetry@0.20.0-next.0': - resolution: {integrity: sha512-dAN0fdhDMT/UgcuXl3vjBvluS3cRLqpBMik/xoINPavalsHtLdRI3/RQSxrv5LZ6ciR9QWF1SREQ8aI1p6SPbg==} + '@3sixty/logging-connector-opentelemetry@0.20.0-next.1': + resolution: {integrity: sha512-sLxpDBlwCY9ex+d1MQk7S2waXNq5NanYZZwyBOkBcsbDBu/guR7BUoCvTkq2ebxmOAf/+vRzEUyucSaDaQpl5g==} engines: {node: '>=24.0.0'} - '@3sixty/logging-models@0.20.0-next.0': - resolution: {integrity: sha512-I4EunSdIs/pHPAM0uGw9T8KDWluGFtWJ5n+jYCW9Vwgk/OF4Vszila/IdSt0NN2kVYzGj4sCD6CvPtJOcT+FXw==} + '@3sixty/logging-models@0.20.0-next.1': + resolution: {integrity: sha512-PvrnZSBuws7TML96voAcKN7jZqMSbMKyq3IXh3dZ1zpgU6U7iBsqT5ynfOln2P3vkVdD29ohFOrX1zr5NPsX8Q==} engines: {node: '>=24.0.0'} - '@3sixty/logging-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-kEDwffjCbZ13HMgOugnw68Rk2MbWNIIzV40XPnBF3MKb41JnjK5q2hnxNPZY02LINEvqX1jCZ/6oK2Fw5rVj8g==} + '@3sixty/logging-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-edK7RsIUqIbbq/8ld3qzPIp2CA5Kn5UY5/7am8nta9R4aFBM6aPaivGWsshFBq79USf15v3o+AzQnFSBe2Tqog==} engines: {node: '>=24.0.0'} - '@3sixty/logging-service@0.20.0-next.0': - resolution: {integrity: sha512-9+78YukossYtOsfmBWsc0jj0Aeq5hsyarJpI/XjwAhdZJCA39ztj1OKhEShXa5D2JN4FrTDTxY6F/ZTX4/MYuA==} + '@3sixty/logging-service@0.20.0-next.1': + resolution: {integrity: sha512-dIq6p2rYwmg7A3DjGXCmHpVmEbuxpqNDd6AmHtyUrqr5+IJm+Dxr34LsR2N1/k8GVy3ugK0indujS81gQ07thA==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-connector-gmail@0.20.0-next.0': - resolution: {integrity: sha512-3khqSkiy1FtZ4S5JXZSYC/XAE9i6MeA4FoiqpF/cVkHLuWz9R+4ybJX9w7pZG9DcnZKIaPzP8uaadw5TtIzb3A==} + '@3sixty/mailbox-connector-gmail@0.20.0-next.1': + resolution: {integrity: sha512-JdBqxMwqPnhDSfy/HHwJ8/OU4c06xlccE6AD1VDUvhDrzaHCyWb44jkWkWfrBVL4+mEtsJgKSEOys4v5ByrGXQ==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-connector-imap@0.20.0-next.0': - resolution: {integrity: sha512-qYBWryUHUt7AippK920cac/ylv+pN6Lp1p1MtRN70RQFz8atZnjWDMITKTVr98wrXM7ZsFQL63OXIyLOvj16PA==} + '@3sixty/mailbox-connector-imap@0.20.0-next.1': + resolution: {integrity: sha512-Ja6uCy+8feyyhWm2NpqSyMIfdGMmzWbbBA8OIZf+BALAtMNlezdzc7GmCurl4DlISaQwQiaCJlX6Zo+oCfQtPQ==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-connector-outlook@0.20.0-next.0': - resolution: {integrity: sha512-Go+D4/L/EwiBiDpfl/N+Ry0YWYlTzoGlJKwkbduye0x3UCmSaYSKqFRab+NIYlzEcB9E4Adev2UJUgpr6i9ibg==} + '@3sixty/mailbox-connector-outlook@0.20.0-next.1': + resolution: {integrity: sha512-NGk0CS1KyFrFWnQx+urTL46uAJq+3UajXxdewomPddh5n+iHhdfnCm0URF/ccWk77jCS8PXnbDHlICn1B0tnpg==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-connector-pop3@0.20.0-next.0': - resolution: {integrity: sha512-vhoWn/yUzc7eUGvmW43XtimtMlHYNAOPjb8tPko9blYCbZEhGgsMYv6cf2y1Rlt/XE3/NoBZ6UexkYm3sV0LPg==} + '@3sixty/mailbox-connector-pop3@0.20.0-next.1': + resolution: {integrity: sha512-11tSyn+xHRPwrl2B0z8ijxom8uuX0GUpC4KFqVQxshPFVVZa9e5ae6V91dfcOmEn97hdck1XEzJZjFm4XO59TA==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-models@0.20.0-next.0': - resolution: {integrity: sha512-UUy/12/3qawt9HTiXpWyiUjN/yYVsJ7fa3ft+BGxw/fbn8yZIMNQgdJ4Xp47P2IPC213tIB/SeXq1RTnF5yVmQ==} + '@3sixty/mailbox-models@0.20.0-next.1': + resolution: {integrity: sha512-b1MUnRP8IvrOgoRg08X3/Qiyg09TzlFc4y13U8yHBWZ0s36Tn4ZuP5qkL8GRjYUCoZKZf2CBOshnEFIN2aN7Vg==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-06t7QMakWa2g+otq7IZGyrKz14cPv5omBDD1C9QLmbBnpR7SZfulkq3OyczKskKWw9Y0pLZEo25ynIiQEqGnVQ==} + '@3sixty/mailbox-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-vL4r9ifOHJnMze8KTvYOkkG1uz+edvcxPJMpzonQfCXVMdmPis9Ho1WaAb/0OB88M1vsCzNE2hRtFJro2v1kaA==} engines: {node: '>=24.0.0'} - '@3sixty/mailbox-service@0.20.0-next.0': - resolution: {integrity: sha512-WXvNCtyh4bKr+vK+bflPl0jAOzuJPco2g5WSY2kf+OnlFDgqlxLqxMz2/1F8MIf0SCkmglXqbH4ph5qraXJEgQ==} + '@3sixty/mailbox-service@0.20.0-next.1': + resolution: {integrity: sha512-sdxujaV/7o/otz++Kkm1HlTuez+BH3Og2a4b5vAxY9fO5JZYHAPN2rmHh6T8aBOHeFfr4vtQLT69nCepXnLTIA==} engines: {node: '>=24.0.0'} '@3sixty/merge-locales@0.20.0-next.2': @@ -953,24 +975,24 @@ packages: engines: {node: '>=24.0.0'} hasBin: true - '@3sixty/messaging-connector-aws@0.20.0-next.0': - resolution: {integrity: sha512-uMOXkjXanqSOil9wFADL0kzc6I4JHgX3IrMyhHrwf1R32Iz4JTcsRUqQxkgARIIfbLkx+NIEDvjFFSj8QA5ywA==} + '@3sixty/messaging-connector-aws@0.20.0-next.1': + resolution: {integrity: sha512-gkn/ygYQdKjit4fesPx5olj6RQUwJVsivMpqeTQk/c7hn6rus2xIvZ1nJz5IJEdVXVotCz7GHtULv2+9O966fQ==} engines: {node: '>=24.0.0'} - '@3sixty/messaging-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-ClXIW+aekvNXHMoshJXdvR5TEWIsE50flgLkc8ttsu//TWTe26SnQZ5hCB9dwkILxD9JRqgcJ1OYf8gOC/lL+g==} + '@3sixty/messaging-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-CfFUR5A+XcimMnTusD+8QtD1iGt6TO/bwdSG5cdGD0h9b9Fe02jGmH1/kxb6KmgGXESKkebaopqSHYScM5qPyQ==} engines: {node: '>=24.0.0'} - '@3sixty/messaging-connector-smtp@0.20.0-next.0': - resolution: {integrity: sha512-tFA7tEbYGbkS7wN58M0VW24jiAgu1YY0bJRzN02MGYmCgFH2J/q9gJX2QqcoitqeeEBtas9TYqxpVfCog0awrQ==} + '@3sixty/messaging-connector-smtp@0.20.0-next.1': + resolution: {integrity: sha512-alvqU9CTL2zOXsVGWFT0HPJKcqGNKlMY8eybm3KG7wOCQJ/iWNVcgTxgeaj+lzrAnKvIFGOdZ4FaMF+pPK1xpA==} engines: {node: '>=24.0.0'} - '@3sixty/messaging-models@0.20.0-next.0': - resolution: {integrity: sha512-3yOJAC8Pbay1bFxvS9KyYTTlDoMBLuyBYeAFTUYaOCGYnBpbDYqWoV4oMvZJTA3DQlQX+RkC49tPLT6g/u/G4A==} + '@3sixty/messaging-models@0.20.0-next.1': + resolution: {integrity: sha512-Lt4vKJq3SYEBmMRHMzGxK0EkR/PbWN6EY4vqYhZbjwpJ6JVOF+DP1kRiLjeWyxe+h7ud3/NtUyX+cawYtLey1g==} engines: {node: '>=24.0.0'} - '@3sixty/messaging-service@0.20.0-next.0': - resolution: {integrity: sha512-4NjNAQRdkPH7kUkggYI4JNt0kHVCkjH0s4W4oxHVq8IbbnxDBMCNUjYRgb0t7hHGAVk2YWY73rlSFhH7ytgO5Q==} + '@3sixty/messaging-service@0.20.0-next.1': + resolution: {integrity: sha512-ebp+5jQUNTLIdTMWWg06WMD6ZsvQ22l3fgiMEX710iWXRvMyQcsfa/ZXm1/IwsqMgsqLwqA82Xky5qtttxH2RA==} engines: {node: '>=24.0.0'} '@3sixty/modules@0.20.0-next.2': @@ -990,152 +1012,152 @@ packages: resolution: {integrity: sha512-isPi+GgUWa/B3+gtLbPm3HJ5yaMJrp2uMlzLIkC2aBGQGC2jFmDk5HSmbpJg7mhQf38YomwI6AzC2JaZcL1XWQ==} engines: {node: '>=24.0.0'} - '@3sixty/nft-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-7lVs7CbpPBYrryK64Co+lD6OHAlYQwQLYsQgWY/ts7QyJZVlmx/BTN/gqLF3ViesYsSx0KjO++MyP9pYiie2xw==} + '@3sixty/nft-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-wmEuSIIiZIkP7gup1mvDeWK2+i/1bPGXWKKGE3p7acjKW4LOiGcrtcxV6talb8dN3kUxmy/By/85L8E0algQAg==} engines: {node: '>=24.0.0'} - '@3sixty/nft-connector-iota@0.20.0-next.0': - resolution: {integrity: sha512-Ad9/wFeVS4yM8iWfp2FQLD53aD/1ipo0zwRsqXyax91rYJhlxEFCqOucdkj5FMbsgkyzMd++fNJVHyP7y/8xxw==} + '@3sixty/nft-connector-iota@0.20.0-next.1': + resolution: {integrity: sha512-vXoTfykvNwc+BYEs9jFYrKzAwR2Pw6GDX93uI3l6jibgNsfgOKCtNS0fOKLg+m5pqrEEHf5hD72YwhqDACIkDA==} engines: {node: '>=24.0.0'} - '@3sixty/nft-models@0.20.0-next.0': - resolution: {integrity: sha512-NfsJFu+1Ru3za9sDZS30LbwTolecUbu9idvZLsQXU8G+dfuuts90TcoBNP55au5h961TlV/LARVwejXwO8S4sA==} + '@3sixty/nft-models@0.20.0-next.1': + resolution: {integrity: sha512-elDwqXcsnXHZafC7PV3lfVGJzcvfqqAPduBhuGwFwh5KolvYyb7ufKB/3tEZyuPQYFyx59dYujnUrGT4qjShpQ==} engines: {node: '>=24.0.0'} - '@3sixty/nft-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-x2J6JZLm/BvlxewjzrveBfLNdoaNL+BNLPAl6YG723tBWjW617tRtJ9x65Kkh4SkPg5O97RBQ/z1OaoBYz1TiA==} + '@3sixty/nft-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-cLUK95JoyJqGdHfE9jLJp1WYzeB/C3kszwOIzsGb1nm06x5vosK95bJvw2vcod+0K1bpWJ6TrPnQ3bYECsVFVQ==} engines: {node: '>=24.0.0'} - '@3sixty/nft-service@0.20.0-next.0': - resolution: {integrity: sha512-82MMePZoRJ6OmmVfBf+pXOua8a59j0M1/qRWkckQvTJwcYjxTlGumd7kcSQOIbUiEE2WJe86Ghv2xb3NJBG/yA==} + '@3sixty/nft-service@0.20.0-next.1': + resolution: {integrity: sha512-OmsMhdP/wyJSK829Na3pX9yUGSDc3waDjZyIttExpGz0AvUFlcb4hk2yCYJYM0Y6tlT1AM2sEMgLaQ3X+1BhvQ==} engines: {node: '>=24.0.0'} - '@3sixty/notarization-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-o6gfXI4Q7F5mDJQ7/sGqjrtZW9P4Mfr9oZnAujPLjsd4l03WGCw7ZjH3NXysOko8G8cOuyfs3yt2rp75+c+fFg==} + '@3sixty/notarization-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-nThE95H8y/hSSrawNElaSLG0DjiSfmQg4JSU5pI5+LqZNI8rV7m/s/shipU1JRLNpZNOar+V7Foud29nNWnOVg==} engines: {node: '>=24.0.0'} - '@3sixty/notarization-connector-iota@0.20.0-next.0': - resolution: {integrity: sha512-TDWR6Q+iDre2h3OZJ+9TYWa0g14zEGfHQFzFiipn//LiGbIDCVKpRN/cV81oLHqWfL5ySwuVeb2YeWMbCtARJw==} + '@3sixty/notarization-connector-iota@0.20.0-next.1': + resolution: {integrity: sha512-HFL5DmU2qNtGjCqKKXr7G88eZviYid1Ie0as2mcmIf4VQuG1xK2KLnQgewgDxXSD8lCH4DlkXD4CUaggG/PRtQ==} engines: {node: '>=24.0.0'} - '@3sixty/notarization-models@0.20.0-next.0': - resolution: {integrity: sha512-KBoJ9CAJgZ7KjyUDF49aVl5KapO1vk4K/YPANLwqpyhSs3ZsIkIe2RjpMRdMSIjEpWrTesHGVDLhzrmIOKjaFQ==} + '@3sixty/notarization-models@0.20.0-next.1': + resolution: {integrity: sha512-hJlsBwmsDrDG0CjF+LgfJG/2wX+mr59pb82ymVM+HNGZzU+g4dU2E+aiqtW3syDVxZAQlJTHVGfnwfG/rXTDtg==} engines: {node: '>=24.0.0'} - '@3sixty/notarization-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-7bUR0XNJvKIO4m9QGzDnq4oxp0Ga1pZuTDveARvtt0xP5nClWBxGKSHZMS0ibe4YigFmvqNijChIcuGceFvaxw==} + '@3sixty/notarization-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-D8llK4wr+rtTiSHV0lkCf4YaxRON8DmkPZdl7lOh11eUzci+AHSqwyp7Narj0ZXFSzqgNjjjnILQf/+tYoiRtg==} engines: {node: '>=24.0.0'} - '@3sixty/notarization-service@0.20.0-next.0': - resolution: {integrity: sha512-1wum0yUBNfJxCkXFUt02yeCiAL8ds+6HmG75ts3l8waj3QLx6HuZb2hMym6R/pC48RZ8Eq93Z8uHWK6usQeymg==} + '@3sixty/notarization-service@0.20.0-next.1': + resolution: {integrity: sha512-RaR9NBZE0b6OgNEOwnLZqILB1EcNeT9SPQx1G2AYcYuLk2bDmPRF01C9V5i9nGYRisdJUToLDO6Ric1ObQLQCQ==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-models@0.20.0-next.0': - resolution: {integrity: sha512-GaZTsXBLychbb+4U4pEnGTYQihkZ56wT75Wkrccw5bE/vI/xCWgyp9+VK2BRD4E2SVpAuBYYYbFbhVJbmzDPnQ==} + '@3sixty/rights-management-models@0.20.0-next.1': + resolution: {integrity: sha512-Z9N841VQZUHluA3kG0z1eT5d3G9CDUfzNaM0THghQ4jyuFwJ2c20IuVeIJkEhSZi4QdufpOKYFtxnaHCkUE1vg==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pap-service@0.20.0-next.0': - resolution: {integrity: sha512-vSfMRVTvwA64RyVowRibAd5vSh8ydWak19Ibqtsuk7+WAZ5moccSKcnTdNyOj7ZUl3B52c9RzWhhGBNa+wpOfg==} + '@3sixty/rights-management-pap-service@0.20.0-next.1': + resolution: {integrity: sha512-rNlt3STjTsSi9GA0JkmP2sTv/8y6RN7cNQM2ZeG0redrnNK3yH2R8xET8L4klauYMpUtu4ujCYBdiBtluAmdBA==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pdp-service@0.20.0-next.0': - resolution: {integrity: sha512-rGnq3aHeiKjKx0Rx6vJa+RGJyH9e6Ptu+087DriZ1GqQwYFcPZjDtVgTrFlT+ws0zn+Z+v5PPRdINbS5i0pN/Q==} + '@3sixty/rights-management-pdp-service@0.20.0-next.1': + resolution: {integrity: sha512-TsXZF/eLtuXJA9MGhO7TrClSNoHl18nKxCDkceGKwv48EBUyL3M3oDlG3pC9A4RRazTenRoQsQuKTXGbf7mG3Q==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pep-service@0.20.0-next.0': - resolution: {integrity: sha512-FccaAIuC88umHHi8S571eAtVwEvB8Sq19jPGgfnRCnfOYbrXLRCw0YrGytDRmUzVXzHX5oPibl3LUa8Ca9BOdA==} + '@3sixty/rights-management-pep-service@0.20.0-next.1': + resolution: {integrity: sha512-F5yDd6TVbr56JefiCb1Hi7YDNnYSRiA0PMkK4alwPsGvPhBnsLbXpoegtwskmnIUJhvooZwav/zkoRE39qp+ew==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pip-service@0.20.0-next.0': - resolution: {integrity: sha512-mtANVsqF8N/PfGBzH44phtJUDKfRdtJ1wBViCxtMS5RCbW3uPjIa4Z1c6lmDP8ILaAYSCHkTJ9tofldANPbTeQ==} + '@3sixty/rights-management-pip-service@0.20.0-next.1': + resolution: {integrity: sha512-HDfk3d1e70dLS/Zq8h2tuPeXQUU1MzHeLNyZ7o6lTrhY4ACCeCRyKnSauKxZiRmp+P+YYCrkZRxmidiKOtLGsQ==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-plugins@0.20.0-next.0': - resolution: {integrity: sha512-LEGxV27SjrpkBV8zvE+dK7OomCEwso8rAXfaXGWittJh5agWeJSxsqVQTrZub3xkNLAwBlKq/qkBHeeONAgl6Q==} + '@3sixty/rights-management-plugins@0.20.0-next.1': + resolution: {integrity: sha512-BiZ24rmEaGAfStMi7/pM4+DHfVJvK6WLxExyEqBgqL9SwwEKsiZvpsSE9r/QEOdUcFvJT2j9pkx6z+f7XH1/DQ==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pmp-service@0.20.0-next.0': - resolution: {integrity: sha512-fVijHdlpsop4jGsFUWtyXYRlPP4KpjiJG4NwLQgZYetPncRDJ/rYyRseYqLBYgUHSETqgVRzPC1kPDgFPMuByw==} + '@3sixty/rights-management-pmp-service@0.20.0-next.1': + resolution: {integrity: sha512-Mql3AdRXfnEyM+QQ6U3o5BucE+sSdpCRttZk3bsfWvAphwOkFsXgoZvK9480u/PvwrjWZr4iaXP2DN+3Hywpqw==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pnp-service@0.20.0-next.0': - resolution: {integrity: sha512-pRUWwNlIUVCupklwgmOuHbzpJrQuw/r12TKdomjb0ATad2UVL+ka6/S93Ul28hP/6bDRsVOrGZ3GVvv+4l347Q==} + '@3sixty/rights-management-pnp-service@0.20.0-next.1': + resolution: {integrity: sha512-mDv85Ztd3/XyzWQhslIszd+rRCaCR2mwJGvTdGgE8WrVsL2ImAauGLeNuJekge0wqv3oJW+dP71RwVUCvevGpA==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-pxp-service@0.20.0-next.0': - resolution: {integrity: sha512-IH3/HYG9TQAz2I5jS/3y0RnNqNJohxeo8F5aJSWwJYgrhNtx4lC5td8mHfxfiM8KQ/ABYKyZUXU/9yLlSMljzA==} + '@3sixty/rights-management-pxp-service@0.20.0-next.1': + resolution: {integrity: sha512-6aX1VDsgYCx2q7XL6fs5o0CPFZCGc5NxFrZMavlQiHFysd7RNI0IFfFnVLfGHVgKbt231G1F/j0KFf0aLV7Sng==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-tomgAfAzlvc/PKemc8TUU0snUSFfvEGxIa1iwfdY6prLHMxhB/9CNkY04eUuR8gxiT4c/z8bxtv1LAvOpkk1zw==} + '@3sixty/rights-management-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-gHNXBwv6syNpkYNxBIZnhq7K2QUYVSayOUQOPUEn0eM95cbmhuKOb+s4qwMBbzGYeAJgVBXJoJNaO1oH3rGU2g==} engines: {node: '>=24.0.0'} - '@3sixty/rights-management-service@0.20.0-next.0': - resolution: {integrity: sha512-TmvamUtd6yI3XiKO2SKRsI5RSwAbonuJiHG36qOoqoZTBHAPjhIF5iLc739OOitKTqYxZ+ano1gD7QyV2aq/DQ==} + '@3sixty/rights-management-service@0.20.0-next.1': + resolution: {integrity: sha512-TAoyt9PooqyXyQMubSYpgJRISHMLPflhv/b3Fxjx+KEM2kPMimp1iGvW2l4PXEhVP+ERzMigsdXS/nwaWS9znw==} engines: {node: '>=24.0.0'} - '@3sixty/standards-dataspace-protocol@0.20.0-next.1': - resolution: {integrity: sha512-TjsF4seaUjqWLMf0gzdVWqi8IHTnIb5hpin95a3iVCwd0VOVUYhY0QGm4ZAbCiX7NXg9Vs3Ck1RpxPsy4Fogvw==} + '@3sixty/standards-dataspace-protocol@0.20.0-next.2': + resolution: {integrity: sha512-LUDiYQfjbFFKUsIWZVeoS7c9YNX0S/S1wPboZbpXBoPqfCFqFYmWyLigdwFS7fwKV6f2J07SXMHkW0g9TYte9Q==} engines: {node: '>=24.0.0'} - '@3sixty/standards-dublin-core@0.20.0-next.1': - resolution: {integrity: sha512-EgKsqGSnUytAF/uBrJqvfa2+EMDLlHQmGTEeS55eYPs/kdDIVlDWJRYmXd2js+A/aYUSaPAFb4Z6GVtzaG4Qlw==} + '@3sixty/standards-dublin-core@0.20.0-next.2': + resolution: {integrity: sha512-uyuOoeaqBI+lDv/yH0uyBb1o4dWyRIJ9YQhlPqqQoBWABIpiaK0XoGJqfbVgxzF4bZlLh2JD1oiJrkdYKuZZQg==} engines: {node: '>=24.0.0'} - '@3sixty/standards-foaf@0.20.0-next.1': - resolution: {integrity: sha512-/pVyDNDxd9cBcjnLjsKhj0b5rCaoA52WDtw78ySrM+vQT57Ong7kf9EVvtgFe7JYBiQr0dSxT8XroFHlS42blw==} + '@3sixty/standards-foaf@0.20.0-next.2': + resolution: {integrity: sha512-vasSgW2fqGlZFtiFgv2KzF0+I4EYqq1llsmtDRWgpbgGa/vmYJfcfD8zDXMrIxJGTE8r11DRCqG/ZACALFcZTA==} engines: {node: '>=24.0.0'} - '@3sixty/standards-schema-org@0.20.0-next.1': - resolution: {integrity: sha512-q5ai+swNqOsp96ZVLysgR6fpHjFHCrFOr/DsCwfn4nRhJ7d1it3fqiXonCuJBRJuh1gV9WWm1JbJ1upPrp996g==} + '@3sixty/standards-schema-org@0.20.0-next.2': + resolution: {integrity: sha512-u0t76+kisicB102D70/33ZiPs7eAoxe4+YCiJ3uzovvFGCbFyrSzaPvHaXG4hSAdx8Jl5v5GwRM7zO8ePS3OlA==} engines: {node: '>=24.0.0'} - '@3sixty/standards-unece@0.20.0-next.1': - resolution: {integrity: sha512-nBl3o7iQ7uWYHyp/wmIg18nV92YE1y0ogObYLAsm3G6jncRXfti9/ciLcg5KYM860c274YOPEyms2PBc+1QEVw==} + '@3sixty/standards-unece@0.20.0-next.2': + resolution: {integrity: sha512-vh0h7rJRpxZpdNaO2sS3PWTPf+LZme9j5aMNVCTli9NdjT0A5EWNFKNfhBR+2bifZ0H6S2Cr5tFrNRUpCwzwdw==} engines: {node: '>=24.0.0'} - '@3sixty/standards-w3c-activity-streams@0.20.0-next.1': - resolution: {integrity: sha512-rW25GvypSQZcPq2ODTGHgyRYnZ8VFicUHmZgFnC37NROPV8HnrSKhouColVFNbTaJsKFw7gNTqIvUhToT5KcUA==} + '@3sixty/standards-w3c-activity-streams@0.20.0-next.2': + resolution: {integrity: sha512-cUfmfjm3FBr/voqzrflMuFaGVKv0YGbCM4UChrMrCjKERD/74gCV4e1i6rYT2UTvrmNNqRAtvlgwYDjhnqmYxQ==} engines: {node: '>=24.0.0'} - '@3sixty/standards-w3c-dcat@0.20.0-next.1': - resolution: {integrity: sha512-75+QAJybPWBWO7scW7J/cbsOPWnLlgyuTk7LLeUHdiDlGfOuYakQ0i8QdKf2tV73yfcrYLGmzGJN0hR5MEwE2A==} + '@3sixty/standards-w3c-dcat@0.20.0-next.2': + resolution: {integrity: sha512-ega9YpK5EMpXVm04nnR1sI6aPW5nq4RQShVRRLbBGlH3NDz6mbPwsk/ugDYpZLxOUJP8D1MLj72nov+aOVU/aA==} engines: {node: '>=24.0.0'} - '@3sixty/standards-w3c-did@0.20.0-next.1': - resolution: {integrity: sha512-mbnRB507N5McgPrbwQeOHH2ZN0Kuh1u6Sez4UqXoCGfPb0OKuvvTN1BJx6o5R7EwWS2wpSmXs0iU2MlKetokVw==} + '@3sixty/standards-w3c-did@0.20.0-next.2': + resolution: {integrity: sha512-TcOW4CN/nOWB/tOybAwxkwyqvHNVOOY+XWxeSTlAwEpQHTE6aNqo77E3dPoRVfFRUZb2nvHCggPUydbWpNNLfg==} engines: {node: '>=24.0.0'} - '@3sixty/standards-w3c-odrl@0.20.0-next.1': - resolution: {integrity: sha512-e3Izjd632M+Ieu1LQrJj2DaYKKSeCIwbGrDj6VHt2vSvUXBXFhJKdh1+4shhcMa5ywP59y23Tq107muqGqGfzA==} + '@3sixty/standards-w3c-odrl@0.20.0-next.2': + resolution: {integrity: sha512-HUZEMqZ/5Mv2uQZ9ppVzOzzs6CBfJm5OalNF1deq2EeMUZawlVRyIKBgl/0/airCLmh5qKBGjvIdzphDkVgGQw==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-QnLH5wPXCnD3uMlqIt9QL8JJRBqILmP8BSSyppJY3qL4raFm/lIhEQy9irJT067KUgtR4NfQe6XQAlRWHQJKqw==} + '@3sixty/telemetry-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-dyzO1OYtvjgnubx/esju1iDfGDXBfwA6/dyViijzRVy3EqkWlemOL6pnZfD071FZc2kLKT+RRLGb/zEtwyhjiA==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-connector-opentelemetry@0.20.0-next.0': - resolution: {integrity: sha512-BlF8t9pCWnBCVien5Sw3Ovdxqus8DJzwUjhPjVbAJpDf/XbD4K47C7eJfyp6AvsCT3P1iTkHear9DGfP5kZC9w==} + '@3sixty/telemetry-connector-opentelemetry@0.20.0-next.1': + resolution: {integrity: sha512-VsFQ1xQ/CVZqD8Tb+nq9lGruVhEQAtcO+mAYyh0h46us+CIQMkHEb2I8rUZWI6Kd7B+43pn5jQMtBizqF4fpEQ==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-models@0.20.0-next.0': - resolution: {integrity: sha512-upL9ip2c2JZvtL3KrNwPgAQxugm7z8fEr8LJhlNxwcYc9gL8fGzxx1kC7TEDLSaBQrVmQq74aeSHWdLsZ0VOyg==} + '@3sixty/telemetry-models@0.20.0-next.1': + resolution: {integrity: sha512-yqK3nWrqe4GCmo+mmLXytI+FWVm0d8CPIV9tw5OAtOVe9y6d7qKU63CR00mZGI6V/E/VTJmCv+Rm3ABRMVvwHQ==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-processors@0.20.0-next.0': - resolution: {integrity: sha512-BrBfeOWvjayzjSa63QeaM6ALiuSLPllnWSPFPqvJxKKfhZKLijXv4AO7ysfxC8rfMlNMKmgp75TGCi+dyDoySg==} + '@3sixty/telemetry-processors@0.20.0-next.1': + resolution: {integrity: sha512-rmo+CHxA5EvsiZZupO3/rOa2Ki20sfG0klthDIp/YbUMZ+AM2w5K0cmtGb35BfcO6VN5iBz5B1M1p2Zh7LRubw==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-producers@0.20.0-next.0': - resolution: {integrity: sha512-K7b/ULwW80BD4MTA0j75G7a3UX6h9fxyD6hR+2jFmkrPVbKPxZQyHHBYOsdDLO52L6OXHr6b+MLBcICQ2YCiQg==} + '@3sixty/telemetry-producers@0.20.0-next.1': + resolution: {integrity: sha512-zCsf83+6PKuX3Dvadv9StYm13qPZgtWv1gBmjEzP/8MWQuUqGXgj1sMFaCpqW76klzShjonoT5fXfihyWOY4vQ==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-vpHEFAqWmYWrPi1kP81j+ox5FAKBZpAw8OG0LsyV7XLLsLPUExmBYd/NGpRGvoiH0BO7Qce8IJbZ77C0lc1ahA==} + '@3sixty/telemetry-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-M8OsOlsol6ta4Asb8tw4p+YPbbCoBXiYbnwmVPgdXJCRjEdzx4+4QByZ6ko8CcngFEdHD2gKjMUJM47yeT0PHQ==} engines: {node: '>=24.0.0'} - '@3sixty/telemetry-service@0.20.0-next.0': - resolution: {integrity: sha512-7C1/oTzW2N8kY8gbrscboARw1v9Fn6Iut09apUXP9b+g1JmIRcw7bg+Dv7ZVkVEwB7Q20dMPo4sWV2H6DhrvuQ==} + '@3sixty/telemetry-service@0.20.0-next.1': + resolution: {integrity: sha512-6VngnwM4x6k4xlamkkThwIWv6H4wUauhgACVsCUl5YjTJ8vpAH5RDSmrzi38NFOnUb4q5VeAZe8tOCWbTVxYzw==} engines: {node: '>=24.0.0'} '@3sixty/tools-core@0.20.0-next.4': @@ -1146,52 +1168,52 @@ packages: resolution: {integrity: sha512-/Ehlhy4Hy5IArm9WJEMs8P42jFBuOwu3YSDiqKl3iAZulgcGrX9AHmIEWgx9nUuWNAZ8646sQwcIQdMNTcwsxQ==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-connector-console@0.20.0-next.0': - resolution: {integrity: sha512-MlHa3R5IZz+jmFML3UIcf9YStfe3zZLEKKZ1ooDaabYKMi3OSmZvcYiSsKqchSNzx7isEHnPMKaJmnPI//c3Wg==} + '@3sixty/tracing-connector-console@0.20.0-next.1': + resolution: {integrity: sha512-R33R3sRaQipsfQmjwp4VZUqwVCwesFYOQV/abvyKk/e5livc4IEnxQhk32cNqEATcj6Ud0HTqEJzrdjdwRPbzQ==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-h7xW5sEfFt6xX56nWnNc+WXDFweN8DlVhemQlNdRIzFVTI2bv2+Tbws3RI7D0pnUcgAV4QFfZXp/x247DYwAGA==} + '@3sixty/tracing-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-NveJrZukIuKlrpiFFUyk/0GVwK/wmSwp+9rM1SUrivNs7S9RtEEg1Ytl+3qOiK5llB/Q8KRxQRXN1nhpVLXbVA==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-connector-opentelemetry@0.20.0-next.0': - resolution: {integrity: sha512-1lLkScz0FmoPI8UNF16+xux3aovXg6lig3OopMZ3EoQMw5jejZQtyU8iTVPhPwWXaUkgxZudQCHlRuu0kLrwXg==} + '@3sixty/tracing-connector-opentelemetry@0.20.0-next.1': + resolution: {integrity: sha512-eM2YjumyXko7UkX3++WAg42XXVy3r2kJaMdnPiroMuDLRbYXF4SXYeZNPanxNQRPFvySSMbcRfSZldBwN+z0EA==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-facades@0.20.0-next.0': - resolution: {integrity: sha512-uZ8bluTR7HlnxpjVJ7JZiH8pTAGDzkb/OkrZk7/n4fIei2pQv8sW5cJwgQ+rS0fEXhaEi1FlY/3I3RsrhyAFWg==} + '@3sixty/tracing-facades@0.20.0-next.1': + resolution: {integrity: sha512-T3e7AC+SV9npGh13cH8KTaaTbqNXJjY0X9uY6+Cjen7s+eEuq+okoUNJYY5ibRsdU6FY0+/gXzO5nx1PFyulGA==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-models@0.20.0-next.0': - resolution: {integrity: sha512-4BJLTsJXBB+k+S+1j4By3O+2MztnpOqBRkLU2dXp0B+S2r3NXeX4/GxoyS5eTUj2ICIdU/sdrdK3uyKQeJ7CyQ==} + '@3sixty/tracing-models@0.20.0-next.1': + resolution: {integrity: sha512-2Jj2ixWxKhE/IdYU1cQkcxZOmjaGdBvMhrjIUWz0uXbym2kUFtycFjHgLekKT+GrYmK2ZFXsNCwUopLjseScUA==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-processors@0.20.0-next.0': - resolution: {integrity: sha512-jQ23Rj/J0nlZyt5tNNZ5cnQSK5IeaX1vOcl7WQSc+pw3nXFuFtPswIaPcCz1uYqaon3tj4Jl34RZpp11GJZA+g==} + '@3sixty/tracing-processors@0.20.0-next.1': + resolution: {integrity: sha512-uxJ6eu94xO2Wze/Agyaw+RD92HsJy4fdWyVPsGDJnN/SdRmn7URpgwGhUCLacX5UUm1gGTmA21Ljmwi08PGKfA==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-rest-client@0.20.0-next.0': - resolution: {integrity: sha512-RBmMmDbzzPLUpuPPr/hiDiHvY5Xou9yKVPpqbDHaGyrfxcBVCeKWLK9a9fk38+RppHNdjBxqoQ9TKHKXV35wWg==} + '@3sixty/tracing-rest-client@0.20.0-next.1': + resolution: {integrity: sha512-tvKccelILh6lYypJdnQDaeEJ5rl7VbrZ5eP04X8c7GGHEpmTonywkOMhdEz4twzBnmh4Nzuipf5Py2Knots/Sg==} engines: {node: '>=24.0.0'} - '@3sixty/tracing-service@0.20.0-next.0': - resolution: {integrity: sha512-rxzXRWFqS+hBPmaqhmPh4GuwNZtYD/saIXY9M56ygkh5RCtMYmMHFAABDexeAssv1r+j5BBQlqDVTABtm62jpQ==} + '@3sixty/tracing-service@0.20.0-next.1': + resolution: {integrity: sha512-13/bqqort+zFS5MlCIcyNqhp8P2GoWo25vpA2Dm1OyMqMBWFjniBspEgqO+w671A6Ymr77l98UMPYxByqRosfw==} engines: {node: '>=24.0.0'} - '@3sixty/trust-generators@0.20.0-next.0': - resolution: {integrity: sha512-HbkiuSTgrjc3FQL8YL94svHEBIDZNiZZIN2GI2gjw3szHluoY6x5P+OoUC1vUOpJDphPGdrycKQs5EtDklvfsA==} + '@3sixty/trust-generators@0.20.0-next.1': + resolution: {integrity: sha512-kPSa83z+dR34S/WbWPlBhweEbZP2A+rhe44ij5N2BSo2wnlzNOtS+piZKGQACP/n/97w+0/24d32w7+ZV3h54A==} engines: {node: '>=24.0.0'} - '@3sixty/trust-models@0.20.0-next.0': - resolution: {integrity: sha512-PUG9+uIK+EyNMr67cX8XRgj0DVSkQoPwfVeCvdhAyYI8kalwB10vIGqthdJocCW3b0cNI+EYoX0edzA+O4tu9w==} + '@3sixty/trust-models@0.20.0-next.1': + resolution: {integrity: sha512-J6uaGvHXHw/ZNBk3P8k2XWKX7cocbEG6uZlqt+0o96BrY8GadOagPwR0vp8jBc2hbKdNrZ/nICSr7iZf4G0aOg==} engines: {node: '>=24.0.0'} - '@3sixty/trust-service@0.20.0-next.0': - resolution: {integrity: sha512-HBow9sWdUuy9wwQoQhCw9kzgWwNxWOIBX8bOvs4r+Gn7FRR9t9QfO1AwLLsRXazXJ+5BNpBu7tKNT6PAvq7rGA==} + '@3sixty/trust-service@0.20.0-next.1': + resolution: {integrity: sha512-tK4IaDZC9/hGJstMM4dugMdMlnmHptT/5Fzlibjd4xybLT8h7+3OeauztTP8yKNng6LuNnwfIRdv6TiTSlrW8A==} engines: {node: '>=24.0.0'} - '@3sixty/trust-verifiers@0.20.0-next.0': - resolution: {integrity: sha512-lZ1rPnqXwBUja/4LrnhEFhE30R1wmrOlt73mNiXMB/PEhODJ7cNDboKRnOjhTtbn1dHocNw0ArgqXB6XeB3qZg==} + '@3sixty/trust-verifiers@0.20.0-next.1': + resolution: {integrity: sha512-T8ZtX5CxsJDPy0GMPVFpAJ7BnQjjze09ll3J3px6QkhMvmucSEvNxB+vkWzp1p8Wv0xo3uI60ZyjtDOWASUg1w==} engines: {node: '>=24.0.0'} '@3sixty/ts-to-openapi@0.20.0-next.4': @@ -1204,28 +1226,28 @@ packages: engines: {node: '>=24.0.0'} hasBin: true - '@3sixty/vault-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-W1SgX1nFgDZYd5Dbjib4KtNK9dkwjMTfTztQqCiDq4kGiRoYo5oqbGazZ8edSXInawGiU+/FwauYjwh5/B+XeQ==} + '@3sixty/vault-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-gPF8l3jxXihS7s+pvZKUsDHIEMiBAZC3nrAbrnTHvPBY6o3501qwww2q1wbGRc16RWdqC1AkmOAhusakPiMQ0Q==} engines: {node: '>=24.0.0'} - '@3sixty/vault-connector-hashicorp@0.20.0-next.0': - resolution: {integrity: sha512-rgl5hBcLjxSpXDpl2D57AIW+91s5cT0j8zDg2axta08kmb1V8v8EzL4YH5x16eoJZfm3lnTkkAtUz7pf2m94pA==} + '@3sixty/vault-connector-hashicorp@0.20.0-next.1': + resolution: {integrity: sha512-2OVTWif56zSEQ7Yjd4Fh0s++RDO9aL00jYfbaTh92S+mNM5Okiqcr1TMsf65oW5ZQZlgiKU9QPidLmcMZ925oA==} engines: {node: '>=24.0.0'} - '@3sixty/vault-models@0.20.0-next.0': - resolution: {integrity: sha512-6XQPJ+IKkiue0xTLCD2VtZP+HjokVEklkZuMYiOTFmFDGX1H5Ai+Qx3F4jO9jXvfP5bNjce4b5byhuPKC49N0A==} + '@3sixty/vault-models@0.20.0-next.1': + resolution: {integrity: sha512-w3rNruwfhaiNpkIopMuD3Yn/5vTyfCWntJ2sJu/xT5nrUyqGm3GkgvbkTZeF7q9Q3nuvQRt3nWkdSjUM3cZoTw==} engines: {node: '>=24.0.0'} - '@3sixty/wallet-connector-entity-storage@0.20.0-next.0': - resolution: {integrity: sha512-LpL4GU3ZQsDBbNHpyzTU2pGvW1lxroASa1ZnnB8vwdaBAr7drGXytXFiIjZg4wC21zPRMNrabTFOGGN46nxO2g==} + '@3sixty/wallet-connector-entity-storage@0.20.0-next.1': + resolution: {integrity: sha512-X0xXzl5uWhJExq8k+woATBVFY4J48MypAgOE3J6nkDd+45AGb+X6B/XzPq+3J8ApHTsC3QZZ5MwZyrditmqing==} engines: {node: '>=24.0.0'} - '@3sixty/wallet-connector-iota@0.20.0-next.0': - resolution: {integrity: sha512-DnL75QM5ChMF8bMNILsyXpWbCoE2OWrS2+krulwd1PgfbOCIk0uEWSYbGeJhwn2bqtc0k9gnHFQT0SApMR/3yw==} + '@3sixty/wallet-connector-iota@0.20.0-next.1': + resolution: {integrity: sha512-TNLVTDDxtRB6ffQiP5R8FKglbKYDDwzCdCixahfHTfSUpALoO3kyeVGK244a6e4rW7kDX/itenSrOkQF4DqIFA==} engines: {node: '>=24.0.0'} - '@3sixty/wallet-models@0.20.0-next.0': - resolution: {integrity: sha512-bkCKbHnyrIF/gfvNRRRi/HZVzNUpv4dXvApO4IIJ60ZQzVJL1EA/ojLyXi8CHEHR0cpfN6P6m/BQrt1ZbBJ1DQ==} + '@3sixty/wallet-models@0.20.0-next.1': + resolution: {integrity: sha512-TBML2KotQxdAU6FREheMZsuXIKBuzpujtNfugxtrSLZ7BeiRt8KlQxBJ5vH7F6R/1/bAKGokfTvHMnTZsnORJg==} engines: {node: '>=24.0.0'} '@3sixty/web@0.20.0-next.2': @@ -1236,20 +1258,20 @@ packages: resolution: {integrity: sha512-H8BiG/2DnfwydVxD1uDPLa1s1sfhRnVTbD2OwzfTr3WlJzgbIzICDXxBTlTMjbWNNCe4VS9X55fco+JI34L9kw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-dynamodb@3.1137.0': - resolution: {integrity: sha512-KBSA5fw7cJaEiTOQem4NF0StMf8tSIt40uMqmTtW39JOTKvXG851FSXLLNnsN+xupnrFt6LMUKErOtUY3Ip2FA==} + '@aws-sdk/client-dynamodb@3.1153.0': + resolution: {integrity: sha512-VLltvPCGtzBIskdvOY6MDkCM5igTCAY4KUpFTFh/ak1DuvrJ8R9H0hiSfPBj8meqyJkc+dzc2oACVnwT9JMjvg==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1137.0': - resolution: {integrity: sha512-ppiYnDyy2qCDT3PIV83XJwAi0BhVUZ/jOHxUgC5tlMCaFeKRL8PVVub8A0pUMkF1yvZtzNOp3ClbmTCcIa9w3g==} + '@aws-sdk/client-s3@3.1153.0': + resolution: {integrity: sha512-h0VScQZPfBApg1Qi4AedsOUSMZ7m758kZIg0JO0B5HtwSzQhB7Tgh6h1JoGEXELgrWADPusYMpMBDmrRAEx2yw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-ses@3.1137.0': - resolution: {integrity: sha512-Jc1rSvHYW78ElD1z4fXCw0YNF6eExMWvCIFi23OcC0qbsznSXH9utDx98Ula0mWs9UzC0Qk93AqReCl5qXy+Qw==} + '@aws-sdk/client-ses@3.1153.0': + resolution: {integrity: sha512-znAL7AX9JJN9QRRziqmdtAQnO9qB4w97xcJHxuWoDIiUexbeAesxQ3kafw/KHFKE84LUlUaJf5EcRpDBhM2aeQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sns@3.1137.0': - resolution: {integrity: sha512-Tm/jSr8SLjE7PnV8oTKB5byLTuqbWfZmm1BZprgbhASmyE/nvPiWHNkWuaHWwRspUVle/CFEeoH7XkT0wl1d+A==} + '@aws-sdk/client-sns@3.1153.0': + resolution: {integrity: sha512-QZpScoOcw4/DZhF5EB/emNkaii7FpL353yf/9CvFdQ5+ubAniHaQkcjGnwvKAbNF3EWf9aOQxBQjFr9m+woekw==} engines: {node: '>=20.0.0'} '@aws-sdk/core@3.978.4': @@ -1296,11 +1318,11 @@ packages: resolution: {integrity: sha512-8q1ICxcDjHId3bBryuu/j+1L9y5/3uQnwzLDt5j2ElcjZSoWmFtymdJy7OjLrluSMe0Z4mq5bcH4fxBXvlEHfw==} engines: {node: '>=20.0.0'} - '@aws-sdk/lib-dynamodb@3.1137.0': - resolution: {integrity: sha512-Ct0gRkFyxq5Uev59IMjUoJH5J+82OXCGxmwUIJzOD1xmqutX0EJf7co7l7mp/61MDH7Z+9n9I42Gf1OcPlh2Bw==} + '@aws-sdk/lib-dynamodb@3.1153.0': + resolution: {integrity: sha512-sKfv+zV5dLg7MgBOHWBSdF/lmEfK/SOkmOS/nbYy2ocA5FOx6p+v0STz38pCpVaWKRHxrNbJNjk1yWXLB2d88g==} engines: {node: '>=20.0.0'} peerDependencies: - '@aws-sdk/client-dynamodb': ^3.1137.0 + '@aws-sdk/client-dynamodb': ^3.1153.0 '@aws-sdk/middleware-endpoint-discovery@3.972.33': resolution: {integrity: sha512-0ed2hDcj2bAQviyydVAWtu63Bl2R0fsvQgw3SK+X9ei7EpFegUdhpdRW/N7cJZIl4YPJXhMnmaq32wDcvUtacA==} @@ -1403,16 +1425,16 @@ packages: resolution: {integrity: sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==} engines: {node: '>=22.0.0'} - '@azure/msal-common@16.14.1': - resolution: {integrity: sha512-Or6xhPNyi4zHW25158yxBoyxuCqNSPa5YBVqfF1J5Ks4MJWBo/USXdp05DQIPu1Zli00YZu6t0+h6KvHJealxQ==} + '@azure/msal-common@16.14.2': + resolution: {integrity: sha512-HOBR0Gfo39TMrkxNG8k6cfjRkrRjXZc3JQs3ebMWQc9S4cihuknMYra3sgmzbZB752oQBqBN9+WF7c826p2vIQ==} engines: {node: '>=0.8.0'} - '@azure/msal-node@6.0.1': - resolution: {integrity: sha512-ixSO1Y/kCVRthRs+hSx/5qkwaunX1/RAePhlMN0wIpIQ4WEZ6AREGGnGd1AP0qspHVsAwzWQKGubpjh50JyJIQ==} + '@azure/msal-node@7.1.0': + resolution: {integrity: sha512-s1O6hSY/C/dmqykTmmeHY6GhSkDuY8N1gxyhuLyaCwbY7N+UBvU2Wu4flas7+NxZiAPcXNPVpgt3n/HP/5yL+w==} engines: {node: '>=20'} - '@azure/storage-blob@12.33.0': - resolution: {integrity: sha512-2SX8oP8PyblUcAFZSg39c8Ls+tFjavM6sBeV+qpw33mRzRhI/5hrFJmJ/x0H9xx5l6ECPvgSP8uPxqTeVbHNIA==} + '@azure/storage-blob@12.34.0': + resolution: {integrity: sha512-cXDTCAMwDx8Ng9yUe82kOOd2kPnZ8AQqe4FkLMcpaQ3Mvr3/PXVdvRhyP0FtY5/U5Oh6JGk3EcEibaFOymRLFw==} engines: {node: '>=22.0.0'} '@azure/storage-common@12.5.0': @@ -1853,11 +1875,11 @@ packages: '@fastify/ajv-compiler@4.0.7': resolution: {integrity: sha512-VP0yIfwlc1ohj733keYDqyHm1VWeP9VQxYomunhr90jkC4aNNibbkrRiaNgPgqj1ORxUenILR4qzA/ppYBNAtQ==} - '@fastify/compress@9.2.0': - resolution: {integrity: sha512-35VL33PIEt/UbD/ZMlRNaICd2BQz0IaG7en74Dv7tI+MHIQkedibS1+9JfekWH4I1g+Y8RbbZD4Zsk9h4XTItg==} + '@fastify/compress@9.2.2': + resolution: {integrity: sha512-FF1CSw1ED4f2lZmYDXmpHgDJLj752JBr7Tdv6Z5SYkZmbvwzlagWwKvF3OGWPzbL7pRFgoki6rNyh/yu8tb92w==} - '@fastify/cors@11.3.0': - resolution: {integrity: sha512-ggQGua+xHv1MvePbPr0v//xLYEsCXbWspquXCJS9Ot5YoRXq8J8ZWzHnxDBVnbtXosvistXo6LtNzOJswf64Fw==} + '@fastify/cors@11.3.1': + resolution: {integrity: sha512-gZXNzd6FLHzOIfvoK4+Az3Wko2V6Y0MIsLxpyo4AEYl7a9q1JBPwPaxLea4nkr++8FCiJiPpYYo6E02uZW0dqw==} '@fastify/deepmerge@3.2.2': resolution: {integrity: sha512-155eqA/WMQdN6gUD4RrhS2K0Pcz2Ou9pQ86L0sipOpP9ONbTA6oYw/hW4VdBjR4egcDHqmWUK9x80oUX7S1mDQ==} @@ -1897,8 +1919,8 @@ packages: resolution: {integrity: sha512-wfHJPZmLqzpy6FN6U+7HkkP/AKhGsbHSpEy/qL2TyI3/pKRAvpamQxZ2qvps5hMRgAjfuHCim+oeJj9RveCaqg==} engines: {node: '>=18'} - '@google-cloud/firestore@9.2.0': - resolution: {integrity: sha512-4BI2686ygMkef0Pe4QnX9hnWeGCUjaAP5m+Ow5/yNWwGxGadO741Ct28MRXW9czg0pnvz919INKbQdCgUMcfeA==} + '@google-cloud/firestore@9.3.1': + resolution: {integrity: sha512-ofGTiSpfXrHrrS3KaDOmsupSzCHr4WVl1+s6Ke0F8rPBRyb/OuZSC8u1NjCKtt/fO7A1GvqASQGhdAwVsnGpQA==} engines: {node: '>=22'} '@google-cloud/paginator@7.2.0': @@ -1913,8 +1935,8 @@ packages: resolution: {integrity: sha512-0i3JkkwAdGGk6AlMnFm1Vf+XtpIL73ki/MZWvXDPoN37nABf/9LFHtYeo8tW77vHSQS00ykC2ygHnUL1gkYAXg==} engines: {node: '>=22'} - '@google-cloud/storage@8.2.0': - resolution: {integrity: sha512-7ckgSjeEprV92VrlLjpYFA3PFerflvFtF7Ea86oQXGNCprGZq5rtpAVK0zgWnCy+44mLjms42M7MiWa433gz2A==} + '@google-cloud/storage@8.4.0': + resolution: {integrity: sha512-M3kA6UA2Tjp5aznCrgKcm9CzOjiQyRMnquqalqXAeS5wvkqqZxN8wpNjjHafOSYs6lQ82U7f2i8we4eTfIrpkA==} engines: {node: '>=22'} '@gql.tada/cli-utils@1.9.4': @@ -1951,6 +1973,12 @@ packages: engines: {node: '>=6'} hasBin: true + '@hono/node-server@2.1.3': + resolution: {integrity: sha512-TA//nWMqPhbfdfneACk6t5a9eqbS9lABEPyKn0/xZTah3H3U2XaVg85rJFl0/Fyit0I552YDHgXGVSf3GwqbUw==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -2174,76 +2202,76 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@opentelemetry/api-logs@0.222.0': - resolution: {integrity: sha512-9mb1If+IF6u0ZVXkHQ6ogEae5HwA6ajIVUgpSDQyRASxft6BSXHvBvPooRle3yFN/fKnCdSOnuu0OC3PLcF6+g==} + '@opentelemetry/api-logs@0.223.0': + resolution: {integrity: sha512-Oepm6etVPFCn0VWB1t833iOTgz1eYBDUPxcrOR/XvwzD1+Ag9VzSPSrrKAFNJ/haatj+8CXbG47pZXvdNQKDJw==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.11.0': - resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + '@opentelemetry/core@2.12.0': + resolution: {integrity: sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-logs-otlp-http@0.222.0': - resolution: {integrity: sha512-GqwLZohJTf/sttYlOpT1oFTJ9ScYaKnk0sOx4Qe/+KmXYVOa+v94cfnkUkFKDuvTODWhCL50Hz3gvsZD6ngQpg==} + '@opentelemetry/exporter-logs-otlp-http@0.223.0': + resolution: {integrity: sha512-YQh9+t/JmV9OeRkoLhPb4yvcrWCX6lAOmXFos/JKoD+KITZYZoxf0acnwAk6YDI9O7fX68O2ka38hx1G9exl8w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.222.0': - resolution: {integrity: sha512-6Ko+0bgNP6V4G/RsmNBSk5lO1B/lo9z6tvLpFY3ykPPevXNzFmOW3C9hEmTt0zKCvHovyrol3TYlg4HVb5gwjg==} + '@opentelemetry/exporter-metrics-otlp-http@0.223.0': + resolution: {integrity: sha512-hNC8yai/+xCNyTuiOy6JFepXXA/sb/2jCzQRY7c2cUWz6owaidihlHUpO20B9/dj8JKPNo8rcn7ikTy7Cj+JaQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-prometheus@0.222.0': - resolution: {integrity: sha512-I7nalnnBZrhlTgjlqsVeEjJGcQCFK5kKAYVk7XTz/cbubvj5fvjLOal/Many0taHF2GIkOWmegsbQ8vbQJjhFg==} + '@opentelemetry/exporter-prometheus@0.223.0': + resolution: {integrity: sha512-HhbN3/B8vG+JNKH2oLMynFFrz2O/o+WFklfwiVq3ffdRWOEZx1zHeYe6r86fn9BUSpQ2U5cXfQja+otTdzi5qQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-proto@0.222.0': - resolution: {integrity: sha512-imLrLzNhnABJt3tUyT63h6MqfZrG3Gdv3TE7+OUQTvwD088RfCUx3rF01lcgfu2KXBFk13vwi0yKZLvFEalkIA==} + '@opentelemetry/exporter-trace-otlp-proto@0.223.0': + resolution: {integrity: sha512-hCFhPuROokNpwLibKmeMRuBNjPtbL+Ja5y/e/KBl5p3QcaH7xBjkj8roIGgKwCNJ4WChRLBzfoaNM3QksogfWw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.222.0': - resolution: {integrity: sha512-YbywG3veEm2Fb6TbdxRkuquWob6eVWXuA8/Ba1tXz9jHfUqpdE3keilOHEtPboC4CvS1bjeeVfNkWGOOrLj+lw==} + '@opentelemetry/otlp-exporter-base@0.223.0': + resolution: {integrity: sha512-HlJMrJXjOqdQeoYNDHEvFTpaY2p9uWDK1GPl5AZ4wI5easzfoppTduOv47M8eiF+4ew42vfI/Xvt7THYgESnRw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.222.0': - resolution: {integrity: sha512-/F3BZ89+CJQnZkMh2tCrtcdB+XT2Dxhj4FFE+WPQ//413hmFL0/RfEX6vgOIWGhiSzrkHWTK3+6SiT7K5/g/jQ==} + '@opentelemetry/otlp-transformer@0.223.0': + resolution: {integrity: sha512-oxmmPL5/MbSsO8K588V9n/XLIe7FZTK30Fo+/U/lAnt0ZIK/hoPM03n2WpSTZVbUBGTUE7aLyxnAzh7nE2PD4Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/resources@2.11.0': - resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + '@opentelemetry/resources@2.12.0': + resolution: {integrity: sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-logs@0.222.0': - resolution: {integrity: sha512-+19YHODIjaUCArxleaJtuufFZVpz/xvvK+VllQqE+W8hHolxdoRwHfK/s667zezwh1hkx6FFF+oYzetYgqK+Bg==} + '@opentelemetry/sdk-logs@0.223.0': + resolution: {integrity: sha512-ApiAfUiUh6fmJt1GbsBuoeDn8D8IL42UvGyPUr8o1Z89ZeIiOCE1rZ78KkIUjEX3OV8Oorl9ez5Qjo43ZynDyw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.11.0': - resolution: {integrity: sha512-7GXXcObyHyDUUSG+L+kJoquty01bzm7ivE7+SSgXXJcHuPzGviptxwARmI2c+bnnxjexGQbJnyNlN8HxBP/Y7A==} + '@opentelemetry/sdk-metrics@2.12.0': + resolution: {integrity: sha512-mVMaEHwCUJuY3S4Esn+nT0yQA3qCEGh+SOPJsXygU0Gl453WcsDNjtEa8EfdewMwoLyr1tlofB4fXytVpiXuow==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-trace@2.11.0': - resolution: {integrity: sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==} + '@opentelemetry/sdk-trace@2.12.0': + resolution: {integrity: sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -2525,8 +2553,8 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@20.19.43': - resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + '@types/node@25.9.9': + resolution: {integrity: sha512-b4e2xxj/yMeT2hNlD6x7zNFiQK2Dlmkb9CQ6v3/1G2RezKN4YS2lcEv8lzGm1mhs4f2lM4yNAMI/zUDBZBBt7w==} '@types/node@26.6.5': resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} @@ -2896,8 +2924,9 @@ packages: resolution: {integrity: sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==} engines: {node: '>=10.0.0'} - '@zone-eu/mailsplit@5.4.17': - resolution: {integrity: sha512-LOMzdrKRVgaghLaezIPdHRhsGpfDiWNQo1RptWc84CRllI4dWLwqX/L4x1iTt1CaeyvyUfMXM/6mjIsEisT3Tg==} + '@zone-eu/mailsplit@5.4.27': + resolution: {integrity: sha512-9008ddFqqKk7lMF2S1sLU7ExfJZP9zPw5tkZy24EVt45Ryme2x85f/5vJZZqQ+vCJkKcCY78dJ5yuEVG3ZrVZA==} + engines: {node: '>=20.0.0'} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -2920,9 +2949,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.5.18: - resolution: {integrity: sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==} - engines: {node: '>=12.0'} + adm-zip@0.6.1: + resolution: {integrity: sha512-Xwrja8nx9e5o2N1my4DsKCeKpdrnACyr1wtbPxBDgGzKzKyE9kRtBFA8mWldI+RVlD7CBZNWY/wQ2+ydwOR6kQ==} + engines: {node: '>=14.0'} agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} @@ -2965,6 +2994,10 @@ packages: anynum@1.0.1: resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + apache-arrow@21.2.0: + resolution: {integrity: sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==} + hasBin: true + are-docs-informative@0.1.1: resolution: {integrity: sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==} engines: {node: '>=18'} @@ -3115,8 +3148,8 @@ packages: resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==} hasBin: true - cassandra-driver@4.9.0: - resolution: {integrity: sha512-svYpdkLIGjD0WmuuwkkeYbfBdPX1zksK2cDyT1mWjX53OVTzuWBOVy54K6PPij8GgYpIG+K82OryrBv/xNeuWg==} + cassandra-driver@4.10.0: + resolution: {integrity: sha512-DHyFC6RMK28nvndZfecbGUozoYbb5NjFmlniczao8zA1IplurcshR2i6rvxpEu3Q9G45tjin4yU+iKwA10ZUtA==} engines: {node: '>=20'} chai@6.3.0: @@ -3159,9 +3192,6 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3242,17 +3272,10 @@ packages: resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} engines: {node: '>=22'} - copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - core-js-compat@3.51.0: resolution: {integrity: sha512-52r6fkXgxv4GLMjmFcMWRx7X9bw071xTTdrDcdyPGRqU2oE+9pCG0bAOMifSBdLw0JRBZKEF0q3B55qPlLuE8g==} engines: {node: '>=6.4.0'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -3697,11 +3720,11 @@ packages: resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} hasBin: true - fastify-plugin@6.0.0: - resolution: {integrity: sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==} + fastify-plugin@6.0.1: + resolution: {integrity: sha512-4wW4RxSmvPXLrh5mgQEiu43qU3bw44N2ss4FTkTkQIbprUhE+/s43QX0j/ttcztdWK7PEkHqVthdc5GdEGDvjA==} - fastify@5.12.5: - resolution: {integrity: sha512-OB2k1dlxs5/NAABqeKV2FUHkSD2BbENsCak8yULVcymn3fHIPDVa9TI3SDnJSWYSllZmSYuZXy2gTnsT+Sut1A==} + fastify@5.12.7: + resolution: {integrity: sha512-v4pEPsTRPuqlDIYiQFB+BHjVN4SdHX9u0ABk0ZDUKbbdY1vsNryUd1j4Z+jQEZajvYIVk047Kimva9/AJ79GYw==} fastq@1.20.3: resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} @@ -3749,6 +3772,9 @@ packages: flat-cache@6.1.23: resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + flatbuffers@25.9.23: + resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} + flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} @@ -3764,9 +3790,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3778,10 +3801,6 @@ packages: functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} - gaxios@7.1.3: resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} engines: {node: '>=18'} @@ -3794,10 +3813,6 @@ packages: resolution: {integrity: sha512-h4/R7ay7JFXU5kmAkp/Y4Y4Vmm7m83tD579GUgfQQsRRGQ4TzSedyHla6XgTWohQuVffT3ldN4FF6uCqlRGaEA==} engines: {node: '>=22'} - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} - gcp-metadata@8.1.4: resolution: {integrity: sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==} engines: {node: '>=18'} @@ -3849,10 +3864,6 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-directory@5.0.0: resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} engines: {node: '>=20'} @@ -3873,18 +3884,10 @@ packages: resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} engines: {node: '>=18'} - google-auth-library@11.1.0: - resolution: {integrity: sha512-YIBq5KNoHQrZ9PM4PeodDBqqBGlSTIxh1zibN8u3zNIO9UJg8gvKuCpdKV7fWXhsZ2zRkU6FhGrgKNgLJ2IRgw==} - engines: {node: '>=22'} - google-auth-library@11.3.1: resolution: {integrity: sha512-mQS0R2Ev/DKkzuWSYtDeq15uhDeaWuT2qzLYqJ41LmooxVKHmn5ut3pc6dlHY6wfHW/D7FBmOYjAtkjaD1A7qA==} engines: {node: '>=22'} - google-auth-library@9.15.1: - resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} - engines: {node: '>=14'} - google-gax@5.0.8: resolution: {integrity: sha512-M4vpZcXQIC1gqIVGQ7eaU3jXQA6zecStyTXu514TYfThlgSurYJOxHZo9fzU6hAgwPWvuEynAVHWyaIk80VeEA==} engines: {node: '>=18'} @@ -3893,10 +3896,6 @@ packages: resolution: {integrity: sha512-U/OUrt4+aUiELB8sgaPJAdVfPzFOPjo1ngXVOwbR1NcCHV7ZcPOW0Ecwdbp8J86NmxBwLMJUOj8AgRSOZm5iJQ==} engines: {node: '>=22'} - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} - engines: {node: '>=14'} - google-logging-utils@1.1.3: resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} engines: {node: '>=14'} @@ -3909,8 +3908,8 @@ packages: resolution: {integrity: sha512-wtv/e7JYgmtpIPcSez2EFD/Wx49DPsRX2rj15D7hTwc7tDsP82dcwoX/I4+zE38mu6S9PcghizzzADLf+ZMunA==} engines: {node: '>=22'} - googleapis@181.0.0: - resolution: {integrity: sha512-fCzsqaVjA5FrA9DdXn4WlnmnLUvqjWx0JGZzcHbSC9iMfb8PK1lTxsvYpnaRf0j4b6usfKlW+YHSKjHnkgqmjQ==} + googleapis@186.0.0: + resolution: {integrity: sha512-ljnYwbM1IX6xM0q5tQHqAtnFdHBC9rPa5jidpoQB7wRiqBYOs5hOQPUPidF454tNLO5LCwB06EvkPg/93E1OJw==} engines: {node: '>=22.0.0'} gopd@1.2.0: @@ -3927,10 +3926,6 @@ packages: resolution: {integrity: sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - gtoken@8.0.0: resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} engines: {node: '>=18'} @@ -3972,6 +3967,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -4018,8 +4017,8 @@ packages: resolution: {integrity: sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==} engines: {node: '>= 4'} - imapflow@2.0.5: - resolution: {integrity: sha512-YG666DWbx0iXDpS4UghDmai1I0XF4w0eZYNEX2iMk3L98GGKxjogIe4RrKgqWzR0RNKJtOXwUgTDbPJIBgbReg==} + imapflow@2.5.8: + resolution: {integrity: sha512-uFnRQVgpBWP1KV2pqGxjvcMejc6x6eskqoaGbOLNIr5Xt5lp6DYrUgk2NaEgtpSNMMxCZeN1GHJNd4nUmc4Cpw==} engines: {node: '>=20.0.0'} import-fresh@3.3.1: @@ -4045,10 +4044,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4133,19 +4128,9 @@ packages: resolution: {integrity: sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==} engines: {node: '>=20'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-unsafe@2.0.2: resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -4213,6 +4198,9 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-with-bigint@3.5.12: + resolution: {integrity: sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==} + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -4258,14 +4246,17 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libbase64@1.3.0: - resolution: {integrity: sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==} + libbase64@1.4.1: + resolution: {integrity: sha512-Nyh3H90B3gRtrcxIe56Ayy7635J0jmh6AbxbQgQae8wrSPQMH5wFqJChiMTB13yKG512L3YspbA5DzumhFTITA==} + engines: {node: '>=20.0.0'} - libmime@5.4.4: - resolution: {integrity: sha512-d3zZ2k8s6iO+8u9Vfkl6HfhD5lSVocGcmOViTz/i0CJcwhJADyubEJ/+TkBhuLDUSIBOiG+D8G5kJKwXwKbXXA==} + libmime@5.5.2: + resolution: {integrity: sha512-Byw3CchK4eSqbgzpttsUoC4hx2VPP+hnveAuYAYZNipEc+0WlDFjVb1ISNscjq/idvyDP/Xjg8mnBcdgbsgvzg==} + engines: {node: '>=20.0.0'} - libqp@2.1.1: - resolution: {integrity: sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==} + libqp@3.0.1: + resolution: {integrity: sha512-7QZxpPX25pga1WiMueduWxmrHMVBFrZPH6ZUaozGYa/H98JH6NVBSET3qVw+4NxzoraIW7rJ81YxSU9IalvCpg==} + engines: {node: '>=20.0.0'} light-my-request@6.8.0: resolution: {integrity: sha512-5Q8PjoSEdtGIB8fikZsTem5vgRo4F2mR6vUKTDW/H1g6MtAt8e3duQbg/QxL5yzg6BZhor2KOUm3hhWMWLTZwg==} @@ -4605,11 +4596,6 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mnemonist@0.38.3: resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} @@ -4621,8 +4607,8 @@ packages: resolution: {integrity: sha512-ZoS07RoFqpKYQwAk59qmrx8+jJHNHU30UjlU96QktiGn1ltvDr+vCznLX5DiUBLEpMAHatHNWV1nM/74ul66kA==} engines: {node: '>=20.19.0'} - mongodb@7.6.0: - resolution: {integrity: sha512-WbZ6OCjYw2c53LOjfkQa+reXr7kIiOVpXXglnASFuiMtif0BvsMwHe3ClJHLm1/r7wJFwaasfFtD6iYIktB01g==} + mongodb@7.7.0: + resolution: {integrity: sha512-XG1xXEqyouAV8GCb3PuRaujofeXKpAJAPvXYWZgHl6Dz4QHSJ1nRLl0+GpqaLTwKvC0RFE9truOur34RNFY1nw==} engines: {node: '>=20.19.0'} peerDependencies: '@aws-sdk/credential-providers': ^3.806.0 @@ -4655,8 +4641,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mysql2@3.24.4: - resolution: {integrity: sha512-A2olluVlj0mvgyIRRISMEzXc51m+21mRtcMVjJyIpt2GG98+XrC9m9HzsqcMsX2LcnfccJvY5NB22g8fENBnOA==} + mysql2@3.24.6: + resolution: {integrity: sha512-enu73KhbAua2L3dIxjc6qg6ZJ7H3pt1BImZASWNWY5xSsmJ1ZuUPULTDGXgmJbI61vb+nJAG19IZclIq19UidQ==} engines: {node: '>= 8.0'} peerDependencies: '@types/node': '>= 8' @@ -4715,8 +4701,8 @@ packages: resolution: {integrity: sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA==} engines: {node: '>=18'} - nodemailer@10.0.10: - resolution: {integrity: sha512-He9XskOFms62SyAKkLu8CcGcYHAo+BSHSsORI8s4PJH8qZgZY4L4lDfvyN0twvmbpyG+eGrxpyBlskj9d9rJ8A==} + nodemailer@10.1.7: + resolution: {integrity: sha512-OQa6FDln5fLttmqSbjDiRYvFDOFNrBqfiOwHPlEbURil3b+vPB1v8xpi+Sp46drzNDlsTnNsS502vthmz56r4w==} engines: {node: '>=20.0.0'} nodemon@3.1.14: @@ -4724,9 +4710,6 @@ packages: engines: {node: '>=10'} hasBin: true - noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4831,10 +4814,6 @@ packages: resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} engines: {node: '>=14.0.0'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4879,8 +4858,9 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - postal-mime@3.0.0: - resolution: {integrity: sha512-Z4a9ar2Bv3YpK3IXag+Yda30k7bMZfpRuUGyqtHnZ2pjHG8Bl62EhZIk4n1dzv00gfzP9g+94e9kd8+XmjVWLA==} + postal-mime@4.0.11: + resolution: {integrity: sha512-T0zAqYnuSB8s+zL9WdiGj/2DeWeObEjqrcw2LWq+hgwpCSbLt7xujsFXn6Kgr1wsLl8DJh+v+lG9GQSQfMcUyA==} + engines: {node: '>=20'} postcss@8.5.31: resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} @@ -4906,16 +4886,9 @@ packages: priorityqueuejs@2.0.0: resolution: {integrity: sha512-19BMarhgpq3x4ccvVi8k2QpJZcymo/iFUcrhPd4V96kYGovOdTsWwy7fxChYi4QY+m2EnGBWSX9Buakz+tWNQQ==} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@5.1.1: resolution: {integrity: sha512-oCkNVj4OKnKEcocVBcDfiIugN1/cE6rgfT3nCtzeqZPA8+rIxMaQ0xXzIkGP8Gj2qUaP1UR7uhJ1VD8lUCpzCg==} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - proto3-json-serializer@3.0.4: resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} engines: {node: '>=18'} @@ -4978,20 +4951,10 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.8.0: - resolution: {integrity: sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -5097,9 +5060,6 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -5122,9 +5082,6 @@ packages: resolution: {integrity: sha512-Nx00FDPHDimSENMznVpADeYUJDsqlMiO9wcs2S+giggNTm5+ruNkM4m9z9qCk6xUJT+ThDM3NxxpwfHfFk1G+Q==} engines: {node: '>=14.0.0'} - schema-dts@2.0.0: - resolution: {integrity: sha512-t7NoCy3Rn5GHGx6p7s1qIYK/AeIb8ZxJNR9WUNFkwMv2CiiGZBmqqYWc2FlZVm5ZbiHMY4OvBWhj7QtyrFO2Jw==} - schema-dts@2.1.0: resolution: {integrity: sha512-Y/NvOvuJUZwrm+EmNqJF3M+bRufERJs1h5GJPLilUuK5D5b53ttU+XZgIjEFaAVRToh+ib+cQawFmxKC5Jt9ow==} @@ -5205,8 +5162,8 @@ packages: socket.io-adapter@2.5.8: resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} - socket.io-client@4.8.3: - resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + socket.io-client@4.8.4: + resolution: {integrity: sha512-7wjKAvVXYOJsbmUgkWbnhPD4bFpkqrUR0++XOjpGFmqDqsqV1CI93VTraeExLxpjxEqrWgFoSRZu1ihjLWfkAA==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.7: @@ -5217,6 +5174,10 @@ packages: resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} + socket.io@4.8.4: + resolution: {integrity: sha512-9ZV9zg8vN8hO3Y25DhR7nUkJ1VDnBhq5O/JrXhFT9s6+F0gqytSASTHVfCFc2mJXaTfARroErplXlzFWwETZqQ==} + engines: {node: '>=10.2.0'} + socks@2.8.10: resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -5294,12 +5255,6 @@ packages: resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} engines: {node: '>=20'} - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -5361,9 +5316,6 @@ packages: resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} engines: {node: '>=20'} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -5485,8 +5437,8 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} @@ -5514,10 +5466,6 @@ packages: unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - update-browserslist-db@1.3.4: resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} hasBin: true @@ -5533,11 +5481,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - valibot@1.5.0: resolution: {integrity: sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==} peerDependencies: @@ -5733,10 +5676,6 @@ packages: resolution: {integrity: sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==} engines: {node: '>=0.6.0'} - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5761,10 +5700,6 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@16.2.2: - resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} - engines: {node: '>=10'} - yargs@17.7.3: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} @@ -5793,17 +5728,17 @@ snapshots: graphql: 16.14.2 typescript: 6.0.3 - '@3sixty/api-auth-entity-storage-models@0.20.0-next.0': + '@3sixty/api-auth-entity-storage-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/api-auth-entity-storage-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/api-auth-entity-storage-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-auth-entity-storage-models': 0.20.0-next.0 - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-auth-entity-storage-models': 0.20.0-next.1 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -5812,39 +5747,63 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/api-auth-entity-storage-service@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/api-auth-entity-storage-service@0.20.0-next.1': dependencies: - '@3sixty/api-auth-entity-storage-models': 0.20.0-next.0 - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-auth-entity-storage-models': 0.20.0-next.1 + '@3sixty/api-auth-models': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@3sixty/api-core@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/api-auth-models@0.20.0-next.1': + dependencies: + '@3sixty/core': 0.20.0-next.2 + '@3sixty/nameof': 0.20.0-next.2 + + '@3sixty/api-auth-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-auth-models': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 + '@3sixty/crypto': 0.20.0-next.2 + '@3sixty/entity': 0.20.0-next.2 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - socket.io-client: 4.8.3(supports-color@10.2.2) + + '@3sixty/api-core-server@0.20.0-next.1': + dependencies: + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/api-processors': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + + '@3sixty/api-core@0.20.0-next.1(supports-color@10.2.2)': + dependencies: + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + socket.io-client: 4.8.4(supports-color@10.2.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/api-models@0.20.0-next.0': + '@3sixty/api-models@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 @@ -5852,146 +5811,176 @@ snapshots: '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/api-processors@0.20.0-next.0': + '@3sixty/api-processors@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/api-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/api-rest-client@0.20.0-next.1(supports-color@10.2.2)': + dependencies: + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/nameof': 0.20.0-next.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@3sixty/api-server-fastify@0.20.0-next.1(supports-color@10.2.2)': + dependencies: + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-core-server': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + '@fastify/compress': 9.2.2 + '@fastify/cors': 11.3.1 + fastify: 5.12.7 + fastify-plugin: 6.0.1 + socket.io: 4.8.4(supports-color@10.2.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@3sixty/api-server-hono@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core-server': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + '@hono/node-server': 2.1.3(hono@4.13.13) + hono: 4.13.13 + socket.io: 4.8.3(supports-color@10.2.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/api-server-fastify@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/api-server-native@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/api-processors': 0.20.0-next.0 + '@3sixty/api-core-server': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@fastify/compress': 9.2.0 - '@fastify/cors': 11.3.0 - fastify: 5.12.5 - fastify-plugin: 6.0.0 + find-my-way: 9.10.0 socket.io: 4.8.3(supports-color@10.2.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/api-service@0.20.0-next.0': + '@3sixty/api-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/api-tenant-processor@0.20.0-next.0': + '@3sixty/api-tenant-processor@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/attestation-connector-nft@0.20.0-next.0': + '@3sixty/attestation-connector-nft@0.20.0-next.1': dependencies: - '@3sixty/attestation-models': 0.20.0-next.0 + '@3sixty/attestation-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/nft-models': 0.20.0-next.0 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/nft-models': 0.20.0-next.1 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 - '@3sixty/attestation-models@0.20.0-next.0': + '@3sixty/attestation-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/attestation-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/attestation-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/attestation-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/attestation-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/standards-w3c-did': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/attestation-service@0.20.0-next.0': + '@3sixty/attestation-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/attestation-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/attestation-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/wallet-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/auditable-item-graph-models@0.20.0-next.0': + '@3sixty/auditable-item-graph-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/auditable-item-graph-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/auditable-item-graph-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/auditable-item-graph-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: @@ -5999,44 +5988,44 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/auditable-item-graph-service@0.20.0-next.0': + '@3sixty/auditable-item-graph-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/auditable-item-graph-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/auditable-item-stream-models@0.20.0-next.0': + '@3sixty/auditable-item-stream-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/auditable-item-stream-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/auditable-item-stream-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/auditable-item-stream-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/auditable-item-stream-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -6045,44 +6034,92 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/auditable-item-stream-service@0.20.0-next.0': + '@3sixty/auditable-item-stream-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/auditable-item-stream-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/auditable-item-stream-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/automation-actions@0.20.0-next.0': + '@3sixty/authorization-connector-casbin@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/automation-models': 0.20.0-next.0 + '@3sixty/authorization-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/crypto': 0.20.0-next.2 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/automation-models@0.20.0-next.0': + '@3sixty/authorization-connector-entity-storage@0.20.0-next.1': + dependencies: + '@3sixty/authorization-models': 0.20.0-next.1 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/entity': 0.20.0-next.2 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + + '@3sixty/authorization-models@0.20.0-next.1': + dependencies: + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + + '@3sixty/authorization-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@3sixty/automation-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/authorization-service@0.20.0-next.1': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/automation-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/web': 0.20.0-next.2 + + '@3sixty/automation-actions@0.20.0-next.1': + dependencies: + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/automation-models': 0.20.0-next.1 + '@3sixty/context': 0.20.0-next.2 + '@3sixty/core': 0.20.0-next.2 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/web': 0.20.0-next.2 + + '@3sixty/automation-models@0.20.0-next.1': + dependencies: + '@3sixty/core': 0.20.0-next.2 + '@3sixty/nameof': 0.20.0-next.2 + + '@3sixty/automation-rest-client@0.20.0-next.1(supports-color@10.2.2)': + dependencies: + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/automation-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 @@ -6092,134 +6129,133 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/automation-service@0.20.0-next.0': + '@3sixty/automation-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/automation-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/automation-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/background-task-models@0.20.0-next.0': + '@3sixty/background-task-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/background-task-scheduler@0.20.0-next.0': + '@3sixty/background-task-scheduler@0.20.0-next.1': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/background-task-service@0.20.0-next.0': + '@3sixty/background-task-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/blob-storage-connector-aws-s3@0.20.0-next.0': + '@3sixty/blob-storage-connector-aws-s3@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@aws-sdk/client-s3': 3.1137.0 + '@aws-sdk/client-s3': 3.1153.0 - '@3sixty/blob-storage-connector-azure@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/blob-storage-connector-azure@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@azure/storage-blob': 12.33.0(supports-color@10.2.2) + '@azure/storage-blob': 12.34.0(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@3sixty/blob-storage-connector-file@0.20.0-next.0': + '@3sixty/blob-storage-connector-file@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/blob-storage-connector-gcp@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/blob-storage-connector-gcp@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@google-cloud/storage': 8.2.0(supports-color@10.2.2) - google-auth-library: 11.1.0(supports-color@10.2.2) + '@google-cloud/storage': 8.4.0(supports-color@10.2.2) + google-auth-library: 11.3.1(supports-color@10.2.2) transitivePeerDependencies: - - encoding - supports-color - '@3sixty/blob-storage-connector-ipfs@0.20.0-next.0': + '@3sixty/blob-storage-connector-ipfs@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/blob-storage-connector-memory@0.20.0-next.0': + '@3sixty/blob-storage-connector-memory@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/blob-storage-models@0.20.0-next.0': + '@3sixty/blob-storage-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/blob-storage-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/blob-storage-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -6228,20 +6264,20 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/blob-storage-service@0.20.0-next.0': + '@3sixty/blob-storage-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@3sixty/cli-core@0.20.0-next.2': @@ -6275,7 +6311,7 @@ snapshots: '@scure/bip39': 2.4.0 micro-key-producer: 0.10.2 - '@3sixty/data-core@0.20.0-next.2': + '@3sixty/data-core@0.20.0-next.3': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 @@ -6285,48 +6321,48 @@ snapshots: ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) - '@3sixty/data-json-ld@0.20.0-next.2': + '@3sixty/data-json-ld@0.20.0-next.3': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 '@types/jsonld': 1.5.15 jsonld: 9.0.0 - '@3sixty/data-json-path@0.20.0-next.2': + '@3sixty/data-json-path@0.20.0-next.3': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 json-p3: 2.3.1 - '@3sixty/data-processing-converters@0.20.0-next.0': + '@3sixty/data-processing-converters@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-processing-models': 0.20.0-next.0 + '@3sixty/data-processing-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 xml2js: 0.6.2 - '@3sixty/data-processing-extractors@0.20.0-next.0': + '@3sixty/data-processing-extractors@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-path': 0.20.0-next.2 - '@3sixty/data-processing-models': 0.20.0-next.0 + '@3sixty/data-json-path': 0.20.0-next.3 + '@3sixty/data-processing-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/data-processing-models@0.20.0-next.0': + '@3sixty/data-processing-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-processing-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/data-processing-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-processing-models': 0.20.0-next.0 + '@3sixty/data-processing-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -6335,157 +6371,157 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/data-processing-service@0.20.0-next.0': + '@3sixty/data-processing-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-processing-models': 0.20.0-next.0 + '@3sixty/data-processing-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/dataspace-app-runner@0.20.0-next.0': + '@3sixty/dataspace-app-runner@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/dataspace-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/dataspace-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-w3c-activity-streams': 0.20.0-next.1 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-w3c-activity-streams': 0.20.0-next.2 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/dataspace-control-plane-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/dataspace-control-plane-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dataspace-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dataspace-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/dataspace-control-plane-service@0.20.0-next.0': + '@3sixty/dataspace-control-plane-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/api-tenant-processor': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/api-tenant-processor': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dataspace-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dataspace-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/federated-catalogue-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/trust-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/federated-catalogue-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/trust-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/dataspace-data-plane-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/dataspace-data-plane-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-activity-streams': 0.20.0-next.1 + '@3sixty/standards-w3c-activity-streams': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/dataspace-data-plane-service@0.20.0-next.0': + '@3sixty/dataspace-data-plane-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dataspace-app-runner': 0.20.0-next.0 - '@3sixty/dataspace-models': 0.20.0-next.0 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dataspace-app-runner': 0.20.0-next.1 + '@3sixty/dataspace-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-activity-streams': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-activity-streams': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/dataspace-data-plane-socket-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/dataspace-data-plane-socket-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dataspace-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dataspace-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-activity-streams': 0.20.0-next.1 + '@3sixty/standards-w3c-activity-streams': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/dataspace-models@0.20.0-next.0': + '@3sixty/dataspace-models@0.20.0-next.1': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-w3c-activity-streams': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-w3c-activity-streams': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/dlt-account@0.20.0-next.0': + '@3sixty/dlt-account@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 - '@3sixty/dlt-iota@0.20.0-next.0(typescript@6.0.3)': + '@3sixty/dlt-iota@0.20.0-next.1(typescript@6.0.3)': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/dlt-account': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 + '@3sixty/wallet-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@iota/bcs': 1.6.0 '@iota/identity-wasm': 1.9.7-beta.1(@iota/iota-sdk@1.15.0(typescript@6.0.3)) @@ -6496,27 +6532,27 @@ snapshots: - encoding - typescript - '@3sixty/document-management-models@0.20.0-next.0': + '@3sixty/document-management-models@0.20.0-next.1': dependencies: - '@3sixty/attestation-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/attestation-models': 0.20.0-next.1 + '@3sixty/auditable-item-graph-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-unece': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-unece': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/document-management-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/document-management-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/auditable-item-graph-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -6525,65 +6561,64 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/document-management-service@0.20.0-next.0': + '@3sixty/document-management-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/attestation-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/attestation-models': 0.20.0-next.1 + '@3sixty/auditable-item-graph-models': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/data-processing-models': 0.20.0-next.0 - '@3sixty/document-management-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/data-processing-models': 0.20.0-next.1 + '@3sixty/document-management-models': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-schema-org': 0.20.0-next.1 - '@3sixty/standards-unece': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-schema-org': 0.20.0-next.2 + '@3sixty/standards-unece': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/engine-core@0.20.0-next.1': + '@3sixty/engine-core@0.20.0-next.2': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/engine-models': 0.20.0-next.1 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/engine-models': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-connector-console': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/logging-service': 0.20.0-next.0 + '@3sixty/logging-connector-console': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/logging-service': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/engine-models@0.20.0-next.1': + '@3sixty/engine-models@0.20.0-next.2': dependencies: + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/engine-server-types@0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': + '@3sixty/engine-server-types@0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@3sixty/api-auth-entity-storage-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-auth-entity-storage-service': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/api-processors': 0.20.0-next.0 - '@3sixty/api-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-server-fastify': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-service': 0.20.0-next.0 - '@3sixty/api-tenant-processor': 0.20.0-next.0 + '@3sixty/api-auth-entity-storage-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-auth-entity-storage-service': 0.20.0-next.1 + '@3sixty/api-auth-service': 0.20.0-next.1 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/api-processors': 0.20.0-next.1 + '@3sixty/api-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-service': 0.20.0-next.1 + '@3sixty/api-tenant-processor': 0.20.0-next.1 + '@3sixty/authorization-service': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/engine-models': 0.20.0-next.1 - '@3sixty/engine-types': 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) - '@3sixty/entity': 0.20.0-next.2 + '@3sixty/engine-models': 0.20.0-next.2 + '@3sixty/engine-types': 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-processors': 0.20.0-next.0 - '@3sixty/tracing-processors': 0.20.0-next.0 + '@3sixty/telemetry-processors': 0.20.0-next.1 + '@3sixty/tracing-processors': 0.20.0-next.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@azure/identity' @@ -6606,14 +6641,16 @@ snapshots: - typescript - utf-8-validate - '@3sixty/engine-server@0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': + '@3sixty/engine-server@0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/api-server-fastify': 0.20.0-next.0(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/api-server-fastify': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-server-hono': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-server-native': 0.20.0-next.1(supports-color@10.2.2) '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/engine-models': 0.20.0-next.1 - '@3sixty/engine-server-types': 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + '@3sixty/engine-models': 0.20.0-next.2 + '@3sixty/engine-server-types': 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 transitivePeerDependencies: @@ -6638,156 +6675,151 @@ snapshots: - typescript - utf-8-validate - '@3sixty/engine-types@0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': - dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/api-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-service': 0.20.0-next.0 - '@3sixty/api-tenant-processor': 0.20.0-next.0 - '@3sixty/attestation-connector-nft': 0.20.0-next.0 - '@3sixty/attestation-models': 0.20.0-next.0 - '@3sixty/attestation-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/attestation-service': 0.20.0-next.0 - '@3sixty/auditable-item-graph-models': 0.20.0-next.0 - '@3sixty/auditable-item-graph-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/auditable-item-graph-service': 0.20.0-next.0 - '@3sixty/auditable-item-stream-models': 0.20.0-next.0 - '@3sixty/auditable-item-stream-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/auditable-item-stream-service': 0.20.0-next.0 - '@3sixty/automation-actions': 0.20.0-next.0 - '@3sixty/automation-models': 0.20.0-next.0 - '@3sixty/automation-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/automation-service': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 - '@3sixty/background-task-scheduler': 0.20.0-next.0 - '@3sixty/background-task-service': 0.20.0-next.0 - '@3sixty/blob-storage-connector-aws-s3': 0.20.0-next.0 - '@3sixty/blob-storage-connector-azure': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/blob-storage-connector-file': 0.20.0-next.0 - '@3sixty/blob-storage-connector-gcp': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/blob-storage-connector-ipfs': 0.20.0-next.0 - '@3sixty/blob-storage-connector-memory': 0.20.0-next.0 - '@3sixty/blob-storage-models': 0.20.0-next.0 - '@3sixty/blob-storage-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/blob-storage-service': 0.20.0-next.0 + '@3sixty/engine-types@0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': + dependencies: + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/api-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-service': 0.20.0-next.1 + '@3sixty/api-tenant-processor': 0.20.0-next.1 + '@3sixty/attestation-connector-nft': 0.20.0-next.1 + '@3sixty/attestation-models': 0.20.0-next.1 + '@3sixty/attestation-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/attestation-service': 0.20.0-next.1 + '@3sixty/auditable-item-graph-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/auditable-item-graph-service': 0.20.0-next.1 + '@3sixty/auditable-item-stream-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/auditable-item-stream-service': 0.20.0-next.1 + '@3sixty/authorization-connector-casbin': 0.20.0-next.1 + '@3sixty/authorization-connector-entity-storage': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 + '@3sixty/authorization-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/authorization-service': 0.20.0-next.1 + '@3sixty/automation-actions': 0.20.0-next.1 + '@3sixty/automation-models': 0.20.0-next.1 + '@3sixty/automation-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/automation-service': 0.20.0-next.1 + '@3sixty/background-task-scheduler': 0.20.0-next.1 + '@3sixty/background-task-service': 0.20.0-next.1 + '@3sixty/blob-storage-connector-aws-s3': 0.20.0-next.1 + '@3sixty/blob-storage-connector-azure': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/blob-storage-connector-file': 0.20.0-next.1 + '@3sixty/blob-storage-connector-gcp': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/blob-storage-connector-ipfs': 0.20.0-next.1 + '@3sixty/blob-storage-connector-memory': 0.20.0-next.1 + '@3sixty/blob-storage-models': 0.20.0-next.1 + '@3sixty/blob-storage-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/blob-storage-service': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-processing-converters': 0.20.0-next.0 - '@3sixty/data-processing-extractors': 0.20.0-next.0 - '@3sixty/data-processing-models': 0.20.0-next.0 - '@3sixty/data-processing-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/data-processing-service': 0.20.0-next.0 - '@3sixty/dataspace-control-plane-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/dataspace-control-plane-service': 0.20.0-next.0 - '@3sixty/dataspace-data-plane-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/dataspace-data-plane-service': 0.20.0-next.0 - '@3sixty/dataspace-data-plane-socket-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/dataspace-models': 0.20.0-next.0 - '@3sixty/dlt-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/document-management-models': 0.20.0-next.0 - '@3sixty/document-management-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/document-management-service': 0.20.0-next.0 - '@3sixty/engine-core': 0.20.0-next.1 - '@3sixty/engine-models': 0.20.0-next.1 - '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-connector-cosmosdb': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/entity-storage-connector-dynamodb': 0.20.0-next.0 - '@3sixty/entity-storage-connector-file': 0.20.0-next.0 - '@3sixty/entity-storage-connector-gcp-firestore': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/entity-storage-connector-memory': 0.20.0-next.0 - '@3sixty/entity-storage-connector-mongodb': 0.20.0-next.0(socks@2.8.10) - '@3sixty/entity-storage-connector-mysql': 0.20.0-next.0(@types/node@26.6.5) - '@3sixty/entity-storage-connector-postgresql': 0.20.0-next.0 - '@3sixty/entity-storage-connector-scylladb': 0.20.0-next.0 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/entity-storage-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/entity-storage-service': 0.20.0-next.0 - '@3sixty/event-bus-connector-local': 0.20.0-next.0 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/event-bus-service': 0.20.0-next.0 - '@3sixty/event-bus-socket-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/federated-catalogue-filters': 0.20.0-next.0 - '@3sixty/federated-catalogue-models': 0.20.0-next.0 - '@3sixty/federated-catalogue-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/federated-catalogue-service': 0.20.0-next.0 - '@3sixty/identity-connector-entity-storage': 0.20.0-next.0 - '@3sixty/identity-connector-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/identity-connector-universal': 0.20.0-next.0 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/identity-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/identity-service': 0.20.0-next.0 - '@3sixty/immutable-proof-models': 0.20.0-next.0 - '@3sixty/immutable-proof-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/immutable-proof-service': 0.20.0-next.0 - '@3sixty/logging-connector-console': 0.20.0-next.0 - '@3sixty/logging-connector-elk': 0.20.0-next.0 - '@3sixty/logging-connector-entity-storage': 0.20.0-next.0 - '@3sixty/logging-connector-file': 0.20.0-next.0 - '@3sixty/logging-connector-opentelemetry': 0.20.0-next.0(@opentelemetry/api@1.9.1) - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/logging-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/logging-service': 0.20.0-next.0 - '@3sixty/mailbox-connector-gmail': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/mailbox-connector-imap': 0.20.0-next.0 - '@3sixty/mailbox-connector-outlook': 0.20.0-next.0(buffer@6.0.3) - '@3sixty/mailbox-connector-pop3': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 - '@3sixty/mailbox-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/mailbox-service': 0.20.0-next.0 - '@3sixty/messaging-connector-aws': 0.20.0-next.0 - '@3sixty/messaging-connector-entity-storage': 0.20.0-next.0 - '@3sixty/messaging-connector-smtp': 0.20.0-next.0 - '@3sixty/messaging-models': 0.20.0-next.0 - '@3sixty/messaging-service': 0.20.0-next.0 - '@3sixty/modules': 0.20.0-next.2 - '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/nft-connector-entity-storage': 0.20.0-next.0 - '@3sixty/nft-connector-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/nft-models': 0.20.0-next.0 - '@3sixty/nft-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/nft-service': 0.20.0-next.0 - '@3sixty/notarization-connector-entity-storage': 0.20.0-next.0 - '@3sixty/notarization-connector-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/notarization-models': 0.20.0-next.0 - '@3sixty/notarization-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/notarization-service': 0.20.0-next.0 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/rights-management-pap-service': 0.20.0-next.0 - '@3sixty/rights-management-pdp-service': 0.20.0-next.0 - '@3sixty/rights-management-pep-service': 0.20.0-next.0 - '@3sixty/rights-management-pip-service': 0.20.0-next.0 - '@3sixty/rights-management-plugins': 0.20.0-next.0 - '@3sixty/rights-management-pmp-service': 0.20.0-next.0 - '@3sixty/rights-management-pnp-service': 0.20.0-next.0 - '@3sixty/rights-management-pxp-service': 0.20.0-next.0 - '@3sixty/rights-management-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/rights-management-service': 0.20.0-next.0 - '@3sixty/telemetry-connector-entity-storage': 0.20.0-next.0 - '@3sixty/telemetry-connector-opentelemetry': 0.20.0-next.0 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/telemetry-producers': 0.20.0-next.0 - '@3sixty/telemetry-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/telemetry-service': 0.20.0-next.0 - '@3sixty/tracing-connector-console': 0.20.0-next.0 - '@3sixty/tracing-connector-entity-storage': 0.20.0-next.0 - '@3sixty/tracing-connector-opentelemetry': 0.20.0-next.0 - '@3sixty/tracing-facades': 0.20.0-next.0 - '@3sixty/tracing-models': 0.20.0-next.0 - '@3sixty/tracing-processors': 0.20.0-next.0 - '@3sixty/tracing-rest-client': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/tracing-service': 0.20.0-next.0 - '@3sixty/trust-generators': 0.20.0-next.0 - '@3sixty/trust-models': 0.20.0-next.0 - '@3sixty/trust-service': 0.20.0-next.0 - '@3sixty/trust-verifiers': 0.20.0-next.0 - '@3sixty/vault-connector-entity-storage': 0.20.0-next.0 - '@3sixty/vault-connector-hashicorp': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 - '@3sixty/wallet-connector-entity-storage': 0.20.0-next.0 - '@3sixty/wallet-connector-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/data-processing-converters': 0.20.0-next.1 + '@3sixty/data-processing-extractors': 0.20.0-next.1 + '@3sixty/data-processing-models': 0.20.0-next.1 + '@3sixty/data-processing-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/data-processing-service': 0.20.0-next.1 + '@3sixty/dataspace-control-plane-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/dataspace-control-plane-service': 0.20.0-next.1 + '@3sixty/dataspace-data-plane-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/dataspace-data-plane-service': 0.20.0-next.1 + '@3sixty/dataspace-data-plane-socket-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/dataspace-models': 0.20.0-next.1 + '@3sixty/dlt-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/document-management-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/document-management-service': 0.20.0-next.1 + '@3sixty/engine-models': 0.20.0-next.2 + '@3sixty/entity-storage-connector-cosmosdb': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/entity-storage-connector-dynamodb': 0.20.0-next.1 + '@3sixty/entity-storage-connector-file': 0.20.0-next.1 + '@3sixty/entity-storage-connector-gcp-firestore': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/entity-storage-connector-memory': 0.20.0-next.1 + '@3sixty/entity-storage-connector-mongodb': 0.20.0-next.1(socks@2.8.10) + '@3sixty/entity-storage-connector-mysql': 0.20.0-next.1(@types/node@26.6.5) + '@3sixty/entity-storage-connector-postgresql': 0.20.0-next.1 + '@3sixty/entity-storage-connector-scylladb': 0.20.0-next.1 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/entity-storage-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/entity-storage-service': 0.20.0-next.1 + '@3sixty/event-bus-connector-local': 0.20.0-next.1 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/event-bus-service': 0.20.0-next.1 + '@3sixty/event-bus-socket-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/federated-catalogue-filters': 0.20.0-next.1 + '@3sixty/federated-catalogue-models': 0.20.0-next.1 + '@3sixty/federated-catalogue-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/federated-catalogue-service': 0.20.0-next.1 + '@3sixty/identity-connector-entity-storage': 0.20.0-next.1 + '@3sixty/identity-connector-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/identity-connector-universal': 0.20.0-next.1 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/identity-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/identity-service': 0.20.0-next.1 + '@3sixty/immutable-proof-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/immutable-proof-service': 0.20.0-next.1 + '@3sixty/logging-connector-console': 0.20.0-next.1 + '@3sixty/logging-connector-elk': 0.20.0-next.1 + '@3sixty/logging-connector-entity-storage': 0.20.0-next.1 + '@3sixty/logging-connector-file': 0.20.0-next.1 + '@3sixty/logging-connector-opentelemetry': 0.20.0-next.1(@opentelemetry/api@1.9.1) + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/logging-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/logging-service': 0.20.0-next.1 + '@3sixty/mailbox-connector-gmail': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/mailbox-connector-imap': 0.20.0-next.1 + '@3sixty/mailbox-connector-outlook': 0.20.0-next.1(buffer@6.0.3) + '@3sixty/mailbox-connector-pop3': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 + '@3sixty/mailbox-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/mailbox-service': 0.20.0-next.1 + '@3sixty/messaging-connector-aws': 0.20.0-next.1 + '@3sixty/messaging-connector-entity-storage': 0.20.0-next.1 + '@3sixty/messaging-connector-smtp': 0.20.0-next.1 + '@3sixty/messaging-models': 0.20.0-next.1 + '@3sixty/messaging-service': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/nft-connector-entity-storage': 0.20.0-next.1 + '@3sixty/nft-connector-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/nft-models': 0.20.0-next.1 + '@3sixty/nft-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/nft-service': 0.20.0-next.1 + '@3sixty/notarization-connector-entity-storage': 0.20.0-next.1 + '@3sixty/notarization-connector-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/notarization-models': 0.20.0-next.1 + '@3sixty/notarization-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/notarization-service': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/rights-management-pap-service': 0.20.0-next.1 + '@3sixty/rights-management-pdp-service': 0.20.0-next.1 + '@3sixty/rights-management-pep-service': 0.20.0-next.1 + '@3sixty/rights-management-pip-service': 0.20.0-next.1 + '@3sixty/rights-management-plugins': 0.20.0-next.1 + '@3sixty/rights-management-pmp-service': 0.20.0-next.1 + '@3sixty/rights-management-pnp-service': 0.20.0-next.1 + '@3sixty/rights-management-pxp-service': 0.20.0-next.1 + '@3sixty/rights-management-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/rights-management-service': 0.20.0-next.1 + '@3sixty/telemetry-connector-entity-storage': 0.20.0-next.1 + '@3sixty/telemetry-connector-opentelemetry': 0.20.0-next.1 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/telemetry-producers': 0.20.0-next.1 + '@3sixty/telemetry-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/telemetry-service': 0.20.0-next.1 + '@3sixty/tracing-connector-console': 0.20.0-next.1 + '@3sixty/tracing-connector-entity-storage': 0.20.0-next.1 + '@3sixty/tracing-connector-opentelemetry': 0.20.0-next.1 + '@3sixty/tracing-facades': 0.20.0-next.1 + '@3sixty/tracing-models': 0.20.0-next.1 + '@3sixty/tracing-processors': 0.20.0-next.1 + '@3sixty/tracing-rest-client': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/tracing-service': 0.20.0-next.1 + '@3sixty/trust-generators': 0.20.0-next.1 + '@3sixty/trust-models': 0.20.0-next.1 + '@3sixty/trust-service': 0.20.0-next.1 + '@3sixty/trust-verifiers': 0.20.0-next.1 + '@3sixty/vault-connector-entity-storage': 0.20.0-next.1 + '@3sixty/vault-connector-hashicorp': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 + '@3sixty/wallet-connector-entity-storage': 0.20.0-next.1 + '@3sixty/wallet-connector-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/wallet-models': 0.20.0-next.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@azure/identity' @@ -6810,13 +6842,12 @@ snapshots: - typescript - utf-8-validate - '@3sixty/engine@0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': + '@3sixty/engine@0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/engine-core': 0.20.0-next.1 - '@3sixty/engine-models': 0.20.0-next.1 - '@3sixty/engine-types': 0.20.0-next.1(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) + '@3sixty/engine-core': 0.20.0-next.2 + '@3sixty/engine-models': 0.20.0-next.2 + '@3sixty/engine-types': 0.20.0-next.2(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(buffer@6.0.3)(socks@2.8.10)(supports-color@10.2.2)(typescript@6.0.3) '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 transitivePeerDependencies: @@ -6841,76 +6872,76 @@ snapshots: - typescript - utf-8-validate - '@3sixty/entity-storage-connector-cosmosdb@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/entity-storage-connector-cosmosdb@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@azure/cosmos': 4.10.1(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@3sixty/entity-storage-connector-dynamodb@0.20.0-next.0': + '@3sixty/entity-storage-connector-dynamodb@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@aws-sdk/client-dynamodb': 3.1137.0 - '@aws-sdk/lib-dynamodb': 3.1137.0(@aws-sdk/client-dynamodb@3.1137.0) - '@aws-sdk/util-dynamodb': 3.996.9(@aws-sdk/client-dynamodb@3.1137.0) + '@aws-sdk/client-dynamodb': 3.1153.0 + '@aws-sdk/lib-dynamodb': 3.1153.0(@aws-sdk/client-dynamodb@3.1153.0) + '@aws-sdk/util-dynamodb': 3.996.9(@aws-sdk/client-dynamodb@3.1153.0) - '@3sixty/entity-storage-connector-file@0.20.0-next.0': + '@3sixty/entity-storage-connector-file@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/entity-storage-connector-gcp-firestore@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/entity-storage-connector-gcp-firestore@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@google-cloud/firestore': 9.2.0(supports-color@10.2.2) - google-auth-library: 11.1.0(supports-color@10.2.2) + '@google-cloud/firestore': 9.3.1(supports-color@10.2.2) + google-auth-library: 11.3.1(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@3sixty/entity-storage-connector-memory@0.20.0-next.0': + '@3sixty/entity-storage-connector-memory@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/entity-storage-connector-mongodb@0.20.0-next.0(socks@2.8.10)': + '@3sixty/entity-storage-connector-mongodb@0.20.0-next.1(socks@2.8.10)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - mongodb: 7.6.0(socks@2.8.10) + mongodb: 7.7.0(socks@2.8.10) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' @@ -6920,58 +6951,58 @@ snapshots: - snappy - socks - '@3sixty/entity-storage-connector-mysql@0.20.0-next.0(@types/node@26.6.5)': + '@3sixty/entity-storage-connector-mysql@0.20.0-next.1(@types/node@26.6.5)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - mysql2: 3.24.4(@types/node@26.6.5) + mysql2: 3.24.6(@types/node@26.6.5) transitivePeerDependencies: - '@types/node' - '@3sixty/entity-storage-connector-postgresql@0.20.0-next.0': + '@3sixty/entity-storage-connector-postgresql@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 postgres: 3.4.9 - '@3sixty/entity-storage-connector-scylladb@0.20.0-next.0': + '@3sixty/entity-storage-connector-scylladb@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - cassandra-driver: 4.9.0 + cassandra-driver: 4.10.0 - '@3sixty/entity-storage-models@0.20.0-next.0': + '@3sixty/entity-storage-models@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/entity-storage-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/entity-storage-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: @@ -6979,14 +7010,14 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/entity-storage-service@0.20.0-next.0': + '@3sixty/entity-storage-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 @@ -6997,133 +7028,133 @@ snapshots: reflect-metadata: 0.2.2 tslib: 2.8.1 - '@3sixty/event-bus-connector-local@0.20.0-next.0': + '@3sixty/event-bus-connector-local@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/event-bus-models@0.20.0-next.0': + '@3sixty/event-bus-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/event-bus-service@0.20.0-next.0': + '@3sixty/event-bus-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/event-bus-socket-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/event-bus-socket-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/federated-catalogue-filters@0.20.0-next.0': + '@3sixty/federated-catalogue-filters@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/federated-catalogue-models': 0.20.0-next.0 - '@3sixty/federated-catalogue-service': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/federated-catalogue-models': 0.20.0-next.1 + '@3sixty/federated-catalogue-service': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/federated-catalogue-models@0.20.0-next.0': + '@3sixty/federated-catalogue-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/federated-catalogue-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/federated-catalogue-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/federated-catalogue-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/federated-catalogue-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/federated-catalogue-service@0.20.0-next.0': + '@3sixty/federated-catalogue-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/federated-catalogue-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-dublin-core': 0.20.0-next.1 - '@3sixty/standards-foaf': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/trust-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/federated-catalogue-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-dublin-core': 0.20.0-next.2 + '@3sixty/standards-foaf': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/trust-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/identity-connector-entity-storage@0.20.0-next.0': + '@3sixty/identity-connector-entity-storage@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/identity-connector-iota@0.20.0-next.0(typescript@6.0.3)': + '@3sixty/identity-connector-iota@0.20.0-next.1(typescript@6.0.3)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 - '@3sixty/dlt-iota': 0.20.0-next.0(typescript@6.0.3) + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dlt-account': 0.20.0-next.1 + '@3sixty/dlt-iota': 0.20.0-next.1(typescript@6.0.3) '@3sixty/entity': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@iota/identity-wasm': 1.9.6-beta.1(@iota/iota-sdk@1.15.0(typescript@6.0.3)) '@iota/iota-interaction-ts': 0.14.0(@iota/iota-sdk@1.15.0(typescript@6.0.3)) @@ -7134,80 +7165,81 @@ snapshots: - encoding - typescript - '@3sixty/identity-connector-universal@0.20.0-next.0': + '@3sixty/identity-connector-universal@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/standards-w3c-did': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/identity-models@0.20.0-next.0': + '@3sixty/identity-models@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/identity-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/identity-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/standards-w3c-did': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/identity-service@0.20.0-next.0': + '@3sixty/identity-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/authorization-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/dlt-account': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 + '@3sixty/wallet-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/immutable-proof-models@0.20.0-next.0': + '@3sixty/immutable-proof-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/immutable-proof-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/immutable-proof-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/immutable-proof-models': 0.20.0-next.0 + '@3sixty/immutable-proof-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: @@ -7215,98 +7247,98 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/immutable-proof-service@0.20.0-next.0': + '@3sixty/immutable-proof-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/event-bus-models': 0.20.0-next.0 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/immutable-proof-models': 0.20.0-next.0 - '@3sixty/immutable-proof-task': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/notarization-models': 0.20.0-next.0 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/event-bus-models': 0.20.0-next.1 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/immutable-proof-models': 0.20.0-next.1 + '@3sixty/immutable-proof-task': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/nameof': 0.20.0-next.2 + '@3sixty/notarization-models': 0.20.0-next.1 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/immutable-proof-task@0.20.0-next.0': + '@3sixty/immutable-proof-task@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/immutable-proof-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/immutable-proof-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/notarization-models': 0.20.0-next.0 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/notarization-models': 0.20.0-next.1 + '@3sixty/standards-w3c-did': 0.20.0-next.2 - '@3sixty/logging-connector-console@0.20.0-next.0': + '@3sixty/logging-connector-console@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/logging-connector-elk@0.20.0-next.0': + '@3sixty/logging-connector-elk@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/logging-connector-entity-storage@0.20.0-next.0': + '@3sixty/logging-connector-entity-storage@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/logging-connector-file@0.20.0-next.0': + '@3sixty/logging-connector-file@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/logging-connector-opentelemetry@0.20.0-next.0(@opentelemetry/api@1.9.1)': + '@3sixty/logging-connector-opentelemetry@0.20.0-next.1(@opentelemetry/api@1.9.1)': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@opentelemetry/api-logs': 0.222.0 - '@opentelemetry/exporter-logs-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.223.0 + '@opentelemetry/exporter-logs-otlp-http': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.223.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 transitivePeerDependencies: - '@opentelemetry/api' - '@3sixty/logging-models@0.20.0-next.0': + '@3sixty/logging-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/logging-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/logging-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: @@ -7314,46 +7346,46 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/logging-service@0.20.0-next.0': + '@3sixty/logging-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/mailbox-connector-gmail@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/mailbox-connector-gmail@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - googleapis: 181.0.0(supports-color@10.2.2) + googleapis: 186.0.0(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@3sixty/mailbox-connector-imap@0.20.0-next.0': + '@3sixty/mailbox-connector-imap@0.20.0-next.1': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - imapflow: 2.0.5 + imapflow: 2.5.8 - '@3sixty/mailbox-connector-outlook@0.20.0-next.0(buffer@6.0.3)': + '@3sixty/mailbox-connector-outlook@0.20.0-next.1(buffer@6.0.3)': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@azure/msal-node': 6.0.1 + '@azure/msal-node': 7.1.0 '@microsoft/microsoft-graph-client': 3.0.7(buffer@6.0.3) transitivePeerDependencies: - '@azure/identity' @@ -7361,31 +7393,31 @@ snapshots: - buffer - stream-browserify - '@3sixty/mailbox-connector-pop3@0.20.0-next.0': + '@3sixty/mailbox-connector-pop3@0.20.0-next.1': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 node-pop3: 0.15.3 - '@3sixty/mailbox-models@0.20.0-next.0': + '@3sixty/mailbox-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - postal-mime: 3.0.0 + postal-mime: 4.0.11 - '@3sixty/mailbox-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/mailbox-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: @@ -7393,19 +7425,19 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/mailbox-service@0.20.0-next.0': + '@3sixty/mailbox-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/mailbox-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/mailbox-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@3sixty/merge-locales@0.20.0-next.2': @@ -7416,46 +7448,46 @@ snapshots: commander: 15.0.0 glob: 13.0.6 - '@3sixty/messaging-connector-aws@0.20.0-next.0': + '@3sixty/messaging-connector-aws@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/messaging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/messaging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@aws-sdk/client-ses': 3.1137.0 - '@aws-sdk/client-sns': 3.1137.0 + '@aws-sdk/client-ses': 3.1153.0 + '@aws-sdk/client-sns': 3.1153.0 - '@3sixty/messaging-connector-entity-storage@0.20.0-next.0': + '@3sixty/messaging-connector-entity-storage@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/messaging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/messaging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/messaging-connector-smtp@0.20.0-next.0': + '@3sixty/messaging-connector-smtp@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/messaging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/messaging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - nodemailer: 10.0.10 + nodemailer: 10.1.7 - '@3sixty/messaging-models@0.20.0-next.0': + '@3sixty/messaging-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/messaging-service@0.20.0-next.0': + '@3sixty/messaging-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 - '@3sixty/messaging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 + '@3sixty/messaging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/modules@0.20.0-next.2': @@ -7491,41 +7523,41 @@ snapshots: '@3sixty/nameof@0.20.0-next.2': {} - '@3sixty/nft-connector-entity-storage@0.20.0-next.0': + '@3sixty/nft-connector-entity-storage@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/nft-models': 0.20.0-next.0 + '@3sixty/nft-models': 0.20.0-next.1 - '@3sixty/nft-connector-iota@0.20.0-next.0(typescript@6.0.3)': + '@3sixty/nft-connector-iota@0.20.0-next.1(typescript@6.0.3)': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 - '@3sixty/dlt-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/dlt-account': 0.20.0-next.1 + '@3sixty/dlt-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/nft-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/nft-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 transitivePeerDependencies: - '@gql.tada/svelte-support' - '@gql.tada/vue-support' - encoding - typescript - '@3sixty/nft-models@0.20.0-next.0': + '@3sixty/nft-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/nft-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/nft-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 @@ -7535,36 +7567,36 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/nft-service@0.20.0-next.0': + '@3sixty/nft-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/nft-models': 0.20.0-next.0 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/nft-models': 0.20.0-next.1 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/notarization-connector-entity-storage@0.20.0-next.0': + '@3sixty/notarization-connector-entity-storage@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/notarization-models': 0.20.0-next.0 + '@3sixty/notarization-models': 0.20.0-next.1 - '@3sixty/notarization-connector-iota@0.20.0-next.0(typescript@6.0.3)': + '@3sixty/notarization-connector-iota@0.20.0-next.1(typescript@6.0.3)': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 - '@3sixty/dlt-iota': 0.20.0-next.0(typescript@6.0.3) - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/dlt-account': 0.20.0-next.1 + '@3sixty/dlt-iota': 0.20.0-next.1(typescript@6.0.3) + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/notarization-models': 0.20.0-next.0 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/notarization-models': 0.20.0-next.1 + '@3sixty/vault-models': 0.20.0-next.1 '@iota/iota-sdk': 1.15.0(typescript@6.0.3) '@iota/notarization': 0.1.14(@iota/iota-sdk@1.15.0(typescript@6.0.3)) transitivePeerDependencies: @@ -7573,17 +7605,17 @@ snapshots: - encoding - typescript - '@3sixty/notarization-models@0.20.0-next.0': + '@3sixty/notarization-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/notarization-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/notarization-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 @@ -7593,295 +7625,295 @@ snapshots: - supports-color - utf-8-validate - '@3sixty/notarization-service@0.20.0-next.0': + '@3sixty/notarization-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/notarization-models': 0.20.0-next.0 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/notarization-models': 0.20.0-next.1 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/rights-management-models@0.20.0-next.0': + '@3sixty/rights-management-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/engine-models': 0.20.0-next.1 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/engine-models': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 + '@3sixty/identity-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/rights-management-pap-service@0.20.0-next.0': + '@3sixty/rights-management-pap-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-pdp-service@0.20.0-next.0': + '@3sixty/rights-management-pdp-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-pep-service@0.20.0-next.0': + '@3sixty/rights-management-pep-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-pip-service@0.20.0-next.0': + '@3sixty/rights-management-pip-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-plugins@0.20.0-next.0': + '@3sixty/rights-management-plugins@0.20.0-next.1': dependencies: - '@3sixty/automation-models': 0.20.0-next.0 + '@3sixty/automation-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/data-json-path': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/data-json-path': 0.20.0-next.3 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-pmp-service@0.20.0-next.0': + '@3sixty/rights-management-pmp-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 + '@3sixty/rights-management-models': 0.20.0-next.1 - '@3sixty/rights-management-pnp-service@0.20.0-next.0': + '@3sixty/rights-management-pnp-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 + '@3sixty/trust-models': 0.20.0-next.1 - '@3sixty/rights-management-pxp-service@0.20.0-next.0': + '@3sixty/rights-management-pxp-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 - '@3sixty/rights-management-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/rights-management-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/rights-management-service@0.20.0-next.0': + '@3sixty/rights-management-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/rights-management-models': 0.20.0-next.0 - '@3sixty/standards-dataspace-protocol': 0.20.0-next.1 - '@3sixty/standards-w3c-did': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/rights-management-models': 0.20.0-next.1 + '@3sixty/standards-dataspace-protocol': 0.20.0-next.2 + '@3sixty/standards-w3c-did': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/standards-dataspace-protocol@0.20.0-next.1': + '@3sixty/standards-dataspace-protocol@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-dublin-core': 0.20.0-next.1 - '@3sixty/standards-foaf': 0.20.0-next.1 - '@3sixty/standards-w3c-dcat': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/standards-dublin-core': 0.20.0-next.2 + '@3sixty/standards-foaf': 0.20.0-next.2 + '@3sixty/standards-w3c-dcat': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/standards-dublin-core@0.20.0-next.1': + '@3sixty/standards-dublin-core@0.20.0-next.2': dependencies: - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/web': 0.20.0-next.2 - '@3sixty/standards-foaf@0.20.0-next.1': + '@3sixty/standards-foaf@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 - '@3sixty/standards-schema-org@0.20.0-next.1': + '@3sixty/standards-schema-org@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - schema-dts: 2.0.0 + schema-dts: 2.1.0 - '@3sixty/standards-unece@0.20.0-next.1': + '@3sixty/standards-unece@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/standards-w3c-activity-streams@0.20.0-next.1': + '@3sixty/standards-w3c-activity-streams@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 - '@3sixty/standards-w3c-dcat@0.20.0-next.1': + '@3sixty/standards-w3c-dcat@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/standards-dublin-core': 0.20.0-next.1 - '@3sixty/standards-foaf': 0.20.0-next.1 - '@3sixty/standards-w3c-odrl': 0.20.0-next.1 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/standards-dublin-core': 0.20.0-next.2 + '@3sixty/standards-foaf': 0.20.0-next.2 + '@3sixty/standards-w3c-odrl': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/standards-w3c-did@0.20.0-next.1': + '@3sixty/standards-w3c-did@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/standards-w3c-odrl@0.20.0-next.1': + '@3sixty/standards-w3c-odrl@0.20.0-next.2': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-core': 0.20.0-next.3 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/web': 0.20.0-next.2 - '@3sixty/telemetry-connector-entity-storage@0.20.0-next.0': + '@3sixty/telemetry-connector-entity-storage@0.20.0-next.1': dependencies: - '@3sixty/background-task-models': 0.20.0-next.0 + '@3sixty/background-task-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/modules': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 - '@3sixty/telemetry-connector-opentelemetry@0.20.0-next.0': + '@3sixty/telemetry-connector-opentelemetry@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-connector-entity-storage': 0.20.0-next.0 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-connector-entity-storage': 0.20.0-next.1 + '@3sixty/telemetry-models': 0.20.0-next.1 '@opentelemetry/api': 1.9.1 - '@opentelemetry/exporter-metrics-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-prometheus': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.12.0(@opentelemetry/api@1.9.1) - '@3sixty/telemetry-models@0.20.0-next.0': + '@3sixty/telemetry-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-processors@0.20.0-next.0': + '@3sixty/telemetry-processors@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 - '@3sixty/telemetry-producers@0.20.0-next.0': + '@3sixty/telemetry-producers@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 - '@3sixty/telemetry-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/telemetry-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/telemetry-service@0.20.0-next.0': + '@3sixty/telemetry-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/telemetry-models': 0.20.0-next.0 + '@3sixty/telemetry-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@3sixty/tools-core@0.20.0-next.4': @@ -7898,119 +7930,119 @@ snapshots: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-connector-console@0.20.0-next.0': + '@3sixty/tracing-connector-console@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 - '@3sixty/tracing-connector-entity-storage@0.20.0-next.0': + '@3sixty/tracing-connector-entity-storage@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-connector-memory': 0.20.0-next.0 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-connector-memory': 0.20.0-next.1 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 - '@3sixty/tracing-connector-opentelemetry@0.20.0-next.0': + '@3sixty/tracing-connector-opentelemetry@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-proto': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 - '@3sixty/tracing-facades@0.20.0-next.0': + '@3sixty/tracing-facades@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 - '@3sixty/tracing-models@0.20.0-next.0': + '@3sixty/tracing-models@0.20.0-next.1': dependencies: '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-processors@0.20.0-next.0': + '@3sixty/tracing-processors@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/tracing-rest-client@0.20.0-next.0(supports-color@10.2.2)': + '@3sixty/tracing-rest-client@0.20.0-next.1(supports-color@10.2.2)': dependencies: - '@3sixty/api-core': 0.20.0-next.0(supports-color@10.2.2) - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-core': 0.20.0-next.1(supports-color@10.2.2) + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@3sixty/tracing-service@0.20.0-next.0': + '@3sixty/tracing-service@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/tracing-models': 0.20.0-next.0 + '@3sixty/tracing-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/trust-generators@0.20.0-next.0': + '@3sixty/trust-generators@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/trust-models@0.20.0-next.0': + '@3sixty/trust-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 + '@3sixty/data-json-ld': 0.20.0-next.3 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/trust-service@0.20.0-next.0': + '@3sixty/trust-service@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/trust-models': 0.20.0-next.1 - '@3sixty/trust-verifiers@0.20.0-next.0': + '@3sixty/trust-verifiers@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/data-json-ld': 0.20.0-next.2 - '@3sixty/identity-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/data-json-ld': 0.20.0-next.3 + '@3sixty/identity-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/trust-models': 0.20.0-next.0 + '@3sixty/trust-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 '@3sixty/ts-to-openapi@0.20.0-next.4': @@ -8034,63 +8066,63 @@ snapshots: glob: 13.0.6 typescript: 6.0.3 - '@3sixty/vault-connector-entity-storage@0.20.0-next.0': + '@3sixty/vault-connector-entity-storage@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 - '@3sixty/vault-connector-hashicorp@0.20.0-next.0': + '@3sixty/vault-connector-hashicorp@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 - '@3sixty/logging-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 + '@3sixty/logging-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 '@3sixty/web': 0.20.0-next.2 - '@3sixty/vault-models@0.20.0-next.0': + '@3sixty/vault-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/nameof': 0.20.0-next.2 '@3sixty/web': 0.20.0-next.2 - '@3sixty/wallet-connector-entity-storage@0.20.0-next.0': + '@3sixty/wallet-connector-entity-storage@0.20.0-next.1': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 + '@3sixty/dlt-account': 0.20.0-next.1 '@3sixty/entity': 0.20.0-next.2 - '@3sixty/entity-storage-models': 0.20.0-next.0 + '@3sixty/entity-storage-models': 0.20.0-next.1 '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 + '@3sixty/wallet-models': 0.20.0-next.1 - '@3sixty/wallet-connector-iota@0.20.0-next.0(typescript@6.0.3)': + '@3sixty/wallet-connector-iota@0.20.0-next.1(typescript@6.0.3)': dependencies: - '@3sixty/api-models': 0.20.0-next.0 + '@3sixty/api-models': 0.20.0-next.1 '@3sixty/context': 0.20.0-next.2 '@3sixty/core': 0.20.0-next.2 - '@3sixty/dlt-account': 0.20.0-next.0 - '@3sixty/dlt-iota': 0.20.0-next.0(typescript@6.0.3) + '@3sixty/dlt-account': 0.20.0-next.1 + '@3sixty/dlt-iota': 0.20.0-next.1(typescript@6.0.3) '@3sixty/nameof': 0.20.0-next.2 - '@3sixty/vault-models': 0.20.0-next.0 - '@3sixty/wallet-models': 0.20.0-next.0 + '@3sixty/vault-models': 0.20.0-next.1 + '@3sixty/wallet-models': 0.20.0-next.1 transitivePeerDependencies: - '@gql.tada/svelte-support' - '@gql.tada/vue-support' - encoding - typescript - '@3sixty/wallet-models@0.20.0-next.0': + '@3sixty/wallet-models@0.20.0-next.1': dependencies: '@3sixty/core': 0.20.0-next.2 '@3sixty/crypto': 0.20.0-next.2 @@ -8111,7 +8143,7 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/client-dynamodb@3.1137.0': + '@aws-sdk/client-dynamodb@3.1153.0': dependencies: '@aws-sdk/core': 3.978.4 '@aws-sdk/credential-provider-node': 3.972.87 @@ -8124,7 +8156,7 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.1137.0': + '@aws-sdk/client-s3@3.1153.0': dependencies: '@aws-sdk/checksums': 3.1001.4 '@aws-sdk/core': 3.978.4 @@ -8138,7 +8170,7 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/client-ses@3.1137.0': + '@aws-sdk/client-ses@3.1153.0': dependencies: '@aws-sdk/core': 3.978.4 '@aws-sdk/credential-provider-node': 3.972.87 @@ -8149,7 +8181,7 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/client-sns@3.1137.0': + '@aws-sdk/client-sns@3.1153.0': dependencies: '@aws-sdk/core': 3.978.4 '@aws-sdk/credential-provider-node': 3.972.87 @@ -8267,11 +8299,11 @@ snapshots: mnemonist: 0.38.3 tslib: 2.8.1 - '@aws-sdk/lib-dynamodb@3.1137.0(@aws-sdk/client-dynamodb@3.1137.0)': + '@aws-sdk/lib-dynamodb@3.1153.0(@aws-sdk/client-dynamodb@3.1153.0)': dependencies: - '@aws-sdk/client-dynamodb': 3.1137.0 + '@aws-sdk/client-dynamodb': 3.1153.0 '@aws-sdk/core': 3.978.4 - '@aws-sdk/util-dynamodb': 3.996.9(@aws-sdk/client-dynamodb@3.1137.0) + '@aws-sdk/util-dynamodb': 3.996.9(@aws-sdk/client-dynamodb@3.1153.0) '@smithy/core': 3.36.0 '@smithy/types': 4.19.0 tslib: 2.8.1 @@ -8325,9 +8357,9 @@ snapshots: '@smithy/types': 4.19.0 tslib: 2.8.1 - '@aws-sdk/util-dynamodb@3.996.9(@aws-sdk/client-dynamodb@3.1137.0)': + '@aws-sdk/util-dynamodb@3.996.9(@aws-sdk/client-dynamodb@3.1153.0)': dependencies: - '@aws-sdk/client-dynamodb': 3.1137.0 + '@aws-sdk/client-dynamodb': 3.1153.0 tslib: 2.8.1 '@aws-sdk/xml-builder@3.972.41': @@ -8472,14 +8504,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-common@16.14.1': {} + '@azure/msal-common@16.14.2': {} - '@azure/msal-node@6.0.1': + '@azure/msal-node@7.1.0': dependencies: - '@azure/msal-common': 16.14.1 + '@azure/msal-common': 16.14.2 jsonwebtoken: 9.0.3 - '@azure/storage-blob@12.33.0(supports-color@10.2.2)': + '@azure/storage-blob@12.34.0(supports-color@10.2.2)': dependencies: '@azure/abort-controller': 2.2.0 '@azure/core-auth': 1.11.0(supports-color@10.2.2) @@ -8493,6 +8525,7 @@ snapshots: '@azure/core-xml': 1.6.0 '@azure/logger': 1.4.0(supports-color@10.2.2) '@azure/storage-common': 12.5.0(@azure/core-client@1.11.1(supports-color@10.2.2))(supports-color@10.2.2) + apache-arrow: 21.2.0 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: @@ -8986,17 +9019,15 @@ snapshots: ajv-formats: 3.0.1(ajv@8.20.0) fast-uri: 4.2.3 - '@fastify/compress@9.2.0': + '@fastify/compress@9.2.2': dependencies: '@fastify/accept-negotiator': 2.1.1 - fastify-plugin: 6.0.0 + fastify-plugin: 6.0.1 mime-db: 1.54.0 - minipass: 7.1.3 - readable-stream: 4.8.0 - '@fastify/cors@11.3.0': + '@fastify/cors@11.3.1': dependencies: - fastify-plugin: 6.0.0 + fastify-plugin: 6.0.1 toad-cache: 3.7.4 '@fastify/deepmerge@3.2.2': {} @@ -9045,7 +9076,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@google-cloud/firestore@9.2.0(supports-color@10.2.2)': + '@google-cloud/firestore@9.3.1(supports-color@10.2.2)': dependencies: '@google-cloud/firestore-api': 0.2.0(supports-color@10.2.2) '@opentelemetry/api': 1.9.1 @@ -9064,7 +9095,7 @@ snapshots: '@google-cloud/promisify@6.2.0': {} - '@google-cloud/storage@8.2.0(supports-color@10.2.2)': + '@google-cloud/storage@8.4.0(supports-color@10.2.2)': dependencies: '@google-cloud/paginator': 7.2.0 '@google-cloud/projectify': 6.2.0 @@ -9073,15 +9104,14 @@ snapshots: async-retry: 1.3.3 duplexify: 4.1.3 fast-xml-parser: 5.11.2 - gaxios: 6.7.1(supports-color@10.2.2) - google-auth-library: 9.15.1(supports-color@10.2.2) + gaxios: 7.3.1(supports-color@10.2.2) + google-auth-library: 11.3.1(supports-color@10.2.2) html-entities: 2.6.0 mime: 3.0.0 p-limit: 3.1.0 retry-request: 9.1.0 teeny-request: 11.1.1(supports-color@10.2.2) transitivePeerDependencies: - - encoding - supports-color '@gql.tada/cli-utils@1.9.4(@0no-co/graphqlsp@1.17.5(graphql@16.14.2)(typescript@6.0.3))(graphql@16.14.2)(typescript@6.0.3)': @@ -9113,6 +9143,10 @@ snapshots: protobufjs: 7.6.6 yargs: 17.7.3 + '@hono/node-server@2.1.3(hono@4.13.13)': + dependencies: + hono: 4.13.13 + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -9350,89 +9384,89 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@opentelemetry/api-logs@0.222.0': + '@opentelemetry/api-logs@0.223.0': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api@1.9.1': {} - '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/exporter-logs-otlp-http@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-logs-otlp-http@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.223.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-http@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-metrics-otlp-http@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.12.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-prometheus@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-prometheus@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/exporter-trace-otlp-proto@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-trace-otlp-proto@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/otlp-exporter-base': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.12.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/otlp-exporter-base@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.222.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.223.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/otlp-transformer@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.222.0 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.222.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.223.0 + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.223.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.12.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/resources@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-logs@0.223.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.222.0 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.223.0 + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-metrics@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace@2.11.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/semantic-conventions@1.43.0': {} @@ -9664,9 +9698,9 @@ snapshots: '@types/node': 26.6.5 form-data: 4.0.6 - '@types/node@20.19.43': + '@types/node@25.9.9': dependencies: - undici-types: 6.21.0 + undici-types: 7.24.6 '@types/node@26.6.5': dependencies: @@ -9953,11 +9987,11 @@ snapshots: '@xmldom/xmldom@0.8.15': {} - '@zone-eu/mailsplit@5.4.17': + '@zone-eu/mailsplit@5.4.27': dependencies: - libbase64: 1.3.0 - libmime: 5.4.4 - libqp: 2.1.1 + libbase64: 1.4.1 + libmime: 5.5.2 + libqp: 3.0.1 abort-controller@3.0.0: dependencies: @@ -9976,7 +10010,7 @@ snapshots: acorn@8.19.0: {} - adm-zip@0.5.18: {} + adm-zip@0.6.1: {} agent-base@7.1.4: {} @@ -10015,6 +10049,13 @@ snapshots: anynum@1.0.1: {} + apache-arrow@21.2.0: + dependencies: + '@types/node': 25.9.9 + flatbuffers: 25.9.23 + json-with-bigint: 3.5.12 + tslib: 2.8.1 + are-docs-informative@0.1.1: {} argparse@2.0.1: {} @@ -10107,6 +10148,7 @@ snapshots: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + optional: true builtin-modules@5.4.0: {} @@ -10142,10 +10184,9 @@ snapshots: canonicalize@2.1.0: {} - cassandra-driver@4.9.0: + cassandra-driver@4.10.0: dependencies: - '@types/node': 20.19.43 - adm-zip: 0.5.18 + adm-zip: 0.6.1 long: 5.2.5 chai@6.3.0: {} @@ -10185,12 +10226,6 @@ snapshots: ci-info@4.4.0: {} - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -10276,22 +10311,10 @@ snapshots: cookie@2.0.1: {} - copyfiles@2.4.1: - dependencies: - glob: 7.2.3 - minimatch: 3.1.5 - mkdirp: 1.0.4 - noms: 0.0.0 - through2: 2.0.5 - untildify: 4.0.0 - yargs: 16.2.2 - core-js-compat@3.51.0: dependencies: browserslist: 4.29.4 - core-util-is@1.0.3: {} - cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -10830,9 +10853,9 @@ snapshots: strnum: 2.5.1 xml-naming: 0.3.0 - fastify-plugin@6.0.0: {} + fastify-plugin@6.0.1: {} - fastify@5.12.5: + fastify@5.12.7: dependencies: '@fastify/ajv-compiler': 4.0.7 '@fastify/error': 4.2.1 @@ -10899,6 +10922,8 @@ snapshots: flatted: 3.4.4 hookified: 1.15.1 + flatbuffers@25.9.23: {} + flatted@3.4.4: {} foreground-child@3.3.1: @@ -10918,8 +10943,6 @@ snapshots: dependencies: fetch-blob: 3.2.0 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -10927,17 +10950,6 @@ snapshots: functional-red-black-tree@1.0.1: {} - gaxios@6.7.1(supports-color@10.2.2): - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - supports-color - gaxios@7.1.3(supports-color@10.2.2): dependencies: extend: 3.0.2 @@ -10963,15 +10975,6 @@ snapshots: transitivePeerDependencies: - supports-color - gcp-metadata@6.1.1(supports-color@10.2.2): - dependencies: - gaxios: 6.7.1(supports-color@10.2.2) - google-logging-utils: 0.0.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - gcp-metadata@8.1.4(supports-color@10.2.2): dependencies: gaxios: 7.1.3(supports-color@10.2.2) @@ -11043,15 +11046,6 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-directory@5.0.0: dependencies: ini: 6.0.0 @@ -11082,17 +11076,6 @@ snapshots: transitivePeerDependencies: - supports-color - google-auth-library@11.1.0(supports-color@10.2.2): - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 7.3.1(supports-color@10.2.2) - gcp-metadata: 9.2.1(supports-color@10.2.2) - google-logging-utils: 2.1.0 - jws: 4.0.1 - transitivePeerDependencies: - - supports-color - google-auth-library@11.3.1(supports-color@10.2.2): dependencies: base64-js: 1.5.1 @@ -11104,18 +11087,6 @@ snapshots: transitivePeerDependencies: - supports-color - google-auth-library@9.15.1(supports-color@10.2.2): - dependencies: - base64-js: 1.5.1 - ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1(supports-color@10.2.2) - gcp-metadata: 6.1.1(supports-color@10.2.2) - gtoken: 7.1.0(supports-color@10.2.2) - jws: 4.0.1 - transitivePeerDependencies: - - encoding - - supports-color - google-gax@5.0.8(supports-color@10.2.2): dependencies: '@grpc/grpc-js': 1.14.6 @@ -11148,8 +11119,6 @@ snapshots: transitivePeerDependencies: - supports-color - google-logging-utils@0.0.2: {} - google-logging-utils@1.1.3: {} google-logging-utils@2.1.0: {} @@ -11165,7 +11134,7 @@ snapshots: transitivePeerDependencies: - supports-color - googleapis@181.0.0(supports-color@10.2.2): + googleapis@186.0.0(supports-color@10.2.2): dependencies: google-auth-library: 11.3.1(supports-color@10.2.2) googleapis-common: 9.3.1(supports-color@10.2.2) @@ -11188,14 +11157,6 @@ snapshots: graphql@16.14.2: {} - gtoken@7.1.0(supports-color@10.2.2): - dependencies: - gaxios: 6.7.1(supports-color@10.2.2) - jws: 4.0.1 - transitivePeerDependencies: - - encoding - - supports-color - gtoken@8.0.0(supports-color@10.2.2): dependencies: gaxios: 7.3.1(supports-color@10.2.2) @@ -11234,6 +11195,8 @@ snapshots: he@1.2.0: {} + hono@4.13.13: {} + hookified@1.15.1: {} hookified@2.2.0: {} @@ -11268,7 +11231,8 @@ snapshots: dependencies: reserved-identifiers: 1.2.0 - ieee754@1.2.1: {} + ieee754@1.2.1: + optional: true ignore-by-default@1.0.1: {} @@ -11276,14 +11240,14 @@ snapshots: ignore@7.0.13: {} - imapflow@2.0.5: + imapflow@2.5.8: dependencies: - '@zone-eu/mailsplit': 5.4.17 + '@zone-eu/mailsplit': 5.4.27 encoding-japanese: 2.4.0 iconv-lite: 0.7.3 - libbase64: 1.3.0 - libmime: 5.4.4 - libqp: 2.1.1 + libbase64: 1.4.1 + libmime: 5.5.2 + libqp: 3.0.1 pino: 10.3.1 socks: 2.8.10 @@ -11302,11 +11266,6 @@ snapshots: indent-string@5.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@6.0.0: {} @@ -11367,14 +11326,8 @@ snapshots: is-safe-filename@0.1.1: {} - is-stream@2.0.1: {} - is-unsafe@2.0.2: {} - isarray@0.0.1: {} - - isarray@1.0.0: {} - isexe@2.0.0: {} jackspeak@3.4.3: @@ -11429,6 +11382,8 @@ snapshots: json-stringify-safe@5.0.1: {} + json-with-bigint@3.5.12: {} + jsonc-parser@3.3.1: {} jsonld@9.0.0: @@ -11487,16 +11442,16 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libbase64@1.3.0: {} + libbase64@1.4.1: {} - libmime@5.4.4: + libmime@5.5.2: dependencies: encoding-japanese: 2.4.0 iconv-lite: 0.7.3 - libbase64: 1.3.0 - libqp: 2.1.1 + libbase64: 1.4.1 + libqp: 3.0.1 - libqp@2.1.1: {} + libqp@3.0.1: {} light-my-request@6.8.0: dependencies: @@ -11944,8 +11899,6 @@ snapshots: minipass@7.1.3: {} - mkdirp@1.0.4: {} - mnemonist@0.38.3: dependencies: obliterator: 1.6.1 @@ -11957,7 +11910,7 @@ snapshots: '@types/whatwg-url': 13.0.0 whatwg-url: 14.2.0 - mongodb@7.6.0(socks@2.8.10): + mongodb@7.7.0(socks@2.8.10): dependencies: '@mongodb-js/saslprep': 1.6.1 bson: 7.3.3 @@ -11969,7 +11922,7 @@ snapshots: ms@2.1.3: {} - mysql2@3.24.4(@types/node@26.6.5): + mysql2@3.24.6(@types/node@26.6.5): dependencies: '@types/node': 26.6.5 aws-ssl-profiles: 1.1.2 @@ -12015,7 +11968,7 @@ snapshots: node-releases@2.0.59: {} - nodemailer@10.0.10: {} + nodemailer@10.1.7: {} nodemon@3.1.14: dependencies: @@ -12030,11 +11983,6 @@ snapshots: touch: 3.1.1 undefsafe: 2.0.5 - noms@0.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 - normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -12141,8 +12089,6 @@ snapshots: path-expression-matcher@1.6.2: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -12199,7 +12145,7 @@ snapshots: pluralize@8.0.0: {} - postal-mime@3.0.0: {} + postal-mime@4.0.11: {} postcss@8.5.31: dependencies: @@ -12219,12 +12165,8 @@ snapshots: priorityqueuejs@2.0.0: {} - process-nextick-args@2.0.1: {} - process-warning@5.1.1: {} - process@0.11.10: {} - proto3-json-serializer@3.0.4: dependencies: protobufjs: 7.6.6 @@ -12294,37 +12236,12 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.8.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.2 @@ -12462,8 +12379,6 @@ snapshots: dependencies: mri: 1.2.0 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-regex2@5.1.2: @@ -12478,10 +12393,6 @@ snapshots: schema-dts-lib@1.1.0: {} - schema-dts@2.0.0: - dependencies: - schema-dts-lib: 1.1.0 - schema-dts@2.1.0: dependencies: schema-dts-lib: 1.1.0 @@ -12557,7 +12468,7 @@ snapshots: - supports-color - utf-8-validate - socket.io-client@4.8.3(supports-color@10.2.2): + socket.io-client@4.8.4(supports-color@10.2.2): dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) @@ -12589,6 +12500,19 @@ snapshots: - supports-color - utf-8-validate + socket.io@4.8.4(supports-color@10.2.2): + dependencies: + accepts: 1.3.8 + cors: 2.8.6 + debug: 4.4.3(supports-color@10.2.2) + engine.io: 6.6.11(supports-color@10.2.2) + socket.io-adapter: 2.5.8(supports-color@10.2.2) + socket.io-parser: 4.2.7(supports-color@10.2.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socks@2.8.10: dependencies: ip-address: 10.7.4 @@ -12671,12 +12595,6 @@ snapshots: get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string_decoder@0.10.31: {} - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -12742,11 +12660,6 @@ snapshots: dependencies: real-require: 1.0.0 - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through@2.3.8: {} tinybench@6.2.2: {} @@ -12851,7 +12764,7 @@ snapshots: undefsafe@2.0.5: {} - undici-types@6.21.0: {} + undici-types@7.24.6: {} undici-types@8.9.0: {} @@ -12901,8 +12814,6 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - untildify@4.0.0: {} - update-browserslist-db@1.3.4(browserslist@4.29.4): dependencies: browserslist: 4.29.4 @@ -12917,8 +12828,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@9.0.1: {} - valibot@1.5.0(typescript@6.0.3): optionalDependencies: typescript: 6.0.3 @@ -13035,8 +12944,6 @@ snapshots: xpath@0.0.34: {} - xtend@4.0.2: {} - y18n@5.0.8: {} yallist@4.0.0: {} @@ -13049,16 +12956,6 @@ snapshots: yargs-parser@22.0.0: {} - yargs@16.2.2: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.3: dependencies: cliui: 8.0.1