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.
- package/AGENT-CHEATSHEET.md +329 -278
- package/CHANGELOG.md +558 -1
- package/README.md +606 -1037
- package/dist/acl.d.ts +78 -1
- package/dist/acl.js +264 -13
- package/dist/admin.d.ts +10 -141
- package/dist/admin.js +24 -175
- package/dist/auth.d.ts +2 -2
- package/dist/auth.js +5 -15
- package/dist/cache.d.ts +8 -1
- package/dist/cache.js +33 -10
- package/dist/chain.d.ts +19 -41
- package/dist/chain.js +169 -201
- package/dist/cli.js +51 -88
- package/dist/demo/booking.d.ts +352 -36
- package/dist/describe.d.ts +47 -0
- package/dist/describe.js +195 -0
- package/dist/errors.d.ts +59 -13
- package/dist/errors.js +190 -29
- package/dist/index.d.ts +52 -71
- package/dist/index.js +245 -130
- package/dist/internal.d.ts +12 -0
- package/dist/internal.js +5 -0
- package/dist/jsonschema.js +18 -17
- package/dist/load.d.ts +20 -12
- package/dist/load.js +225 -186
- package/dist/mcp.d.ts +5 -7
- package/dist/mcp.js +171 -215
- package/dist/messages/access.d.ts +90 -0
- package/dist/messages/access.js +113 -0
- package/dist/messages/api.d.ts +171 -0
- package/dist/messages/api.js +215 -0
- package/dist/messages/boot.d.ts +201 -0
- package/dist/messages/boot.js +256 -0
- package/dist/messages/codes.d.ts +172 -0
- package/dist/messages/codes.js +173 -0
- package/dist/messages/index.d.ts +95 -0
- package/dist/messages/index.js +118 -0
- package/dist/messages/mcp.d.ts +306 -0
- package/dist/messages/mcp.js +387 -0
- package/dist/messages/model.d.ts +233 -0
- package/dist/messages/model.js +283 -0
- package/dist/messages/query.d.ts +131 -0
- package/dist/messages/query.js +158 -0
- package/dist/messages/sql-access.d.ts +70 -0
- package/dist/messages/sql-access.js +87 -0
- package/dist/messages/sql-core.d.ts +150 -0
- package/dist/messages/sql-core.js +181 -0
- package/dist/messages/sql-time.d.ts +71 -0
- package/dist/messages/sql-time.js +88 -0
- package/dist/messages/sql-write.d.ts +246 -0
- package/dist/messages/sql-write.js +270 -0
- package/dist/messages/time.d.ts +23 -0
- package/dist/messages/time.js +29 -0
- package/dist/messages/types.d.ts +27 -0
- package/dist/messages/types.js +5 -0
- package/dist/messages/write.d.ts +405 -0
- package/dist/messages/write.js +509 -0
- package/dist/model.d.ts +73 -60
- package/dist/model.js +26 -29
- package/dist/ops.d.ts +35 -0
- package/dist/ops.js +101 -0
- package/dist/pglite.d.ts +0 -9
- package/dist/pglite.js +3 -1
- package/dist/registry.d.ts +3 -19
- package/dist/registry.js +3 -16
- package/dist/signals.d.ts +5 -9
- package/dist/signals.js +5 -9
- package/dist/sql.d.ts +13 -6
- package/dist/sql.js +176 -83
- package/dist/sync.d.ts +9 -3
- package/dist/sync.js +51 -21
- package/dist/tx.d.ts +26 -1
- package/dist/tx.js +44 -14
- package/dist/typed.d.ts +240 -45
- package/dist/types.d.ts +23 -91
- package/dist/types.js +12 -14
- package/dist/up.d.ts +53 -32
- package/dist/up.js +184 -73
- package/dist/uuid.js +5 -5
- package/dist/validate.d.ts +13 -1
- package/dist/validate.js +61 -29
- package/dist/watch.d.ts +11 -10
- package/dist/watch.js +33 -70
- package/dist/write.d.ts +9 -16
- package/dist/write.js +118 -187
- package/llms.txt +22 -25
- package/package.json +8 -11
- package/sql/10-core.sql +7 -50
- package/sql/15-errors.sql +64 -10
- package/sql/20-context.sql +7 -6
- package/sql/30-validate.sql +35 -27
- package/sql/40-class.sql +20 -114
- package/sql/50-acl.sql +8 -13
- package/sql/60-write.sql +220 -667
- package/sql/70-read.sql +20 -16
- package/sql/80-auth.sql +24 -27
- package/sql/90-time.sql +70 -859
- package/sql/95-seed.system.sql +7 -14
- package/sql/99-revision.sql +2 -1
- package/sql/README.md +32 -24
- package/sql/migrate/README.md +14 -0
- package/AGENT-CHEATSHEET.en.md +0 -485
- package/MIGRATION.md +0 -190
- package/README.en.md +0 -2859
- package/dist/import.d.ts +0 -185
- package/dist/import.js +0 -820
- package/dist/project.d.ts +0 -350
- package/dist/project.js +0 -1224
- package/sql/75-history.sql +0 -358
- package/sql/88-derived.sql +0 -1235
- package/sql/migrate/0006-changed-paths.sql +0 -3
- package/sql/migrate/0007-secret-account-fk.sql +0 -12
package/dist/signals.d.ts
CHANGED
|
@@ -2,14 +2,10 @@ export type SignalMode = 'class' | 'tenant' | 'opaque' | 'none';
|
|
|
2
2
|
export declare const SIGNAL_MODES: readonly SignalMode[];
|
|
3
3
|
/** Разобранный сигнал. */
|
|
4
4
|
export type Signal =
|
|
5
|
-
/**
|
|
5
|
+
/** Слушатель сигналов (пере)подключился — сигналы за время обрыва потеряны: кэш, пропуска прав, реестр и ключ — заново. */
|
|
6
6
|
{
|
|
7
7
|
kind: 'all';
|
|
8
8
|
}
|
|
9
|
-
/** `session:*` — все сессии. */
|
|
10
|
-
| {
|
|
11
|
-
kind: 'sessions';
|
|
12
|
-
}
|
|
13
9
|
/** `session:<тег>` — погашенная сессия (тег — начало sha256 токена). */
|
|
14
10
|
| {
|
|
15
11
|
kind: 'session';
|
|
@@ -57,10 +53,6 @@ export declare class Signals {
|
|
|
57
53
|
/** Разобрать нагрузку сигнала или элемент letopis.changed своей транзакции. */
|
|
58
54
|
parse(p: string): Signal;
|
|
59
55
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Не чаще раза в ms: первый вызов — сразу, вызовы внутри окна — один раз в его конце. Так заливка
|
|
62
|
-
* канала сигналами (в том числе поддельными) не превращается в поток перечитываний реестра.
|
|
63
|
-
*/
|
|
64
56
|
/**
|
|
65
57
|
* Ведро жетонов: count вызовов подряд — сразу, дальше не чаще раза в ms (жетон возвращается раз в ms); вызовы
|
|
66
58
|
* в ожидании сливаются в один. Короткая серия проходит без задержки, заливка — с заданной частотой.
|
|
@@ -68,6 +60,10 @@ export declare class Signals {
|
|
|
68
60
|
export declare function bucket(fn: () => void, count: number, ms: number): (() => void) & {
|
|
69
61
|
stop(): void;
|
|
70
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* Не чаще раза в ms: первый вызов — сразу, вызовы внутри окна — один раз в его конце. Так заливка
|
|
65
|
+
* канала сигналами (в том числе поддельными) не превращается в поток перечитываний реестра.
|
|
66
|
+
*/
|
|
71
67
|
export declare function throttle(fn: () => void, ms: number): (() => void) & {
|
|
72
68
|
stop(): void;
|
|
73
69
|
};
|
package/dist/signals.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Канал — имя схемы; нагрузку строит функция базы signal() по режиму up({ signals }):
|
|
5
5
|
* - class — `Booking` (как в 1.0); tenant — `Booking@<токен арендатора>`;
|
|
6
6
|
* - opaque — `<токен класса>@<токен арендатора>`; none — сигналов нет;
|
|
7
|
-
* -
|
|
7
|
+
* - погашенная сессия — `session:<16 hex>` (кроме none).
|
|
8
8
|
* Токен — первые 96 бит HMAC-SHA256 от «назначение:значение» на ключе сигналов (signal_key(): HMAC
|
|
9
9
|
* ключа строки KEY по 'letopis:signals'), 24 строчных шестнадцатеричных знака. Имя класса не содержит
|
|
10
10
|
* `@`, `:` и `*` (метасхема Class), поэтому нагрузка разбирается однозначно.
|
|
@@ -77,10 +77,6 @@ export class Signals {
|
|
|
77
77
|
}
|
|
78
78
|
/** Разобрать нагрузку сигнала или элемент letopis.changed своей транзакции. */
|
|
79
79
|
parse(p) {
|
|
80
|
-
if (p === '*')
|
|
81
|
-
return { kind: 'all' };
|
|
82
|
-
if (p === 'session:*')
|
|
83
|
-
return { kind: 'sessions' };
|
|
84
80
|
if (p.startsWith('session:'))
|
|
85
81
|
return /^session:[0-9a-f]{16}$/.test(p) ? { kind: 'session', tag: p.slice(8) } : { kind: 'foreign' };
|
|
86
82
|
const at = p.indexOf('@');
|
|
@@ -104,10 +100,6 @@ export class Signals {
|
|
|
104
100
|
return cls ? { kind: 'class', cls, tenant } : { kind: 'unknown', tenant };
|
|
105
101
|
}
|
|
106
102
|
}
|
|
107
|
-
/**
|
|
108
|
-
* Не чаще раза в ms: первый вызов — сразу, вызовы внутри окна — один раз в его конце. Так заливка
|
|
109
|
-
* канала сигналами (в том числе поддельными) не превращается в поток перечитываний реестра.
|
|
110
|
-
*/
|
|
111
103
|
/**
|
|
112
104
|
* Ведро жетонов: count вызовов подряд — сразу, дальше не чаще раза в ms (жетон возвращается раз в ms); вызовы
|
|
113
105
|
* в ожидании сливаются в один. Короткая серия проходит без задержки, заливка — с заданной частотой.
|
|
@@ -140,6 +132,10 @@ export function bucket(fn, count, ms) {
|
|
|
140
132
|
},
|
|
141
133
|
});
|
|
142
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Не чаще раза в ms: первый вызов — сразу, вызовы внутри окна — один раз в его конце. Так заливка
|
|
137
|
+
* канала сигналами (в том числе поддельными) не превращается в поток перечитываний реестра.
|
|
138
|
+
*/
|
|
143
139
|
export function throttle(fn, ms) {
|
|
144
140
|
let last = -Infinity;
|
|
145
141
|
let timer = null;
|
package/dist/sql.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ClassInfo, LeafType, Registry } from './registry.js';
|
|
2
|
-
import { type ChainMods, type Cursor, type Filter, type Row } from './types.js';
|
|
2
|
+
import { type ChainMods, type Cursor, type Filter, type Path, type Row } from './types.js';
|
|
3
3
|
export interface Step {
|
|
4
4
|
/** Имя, как вызвано в цепочке (класс, алиас или роль). */
|
|
5
5
|
name: string;
|
|
@@ -29,7 +29,7 @@ export interface Step {
|
|
|
29
29
|
}
|
|
30
30
|
/** Уникальная метка узла пути. */
|
|
31
31
|
export declare const nextNodeKey: () => number;
|
|
32
|
-
export type ReadMode = 'paths' | 'rows' | 'ids' | 'count' | 'countPaths' | 'versions' | 'agg'
|
|
32
|
+
export type ReadMode = 'paths' | 'rows' | 'ids' | 'count' | 'countPaths' | 'versions' | 'agg';
|
|
33
33
|
export interface AggSpec {
|
|
34
34
|
fn: 'sum' | 'avg' | 'min' | 'max' | 'countBy';
|
|
35
35
|
field: string;
|
|
@@ -37,7 +37,7 @@ export interface AggSpec {
|
|
|
37
37
|
export interface BuiltQuery {
|
|
38
38
|
text: string;
|
|
39
39
|
params: unknown[];
|
|
40
|
-
/** Ключи шагов в путях (алиасы, повторы — _2, _3)
|
|
40
|
+
/** Ключи шагов в путях (алиасы, повторы — _2, _3) в порядке шагов; ключ узла последнего шага — последний. */
|
|
41
41
|
keys: string[];
|
|
42
42
|
/** Тип листа агрегата (min/max числового поля приводятся к числу). */
|
|
43
43
|
aggLeaf?: LeafType;
|
|
@@ -48,6 +48,12 @@ export declare function roleOwners(reg: Registry, role: string): ClassInfo[];
|
|
|
48
48
|
export declare function roleTargets(reg: Registry, role: string): string[];
|
|
49
49
|
/** Конкретные классы, которые матчит шаг: класс (роль — её цели) и потомки, если не exact(). */
|
|
50
50
|
export declare function stepClasses(reg: Registry, step: Step): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Отказы построителя, которым не нужны база и путь, — фильтр шага (в том числе неизвестное поле) и поле sort('data.…') или
|
|
53
|
+
* агрегата по классам шага: план записи проверяет их до первого оператора (write.ts:precheckPlan, §2.5), поэтому
|
|
54
|
+
* опечатка в фильтре цели не ломает db.begin(). Построитель при чтении проверяет то же самое ещё раз.
|
|
55
|
+
*/
|
|
56
|
+
export declare function precheckStep(reg: Registry, step: Step, order?: string, agg?: AggSpec): void;
|
|
51
57
|
/** Принимает ли список классов конца класс cls (с учётом его предков). */
|
|
52
58
|
export declare const accepts: (reg: Registry, targets: string[], cls: string) => boolean;
|
|
53
59
|
export interface Hop {
|
|
@@ -63,10 +69,11 @@ export interface Hop {
|
|
|
63
69
|
*/
|
|
64
70
|
export declare function resolveHop(reg: Registry, prev: Step, next: Step): Hop;
|
|
65
71
|
/**
|
|
66
|
-
* Курсор постраничного вывода для `after()`:
|
|
67
|
-
* Поле — то же, что в `sort()`; если его нет в данных строки, `v` — `null`.
|
|
72
|
+
* Курсор постраничного вывода для `after()`: значение поля сортировки, id и номер версии последней строки страницы.
|
|
73
|
+
* Поле — то же, что в `sort()`; если его нет в данных строки, `v` — `null`. Для пути из `paths()` — то же по его
|
|
74
|
+
* последнему узлу (узлу последнего шага) и id всех узлов: курсор отделяет пути с общим последним узлом.
|
|
68
75
|
*/
|
|
69
|
-
export declare function cursorOf(row: Row, field: string): Cursor;
|
|
76
|
+
export declare function cursorOf(row: Row | Path, field: string): Cursor;
|
|
70
77
|
export interface BuildOptions {
|
|
71
78
|
/**
|
|
72
79
|
* Режим сверки (тест find-ids-parity): вместо функций владельца find_* — те же запросы прямо
|