@torrow/sdk-client 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -11,103 +11,167 @@ async function buildAuthHeaders(config) {
11
11
  return headers;
12
12
  }
13
13
 
14
- // ../../src/http/TorrowHttpError.ts
15
- function pickApiErrorName(body) {
16
- if (body === null || typeof body !== "object") {
17
- return void 0;
18
- }
19
- const o = body;
20
- if (typeof o.error === "string" && o.error.length > 0) {
21
- return o.error;
22
- }
23
- if (typeof o.name === "string" && o.name.length > 0) {
24
- return o.name;
14
+ // ../../src/http/TorrowSdkError.ts
15
+ var TorrowSdkErrorCategory = /* @__PURE__ */ ((TorrowSdkErrorCategory2) => {
16
+ TorrowSdkErrorCategory2["InvalidInput"] = "InvalidInput";
17
+ TorrowSdkErrorCategory2["InvalidState"] = "InvalidState";
18
+ TorrowSdkErrorCategory2["AccessDenied"] = "AccessDenied";
19
+ TorrowSdkErrorCategory2["InsufficientData"] = "InsufficientData";
20
+ TorrowSdkErrorCategory2["InvalidResponse"] = "InvalidResponse";
21
+ TorrowSdkErrorCategory2["VersionConflict"] = "VersionConflict";
22
+ TorrowSdkErrorCategory2["AuthenticationRequired"] = "AuthenticationRequired";
23
+ TorrowSdkErrorCategory2["UnsupportedOperation"] = "UnsupportedOperation";
24
+ TorrowSdkErrorCategory2["RateLimited"] = "RateLimited";
25
+ TorrowSdkErrorCategory2["HttpFailure"] = "HttpFailure";
26
+ TorrowSdkErrorCategory2["TransportFailure"] = "TransportFailure";
27
+ TorrowSdkErrorCategory2["StorageFailure"] = "StorageFailure";
28
+ TorrowSdkErrorCategory2["Cancelled"] = "Cancelled";
29
+ TorrowSdkErrorCategory2["Unknown"] = "Unknown";
30
+ return TorrowSdkErrorCategory2;
31
+ })(TorrowSdkErrorCategory || {});
32
+ var TorrowSdkRequestState = /* @__PURE__ */ ((TorrowSdkRequestState2) => {
33
+ TorrowSdkRequestState2["NotStarted"] = "NotStarted";
34
+ TorrowSdkRequestState2["Started"] = "Started";
35
+ return TorrowSdkRequestState2;
36
+ })(TorrowSdkRequestState || {});
37
+ var TorrowSdkEffectArea = /* @__PURE__ */ ((TorrowSdkEffectArea2) => {
38
+ TorrowSdkEffectArea2["Remote"] = "Remote";
39
+ TorrowSdkEffectArea2["SessionMemory"] = "SessionMemory";
40
+ TorrowSdkEffectArea2["Storage"] = "Storage";
41
+ return TorrowSdkEffectArea2;
42
+ })(TorrowSdkEffectArea || {});
43
+ var TorrowSdkEffectState = /* @__PURE__ */ ((TorrowSdkEffectState2) => {
44
+ TorrowSdkEffectState2["NotApplied"] = "NotApplied";
45
+ TorrowSdkEffectState2["Applied"] = "Applied";
46
+ TorrowSdkEffectState2["Unknown"] = "Unknown";
47
+ return TorrowSdkEffectState2;
48
+ })(TorrowSdkEffectState || {});
49
+ var TorrowSdkErrorDomain = /* @__PURE__ */ ((TorrowSdkErrorDomain2) => {
50
+ TorrowSdkErrorDomain2["BehaviorSettings"] = "BehaviorSettings";
51
+ TorrowSdkErrorDomain2["Otp"] = "Otp";
52
+ TorrowSdkErrorDomain2["AuthSession"] = "AuthSession";
53
+ return TorrowSdkErrorDomain2;
54
+ })(TorrowSdkErrorDomain || {});
55
+ var OtpErrorReason = /* @__PURE__ */ ((OtpErrorReason2) => {
56
+ OtpErrorReason2["InvalidChallenge"] = "InvalidChallenge";
57
+ OtpErrorReason2["UnsupportedMethod"] = "UnsupportedMethod";
58
+ OtpErrorReason2["AuthHeaderMissing"] = "AuthHeaderMissing";
59
+ OtpErrorReason2["CodeRequestLimitExceeded"] = "CodeRequestLimitExceeded";
60
+ return OtpErrorReason2;
61
+ })(OtpErrorReason || {});
62
+ var AuthSessionErrorReason = /* @__PURE__ */ ((AuthSessionErrorReason2) => {
63
+ AuthSessionErrorReason2["SessionNotReady"] = "SessionNotReady";
64
+ AuthSessionErrorReason2["CallbackFailed"] = "CallbackFailed";
65
+ return AuthSessionErrorReason2;
66
+ })(AuthSessionErrorReason || {});
67
+ var BehaviorSettingsEffectStep = /* @__PURE__ */ ((BehaviorSettingsEffectStep2) => {
68
+ BehaviorSettingsEffectStep2["Write"] = "Write";
69
+ return BehaviorSettingsEffectStep2;
70
+ })(BehaviorSettingsEffectStep || {});
71
+ var AuthSessionEffectStep = /* @__PURE__ */ ((AuthSessionEffectStep2) => {
72
+ AuthSessionEffectStep2["CreateAuthSession"] = "CreateAuthSession";
73
+ AuthSessionEffectStep2["CloseSession"] = "CloseSession";
74
+ AuthSessionEffectStep2["IssueTokens"] = "IssueTokens";
75
+ AuthSessionEffectStep2["RefreshTokens"] = "RefreshTokens";
76
+ AuthSessionEffectStep2["RevokeTokens"] = "RevokeTokens";
77
+ AuthSessionEffectStep2["SendCode"] = "SendCode";
78
+ AuthSessionEffectStep2["SetTokens"] = "SetTokens";
79
+ AuthSessionEffectStep2["ClearTokens"] = "ClearTokens";
80
+ AuthSessionEffectStep2["SaveTokens"] = "SaveTokens";
81
+ AuthSessionEffectStep2["ClearStorage"] = "ClearStorage";
82
+ return AuthSessionEffectStep2;
83
+ })(AuthSessionEffectStep || {});
84
+ var TorrowSdkError = class _TorrowSdkError extends Error {
85
+ /** Общая причина отказа. */
86
+ category;
87
+ /** Безопасные метаданные ответа. */
88
+ http;
89
+ /** Неизменяемое предметное уточнение. */
90
+ detail;
91
+ /** Начало fetch; не доставка. */
92
+ request;
93
+ /** Имя составной операции без пользовательских значений. */
94
+ operation;
95
+ /** Стадия отказа без аргументов. */
96
+ failureAt;
97
+ /** Неизменяемые сведения об описанных изменениях. */
98
+ effects;
99
+ #sensitive;
100
+ constructor(init) {
101
+ super(`Torrow SDK: ${init.category}`);
102
+ this.name = "TorrowSdkError";
103
+ this.category = init.category;
104
+ this.http = init.http && Object.freeze({ ...init.http });
105
+ this.detail = init.detail && Object.freeze({ ...init.detail });
106
+ this.request = init.request;
107
+ this.operation = init.operation;
108
+ this.failureAt = init.failureAt;
109
+ this.effects = init.effects && Object.freeze(init.effects.map((effect) => Object.freeze({ ...effect })));
110
+ this.#sensitive = Object.freeze({ ...init.sensitive, cleanup: init.sensitive?.cleanup && Object.freeze({ ...init.sensitive.cleanup }) });
111
+ Object.freeze(this);
112
+ }
113
+ /** Безопасный снимок для обычной сериализации и диагностики. */
114
+ toJSON() {
115
+ return {
116
+ category: this.category,
117
+ http: this.http,
118
+ detail: this.detail,
119
+ request: this.request,
120
+ operation: this.operation,
121
+ failureAt: this.failureAt,
122
+ effects: this.effects
123
+ };
25
124
  }
26
- if (typeof o.title === "string" && o.title.length > 0) {
27
- return o.title;
125
+ /** Явный доступ к секретной диагностике; вызывающий код отвечает за её защиту. */
126
+ getSensitiveDetails() {
127
+ return this.#sensitive;
28
128
  }
29
- if (typeof o.message === "string" && o.message.length > 0) {
30
- return o.message;
129
+ /** Новый снимок для составной операции; исходная ошибка не изменяется. */
130
+ withContext(context) {
131
+ return new _TorrowSdkError({ ...this.toJSON(), ...context, sensitive: this.#sensitive });
31
132
  }
32
- return void 0;
133
+ };
134
+
135
+ // ../../src/http/transport-errors.ts
136
+ var KnownApiErrorName = /* @__PURE__ */ ((KnownApiErrorName2) => {
137
+ KnownApiErrorName2["ResourceUnavailable"] = "REQUESTED_RESOURCE_IS_NOT_AVAILABLE";
138
+ KnownApiErrorName2["QuantityUnavailable"] = "REQUESTED_RESOURCE_QUANTITY_IS_NOT_AVAILABLE";
139
+ KnownApiErrorName2["ServiceUnavailableAtTime"] = "SERVICE_IS_NOT_AVAILABLE_AT_TIME";
140
+ KnownApiErrorName2["WrongVersion"] = "OBJECT_HAS_WRONG_VERSION";
141
+ KnownApiErrorName2["CodeRequestLimit"] = "CODE_REQUEST_LIMIT_EXCEEDED";
142
+ KnownApiErrorName2["AccessDenied"] = "ACCESS_DENIED";
143
+ KnownApiErrorName2["UserNoRights"] = "USER_HAVE_NO_RIGHTS_TO_ELEMENTS";
144
+ KnownApiErrorName2["AuthHeaderMissing"] = "AUTH_HEADER_MISSING";
145
+ KnownApiErrorName2["WrongSessionCode"] = "WRONG_SESSION_ACCESS_CODE";
146
+ KnownApiErrorName2["AttemptsExceeded"] = "EXCEEDED_ATTEMPTS_COUNT";
147
+ return KnownApiErrorName2;
148
+ })(KnownApiErrorName || {});
149
+ function createHttpError(init) {
150
+ const body = record(init.body);
151
+ const code = body?.code;
152
+ const apiCode = typeof code === "string" ? code : typeof code === "number" && Number.isFinite(code) ? String(code) : void 0;
153
+ const apiName = [body?.error, body?.name].find((value) => typeof value === "string" && Object.values(KnownApiErrorName).includes(value));
154
+ const nested = record(body?.torrowError) ?? record(body?.torrowErrorClient) ?? record(body?.innerError);
155
+ const trace = body?.traceIdentifier ?? nested?.traceIdentifier;
156
+ const http = {
157
+ status: init.status,
158
+ apiCode,
159
+ apiErrorName: typeof apiName === "string" ? apiName : void 0,
160
+ requestId: init.requestId,
161
+ traceIdentifier: init.traceIdentifier || (typeof trace === "string" ? trace : void 0)
162
+ };
163
+ const category = init.status === 401 ? "AuthenticationRequired" /* AuthenticationRequired */ : init.status === 403 ? "AccessDenied" /* AccessDenied */ : init.status === 429 ? "RateLimited" /* RateLimited */ : "HttpFailure" /* HttpFailure */;
164
+ return new TorrowSdkError({ category, http, request: "Started" /* Started */, sensitive: init });
33
165
  }
34
- function pickApiCode(body) {
35
- if (body === null || typeof body !== "object") {
36
- return void 0;
37
- }
38
- const c = body.code;
39
- if (typeof c === "string") {
40
- return c;
41
- }
42
- return typeof c === "number" && Number.isFinite(c) ? String(c) : void 0;
166
+ function record(value) {
167
+ return value !== null && typeof value === "object" ? value : void 0;
43
168
  }
44
- function pickTraceIdentifier(body) {
45
- if (body === null || typeof body !== "object") {
46
- return void 0;
47
- }
48
- const o = body;
49
- if (typeof o.traceIdentifier === "string" && o.traceIdentifier.length > 0) {
50
- return o.traceIdentifier;
51
- }
52
- for (const key of ["torrowError", "torrowErrorClient", "innerError"]) {
53
- const nested = o[key];
54
- if (nested !== null && typeof nested === "object") {
55
- const t = nested.traceIdentifier;
56
- if (typeof t === "string" && t.length > 0) {
57
- return t;
58
- }
59
- }
60
- }
61
- return void 0;
169
+ function normalizeTransportError(cause, request, signal, url, parsing = false) {
170
+ if (cause instanceof TorrowSdkError) return cause;
171
+ const cancelled = signal?.aborted || record(cause)?.name === "AbortError";
172
+ const category = cancelled ? "Cancelled" /* Cancelled */ : parsing ? "InvalidResponse" /* InvalidResponse */ : request === "Started" /* Started */ && cause instanceof TypeError ? "TransportFailure" /* TransportFailure */ : "Unknown" /* Unknown */;
173
+ return new TorrowSdkError({ category, request, sensitive: { cause, url } });
62
174
  }
63
- var TorrowHttpError = class _TorrowHttpError extends Error {
64
- status;
65
- body;
66
- apiErrorName;
67
- /** Код ошибки API строкой: числовой `TorrowErrorClient.code` приводится к строке (`"311293"`). */
68
- code;
69
- requestId;
70
- /**
71
- * Идентификатор трассировки шлюза (`TorrowErrorClient.traceIdentifier`
72
- * или заголовок `trace-identifier`) — для саппорта/логов.
73
- */
74
- traceIdentifier;
75
- url;
76
- constructor(init) {
77
- const apiName = pickApiErrorName(init.body);
78
- const code = pickApiCode(init.body);
79
- const traceIdentifier = (typeof init.traceIdentifier === "string" && init.traceIdentifier.length > 0 ? init.traceIdentifier : void 0) ?? pickTraceIdentifier(init.body);
80
- const message = _TorrowHttpError.buildMessage(
81
- init.status,
82
- init.url,
83
- apiName,
84
- code,
85
- traceIdentifier
86
- );
87
- super(message, { cause: init.cause });
88
- this.name = "TorrowHttpError";
89
- this.status = init.status;
90
- this.body = init.body;
91
- this.url = init.url;
92
- this.requestId = init.requestId;
93
- this.traceIdentifier = traceIdentifier;
94
- this.apiErrorName = apiName;
95
- this.code = code;
96
- }
97
- static buildMessage(status, url, apiErrorName, code, traceIdentifier) {
98
- const parts = [`HTTP ${status}`, url];
99
- if (code) {
100
- parts.push(`code=${code}`);
101
- }
102
- if (apiErrorName) {
103
- parts.push(apiErrorName);
104
- }
105
- if (traceIdentifier) {
106
- parts.push(`trace-identifier=${traceIdentifier}`);
107
- }
108
- return parts.join(" \u2014 ");
109
- }
110
- };
111
175
 
112
176
  // ../../src/util/json.ts
113
177
  var ISO_DATE_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+-])(\d{2}):(\d{2}))$/;
@@ -679,49 +743,59 @@ var HttpClient = class {
679
743
  this.config = config;
680
744
  }
681
745
  config;
746
+ /** Выполняет запрос; сетевые и подготовительные отказы возвращает как TorrowSdkError. */
682
747
  async requestJson(init, onDispatch) {
683
- const { fetch: fetchFn = globalThis.fetch } = this.config;
684
- const url = this.buildUrl(init.path, init.query);
685
- const authHeaders = await buildAuthHeaders(this.config);
686
- const headers = {
687
- Accept: JSON_MIME,
688
- ...authHeaders,
689
- ...this.config.defaultHeaders,
690
- ...init.headers
691
- };
692
- if (this.config.userAgent) {
693
- headers["User-Agent"] = this.config.userAgent;
694
- }
695
- const needsBody = init.body !== void 0 && init.method !== "GET" && init.method !== "DELETE";
696
- if (needsBody) {
697
- headers["Content-Type"] = JSON_MIME;
698
- }
699
- const requestInit = {
700
- method: init.method,
701
- headers,
702
- body: needsBody ? stringifyJsonBody(init.body) : void 0,
703
- signal: init.signal
704
- };
705
- if (onDispatch) init.signal?.throwIfAborted();
706
- onDispatch?.();
707
- const res = await fetchFn(url, requestInit);
708
- const requestId = res.headers.get("x-request-id") ?? void 0;
709
- const traceIdentifier = res.headers.get("trace-identifier") ?? void 0;
710
- const text = await res.text();
711
- if (!res.ok) {
712
- const errBody = tryParseErrorBody(text, res.headers.get("content-type"));
713
- throw new TorrowHttpError({
714
- status: res.status,
715
- body: errBody,
716
- url,
717
- requestId,
718
- traceIdentifier
719
- });
720
- }
721
- if (text === "") {
722
- return void 0;
748
+ let request = "NotStarted" /* NotStarted */;
749
+ let url;
750
+ let parsing = false;
751
+ try {
752
+ const { fetch: fetchFn = globalThis.fetch } = this.config;
753
+ url = this.buildUrl(init.path, init.query);
754
+ const authHeaders = await buildAuthHeaders(this.config);
755
+ const headers = {
756
+ Accept: JSON_MIME,
757
+ ...authHeaders,
758
+ ...this.config.defaultHeaders,
759
+ ...init.headers
760
+ };
761
+ if (this.config.userAgent) {
762
+ headers["User-Agent"] = this.config.userAgent;
763
+ }
764
+ const needsBody = init.body !== void 0 && init.method !== "GET" && init.method !== "DELETE";
765
+ if (needsBody) {
766
+ headers["Content-Type"] = JSON_MIME;
767
+ }
768
+ const requestInit = {
769
+ method: init.method,
770
+ headers,
771
+ body: needsBody ? stringifyJsonBody(init.body) : void 0,
772
+ signal: init.signal
773
+ };
774
+ init.signal?.throwIfAborted();
775
+ onDispatch?.();
776
+ request = "Started" /* Started */;
777
+ const res = await fetchFn(url, requestInit);
778
+ const requestId = res.headers.get("x-request-id") ?? void 0;
779
+ const traceIdentifier = res.headers.get("trace-identifier") ?? void 0;
780
+ const text = await res.text();
781
+ if (!res.ok) {
782
+ const errBody = tryParseErrorBody(text, res.headers.get("content-type"));
783
+ throw createHttpError({
784
+ status: res.status,
785
+ body: errBody,
786
+ url,
787
+ requestId,
788
+ traceIdentifier
789
+ });
790
+ }
791
+ if (text === "") {
792
+ return void 0;
793
+ }
794
+ parsing = true;
795
+ return parseOperationResponse(text, init.method, init.path, res.status);
796
+ } catch (cause) {
797
+ throw normalizeTransportError(cause, request, init.signal, url, parsing);
723
798
  }
724
- return parseOperationResponse(text, init.method, init.path, res.status);
725
799
  }
726
800
  buildUrl(path, query) {
727
801
  const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;
@@ -3079,6 +3153,28 @@ var RelationsFacade = class {
3079
3153
  }
3080
3154
  };
3081
3155
 
3156
+ // ../../src/resources/common/behavior-settings-errors.ts
3157
+ function behaviorSettingsError(category) {
3158
+ return new TorrowSdkError({ category, detail: { domain: "BehaviorSettings" /* BehaviorSettings */ } });
3159
+ }
3160
+ function contextualizeBehaviorError(cause, operation, failureAt, state) {
3161
+ const error = cause instanceof TorrowSdkError ? cause : new TorrowSdkError({
3162
+ category: "Unknown" /* Unknown */,
3163
+ sensitive: { cause }
3164
+ });
3165
+ return error.withContext({
3166
+ operation,
3167
+ failureAt,
3168
+ detail: error.detail ?? { domain: "BehaviorSettings" /* BehaviorSettings */ },
3169
+ effects: state === void 0 ? void 0 : [{ area: "Remote" /* Remote */, step: "Write" /* Write */, state }]
3170
+ });
3171
+ }
3172
+ function isBehaviorCasRefusal(cause) {
3173
+ if (!(cause instanceof TorrowSdkError) || cause.request !== "Started" /* Started */ || cause.http?.status !== 500) return false;
3174
+ const body = cause.getSensitiveDetails().body;
3175
+ return body !== null && typeof body === "object" && "name" in body && body.name === "OBJECT_HAS_WRONG_VERSION" /* VersionConflict */ && "code" in body && (body.code === 208213 /* VersionConflict */ || body.code === String(208213 /* VersionConflict */));
3176
+ }
3177
+
3082
3178
  // ../../src/resources/common/implicit-tag-params.ts
3083
3179
  var SERVICE_IMPLICIT_TAG_SUFFIX = {
3084
3180
  orderNameLegacy: ":ordername",
@@ -3486,39 +3582,77 @@ var ResourcesFacade = class extends TorrowItemFacade {
3486
3582
  return this.getBehaviorSettingsFromResource(resource);
3487
3583
  }
3488
3584
  async updateBehaviorSettings(resourceId, settingsPatch, options) {
3489
- const resource = await this.getById(resourceId, {
3490
- includeDeleted: options?.includeDeleted,
3491
- isNeedItem: options?.isNeedItem,
3492
- isNeedParentResource: options?.isNeedParentResource,
3493
- includeChildTypes: options?.includeChildTypes,
3494
- securityToken: options?.securityToken,
3495
- signal: options?.signal
3496
- });
3497
- const mergeParameters = options?.mergeParameters ?? true;
3498
- const nextSettings = mergeParameters ? {
3499
- ...this.getBehaviorSettingsFromResource(resource),
3500
- ...settingsPatch
3501
- } : { ...settingsPatch };
3502
- const nextTags = mergeResourceBehaviorTags(resource.tags, nextSettings);
3503
- await this.updateTags(resourceId, nextTags, {
3504
- versionToCheck: options?.checkVersion ? resource.meta?.version ?? void 0 : void 0,
3505
- isNeedAnnouncement: options?.isNeedAnnouncement,
3506
- signal: options?.signal
3507
- });
3508
- return this.getById(resourceId, {
3509
- includeDeleted: options?.includeDeleted,
3510
- isNeedItem: options?.isNeedItem,
3511
- isNeedParentResource: options?.isNeedParentResource,
3512
- includeChildTypes: options?.includeChildTypes,
3513
- securityToken: options?.securityToken,
3514
- signal: options?.signal
3515
- });
3585
+ return this.writeBehaviorSettings(resourceId, settingsPatch, options, "ResourcesFacade.updateBehaviorSettings" /* ResourceUpdate */);
3586
+ }
3587
+ /** Контекст локален вызову; алгоритм и число запросов двух публичных операций совпадают. */
3588
+ async writeBehaviorSettings(resourceId, settingsPatch, options, operation) {
3589
+ let failureAt = "ReadCurrent" /* ReadCurrent */;
3590
+ let effect = "NotApplied" /* NotApplied */;
3591
+ try {
3592
+ const resource = await this.getById(resourceId, {
3593
+ includeDeleted: options?.includeDeleted,
3594
+ isNeedItem: options?.isNeedItem,
3595
+ isNeedParentResource: options?.isNeedParentResource,
3596
+ includeChildTypes: options?.includeChildTypes,
3597
+ securityToken: options?.securityToken,
3598
+ signal: options?.signal
3599
+ });
3600
+ failureAt = "PrepareWrite" /* PrepareWrite */;
3601
+ const mergeParameters = options?.mergeParameters ?? true;
3602
+ const nextSettings = mergeParameters ? {
3603
+ ...this.getBehaviorSettingsFromResource(resource),
3604
+ ...settingsPatch
3605
+ } : { ...settingsPatch };
3606
+ const nextTags = mergeResourceBehaviorTags(resource.tags, nextSettings);
3607
+ failureAt = "WriteSettings" /* WriteSettings */;
3608
+ let dispatched = false;
3609
+ let acknowledgement;
3610
+ try {
3611
+ acknowledgement = await this.http.requestJson({
3612
+ method: "PUT",
3613
+ path: `${BASE7}/${encodePathSegment(resourceId)}/tags`,
3614
+ body: nextTags,
3615
+ query: {
3616
+ versionToCheck: options?.checkVersion ? resource.meta?.version ?? void 0 : void 0,
3617
+ isNeedAnnouncement: options?.isNeedAnnouncement
3618
+ },
3619
+ signal: options?.signal
3620
+ }, () => {
3621
+ dispatched = true;
3622
+ });
3623
+ } catch (cause) {
3624
+ effect = dispatched ? "Unknown" /* Unknown */ : "NotApplied" /* NotApplied */;
3625
+ const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({
3626
+ request: dispatched ? "Started" /* Started */ : "NotStarted" /* NotStarted */
3627
+ });
3628
+ if (dispatched && isBehaviorCasRefusal(error)) {
3629
+ effect = "NotApplied" /* NotApplied */;
3630
+ throw error.withContext({
3631
+ category: "VersionConflict" /* VersionConflict */,
3632
+ detail: { domain: "BehaviorSettings" /* BehaviorSettings */ }
3633
+ });
3634
+ }
3635
+ throw error;
3636
+ }
3637
+ effect = acknowledgement?.id === resourceId ? "Applied" /* Applied */ : "Unknown" /* Unknown */;
3638
+ failureAt = "ReadBack" /* ReadBack */;
3639
+ return await this.getById(resourceId, {
3640
+ includeDeleted: options?.includeDeleted,
3641
+ isNeedItem: options?.isNeedItem,
3642
+ isNeedParentResource: options?.isNeedParentResource,
3643
+ includeChildTypes: options?.includeChildTypes,
3644
+ securityToken: options?.securityToken,
3645
+ signal: options?.signal
3646
+ });
3647
+ } catch (cause) {
3648
+ throw contextualizeBehaviorError(cause, operation, failureAt, effect);
3649
+ }
3516
3650
  }
3517
3651
  setBehaviorSettings(resourceId, settings, options) {
3518
- return this.updateBehaviorSettings(resourceId, settings, {
3652
+ return this.writeBehaviorSettings(resourceId, settings, {
3519
3653
  ...options,
3520
3654
  mergeParameters: false
3521
- });
3655
+ }, "ResourcesFacade.setBehaviorSettings" /* ResourceSet */);
3522
3656
  }
3523
3657
  /** `GET /api/v1/resources/personallist` */
3524
3658
  listPersonal(options) {
@@ -3590,61 +3724,39 @@ var ResourcesFacade = class extends TorrowItemFacade {
3590
3724
  };
3591
3725
 
3592
3726
  // ../../src/resources/services/behavior-settings.ts
3593
- var ServiceBehaviorSettingsErrorCategory = /* @__PURE__ */ ((ServiceBehaviorSettingsErrorCategory2) => {
3594
- ServiceBehaviorSettingsErrorCategory2["InvalidInput"] = "InvalidInput";
3595
- ServiceBehaviorSettingsErrorCategory2["AccessDenied"] = "AccessDenied";
3596
- ServiceBehaviorSettingsErrorCategory2["InsufficientData"] = "InsufficientData";
3597
- ServiceBehaviorSettingsErrorCategory2["InvalidResponse"] = "InvalidResponse";
3598
- ServiceBehaviorSettingsErrorCategory2["VersionConflict"] = "VersionConflict";
3599
- ServiceBehaviorSettingsErrorCategory2["WriteOutcomeUnknown"] = "WriteOutcomeUnknown";
3600
- ServiceBehaviorSettingsErrorCategory2["RequestNotSent"] = "RequestNotSent";
3601
- return ServiceBehaviorSettingsErrorCategory2;
3602
- })(ServiceBehaviorSettingsErrorCategory || {});
3603
3727
  var ServiceBehaviorSettingsIssueReason = /* @__PURE__ */ ((ServiceBehaviorSettingsIssueReason2) => {
3604
3728
  ServiceBehaviorSettingsIssueReason2["InvalidValue"] = "InvalidValue";
3605
3729
  ServiceBehaviorSettingsIssueReason2["AmbiguousValue"] = "AmbiguousValue";
3606
3730
  return ServiceBehaviorSettingsIssueReason2;
3607
3731
  })(ServiceBehaviorSettingsIssueReason || {});
3608
- var ServiceBehaviorSettingsError = class extends Error {
3609
- /** Предметная категория; не зависит от кодов MCP. */
3610
- category;
3611
- /** Исходная ошибка транспорта или сервера, если она существует. */
3612
- cause;
3613
- constructor(category, cause) {
3614
- super(`Service BehaviorSettings: ${category}`);
3615
- this.name = "ServiceBehaviorSettingsError";
3616
- this.category = category;
3617
- this.cause = cause;
3618
- }
3619
- };
3620
3732
  var configs = Object.values(SERVICE_IMPLICIT_TAG_REGISTRY);
3621
3733
  function isBehaviorVersion(value) {
3622
3734
  return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 2147483647;
3623
3735
  }
3624
- function record(value) {
3736
+ function record2(value) {
3625
3737
  return value !== null && typeof value === "object" && !Array.isArray(value);
3626
3738
  }
3627
3739
  function validateBehaviorResponse(value, serviceId) {
3628
- if (!record(value) || value.id !== serviceId) throw new ServiceBehaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3740
+ if (!record2(value) || value.id !== serviceId) throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3629
3741
  const personal = value.personalInfo;
3630
- if (record(personal) && (personal.itemContentType === "NoRights" /* NoRights */ || personal.itemContentType === "SubscriptionIsNotValid" /* SubscriptionIsNotValid */)) {
3631
- throw new ServiceBehaviorSettingsError("AccessDenied" /* AccessDenied */);
3742
+ if (record2(personal) && (personal.itemContentType === "NoRights" /* NoRights */ || personal.itemContentType === "SubscriptionIsNotValid" /* SubscriptionIsNotValid */)) {
3743
+ throw behaviorSettingsError("AccessDenied" /* AccessDenied */);
3632
3744
  }
3633
- if (!record(personal) || personal.itemContentType !== "Full" /* Full */ || value.tags == null || !record(value.meta) || !isBehaviorVersion(value.meta.version)) {
3634
- throw new ServiceBehaviorSettingsError("InsufficientData" /* InsufficientData */);
3745
+ if (!record2(personal) || personal.itemContentType !== "Full" /* Full */ || value.tags == null || !record2(value.meta) || !isBehaviorVersion(value.meta.version)) {
3746
+ throw behaviorSettingsError("InsufficientData" /* InsufficientData */);
3635
3747
  }
3636
3748
  if (!Array.isArray(value.tags) || !value.tags.every((tag) => typeof tag === "string")) {
3637
- throw new ServiceBehaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3749
+ throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3638
3750
  }
3639
3751
  const operations = personal.operationList;
3640
3752
  if (operations != null && (!Array.isArray(operations) || !operations.every((operation) => typeof operation === "string" || typeof operation === "number" && Number.isSafeInteger(operation)))) {
3641
- throw new ServiceBehaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3753
+ throw behaviorSettingsError("InvalidResponse" /* InvalidResponse */);
3642
3754
  }
3643
3755
  return { tags: [...new Set(value.tags)], version: value.meta.version, operations };
3644
3756
  }
3645
3757
  function assertBehaviorPermission(operations) {
3646
- if (!Array.isArray(operations)) throw new ServiceBehaviorSettingsError("InsufficientData" /* InsufficientData */);
3647
- if (!operations.includes("SetItemTags" /* SetItemTags */)) throw new ServiceBehaviorSettingsError("AccessDenied" /* AccessDenied */);
3758
+ if (!Array.isArray(operations)) throw behaviorSettingsError("InsufficientData" /* InsufficientData */);
3759
+ if (!operations.includes("SetItemTags" /* SetItemTags */)) throw behaviorSettingsError("AccessDenied" /* AccessDenied */);
3648
3760
  }
3649
3761
  function suffixPrefix(tag, suffix, ignoreCase = false) {
3650
3762
  const matches = ignoreCase ? tag.toLowerCase().endsWith(suffix.toLowerCase()) : tag.endsWith(suffix);
@@ -3724,9 +3836,9 @@ function readBehaviorSettings(tags) {
3724
3836
  }
3725
3837
  function normalizeBehaviorInput(input) {
3726
3838
  function fail() {
3727
- throw new ServiceBehaviorSettingsError("InvalidInput" /* InvalidInput */);
3839
+ throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
3728
3840
  }
3729
- if (!record(input) || Object.keys(input).some((key) => !Object.hasOwn(SERVICE_IMPLICIT_TAG_REGISTRY, key))) fail();
3841
+ if (!record2(input) || Object.keys(input).some((key) => !Object.hasOwn(SERVICE_IMPLICIT_TAG_REGISTRY, key))) fail();
3730
3842
  const output = {};
3731
3843
  for (const config of configs) {
3732
3844
  if (!Object.hasOwn(input, config.field)) continue;
@@ -3744,7 +3856,7 @@ function normalizeBehaviorInput(input) {
3744
3856
  if (!Array.isArray(value)) fail();
3745
3857
  const seen = /* @__PURE__ */ new Set();
3746
3858
  output[config.field] = value.map((entry) => {
3747
- if (!record(entry) || Object.keys(entry).some((key) => !["index", "text", "link"].includes(key)) || typeof entry.index !== "number" || !Number.isSafeInteger(entry.index) || entry.index <= 0 || seen.has(entry.index)) fail();
3859
+ if (!record2(entry) || Object.keys(entry).some((key) => !["index", "text", "link"].includes(key)) || typeof entry.index !== "number" || !Number.isSafeInteger(entry.index) || entry.index <= 0 || seen.has(entry.index)) fail();
3748
3860
  seen.add(entry.index);
3749
3861
  const normalized = { index: entry.index };
3750
3862
  for (const attribute of ["text", "link"]) {
@@ -3897,7 +4009,7 @@ var ServicesFacade = class extends TorrowItemFacade {
3897
4009
  /** Читает сырой OpenAPI DTO до проекции, чтобы malformed tags не маскировались парсером. */
3898
4010
  async readBehaviorState(serviceId, options) {
3899
4011
  if (typeof serviceId !== "string" || !serviceId.trim()) {
3900
- throw new ServiceBehaviorSettingsError("InvalidInput" /* InvalidInput */);
4012
+ throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
3901
4013
  }
3902
4014
  const value = await this.http.requestJson({
3903
4015
  method: "GET",
@@ -3915,8 +4027,12 @@ var ServicesFacade = class extends TorrowItemFacade {
3915
4027
  }
3916
4028
  /** Один GET: версия всей услуги, предметные настройки и диагностика неполного снимка. */
3917
4029
  async getBehaviorSettings(serviceId, options) {
3918
- const state = await this.readBehaviorState(serviceId, options);
3919
- return { serviceId, version: state.version, ...readBehaviorSettings(state.tags) };
4030
+ try {
4031
+ const state = await this.readBehaviorState(serviceId, options);
4032
+ return { serviceId, version: state.version, ...readBehaviorSettings(state.tags) };
4033
+ } catch (cause) {
4034
+ throw contextualizeBehaviorError(cause, "ServicesFacade.getBehaviorSettings" /* ServiceGet */, "ReadCurrent" /* ReadCurrent */);
4035
+ }
3920
4036
  }
3921
4037
  /**
3922
4038
  * GET → локальный patch → PUT /tags с необязательной проверкой версии; автоматического readback нет.
@@ -3924,56 +4040,84 @@ var ServicesFacade = class extends TorrowItemFacade {
3924
4040
  * Порядок и одинаковые дубли сервер не сохраняет; no-op определяется множеством строк.
3925
4041
  */
3926
4042
  async updateBehaviorSettings(serviceId, settingsPatch, options = {}) {
3927
- if (!options || options.versionToCheck !== void 0 && !isBehaviorVersion(options.versionToCheck) || Object.hasOwn(options, "checkVersion") && options.checkVersion !== true || Object.hasOwn(options, "mergeParameters") && typeof options.mergeParameters !== "boolean" || options.isNeedAnnouncement != null && typeof options.isNeedAnnouncement !== "boolean" || Object.keys(options).some((key) => !["versionToCheck", "checkVersion", "mergeParameters", "profileId", "securityToken", "isNeedAnnouncement", "signal"].includes(key))) {
3928
- throw new ServiceBehaviorSettingsError("InvalidInput" /* InvalidInput */);
3929
- }
3930
- const normalized = normalizeBehaviorInput(settingsPatch);
3931
- options = { ...options };
3932
- const state = await this.readBehaviorState(serviceId, {
3933
- profileId: options.profileId,
3934
- securityToken: options.securityToken,
3935
- signal: options.signal
3936
- });
3937
- assertBehaviorPermission(state.operations);
3938
- if (options.versionToCheck !== void 0 && state.version !== options.versionToCheck) {
3939
- throw new ServiceBehaviorSettingsError("VersionConflict" /* VersionConflict */);
3940
- }
3941
- const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);
3942
- const projected = readBehaviorSettings(tags);
3943
- const unchanged = tags.length === state.tags.length && tags.every((tag) => state.tags.includes(tag));
3944
- if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };
3945
- let dispatched = false;
3946
- let result;
4043
+ return this.writeBehaviorSettings(serviceId, settingsPatch, options, "ServicesFacade.updateBehaviorSettings" /* ServiceUpdate */);
4044
+ }
4045
+ /** Общий алгоритм двух публичных операций; контекст и эффект принадлежат только текущему вызову. */
4046
+ async writeBehaviorSettings(serviceId, settingsPatch, options, operation) {
4047
+ let failureAt = "ValidateInput" /* ValidateInput */;
4048
+ let effect = "NotApplied" /* NotApplied */;
3947
4049
  try {
3948
- result = await this.http.requestJson({
3949
- method: "PUT",
3950
- path: `${BASE9}/${encodePathSegment(serviceId)}/tags`,
3951
- query: { versionToCheck: options.versionToCheck ?? (options.checkVersion ? state.version : void 0), isNeedAnnouncement: options.isNeedAnnouncement ?? false },
3952
- body: tags,
4050
+ if (!options || options.versionToCheck !== void 0 && !isBehaviorVersion(options.versionToCheck) || Object.hasOwn(options, "checkVersion") && options.checkVersion !== true || Object.hasOwn(options, "mergeParameters") && typeof options.mergeParameters !== "boolean" || options.isNeedAnnouncement != null && typeof options.isNeedAnnouncement !== "boolean" || Object.keys(options).some((key) => !["versionToCheck", "checkVersion", "mergeParameters", "profileId", "securityToken", "isNeedAnnouncement", "signal"].includes(key))) {
4051
+ throw behaviorSettingsError("InvalidInput" /* InvalidInput */);
4052
+ }
4053
+ const normalized = normalizeBehaviorInput(settingsPatch);
4054
+ options = { ...options };
4055
+ failureAt = "ReadCurrent" /* ReadCurrent */;
4056
+ const state = await this.readBehaviorState(serviceId, {
4057
+ profileId: options.profileId,
4058
+ securityToken: options.securityToken,
3953
4059
  signal: options.signal
3954
- }, () => {
3955
- dispatched = true;
3956
4060
  });
3957
- } catch (cause) {
3958
- if (dispatched && cause instanceof TorrowHttpError && cause.status === 500 && cause.body !== null && typeof cause.body === "object" && "name" in cause.body && cause.body.name === "OBJECT_HAS_WRONG_VERSION" /* VersionConflict */ && "code" in cause.body && (cause.body.code === 208213 /* VersionConflict */ || cause.body.code === String(208213 /* VersionConflict */))) {
3959
- throw new ServiceBehaviorSettingsError("VersionConflict" /* VersionConflict */, cause);
4061
+ failureAt = "PrepareWrite" /* PrepareWrite */;
4062
+ assertBehaviorPermission(state.operations);
4063
+ if (options.versionToCheck !== void 0 && state.version !== options.versionToCheck) {
4064
+ throw behaviorSettingsError("VersionConflict" /* VersionConflict */);
3960
4065
  }
3961
- throw new ServiceBehaviorSettingsError(dispatched ? "WriteOutcomeUnknown" /* WriteOutcomeUnknown */ : "RequestNotSent" /* RequestNotSent */, cause);
3962
- }
3963
- if (!result || result.id !== serviceId || !isBehaviorVersion(result.meta?.version)) {
3964
- throw new ServiceBehaviorSettingsError("WriteOutcomeUnknown" /* WriteOutcomeUnknown */);
4066
+ const tags = mergeBehaviorSettings(state.tags, normalized, options.mergeParameters ?? true);
4067
+ const projected = readBehaviorSettings(tags);
4068
+ const unchanged = tags.length === state.tags.length && tags.every((tag) => state.tags.includes(tag));
4069
+ if (unchanged) return { serviceId, version: state.version, ...projected, changed: false };
4070
+ failureAt = "WriteSettings" /* WriteSettings */;
4071
+ let result;
4072
+ let dispatched = false;
4073
+ try {
4074
+ result = await this.http.requestJson({
4075
+ method: "PUT",
4076
+ path: `${BASE9}/${encodePathSegment(serviceId)}/tags`,
4077
+ query: { versionToCheck: options.versionToCheck ?? (options.checkVersion ? state.version : void 0), isNeedAnnouncement: options.isNeedAnnouncement ?? false },
4078
+ body: tags,
4079
+ signal: options.signal
4080
+ }, () => {
4081
+ dispatched = true;
4082
+ });
4083
+ } catch (cause) {
4084
+ effect = dispatched ? "Unknown" /* Unknown */ : "NotApplied" /* NotApplied */;
4085
+ const error = contextualizeBehaviorError(cause, operation, failureAt, effect).withContext({
4086
+ request: dispatched ? "Started" /* Started */ : "NotStarted" /* NotStarted */
4087
+ });
4088
+ if (dispatched && isBehaviorCasRefusal(error)) {
4089
+ effect = "NotApplied" /* NotApplied */;
4090
+ throw error.withContext({
4091
+ category: "VersionConflict" /* VersionConflict */,
4092
+ detail: { domain: "BehaviorSettings" /* BehaviorSettings */ }
4093
+ });
4094
+ }
4095
+ throw error;
4096
+ }
4097
+ effect = "Unknown" /* Unknown */;
4098
+ failureAt = "ValidateWriteResponse" /* ValidateWriteResponse */;
4099
+ if (!result || result.id !== serviceId || !isBehaviorVersion(result.meta?.version)) {
4100
+ throw new TorrowSdkError({
4101
+ category: "InvalidResponse" /* InvalidResponse */,
4102
+ request: "Started" /* Started */,
4103
+ detail: { domain: "BehaviorSettings" /* BehaviorSettings */ },
4104
+ sensitive: { body: result }
4105
+ });
4106
+ }
4107
+ return { serviceId, version: result.meta.version, ...projected, changed: true };
4108
+ } catch (cause) {
4109
+ throw contextualizeBehaviorError(cause, operation, failureAt, effect);
3965
4110
  }
3966
- return { serviceId, version: result.meta.version, ...projected, changed: true };
3967
4111
  }
3968
4112
  /** Полная замена: пропущенные поля очищаются, посторонние данные сохраняются. */
3969
4113
  setBehaviorSettings(serviceId, settings, options = {}) {
3970
- return this.updateBehaviorSettings(serviceId, settings, { ...options, mergeParameters: false });
4114
+ return this.writeBehaviorSettings(serviceId, settings, { ...options, mergeParameters: false }, "ServicesFacade.setBehaviorSettings" /* ServiceSet */);
3971
4115
  }
3972
4116
  /**
3973
4117
  * Запись на услугу — `POST /api/v1/services/{serviceId}/order`.
3974
4118
  * Минимум в теле: непустой смысл в `checkInProperties` (слот, участник, контакты — по правилам услуги и OpenAPI).
3975
4119
  * Успех: `OrderResp` (часто интересен `order` как кейс и `consumerSecurityToken` для гостевого доступа).
3976
- * Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowHttpError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.
4120
+ * Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowSdkError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.
3977
4121
  */
3978
4122
  createOrder(serviceId, body, options) {
3979
4123
  return createOrder(this.http, serviceId, body, options);
@@ -5800,21 +5944,30 @@ var ShortUrlFacade = class {
5800
5944
  * Возвращает заголовок `Location` без следования редиректу.
5801
5945
  */
5802
5946
  async getRedirectLocation(shortUrl, options) {
5803
- const fetchFn = this.config.fetch ?? globalThis.fetch;
5804
- const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;
5805
- const url = joinBaseUrlAndPath(origin, `${BASE27}/${encodePathSegment(shortUrl)}`);
5806
- const authHeaders = await buildAuthHeaders(this.config);
5807
- const res = await fetchFn(url, {
5808
- method: "GET",
5809
- redirect: "manual",
5810
- headers: {
5811
- Accept: "*/*",
5812
- ...authHeaders,
5813
- ...this.config.defaultHeaders
5814
- },
5815
- signal: options?.signal
5816
- });
5817
- return res.headers.get("Location");
5947
+ let request = "NotStarted" /* NotStarted */;
5948
+ let url;
5949
+ try {
5950
+ const fetchFn = this.config.fetch ?? globalThis.fetch;
5951
+ const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;
5952
+ url = joinBaseUrlAndPath(origin, `${BASE27}/${encodePathSegment(shortUrl)}`);
5953
+ const authHeaders = await buildAuthHeaders(this.config);
5954
+ const init = {
5955
+ method: "GET",
5956
+ redirect: "manual",
5957
+ headers: {
5958
+ Accept: "*/*",
5959
+ ...authHeaders,
5960
+ ...this.config.defaultHeaders
5961
+ },
5962
+ signal: options?.signal
5963
+ };
5964
+ options?.signal?.throwIfAborted();
5965
+ request = "Started" /* Started */;
5966
+ const res = await fetchFn(url, init);
5967
+ return res.headers.get("Location");
5968
+ } catch (cause) {
5969
+ throw normalizeTransportError(cause, request, options?.signal, url);
5970
+ }
5818
5971
  }
5819
5972
  };
5820
5973
 
@@ -6966,8 +7119,8 @@ var ServiceOrderConflictErrorNameValues = {
6966
7119
  ServiceUnavailableAtTime: "SERVICE_IS_NOT_AVAILABLE_AT_TIME"
6967
7120
  };
6968
7121
  function getServiceOrderConflictReason(error) {
6969
- if (!(error instanceof TorrowHttpError)) return void 0;
6970
- switch (error.apiErrorName) {
7122
+ if (!(error instanceof TorrowSdkError)) return void 0;
7123
+ switch (error.http?.apiErrorName) {
6971
7124
  case ServiceOrderConflictErrorNameValues.ResourceUnavailable:
6972
7125
  return "resource-unavailable";
6973
7126
  case ServiceOrderConflictErrorNameValues.QuantityUnavailable:
@@ -7171,6 +7324,9 @@ export {
7171
7324
  AuthFacade,
7172
7325
  AuthScopeValueList,
7173
7326
  AuthScopeValues,
7327
+ AuthSessionEffectStep,
7328
+ AuthSessionErrorReason,
7329
+ BehaviorSettingsEffectStep,
7174
7330
  BlockReasonsFacade,
7175
7331
  CalendarsFacade,
7176
7332
  CaseStateValues,
@@ -7206,6 +7362,7 @@ export {
7206
7362
  LoyaltySystemsFacade,
7207
7363
  NoteTypeValues,
7208
7364
  NotesFacade,
7365
+ OtpErrorReason,
7209
7366
  ParticipationFieldRequirementTypeValues,
7210
7367
  ParticipationFieldTypeValues,
7211
7368
  PinnedViewsFacade,
@@ -7219,8 +7376,6 @@ export {
7219
7376
  SearchFacade,
7220
7377
  SendCodeAccountTypeValueList,
7221
7378
  SendCodeAccountTypeValues,
7222
- ServiceBehaviorSettingsError,
7223
- ServiceBehaviorSettingsErrorCategory,
7224
7379
  ServiceBehaviorSettingsIssueReason,
7225
7380
  ServiceBuilder,
7226
7381
  ServiceCheckInWizardStepParameterName,
@@ -7241,11 +7396,16 @@ export {
7241
7396
  TokenStatusValueList,
7242
7397
  TokenStatusValues,
7243
7398
  TorrowClient,
7244
- TorrowHttpError,
7245
7399
  TorrowIdError,
7246
7400
  TorrowItemTypeValueList,
7247
7401
  TorrowItemTypeValues,
7248
7402
  TorrowObjectTypeCode,
7403
+ TorrowSdkEffectArea,
7404
+ TorrowSdkEffectState,
7405
+ TorrowSdkError,
7406
+ TorrowSdkErrorCategory,
7407
+ TorrowSdkErrorDomain,
7408
+ TorrowSdkRequestState,
7249
7409
  UsageConditionTypeValues,
7250
7410
  UsageTypeValues,
7251
7411
  UserAccessLevelValues,