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,90 @@
1
+ export declare const access: {
2
+ 'access.switch_not_root': {
3
+ code: "invalid_query";
4
+ ru: string;
5
+ hint: string;
6
+ };
7
+ 'access.role_not_string': {
8
+ code: "invalid_data";
9
+ ru: string;
10
+ hint: string;
11
+ };
12
+ 'access.bad_role_name': {
13
+ code: "invalid_data";
14
+ ru: string;
15
+ hint: string;
16
+ };
17
+ 'access.bad_condition_column': {
18
+ code: "invalid_data";
19
+ ru: string;
20
+ hint: string;
21
+ };
22
+ 'access.bad_rule_target': {
23
+ code: "invalid_data";
24
+ ru: string;
25
+ hint: string;
26
+ };
27
+ 'access.bad_endpoint_mask': {
28
+ code: "invalid_data";
29
+ ru: string;
30
+ hint: string;
31
+ };
32
+ 'access.rule_spec_not_object': {
33
+ code: "invalid_data";
34
+ ru: string;
35
+ hint: string;
36
+ };
37
+ 'access.unknown_rule_field': {
38
+ code: "invalid_data";
39
+ ru: string;
40
+ hint: string;
41
+ };
42
+ 'access.bad_rule_weight': {
43
+ code: "invalid_data";
44
+ ru: string;
45
+ hint: string;
46
+ };
47
+ 'access.rule_who': {
48
+ code: "invalid_data";
49
+ ru: string;
50
+ hint: string;
51
+ };
52
+ 'access.no_rule_operations': {
53
+ code: "invalid_data";
54
+ ru: string;
55
+ hint: string;
56
+ };
57
+ 'access.no_facade': {
58
+ code: "invalid_query";
59
+ ru: string;
60
+ };
61
+ 'access.bad_account': {
62
+ code: "invalid_data";
63
+ ru: string;
64
+ hint: string;
65
+ };
66
+ 'access.no_session_tenant': {
67
+ code: "no_session";
68
+ ru: string;
69
+ };
70
+ 'access.roles_not_array': {
71
+ code: "invalid_data";
72
+ ru: string;
73
+ hint: string;
74
+ };
75
+ 'access.duplicate_roles': {
76
+ code: "invalid_data";
77
+ ru: string;
78
+ hint: string;
79
+ };
80
+ 'access.bad_scrypt_params': {
81
+ code: "invalid_data";
82
+ ru: string;
83
+ hint: string;
84
+ };
85
+ 'access.bad_totp_secret': {
86
+ code: "invalid_data";
87
+ ru: string;
88
+ hint: string;
89
+ };
90
+ };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Подсказка неверного вызова db.acl: общая подсказка invalid_data — про issues, а у этих ошибок их нет. Параметр what в
3
+ * записях db.acl — метод (grant, deny, revoke, roles), с которого начинается текст.
4
+ */
5
+ const ACL_CALL = 'исправить аргумент по тексту ошибки; вызовы db.acl — README, «Выдать право»';
6
+ export const access = {
7
+ // auth.ts, switch(): фасад db.as() арендатора не меняет
8
+ 'access.switch_not_root': {
9
+ code: 'invalid_query',
10
+ ru: 'auth.switch() — от корня подключения: при имперсонации арендатора задаёт db.as(…, { tenant })',
11
+ hint: 'сменить арендатора корня — db.auth.switch(); фасаду db.as() арендатора задают при создании: db.as(аккаунт, { tenant })',
12
+ },
13
+ // acl.ts, roleName: роль в grant, deny, revoke или в списке db.acl.roles — не строка; type — её тип
14
+ 'access.role_not_string': {
15
+ code: 'invalid_data',
16
+ ru: 'db.acl.{what}: role — строка, а не {type}',
17
+ hint: ACL_CALL,
18
+ },
19
+ // acl.ts, roleName: имя роли пустое, с запятой или фигурной скобкой, с «!» в начале или с пробелом по краям
20
+ 'access.bad_role_name': {
21
+ code: 'invalid_data',
22
+ ru: 'db.acl.{what}: роль {role} — непустая строка без запятых и фигурных скобок, без «!» в начале и пробелов по краям',
23
+ hint: ACL_CALL,
24
+ },
25
+ // acl.ts, classItem: условие цели правила — на колонку не из списка
26
+ 'access.bad_condition_column': {
27
+ code: 'invalid_data',
28
+ ru: 'db.acl.{what}: условие на колонку {column} — условие ставят на {columns}',
29
+ hint: ACL_CALL,
30
+ },
31
+ // acl.ts, classItem: цель read, write или delete — не имя класса, не звёздочка и не объект с полем class
32
+ 'access.bad_rule_target': {
33
+ code: 'invalid_data',
34
+ ru: "db.acl.{what}: цель {target} — имя класса, '*' (все классы) или { class, …условие на строки }",
35
+ hint: ACL_CALL,
36
+ },
37
+ // acl.ts, apiItem: цель api — не маска эндпоинта
38
+ 'access.bad_endpoint_mask': {
39
+ code: 'invalid_data',
40
+ ru: 'db.acl.{what}: api {endpoint} — маска эндпоинта: сегменты через «.», {a,b} — любой из, * — хвост',
41
+ hint: ACL_CALL,
42
+ },
43
+ // acl.ts, parse: описание правила grant, deny или revoke — не объект
44
+ 'access.rule_spec_not_object': {
45
+ code: 'invalid_data',
46
+ ru: 'db.acl.{what}: нужен объект { role, read | write | delete | api }',
47
+ hint: ACL_CALL,
48
+ },
49
+ // acl.ts, parse: лишнее поле в описании правила (у revoke нет и weight)
50
+ 'access.unknown_rule_field': {
51
+ code: 'invalid_data',
52
+ ru: 'db.acl.{what}: поле {field} — допустимы {fields}',
53
+ hint: ACL_CALL,
54
+ },
55
+ // acl.ts, parse: weight — не целое от 1 до 999
56
+ 'access.bad_rule_weight': {
57
+ code: 'invalid_data',
58
+ ru: 'db.acl.{what}: weight — целое от 1 до 999: вес правила арендатора (от 1000 — административный слой System)',
59
+ hint: ACL_CALL,
60
+ },
61
+ // acl.ts, parse: кому правило — нет ни role, ни everyone, есть оба или everyone не true
62
+ 'access.rule_who': {
63
+ code: 'invalid_data',
64
+ ru: 'db.acl.{what}: кому правило — ровно одно из role (роль членства) и everyone: true (все аккаунты арендатора)',
65
+ hint: ACL_CALL,
66
+ },
67
+ // acl.ts, parse: в описании правила нет ни read, ни write, ни delete, ни api
68
+ 'access.no_rule_operations': {
69
+ code: 'invalid_data',
70
+ ru: 'db.acl.{what}: нужна хотя бы одна операция: read, write, delete или api',
71
+ hint: ACL_CALL,
72
+ },
73
+ // acl.ts, makeAcl: db.acl без фасада подключения, а grant, deny, revoke, roles и list идут его цепочками
74
+ 'access.no_facade': {
75
+ code: 'invalid_query',
76
+ ru: 'db.acl: запись правил — от фасада подключения',
77
+ },
78
+ // acl.ts, roles(): аккаунт — не id и не строка с полем id
79
+ 'access.bad_account': {
80
+ code: 'invalid_data',
81
+ ru: 'db.acl.roles: аккаунт — id или строка с полем id',
82
+ hint: ACL_CALL,
83
+ },
84
+ // acl.ts, roles() и list(): у фасада нет рабочего арендатора — подключение без сессии; what — метод
85
+ 'access.no_session_tenant': {
86
+ code: 'no_session',
87
+ ru: 'db.acl.{what}: нет арендатора сессии',
88
+ },
89
+ // acl.ts, roles(): роли — не массив и не null
90
+ 'access.roles_not_array': {
91
+ code: 'invalid_data',
92
+ ru: 'db.acl.roles: роли — массив строк или null (снять членство)',
93
+ hint: ACL_CALL,
94
+ },
95
+ // acl.ts, roles(): роль в списке повторяется
96
+ 'access.duplicate_roles': {
97
+ code: 'invalid_data',
98
+ ru: 'db.acl.roles: роли повторяются',
99
+ hint: ACL_CALL,
100
+ },
101
+ // auth.ts, verifyHash: scrypt отверг N, r, p из строки хэша — недопустимы или требуют больше 64 МБ памяти
102
+ 'access.bad_scrypt_params': {
103
+ code: 'invalid_data',
104
+ ru: 'хэш пароля: параметры scrypt N={N}, r={r}, p={p} недопустимы или требуют больше 64 МБ памяти',
105
+ hint: 'хэш с такими параметрами не проверить: задать пароль заново — auth.setPassword()',
106
+ },
107
+ // auth.ts, base32Decode: в секрете TOTP (totpCode) знак не из алфавита base32
108
+ 'access.bad_totp_secret': {
109
+ code: 'invalid_data',
110
+ ru: 'секрет TOTP — не base32',
111
+ hint: 'передать секрет из auth.enrollTotp() — строку base32 (A–Z, 2–7)',
112
+ },
113
+ };
@@ -0,0 +1,237 @@
1
+ export declare const api: {
2
+ 'api.validation_failed': {
3
+ code: "invalid_data";
4
+ ru: string;
5
+ };
6
+ 'api.unknown_step': {
7
+ code: "invalid_class";
8
+ ru: string;
9
+ hint: string;
10
+ };
11
+ 'api.token_not_active': {
12
+ code: "no_session";
13
+ ru: string;
14
+ hint: string;
15
+ };
16
+ 'api.unknown_step_no_classes': {
17
+ code: "invalid_class";
18
+ ru: string;
19
+ hint: string;
20
+ };
21
+ 'api.chain_not_rows': {
22
+ code: "invalid_query";
23
+ ru: string;
24
+ hint: string;
25
+ };
26
+ 'api.step_undefined_filter': {
27
+ code: "invalid_query";
28
+ ru: string;
29
+ };
30
+ 'api.sort_not_last': {
31
+ code: "invalid_query";
32
+ ru: string;
33
+ };
34
+ 'api.with_deleted_step': {
35
+ code: "invalid_query";
36
+ ru: string;
37
+ };
38
+ 'api.db_bad_value': {
39
+ code: "invalid_query";
40
+ ru: string;
41
+ hint: string;
42
+ };
43
+ 'api.validation_issue': {
44
+ code: "invalid_data";
45
+ ru: string;
46
+ };
47
+ 'api.validation_root': {
48
+ code: "invalid_data";
49
+ ru: string;
50
+ };
51
+ 'api.validation_more': {
52
+ code: "invalid_data";
53
+ ru: string;
54
+ };
55
+ 'api.connect_schema': {
56
+ code: "invalid_data";
57
+ ru: string;
58
+ hint: string;
59
+ };
60
+ 'api.unknown_option': {
61
+ code: "invalid_data";
62
+ ru: string;
63
+ hint: string;
64
+ };
65
+ 'api.row_check_denied': {
66
+ code: "acl_denied";
67
+ ru: string;
68
+ };
69
+ 'api.no_history': {
70
+ code: "invalid_query";
71
+ ru: string;
72
+ };
73
+ 'api.slow_query': {
74
+ code: "invalid_query";
75
+ ru: string;
76
+ };
77
+ 'api.batch_queued': {
78
+ code: "invalid_query";
79
+ ru: string;
80
+ };
81
+ 'api.mod_after_verb': {
82
+ code: "invalid_query";
83
+ ru: string;
84
+ };
85
+ 'api.after_not_paged': {
86
+ code: "invalid_query";
87
+ ru: string;
88
+ hint: string;
89
+ };
90
+ 'api.for_update_outside_tx': {
91
+ code: "tx_required";
92
+ ru: string;
93
+ };
94
+ 'api.for_update_unsupported': {
95
+ code: "lock_unsupported";
96
+ ru: string;
97
+ hint: string;
98
+ };
99
+ 'api.lock_denied': {
100
+ code: "acl_denied";
101
+ ru: string;
102
+ };
103
+ 'api.slot_value': {
104
+ code: "invalid_query";
105
+ ru: string;
106
+ };
107
+ 'api.slot_without_write': {
108
+ code: "invalid_query";
109
+ ru: string;
110
+ };
111
+ 'api.slot_single': {
112
+ code: "invalid_query";
113
+ ru: string;
114
+ };
115
+ 'api.slot_required': {
116
+ code: "invalid_query";
117
+ ru: string;
118
+ };
119
+ 'api.slot_twice': {
120
+ code: "invalid_query";
121
+ ru: string;
122
+ };
123
+ 'api.step_mod_after_verb': {
124
+ code: "invalid_query";
125
+ ru: string;
126
+ };
127
+ 'api.verb_without_step': {
128
+ code: "invalid_query";
129
+ ru: string;
130
+ };
131
+ 'api.entity_with_verbs': {
132
+ code: "invalid_query";
133
+ ru: string;
134
+ };
135
+ 'api.entity_arg': {
136
+ code: "invalid_query";
137
+ ru: string;
138
+ };
139
+ 'api.slot_method': {
140
+ code: "invalid_query";
141
+ ru: string;
142
+ };
143
+ 'api.cache_ttl': {
144
+ code: "invalid_query";
145
+ ru: string;
146
+ };
147
+ 'api.tx_only': {
148
+ code: "tx_required";
149
+ ru: string;
150
+ };
151
+ 'api.id_of_no_tenant': {
152
+ code: "no_session";
153
+ ru: string;
154
+ };
155
+ 'api.as_in_tx': {
156
+ code: "invalid_query";
157
+ ru: string;
158
+ };
159
+ 'api.as_no_session': {
160
+ code: "no_session";
161
+ ru: string;
162
+ };
163
+ 'api.as_context_changing': {
164
+ code: "no_session";
165
+ ru: string;
166
+ hint: string;
167
+ };
168
+ 'api.begin_arg': {
169
+ code: "invalid_query";
170
+ ru: string;
171
+ hint: string;
172
+ };
173
+ 'api.nested_begin': {
174
+ code: "invalid_query";
175
+ ru: string;
176
+ };
177
+ 'api.load_in_tx': {
178
+ code: "invalid_query";
179
+ ru: string;
180
+ };
181
+ 'api.connect_no_dsn': {
182
+ code: "invalid_data";
183
+ ru: string;
184
+ hint: string;
185
+ };
186
+ 'api.connect_empty_credential': {
187
+ code: "invalid_data";
188
+ ru: string;
189
+ hint: string;
190
+ };
191
+ 'api.connect_admin_type': {
192
+ code: "invalid_data";
193
+ ru: string;
194
+ hint: string;
195
+ };
196
+ 'api.connect_admin_role': {
197
+ code: "admin_required";
198
+ ru: string;
199
+ hint: string;
200
+ };
201
+ 'api.connect_no_owner': {
202
+ code: "invalid_data";
203
+ ru: string;
204
+ hint: string;
205
+ };
206
+ 'api.connect_bypass_rls': {
207
+ code: "bypass_rls";
208
+ ru: string;
209
+ };
210
+ 'api.admin_connection': {
211
+ code: "bypass_rls";
212
+ ru: string;
213
+ };
214
+ 'api.connect_no_schema': {
215
+ code: "invalid_data";
216
+ ru: string;
217
+ hint: string;
218
+ };
219
+ 'api.schema_older': {
220
+ code: "invalid_data";
221
+ ru: string;
222
+ };
223
+ 'api.schema_newer': {
224
+ code: "invalid_data";
225
+ ru: string;
226
+ };
227
+ 'api.create_tenant_admin': {
228
+ code: "invalid_query";
229
+ ru: string;
230
+ hint: string;
231
+ };
232
+ 'api.versions_terminal': {
233
+ code: "invalid_query";
234
+ ru: string;
235
+ hint: string;
236
+ };
237
+ };