@coopenomics/extension-kit 2026.9.16-2 → 2026.9.19

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.cjs CHANGED
@@ -4,6 +4,7 @@ const common = require('@nestjs/common');
4
4
  const graphql = require('@nestjs/graphql');
5
5
  const core = require('@nestjs/core');
6
6
  const passport = require('@nestjs/passport');
7
+ const node_crypto = require('node:crypto');
7
8
  const zod = require('zod');
8
9
  const classValidator = require('class-validator');
9
10
  const classTransformer = require('class-transformer');
@@ -14,6 +15,7 @@ const moment = require('moment');
14
15
  const moment$1 = require('moment-timezone');
15
16
  require('moment/locale/ru');
16
17
  const crypto = require('crypto');
18
+ const cooptypes = require('cooptypes');
17
19
 
18
20
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
19
21
 
@@ -22,12 +24,15 @@ const moment__default$1 = /*#__PURE__*/_interopDefaultCompat(moment$1);
22
24
  const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
23
25
 
24
26
  const ROLES_DENY_SELF_KEY = "roles_deny_self";
27
+ const ROLES_ANY_STATUS_KEY = "roles_any_status";
25
28
  function AuthRoles(roles, options = {}) {
26
29
  const self = options.self ?? [];
27
30
  const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
28
31
  const decorators = [common.SetMetadata("roles", roles), graphql.Directive(`@auth(${args})`)];
29
32
  if (options.allowSelf === false)
30
33
  decorators.push(common.SetMetadata(ROLES_DENY_SELF_KEY, true));
34
+ if (options.anyStatus === true)
35
+ decorators.push(common.SetMetadata(ROLES_ANY_STATUS_KEY, true));
31
36
  return common.applyDecorators(...decorators);
32
37
  }
33
38
  const CurrentUser = common.createParamDecorator((data, context) => {
@@ -52,7 +57,12 @@ function configureExtensionAuth(options) {
52
57
  function hasServerSecret(headers) {
53
58
  if (!serverSecret)
54
59
  return false;
55
- return headers?.["server-secret"] === serverSecret;
60
+ const provided = headers?.["server-secret"];
61
+ if (typeof provided !== "string")
62
+ return false;
63
+ const a = Buffer.from(provided);
64
+ const b = Buffer.from(serverSecret);
65
+ return a.length === b.length && node_crypto.timingSafeEqual(a, b);
56
66
  }
57
67
 
58
68
  var __defProp$g = Object.defineProperty;
@@ -67,6 +77,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
67
77
  return result;
68
78
  };
69
79
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
80
+ const ACTIVE_USER_STATUS = "active";
81
+ const PARTICIPANT_ROLE = "user";
70
82
  exports.GqlJwtAuthGuard = class GqlJwtAuthGuard extends passport.AuthGuard("jwt") {
71
83
  getRequest(context) {
72
84
  const ctx = graphql.GqlExecutionContext.create(context);
@@ -158,6 +170,10 @@ exports.RolesGuard = class RolesGuard {
158
170
  return true;
159
171
  }
160
172
  if (allowedRoles.includes(user.role)) {
173
+ const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
174
+ if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
175
+ throw new common.ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
176
+ }
161
177
  return true;
162
178
  }
163
179
  throw new common.UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
@@ -167,7 +183,6 @@ exports.RolesGuard = __decorateClass$g([
167
183
  common.Injectable(),
168
184
  __decorateParam(0, common.Inject(core.Reflector))
169
185
  ], exports.RolesGuard);
170
- const ACTIVE_USER_STATUS = "active";
171
186
  exports.ActiveUserStatusGuard = class ActiveUserStatusGuard {
172
187
  canActivate(context) {
173
188
  const ctx = graphql.GqlExecutionContext.create(context);
@@ -1899,6 +1914,12 @@ function generateHashFromString(input) {
1899
1914
  return crypto__default.createHash("sha256").update(input).digest("hex");
1900
1915
  }
1901
1916
 
1917
+ function sanitizeUserText(value) {
1918
+ if (typeof value !== "string" || !value)
1919
+ return value;
1920
+ return cooptypes._Common.Text.sanitizeEditorMarkdown(value);
1921
+ }
1922
+
1902
1923
  function rethrowChainError(error) {
1903
1924
  const raw = error?.message ?? String(error);
1904
1925
  const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
@@ -1934,6 +1955,7 @@ exports.OptionalCurrentUser = OptionalCurrentUser;
1934
1955
  exports.PaginationResult = PaginationResult;
1935
1956
  exports.PaginationUtils = PaginationUtils;
1936
1957
  exports.QuantityUtils = QuantityUtils;
1958
+ exports.ROLES_ANY_STATUS_KEY = ROLES_ANY_STATUS_KEY;
1937
1959
  exports.ROLES_DENY_SELF_KEY = ROLES_DENY_SELF_KEY;
1938
1960
  exports.UseBucket = UseBucket;
1939
1961
  exports.bucketProvidersFor = bucketProvidersFor;
@@ -1961,5 +1983,6 @@ exports.redactSecretConfig = redactSecretConfig;
1961
1983
  exports.registerExtensionEntities = registerExtensionEntities;
1962
1984
  exports.resetExtensionEntities = resetExtensionEntities;
1963
1985
  exports.rethrowChainError = rethrowChainError;
1986
+ exports.sanitizeUserText = sanitizeUserText;
1964
1987
  exports.verifySignedDocumentAgainstStoredDraft = verifySignedDocumentAgainstStoredDraft;
1965
1988
  exports.waitAfterTransactBeforeChainTableRead = waitAfterTransactBeforeChainTableRead;
package/dist/index.d.cts CHANGED
@@ -24,9 +24,20 @@ interface AuthRolesOptions {
24
24
  * ставится `false`: иначе пайщик выполнил бы его над собой.
25
25
  */
26
26
  allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
27
36
  }
28
37
  /** Ключ метаданных: самообход `RolesGuard` запрещён. */
29
38
  declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
30
41
  /**
31
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
32
43
  *
@@ -99,7 +110,12 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
99
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
100
111
  * либо плоским аргументом совпадает с `user.username`) — разрешено, если
101
112
  * операция не объявила `AuthRoles(..., { allowSelf: false })`.
102
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
103
119
  * 5. Иначе — отказ.
104
120
  */
105
121
  declare class RolesGuard implements CanActivate {
@@ -833,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
833
849
  * Необязательное поле.
834
850
  */
835
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
836
865
  /**
837
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
838
867
  * Необязательное поле.
@@ -1505,6 +1534,21 @@ declare class CurrencyValidationUtil {
1505
1534
  static formatAmount(value: number, precision?: number): string;
1506
1535
  }
1507
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1508
1552
  /**
1509
1553
  * Ошибка API с кодом состояния HTTP.
1510
1554
  *
@@ -1531,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1531
1575
  */
1532
1576
  declare function rethrowChainError(error: unknown): never;
1533
1577
 
1534
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1535
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.d.mts CHANGED
@@ -24,9 +24,20 @@ interface AuthRolesOptions {
24
24
  * ставится `false`: иначе пайщик выполнил бы его над собой.
25
25
  */
26
26
  allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
27
36
  }
28
37
  /** Ключ метаданных: самообход `RolesGuard` запрещён. */
29
38
  declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
30
41
  /**
31
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
32
43
  *
@@ -99,7 +110,12 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
99
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
100
111
  * либо плоским аргументом совпадает с `user.username`) — разрешено, если
101
112
  * операция не объявила `AuthRoles(..., { allowSelf: false })`.
102
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
103
119
  * 5. Иначе — отказ.
104
120
  */
105
121
  declare class RolesGuard implements CanActivate {
@@ -833,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
833
849
  * Необязательное поле.
834
850
  */
835
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
836
865
  /**
837
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
838
867
  * Необязательное поле.
@@ -1505,6 +1534,21 @@ declare class CurrencyValidationUtil {
1505
1534
  static formatAmount(value: number, precision?: number): string;
1506
1535
  }
1507
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1508
1552
  /**
1509
1553
  * Ошибка API с кодом состояния HTTP.
1510
1554
  *
@@ -1531,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1531
1575
  */
1532
1576
  declare function rethrowChainError(error: unknown): never;
1533
1577
 
1534
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1535
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.d.ts CHANGED
@@ -24,9 +24,20 @@ interface AuthRolesOptions {
24
24
  * ставится `false`: иначе пайщик выполнил бы его над собой.
25
25
  */
26
26
  allowSelf?: boolean;
27
+ /**
28
+ * Пускает ли роль `user` пайщика, которого совет ещё не принял (или уже
29
+ * исключил). По умолчанию нет: `user` в списке ролей означает «принятый
30
+ * пайщик», и учётная запись со статусом вступления по роли не проходит —
31
+ * иначе любой, кто заполнил форму регистрации, читал бы реестры кооператива.
32
+ * `true` — для того, что нужно и кандидату: входящие уведомления о ходе
33
+ * его же заявления.
34
+ */
35
+ anyStatus?: boolean;
27
36
  }
28
37
  /** Ключ метаданных: самообход `RolesGuard` запрещён. */
29
38
  declare const ROLES_DENY_SELF_KEY = "roles_deny_self";
39
+ /** Ключ метаданных: роль `user` проходит в любом статусе учётной записи. */
40
+ declare const ROLES_ANY_STATUS_KEY = "roles_any_status";
30
41
  /**
31
42
  * Ограничение доступа к резолверу или к отдельному полю объекта.
32
43
  *
@@ -99,7 +110,12 @@ declare class HttpJwtAuthGuard extends HttpJwtAuthGuard_base {
99
110
  * 3. Пользователь обращается к своим ресурсам (`username` вложенный в `data`/`filter`
100
111
  * либо плоским аргументом совпадает с `user.username`) — разрешено, если
101
112
  * операция не объявила `AuthRoles(..., { allowSelf: false })`.
102
- * 4. У пользователя есть одна из разрешённых ролей — разрешено.
113
+ * 4. У пользователя есть одна из разрешённых ролей — разрешено. Роль `user`
114
+ * при этом означает принятого пайщика: учётная запись в статусе вступления
115
+ * или исключения по ней не проходит (если операция не объявила
116
+ * `AuthRoles(..., { anyStatus: true })`). Совет по своей роли проходит в
117
+ * любом статусе: членов совета, заведённых при установке, цепь в
118
+ * `active` не переводит.
103
119
  * 5. Иначе — отказ.
104
120
  */
105
121
  declare class RolesGuard implements CanActivate {
@@ -833,6 +849,19 @@ interface DeserializedDescriptionOfExtension {
833
849
  * Необязательное поле.
834
850
  */
835
851
  maxRows?: number;
852
+ /**
853
+ * Сколько строк многострочное поле показывает сразу, до ввода текста. Поле
854
+ * растёт по мере ввода, но не бывает ниже этой высоты — по виду сразу понятно,
855
+ * что ответ ждут развёрнутый. Задание `minRows` само делает поле многострочным.
856
+ * Необязательное поле.
857
+ */
858
+ minRows?: number;
859
+ /**
860
+ * Текст-заполнитель внутри пустого поля: пример ответа или формата, чтобы
861
+ * поле не выглядело пустым. Исчезает, как только человек начинает ввод.
862
+ * Необязательное поле.
863
+ */
864
+ placeholder?: string;
836
865
  /**
837
866
  * Добавляет текст после значения поля в интерфейсе (например, символ валюты).
838
867
  * Необязательное поле.
@@ -1505,6 +1534,21 @@ declare class CurrencyValidationUtil {
1505
1534
  static formatAmount(value: number, precision?: number): string;
1506
1535
  }
1507
1536
 
1537
+ /**
1538
+ * Очистка текста, который человек пишет в редакторе: описание проекта или
1539
+ * задачи, приглашение, краткое содержание звонка.
1540
+ *
1541
+ * Правило одно на кабинет и сервер и живёт в `cooptypes`; здесь — только
1542
+ * удобная точка вызова для расширений и обработка пустых значений. До
1543
+ * 17.09.2026 очистка стояла лишь в редакторе, поэтому запрос напрямую в API
1544
+ * клал в базу произвольную разметку, а она потом попадала в собираемые
1545
+ * документы.
1546
+ *
1547
+ * Правило намеренно мягкое: описание живёт вперемешку с разметкой, таблицами и
1548
+ * схемами BPMN — убирается только исполняемое.
1549
+ */
1550
+ declare function sanitizeUserText<T extends string | null | undefined>(value: T): T;
1551
+
1508
1552
  /**
1509
1553
  * Ошибка API с кодом состояния HTTP.
1510
1554
  *
@@ -1531,5 +1575,5 @@ declare class HttpApiError extends HttpException {
1531
1575
  */
1532
1576
  declare function rethrowChainError(error: unknown): never;
1533
1577
 
1534
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1578
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1535
1579
  export type { AuthRolesOptions, BucketSource, BucketSpec, DeserializedDescriptionOfExtension, ExcludeCommonProps, ExtensionAppTerminatePayload, ExtensionAuthOptions, ExtensionConfigFieldPolicy, ExtensionConfigPolicy, ExtensionDomainInterface, ExtensionDomainRepository, ExtensionEntityClass, ExtensionSchemaMigrationAfterContext, GeneratedDocumentDomainInterface, GeneratedDocumentDraft, IDesktopConfig, IExtensionSchemaMigration, IRegistryExtension, IResolvedRegistryExtension, LoadGeneratedDocumentByDocHash, LogExtensionDomainInterface, LogExtensionDomainRepository, LogExtensionFilter, LogExtensionPaginationOptions, LogExtensionPaginationResult, PaymentDetails, PlatformBlockchainSettings, PlatformSettings, RegisteredBucket, RequireFields, SignedDocumentMetaCompareMode, SignedDocumentMetaVerification, SignedDocumentToVerify, TransactResultWithResponse };
package/dist/index.mjs CHANGED
@@ -2,6 +2,7 @@ import { createParamDecorator, UnauthorizedException, SetMetadata, applyDecorato
2
2
  import { GqlExecutionContext, Directive, Field, InputType, registerEnumType, Int, IntersectionType, OmitType, ObjectType } from '@nestjs/graphql';
3
3
  import { Reflector } from '@nestjs/core';
4
4
  import { AuthGuard } from '@nestjs/passport';
5
+ import { timingSafeEqual } from 'node:crypto';
5
6
  import { z } from 'zod';
6
7
  import { IsNumber, IsString, IsArray, ArrayMinSize, ValidateNested, IsEnum, IsInt, IsOptional, Matches, IsNotEmpty, IsObject } from 'class-validator';
7
8
  import { Type } from 'class-transformer';
@@ -12,14 +13,18 @@ import moment from 'moment';
12
13
  import moment$1 from 'moment-timezone';
13
14
  import 'moment/locale/ru';
14
15
  import crypto from 'crypto';
16
+ import { _Common } from 'cooptypes';
15
17
 
16
18
  const ROLES_DENY_SELF_KEY = "roles_deny_self";
19
+ const ROLES_ANY_STATUS_KEY = "roles_any_status";
17
20
  function AuthRoles(roles, options = {}) {
18
21
  const self = options.self ?? [];
19
22
  const args = self.length ? `roles: ${JSON.stringify(roles)}, self: ${JSON.stringify(self)}` : `roles: ${JSON.stringify(roles)}`;
20
23
  const decorators = [SetMetadata("roles", roles), Directive(`@auth(${args})`)];
21
24
  if (options.allowSelf === false)
22
25
  decorators.push(SetMetadata(ROLES_DENY_SELF_KEY, true));
26
+ if (options.anyStatus === true)
27
+ decorators.push(SetMetadata(ROLES_ANY_STATUS_KEY, true));
23
28
  return applyDecorators(...decorators);
24
29
  }
25
30
  const CurrentUser = createParamDecorator((data, context) => {
@@ -44,7 +49,12 @@ function configureExtensionAuth(options) {
44
49
  function hasServerSecret(headers) {
45
50
  if (!serverSecret)
46
51
  return false;
47
- return headers?.["server-secret"] === serverSecret;
52
+ const provided = headers?.["server-secret"];
53
+ if (typeof provided !== "string")
54
+ return false;
55
+ const a = Buffer.from(provided);
56
+ const b = Buffer.from(serverSecret);
57
+ return a.length === b.length && timingSafeEqual(a, b);
48
58
  }
49
59
 
50
60
  var __defProp$g = Object.defineProperty;
@@ -59,6 +69,8 @@ var __decorateClass$g = (decorators, target, key, kind) => {
59
69
  return result;
60
70
  };
61
71
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
72
+ const ACTIVE_USER_STATUS = "active";
73
+ const PARTICIPANT_ROLE = "user";
62
74
  let GqlJwtAuthGuard = class extends AuthGuard("jwt") {
63
75
  getRequest(context) {
64
76
  const ctx = GqlExecutionContext.create(context);
@@ -150,6 +162,10 @@ let RolesGuard = class {
150
162
  return true;
151
163
  }
152
164
  if (allowedRoles.includes(user.role)) {
165
+ const anyStatus = this.reflector.get(ROLES_ANY_STATUS_KEY, context.getHandler()) === true;
166
+ if (user.role === PARTICIPANT_ROLE && !anyStatus && user.status !== ACTIVE_USER_STATUS) {
167
+ throw new ForbiddenException("\u0414\u043E\u0441\u0442\u0443\u043F \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043F\u0430\u0439\u0449\u0438\u043A\u043E\u0432 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430");
168
+ }
153
169
  return true;
154
170
  }
155
171
  throw new UnauthorizedException(`\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430`);
@@ -159,7 +175,6 @@ RolesGuard = __decorateClass$g([
159
175
  Injectable(),
160
176
  __decorateParam(0, Inject(Reflector))
161
177
  ], RolesGuard);
162
- const ACTIVE_USER_STATUS = "active";
163
178
  let ActiveUserStatusGuard = class {
164
179
  canActivate(context) {
165
180
  const ctx = GqlExecutionContext.create(context);
@@ -1891,6 +1906,12 @@ function generateHashFromString(input) {
1891
1906
  return crypto.createHash("sha256").update(input).digest("hex");
1892
1907
  }
1893
1908
 
1909
+ function sanitizeUserText(value) {
1910
+ if (typeof value !== "string" || !value)
1911
+ return value;
1912
+ return _Common.Text.sanitizeEditorMarkdown(value);
1913
+ }
1914
+
1894
1915
  function rethrowChainError(error) {
1895
1916
  const raw = error?.message ?? String(error);
1896
1917
  const match = raw.match(/assertion failure with message: (.+?)(?:\n|$)/);
@@ -1898,4 +1919,4 @@ function rethrowChainError(error) {
1898
1919
  throw new BadRequestException(clean);
1899
1920
  }
1900
1921
 
1901
- export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
1922
+ export { ActiveUserStatusGuard, AmountFormatterUtils, AssetUtils, AuthRoles, BaseExtensionModule, BucketRegistry, CandidateFilterInputDTO, CandidateOutputDTO, CandidateStatus, CurrencyValidationUtil, CurrentUser, DEFAULT_DOCUMENT_VERSION, DateUtils, DocumentAggregateDTO, DomainToBlockchainUtils, EMPTY_HASH, EXTENSION_APP_TERMINATE_EVENT, EXTENSION_REPOSITORY, EXTENSION_SECRET_SET, EXTENSION_SECRET_UNSET, ExpenseProposalStatementGenerateDocumentInputDTO, ExpenseProposalStatementSignedDocumentInputDTO, ExpenseProposalStatementSignedMetaDocumentInputDTO, ExtensionAvailability, ExtensionConfigSuppliedBy, ExtensionDomainEntity, GenerateDocumentInputDTO, GenerateDocumentOptionsInputDTO, GenerateMetaDocumentInputDTO, GeneratedDocumentDTO, GqlJwtAuthGuard, HttpApiError, HttpJwtAuthGuard, IPNProvider, InjectBucket, LOG_EXTENSION_REPOSITORY, LangType, LogExtensionDomainEntity, MetaDocumentInputDTO, ONBOARDING_EXPIRY_DAYS, ONBOARDING_EXPIRY_MS, OptionalCurrentUser, OptionalGqlJwtAuthGuard, PaginationInputDTO, PaginationResult, PaginationUtils, PaymentProvider, PollingProvider, QuantityUtils, ROLES_ANY_STATUS_KEY, ROLES_DENY_SELF_KEY, RolesGuard, SignatureInfoDTO, SignatureInfoInputDTO, SignedDigitalDocumentDTO, SignedDigitalDocumentInputDTO, TransactionDTO, UseBucket, bucketProvidersFor, bucketTokenFor, buildPaginationResult, checkPaymentAmount, checkPaymentSymbol, computeOnboardingExpiresAt, configureExtensionAuth, configurePlatformSettings, createPaginationResult, extensionEntities, generateHashFromString, generateRandomHash, generateUniqueHash, getAmountPlusFee, getAppliedBlockNum, hasServerSecret, isExtensionAvailable, mergeSecretConfig, paginationInputToOffset, platformSettings, providerSuppliedPaths, redactSecretConfig, registerExtensionEntities, resetExtensionEntities, rethrowChainError, sanitizeUserText, verifySignedDocumentAgainstStoredDraft, waitAfterTransactBeforeChainTableRead };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@coopenomics/extension-kit",
3
3
  "type": "module",
4
- "version": "2026.9.16-2",
4
+ "version": "2026.9.19",
5
5
  "description": "Служебный каркас расширения цифрового кооператива: базовый модуль, сущности и репозитории расширения, авторизация, каркас блокчейн-синхронизации, контракт миграций схемы, контракт реестра",
6
6
  "author": "Alex Ant <dacom.dark.sun@gmail.com>",
7
7
  "license": "MIT",
@@ -38,7 +38,7 @@
38
38
  "typecheck": "tsc --noEmit"
39
39
  },
40
40
  "peerDependencies": {
41
- "@coopenomics/sdk": "2026.9.16-2",
41
+ "@coopenomics/sdk": "2026.9.19",
42
42
  "@nestjs/common": "^10.0.0",
43
43
  "@nestjs/core": "^10.0.0",
44
44
  "@nestjs/graphql": "^12.2.1",
@@ -68,7 +68,7 @@
68
68
  "@wharfkit/session": "^1.4.0",
69
69
  "class-transformer": "^0.5.1",
70
70
  "class-validator": "^0.14.1",
71
- "cooptypes": "2026.9.16-2",
71
+ "cooptypes": "2026.9.19",
72
72
  "graphql": "^16.9.0",
73
73
  "graphql-type-json": "^0.3.2",
74
74
  "moment": "^2.30.1",
@@ -80,5 +80,5 @@
80
80
  "unbuild": "^2.0.0",
81
81
  "zod": "^3.0.0"
82
82
  },
83
- "gitHead": "97b9f48f94efe92b20cecb66630e8bf821c73b59"
83
+ "gitHead": "902bd2627e36f1ac40dd09ef42627c0c53c3cdb1"
84
84
  }