letopis 1.4.1 → 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 (113) hide show
  1. package/AGENT-CHEATSHEET.md +329 -278
  2. package/CHANGELOG.md +558 -1
  3. package/README.md +606 -1037
  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 -175
  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 +33 -10
  12. package/dist/chain.d.ts +19 -41
  13. package/dist/chain.js +169 -201
  14. package/dist/cli.js +51 -88
  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 -71
  21. package/dist/index.js +245 -130
  22. package/dist/internal.d.ts +12 -0
  23. package/dist/internal.js +5 -0
  24. package/dist/jsonschema.js +18 -17
  25. package/dist/load.d.ts +20 -12
  26. package/dist/load.js +225 -186
  27. package/dist/mcp.d.ts +5 -7
  28. package/dist/mcp.js +171 -215
  29. package/dist/messages/access.d.ts +90 -0
  30. package/dist/messages/access.js +113 -0
  31. package/dist/messages/api.d.ts +171 -0
  32. package/dist/messages/api.js +215 -0
  33. package/dist/messages/boot.d.ts +201 -0
  34. package/dist/messages/boot.js +256 -0
  35. package/dist/messages/codes.d.ts +172 -0
  36. package/dist/messages/codes.js +173 -0
  37. package/dist/messages/index.d.ts +95 -0
  38. package/dist/messages/index.js +118 -0
  39. package/dist/messages/mcp.d.ts +306 -0
  40. package/dist/messages/mcp.js +387 -0
  41. package/dist/messages/model.d.ts +233 -0
  42. package/dist/messages/model.js +283 -0
  43. package/dist/messages/query.d.ts +131 -0
  44. package/dist/messages/query.js +158 -0
  45. package/dist/messages/sql-access.d.ts +70 -0
  46. package/dist/messages/sql-access.js +87 -0
  47. package/dist/messages/sql-core.d.ts +150 -0
  48. package/dist/messages/sql-core.js +181 -0
  49. package/dist/messages/sql-time.d.ts +71 -0
  50. package/dist/messages/sql-time.js +88 -0
  51. package/dist/messages/sql-write.d.ts +246 -0
  52. package/dist/messages/sql-write.js +270 -0
  53. package/dist/messages/time.d.ts +23 -0
  54. package/dist/messages/time.js +29 -0
  55. package/dist/messages/types.d.ts +27 -0
  56. package/dist/messages/types.js +5 -0
  57. package/dist/messages/write.d.ts +405 -0
  58. package/dist/messages/write.js +509 -0
  59. package/dist/model.d.ts +73 -60
  60. package/dist/model.js +26 -29
  61. package/dist/ops.d.ts +35 -0
  62. package/dist/ops.js +101 -0
  63. package/dist/pglite.d.ts +0 -9
  64. package/dist/pglite.js +3 -1
  65. package/dist/registry.d.ts +3 -19
  66. package/dist/registry.js +3 -16
  67. package/dist/signals.d.ts +5 -9
  68. package/dist/signals.js +5 -9
  69. package/dist/sql.d.ts +13 -6
  70. package/dist/sql.js +176 -83
  71. package/dist/sync.d.ts +9 -3
  72. package/dist/sync.js +51 -21
  73. package/dist/tx.d.ts +26 -1
  74. package/dist/tx.js +44 -14
  75. package/dist/typed.d.ts +240 -45
  76. package/dist/types.d.ts +23 -91
  77. package/dist/types.js +12 -14
  78. package/dist/up.d.ts +53 -32
  79. package/dist/up.js +184 -73
  80. package/dist/uuid.js +5 -5
  81. package/dist/validate.d.ts +13 -1
  82. package/dist/validate.js +61 -29
  83. package/dist/watch.d.ts +11 -10
  84. package/dist/watch.js +33 -70
  85. package/dist/write.d.ts +9 -16
  86. package/dist/write.js +118 -187
  87. package/llms.txt +22 -25
  88. package/package.json +8 -11
  89. package/sql/10-core.sql +7 -50
  90. package/sql/15-errors.sql +64 -10
  91. package/sql/20-context.sql +7 -6
  92. package/sql/30-validate.sql +35 -27
  93. package/sql/40-class.sql +20 -114
  94. package/sql/50-acl.sql +8 -13
  95. package/sql/60-write.sql +220 -667
  96. package/sql/70-read.sql +20 -16
  97. package/sql/80-auth.sql +24 -27
  98. package/sql/90-time.sql +70 -859
  99. package/sql/95-seed.system.sql +7 -14
  100. package/sql/99-revision.sql +2 -1
  101. package/sql/README.md +32 -24
  102. package/sql/migrate/README.md +14 -0
  103. package/AGENT-CHEATSHEET.en.md +0 -485
  104. package/MIGRATION.md +0 -190
  105. package/README.en.md +0 -2859
  106. package/dist/import.d.ts +0 -185
  107. package/dist/import.js +0 -820
  108. package/dist/project.d.ts +0 -350
  109. package/dist/project.js +0 -1224
  110. package/sql/75-history.sql +0 -358
  111. package/sql/88-derived.sql +0 -1235
  112. package/sql/migrate/0006-changed-paths.sql +0 -3
  113. 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
+ };