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/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
- * - сессии — `session:<16 hex>` и `session:*`, сброс — `*` (кроме none).
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' | 'diff' | 'blame';
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()`: `{ v, id }` — значение поля сортировки и id последней строки страницы.
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_* — те же запросы прямо