@meshmakers/octo-services 3.5.660 → 3.5.670

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -578,6 +578,239 @@ const IDENTITY_PROVIDER_TYPE_LABELS = {
578
578
  [IdentityProviderType.OctoTenant]: 'Octo Tenant'
579
579
  };
580
580
 
581
+ /**
582
+ * Structural check instead of an `instanceof` test, same rule as `MmHttpErrorInterceptor`: a host with a
583
+ * second `@angular/common` copy sees two class identities, and `instanceof` would answer `false`.
584
+ */
585
+ function isHttpErrorLike(error) {
586
+ return typeof error === 'object'
587
+ && error !== null
588
+ && error.name === 'HttpErrorResponse'
589
+ && typeof error.status === 'number';
590
+ }
591
+ /**
592
+ * Problem codes of the tenant-scoped cross-tenant grant routes (`{tenant}/v1/externalTenantUserMappings`),
593
+ * contract `octo-identity-services/docs/CONCEPT-SIBLING-TENANT-GRANTS.md` §5. Same values as the SDK's
594
+ * `CrossTenantGrantProblemCodes`.
595
+ */
596
+ const CrossTenantGrantProblemCodes = {
597
+ SourceUserNotFound: 'SourceUserNotFound',
598
+ SourceUserLookupRateLimited: 'SourceUserLookupRateLimited',
599
+ SourceTenantNotPermitted: 'SourceTenantNotPermitted',
600
+ UnknownGroup: 'UnknownGroup',
601
+ ExternalTenantUserMappingAlreadyExists: 'ExternalTenantUserMappingAlreadyExists'
602
+ };
603
+ /** Codes of the identity role change guard (AB#7914, AB#7927) that can answer a mapping write. */
604
+ const RoleChangeProblemCodes = ['self-grant', 'role-not-held', 'last-administrator'];
605
+ const DEFAULT_MESSAGES$1 = {
606
+ NotAvailable: 'The identity service does not offer the cross-tenant user lookup yet.',
607
+ SourceUserLookupRateLimited: 'Too many source user lookups. Try again later.',
608
+ SourceTenantNotPermitted: 'The source tenant does not permit granting this user access to this tenant.',
609
+ UnknownGroup: 'At least one group does not exist in this tenant.',
610
+ ExternalTenantUserMappingAlreadyExists: 'This user already has access to this tenant.',
611
+ RoleChangeRefused: 'The role change was refused.',
612
+ Forbidden: 'Access is denied.'
613
+ };
614
+ /**
615
+ * Typed error of the tenant-scoped cross-tenant grant methods of `IdentityService`. It carries only the
616
+ * status, the problem code, the server's title and the documented extensions — never the request body, so a
617
+ * looked-up identifier (user name or e-mail) cannot leak through it.
618
+ */
619
+ class CrossTenantGrantError extends Error {
620
+ kind;
621
+ status;
622
+ problemCode;
623
+ title;
624
+ details;
625
+ name = 'CrossTenantGrantError';
626
+ constructor(kind, status,
627
+ /** The problem `code` extension, when the server sent one. */
628
+ problemCode,
629
+ /** Readable server title (problem `title`, or `message` of the older 403 shape); `null` when none. */
630
+ title, details = {}) {
631
+ super(title ?? DEFAULT_MESSAGES$1[kind]);
632
+ this.kind = kind;
633
+ this.status = status;
634
+ this.problemCode = problemCode;
635
+ this.title = title;
636
+ this.details = details;
637
+ }
638
+ /** Seconds until the next lookup is allowed (`SourceUserLookupRateLimited`), read from the body. */
639
+ get retryAfterSeconds() {
640
+ return this.details.retryAfterSeconds;
641
+ }
642
+ /** Group ids that are no groups of the current tenant (`UnknownGroup`). */
643
+ get unknownGroupIds() {
644
+ return this.details.unknownGroupIds;
645
+ }
646
+ /** Id of the existing mapping (`ExternalTenantUserMappingAlreadyExists`). */
647
+ get existingMappingId() {
648
+ return this.details.existingMappingId;
649
+ }
650
+ /** Built-in roles the caller does not hold (`RoleChangeRefused` with code `role-not-held`). */
651
+ get roleNames() {
652
+ return this.details.roleNames;
653
+ }
654
+ }
655
+ /** Reads the problem body of an error answer; Angular hands it over as object or (unparsed) text. */
656
+ function readProblemBody(error) {
657
+ const body = error.error;
658
+ const isTransportEvent = typeof ProgressEvent !== 'undefined' && body instanceof ProgressEvent;
659
+ const isBlob = typeof Blob !== 'undefined' && body instanceof Blob;
660
+ if (body && typeof body === 'object' && !isTransportEvent && !isBlob) {
661
+ return body;
662
+ }
663
+ if (typeof body === 'string' && body.trim().startsWith('{')) {
664
+ try {
665
+ const parsed = JSON.parse(body);
666
+ return parsed && typeof parsed === 'object' ? parsed : null;
667
+ }
668
+ catch {
669
+ return null;
670
+ }
671
+ }
672
+ return null;
673
+ }
674
+ /** The problem `code` extension of an error answer, or `null` when it has none. */
675
+ function problemCodeOf(error) {
676
+ return asString(readProblemBody(error)?.code);
677
+ }
678
+ function asString(value) {
679
+ return typeof value === 'string' && value.length > 0 ? value : null;
680
+ }
681
+ function asStringArray(value) {
682
+ return Array.isArray(value) ? value.filter((v) => typeof v === 'string') : undefined;
683
+ }
684
+ /**
685
+ * Maps an `HttpErrorResponse` of a cross-tenant grant route to a {@link CrossTenantGrantError}. Returns
686
+ * `null` for answers the contract does not type (401, 5xx, a validation 400, the 404 of an unknown mapping
687
+ * id, `SourceUserNotFound`); the caller then handles or rethrows the original error.
688
+ */
689
+ function toCrossTenantGrantError(error, route) {
690
+ if (!isHttpErrorLike(error)) {
691
+ return null;
692
+ }
693
+ const problem = readProblemBody(error);
694
+ const code = asString(problem?.code);
695
+ const title = asString(problem?.title) ?? asString(problem?.message);
696
+ const status = error.status;
697
+ const make = (kind, details = {}) => new CrossTenantGrantError(kind, status, code, title, details);
698
+ switch (code) {
699
+ case CrossTenantGrantProblemCodes.SourceUserLookupRateLimited: {
700
+ const seconds = Number(problem?.retryAfterSeconds);
701
+ return make('SourceUserLookupRateLimited', { retryAfterSeconds: Number.isFinite(seconds) && seconds > 0 ? Math.ceil(seconds) : undefined });
702
+ }
703
+ case CrossTenantGrantProblemCodes.SourceTenantNotPermitted:
704
+ return make('SourceTenantNotPermitted');
705
+ case CrossTenantGrantProblemCodes.UnknownGroup:
706
+ return make('UnknownGroup', { unknownGroupIds: asStringArray(problem?.unknownGroupIds) ?? [] });
707
+ case CrossTenantGrantProblemCodes.ExternalTenantUserMappingAlreadyExists:
708
+ return make('ExternalTenantUserMappingAlreadyExists', { existingMappingId: asString(problem?.existingMappingId) ?? undefined });
709
+ }
710
+ if (code && RoleChangeProblemCodes.includes(code)) {
711
+ return make('RoleChangeRefused', { roleNames: asStringArray(problem?.roleNames) });
712
+ }
713
+ if (status === 403) {
714
+ return make('Forbidden');
715
+ }
716
+ if (route === 'lookup' && status === 404 && !code) {
717
+ return make('NotAvailable');
718
+ }
719
+ return null;
720
+ }
721
+
722
+ const DEFAULT_MESSAGES = {
723
+ Forbidden: 'You are not allowed to manage the cross-tenant access of this tenant.',
724
+ Invalid: 'The list of tenants was refused.',
725
+ NotAvailable: 'The identity service does not offer cross-tenant access settings yet.',
726
+ Conflict: 'The list was changed by someone else. Reload and try again.',
727
+ PreconditionRequired: 'The list must be read before it can be changed. Reload and try again.'
728
+ };
729
+ /**
730
+ * Typed error of `IdentityService.getCrossTenantGrantPermissions` / `setCrossTenantGrantPermissions`. It carries
731
+ * only the status, the server's title and the validation reasons — never the request body.
732
+ */
733
+ class CrossTenantGrantPermissionsError extends Error {
734
+ kind;
735
+ status;
736
+ title;
737
+ validationErrors;
738
+ currentEtag;
739
+ name = 'CrossTenantGrantPermissionsError';
740
+ constructor(kind, status,
741
+ /** Readable server title, `null` when none. */
742
+ title,
743
+ /** Readable reasons of a `400` validation problem (`Invalid`); empty otherwise. */
744
+ validationErrors = [],
745
+ /** `Conflict`: the `ETag` of the current list as the server sent it with the `412`; `null` otherwise. */
746
+ currentEtag = null) {
747
+ super(validationErrors[0] ?? title ?? DEFAULT_MESSAGES[kind]);
748
+ this.kind = kind;
749
+ this.status = status;
750
+ this.title = title;
751
+ this.validationErrors = validationErrors;
752
+ this.currentEtag = currentEtag;
753
+ }
754
+ }
755
+ /** The HTTP statuses {@link toCrossTenantGrantPermissionsError} types; the caller handles them, not the interceptor. */
756
+ const CROSS_TENANT_GRANT_PERMISSIONS_TYPED_STATUSES = [400, 403, 404, 412, 428];
757
+ function readBody(error) {
758
+ const body = error.error;
759
+ if (typeof body === 'string' && body.trim().startsWith('{')) {
760
+ try {
761
+ const parsed = JSON.parse(body);
762
+ return parsed && typeof parsed === 'object' ? parsed : null;
763
+ }
764
+ catch {
765
+ return null;
766
+ }
767
+ }
768
+ const isTransportEvent = typeof ProgressEvent !== 'undefined' && body instanceof ProgressEvent;
769
+ const isBlob = typeof Blob !== 'undefined' && body instanceof Blob;
770
+ return body && typeof body === 'object' && !isTransportEvent && !isBlob ? body : null;
771
+ }
772
+ /** Flattens the ASP.NET `errors` map (`{ field: [reason, …] }`) into readable reasons. */
773
+ function validationReasons(errors) {
774
+ if (!errors || typeof errors !== 'object') {
775
+ return [];
776
+ }
777
+ return Object.values(errors)
778
+ .flatMap(value => Array.isArray(value) ? value : [value])
779
+ .filter((value) => typeof value === 'string' && value.length > 0);
780
+ }
781
+ /** Reads a response header structurally (no `instanceof`, same rule as {@link isHttpErrorLike}). */
782
+ function readResponseHeader(response, name) {
783
+ const headers = response?.headers;
784
+ const value = typeof headers?.get === 'function' ? headers.get(name) : null;
785
+ return typeof value === 'string' && value.length > 0 ? value : null;
786
+ }
787
+ /**
788
+ * Maps an `HttpErrorResponse` of the allow-list routes to a {@link CrossTenantGrantPermissionsError}. Returns
789
+ * `null` for answers that are not typed (401, 5xx, transport errors); the caller then rethrows the original error.
790
+ */
791
+ function toCrossTenantGrantPermissionsError(error) {
792
+ if (!isHttpErrorLike(error)) {
793
+ return null;
794
+ }
795
+ const body = readBody(error);
796
+ const title = typeof body?.title === 'string' && body.title.length > 0 ? body.title
797
+ : typeof body?.message === 'string' && body.message.length > 0 ? body.message : null;
798
+ switch (error.status) {
799
+ case 400:
800
+ return new CrossTenantGrantPermissionsError('Invalid', 400, title, validationReasons(body?.errors));
801
+ case 403:
802
+ return new CrossTenantGrantPermissionsError('Forbidden', 403, title);
803
+ case 404:
804
+ return new CrossTenantGrantPermissionsError('NotAvailable', 404, title);
805
+ case 412:
806
+ return new CrossTenantGrantPermissionsError('Conflict', 412, title, [], readResponseHeader(error, 'ETag'));
807
+ case 428:
808
+ return new CrossTenantGrantPermissionsError('PreconditionRequired', 428, title);
809
+ default:
810
+ return null;
811
+ }
812
+ }
813
+
581
814
  /**
582
815
  * Communication service DTOs for adapter and pipeline management.
583
816
  */
@@ -6681,6 +6914,210 @@ class IdentityService {
6681
6914
  return null;
6682
6915
  }
6683
6916
  // ========================================
6917
+ // Cross-tenant grants in the current tenant (AB#8427)
6918
+ // Route: {issuer}{currentTenant}/v1/externalTenantUserMappings
6919
+ // Contract: octo-identity-services/docs/CONCEPT-SIBLING-TENANT-GRANTS.md
6920
+ // Every 403 is typed and marked caller-handled (MM_CALLER_HANDLED_STATUSES): the global error
6921
+ // interceptor shows no toast for it, the page shows its own message per `kind`. Untyped errors are
6922
+ // rethrown with the interceptor's default reporting (see callerHandles403).
6923
+ // ========================================
6924
+ /**
6925
+ * Finds exactly one user of a source tenant (a registry ancestor of the current tenant, or a tenant that
6926
+ * permits it) by exact user name or exact e-mail — `POST .../externalTenantUserMappings/sourceUserLookup`
6927
+ * (AB#8341). POST, so the identifier never appears in a URL; this service never logs it.
6928
+ *
6929
+ * @returns The user (no e-mail address), `null` for `404 SourceUserNotFound` — the one answer of every
6930
+ * negative case — and `null` when no identity URL is configured.
6931
+ * @throws CrossTenantGrantError `SourceUserLookupRateLimited` (with `retryAfterSeconds` from the body),
6932
+ * `NotAvailable` (404 without problem code: identity service without AB#8341), `Forbidden`.
6933
+ * @throws HttpErrorResponse for every other answer (401, validation 400, 5xx).
6934
+ */
6935
+ async lookupSourceUser(request) {
6936
+ const baseUrl = await this.getApiBaseUrl();
6937
+ if (!baseUrl) {
6938
+ return null;
6939
+ }
6940
+ const body = { sourceTenantId: request.sourceTenantId, identifier: request.identifier };
6941
+ try {
6942
+ const response = await firstValueFrom(this.httpClient.post(baseUrl + 'externalTenantUserMappings/sourceUserLookup', body, { observe: 'response', context: IdentityService.callerHandles403() }));
6943
+ return response.body;
6944
+ }
6945
+ catch (error) {
6946
+ if (isHttpErrorLike(error) && error.status === 404
6947
+ && problemCodeOf(error) === CrossTenantGrantProblemCodes.SourceUserNotFound) {
6948
+ return null;
6949
+ }
6950
+ throw IdentityService.crossTenantGrantErrorOr(error, 'lookup');
6951
+ }
6952
+ }
6953
+ /**
6954
+ * Grants a user of a source tenant access to the current tenant — `POST .../externalTenantUserMappings`.
6955
+ * `groupIds` (groups of the current tenant, AB#8343) is sent only when set; `null`/`undefined` leaves the
6956
+ * body as before. Take `sourceUserId`/`sourceUserName` from {@link lookupSourceUser}.
6957
+ *
6958
+ * @returns The stored mapping (`groupNames` filled), or `null` when no identity URL is configured.
6959
+ * @throws CrossTenantGrantError `SourceTenantNotPermitted`, `UnknownGroup` (with `unknownGroupIds`),
6960
+ * `ExternalTenantUserMappingAlreadyExists` (with `existingMappingId`), `RoleChangeRefused`, `Forbidden`.
6961
+ * @throws HttpErrorResponse for every other answer.
6962
+ */
6963
+ async createExternalTenantUserMapping(dto) {
6964
+ const baseUrl = await this.getApiBaseUrl();
6965
+ if (!baseUrl) {
6966
+ return null;
6967
+ }
6968
+ const { groupIds, ...rest } = dto;
6969
+ const body = groupIds == null ? rest : { ...rest, groupIds };
6970
+ try {
6971
+ const response = await firstValueFrom(this.httpClient.post(baseUrl + 'externalTenantUserMappings', body, { observe: 'response', context: IdentityService.callerHandles403() }));
6972
+ return response.body;
6973
+ }
6974
+ catch (error) {
6975
+ throw IdentityService.crossTenantGrantErrorOr(error, 'mapping');
6976
+ }
6977
+ }
6978
+ /**
6979
+ * Lists the cross-tenant users granted access to the current tenant (source tenant, user, roles, groups)
6980
+ * — `GET .../externalTenantUserMappings`. `sourceTenantId` filters by source tenant (the server then
6981
+ * ignores `skip`/`take`).
6982
+ *
6983
+ * @returns The mappings, or `null` when no identity URL is configured.
6984
+ * @throws CrossTenantGrantError `Forbidden`; HttpErrorResponse for every other error.
6985
+ */
6986
+ async getExternalTenantUserMappings(options) {
6987
+ const baseUrl = await this.getApiBaseUrl();
6988
+ if (!baseUrl) {
6989
+ return null;
6990
+ }
6991
+ let params = new HttpParams();
6992
+ if (options?.skip != null) {
6993
+ params = params.set('skip', options.skip.toString());
6994
+ }
6995
+ if (options?.take != null) {
6996
+ params = params.set('take', options.take.toString());
6997
+ }
6998
+ if (options?.sourceTenantId) {
6999
+ params = params.set('sourceTenantId', options.sourceTenantId);
7000
+ }
7001
+ try {
7002
+ const response = await firstValueFrom(this.httpClient.get(baseUrl + 'externalTenantUserMappings', { params, observe: 'response', context: IdentityService.callerHandles403() }));
7003
+ return response.body;
7004
+ }
7005
+ catch (error) {
7006
+ throw IdentityService.crossTenantGrantErrorOr(error, 'mapping');
7007
+ }
7008
+ }
7009
+ /**
7010
+ * Removes a cross-tenant grant of the current tenant — `DELETE .../externalTenantUserMappings/{rtId}`.
7011
+ * The next token exchange of that user into this tenant is refused (AB#8344).
7012
+ *
7013
+ * @throws CrossTenantGrantError `RoleChangeRefused` (e.g. `409 last-administrator`), `Forbidden`.
7014
+ * @throws HttpErrorResponse for every other answer (404 for an unknown mapping id, 401, 5xx).
7015
+ */
7016
+ async deleteExternalTenantUserMapping(rtId) {
7017
+ const baseUrl = await this.getApiBaseUrl();
7018
+ if (!baseUrl) {
7019
+ return;
7020
+ }
7021
+ try {
7022
+ await firstValueFrom(this.httpClient.delete(baseUrl + `externalTenantUserMappings/${encodeURIComponent(rtId)}`, { observe: 'response', context: IdentityService.callerHandles403() }));
7023
+ }
7024
+ catch (error) {
7025
+ throw IdentityService.crossTenantGrantErrorOr(error, 'mapping');
7026
+ }
7027
+ }
7028
+ /**
7029
+ * Every `403` of these routes becomes a CrossTenantGrantError (`SourceTenantNotPermitted`,
7030
+ * `RoleChangeRefused` or `Forbidden`), so the global interceptor's 403 toast is suppressed and the page
7031
+ * shows its own message. Other statuses keep the interceptor's default: the problem-shaped 400/404/409/429
7032
+ * answers are not toasted by it anyway, and an untyped error is reported exactly as for any request —
7033
+ * callers use `MmHttpErrorInterceptor.reportsToUser(error)` to decide whether to show a generic message.
7034
+ */
7035
+ static callerHandles403() {
7036
+ return new HttpContext().set(MM_CALLER_HANDLED_STATUSES, [403]);
7037
+ }
7038
+ /** The typed error for documented answers, otherwise the original error unchanged. */
7039
+ static crossTenantGrantErrorOr(error, route) {
7040
+ return toCrossTenantGrantError(error, route) ?? error;
7041
+ }
7042
+ // ========================================
7043
+ // Cross-tenant grant permissions of the current tenant as a source (AB#8430)
7044
+ // Route: {issuer}{currentTenant}/v1/crossTenantGrantPermissions (AB#8345)
7045
+ // Contract: octo-identity-services/docs/CONCEPT-SIBLING-TENANT-GRANTS.md §6
7046
+ // Concurrency: ETag on GET/PUT, If-Match on PUT (AB#8432, contract §6.1)
7047
+ // Typed statuses (400/403/404/412/428) are caller-handled: no global toast, the page shows its own state.
7048
+ // ========================================
7049
+ /**
7050
+ * Reads the target tenants the current tenant permits to look up its users by exact user name or e-mail
7051
+ * and grant them access — `GET .../crossTenantGrantPermissions`. Empty = nobody (the default).
7052
+ *
7053
+ * @returns The list with its version tag (`etag`, `null` when the server sent none), or `null` when no identity URL
7054
+ * is configured. Keep the tag and pass it to {@link setCrossTenantGrantPermissions} as `ifMatch`.
7055
+ * @throws CrossTenantGrantPermissionsError `Forbidden` (no administrator of this tenant), `NotAvailable`
7056
+ * (identity service without AB#8345).
7057
+ * @throws HttpErrorResponse for every other answer (401, 5xx).
7058
+ */
7059
+ async getCrossTenantGrantPermissions() {
7060
+ const baseUrl = await this.getApiBaseUrl();
7061
+ if (!baseUrl) {
7062
+ return null;
7063
+ }
7064
+ try {
7065
+ const response = await firstValueFrom(this.httpClient.get(baseUrl + 'crossTenantGrantPermissions', { observe: 'response', context: IdentityService.callerHandlesPermissionErrors() }));
7066
+ return { targetTenantIds: response.body?.targetTenantIds ?? [], etag: IdentityService.etagOf(response.headers) };
7067
+ }
7068
+ catch (error) {
7069
+ throw toCrossTenantGrantPermissionsError(error) ?? error;
7070
+ }
7071
+ }
7072
+ /**
7073
+ * Replaces the whole list of target tenants the current tenant permits — `PUT .../crossTenantGrantPermissions`.
7074
+ * `[]` permits nobody. A removed tenant's lookups and new grants stop with its next request; its existing grants
7075
+ * are refused at the user's next tenant switch.
7076
+ *
7077
+ * Concurrency (AB#8432, contract §6.1): pass the `etag` of the list the change is based on as `ifMatch`; it is sent
7078
+ * as `If-Match` exactly as received. When the list changed in between, the server writes nothing and answers `412`
7079
+ * (`CrossTenantGrantPermissionsError` `Conflict`, with the current tag in `currentEtag`). Without `ifMatch` the list
7080
+ * is replaced unconditionally (last writer wins) — unless the server requires `If-Match`
7081
+ * (`Identity:CrossTenantGrantPermissions:RequireIfMatch`), then it answers `428` (`PreconditionRequired`).
7082
+ *
7083
+ * @param targetTenantIds The complete new list; `[]` permits nobody.
7084
+ * @param ifMatch The `etag` of the list the change is based on (from {@link getCrossTenantGrantPermissions} or the
7085
+ * previous `set`); `null`/omitted sends no `If-Match`.
7086
+ * @returns The stored list (trimmed, lower-cased, de-duplicated by the server) with its new `etag`, or `null` when
7087
+ * no identity URL is configured.
7088
+ * @throws CrossTenantGrantPermissionsError `Invalid` (with the server's `validationErrors`: own tenant, invalid
7089
+ * characters, too long, too many), `Forbidden`, `NotAvailable`, `Conflict` (412), `PreconditionRequired` (428).
7090
+ * @throws HttpErrorResponse for every other answer (401, 5xx).
7091
+ */
7092
+ async setCrossTenantGrantPermissions(targetTenantIds, ifMatch) {
7093
+ const baseUrl = await this.getApiBaseUrl();
7094
+ if (!baseUrl) {
7095
+ return null;
7096
+ }
7097
+ const body = { targetTenantIds: [...targetTenantIds] };
7098
+ try {
7099
+ const response = await firstValueFrom(this.httpClient.put(baseUrl + 'crossTenantGrantPermissions', body, {
7100
+ observe: 'response',
7101
+ context: IdentityService.callerHandlesPermissionErrors(),
7102
+ headers: ifMatch ? new HttpHeaders({ 'If-Match': ifMatch }) : undefined
7103
+ }));
7104
+ return {
7105
+ targetTenantIds: response.body?.targetTenantIds ?? body.targetTenantIds,
7106
+ etag: IdentityService.etagOf(response.headers)
7107
+ };
7108
+ }
7109
+ catch (error) {
7110
+ throw toCrossTenantGrantPermissionsError(error) ?? error;
7111
+ }
7112
+ }
7113
+ static etagOf(headers) {
7114
+ const etag = headers?.get('ETag');
7115
+ return etag ? etag : null;
7116
+ }
7117
+ static callerHandlesPermissionErrors() {
7118
+ return new HttpContext().set(MM_CALLER_HANDLED_STATUSES, CROSS_TENANT_GRANT_PERMISSIONS_TYPED_STATUSES);
7119
+ }
7120
+ // ========================================
6684
7121
  // Data Permission Management (AB#4972)
6685
7122
  // ========================================
6686
7123
  async getDataPermissions() {
@@ -9735,5 +10172,5 @@ function provideOctoServices(octoServiceOptions) {
9735
10172
  * Generated bundle index. Do not edit.
9736
10173
  */
9737
10174
 
9738
- export { AggregationInputTypesDto, AggregationTypeDto, AggregationTypesDto, AiService, ArchiveStorageHealthDto, AssetRepoGraphQlDataSource, AssetRepoService, AssociationModOptionsDto, AttributeOwnershipDto, AttributeSelectorService, AttributeValueTypeDto, BasicEnergyCarrierTypeDto, BasicEnergyDataQualityDto, BasicEnergyFacilityTypeDto, BasicEnergyProductionTypeDto, BasicEnergyStateDto, BasicLegalEntityTypeDto, BasicSalutationDto, BasicTypeOfTelephoneBasicDto, BasicTypeOfTelephoneEnhancedDto, BasicUnitOfMeasureDto, BinaryDownloadUnavailableError, BlueprintConflictResolutionDto, BlueprintUpdateModeDto, BotSecretsService, BotService, BucketAlignmentDto, BucketAlignmentInputDto, CK_UPGRADE_BLOCKED_CODE, CONFIGURATION_SERVICE, CREDENTIAL_ATTRIBUTE_NAME_SUFFIXES, CkExtensionUpdateOperationsDto, CkModelCatalogService, CkModelService, CkRollupFunctionDto, CkTypeAttributeService, CkTypeMetaData, CkTypeSelectorService, CommunicationService, DEFAULT_SECRET_STATUS_LABELS, DeepGraphDirectionDto, DeleteStrategiesDto, DeploymentState, EnergyCommunityBillingCycleDto, EnergyCommunityBillingDocumentStateDto, EnergyCommunityBillingTypeDto, EnergyCommunityTaxProcedureCreditNoteDto, EnvironmentCarbonScopeDto, EnvironmentComplianceCategoryDto, EnvironmentComplianceStatusDto, EnvironmentEnergySourceDto, EnvironmentGoalStateDto, FILES_LINKED_COUNTS_MAX, FILES_RESERVED_ROOT_NAMES, FILES_UNAVAILABLE_TTL_MS, FieldFilterOperatorsDto, FileDownloadService, FilesClientService, FilesPathError, FormulaResultTypeDto, GetCkModelByIdDocumentDto, GetCkModelByIdDtoGQL, GetCkRecordAttributesDocumentDto, GetCkRecordAttributesDtoGQL, GetCkTypeAttributesDocumentDto, GetCkTypeAttributesDtoGQL, GetCkTypeAvailableQueryColumnsDocumentDto, GetCkTypeAvailableQueryColumnsDtoGQL, GetCkTypesDocumentDto, GetCkTypesDtoGQL, GetDerivedCkTypesDocumentDto, GetDerivedCkTypesDtoGQL, GetEntitiesByCkTypeDocumentDto, GetEntitiesByCkTypeDtoGQL, GraphDirectionDto, GraphQL, GraphQLCloneIgnoredProperties, GraphQLCommonIgnoredProperties, GraphQlDataSource, GraphQlNotificationRecipientCandidatesService, HealthService, HealthStatus, IDENTITY_PROVIDER_TYPE_LABELS, IdentityProviderType, IdentityService, ImportStrategyDto, IndustryBasicAlarmPriorityDto, IndustryBasicAlarmSourceTypeDto, IndustryBasicAlarmStateDto, IndustryBasicAlarmTypeDto, IndustryBasicIecDataTypeDto, IndustryBasicMachineCapabilitiesDto, IndustryBasicMachineStateDto, IndustryEnergyDemandResponseMarketDto, IndustryEnergyDemandResponseStatusDto, IndustryEnergyTariffTypeDto, IndustryMaintenanceAggregationTypeDto, IndustryMaintenanceCostCategoryDto, IndustryMaintenanceEnergyBalanceGroupDto, IndustryMaintenanceEnergyBalanceProductDto, IndustryMaintenanceEnergyBalanceUnitDto, IndustryMaintenanceOrderPriorityDto, IndustryMaintenanceOrderStateDto, IndustryMaintenanceOrderTypeDto, IndustryMaintenanceServiceTypeDto, IndustryManufacturingFeedbackSyncStateDto, IndustryManufacturingProductionOrderItemStateDto, IndustryManufacturingProductionOrderStateDto, JobManagementService, LevelMetaData, LoggerSeverity, MethodHandlerInstanceStateDto, MethodHandlerMethodStateDto, MethodHandlerSourceDto, MethodHandlerTransportDto, ModelStateDto, MultiplicitiesDto, NOTIFICATION_COUNT_PLACEHOLDER, NOTIFICATION_DEFAULT_CRON, NOTIFICATION_MIN_INTERVAL_MS, NOTIFICATION_RECIPIENT_CANDIDATES, NOTIFICATION_SCHEDULE_TYPES, NavigationFilterModeDto, NotificationRecipientCandidatesService, NotificationRecipientRefusedError, NotificationSubscriptionService, OCTO_HANDLES_CK_UPGRADE_BLOCKED, OCTO_SILENT_ERRORS, OctoErrorLink, OctoGraphQLServiceBase, OctoSdkDemoCustomerStatusDto, OctoSdkDemoNetworkOperatorDto, OctoSdkDemoOperatingStatusDto, OctoServiceOptions, OctoServicesModule, PICKER_USERS_MAX_PAGES, PICKER_USERS_PAGE_SIZE, PagedGraphResultDto, ProgressValue, ProgressWindowService, QueryModeDto, ReportingService, RtAssociationMetaData, RuntimeEntityDialogDataSource, RuntimeEntitySelectDataSource, SECRET_DUMP_RESTORE_ERROR_DUMP_DELETED, SECRET_DUMP_RESTORE_ERROR_DUMP_KEY_MISSING, SECRET_LEGACY_V1_KEY_ID, SECRET_STATUS_WARNING_DUMP_KEY_MISSING, SECRET_STATUS_WARNING_NO_KEY_RING, SECRET_STATUS_WARNING_NO_LEGACY_V1_KEY, SECRET_VALUE_TYPE, SearchFilterTypesDto, SecretStorageFormDto, SecretUsageMatchDto, SeriesComparisonPolicyDto, SeriesResolutionSignalDto, SortOrdersDto, SystemAggregationTypesDto, SystemAiApprovalModeDto, SystemAiApprovalReasonDto, SystemAiApprovalStatusDto, SystemAiAuthModeDto, SystemAiConflictModeDto, SystemAiCredentialKindDto, SystemAiJobKindDto, SystemAiJobStatusDto, SystemAiKnowledgeKindDto, SystemAiLeaseStatusDto, SystemAiModelTierDto, SystemAiRiskLevelDto, SystemAiSessionEventKindDto, SystemAiSessionStatusDto, SystemAiSubscriptionScopeDto, SystemAiTicketScopeDto, SystemAiTicketStatusDto, SystemAiWorkspaceModeDto, SystemCommunicationAdapterSharingModeDto, SystemCommunicationCommunicationStateDto, SystemCommunicationConfigurationStateDto, SystemCommunicationDeploymentStateDto, SystemCommunicationEnvironmentDto, SystemCommunicationHelmChannelDto, SystemCommunicationHelmRepositoryPurposeDto, SystemCommunicationLifecycleModeDto, SystemCommunicationLifecycleStateDto, SystemCommunicationPipelineExecutionClassDto, SystemCommunicationPipelineExecutionStatusDto, SystemCommunicationPipelineTriggerTypeDto, SystemCommunicationPoolScaleUpPolicyDto, SystemCommunicationSignalRegistrationActionDto, SystemCommunicationSignalRegistrationStateDto, SystemEnvironmentModesDto, SystemFieldFilterOperatorDto, SystemIdentityDataPolicyEnforcementModeDto, SystemIdentityDataPolicyScopeDto, SystemIdentityIdentifierKindDto, SystemIdentityIdentifierSourceDto, SystemIdentityTokenExpirationDto, SystemIdentityTokenTypeDto, SystemIdentityTokenUsageDto, SystemIdentityTrustLevelDto, SystemMaintenanceLevelsDto, SystemNavigationFilterModesDto, SystemNotificationEventLevelsDto, SystemNotificationEventSourcesDto, SystemNotificationEventStatesDto, SystemNotificationNotificationTypesDto, SystemNotificationRenderingTypesDto, SystemQueryTypesDto, SystemSortOrdersDto, SystemStreamDataBucketAlignmentDto, SystemStreamDataCkArchiveStatusDto, SystemStreamDataCkComputedColumnResultTypeDto, SystemStreamDataCkComputedColumnStateDto, SystemStreamDataCkConflictKeyOrderDto, SystemStreamDataCkRecomputeChangeKindDto, SystemStreamDataCkRecomputeChangeSourceDto, SystemStreamDataCkRecomputeJobStateDto, SystemStreamDataCkRecomputeTriggerDto, SystemStreamDataCkRollupFunctionDto, TENANT_ID_PROVIDER, TusUploadService, UpdateTypeDto, browserTimeZone, buildTusEndpoint, ckBlockersOf, ckFirstBlockerReason, filesGraphQlErrorCode, formatNotificationCell, formatSecretStatus, isCkBlocked, isCkUpgradeBlockedGraphQlError, isCredentialLikeAttributeName, isSecretAttributeCandidate, isSecretPresent, isSecretQueryColumn, isSecretStateObject, isSecretValueType, isTextualValueType, loadAdminPickerUsers, loadPickerUsers, nameSearchTerm, notificationColumnPath, notificationErrorText, notificationRecipientStatus, notificationScheduleIssue, notificationSubscriptionHealth, notificationTimeZones, octoDataIdFromObject, parseCkUpgradeBlockedError, parseCkUpgradeBlockedGraphQlError, parseContentDispositionFileName, parseFilesProblem, placeholderList, result as possibleTypes, provideOctoServices, renderNotificationPreview, secretInputValue, secretStateFromAttribute, secretStatusOf, toAttributeNameFilter, toCamelCaseAttributeName, toSecretState, toUniqueCamelCaseNames, unknownNotificationPlaceholders, userDisplayName, userPickerText, withScheduleTimeZone };
10175
+ export { AggregationInputTypesDto, AggregationTypeDto, AggregationTypesDto, AiService, ArchiveStorageHealthDto, AssetRepoGraphQlDataSource, AssetRepoService, AssociationModOptionsDto, AttributeOwnershipDto, AttributeSelectorService, AttributeValueTypeDto, BasicEnergyCarrierTypeDto, BasicEnergyDataQualityDto, BasicEnergyFacilityTypeDto, BasicEnergyProductionTypeDto, BasicEnergyStateDto, BasicLegalEntityTypeDto, BasicSalutationDto, BasicTypeOfTelephoneBasicDto, BasicTypeOfTelephoneEnhancedDto, BasicUnitOfMeasureDto, BinaryDownloadUnavailableError, BlueprintConflictResolutionDto, BlueprintUpdateModeDto, BotSecretsService, BotService, BucketAlignmentDto, BucketAlignmentInputDto, CK_UPGRADE_BLOCKED_CODE, CONFIGURATION_SERVICE, CREDENTIAL_ATTRIBUTE_NAME_SUFFIXES, CROSS_TENANT_GRANT_PERMISSIONS_TYPED_STATUSES, CkExtensionUpdateOperationsDto, CkModelCatalogService, CkModelService, CkRollupFunctionDto, CkTypeAttributeService, CkTypeMetaData, CkTypeSelectorService, CommunicationService, CrossTenantGrantError, CrossTenantGrantPermissionsError, CrossTenantGrantProblemCodes, DEFAULT_SECRET_STATUS_LABELS, DeepGraphDirectionDto, DeleteStrategiesDto, DeploymentState, EnergyCommunityBillingCycleDto, EnergyCommunityBillingDocumentStateDto, EnergyCommunityBillingTypeDto, EnergyCommunityTaxProcedureCreditNoteDto, EnvironmentCarbonScopeDto, EnvironmentComplianceCategoryDto, EnvironmentComplianceStatusDto, EnvironmentEnergySourceDto, EnvironmentGoalStateDto, FILES_LINKED_COUNTS_MAX, FILES_RESERVED_ROOT_NAMES, FILES_UNAVAILABLE_TTL_MS, FieldFilterOperatorsDto, FileDownloadService, FilesClientService, FilesPathError, FormulaResultTypeDto, GetCkModelByIdDocumentDto, GetCkModelByIdDtoGQL, GetCkRecordAttributesDocumentDto, GetCkRecordAttributesDtoGQL, GetCkTypeAttributesDocumentDto, GetCkTypeAttributesDtoGQL, GetCkTypeAvailableQueryColumnsDocumentDto, GetCkTypeAvailableQueryColumnsDtoGQL, GetCkTypesDocumentDto, GetCkTypesDtoGQL, GetDerivedCkTypesDocumentDto, GetDerivedCkTypesDtoGQL, GetEntitiesByCkTypeDocumentDto, GetEntitiesByCkTypeDtoGQL, GraphDirectionDto, GraphQL, GraphQLCloneIgnoredProperties, GraphQLCommonIgnoredProperties, GraphQlDataSource, GraphQlNotificationRecipientCandidatesService, HealthService, HealthStatus, IDENTITY_PROVIDER_TYPE_LABELS, IdentityProviderType, IdentityService, ImportStrategyDto, IndustryBasicAlarmPriorityDto, IndustryBasicAlarmSourceTypeDto, IndustryBasicAlarmStateDto, IndustryBasicAlarmTypeDto, IndustryBasicIecDataTypeDto, IndustryBasicMachineCapabilitiesDto, IndustryBasicMachineStateDto, IndustryEnergyDemandResponseMarketDto, IndustryEnergyDemandResponseStatusDto, IndustryEnergyTariffTypeDto, IndustryMaintenanceAggregationTypeDto, IndustryMaintenanceCostCategoryDto, IndustryMaintenanceEnergyBalanceGroupDto, IndustryMaintenanceEnergyBalanceProductDto, IndustryMaintenanceEnergyBalanceUnitDto, IndustryMaintenanceOrderPriorityDto, IndustryMaintenanceOrderStateDto, IndustryMaintenanceOrderTypeDto, IndustryMaintenanceServiceTypeDto, IndustryManufacturingFeedbackSyncStateDto, IndustryManufacturingProductionOrderItemStateDto, IndustryManufacturingProductionOrderStateDto, JobManagementService, LevelMetaData, LoggerSeverity, MethodHandlerInstanceStateDto, MethodHandlerMethodStateDto, MethodHandlerSourceDto, MethodHandlerTransportDto, ModelStateDto, MultiplicitiesDto, NOTIFICATION_COUNT_PLACEHOLDER, NOTIFICATION_DEFAULT_CRON, NOTIFICATION_MIN_INTERVAL_MS, NOTIFICATION_RECIPIENT_CANDIDATES, NOTIFICATION_SCHEDULE_TYPES, NavigationFilterModeDto, NotificationRecipientCandidatesService, NotificationRecipientRefusedError, NotificationSubscriptionService, OCTO_HANDLES_CK_UPGRADE_BLOCKED, OCTO_SILENT_ERRORS, OctoErrorLink, OctoGraphQLServiceBase, OctoSdkDemoCustomerStatusDto, OctoSdkDemoNetworkOperatorDto, OctoSdkDemoOperatingStatusDto, OctoServiceOptions, OctoServicesModule, PICKER_USERS_MAX_PAGES, PICKER_USERS_PAGE_SIZE, PagedGraphResultDto, ProgressValue, ProgressWindowService, QueryModeDto, ReportingService, RoleChangeProblemCodes, RtAssociationMetaData, RuntimeEntityDialogDataSource, RuntimeEntitySelectDataSource, SECRET_DUMP_RESTORE_ERROR_DUMP_DELETED, SECRET_DUMP_RESTORE_ERROR_DUMP_KEY_MISSING, SECRET_LEGACY_V1_KEY_ID, SECRET_STATUS_WARNING_DUMP_KEY_MISSING, SECRET_STATUS_WARNING_NO_KEY_RING, SECRET_STATUS_WARNING_NO_LEGACY_V1_KEY, SECRET_VALUE_TYPE, SearchFilterTypesDto, SecretStorageFormDto, SecretUsageMatchDto, SeriesComparisonPolicyDto, SeriesResolutionSignalDto, SortOrdersDto, SystemAggregationTypesDto, SystemAiApprovalModeDto, SystemAiApprovalReasonDto, SystemAiApprovalStatusDto, SystemAiAuthModeDto, SystemAiConflictModeDto, SystemAiCredentialKindDto, SystemAiJobKindDto, SystemAiJobStatusDto, SystemAiKnowledgeKindDto, SystemAiLeaseStatusDto, SystemAiModelTierDto, SystemAiRiskLevelDto, SystemAiSessionEventKindDto, SystemAiSessionStatusDto, SystemAiSubscriptionScopeDto, SystemAiTicketScopeDto, SystemAiTicketStatusDto, SystemAiWorkspaceModeDto, SystemCommunicationAdapterSharingModeDto, SystemCommunicationCommunicationStateDto, SystemCommunicationConfigurationStateDto, SystemCommunicationDeploymentStateDto, SystemCommunicationEnvironmentDto, SystemCommunicationHelmChannelDto, SystemCommunicationHelmRepositoryPurposeDto, SystemCommunicationLifecycleModeDto, SystemCommunicationLifecycleStateDto, SystemCommunicationPipelineExecutionClassDto, SystemCommunicationPipelineExecutionStatusDto, SystemCommunicationPipelineTriggerTypeDto, SystemCommunicationPoolScaleUpPolicyDto, SystemCommunicationSignalRegistrationActionDto, SystemCommunicationSignalRegistrationStateDto, SystemEnvironmentModesDto, SystemFieldFilterOperatorDto, SystemIdentityDataPolicyEnforcementModeDto, SystemIdentityDataPolicyScopeDto, SystemIdentityIdentifierKindDto, SystemIdentityIdentifierSourceDto, SystemIdentityTokenExpirationDto, SystemIdentityTokenTypeDto, SystemIdentityTokenUsageDto, SystemIdentityTrustLevelDto, SystemMaintenanceLevelsDto, SystemNavigationFilterModesDto, SystemNotificationEventLevelsDto, SystemNotificationEventSourcesDto, SystemNotificationEventStatesDto, SystemNotificationNotificationTypesDto, SystemNotificationRenderingTypesDto, SystemQueryTypesDto, SystemSortOrdersDto, SystemStreamDataBucketAlignmentDto, SystemStreamDataCkArchiveStatusDto, SystemStreamDataCkComputedColumnResultTypeDto, SystemStreamDataCkComputedColumnStateDto, SystemStreamDataCkConflictKeyOrderDto, SystemStreamDataCkRecomputeChangeKindDto, SystemStreamDataCkRecomputeChangeSourceDto, SystemStreamDataCkRecomputeJobStateDto, SystemStreamDataCkRecomputeTriggerDto, SystemStreamDataCkRollupFunctionDto, TENANT_ID_PROVIDER, TusUploadService, UpdateTypeDto, browserTimeZone, buildTusEndpoint, ckBlockersOf, ckFirstBlockerReason, filesGraphQlErrorCode, formatNotificationCell, formatSecretStatus, isCkBlocked, isCkUpgradeBlockedGraphQlError, isCredentialLikeAttributeName, isHttpErrorLike, isSecretAttributeCandidate, isSecretPresent, isSecretQueryColumn, isSecretStateObject, isSecretValueType, isTextualValueType, loadAdminPickerUsers, loadPickerUsers, nameSearchTerm, notificationColumnPath, notificationErrorText, notificationRecipientStatus, notificationScheduleIssue, notificationSubscriptionHealth, notificationTimeZones, octoDataIdFromObject, parseCkUpgradeBlockedError, parseCkUpgradeBlockedGraphQlError, parseContentDispositionFileName, parseFilesProblem, placeholderList, result as possibleTypes, problemCodeOf, provideOctoServices, renderNotificationPreview, secretInputValue, secretStateFromAttribute, secretStatusOf, toAttributeNameFilter, toCamelCaseAttributeName, toCrossTenantGrantError, toCrossTenantGrantPermissionsError, toSecretState, toUniqueCamelCaseNames, unknownNotificationPlaceholders, userDisplayName, userPickerText, withScheduleTimeZone };
9739
10176
  //# sourceMappingURL=meshmakers-octo-services.mjs.map