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
package/dist/up.d.ts CHANGED
@@ -3,22 +3,23 @@ import { type PgliteOptions, type PgliteServer } from './pglite.js';
3
3
  import { type SignalMode } from './signals.js';
4
4
  export declare const SYSTEM_ID = "2eba6d0a-1edd-4bb6-a85a-a703dab49035";
5
5
  export declare const SCHEMA_VERSION = "v2";
6
+ /**
7
+ * Первая ревизия движка 2.0 (план 2.0, редакция 2): схема ниже неё — letopis 1.x или схема без штампа ревизии. Её
8
+ * `up()` не обновляет, а `connect()` к ней не подключается: 2.0 ставится только заново (`up({ fresh: true })`), данные
9
+ * 1.x не переносятся. Накат миграций `up({ upgrade })` — в пределах 2.x, от этой ревизии до `DDL_REVISION`.
10
+ */
11
+ export declare const FIRST_REVISION = 8;
12
+ /**
13
+ * Отказ на схеме letopis 1.x (план 2.0, 7.10 №5): ревизия из комментария схемы ниже `FIRST_REVISION` — 7 и ниже у 1.x,
14
+ * 0 — штампа ревизии нет. `up()` зовёт её до любых изменений (до общей части `install()`), `connect()` — до входа по
15
+ * ключу: функции схемы 1.x не вызываются.
16
+ */
17
+ export declare function refuse1x(schema: string, rev: number): void;
6
18
  export interface InstallOptions {
7
19
  /** Полное имя схемы с версией, например `v2.salon`. */
8
20
  schema: string;
9
21
  owner?: string;
10
22
  app?: string;
11
- /**
12
- * Разрешить `db.reset()` и `maintain({ now })` — для тестовых установок и стендов; по умолчанию запрещено. Значение
13
- * задаётся при установке и хранится в схеме: каждый `up()` записывает его заново (план, §2.2).
14
- */
15
- allowReset?: boolean;
16
- /**
17
- * Политика хранения истории для классов без своей, например
18
- * `{ all: '1 day', daily: '1 week', weekly: '1 month', monthly: '1 year', yearly: 'forever' }`; не задана — история
19
- * хранится вся. Значение задаётся при установке и хранится в схеме: каждый `up()` записывает его заново (план, §2.11).
20
- */
21
- history?: HistoryPolicy;
22
23
  /** Номер последнего накатываемого файла — для пошаговых тестов. */
23
24
  upTo?: number;
24
25
  /** Сиды после ядра: имена lib/sql/seed.<имя>.sql (например 'booking') или пути к своим файлам .sql. */
@@ -37,20 +38,10 @@ export interface InstallOptions {
37
38
  /**
38
39
  * Что видно в сигналах базы (`NOTIFY`): `'class'` (у новой схемы по умолчанию) — имя класса; `'tenant'` — имя класса и
39
40
  * псевдоним арендатора (токен); `'opaque'` — только псевдонимы класса и арендатора; `'none'` — сигналов нет.
40
- * Режим хранится в схеме: `up()` без опции его не меняет, `reset({ all })` сохраняет (план 1.1, §2.2).
41
+ * Режим хранится в схеме: `up()` без опции его не меняет.
41
42
  */
42
43
  signals?: SignalMode;
43
44
  }
44
- /** Политика хранения истории (§2.11): сроки ярусов по возрастанию, 'forever' — бессрочно. */
45
- export interface HistoryPolicy {
46
- all: string;
47
- daily?: string;
48
- weekly?: string;
49
- monthly?: string;
50
- yearly?: string;
51
- /** Часовой пояс границ периодов (по умолчанию UTC). */
52
- tz?: string;
53
- }
54
45
  export interface InstallResult {
55
46
  schema: string;
56
47
  owner: string;
@@ -75,8 +66,9 @@ export interface EngineStamp {
75
66
  sql: string;
76
67
  }
77
68
  /**
78
- * Штамп движка этого пакета. Хэш — по исходному тексту файлов ядра до подстановок (переводы строк — LF): одна и та же
79
- * сборка даёт один штамп при любых опциях установки, а версия пакета без правок SQL штамп не меняет.
69
+ * Штамп движка этого пакета. Хэш — по исходному тексту файлов ядра до подстановок (переводы строк — LF) и по каталогу
70
+ * сообщений базы (разделы sql-*, подстановка @MESSAGES@): одна и та же сборка даёт один штамп при любых опциях
71
+ * установки, а версия пакета без правок SQL и этих разделов штамп не меняет.
80
72
  */
81
73
  export declare function engineStamp(): Promise<EngineStamp>;
82
74
  /** Сравнение версий semver (метаданные сборки не учитываются): меньше нуля, ноль, больше нуля. */
@@ -101,14 +93,14 @@ export interface UpOptions extends Omit<InstallOptions, 'schema' | 'upTo' | 'mig
101
93
  schema: string;
102
94
  /** Удалить схему и поставить заново. ДАННЫЕ СХЕМЫ ТЕРЯЮТСЯ. */
103
95
  fresh?: boolean;
104
- /** Обновить схему отставшей ревизии: миграции и повторный накат; данные сохраняются. */
96
+ /** Обновить схему отставшей ревизии 2.x: миграции и повторный накат; данные сохраняются. */
105
97
  upgrade?: boolean;
106
98
  /** Без сообщений в консоль. */
107
99
  quiet?: boolean;
108
100
  /** Сколько ждать базу, мс (по умолчанию 60 000). */
109
101
  waitTimeoutMs?: number;
110
102
  /**
111
- * Запустить PGlite — PostgreSQL прямо в процессе Node — для разработки без своего сервера (решение 6 точки А);
103
+ * Запустить PGlite — PostgreSQL прямо в процессе Node — для разработки без своего сервера;
112
104
  * подключение к нему — `connect({ dsn: r.pglite.dsn, schema: r.schema, listen: false, max: 1, allowBypassRls: true })`.
113
105
  * Соединение у PGlite одно, поэтому одновременные транзакции и гонки на нём не проверить: для таких тестов и в CI нужен
114
106
  * настоящий PostgreSQL.
@@ -119,6 +111,19 @@ export interface UpOptions extends Omit<InstallOptions, 'schema' | 'upTo' | 'mig
119
111
  * кладёт итог в `r.tenant` — свой сид для этого не нужен.
120
112
  */
121
113
  tenant?: TenantOptions;
114
+ /**
115
+ * Роль приложения с логином (план 2.0, этап 3): заводится или получает новый пароль и членство в роли приложения
116
+ * (`letopis_app`). Имя и пароль квотирует база (`format` с `%I` и `%L`). Привилегированную роль — суперпользователя,
117
+ * с `CREATEROLE`, `CREATEDB`, `REPLICATION`, `BYPASSRLS`, роль-владельца или её члена — up() не трогает
118
+ * (`invalid_data`). Строка подключения роли — `r.login.dsn`: с ней и `connect({ admin })` малое приложение работает
119
+ * одним процессом.
120
+ */
121
+ login?: LoginOptions;
122
+ }
123
+ /** Роль приложения up({ login }). */
124
+ export interface LoginOptions {
125
+ user: string;
126
+ password: string;
122
127
  }
123
128
  export interface UpResult extends InstallResult {
124
129
  /** Схемы не было — поставлена. */
@@ -127,13 +132,28 @@ export interface UpResult extends InstallResult {
127
132
  upgraded: boolean;
128
133
  /** Ревизия движка после наката. */
129
134
  revision: number;
130
- /** Таблицы, для которых выполнен ANALYZE (статистики не было). */
135
+ /**
136
+ * Таблицы, у которых статистики не было и ANALYZE от роли владельца её собрал; оставшиеся без статистики — в
137
+ * `warnings`.
138
+ */
131
139
  analyzed: string[];
132
140
  /** up({ pglite }): запущенный PGlite — строка подключения и остановка. */
133
141
  pglite?: PgliteServer;
134
142
  /** up({ tenant }): арендатор (и его первый пользователь с сессией). */
135
143
  tenant?: TenantResult;
136
- /** Предупреждения (версия сервера); без quiet каждое уже напечатано через console.warn. */
144
+ /**
145
+ * up({ login }): роль приложения — заведена (`created`) или получила новый пароль; `dsn` — строка подключения роли
146
+ * (из `dsn` установки или PGlite; при готовом пуле `sql` её нет).
147
+ */
148
+ login?: {
149
+ user: string;
150
+ created: boolean;
151
+ dsn?: string;
152
+ };
153
+ /**
154
+ * Предупреждения (версия сервера, таблицы без статистики, хабы с зарезервированными именами); без quiet каждое уже
155
+ * напечатано через console.warn.
156
+ */
137
157
  warnings: string[];
138
158
  }
139
159
  type Ping = {
@@ -152,18 +172,19 @@ export declare function ensureDatabase(dsn: string, log?: (m: string) => void):
152
172
  * иначе отказ. Возвращает предупреждения: с чем установка работает, но рискует.
153
173
  */
154
174
  export declare function checkServer(versionNum: number, encoding: string): string[];
155
- /** Ревизия движка схемы по комментарию 'letopis ddl_revision=N'; схемы нет — null. */
175
+ /** Ревизия движка схемы по комментарию 'letopis ddl_revision=N'; схемы нет — null, штампа ревизии нет — 0. */
156
176
  export declare function schemaRevision(sql: Pick<postgres.Sql, 'unsafe'>, schema: string): Promise<number | null>;
157
177
  /**
158
178
  * Ставит или обновляет установку letopis в схеме. Если схема уже есть и её ревизия та же, что у пакета, `up()` выполняет
159
179
  * повторный накат: заново ставит функции, не трогая данные, — поэтому его можно вызывать при каждом запуске приложения.
160
- * Схему отставшей ревизии `up()` обновляет только с `upgrade: true`, а на схеме новее пакета отказывает.
180
+ * Схему отставшей ревизии 2.x `up()` обновляет только с `upgrade: true`, а на схеме новее пакета отказывает. Схему без
181
+ * штампа ревизии не трогает и отказывает (`invalid_data`): заново её ставит `up({ fresh: true })`.
161
182
  */
162
183
  export declare function up(opts: UpOptions): Promise<UpResult>;
163
184
  export interface TenantOptions {
164
185
  /**
165
186
  * Имя арендатора — его аккаунта в System. Из имени вычисляется id арендатора, поэтому одно имя — всегда один и тот же
166
- * арендатор (так же его находит `letopis import --tenant`).
187
+ * арендатор.
167
188
  */
168
189
  name: string;
169
190
  /** Правило арендатора «аутентифицированным можно всё» (READ, WRITE, DELETE; по умолчанию да). */
@@ -175,7 +196,7 @@ export interface TenantOptions {
175
196
  password: string;
176
197
  /**
177
198
  * Вид пароля (по умолчанию PASSWORD) — как у auth.setPassword: `^[A-Z][A-Z0-9_]{1,31}$`, не служебный вид (SESSION,
178
- * APIKEY, KEYSECRET, OTP, TOTP, KEY, PROJECTOR, LOCK); иначе invalid_data.
199
+ * APIKEY, KEYSECRET, OTP, TOTP, KEY, LOCK); иначе invalid_data.
179
200
  */
180
201
  kind?: string;
181
202
  ttl?: string;