letopis 2.0.0 → 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 (75) hide show
  1. package/AGENT-CHEATSHEET.md +484 -414
  2. package/CHANGELOG.md +321 -0
  3. package/LICENSE +75 -21
  4. package/LICENSE-COMMERCIAL.md +49 -0
  5. package/README.md +786 -183
  6. package/api-contract.json +381 -0
  7. package/dist/acl.d.ts +3 -0
  8. package/dist/acl.js +19 -2
  9. package/dist/admin.d.ts +2 -1
  10. package/dist/admin.js +6 -4
  11. package/dist/auth.d.ts +18 -3
  12. package/dist/auth.js +75 -6
  13. package/dist/chain.d.ts +38 -17
  14. package/dist/chain.js +434 -63
  15. package/dist/cli.js +28 -6
  16. package/dist/errors.d.ts +19 -1
  17. package/dist/errors.js +46 -6
  18. package/dist/index.d.ts +10 -4
  19. package/dist/index.js +136 -46
  20. package/dist/internal.d.ts +2 -0
  21. package/dist/load.d.ts +9 -5
  22. package/dist/load.js +30 -11
  23. package/dist/log.d.ts +121 -0
  24. package/dist/log.js +633 -0
  25. package/dist/mcp.js +26 -11
  26. package/dist/messages/api.d.ts +66 -0
  27. package/dist/messages/api.js +90 -1
  28. package/dist/messages/boot.js +4 -4
  29. package/dist/messages/codes.js +4 -4
  30. package/dist/messages/index.d.ts +5 -2
  31. package/dist/messages/index.js +5 -2
  32. package/dist/messages/log.d.ts +229 -0
  33. package/dist/messages/log.js +102 -0
  34. package/dist/messages/model.d.ts +24 -1
  35. package/dist/messages/model.js +34 -3
  36. package/dist/messages/query.d.ts +10 -0
  37. package/dist/messages/query.js +13 -0
  38. package/dist/messages/sql-core.d.ts +15 -1
  39. package/dist/messages/sql-core.js +20 -3
  40. package/dist/messages/sql-time.d.ts +15 -0
  41. package/dist/messages/sql-time.js +23 -0
  42. package/dist/messages/write.d.ts +47 -0
  43. package/dist/messages/write.js +63 -0
  44. package/dist/model.d.ts +4 -0
  45. package/dist/model.js +23 -5
  46. package/dist/sql.d.ts +2 -0
  47. package/dist/sql.js +77 -25
  48. package/dist/sync.d.ts +1 -1
  49. package/dist/sync.js +50 -0
  50. package/dist/tx.d.ts +10 -1
  51. package/dist/tx.js +44 -2
  52. package/dist/typed.d.ts +14 -10
  53. package/dist/types.d.ts +82 -4
  54. package/dist/types.js +6 -1
  55. package/dist/up.d.ts +3 -3
  56. package/dist/up.js +57 -17
  57. package/dist/uuid.d.ts +8 -0
  58. package/dist/uuid.js +9 -1
  59. package/dist/validate.js +24 -7
  60. package/dist/watch.d.ts +5 -0
  61. package/dist/watch.js +13 -0
  62. package/dist/write.d.ts +78 -1
  63. package/dist/write.js +357 -39
  64. package/llms.txt +37 -17
  65. package/package.json +12 -6
  66. package/sql/20-context.sql +11 -3
  67. package/sql/30-validate.sql +51 -10
  68. package/sql/40-class.sql +21 -1
  69. package/sql/80-auth.sql +88 -17
  70. package/sql/90-time.sql +34 -6
  71. package/sql/99-revision.sql +5 -1
  72. package/sql/migrate/0009-restore-rev.tenants-name.sql +10 -0
  73. package/sql/migrate/0010-impersonation-no-account.sql +5 -0
  74. package/sql/migrate/0011-key-lock.otp-enabled.sql +7 -0
  75. package/sql/migrate/README.md +5 -1
package/dist/log.d.ts ADDED
@@ -0,0 +1,121 @@
1
+ import { type LogEventLevel, type LogEventName } from './messages/index.js';
2
+ import type { LogEvent, LogFn, LogOptions } from './types.js';
3
+ export type { LogEventLevel, LogEventName } from './messages/index.js';
4
+ export type { LogEvent, LogFn, LogLevel, LogObject, LogOptions, Logger } from './types.js';
5
+ /** Поля события, которые задаёт место вызова. */
6
+ export type LogFields = Partial<Omit<LogEvent, 'ts' | 'event' | 'level'>> & {
7
+ level?: LogEventLevel;
8
+ };
9
+ /** Строка без секретов: учётные данные в строке подключения, пароль параметром и в тексте SQL. */
10
+ export declare function maskText(s: string): string;
11
+ type Sink = (level: LogEventLevel, ev: LogEvent) => void;
12
+ /** Кто действует: арендатор и аккаунт фасада — считаются в момент события. */
13
+ export interface LogBound {
14
+ who?: () => {
15
+ tenant?: string | null;
16
+ account?: string | null;
17
+ };
18
+ tx?: string;
19
+ /** Счётчик операций записи явной транзакции (db.begin()): по нему уровень tx.commit — info, если запись была. */
20
+ writes?: {
21
+ n: number;
22
+ };
23
+ }
24
+ /**
25
+ * Текст ошибки для предупреждения или события: у ошибки PostgreSQL — только «PostgreSQL <SQLSTATE>» (без её текста),
26
+ * у прочих — текст без паролей.
27
+ */
28
+ export declare function safeErrorText(e: unknown): string;
29
+ /** Уровень события error: warn — штатный отказ (EXPECTED_CODES, нарушения данных), иначе error. */
30
+ export declare function errorLevel(e: unknown): LogEventLevel;
31
+ /**
32
+ * Поля события error по ошибке: код, ключ каталога, текст, подробности, причина. Ошибка PostgreSQL (сама или причиной)
33
+ * — только SQLSTATE и имена объектов схемы: её текст, DETAIL, WHERE и HINT в событие не идут.
34
+ */
35
+ export declare function errorFields(e: unknown): LogFields;
36
+ /**
37
+ * Логгер подключения: приёмник, порог, имена полей для маскировки и привязка (кто действует, метка транзакции).
38
+ * Производные фасады (db.as(), db.begin(), батч) получают child() — тот же приёмник и порог.
39
+ */
40
+ export declare class Log {
41
+ private readonly sink;
42
+ private readonly min;
43
+ private readonly redactKeys;
44
+ private readonly bound;
45
+ constructor(sink: Sink | null, min: number, redactKeys: ReadonlySet<string>, bound?: LogBound);
46
+ /** Хоть одно событие может уйти (есть приёмник и порог не off). */
47
+ get enabled(): boolean;
48
+ /** Логгер задан (log или LETOPIS_LOG): предупреждения идут в него, а не в console.warn. */
49
+ get active(): boolean;
50
+ /** Метка транзакции привязки. */
51
+ get tx(): string | undefined;
52
+ /** Операций записи в явной транзакции привязки (undefined — привязки к db.begin() нет). */
53
+ get writes(): number | undefined;
54
+ /** Учесть удавшуюся операцию в счётчике записи транзакции — до проверки порога, событие может и не уйти. */
55
+ mark(event: string): void;
56
+ /** Уровень проходит порог. */
57
+ level(l: LogEventLevel): boolean;
58
+ /** Событие (его уровень по каталогу) проходит порог — проверка до сборки полей. */
59
+ wants(event: LogEventName): boolean;
60
+ child(b: LogBound): Log;
61
+ /** Событие: уровень — из каталога (или fields.level); ниже порога — ничего. */
62
+ emit(event: LogEventName, f?: LogFields): void;
63
+ /**
64
+ * Событие error по ошибке; одна ошибка — одно событие. Уровень — errorLevel: штатный отказ (exists, conflict,
65
+ * target_not_found, нарушения данных и т. п.) — warn, прочее — error.
66
+ */
67
+ error(e: unknown, f?: LogFields): void;
68
+ /** Предупреждение: событие warning (ключ каталога и текст). */
69
+ warning(key: string | undefined, msg: string, detail?: Record<string, unknown>): void;
70
+ /** Имя поля — секрет: всегда или по redact. */
71
+ secret(key: string): boolean;
72
+ /** Значение для события: секреты — '***', строки без паролей, массивы и вложенность ограничены. */
73
+ clean(v: unknown, depth?: number, key?: string): unknown;
74
+ private build;
75
+ }
76
+ /** Логирование выключено: ни приёмника, ни событий. */
77
+ export declare const NOLOG: Log;
78
+ /** Логгер-функция: события JSON-строками в stderr (LETOPIS_LOG, флаг CLI --log). */
79
+ export declare const stderrLog: LogFn;
80
+ /**
81
+ * Уровень из LETOPIS_LOG: `debug|info|warn|error`; `1`, `true`, `yes`, `on` и прочее непустое — `info`; не задана, пусто,
82
+ * `0`, `false`, `no`, `off` — логирования по переменной нет.
83
+ */
84
+ export declare function envLevel(v?: string | undefined): LogEventLevel | undefined;
85
+ /**
86
+ * Логгер по опциям: log (или stderr по LETOPIS_LOG), порог logLevel (или из LETOPIS_LOG, иначе 'info'), redact. Неверные
87
+ * опции — invalid_data (log.bad_level, log.bad_logger, log.bad_redact) до подключения.
88
+ */
89
+ export declare function makeLog(o?: LogOptions): Log;
90
+ /** Логгер по одной LETOPIS_LOG — для мест без подключения (предупреждения, createTenant). */
91
+ export declare function envLog(): Log;
92
+ /** Метка транзакции: b — db.begin(), t — db.transaction(); номер в процессе. */
93
+ export declare const nextTx: (kind: "b" | "t") => string;
94
+ /** Строка подключения без пароля. */
95
+ export declare const maskDsn: (dsn: string | undefined) => string | undefined;
96
+ /**
97
+ * Операция с событием: время, событие успеха (done может дополнить поля, сменить событие или вернуть null — без
98
+ * события) и error при отказе. Выключенный логгер — сам вызов без обёртки.
99
+ */
100
+ export declare function traced<T>(log: Log, event: LogEventName | null, f: LogFields, fn: () => Promise<T>, done?: (r: T) => (LogFields & {
101
+ event?: LogEventName;
102
+ }) | null | undefined): Promise<T>;
103
+ /** Синхронный вызов: ошибка — событие error и проброс (шаги и модификаторы цепочки, Proxy фасада). */
104
+ export declare function guarded<T>(log: Log, f: LogFields | (() => LogFields), fn: () => T): T;
105
+ /** Что записать о вызове метода API: событие и поля; null — без события (ошибка пишется всё равно). */
106
+ export type CallSpec = (args: unknown[], result: unknown, before: unknown) => (LogFields & {
107
+ event: LogEventName;
108
+ }) | null;
109
+ /**
110
+ * Обёртка API-объекта (db.auth, db.acl): каждый метод — время, событие по spec и error при отказе. pre — снимок до вызова
111
+ * (например, прежний арендатор у auth.switch). Выключенный логгер — тот же объект.
112
+ */
113
+ export declare function instrument<T extends object>(api: T, log: Log, area: string, specs: Readonly<Record<string, CallSpec>>, pre?: Readonly<Record<string, () => unknown>>): T;
114
+ /** Текст запроса для события: одной строкой, без паролей, не длиннее 2000 символов. */
115
+ export declare function sqlText(text: string): string;
116
+ /**
117
+ * Пул postgres.js (или зарезервированное соединение, транзакция), каждый запрос которого даёт событие sql: шаблон
118
+ * sql`…`, unsafe(), а также соединения reserve() и транзакции begin()/savepoint(). Только при пороге debug — иначе тот
119
+ * же объект. Значения параметров в событие не попадают.
120
+ */
121
+ export declare function traceSql<S extends object>(sql: S, log: Log): S;