letopis 1.4.2 → 3.0.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.
Files changed (123) hide show
  1. package/AGENT-CHEATSHEET.md +516 -398
  2. package/CHANGELOG.md +739 -0
  3. package/LICENSE +75 -21
  4. package/LICENSE-COMMERCIAL.md +49 -0
  5. package/README.md +1312 -1190
  6. package/api-contract.json +381 -0
  7. package/dist/acl.d.ts +81 -1
  8. package/dist/acl.js +281 -13
  9. package/dist/admin.d.ts +11 -141
  10. package/dist/admin.js +28 -186
  11. package/dist/auth.d.ts +20 -5
  12. package/dist/auth.js +80 -21
  13. package/dist/cache.d.ts +8 -1
  14. package/dist/cache.js +30 -8
  15. package/dist/chain.d.ts +46 -48
  16. package/dist/chain.js +556 -223
  17. package/dist/cli.js +73 -96
  18. package/dist/demo/booking.d.ts +352 -36
  19. package/dist/describe.d.ts +47 -0
  20. package/dist/describe.js +195 -0
  21. package/dist/errors.d.ts +77 -13
  22. package/dist/errors.js +231 -30
  23. package/dist/index.d.ts +62 -74
  24. package/dist/index.js +312 -155
  25. package/dist/internal.d.ts +7 -0
  26. package/dist/jsonschema.js +18 -17
  27. package/dist/load.d.ts +29 -17
  28. package/dist/load.js +235 -190
  29. package/dist/log.d.ts +121 -0
  30. package/dist/log.js +633 -0
  31. package/dist/mcp.d.ts +5 -7
  32. package/dist/mcp.js +194 -225
  33. package/dist/messages/access.d.ts +90 -0
  34. package/dist/messages/access.js +113 -0
  35. package/dist/messages/api.d.ts +237 -0
  36. package/dist/messages/api.js +304 -0
  37. package/dist/messages/boot.d.ts +201 -0
  38. package/dist/messages/boot.js +256 -0
  39. package/dist/messages/codes.d.ts +172 -0
  40. package/dist/messages/codes.js +173 -0
  41. package/dist/messages/index.d.ts +98 -0
  42. package/dist/messages/index.js +121 -0
  43. package/dist/messages/log.d.ts +229 -0
  44. package/dist/messages/log.js +102 -0
  45. package/dist/messages/mcp.d.ts +306 -0
  46. package/dist/messages/mcp.js +387 -0
  47. package/dist/messages/model.d.ts +256 -0
  48. package/dist/messages/model.js +314 -0
  49. package/dist/messages/query.d.ts +141 -0
  50. package/dist/messages/query.js +171 -0
  51. package/dist/messages/sql-access.d.ts +70 -0
  52. package/dist/messages/sql-access.js +87 -0
  53. package/dist/messages/sql-core.d.ts +164 -0
  54. package/dist/messages/sql-core.js +198 -0
  55. package/dist/messages/sql-time.d.ts +86 -0
  56. package/dist/messages/sql-time.js +111 -0
  57. package/dist/messages/sql-write.d.ts +246 -0
  58. package/dist/messages/sql-write.js +270 -0
  59. package/dist/messages/time.d.ts +23 -0
  60. package/dist/messages/time.js +29 -0
  61. package/dist/messages/types.d.ts +27 -0
  62. package/dist/messages/types.js +5 -0
  63. package/dist/messages/write.d.ts +452 -0
  64. package/dist/messages/write.js +572 -0
  65. package/dist/model.d.ts +77 -60
  66. package/dist/model.js +43 -34
  67. package/dist/ops.d.ts +35 -0
  68. package/dist/ops.js +101 -0
  69. package/dist/pglite.d.ts +0 -9
  70. package/dist/pglite.js +3 -1
  71. package/dist/registry.d.ts +3 -19
  72. package/dist/registry.js +3 -16
  73. package/dist/signals.d.ts +1 -5
  74. package/dist/signals.js +1 -5
  75. package/dist/sql.d.ts +9 -1
  76. package/dist/sql.js +175 -107
  77. package/dist/sync.d.ts +10 -4
  78. package/dist/sync.js +90 -17
  79. package/dist/tx.d.ts +21 -2
  80. package/dist/tx.js +76 -13
  81. package/dist/typed.d.ts +252 -53
  82. package/dist/types.d.ts +93 -90
  83. package/dist/types.js +17 -14
  84. package/dist/up.d.ts +56 -35
  85. package/dist/up.js +229 -83
  86. package/dist/uuid.d.ts +8 -0
  87. package/dist/uuid.js +14 -6
  88. package/dist/validate.d.ts +13 -1
  89. package/dist/validate.js +82 -33
  90. package/dist/watch.d.ts +10 -16
  91. package/dist/watch.js +36 -77
  92. package/dist/write.d.ts +87 -17
  93. package/dist/write.js +441 -206
  94. package/llms.txt +48 -31
  95. package/package.json +13 -14
  96. package/sql/10-core.sql +7 -50
  97. package/sql/15-errors.sql +64 -10
  98. package/sql/20-context.sql +18 -9
  99. package/sql/30-validate.sql +79 -30
  100. package/sql/40-class.sql +41 -115
  101. package/sql/50-acl.sql +8 -13
  102. package/sql/60-write.sql +220 -676
  103. package/sql/70-read.sql +11 -13
  104. package/sql/80-auth.sql +109 -42
  105. package/sql/90-time.sql +108 -947
  106. package/sql/95-seed.system.sql +7 -14
  107. package/sql/99-revision.sql +6 -1
  108. package/sql/README.md +32 -24
  109. package/sql/migrate/0009-restore-rev.tenants-name.sql +10 -0
  110. package/sql/migrate/0010-impersonation-no-account.sql +5 -0
  111. package/sql/migrate/0011-key-lock.otp-enabled.sql +7 -0
  112. package/sql/migrate/README.md +18 -0
  113. package/AGENT-CHEATSHEET.en.md +0 -488
  114. package/MIGRATION.md +0 -190
  115. package/README.en.md +0 -2910
  116. package/dist/import.d.ts +0 -185
  117. package/dist/import.js +0 -820
  118. package/dist/project.d.ts +0 -359
  119. package/dist/project.js +0 -1258
  120. package/sql/75-history.sql +0 -436
  121. package/sql/88-derived.sql +0 -1236
  122. package/sql/migrate/0006-changed-paths.sql +0 -3
  123. package/sql/migrate/0007-secret-account-fk.sql +0 -12
@@ -0,0 +1,198 @@
1
+ export const sqlCore = {
2
+ // 20-context.sql, ctx(): рабочий арендатор чужой, а членства в нём нет (или арендатор выключен)
3
+ 'sql-core.no_membership': {
4
+ code: 'tenant_denied',
5
+ ru: 'нет членства в арендаторе',
6
+ },
7
+ // 20-context.sql, ctx(): настройка letopis.account — не uuid включённого аккаунта
8
+ 'sql-core.account_not_id': {
9
+ code: 'acl_denied',
10
+ ru: 'letopis.account — не id аккаунта',
11
+ },
12
+ // 20-context.sql, ctx(): имперсонация без права auth.impersonate
13
+ 'sql-core.no_impersonate_right': {
14
+ code: 'acl_denied',
15
+ ru: 'нет права auth.impersonate',
16
+ },
17
+ // 20-context.sql, ctx(): имперсонация аккаунта, которого нет (не заводили или удалён); id — значение letopis.account
18
+ 'sql-core.impersonation_no_account': {
19
+ code: 'target_not_found',
20
+ ru: 'аккаунт {id} не найден',
21
+ hint: 'id аккаунта — из ответа verifyPassword(), createTenant() или db.auth.tenants(); удалённый аккаунт через as() не вернуть',
22
+ },
23
+ // 20-context.sql, ctx(): имперсонация System, сервиса или системного администратора не системным администратором
24
+ 'sql-core.impersonation_denied': {
25
+ code: 'acl_denied',
26
+ ru: 'действовать от имени этого аккаунта нельзя',
27
+ },
28
+ // 20-context.sql, ctx(): настройка letopis.tenant — не uuid
29
+ 'sql-core.tenant_not_id': {
30
+ code: 'tenant_denied',
31
+ ru: 'letopis.tenant — не id арендатора',
32
+ },
33
+ // 20-context.sql, login_apikey(): ключа нет, он отозван, истёк или аккаунт выключен
34
+ 'sql-core.bad_api_key': {
35
+ code: 'no_session',
36
+ ru: 'неверный ключ',
37
+ hint: 'ключ сервиса перевыпускает up({ fresh: true }): возьмите новый serviceKey из ответа up() или задайте свой — up({ serviceKey })',
38
+ },
39
+ // 30-validate.sql, jp_pattern(): pattern JSON Schema не переводится в регулярное выражение PostgreSQL
40
+ 'sql-core.pattern_trailing_backslash': {
41
+ code: 'invalid_class',
42
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (обратная косая черта в конце шаблона)',
43
+ },
44
+ // 30-validate.sql, jp_pattern(): \D, \W, \S внутри [ ]; escape — сама последовательность
45
+ 'sql-core.pattern_escape_in_set': {
46
+ code: 'invalid_class',
47
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL ({escape} внутри набора [ ] не переводится)',
48
+ },
49
+ // 30-validate.sql, jp_pattern(): \b, \B; escape — сама последовательность
50
+ 'sql-core.pattern_word_boundary': {
51
+ code: 'invalid_class',
52
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL ({escape} в PostgreSQL значит другое)',
53
+ },
54
+ // 30-validate.sql, jp_pattern(): \p, \P
55
+ 'sql-core.pattern_unicode_property': {
56
+ code: 'invalid_class',
57
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (\\p{…} не поддерживается)',
58
+ },
59
+ // 30-validate.sql, jp_pattern(): \k и \1–\9
60
+ 'sql-core.pattern_backreference': {
61
+ code: 'invalid_class',
62
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (обратные ссылки не поддерживаются)',
63
+ },
64
+ // 30-validate.sql, jp_pattern(): (?<имя>…)
65
+ 'sql-core.pattern_named_group': {
66
+ code: 'invalid_class',
67
+ ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (именованные группы не поддерживаются)',
68
+ },
69
+ // 30-validate.sql, jp_compile(): node — путь узла описания массивом JSON
70
+ 'sql-core.schema_node_not_object': {
71
+ code: 'invalid_class',
72
+ ru: 'описание узла {node} — не объект',
73
+ },
74
+ // 30-validate.sql, jp_compile()
75
+ 'sql-core.keyword_unsupported': {
76
+ code: 'invalid_class',
77
+ ru: 'ключевое слово {keyword} не поддерживается (узел {node})',
78
+ },
79
+ // 30-validate.sql, jp_compile()
80
+ 'sql-core.unknown_type': {
81
+ code: 'invalid_class',
82
+ ru: 'неизвестный тип в узле {node}',
83
+ },
84
+ // 30-validate.sql, jp_compile()
85
+ 'sql-core.enum_objects_in_any_of': {
86
+ code: 'invalid_class',
87
+ ru: 'перечисление объектов внутри anyOf не поддерживается (узел {node})',
88
+ },
89
+ // 30-validate.sql, jp_compile()
90
+ 'sql-core.format_unsupported': {
91
+ code: 'invalid_class',
92
+ ru: 'format {format} не поддерживается (узел {node})',
93
+ },
94
+ // 30-validate.sql, jp_compile()
95
+ 'sql-core.format_in_any_of': {
96
+ code: 'invalid_class',
97
+ ru: 'format {format} внутри anyOf не поддерживается (узел {node})',
98
+ },
99
+ // 30-validate.sql, jp_compile()
100
+ 'sql-core.string_length_in_any_of': {
101
+ code: 'invalid_class',
102
+ ru: 'длина строки внутри anyOf не поддерживается (узел {node})',
103
+ },
104
+ // 30-validate.sql, jp_compile()
105
+ 'sql-core.unique_items_in_any_of': {
106
+ code: 'invalid_class',
107
+ ru: 'uniqueItems внутри anyOf не поддерживается (узел {node})',
108
+ },
109
+ // 30-validate.sql, jp_compile()
110
+ 'sql-core.min_properties_in_any_of': {
111
+ code: 'invalid_class',
112
+ ru: 'minProperties внутри anyOf не поддерживается (узел {node})',
113
+ },
114
+ // 30-validate.sql, validate_data(): сообщения нарушений issues[].message — тексты не для ошибки (lt_text)
115
+ // minLength, maxLength: limit — граница из описания (длина в символах)
116
+ 'sql-core.issue_string_too_short': {
117
+ code: 'invalid_data',
118
+ ru: 'длина строки меньше {limit}',
119
+ },
120
+ 'sql-core.issue_string_too_long': {
121
+ code: 'invalid_data',
122
+ ru: 'длина строки больше {limit}',
123
+ },
124
+ 'sql-core.issue_unique_items': {
125
+ code: 'invalid_data',
126
+ ru: 'элементы повторяются',
127
+ },
128
+ 'sql-core.issue_date': {
129
+ code: 'invalid_data',
130
+ ru: 'такой даты не бывает',
131
+ },
132
+ 'sql-core.issue_property_count': {
133
+ code: 'invalid_data',
134
+ ru: 'число ключей вне границ',
135
+ },
136
+ 'sql-core.issue_enum': {
137
+ code: 'invalid_data',
138
+ ru: 'значение не из перечисления: допустимо {values}',
139
+ },
140
+ // лишний ключ объекта (additionalProperties: false); keys — имена лишних ключей через запятую
141
+ 'sql-core.issue_additional': {
142
+ code: 'invalid_data',
143
+ ru: 'лишний ключ {keys}',
144
+ },
145
+ 'sql-core.issue_rule': {
146
+ code: 'invalid_data',
147
+ ru: 'нарушено правило {keyword}',
148
+ },
149
+ 'sql-core.issue_schema': {
150
+ code: 'invalid_data',
151
+ ru: 'данные не проходят описание',
152
+ },
153
+ // 40-class.sql, class_resolve(): предка из parent нет ни у арендатора, ни в System
154
+ 'sql-core.parent_not_found': {
155
+ code: 'invalid_class',
156
+ ru: 'предок {parent} не найден',
157
+ },
158
+ // 40-class.sql, class_resolve(): cls — класс, на котором замкнулась цепочка предков
159
+ 'sql-core.inheritance_cycle': {
160
+ code: 'invalid_class',
161
+ ru: 'цикл в наследовании через {cls}',
162
+ },
163
+ // 40-class.sql, class_prepare(): detail.issues — нарушения метасхемы
164
+ 'sql-core.class_metaschema': {
165
+ code: 'invalid_data',
166
+ ru: 'описание класса не проходит метасхему',
167
+ },
168
+ // 40-class.sql, class_prepare()
169
+ 'sql-core.meta_too_large': {
170
+ code: 'invalid_class',
171
+ ru: 'meta класса больше 64 КБ',
172
+ },
173
+ // 40-class.sql, class_prepare()
174
+ 'sql-core.key_field_type': {
175
+ code: 'invalid_class',
176
+ ru: 'поле ключа {field} должно быть обязательной строкой',
177
+ },
178
+ // 40-class.sql, class_prepare()
179
+ 'sql-core.key_end_type': {
180
+ code: 'invalid_class',
181
+ ru: 'конец ключа {end} должен быть обязательным и одиночным',
182
+ },
183
+ // 40-class.sql, class_prepare()
184
+ 'sql-core.key_unknown_name': {
185
+ code: 'invalid_class',
186
+ ru: 'ключ ссылается на неизвестное поле или конец {name}',
187
+ },
188
+ // 40-class.sql, class_prepare()
189
+ 'sql-core.unset_required_end': {
190
+ code: 'invalid_class',
191
+ ru: 'onDelete unset недопустим для обязательного конца {end}',
192
+ },
193
+ // 40-class.sql, class_prepare()
194
+ 'sql-core.system_history_off': {
195
+ code: 'invalid_class',
196
+ ru: 'history: false для системных классов запрещён',
197
+ },
198
+ };
@@ -0,0 +1,86 @@
1
+ export declare const sqlTime: {
2
+ 'sql-time.signals_denied': {
3
+ code: "acl_denied";
4
+ ru: string;
5
+ };
6
+ 'sql-time.target_not_found': {
7
+ code: "target_not_found";
8
+ ru: string;
9
+ };
10
+ 'sql-time.no_session': {
11
+ code: "no_session";
12
+ ru: string;
13
+ };
14
+ 'sql-time.restore_not_deleted': {
15
+ code: "not_deleted";
16
+ ru: string;
17
+ };
18
+ 'sql-time.restore_id_taken': {
19
+ code: "not_deleted";
20
+ ru: string;
21
+ hint: string;
22
+ };
23
+ 'sql-time.restore_already': {
24
+ code: "not_deleted";
25
+ ru: string;
26
+ hint: string;
27
+ };
28
+ 'sql-time.restore_stale': {
29
+ code: "not_deleted";
30
+ ru: string;
31
+ hint: string;
32
+ };
33
+ 'sql-time.restore_class_row': {
34
+ code: "invalid_class";
35
+ ru: string;
36
+ };
37
+ 'sql-time.class_not_found': {
38
+ code: "invalid_class";
39
+ ru: string;
40
+ };
41
+ 'sql-time.class_deleted': {
42
+ code: "invalid_class";
43
+ ru: string;
44
+ };
45
+ 'sql-time.class_abstract': {
46
+ code: "invalid_class";
47
+ ru: string;
48
+ };
49
+ 'sql-time.invalid_data': {
50
+ code: "invalid_data";
51
+ ru: string;
52
+ };
53
+ 'sql-time.restore_key_changed': {
54
+ code: "id_mismatch";
55
+ ru: string;
56
+ };
57
+ 'sql-time.no_write_row': {
58
+ code: "acl_denied";
59
+ ru: string;
60
+ };
61
+ 'sql-time.purge_self': {
62
+ code: "acl_denied";
63
+ ru: string;
64
+ };
65
+ 'sql-time.account_purge_denied': {
66
+ code: "acl_denied";
67
+ ru: string;
68
+ };
69
+ 'sql-time.account_not_found': {
70
+ code: "target_not_found";
71
+ ru: string;
72
+ };
73
+ 'sql-time.last_owner': {
74
+ code: "acl_denied";
75
+ ru: string;
76
+ hint: string;
77
+ };
78
+ 'sql-time.account_referenced': {
79
+ code: "delete_restricted";
80
+ ru: string;
81
+ };
82
+ 'sql-time.maintain_denied': {
83
+ code: "acl_denied";
84
+ ru: string;
85
+ };
86
+ };
@@ -0,0 +1,111 @@
1
+ export const sqlTime = {
2
+ // 90-time.sql, signal_key()
3
+ 'sql-time.signals_denied': {
4
+ code: 'acl_denied',
5
+ ru: 'нет права letopis.signals',
6
+ },
7
+ // 90-time.sql, last_version_visible()
8
+ 'sql-time.target_not_found': {
9
+ code: 'target_not_found',
10
+ ru: 'цель не найдена',
11
+ },
12
+ // 90-time.sql, restore(), account_purge()
13
+ 'sql-time.no_session': {
14
+ code: 'no_session',
15
+ ru: 'нет действующей сессии',
16
+ },
17
+ // 90-time.sql, restore()
18
+ 'sql-time.restore_not_deleted': {
19
+ code: 'not_deleted',
20
+ ru: 'объект не удалён: restore — только для удалённых',
21
+ },
22
+ // 90-time.sql, restore(): живой объект, за последним надгробием которого — create: id занял новый объект с тем же
23
+ // ключом; detail — { id, rev }
24
+ 'sql-time.restore_id_taken': {
25
+ code: 'not_deleted',
26
+ ru: 'id {id} занят новым объектом с тем же ключом — create по ключу удалённого берёт его id, восстанавливать нечего',
27
+ hint: 'объект с этим ключом уже живёт: прочитайте его; перед create() по ключу удалённого проверьте db.Класс({ ключ }).withDeleted()',
28
+ },
29
+ // 90-time.sql, restore(): живой объект, за последним надгробием которого — restore: уже восстановлен (другой запрос
30
+ // успел первым); detail — { id, rev }; библиотека отдаёт его как write.restore_already
31
+ 'sql-time.restore_already': {
32
+ code: 'not_deleted',
33
+ ru: 'restore: {id} уже восстановлен — объект живой, восстанавливать нечего',
34
+ hint: 'его вернул другой запрос: прочитайте объект; восстанавливать снова не нужно',
35
+ },
36
+ // 90-time.sql, restore(p_id, p_rev): последняя версия id не p_rev, и это не «уже восстановлен» и не «id занят» (удалён
37
+ // снова, не удалялся, гонка). detail — { id, rev, expected, after, deleted, live }: after — вид записи журнала сразу
38
+ // за p_rev (в тексте «—», если её нет). Код базы — not_deleted (conflict в каталоге базы нет); библиотека отдаёт его
39
+ // как write.restore_stale (conflict)
40
+ 'sql-time.restore_stale': {
41
+ code: 'not_deleted',
42
+ ru: 'restore: {id} уже не тот, что удаляли — последняя версия {rev}, ожидалась {expected}; после того удаления — {after}',
43
+ hint: 'объект менялся после показанного удаления (detail.after, detail.deleted, detail.live): вещь уже у другого — сообщить пользователю, а не восстанавливать',
44
+ },
45
+ // 90-time.sql, restore()
46
+ 'sql-time.restore_class_row': {
47
+ code: 'invalid_class',
48
+ ru: 'описание класса восстанавливается созданием строки Class',
49
+ },
50
+ // 90-time.sql, restore()
51
+ 'sql-time.class_not_found': {
52
+ code: 'invalid_class',
53
+ ru: 'класс {cls} не найден',
54
+ },
55
+ // 90-time.sql, restore()
56
+ 'sql-time.class_deleted': {
57
+ code: 'invalid_class',
58
+ ru: 'класс {cls} удалён',
59
+ },
60
+ // 90-time.sql, restore()
61
+ 'sql-time.class_abstract': {
62
+ code: 'invalid_class',
63
+ ru: 'класс {cls} абстрактный',
64
+ },
65
+ // 90-time.sql, restore()
66
+ 'sql-time.invalid_data': {
67
+ code: 'invalid_data',
68
+ ru: 'данные не проходят описание класса {cls}',
69
+ },
70
+ // 90-time.sql, restore()
71
+ 'sql-time.restore_key_changed': {
72
+ code: 'id_mismatch',
73
+ ru: 'ключ класса {cls} изменился: id объекта не равен v5 от ключа',
74
+ },
75
+ // 90-time.sql, restore()
76
+ 'sql-time.no_write_row': {
77
+ code: 'acl_denied',
78
+ ru: 'нет права WRITE на строку класса {cls}',
79
+ },
80
+ // 90-time.sql, account_purge()
81
+ 'sql-time.purge_self': {
82
+ code: 'acl_denied',
83
+ ru: 'удалить себя нельзя',
84
+ },
85
+ // 90-time.sql, account_purge()
86
+ 'sql-time.account_purge_denied': {
87
+ code: 'acl_denied',
88
+ ru: 'удалить аккаунт может системный администратор или владелец его арендатора',
89
+ },
90
+ // 90-time.sql, account_purge()
91
+ 'sql-time.account_not_found': {
92
+ code: 'target_not_found',
93
+ ru: 'аккаунт не найден',
94
+ },
95
+ // 90-time.sql, account_purge(): аккаунт — единственный включённый владелец чужого арендатора; detail.tenant — он же
96
+ 'sql-time.last_owner': {
97
+ code: 'acl_denied',
98
+ ru: 'аккаунт — последний владелец арендатора {tenant}',
99
+ hint: 'сначала дать роль owner в этом арендаторе другому аккаунту (db.acl.roles от фасада арендатора), затем удалять',
100
+ },
101
+ // 90-time.sql, account_purge()
102
+ 'sql-time.account_referenced': {
103
+ code: 'delete_restricted',
104
+ ru: 'на аккаунт ссылаются другие строки',
105
+ },
106
+ // 90-time.sql, maintain()
107
+ 'sql-time.maintain_denied': {
108
+ code: 'acl_denied',
109
+ ru: 'нет права letopis.maintain',
110
+ },
111
+ };
@@ -0,0 +1,246 @@
1
+ export declare const sqlWrite: {
2
+ 'sql-write.lock_row_not_created': {
3
+ code: "internal";
4
+ ru: string;
5
+ };
6
+ 'sql-write.lock_row_not_found': {
7
+ code: "internal";
8
+ ru: string;
9
+ };
10
+ 'sql-write.invalid_data': {
11
+ code: "invalid_data";
12
+ ru: string;
13
+ };
14
+ 'sql-write.links_not_object': {
15
+ code: "invalid_data";
16
+ ru: string;
17
+ };
18
+ 'sql-write.end_undeclared': {
19
+ code: "undeclared_end";
20
+ ru: string;
21
+ };
22
+ 'sql-write.end_not_list': {
23
+ code: "invalid_data";
24
+ ru: string;
25
+ };
26
+ 'sql-write.end_not_uuid': {
27
+ code: "invalid_data";
28
+ ru: string;
29
+ };
30
+ 'sql-write.end_target_repeated': {
31
+ code: "invalid_data";
32
+ ru: string;
33
+ };
34
+ 'sql-write.end_too_few': {
35
+ code: "invalid_data";
36
+ ru: string;
37
+ };
38
+ 'sql-write.end_too_many': {
39
+ code: "invalid_data";
40
+ ru: string;
41
+ };
42
+ 'sql-write.end_required': {
43
+ code: "invalid_data";
44
+ ru: string;
45
+ };
46
+ 'sql-write.end_target_missing': {
47
+ code: "target_not_found";
48
+ ru: string;
49
+ };
50
+ 'sql-write.problem_abstract': {
51
+ code: "tightening_conflict";
52
+ ru: string;
53
+ };
54
+ 'sql-write.problem_data': {
55
+ code: "tightening_conflict";
56
+ ru: string;
57
+ };
58
+ 'sql-write.problem_key': {
59
+ code: "tightening_conflict";
60
+ ru: string;
61
+ };
62
+ 'sql-write.problem_ref': {
63
+ code: "tightening_conflict";
64
+ ru: string;
65
+ };
66
+ 'sql-write.problem_ref_hidden': {
67
+ code: "tightening_conflict";
68
+ ru: string;
69
+ };
70
+ 'sql-write.reparent_needs_all': {
71
+ code: "acl_denied";
72
+ ru: string;
73
+ };
74
+ 'sql-write.history_needs_all': {
75
+ code: "acl_denied";
76
+ ru: string;
77
+ };
78
+ 'sql-write.tighten_needs_all': {
79
+ code: "acl_denied";
80
+ ru: string;
81
+ };
82
+ 'sql-write.change_needs_all': {
83
+ code: "acl_denied";
84
+ ru: string;
85
+ };
86
+ 'sql-write.system_name_reserved': {
87
+ code: "invalid_class";
88
+ ru: string;
89
+ };
90
+ 'sql-write.system_flag': {
91
+ code: "invalid_class";
92
+ ru: string;
93
+ };
94
+ 'sql-write.system_name_taken': {
95
+ code: "invalid_class";
96
+ ru: string;
97
+ };
98
+ 'sql-write.link_name_reserved': {
99
+ code: "invalid_class";
100
+ ru: string;
101
+ };
102
+ 'sql-write.hub_name_reserved': {
103
+ code: "invalid_class";
104
+ ru: string;
105
+ };
106
+ 'sql-write.alias_taken': {
107
+ code: "invalid_class";
108
+ ru: string;
109
+ };
110
+ 'sql-write.name_is_alias': {
111
+ code: "invalid_class";
112
+ ru: string;
113
+ };
114
+ 'sql-write.alias_orphan_history': {
115
+ code: "invalid_class";
116
+ ru: string;
117
+ };
118
+ 'sql-write.end_other_class': {
119
+ code: "invalid_class";
120
+ ru: string;
121
+ };
122
+ 'sql-write.no_session': {
123
+ code: "no_session";
124
+ ru: string;
125
+ };
126
+ 'sql-write.foreign_tenant': {
127
+ code: "tenant_denied";
128
+ ru: string;
129
+ };
130
+ 'sql-write.account_tenant': {
131
+ code: "tenant_denied";
132
+ ru: string;
133
+ };
134
+ 'sql-write.class_not_found': {
135
+ code: "invalid_class";
136
+ ru: string;
137
+ };
138
+ 'sql-write.class_deleted': {
139
+ code: "invalid_class";
140
+ ru: string;
141
+ };
142
+ 'sql-write.class_abstract': {
143
+ code: "invalid_class";
144
+ ru: string;
145
+ };
146
+ 'sql-write.member_tenant': {
147
+ code: "invalid_data";
148
+ ru: string;
149
+ };
150
+ 'sql-write.id_from_db': {
151
+ code: "id_from_db";
152
+ ru: string;
153
+ };
154
+ 'sql-write.id_mismatch': {
155
+ code: "id_mismatch";
156
+ ru: string;
157
+ };
158
+ 'sql-write.history_recreate': {
159
+ code: "invalid_class";
160
+ ru: string;
161
+ };
162
+ 'sql-write.owner_not_found': {
163
+ code: "target_not_found";
164
+ ru: string;
165
+ };
166
+ 'sql-write.immutable_columns': {
167
+ code: "immutable_key";
168
+ ru: string;
169
+ };
170
+ 'sql-write.class_immutable': {
171
+ code: "immutable_key";
172
+ ru: string;
173
+ };
174
+ 'sql-write.key_changed': {
175
+ code: "immutable_key";
176
+ ru: string;
177
+ };
178
+ 'sql-write.tightening_mismatch': {
179
+ code: "tightening_conflict";
180
+ ru: string;
181
+ };
182
+ 'sql-write.delete_isolation': {
183
+ code: "isolation_level";
184
+ ru: string;
185
+ };
186
+ 'sql-write.system_account_delete': {
187
+ code: "acl_denied";
188
+ ru: string;
189
+ };
190
+ 'sql-write.recreated_in_statement': {
191
+ code: "recreated_in_statement";
192
+ ru: string;
193
+ };
194
+ 'sql-write.class_not_empty': {
195
+ code: "invalid_class";
196
+ ru: string;
197
+ };
198
+ 'sql-write.class_has_history': {
199
+ code: "invalid_class";
200
+ ru: string;
201
+ };
202
+ 'sql-write.cascade_delete_denied': {
203
+ code: "acl_denied";
204
+ ru: string;
205
+ };
206
+ 'sql-write.cascade_delete_denied_hidden': {
207
+ code: "acl_denied";
208
+ ru: string;
209
+ };
210
+ 'sql-write.unset_write_denied': {
211
+ code: "acl_denied";
212
+ ru: string;
213
+ };
214
+ 'sql-write.unset_write_denied_hidden': {
215
+ code: "acl_denied";
216
+ ru: string;
217
+ };
218
+ 'sql-write.delete_restricted': {
219
+ code: "delete_restricted";
220
+ ru: string;
221
+ };
222
+ 'sql-write.links_patch_op': {
223
+ code: "invalid_data";
224
+ ru: string;
225
+ };
226
+ 'sql-write.inc_args': {
227
+ code: "invalid_data";
228
+ ru: string;
229
+ };
230
+ 'sql-write.inc_path_missing': {
231
+ code: "invalid_data";
232
+ ru: string;
233
+ };
234
+ 'sql-write.inc_path_not_object': {
235
+ code: "invalid_data";
236
+ ru: string;
237
+ };
238
+ 'sql-write.inc_no_field': {
239
+ code: "invalid_data";
240
+ ru: string;
241
+ };
242
+ 'sql-write.inc_not_number': {
243
+ code: "invalid_data";
244
+ ru: string;
245
+ };
246
+ };