@yss123/cage-kernel 0.0.0-stage → 0.1.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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -2
  3. package/dist/brands.d.ts +32 -0
  4. package/dist/brands.js +35 -0
  5. package/dist/brands.js.map +1 -0
  6. package/dist/db/connect.d.ts +28 -0
  7. package/dist/db/connect.js +57 -0
  8. package/dist/db/connect.js.map +1 -0
  9. package/dist/db/ddl.d.ts +62 -0
  10. package/dist/db/ddl.js +454 -0
  11. package/dist/db/ddl.js.map +1 -0
  12. package/dist/db/index.d.ts +5 -0
  13. package/dist/db/index.js +7 -0
  14. package/dist/db/index.js.map +1 -0
  15. package/dist/db/migrate.d.ts +22 -0
  16. package/dist/db/migrate.js +87 -0
  17. package/dist/db/migrate.js.map +1 -0
  18. package/dist/db/rows.d.ts +10 -0
  19. package/dist/db/rows.js +56 -0
  20. package/dist/db/rows.js.map +1 -0
  21. package/dist/db/session.d.ts +4 -0
  22. package/dist/db/session.js +20 -0
  23. package/dist/db/session.js.map +1 -0
  24. package/dist/errors.d.ts +44 -0
  25. package/dist/errors.js +81 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.d.ts +22 -0
  28. package/dist/index.js +24 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/kernel.d.ts +97 -0
  31. package/dist/kernel.js +440 -0
  32. package/dist/kernel.js.map +1 -0
  33. package/dist/mask.d.ts +13 -0
  34. package/dist/mask.js +62 -0
  35. package/dist/mask.js.map +1 -0
  36. package/dist/org.d.ts +46 -0
  37. package/dist/org.js +127 -0
  38. package/dist/org.js.map +1 -0
  39. package/dist/pipeline/idempotency.d.ts +10 -0
  40. package/dist/pipeline/idempotency.js +29 -0
  41. package/dist/pipeline/idempotency.js.map +1 -0
  42. package/dist/pipeline/load.d.ts +15 -0
  43. package/dist/pipeline/load.js +84 -0
  44. package/dist/pipeline/load.js.map +1 -0
  45. package/dist/primitives/aggregate.d.ts +75 -0
  46. package/dist/primitives/aggregate.js +67 -0
  47. package/dist/primitives/aggregate.js.map +1 -0
  48. package/dist/primitives/command.d.ts +101 -0
  49. package/dist/primitives/command.js +49 -0
  50. package/dist/primitives/command.js.map +1 -0
  51. package/dist/primitives/constraints.d.ts +36 -0
  52. package/dist/primitives/constraints.js +41 -0
  53. package/dist/primitives/constraints.js.map +1 -0
  54. package/dist/primitives/event.d.ts +31 -0
  55. package/dist/primitives/event.js +42 -0
  56. package/dist/primitives/event.js.map +1 -0
  57. package/dist/primitives/fields.d.ts +107 -0
  58. package/dist/primitives/fields.js +122 -0
  59. package/dist/primitives/fields.js.map +1 -0
  60. package/dist/primitives/flow.d.ts +126 -0
  61. package/dist/primitives/flow.js +90 -0
  62. package/dist/primitives/flow.js.map +1 -0
  63. package/dist/primitives/states.d.ts +19 -0
  64. package/dist/primitives/states.js +37 -0
  65. package/dist/primitives/states.js.map +1 -0
  66. package/dist/read.d.ts +47 -0
  67. package/dist/read.js +170 -0
  68. package/dist/read.js.map +1 -0
  69. package/dist/registry.d.ts +71 -0
  70. package/dist/registry.js +151 -0
  71. package/dist/registry.js.map +1 -0
  72. package/dist/scope/index.d.ts +42 -0
  73. package/dist/scope/index.js +90 -0
  74. package/dist/scope/index.js.map +1 -0
  75. package/dist/telemetry.d.ts +11 -0
  76. package/dist/telemetry.js +35 -0
  77. package/dist/telemetry.js.map +1 -0
  78. package/dist/types.d.ts +52 -0
  79. package/dist/types.js +5 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/util/names.d.ts +9 -0
  82. package/dist/util/names.js +38 -0
  83. package/dist/util/names.js.map +1 -0
  84. package/dist/worker/consumers.d.ts +29 -0
  85. package/dist/worker/consumers.js +79 -0
  86. package/dist/worker/consumers.js.map +1 -0
  87. package/dist/worker/index.d.ts +36 -0
  88. package/dist/worker/index.js +120 -0
  89. package/dist/worker/index.js.map +1 -0
  90. package/dist/worker/outbox.d.ts +38 -0
  91. package/dist/worker/outbox.js +121 -0
  92. package/dist/worker/outbox.js.map +1 -0
  93. package/dist/worker/scheduler.d.ts +7 -0
  94. package/dist/worker/scheduler.js +77 -0
  95. package/dist/worker/scheduler.js.map +1 -0
  96. package/package.json +58 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/primitives/states.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWzC;;GAEG;AACH,MAAM,UAAU,MAAM,CAAyB,GAAG,IAAwC;IACxF,MAAM,GAAG,GAAG,IAAiB,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAoC,CAAC;IACxG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,MAAM,CAAC,EAAE,IAAa;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAM;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC"}
package/dist/read.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { type Transaction } from 'kysely';
2
+ import { z } from 'zod';
3
+ import type { Kernel } from './kernel.js';
4
+ import { type AnyAggregate } from './primitives/aggregate.js';
5
+ import type { AnyQuery } from './primitives/flow.js';
6
+ import type { Ctx } from './types.js';
7
+ export interface ListParams {
8
+ page?: number | string;
9
+ pageSize?: number | string;
10
+ /** 排序:字段名,前面加 - 表示倒序,例如 -createdAt */
11
+ sort?: string;
12
+ createdAfter?: string;
13
+ createdBefore?: string;
14
+ /** 其他键:字段等值过滤;status 可以逗号分隔多个 */
15
+ [field: string]: unknown;
16
+ }
17
+ export interface Page<T> {
18
+ items: T[];
19
+ total: number;
20
+ page: number;
21
+ pageSize: number;
22
+ }
23
+ export declare class ReadSide {
24
+ private readonly k;
25
+ constructor(k: Kernel);
26
+ /** 读侧账号上的只读事务,已写入会话变量 */
27
+ tx<T>(ctx: Ctx, fn: (tx: Transaction<any>) => Promise<T>): Promise<T>;
28
+ private agg;
29
+ private need;
30
+ /** 明文读取敏感字段要写读审计 */
31
+ private auditUnmask;
32
+ get(a: AnyAggregate | string, id: string, ctx: Ctx): Promise<Record<string, any>>;
33
+ list(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<Page<Record<string, any>>>;
34
+ private listIn;
35
+ /** 导出:就是读,走安全视图,自然带范围和脱敏;需要 聚合.export 能力,并写读审计 */
36
+ export(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<{
37
+ filename: string;
38
+ contentType: string;
39
+ body: string;
40
+ rows: number;
41
+ }>;
42
+ /** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
43
+ run(q: AnyQuery | string, raw: unknown, ctx: Ctx): Promise<Record<string, any>[]>;
44
+ }
45
+ /** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
46
+ export declare function compileNamedSql(text: string, input: Record<string, unknown>): import("kysely").RawBuilder<Record<string, unknown>>;
47
+ export declare const listParamsSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
package/dist/read.js ADDED
@@ -0,0 +1,170 @@
1
+ // 读侧:只用读侧账号,只查 safe 模式下的安全视图;内核在只读事务开头写会话变量,
2
+ // 行级策略和掩码由数据库兜底。忘了设置上下文时一条都查不到。
3
+ import { sql } from 'kysely';
4
+ import { z } from 'zod';
5
+ import { viewRowToObject } from './db/rows.js';
6
+ import { setSessionVars } from './db/session.js';
7
+ import { cageError } from './errors.js';
8
+ import { hiddenFields, sensitiveFields } from './primitives/aggregate.js';
9
+ import { snake } from './util/names.js';
10
+ const SYS = { id: 'id', status: 'status', version: 'version', createdAt: 'created_at', updatedAt: 'updated_at' };
11
+ const RESERVED = new Set(['page', 'pageSize', 'sort', 'createdAfter', 'createdBefore']);
12
+ function coerce(kind, v) {
13
+ if (typeof v !== 'string')
14
+ return v;
15
+ if (kind === 'int' || kind === 'number')
16
+ return Number(v);
17
+ if (kind === 'bool')
18
+ return v === 'true';
19
+ return v;
20
+ }
21
+ export class ReadSide {
22
+ k;
23
+ constructor(k) {
24
+ this.k = k;
25
+ }
26
+ /** 读侧账号上的只读事务,已写入会话变量 */
27
+ async tx(ctx, fn) {
28
+ return this.k.readDb
29
+ .transaction()
30
+ .setAccessMode('read only')
31
+ .execute(async (tx) => {
32
+ await setSessionVars(tx, ctx);
33
+ return fn(tx);
34
+ });
35
+ }
36
+ agg(a) {
37
+ const agg = typeof a === 'string' ? this.k.registry.aggregate(a) : a;
38
+ if (!agg)
39
+ throw cageError('NOT_FOUND');
40
+ return agg;
41
+ }
42
+ need(ctx, cap) {
43
+ if (!ctx.actor || ctx.actor.kind === 'anonymous')
44
+ throw cageError('UNAUTHENTICATED');
45
+ if (!ctx.capabilities.has(cap))
46
+ throw cageError('FORBIDDEN', { capability: cap });
47
+ }
48
+ /** 明文读取敏感字段要写读审计 */
49
+ async auditUnmask(agg, ctx, ids, kind) {
50
+ const kinds = [...new Set(Object.values(sensitiveFields(agg)))].filter((x) => ctx.unmask.includes(`${agg.name}.${x}`) || ctx.unmask.includes(`*.${x}`));
51
+ if (kind === 'read' && kinds.length === 0)
52
+ return;
53
+ await this.k.writeAudit(this.k.app, {
54
+ tenantId: ctx.tenantId, actor: ctx.actor?.id ?? 'anonymous', actorKind: ctx.actor?.kind ?? 'anonymous',
55
+ onBehalfOf: ctx.onBehalfOf ?? null, source: ctx.source, kind: 'read',
56
+ capability: `${agg.name}.${kind}`, command: null, aggregate: agg.name,
57
+ aggregateId: ids.length === 1 ? ids[0] : null, result: 'ok',
58
+ diff: { unmasked: kinds, rows: ids.length }, requestId: ctx.requestId ?? null, client: ctx.client ?? null,
59
+ }).catch((e) => this.k.log.warn({ err: String(e) }, '读审计写入失败'));
60
+ }
61
+ async get(a, id, ctx) {
62
+ const agg = this.agg(a);
63
+ this.need(ctx, `${agg.name}.read`);
64
+ if (!/^[0-9a-f-]{36}$/i.test(id))
65
+ throw cageError('NOT_FOUND');
66
+ const row = await this.tx(ctx, (tx) => tx.selectFrom(`safe.${agg.table.name}`).selectAll().where('id', '=', id).executeTakeFirst());
67
+ if (!row)
68
+ throw cageError('NOT_FOUND');
69
+ void this.auditUnmask(agg, ctx, [id], 'read');
70
+ return viewRowToObject(row);
71
+ }
72
+ async list(a, params, ctx) {
73
+ const agg = this.agg(a);
74
+ this.need(ctx, `${agg.name}.read`);
75
+ const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, params, 200));
76
+ void this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'read');
77
+ return res;
78
+ }
79
+ async listIn(tx, agg, params, maxPageSize) {
80
+ const page = Math.max(1, Number(params.page ?? 1) || 1);
81
+ const pageSize = Math.min(maxPageSize, Math.max(1, Number(params.pageSize ?? 20) || 20));
82
+ const hidden = new Set(hiddenFields(agg));
83
+ const view = `safe.${agg.table.name}`;
84
+ const apply = (q) => {
85
+ for (const [k, v] of Object.entries(params)) {
86
+ if (RESERVED.has(k) || v === undefined || v === '')
87
+ continue;
88
+ const f = agg.fields[k];
89
+ const col = SYS[k] ?? (f && !hidden.has(k) && f.sql !== 'jsonb' && !f.sensitiveKind ? snake(k) : undefined);
90
+ if (!col)
91
+ throw cageError('INVALID_INPUT', [{ path: k, message: `不能按 ${k} 过滤` }]);
92
+ if (k === 'status' && typeof v === 'string' && v.includes(','))
93
+ q = q.where('status', 'in', v.split(','));
94
+ else
95
+ q = q.where(sql.ref(col), '=', coerce(f?.kind ?? 'text', v));
96
+ }
97
+ if (params.status === undefined)
98
+ q = q.where('status', '<>', 'deleted');
99
+ if (params.createdAfter)
100
+ q = q.where('created_at', '>=', new Date(String(params.createdAfter)));
101
+ if (params.createdBefore)
102
+ q = q.where('created_at', '<', new Date(String(params.createdBefore)));
103
+ return q;
104
+ };
105
+ let q = apply(tx.selectFrom(view).selectAll());
106
+ const sortKey = typeof params.sort === 'string' && params.sort ? params.sort.replace(/^-/, '') : 'createdAt';
107
+ const sortCol = SYS[sortKey] ?? (agg.fields[sortKey] && !hidden.has(sortKey) ? snake(sortKey) : undefined);
108
+ if (!sortCol)
109
+ throw cageError('INVALID_INPUT', [{ path: 'sort', message: `不能按 ${sortKey} 排序` }]);
110
+ const desc = typeof params.sort === 'string' ? params.sort.startsWith('-') : true;
111
+ q = q.orderBy(sql.ref(sortCol), desc ? 'desc' : 'asc').orderBy('id').limit(pageSize).offset((page - 1) * pageSize);
112
+ const rows = await q.execute();
113
+ const cnt = await apply(tx.selectFrom(view).select(sql `count(*)::int`.as('n'))).executeTakeFirst();
114
+ return { items: rows.map(viewRowToObject), total: Number(cnt?.n ?? 0), page, pageSize };
115
+ }
116
+ /** 导出:就是读,走安全视图,自然带范围和脱敏;需要 聚合.export 能力,并写读审计 */
117
+ async export(a, params, ctx) {
118
+ const agg = this.agg(a);
119
+ this.need(ctx, `${agg.name}.export`);
120
+ const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, { ...params, page: 1, pageSize: 10000 }, 10000));
121
+ const cols = ['id', ...Object.keys(agg.fields).filter((k) => !hiddenFields(agg).includes(k)), 'status', 'version', 'createdAt', 'updatedAt'];
122
+ const cell = (v) => {
123
+ const s = v === null || v === undefined ? '' : typeof v === 'object' ? JSON.stringify(v) : String(v);
124
+ // 防 CSV 公式注入
125
+ const safe = /^[=+\-@\t\r]/.test(s) ? `'${s}` : s;
126
+ return /[",\n]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
127
+ };
128
+ const body = [cols.join(','), ...res.items.map((r) => cols.map((c) => cell(r[c])).join(','))].join('\n');
129
+ await this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'export');
130
+ return { filename: `${agg.table.name}.csv`, contentType: 'text/csv; charset=utf-8', body: '' + body, rows: res.items.length };
131
+ }
132
+ /** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
133
+ async run(q, raw, ctx) {
134
+ const query = typeof q === 'string' ? this.k.registry.queries.find((x) => x.name === q) : q;
135
+ if (!query)
136
+ throw cageError('NOT_FOUND');
137
+ for (const a of query.reads)
138
+ this.need(ctx, `${a.name}.read`);
139
+ const parsed = query.input.safeParse(raw ?? {});
140
+ if (!parsed.success)
141
+ throw cageError('INVALID_INPUT', parsed.error.issues.map((i) => ({ path: i.path.join('.'), message: i.message })));
142
+ const input = parsed.data;
143
+ const rows = await this.tx(ctx, async (tx) => {
144
+ if (query.build)
145
+ return (await query.build(tx, input).execute());
146
+ const compiled = compileNamedSql(query.sql, input);
147
+ const r = await compiled.execute(tx);
148
+ return r.rows;
149
+ });
150
+ return rows.map(viewRowToObject);
151
+ }
152
+ }
153
+ /** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
154
+ export function compileNamedSql(text, input) {
155
+ const parts = [];
156
+ const re = /(?<![:\w]):([a-zA-Z_][a-zA-Z0-9_]*)/g;
157
+ let last = 0;
158
+ let m;
159
+ while ((m = re.exec(text))) {
160
+ parts.push(sql.raw(text.slice(last, m.index)));
161
+ if (!(m[1] in input))
162
+ throw cageError('INVALID_INPUT', [{ path: m[1], message: `缺少查询参数 ${m[1]}` }]);
163
+ parts.push(sql `${input[m[1]]}`);
164
+ last = m.index + m[0].length;
165
+ }
166
+ parts.push(sql.raw(text.slice(last)));
167
+ return sql `${sql.join(parts, sql.raw(''))}`;
168
+ }
169
+ export const listParamsSchema = z.record(z.string(), z.unknown());
170
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { CONNECTOR, INBOUND, OUTBOUND, ROUTE } from './brands.js';
2
+ import { type AnyAggregate } from './primitives/aggregate.js';
3
+ import type { AnyCommand } from './primitives/command.js';
4
+ import type { AnyEvent } from './primitives/event.js';
5
+ import type { AnyQuery, AnyReaction, Approval, Job } from './primitives/flow.js';
6
+ export interface RegisteredCommand {
7
+ readonly cmd: AnyCommand;
8
+ /** 命令名(导出名或显式 name) */
9
+ readonly name: string;
10
+ /** 能力点:聚合名.命令名 */
11
+ readonly capability: string;
12
+ readonly exportName: string;
13
+ }
14
+ export interface CatalogEntry {
15
+ capability: string;
16
+ kind: 'command' | 'read' | 'export' | 'unmask' | 'system';
17
+ aggregate?: string;
18
+ description?: string;
19
+ /** 命令的调用方限制,管理界面据此提示 */
20
+ invokedBy?: readonly string[];
21
+ }
22
+ export interface RuntimeExtension {
23
+ kind: 'CONNECTOR' | 'OUTBOUND' | 'INBOUND' | 'ROUTE';
24
+ name: string;
25
+ value: any;
26
+ }
27
+ export interface Registry {
28
+ readonly aggregates: readonly AnyAggregate[];
29
+ readonly commands: readonly RegisteredCommand[];
30
+ readonly events: readonly AnyEvent[];
31
+ readonly reactions: readonly {
32
+ r: AnyReaction;
33
+ name: string;
34
+ }[];
35
+ readonly queries: readonly AnyQuery[];
36
+ readonly approvals: readonly {
37
+ a: Approval;
38
+ name: string;
39
+ }[];
40
+ readonly jobs: readonly Job[];
41
+ readonly extensions: readonly RuntimeExtension[];
42
+ readonly systemDdl: readonly string[];
43
+ aggregate(name: string): AnyAggregate | undefined;
44
+ /** 按能力点或命令对象找命令 */
45
+ command(ref: string | AnyCommand): RegisteredCommand | undefined;
46
+ capabilityOf(cmd: AnyCommand): string;
47
+ /** 任意原语对象的导出名 */
48
+ nameOf(v: object): string | undefined;
49
+ reactionsFor(eventName: string): {
50
+ r: AnyReaction;
51
+ name: string;
52
+ }[];
53
+ approvalFor(aggName: string): {
54
+ a: Approval;
55
+ name: string;
56
+ } | undefined;
57
+ approvalByProcess(process: string): {
58
+ a: Approval;
59
+ name: string;
60
+ } | undefined;
61
+ capabilityCatalog(): CatalogEntry[];
62
+ /** 带 CONSUMERS 标记的声明对象(连接器出站映射等) */
63
+ consumerProviders(): any[];
64
+ }
65
+ export interface RegistryOptions {
66
+ /** 框架额外的系统能力点,例如 Sys.audit.read */
67
+ extraCapabilities?: CatalogEntry[];
68
+ }
69
+ /** 遍历一个或多个 domain 模块的导出,建立注册表。 */
70
+ export declare function buildRegistry(domains: object | object[], opts?: RegistryOptions): Registry;
71
+ export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };
@@ -0,0 +1,151 @@
1
+ // 注册表:遍历 domain 包的导出,靠品牌标记识别原语,用导出名给命令和反应命名。
2
+ import { CONSUMERS, CONNECTOR, INBOUND, OUTBOUND, ROUTE, SYSTEM_DDL, brandOf } from './brands.js';
3
+ import { declError } from './errors.js';
4
+ import { sensitiveFields } from './primitives/aggregate.js';
5
+ /** 遍历一个或多个 domain 模块的导出,建立注册表。 */
6
+ export function buildRegistry(domains, opts = {}) {
7
+ const mods = Array.isArray(domains) ? domains : [domains];
8
+ const names = new Map();
9
+ const aggregates = [];
10
+ const commands = [];
11
+ const events = [];
12
+ const reactions = [];
13
+ const queries = [];
14
+ const approvals = [];
15
+ const jobs = [];
16
+ const extensions = [];
17
+ const systemDdl = [];
18
+ for (const mod of mods) {
19
+ for (const [exportName, v] of Object.entries(mod)) {
20
+ if (!v || (typeof v !== 'object' && typeof v !== 'function'))
21
+ continue;
22
+ if (names.has(v))
23
+ continue; // 同一个对象被重复导出:保留第一个名字
24
+ const brand = brandOf(v);
25
+ if (!brand)
26
+ continue;
27
+ names.set(v, exportName);
28
+ switch (brand) {
29
+ case 'AGGREGATE':
30
+ if (aggregates.some((a) => a.name === v.name)) {
31
+ throw declError('CAGE-REG-002', `聚合名重复:${v.name}`);
32
+ }
33
+ aggregates.push(v);
34
+ break;
35
+ case 'COMMAND': {
36
+ const cmd = v;
37
+ const name = cmd.name ?? exportName;
38
+ commands.push({ cmd, name, capability: `${cmd.agg.name}.${name}`, exportName });
39
+ break;
40
+ }
41
+ case 'EVENT':
42
+ events.push(v);
43
+ break;
44
+ case 'REACTION':
45
+ reactions.push({ r: v, name: v.name ?? exportName });
46
+ break;
47
+ case 'QUERY':
48
+ queries.push(v);
49
+ break;
50
+ case 'APPROVAL':
51
+ approvals.push({ a: v, name: exportName });
52
+ break;
53
+ case 'JOB':
54
+ jobs.push(v);
55
+ break;
56
+ case 'CONNECTOR':
57
+ case 'OUTBOUND':
58
+ case 'INBOUND':
59
+ case 'ROUTE':
60
+ extensions.push({ kind: brand, name: exportName, value: v });
61
+ break;
62
+ default:
63
+ break;
64
+ }
65
+ const ddl = v[SYSTEM_DDL];
66
+ if (typeof ddl === 'function') {
67
+ const text = String(ddl());
68
+ if (!systemDdl.includes(text))
69
+ systemDdl.push(text);
70
+ }
71
+ }
72
+ }
73
+ // ---- 一致性校验:引用的东西都必须被导出,否则抽取器和内核看不到 ----
74
+ const aggSet = new Set(aggregates);
75
+ const caps = new Set();
76
+ for (const c of commands) {
77
+ if (!aggSet.has(c.cmd.agg))
78
+ throw declError('CAGE-REG-001', `命令 ${c.capability} 所属的聚合 ${c.cmd.agg.name} 没有从 domain 导出`);
79
+ if (caps.has(c.capability))
80
+ throw declError('CAGE-REG-003', `能力点重复:${c.capability},可用 command({ name }) 区分`);
81
+ caps.add(c.capability);
82
+ for (const [alias, a] of Object.entries(c.cmd.reads)) {
83
+ if (!aggSet.has(a))
84
+ throw declError('CAGE-REG-001', `命令 ${c.capability} 的 reads.${alias} 引用的聚合没有导出`);
85
+ }
86
+ }
87
+ const cmdSet = new Set(commands.map((c) => c.cmd));
88
+ for (const { r, name } of reactions) {
89
+ if (!cmdSet.has(r.command))
90
+ throw declError('CAGE-REG-001', `反应 ${name} 调用的命令没有从 domain 导出`);
91
+ }
92
+ for (const { a, name } of approvals) {
93
+ if (!cmdSet.has(a.onApproved) || !cmdSet.has(a.onRejected)) {
94
+ throw declError('CAGE-REG-001', `审批绑定 ${name} 的结论命令没有从 domain 导出`);
95
+ }
96
+ }
97
+ for (const j of jobs) {
98
+ for (const c of j.calls)
99
+ if (!cmdSet.has(c))
100
+ throw declError('CAGE-REG-001', `任务 ${j.name} 调用的命令没有导出`);
101
+ }
102
+ const queryNames = new Set();
103
+ for (const q of queries) {
104
+ if (queryNames.has(q.name))
105
+ throw declError('CAGE-REG-002', `查询名重复:${q.name}`);
106
+ queryNames.add(q.name);
107
+ }
108
+ const byCap = new Map(commands.map((c) => [c.capability, c]));
109
+ const byCmd = new Map(commands.map((c) => [c.cmd, c]));
110
+ const byAgg = new Map(aggregates.map((a) => [a.name, a]));
111
+ const registry = {
112
+ aggregates, commands, events, reactions, queries, approvals, jobs, extensions, systemDdl,
113
+ aggregate: (name) => byAgg.get(name),
114
+ command: (ref) => (typeof ref === 'string' ? byCap.get(ref) : byCmd.get(ref)),
115
+ capabilityOf: (cmd) => {
116
+ const c = byCmd.get(cmd);
117
+ if (!c)
118
+ throw declError('CAGE-REG-001', `命令(${cmd.agg.name})没有从 domain 导出,无法确定能力点`);
119
+ return c.capability;
120
+ },
121
+ nameOf: (v) => names.get(v),
122
+ reactionsFor: (eventName) => reactions.filter((x) => x.r.event.name === eventName),
123
+ approvalFor: (aggName) => approvals.find((x) => x.a.agg.name === aggName),
124
+ approvalByProcess: (process) => approvals.find((x) => x.a.process === process),
125
+ capabilityCatalog: () => {
126
+ const out = [];
127
+ for (const a of aggregates) {
128
+ out.push({ capability: `${a.name}.read`, kind: 'read', aggregate: a.name, description: `查看${a.description ?? a.name}` });
129
+ out.push({ capability: `${a.name}.export`, kind: 'export', aggregate: a.name, description: `导出${a.description ?? a.name}` });
130
+ for (const kind of new Set(Object.values(sensitiveFields(a)))) {
131
+ out.push({ capability: `${a.name}.unmask.${kind}`, kind: 'unmask', aggregate: a.name, description: `查看 ${a.name} 的 ${kind} 明文` });
132
+ }
133
+ }
134
+ for (const c of commands) {
135
+ out.push({
136
+ capability: c.capability, kind: 'command', aggregate: c.cmd.agg.name,
137
+ description: c.cmd.description, invokedBy: c.cmd.invokedBy,
138
+ });
139
+ }
140
+ // 框架系统能力:审计查询、异步任务运维(内核拥有审计表和 outbox)
141
+ out.push({ capability: 'Sys.audit.read', kind: 'system', description: '查询审计记录' }, { capability: 'Sys.ops.read', kind: 'system', description: '查看异步任务、死信、第三方同步记录' }, { capability: 'Sys.ops.manage', kind: 'system', description: '重放或丢弃死信、启停定时任务' });
142
+ for (const e of opts.extraCapabilities ?? [])
143
+ out.push(e);
144
+ return out.sort((x, y) => x.capability.localeCompare(y.capability));
145
+ },
146
+ consumerProviders: () => extensions.map((e) => e.value).filter((v) => typeof v?.[CONSUMERS] === 'function'),
147
+ };
148
+ return Object.freeze(registry);
149
+ }
150
+ export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };
151
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type RawBuilder } from 'kysely';
2
+ import type { Combinator, Ctx, ScopeGrant } from '../types.js';
3
+ export interface ScopeSpec {
4
+ /** 部门字段(dept、deptSubtree、deptSet 依赖它) */
5
+ readonly deptField?: string;
6
+ /** 创建人字段(self 依赖它) */
7
+ readonly ownerField?: string;
8
+ /** 声明时给出的建议组合子,仅用于文档与状态图 */
9
+ readonly hint?: Combinator;
10
+ }
11
+ /**
12
+ * 范围声明:
13
+ * scope.deptSubtree('deptId') 部门字段是 deptId,创建人字段自动识别 createdBy
14
+ * scope.self('createdBy') 只有创建人字段
15
+ * scope.of({ dept: 'deptId', owner: 'ownerId' })
16
+ * scope.none() 没有部门和创建人字段(只能授予 all)
17
+ */
18
+ export declare const scope: {
19
+ self: (ownerField?: string) => ScopeSpec;
20
+ dept: (deptField: string, ownerField?: string) => ScopeSpec;
21
+ deptSubtree: (deptField: string, ownerField?: string) => ScopeSpec;
22
+ deptSet: (deptField: string, ownerField?: string) => ScopeSpec;
23
+ all: () => ScopeSpec;
24
+ of: (f: {
25
+ dept?: string;
26
+ owner?: string;
27
+ }) => ScopeSpec;
28
+ none: () => ScopeSpec;
29
+ };
30
+ /** 没有任何授权时按「仅本人」处理(默认拒绝的一部分) */
31
+ export declare const DEFAULT_GRANTS: ScopeGrant[];
32
+ export declare function grantsFor(ctx: Ctx, aggName: string): ScopeGrant[];
33
+ /** 把一个组合子翻译成参数化 SQL 条件。字段名用 sql.ref 引用,值全部参数化,没有字符串拼接。 */
34
+ export declare function compileGrant(s: ScopeSpec, g: ScopeGrant, ctx: Ctx, alias?: string): RawBuilder<boolean>;
35
+ /** 多个授权取并集:用 OR 连接;外层始终加租户条件。 */
36
+ export declare function compileScope(s: ScopeSpec, aggName: string, ctx: Ctx, alias?: string): RawBuilder<boolean>;
37
+ /**
38
+ * 内存判定:与 SQL 翻译语义一致。deptSubtree 需要知道记录所在部门的祖先路径,由调用方提供。
39
+ */
40
+ export declare function scopeMatches(s: ScopeSpec, aggName: string, ctx: Ctx, row: Record<string, unknown> & {
41
+ tenantId?: string;
42
+ }, deptAncestorsOf?: (deptId: string) => string | undefined): boolean;
@@ -0,0 +1,90 @@
1
+ // 数据范围:聚合声明「哪个字段是部门、哪个字段是创建人」,授权数据决定用哪个组合子。
2
+ // 每个组合子都有 SQL 翻译(compileScope)和内存判定(scopeMatches),两者语义一致。
3
+ import { sql } from 'kysely';
4
+ import { snake } from '../util/names.js';
5
+ function spec(hint, deptField, ownerField) {
6
+ return Object.freeze({ deptField, ownerField, hint });
7
+ }
8
+ /**
9
+ * 范围声明:
10
+ * scope.deptSubtree('deptId') 部门字段是 deptId,创建人字段自动识别 createdBy
11
+ * scope.self('createdBy') 只有创建人字段
12
+ * scope.of({ dept: 'deptId', owner: 'ownerId' })
13
+ * scope.none() 没有部门和创建人字段(只能授予 all)
14
+ */
15
+ export const scope = {
16
+ self: (ownerField = 'createdBy') => spec('self', undefined, ownerField),
17
+ dept: (deptField, ownerField) => spec('dept', deptField, ownerField),
18
+ deptSubtree: (deptField, ownerField) => spec('deptSubtree', deptField, ownerField),
19
+ deptSet: (deptField, ownerField) => spec('deptSet', deptField, ownerField),
20
+ all: () => spec('all'),
21
+ of: (f) => spec(undefined, f.dept, f.owner),
22
+ none: () => spec(undefined),
23
+ };
24
+ /** 没有任何授权时按「仅本人」处理(默认拒绝的一部分) */
25
+ export const DEFAULT_GRANTS = [{ combinator: 'self' }];
26
+ export function grantsFor(ctx, aggName) {
27
+ const g = ctx.scopes[aggName] ?? ctx.scopes['*'];
28
+ return g && g.length > 0 ? g : DEFAULT_GRANTS;
29
+ }
30
+ /** 把一个组合子翻译成参数化 SQL 条件。字段名用 sql.ref 引用,值全部参数化,没有字符串拼接。 */
31
+ export function compileGrant(s, g, ctx, alias) {
32
+ const col = (field) => sql.ref(alias ? `${alias}.${snake(field)}` : snake(field));
33
+ switch (g.combinator) {
34
+ case 'all':
35
+ return sql `true`;
36
+ case 'self': {
37
+ const who = ctx.userId ?? ctx.onBehalfOf ?? null;
38
+ return s.ownerField && who ? sql `${col(s.ownerField)} = ${who}` : sql `false`;
39
+ }
40
+ case 'dept':
41
+ return s.deptField && ctx.deptId ? sql `${col(s.deptField)} = ${ctx.deptId}` : sql `false`;
42
+ case 'deptSubtree':
43
+ return s.deptField && ctx.deptPath
44
+ ? sql `${col(s.deptField)} in (select d.id from sys.dept d where d.tenant_id = ${ctx.tenantId} and d.ancestors like ${ctx.deptPath + '%'})`
45
+ : sql `false`;
46
+ case 'deptSet':
47
+ return s.deptField && g.deptIds && g.deptIds.length > 0
48
+ ? sql `${col(s.deptField)} = any(${g.deptIds}::uuid[])`
49
+ : sql `false`;
50
+ default:
51
+ throw new Error('[CAGE-SCOPE-001] 未知的范围组合子');
52
+ }
53
+ }
54
+ /** 多个授权取并集:用 OR 连接;外层始终加租户条件。 */
55
+ export function compileScope(s, aggName, ctx, alias) {
56
+ const grants = grantsFor(ctx, aggName);
57
+ const parts = grants.map((g) => compileGrant(s, g, ctx, alias));
58
+ const tenantCol = sql.ref(alias ? `${alias}.tenant_id` : 'tenant_id');
59
+ return sql `(${tenantCol} = ${ctx.tenantId} and (${sql.join(parts, sql ` or `)}))`;
60
+ }
61
+ /**
62
+ * 内存判定:与 SQL 翻译语义一致。deptSubtree 需要知道记录所在部门的祖先路径,由调用方提供。
63
+ */
64
+ export function scopeMatches(s, aggName, ctx, row, deptAncestorsOf) {
65
+ if (row.tenantId !== undefined && row.tenantId !== ctx.tenantId)
66
+ return false;
67
+ return grantsFor(ctx, aggName).some((g) => {
68
+ switch (g.combinator) {
69
+ case 'all':
70
+ return true;
71
+ case 'self': {
72
+ const who = ctx.userId ?? ctx.onBehalfOf ?? null;
73
+ return !!s.ownerField && !!who && row[s.ownerField] === who;
74
+ }
75
+ case 'dept':
76
+ return !!s.deptField && !!ctx.deptId && row[s.deptField] === ctx.deptId;
77
+ case 'deptSubtree': {
78
+ if (!s.deptField || !ctx.deptPath)
79
+ return false;
80
+ const anc = deptAncestorsOf?.(String(row[s.deptField]));
81
+ return !!anc && anc.startsWith(ctx.deptPath);
82
+ }
83
+ case 'deptSet':
84
+ return !!s.deptField && !!g.deptIds?.includes(String(row[s.deptField]));
85
+ default:
86
+ return false;
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scope/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function step<T>(name: string, fn: () => Promise<T>): Promise<T>;
2
+ export declare function traceCarrier(): Record<string, string>;
3
+ export declare function withCarrier<T>(carrier: Record<string, string> | null | undefined, fn: () => Promise<T>): Promise<T>;
4
+ export interface Logger {
5
+ info(obj: object | string, msg?: string): void;
6
+ warn(obj: object | string, msg?: string): void;
7
+ error(obj: object | string, msg?: string): void;
8
+ debug?(obj: object | string, msg?: string): void;
9
+ }
10
+ export declare const consoleLogger: Logger;
11
+ export declare const silentLogger: Logger;