letopis 1.4.2 → 2.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 (112) hide show
  1. package/AGENT-CHEATSHEET.md +329 -281
  2. package/CHANGELOG.md +418 -0
  3. package/README.md +572 -1053
  4. package/dist/acl.d.ts +78 -1
  5. package/dist/acl.js +264 -13
  6. package/dist/admin.d.ts +10 -141
  7. package/dist/admin.js +24 -184
  8. package/dist/auth.d.ts +2 -2
  9. package/dist/auth.js +5 -15
  10. package/dist/cache.d.ts +8 -1
  11. package/dist/cache.js +30 -8
  12. package/dist/chain.d.ts +18 -41
  13. package/dist/chain.js +165 -203
  14. package/dist/cli.js +45 -90
  15. package/dist/demo/booking.d.ts +352 -36
  16. package/dist/describe.d.ts +47 -0
  17. package/dist/describe.js +195 -0
  18. package/dist/errors.d.ts +59 -13
  19. package/dist/errors.js +190 -29
  20. package/dist/index.d.ts +52 -70
  21. package/dist/index.js +189 -122
  22. package/dist/internal.d.ts +5 -0
  23. package/dist/jsonschema.js +18 -17
  24. package/dist/load.d.ts +20 -12
  25. package/dist/load.js +207 -181
  26. package/dist/mcp.d.ts +5 -7
  27. package/dist/mcp.js +168 -214
  28. package/dist/messages/access.d.ts +90 -0
  29. package/dist/messages/access.js +113 -0
  30. package/dist/messages/api.d.ts +171 -0
  31. package/dist/messages/api.js +215 -0
  32. package/dist/messages/boot.d.ts +201 -0
  33. package/dist/messages/boot.js +256 -0
  34. package/dist/messages/codes.d.ts +172 -0
  35. package/dist/messages/codes.js +173 -0
  36. package/dist/messages/index.d.ts +95 -0
  37. package/dist/messages/index.js +118 -0
  38. package/dist/messages/mcp.d.ts +306 -0
  39. package/dist/messages/mcp.js +387 -0
  40. package/dist/messages/model.d.ts +233 -0
  41. package/dist/messages/model.js +283 -0
  42. package/dist/messages/query.d.ts +131 -0
  43. package/dist/messages/query.js +158 -0
  44. package/dist/messages/sql-access.d.ts +70 -0
  45. package/dist/messages/sql-access.js +87 -0
  46. package/dist/messages/sql-core.d.ts +150 -0
  47. package/dist/messages/sql-core.js +181 -0
  48. package/dist/messages/sql-time.d.ts +71 -0
  49. package/dist/messages/sql-time.js +88 -0
  50. package/dist/messages/sql-write.d.ts +246 -0
  51. package/dist/messages/sql-write.js +270 -0
  52. package/dist/messages/time.d.ts +23 -0
  53. package/dist/messages/time.js +29 -0
  54. package/dist/messages/types.d.ts +27 -0
  55. package/dist/messages/types.js +5 -0
  56. package/dist/messages/write.d.ts +405 -0
  57. package/dist/messages/write.js +509 -0
  58. package/dist/model.d.ts +73 -60
  59. package/dist/model.js +20 -29
  60. package/dist/ops.d.ts +35 -0
  61. package/dist/ops.js +101 -0
  62. package/dist/pglite.d.ts +0 -9
  63. package/dist/pglite.js +3 -1
  64. package/dist/registry.d.ts +3 -19
  65. package/dist/registry.js +3 -16
  66. package/dist/signals.d.ts +1 -5
  67. package/dist/signals.js +1 -5
  68. package/dist/sql.d.ts +7 -1
  69. package/dist/sql.js +101 -85
  70. package/dist/sync.d.ts +9 -3
  71. package/dist/sync.js +40 -17
  72. package/dist/tx.d.ts +11 -1
  73. package/dist/tx.js +32 -11
  74. package/dist/typed.d.ts +240 -45
  75. package/dist/types.d.ts +15 -90
  76. package/dist/types.js +12 -14
  77. package/dist/up.d.ts +53 -32
  78. package/dist/up.js +180 -74
  79. package/dist/uuid.js +5 -5
  80. package/dist/validate.d.ts +13 -1
  81. package/dist/validate.js +61 -29
  82. package/dist/watch.d.ts +5 -16
  83. package/dist/watch.js +23 -77
  84. package/dist/write.d.ts +9 -16
  85. package/dist/write.js +102 -185
  86. package/llms.txt +22 -25
  87. package/package.json +2 -9
  88. package/sql/10-core.sql +7 -50
  89. package/sql/15-errors.sql +64 -10
  90. package/sql/20-context.sql +7 -6
  91. package/sql/30-validate.sql +35 -27
  92. package/sql/40-class.sql +20 -114
  93. package/sql/50-acl.sql +8 -13
  94. package/sql/60-write.sql +220 -676
  95. package/sql/70-read.sql +11 -13
  96. package/sql/80-auth.sql +23 -27
  97. package/sql/90-time.sql +77 -944
  98. package/sql/95-seed.system.sql +7 -14
  99. package/sql/99-revision.sql +2 -1
  100. package/sql/README.md +32 -24
  101. package/sql/migrate/README.md +14 -0
  102. package/AGENT-CHEATSHEET.en.md +0 -488
  103. package/MIGRATION.md +0 -190
  104. package/README.en.md +0 -2910
  105. package/dist/import.d.ts +0 -185
  106. package/dist/import.js +0 -820
  107. package/dist/project.d.ts +0 -359
  108. package/dist/project.js +0 -1258
  109. package/sql/75-history.sql +0 -436
  110. package/sql/88-derived.sql +0 -1236
  111. package/sql/migrate/0006-changed-paths.sql +0 -3
  112. package/sql/migrate/0007-secret-account-fk.sql +0 -12
@@ -0,0 +1,23 @@
1
+ export declare const time: {
2
+ 'time.maintain_in_tx': {
3
+ code: "invalid_query";
4
+ ru: string;
5
+ };
6
+ 'time.signal_queue': {
7
+ code: "invalid_query";
8
+ ru: string;
9
+ };
10
+ 'time.bad_interval': {
11
+ code: "invalid_data";
12
+ ru: string;
13
+ hint: string;
14
+ };
15
+ 'time.maintain_failed': {
16
+ code: "invalid_query";
17
+ ru: string;
18
+ };
19
+ 'time.watch_cursor': {
20
+ code: "invalid_query";
21
+ ru: string;
22
+ };
23
+ };
@@ -0,0 +1,29 @@
1
+ export const time = {
2
+ // admin.ts, maintain(): внутри db.begin()
3
+ 'time.maintain_in_tx': {
4
+ code: 'invalid_query',
5
+ ru: 'maintain() идёт своей транзакцией, не внутри db.begin()',
6
+ },
7
+ // admin.ts, queueWarning: очередь сигналов PostgreSQL заполнена больше чем наполовину — предупреждение maintain();
8
+ // pct — проценты целым числом; код записи не печатается
9
+ 'time.signal_queue': {
10
+ code: 'invalid_query',
11
+ ru: 'очередь сигналов PostgreSQL заполнена на {pct} % — проверьте зависших слушателей',
12
+ },
13
+ // admin.ts, parseInterval: интервал connect({ maintain }); value — как передан (строка — в кавычках)
14
+ 'time.bad_interval': {
15
+ code: 'invalid_data',
16
+ ru: "интервал {value}: число мс или строка '30s', '15m', '1h', '1d' — от 1 мс до 2³¹−1 мс (около 24 суток)",
17
+ hint: "задать интервал числом миллисекунд или строкой вида '30s', '15m', '1h', '1d'",
18
+ },
19
+ // admin.ts, scheduleMaintain: запуск maintain() по расписанию упал — предупреждение (lwarn); message — текст его ошибки
20
+ 'time.maintain_failed': {
21
+ code: 'invalid_query',
22
+ ru: 'maintain по расписанию: {message}',
23
+ },
24
+ // watch.ts, decode: курсор watch({ from }) не разбирается; cursor — как передан
25
+ 'time.watch_cursor': {
26
+ code: 'invalid_query',
27
+ ru: 'watch: курсор {cursor} — ожидается курсор события',
28
+ },
29
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Каталог сообщений letopis (план 2.0, этап 3, п. 3) — типы записей. Как перевести место на ключ и вызывать — шапка
3
+ * index.ts.
4
+ */
5
+ /**
6
+ * Коды ошибок letopis: каталог базы (SQLSTATE LT001–LT018, `error_catalog()` в lib/sql/15-errors.sql, `LT_NAMES` в
7
+ * errors.ts) и коды самой библиотеки. Новый код — сюда, в codes.ts (заголовок и подсказка) и в раздел «Ошибки» README
8
+ * (с якорем `<a id="код"></a>`). `internal` — внутренняя ошибка базы: SQLSTATE XX000 с ключом каталога в DETAIL
9
+ * (`lt_raise('XX000', ключ, …)`, fromDbError).
10
+ */
11
+ export type ErrorCode = 'no_session' | 'target_not_found' | 'invalid_data' | 'undeclared_end' | 'tenant_denied' | 'acl_denied' | 'id_mismatch' | 'id_from_db' | 'immutable_key' | 'invalid_class' | 'tightening_conflict' | 'isolation_level' | 'recreated_in_statement' | 'delete_restricted' | 'not_deleted' | 'exists' | 'duplicate' | 'deleted' | 'conflict' | 'rev_ambiguous' | 'tx_required' | 'lock_unsupported' | 'commit_unknown' | 'tx_rolled_back' | 'no_key' | 'no_path' | 'invalid_query' | 'admin_required' | 'not_empty' | 'class_not_loadable' | 'bypass_rls' | 'user_session_required' | 'confirmation_required' | 'internal';
12
+ /**
13
+ * Запись каталога: код ошибки, шаблон текста (`ru`), `{имя}` в шаблоне — параметр. `hint` — своя подсказка «что делать»;
14
+ * без неё ошибка берёт подсказку своего кода из codes.ts. Поля — в этом порядке: code, ru, hint.
15
+ */
16
+ export interface Msg {
17
+ code: ErrorCode;
18
+ ru: string;
19
+ hint?: string;
20
+ }
21
+ /**
22
+ * Параметры шаблона: `{имя}` → значение, напечатанное как в шаблонной строке JS (`${x}`). `similar` (массив похожих
23
+ * имён) дописывает к тексту «— похожие: …» сам `lerr`.
24
+ */
25
+ export type Params = Readonly<Record<string, unknown>>;
26
+ /** Раздел каталога: ключи только вида `<раздел>.<snake_case>` — чужой префикс не пропустит проверка типов. */
27
+ export type Section<P extends string> = Record<`${P}.${string}`, Msg>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Каталог сообщений letopis (план 2.0, этап 3, п. 3) — типы записей. Как перевести место на ключ и вызывать — шапка
3
+ * index.ts.
4
+ */
5
+ export {};
@@ -0,0 +1,405 @@
1
+ export declare const write: {
2
+ 'write.bad_reason': {
3
+ code: "invalid_query";
4
+ ru: string;
5
+ };
6
+ 'write.inc_in_array': {
7
+ code: "invalid_data";
8
+ ru: string;
9
+ };
10
+ 'write.op_in_data': {
11
+ code: "invalid_data";
12
+ ru: string;
13
+ };
14
+ 'write.inc_by_not_finite': {
15
+ code: "invalid_data";
16
+ ru: string;
17
+ };
18
+ 'write.inc_start_not_finite': {
19
+ code: "invalid_data";
20
+ ru: string;
21
+ };
22
+ 'write.op_in_patch': {
23
+ code: "invalid_data";
24
+ ru: string;
25
+ };
26
+ 'write.data_not_object': {
27
+ code: "invalid_data";
28
+ ru: string;
29
+ };
30
+ 'write.inc_outside_update': {
31
+ code: "invalid_data";
32
+ ru: string;
33
+ };
34
+ 'write.op_in_verb_data': {
35
+ code: "invalid_data";
36
+ ru: string;
37
+ };
38
+ 'write.as_of_write': {
39
+ code: "invalid_query";
40
+ ru: string;
41
+ };
42
+ 'write.with_deleted_write': {
43
+ code: "invalid_query";
44
+ ru: string;
45
+ };
46
+ 'write.verb_after_verb': {
47
+ code: "invalid_query";
48
+ ru: string;
49
+ };
50
+ 'write.create_on_pivot': {
51
+ code: "invalid_query";
52
+ ru: string;
53
+ };
54
+ 'write.create_with_filter': {
55
+ code: "invalid_query";
56
+ ru: string;
57
+ };
58
+ 'write.upsert_no_key': {
59
+ code: "no_key";
60
+ ru: string;
61
+ };
62
+ 'write.bad_tags': {
63
+ code: "invalid_query";
64
+ ru: string;
65
+ };
66
+ 'write.patch_not_object': {
67
+ code: "invalid_data";
68
+ ru: string;
69
+ };
70
+ 'write.bad_rev': {
71
+ code: "invalid_query";
72
+ ru: string;
73
+ };
74
+ 'write.no_filter': {
75
+ code: "invalid_query";
76
+ ru: string;
77
+ hint: string;
78
+ };
79
+ 'write.slot_bad_verb': {
80
+ code: "invalid_query";
81
+ ru: string;
82
+ };
83
+ 'write.slot_unknown': {
84
+ code: "invalid_class";
85
+ ru: string;
86
+ };
87
+ 'write.slot_not_end': {
88
+ code: "invalid_query";
89
+ ru: string;
90
+ };
91
+ 'write.slot_ambiguous': {
92
+ code: "invalid_query";
93
+ ru: string;
94
+ };
95
+ 'write.end_ambiguous': {
96
+ code: "invalid_query";
97
+ ru: string;
98
+ };
99
+ 'write.end_not_single': {
100
+ code: "invalid_query";
101
+ ru: string;
102
+ };
103
+ 'write.slot_single_many': {
104
+ code: "invalid_query";
105
+ ru: string;
106
+ };
107
+ 'write.exists': {
108
+ code: "exists";
109
+ ru: string;
110
+ };
111
+ 'write.exists_id': {
112
+ code: "exists";
113
+ ru: string;
114
+ };
115
+ 'write.target_missing': {
116
+ code: "target_not_found";
117
+ ru: string;
118
+ };
119
+ 'write.targets_missing': {
120
+ code: "target_not_found";
121
+ ru: string;
122
+ };
123
+ 'write.rev_conflict': {
124
+ code: "conflict";
125
+ ru: string;
126
+ };
127
+ 'write.rows_denied': {
128
+ code: "acl_denied";
129
+ ru: string;
130
+ };
131
+ 'write.rev_many_targets': {
132
+ code: "rev_ambiguous";
133
+ ru: string;
134
+ };
135
+ 'write.rev_no_target': {
136
+ code: "target_not_found";
137
+ ru: string;
138
+ };
139
+ 'write.not_deleted': {
140
+ code: "not_deleted";
141
+ ru: string;
142
+ };
143
+ 'write.commit_unknown': {
144
+ code: "commit_unknown";
145
+ ru: string;
146
+ };
147
+ 'write.tx_done': {
148
+ code: "tx_required";
149
+ ru: string;
150
+ hint: string;
151
+ };
152
+ 'write.lock_tx_done': {
153
+ code: "tx_required";
154
+ ru: string;
155
+ hint: string;
156
+ };
157
+ 'write.tx_rolled_back': {
158
+ code: "tx_rolled_back";
159
+ ru: string;
160
+ };
161
+ 'write.load_cancelled': {
162
+ code: "invalid_data";
163
+ ru: string;
164
+ };
165
+ 'write.load_cancelled_more': {
166
+ code: "invalid_data";
167
+ ru: string;
168
+ };
169
+ 'write.load_cancelled_at_least': {
170
+ code: "invalid_data";
171
+ ru: string;
172
+ };
173
+ 'write.load_cancelled_maybe_more': {
174
+ code: "invalid_data";
175
+ ru: string;
176
+ };
177
+ 'write.load_later_portions': {
178
+ code: "invalid_data";
179
+ ru: string;
180
+ };
181
+ 'write.load_later_batches': {
182
+ code: "invalid_data";
183
+ ru: string;
184
+ };
185
+ 'write.load_db_rules_unchecked': {
186
+ code: "invalid_data";
187
+ ru: string;
188
+ };
189
+ 'write.load_db_check_limit': {
190
+ code: "invalid_data";
191
+ ru: string;
192
+ };
193
+ 'write.load_bad_input': {
194
+ code: "invalid_data";
195
+ ru: string;
196
+ hint: string;
197
+ };
198
+ 'write.load_end_not_uuid': {
199
+ code: "invalid_data";
200
+ ru: string;
201
+ };
202
+ 'write.load_end_value': {
203
+ code: "invalid_data";
204
+ ru: string;
205
+ };
206
+ 'write.load_end_polymorphic': {
207
+ code: "invalid_data";
208
+ ru: string;
209
+ };
210
+ 'write.load_target_class': {
211
+ code: "invalid_data";
212
+ ru: string;
213
+ };
214
+ 'write.load_target_key': {
215
+ code: "invalid_data";
216
+ ru: string;
217
+ };
218
+ 'write.load_ext_keyed': {
219
+ code: "invalid_data";
220
+ ru: string;
221
+ };
222
+ 'write.load_ext_string': {
223
+ code: "invalid_data";
224
+ ru: string;
225
+ };
226
+ 'write.load_end_list': {
227
+ code: "invalid_data";
228
+ ru: string;
229
+ };
230
+ 'write.load_end_ref': {
231
+ code: "invalid_data";
232
+ ru: string;
233
+ };
234
+ 'write.load_end_repeat': {
235
+ code: "invalid_data";
236
+ ru: string;
237
+ };
238
+ 'write.load_inc': {
239
+ code: "invalid_data";
240
+ ru: string;
241
+ };
242
+ 'write.load_filter_op': {
243
+ code: "invalid_data";
244
+ ru: string;
245
+ };
246
+ 'write.load_invalid_data': {
247
+ code: "invalid_data";
248
+ ru: string;
249
+ };
250
+ 'write.load_end_too_few': {
251
+ code: "invalid_data";
252
+ ru: string;
253
+ };
254
+ 'write.load_end_required': {
255
+ code: "invalid_data";
256
+ ru: string;
257
+ };
258
+ 'write.load_end_too_many': {
259
+ code: "invalid_data";
260
+ ru: string;
261
+ };
262
+ 'write.load_key_part_ref': {
263
+ code: "invalid_data";
264
+ ru: string;
265
+ };
266
+ 'write.load_key_part_string': {
267
+ code: "invalid_data";
268
+ ru: string;
269
+ };
270
+ 'write.load_admin_required': {
271
+ code: "admin_required";
272
+ ru: string;
273
+ };
274
+ 'write.load_as_not_uuid': {
275
+ code: "invalid_data";
276
+ ru: string;
277
+ hint: string;
278
+ };
279
+ 'write.load_as_history': {
280
+ code: "invalid_data";
281
+ ru: string;
282
+ hint: string;
283
+ };
284
+ 'write.load_history_update': {
285
+ code: "invalid_data";
286
+ ru: string;
287
+ hint: string;
288
+ };
289
+ 'write.load_initial_commit_every': {
290
+ code: "invalid_data";
291
+ ru: string;
292
+ hint: string;
293
+ };
294
+ 'write.load_initial_existing': {
295
+ code: "invalid_data";
296
+ ru: string;
297
+ hint: string;
298
+ };
299
+ 'write.load_initial_as': {
300
+ code: "invalid_data";
301
+ ru: string;
302
+ hint: string;
303
+ };
304
+ 'write.load_no_tenant': {
305
+ code: "invalid_data";
306
+ ru: string;
307
+ hint: string;
308
+ };
309
+ 'write.load_class_not_found': {
310
+ code: "invalid_class";
311
+ ru: string;
312
+ };
313
+ 'write.load_no_class': {
314
+ code: "invalid_class";
315
+ ru: string;
316
+ };
317
+ 'write.load_class_rows': {
318
+ code: "class_not_loadable";
319
+ ru: string;
320
+ };
321
+ 'write.load_class_abstract': {
322
+ code: "invalid_class";
323
+ ru: string;
324
+ };
325
+ 'write.load_taken': {
326
+ code: "exists";
327
+ ru: string;
328
+ };
329
+ 'write.load_duplicate': {
330
+ code: "duplicate";
331
+ ru: string;
332
+ };
333
+ 'write.load_no_write': {
334
+ code: "acl_denied";
335
+ ru: string;
336
+ };
337
+ 'write.load_target_not_found': {
338
+ code: "target_not_found";
339
+ ru: string;
340
+ };
341
+ 'write.load_owner_not_found': {
342
+ code: "target_not_found";
343
+ ru: string;
344
+ };
345
+ 'write.load_tenant_denied': {
346
+ code: "tenant_denied";
347
+ ru: string;
348
+ };
349
+ 'write.load_exists': {
350
+ code: "exists";
351
+ ru: string;
352
+ };
353
+ 'write.load_deleted': {
354
+ code: "deleted";
355
+ ru: string;
356
+ };
357
+ 'write.load_objects_exist': {
358
+ code: "exists";
359
+ ru: string;
360
+ };
361
+ 'write.load_account_tenant': {
362
+ code: "tenant_denied";
363
+ ru: string;
364
+ };
365
+ 'write.load_member_tenant': {
366
+ code: "invalid_data";
367
+ ru: string;
368
+ };
369
+ 'write.load_tags': {
370
+ code: "invalid_data";
371
+ ru: string;
372
+ };
373
+ 'write.load_as_owner': {
374
+ code: "invalid_data";
375
+ ru: string;
376
+ };
377
+ 'write.load_owner_id': {
378
+ code: "invalid_data";
379
+ ru: string;
380
+ };
381
+ 'write.load_other_class': {
382
+ code: "exists";
383
+ ru: string;
384
+ };
385
+ 'write.load_acl_row': {
386
+ code: "acl_denied";
387
+ ru: string;
388
+ };
389
+ 'write.load_acl_update': {
390
+ code: "acl_denied";
391
+ ru: string;
392
+ };
393
+ 'write.load_history_versions': {
394
+ code: "invalid_data";
395
+ ru: string;
396
+ };
397
+ 'write.load_not_empty': {
398
+ code: "not_empty";
399
+ ru: string;
400
+ };
401
+ 'write.tx_retry_hint': {
402
+ code: "invalid_query";
403
+ ru: string;
404
+ };
405
+ };