@nifrajs/core 1.10.0 → 1.12.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 (68) hide show
  1. package/dist/assurance.d.ts +13 -0
  2. package/dist/assurance.d.ts.map +1 -1
  3. package/dist/assurance.js +20 -0
  4. package/dist/assurance.js.map +1 -1
  5. package/dist/capabilities.d.ts +30 -1
  6. package/dist/capabilities.d.ts.map +1 -1
  7. package/dist/capabilities.js +32 -6
  8. package/dist/capabilities.js.map +1 -1
  9. package/dist/causality.d.ts +132 -0
  10. package/dist/causality.d.ts.map +1 -0
  11. package/dist/causality.js +380 -0
  12. package/dist/causality.js.map +1 -0
  13. package/dist/classification.d.ts +20 -0
  14. package/dist/classification.d.ts.map +1 -1
  15. package/dist/classification.js +120 -0
  16. package/dist/classification.js.map +1 -1
  17. package/dist/errors.d.ts +1 -1
  18. package/dist/errors.d.ts.map +1 -1
  19. package/dist/errors.js.map +1 -1
  20. package/dist/idempotency.d.ts +59 -12
  21. package/dist/idempotency.d.ts.map +1 -1
  22. package/dist/idempotency.js +191 -20
  23. package/dist/idempotency.js.map +1 -1
  24. package/dist/index.d.ts +6 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +6 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/invariants.d.ts +70 -0
  29. package/dist/invariants.d.ts.map +1 -0
  30. package/dist/invariants.js +487 -0
  31. package/dist/invariants.js.map +1 -0
  32. package/dist/ledger.d.ts +154 -0
  33. package/dist/ledger.d.ts.map +1 -0
  34. package/dist/ledger.js +271 -0
  35. package/dist/ledger.js.map +1 -0
  36. package/dist/manifest.d.ts +81 -0
  37. package/dist/manifest.d.ts.map +1 -0
  38. package/dist/manifest.js +394 -0
  39. package/dist/manifest.js.map +1 -0
  40. package/dist/mount.d.ts +18 -0
  41. package/dist/mount.d.ts.map +1 -0
  42. package/dist/mount.js +11 -0
  43. package/dist/mount.js.map +1 -0
  44. package/dist/reflection.d.ts +3 -3
  45. package/dist/reflection.d.ts.map +1 -1
  46. package/dist/reflection.js +5 -5
  47. package/dist/reflection.js.map +1 -1
  48. package/dist/server/context.d.ts +17 -1
  49. package/dist/server/context.d.ts.map +1 -1
  50. package/dist/server/server.d.ts +29 -2
  51. package/dist/server/server.d.ts.map +1 -1
  52. package/dist/server/server.js +189 -26
  53. package/dist/server/server.js.map +1 -1
  54. package/package.json +31 -1
  55. package/src/assurance.ts +33 -0
  56. package/src/capabilities.ts +60 -4
  57. package/src/causality.ts +550 -0
  58. package/src/classification.ts +145 -0
  59. package/src/errors.ts +1 -0
  60. package/src/idempotency.ts +245 -30
  61. package/src/index.ts +6 -1
  62. package/src/invariants.ts +604 -0
  63. package/src/ledger.ts +430 -0
  64. package/src/manifest.ts +543 -0
  65. package/src/mount.ts +24 -0
  66. package/src/reflection.ts +11 -7
  67. package/src/server/context.ts +20 -1
  68. package/src/server/server.ts +268 -31
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Framework-neutral execution causality.
3
+ *
4
+ * Traces describe one synchronous/remote observation tree. Causality survives the durable seams a
5
+ * trace cannot: a command commits an outbox event, a workflow resumes tomorrow, a projection
6
+ * consumes that event, and reconciliation repairs drift. This module carries only bounded identity
7
+ * tokens and links; payloads, tenant identifiers, request URLs, and arbitrary attributes cannot enter
8
+ * the graph by construction.
9
+ */
10
+ export class CausalityConflictError extends Error {
11
+ executionId;
12
+ node;
13
+ constructor(executionId, node) {
14
+ super(`causality conflict: ${node.kind}:${node.id} changed inside execution ${executionId}`);
15
+ this.executionId = executionId;
16
+ this.node = node;
17
+ this.name = "CausalityConflictError";
18
+ }
19
+ }
20
+ export class CausalityCapacityError extends Error {
21
+ maxRecords;
22
+ constructor(maxRecords) {
23
+ super(`causality store capacity exceeded (${maxRecords} records)`);
24
+ this.maxRecords = maxRecords;
25
+ this.name = "CausalityCapacityError";
26
+ }
27
+ }
28
+ export const CAUSALITY_EXECUTION_HEADER = "x-nifra-execution-id";
29
+ export const CAUSALITY_KIND_HEADER = "x-nifra-causality-kind";
30
+ export const CAUSALITY_NODE_HEADER = "x-nifra-causality-id";
31
+ export const CAUSALITY_TRACE_HEADER = "x-nifra-causality-trace";
32
+ const IDENTITY = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
33
+ const KIND = /^[a-z][a-z0-9._-]{0,63}$/;
34
+ const RELATION = /^[a-z][a-z0-9._-]{0,63}$/;
35
+ const TRACE_ID = /^[0-9a-f]{32}$/;
36
+ const SPAN_ID = /^[0-9a-f]{16}$/;
37
+ const MAX_PARENTS = 16;
38
+ const DEFAULT_TIMELINE_LIMIT = 100;
39
+ const MAX_TIMELINE_LIMIT = 500;
40
+ function identity(value, label) {
41
+ if (!IDENTITY.test(value)) {
42
+ throw new TypeError(`causality: ${label} must be a bounded identity token`);
43
+ }
44
+ return value;
45
+ }
46
+ function kind(value) {
47
+ if (!KIND.test(value))
48
+ throw new TypeError("causality: kind must be a bounded lowercase token");
49
+ return value;
50
+ }
51
+ function relation(value) {
52
+ if (!RELATION.test(value)) {
53
+ throw new TypeError("causality: relation must be a bounded lowercase token");
54
+ }
55
+ return value;
56
+ }
57
+ function timestamp(value) {
58
+ const at = value ?? Date.now();
59
+ if (!Number.isSafeInteger(at) || at < 0) {
60
+ throw new TypeError("causality: at must be a non-negative safe-integer epoch millisecond");
61
+ }
62
+ return at;
63
+ }
64
+ function trace(value) {
65
+ if (value === undefined)
66
+ return undefined;
67
+ if (!TRACE_ID.test(value.traceId) || !SPAN_ID.test(value.spanId)) {
68
+ throw new TypeError("causality: trace must contain lowercase W3C trace/span ids");
69
+ }
70
+ return Object.freeze({ traceId: value.traceId, spanId: value.spanId });
71
+ }
72
+ function ref(nodeKind, id) {
73
+ return Object.freeze({ kind: kind(nodeKind), id: identity(id, "node id") });
74
+ }
75
+ function recordOf(value) {
76
+ return value !== null && typeof value === "object" && !Array.isArray(value)
77
+ ? value
78
+ : undefined;
79
+ }
80
+ function onlyKeys(value, allowed) {
81
+ return Object.keys(value).every((key) => allowed.has(key));
82
+ }
83
+ function buildStep(executionId, current, parents, at, nodeTrace, propagatedTrace) {
84
+ const node = Object.freeze({
85
+ ...current,
86
+ at,
87
+ ...(nodeTrace === undefined ? {} : { trace: nodeTrace }),
88
+ });
89
+ const frozenParents = Object.freeze([...parents]);
90
+ const context = Object.freeze({
91
+ executionId,
92
+ current,
93
+ ...(propagatedTrace === undefined ? {} : { trace: propagatedTrace }),
94
+ });
95
+ const record = Object.freeze({ executionId, node, parents: frozenParents });
96
+ return Object.freeze({ context, record });
97
+ }
98
+ function normalizeRecord(input) {
99
+ const executionId = identity(input.executionId, "executionId");
100
+ if (input.parents.length > MAX_PARENTS) {
101
+ throw new RangeError(`causality: a record cannot have more than ${MAX_PARENTS} parents`);
102
+ }
103
+ const current = ref(input.node.kind, input.node.id);
104
+ const nodeTrace = trace(input.node.trace);
105
+ const parents = input.parents.map((parent) => Object.freeze({
106
+ ...ref(parent.kind, parent.id),
107
+ relation: relation(parent.relation),
108
+ }));
109
+ return Object.freeze({
110
+ executionId,
111
+ node: Object.freeze({
112
+ ...current,
113
+ at: timestamp(input.node.at),
114
+ ...(nodeTrace === undefined ? {} : { trace: nodeTrace }),
115
+ }),
116
+ parents: Object.freeze(parents),
117
+ });
118
+ }
119
+ /** Start a root execution node at an ingress boundary. */
120
+ export function startCausality(nodeKind, id, options) {
121
+ const executionId = identity(options.executionId, "executionId");
122
+ const current = ref(nodeKind, id);
123
+ const nodeTrace = trace(options.trace);
124
+ return buildStep(executionId, current, [], timestamp(options.at), nodeTrace, nodeTrace);
125
+ }
126
+ /** Continue one execution from a single immediate parent. */
127
+ export function continueCausality(parent, nodeKind, id, options = {}) {
128
+ return joinCausality([parent], nodeKind, id, options);
129
+ }
130
+ /** Join several immediate parents. Cross-execution joins fail closed. */
131
+ export function joinCausality(parents, nodeKind, id, options = {}) {
132
+ if (parents.length === 0 || parents.length > MAX_PARENTS) {
133
+ throw new RangeError(`causality: parents must contain 1 to ${MAX_PARENTS} contexts`);
134
+ }
135
+ const executionId = identity(parents[0]?.executionId ?? "", "executionId");
136
+ if (parents.some((parent) => parent.executionId !== executionId)) {
137
+ throw new Error("causality: joined parents must belong to the same execution");
138
+ }
139
+ const edgeRelation = relation(options.relation ?? "caused");
140
+ const seen = new Set();
141
+ const incoming = [];
142
+ for (const parent of parents) {
143
+ const parentRef = ref(parent.current.kind, parent.current.id);
144
+ const key = `${parentRef.kind}\n${parentRef.id}`;
145
+ if (seen.has(key))
146
+ continue;
147
+ seen.add(key);
148
+ incoming.push(Object.freeze({ ...parentRef, relation: edgeRelation }));
149
+ }
150
+ const current = ref(nodeKind, id);
151
+ const nodeTrace = trace(options.trace);
152
+ const propagatedTrace = nodeTrace ?? parents.find((parent) => parent.trace !== undefined)?.trace;
153
+ return buildStep(executionId, current, incoming, timestamp(options.at), nodeTrace, propagatedTrace);
154
+ }
155
+ const CONTEXT_FIELDS = new Set(["executionId", "current", "trace"]);
156
+ const REF_FIELDS = new Set(["kind", "id"]);
157
+ const TRACE_FIELDS = new Set(["traceId", "spanId"]);
158
+ const RECORD_FIELDS = new Set(["executionId", "node", "parents"]);
159
+ const NODE_FIELDS = new Set(["kind", "id", "at", "trace"]);
160
+ const PARENT_FIELDS = new Set(["kind", "id", "relation"]);
161
+ /** Parse an untrusted durable graph record. Unknown fields fail closed at every nesting level. */
162
+ export function parseCausalityRecord(input) {
163
+ const value = recordOf(input);
164
+ if (value === undefined)
165
+ return { success: false, reason: "invalid" };
166
+ if (!onlyKeys(value, RECORD_FIELDS))
167
+ return { success: false, reason: "unknown-field" };
168
+ const node = recordOf(value.node);
169
+ if (node === undefined || !Array.isArray(value.parents)) {
170
+ return { success: false, reason: "incomplete" };
171
+ }
172
+ if (!onlyKeys(node, NODE_FIELDS))
173
+ return { success: false, reason: "unknown-field" };
174
+ const nodeTrace = value.node !== undefined && node.trace !== undefined ? recordOf(node.trace) : undefined;
175
+ if (node.trace !== undefined && nodeTrace === undefined) {
176
+ return { success: false, reason: "invalid" };
177
+ }
178
+ if (nodeTrace !== undefined && !onlyKeys(nodeTrace, TRACE_FIELDS)) {
179
+ return { success: false, reason: "unknown-field" };
180
+ }
181
+ const parents = [];
182
+ for (const rawParent of value.parents) {
183
+ const parent = recordOf(rawParent);
184
+ if (parent === undefined)
185
+ return { success: false, reason: "invalid" };
186
+ if (!onlyKeys(parent, PARENT_FIELDS))
187
+ return { success: false, reason: "unknown-field" };
188
+ if (typeof parent.kind !== "string" ||
189
+ typeof parent.id !== "string" ||
190
+ typeof parent.relation !== "string") {
191
+ return { success: false, reason: "incomplete" };
192
+ }
193
+ parents.push({ kind: parent.kind, id: parent.id, relation: parent.relation });
194
+ }
195
+ if (typeof value.executionId !== "string" ||
196
+ typeof node.kind !== "string" ||
197
+ typeof node.id !== "string" ||
198
+ typeof node.at !== "number" ||
199
+ (nodeTrace !== undefined &&
200
+ (typeof nodeTrace.traceId !== "string" || typeof nodeTrace.spanId !== "string"))) {
201
+ return { success: false, reason: "incomplete" };
202
+ }
203
+ try {
204
+ return {
205
+ success: true,
206
+ record: normalizeRecord({
207
+ executionId: value.executionId,
208
+ node: {
209
+ kind: node.kind,
210
+ id: node.id,
211
+ at: node.at,
212
+ ...(nodeTrace === undefined
213
+ ? {}
214
+ : {
215
+ trace: { traceId: nodeTrace.traceId, spanId: nodeTrace.spanId },
216
+ }),
217
+ },
218
+ parents,
219
+ }),
220
+ };
221
+ }
222
+ catch {
223
+ return { success: false, reason: "invalid" };
224
+ }
225
+ }
226
+ /** Parse an untrusted JSON causality context. Unknown fields fail closed so payloads cannot hitchhike. */
227
+ export function parseCausalityContext(input) {
228
+ const value = recordOf(input);
229
+ if (value === undefined)
230
+ return { success: false, reason: "invalid" };
231
+ if (!onlyKeys(value, CONTEXT_FIELDS))
232
+ return { success: false, reason: "unknown-field" };
233
+ const current = recordOf(value.current);
234
+ if (current === undefined)
235
+ return { success: false, reason: "incomplete" };
236
+ if (!onlyKeys(current, REF_FIELDS))
237
+ return { success: false, reason: "unknown-field" };
238
+ const rawTrace = value.trace === undefined ? undefined : recordOf(value.trace);
239
+ if (value.trace !== undefined && rawTrace === undefined) {
240
+ return { success: false, reason: "invalid" };
241
+ }
242
+ if (rawTrace !== undefined && !onlyKeys(rawTrace, TRACE_FIELDS)) {
243
+ return { success: false, reason: "unknown-field" };
244
+ }
245
+ if (typeof value.executionId !== "string" ||
246
+ typeof current.kind !== "string" ||
247
+ typeof current.id !== "string" ||
248
+ (rawTrace !== undefined &&
249
+ (typeof rawTrace.traceId !== "string" || typeof rawTrace.spanId !== "string"))) {
250
+ return { success: false, reason: "incomplete" };
251
+ }
252
+ try {
253
+ const context = Object.freeze({
254
+ executionId: identity(value.executionId, "executionId"),
255
+ current: ref(current.kind, current.id),
256
+ ...(rawTrace === undefined
257
+ ? {}
258
+ : {
259
+ trace: trace({
260
+ traceId: rawTrace.traceId,
261
+ spanId: rawTrace.spanId,
262
+ }),
263
+ }),
264
+ });
265
+ return { success: true, context };
266
+ }
267
+ catch {
268
+ return { success: false, reason: "invalid" };
269
+ }
270
+ }
271
+ /** Serialize the propagation context into bounded HTTP headers. */
272
+ export function causalityHeaders(context) {
273
+ const parsed = parseCausalityContext(context);
274
+ if (!parsed.success)
275
+ throw new TypeError(`causality: invalid context (${parsed.reason})`);
276
+ return Object.freeze({
277
+ [CAUSALITY_EXECUTION_HEADER]: parsed.context.executionId,
278
+ [CAUSALITY_KIND_HEADER]: parsed.context.current.kind,
279
+ [CAUSALITY_NODE_HEADER]: parsed.context.current.id,
280
+ ...(parsed.context.trace === undefined
281
+ ? {}
282
+ : {
283
+ [CAUSALITY_TRACE_HEADER]: `${parsed.context.trace.traceId}-${parsed.context.trace.spanId}`,
284
+ }),
285
+ });
286
+ }
287
+ /** Parse the public header convention without ever throwing on hostile input. */
288
+ export function readCausalityHeaders(headers) {
289
+ const executionId = headers.get(CAUSALITY_EXECUTION_HEADER);
290
+ const nodeKind = headers.get(CAUSALITY_KIND_HEADER);
291
+ const nodeId = headers.get(CAUSALITY_NODE_HEADER);
292
+ const encodedTrace = headers.get(CAUSALITY_TRACE_HEADER);
293
+ if (executionId === null && nodeKind === null && nodeId === null && encodedTrace === null) {
294
+ return { success: false, reason: "missing" };
295
+ }
296
+ if (executionId === null || nodeKind === null || nodeId === null) {
297
+ return { success: false, reason: "incomplete" };
298
+ }
299
+ let decodedTrace;
300
+ if (encodedTrace !== null) {
301
+ const match = /^([0-9a-f]{32})-([0-9a-f]{16})$/.exec(encodedTrace);
302
+ if (match === null)
303
+ return { success: false, reason: "invalid" };
304
+ decodedTrace = { traceId: match[1], spanId: match[2] };
305
+ }
306
+ return parseCausalityContext({
307
+ executionId,
308
+ current: { kind: nodeKind, id: nodeId },
309
+ ...(decodedTrace === undefined ? {} : { trace: decodedTrace }),
310
+ });
311
+ }
312
+ const timelineCursor = (entry) => `${entry.record.node.at.toString(36)}:${entry.sequence.toString(36)}`;
313
+ function timelineLimit(value) {
314
+ const limit = value ?? DEFAULT_TIMELINE_LIMIT;
315
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_TIMELINE_LIMIT) {
316
+ throw new RangeError(`causality: timeline limit must be an integer from 1 to ${MAX_TIMELINE_LIMIT}`);
317
+ }
318
+ return limit;
319
+ }
320
+ /** Bounded dev/test graph store. Production callers should provide a durable adapter. */
321
+ export function createMemoryCausalityStore(options = {}) {
322
+ if (typeof process !== "undefined" &&
323
+ process.env.NODE_ENV === "production" &&
324
+ !options.allowInProduction) {
325
+ throw new Error("causality: the memory store is not durable; configure a production graph adapter");
326
+ }
327
+ const maxRecords = options.maxRecords ?? 10_000;
328
+ if (!Number.isSafeInteger(maxRecords) || maxRecords < 1) {
329
+ throw new RangeError("causality: maxRecords must be a positive safe integer");
330
+ }
331
+ const byNode = new Map();
332
+ const byExecution = new Map();
333
+ let sequence = 0;
334
+ return {
335
+ async record(input) {
336
+ const parsed = parseCausalityRecord(input);
337
+ if (!parsed.success)
338
+ throw new TypeError(`causality: invalid record (${parsed.reason})`);
339
+ const record = parsed.record;
340
+ const key = `${record.executionId}\n${record.node.kind}\n${record.node.id}`;
341
+ const canonical = JSON.stringify(record);
342
+ const prior = byNode.get(key);
343
+ if (prior !== undefined) {
344
+ if (prior.canonical !== canonical) {
345
+ throw new CausalityConflictError(record.executionId, record.node);
346
+ }
347
+ return "duplicate";
348
+ }
349
+ if (byNode.size >= maxRecords)
350
+ throw new CausalityCapacityError(maxRecords);
351
+ const entry = Object.freeze({ sequence: sequence++, canonical, record });
352
+ byNode.set(key, entry);
353
+ const execution = byExecution.get(record.executionId) ?? [];
354
+ execution.push(entry);
355
+ byExecution.set(record.executionId, execution);
356
+ return "inserted";
357
+ },
358
+ async timeline(rawExecutionId, query = {}) {
359
+ const executionId = identity(rawExecutionId, "executionId");
360
+ const limit = timelineLimit(query.limit);
361
+ const entries = [...(byExecution.get(executionId) ?? [])].sort((left, right) => left.record.node.at - right.record.node.at || left.sequence - right.sequence);
362
+ let start = 0;
363
+ if (query.after !== undefined) {
364
+ const index = entries.findIndex((entry) => timelineCursor(entry) === query.after);
365
+ if (index < 0)
366
+ throw new TypeError("causality: invalid timeline cursor");
367
+ start = index + 1;
368
+ }
369
+ const selected = entries.slice(start, start + limit);
370
+ const hasMore = start + selected.length < entries.length;
371
+ return Object.freeze({
372
+ items: Object.freeze(selected.map((entry) => Object.freeze({ cursor: timelineCursor(entry), record: entry.record }))),
373
+ ...(hasMore && selected.length > 0
374
+ ? { nextCursor: timelineCursor(selected[selected.length - 1]) }
375
+ : {}),
376
+ });
377
+ },
378
+ };
379
+ }
380
+ //# sourceMappingURL=causality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causality.js","sourceRoot":"","sources":["../src/causality.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,15 @@
8
8
  */
9
9
  /** Sensitivity of the data a response carries. Ordered `public` < `pii` < `secret`. */
10
10
  export type DataClassification = "public" | "pii" | "secret";
11
+ /** Field paths use JSON Pointer segments; array items use a `*` segment. */
12
+ export interface ResponseClassification {
13
+ readonly fields: Readonly<Record<string, DataClassification>>;
14
+ readonly max: DataClassification;
15
+ }
16
+ declare const CLASSIFICATION: unique symbol;
17
+ export type ClassifiedSchema<S extends object> = S & {
18
+ readonly [CLASSIFICATION]: DataClassification;
19
+ };
11
20
  /** Total order over classifications; higher = more sensitive. */
12
21
  export declare const DATA_CLASSIFICATION_RANK: Readonly<Record<DataClassification, number>>;
13
22
  /** Whether `value` is a known classification token. */
@@ -16,4 +25,15 @@ export declare function isDataClassification(value: unknown): value is DataClass
16
25
  export declare function maxClassification(values: Iterable<DataClassification>): DataClassification;
17
26
  /** True when `value` is at least as sensitive as `floor` (e.g. `classificationAtLeast(x, "pii")`). */
18
27
  export declare function classificationAtLeast(value: DataClassification, floor: DataClassification): boolean;
28
+ /**
29
+ * Attach data-classification metadata without changing validation or inferred input/output types.
30
+ * For Nifra/TypeBox carriers the raw JSON Schema node is tagged too, so metadata survives composition
31
+ * through `t.object`, `t.array`, `t.optional`, and unions.
32
+ */
33
+ export declare function classified<S extends object>(schema: S, classification: DataClassification): ClassifiedSchema<S>;
34
+ /** Read field-level metadata from an introspectable response schema. Never invokes its validator. */
35
+ export declare function reflectClassification(schema: unknown): ResponseClassification | undefined;
36
+ /** Merge field metadata with an optional route-level sensitivity fallback. */
37
+ export declare function routeClassification(responseSchema: unknown, fallback: DataClassification | undefined): ResponseClassification | undefined;
38
+ export {};
19
39
  //# sourceMappingURL=classification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../src/classification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uFAAuF;AACvF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE5D,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAMjF,CAAA;AAID,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAM1F;AAED,sGAAsG;AACtG,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAET"}
1
+ {"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../src/classification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uFAAuF;AACvF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE5D,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAC7D,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAA;CACjC;AAED,QAAA,MAAM,cAAc,eAA0C,CAAA;AAQ9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;IACnD,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAA;CAC9C,CAAA;AAED,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAMjF,CAAA;AAID,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAM1F;AAED,sGAAsG;AACtG,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAET;AAuBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,MAAM,EAAE,CAAC,EACT,cAAc,EAAE,kBAAkB,GACjC,gBAAgB,CAAC,CAAC,CAAC,CAerB;AAiBD,qGAAqG;AACrG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS,CA+CzF;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GACvC,sBAAsB,GAAG,SAAS,CAUpC"}
@@ -6,6 +6,8 @@
6
6
  * learns which routes emit regulated data, and the capability lockfile records it so a route that
7
7
  * *starts* returning PII flips the lockfile and forces a review.
8
8
  */
9
+ const CLASSIFICATION = Symbol.for("nifra.data-classification");
10
+ const JSON_SCHEMA_CLASSIFICATION = "x-nifra-classification";
9
11
  /** Total order over classifications; higher = more sensitive. */
10
12
  export const DATA_CLASSIFICATION_RANK = Object.freeze({
11
13
  public: 0,
@@ -30,4 +32,122 @@ export function maxClassification(values) {
30
32
  export function classificationAtLeast(value, floor) {
31
33
  return DATA_CLASSIFICATION_RANK[value] >= DATA_CLASSIFICATION_RANK[floor];
32
34
  }
35
+ function cloneObject(value) {
36
+ return Object.create(Object.getPrototypeOf(value), Object.getOwnPropertyDescriptors(value));
37
+ }
38
+ function tagObject(value, classification) {
39
+ const clone = cloneObject(value);
40
+ Object.defineProperty(clone, CLASSIFICATION, {
41
+ configurable: false,
42
+ enumerable: true,
43
+ value: classification,
44
+ writable: false,
45
+ });
46
+ Object.defineProperty(clone, JSON_SCHEMA_CLASSIFICATION, {
47
+ configurable: true,
48
+ enumerable: true,
49
+ value: classification,
50
+ writable: true,
51
+ });
52
+ return clone;
53
+ }
54
+ /**
55
+ * Attach data-classification metadata without changing validation or inferred input/output types.
56
+ * For Nifra/TypeBox carriers the raw JSON Schema node is tagged too, so metadata survives composition
57
+ * through `t.object`, `t.array`, `t.optional`, and unions.
58
+ */
59
+ export function classified(schema, classification) {
60
+ if (!isDataClassification(classification)) {
61
+ throw new TypeError(`classification: invalid tag ${JSON.stringify(classification)}`);
62
+ }
63
+ const clone = tagObject(schema, classification);
64
+ const raw = schema.jsonSchema;
65
+ if (raw !== null && typeof raw === "object") {
66
+ Object.defineProperty(clone, "jsonSchema", {
67
+ configurable: true,
68
+ enumerable: true,
69
+ value: tagObject(raw, classification),
70
+ writable: false,
71
+ });
72
+ }
73
+ return clone;
74
+ }
75
+ const recordOf = (value) => value !== null && typeof value === "object"
76
+ ? value
77
+ : undefined;
78
+ const classificationOf = (value) => {
79
+ const record = recordOf(value);
80
+ const symbolValue = value?.[CLASSIFICATION];
81
+ if (isDataClassification(symbolValue))
82
+ return symbolValue;
83
+ const extension = record?.[JSON_SCHEMA_CLASSIFICATION];
84
+ return isDataClassification(extension) ? extension : undefined;
85
+ };
86
+ const pointerSegment = (value) => value.replaceAll("~", "~0").replaceAll("/", "~1");
87
+ /** Read field-level metadata from an introspectable response schema. Never invokes its validator. */
88
+ export function reflectClassification(schema) {
89
+ const carrier = recordOf(schema);
90
+ const raw = carrier !== undefined && "jsonSchema" in carrier ? carrier.jsonSchema : schema;
91
+ const fields = {};
92
+ const seen = new Set();
93
+ const all = [];
94
+ const record = (path, value) => {
95
+ const key = path === "" ? "$" : path;
96
+ const previous = fields[key];
97
+ fields[key] = previous === undefined ? value : maxClassification([previous, value]);
98
+ all.push(value);
99
+ };
100
+ const visit = (value, path) => {
101
+ const object = recordOf(value);
102
+ if (object === undefined)
103
+ return;
104
+ if (seen.has(object))
105
+ return;
106
+ seen.add(object);
107
+ const own = classificationOf(value);
108
+ if (own !== undefined)
109
+ record(path, own);
110
+ const properties = recordOf(object.properties);
111
+ if (properties !== undefined) {
112
+ for (const [name, child] of Object.entries(properties)) {
113
+ visit(child, `${path}/${pointerSegment(name)}`);
114
+ }
115
+ }
116
+ if (object.items !== undefined)
117
+ visit(object.items, `${path}/*`);
118
+ if (Array.isArray(object.prefixItems)) {
119
+ for (const [index, child] of object.prefixItems.entries())
120
+ visit(child, `${path}/${index}`);
121
+ }
122
+ if (object.additionalProperties !== undefined && object.additionalProperties !== false) {
123
+ visit(object.additionalProperties, `${path}/*`);
124
+ }
125
+ for (const key of ["allOf", "anyOf", "oneOf"]) {
126
+ const variants = object[key];
127
+ if (Array.isArray(variants))
128
+ for (const child of variants)
129
+ visit(child, path);
130
+ }
131
+ };
132
+ visit(raw, "");
133
+ // A validation-only carrier can still carry a root tag even when it has no JSON Schema metadata.
134
+ const carrierTag = classificationOf(schema);
135
+ if (carrierTag !== undefined && all.length === 0)
136
+ record("", carrierTag);
137
+ if (all.length === 0)
138
+ return undefined;
139
+ return Object.freeze({ fields: Object.freeze(fields), max: maxClassification(all) });
140
+ }
141
+ /** Merge field metadata with an optional route-level sensitivity fallback. */
142
+ export function routeClassification(responseSchema, fallback) {
143
+ const reflected = reflectClassification(responseSchema);
144
+ if (reflected === undefined && fallback === undefined)
145
+ return undefined;
146
+ return Object.freeze({
147
+ fields: reflected?.fields ?? Object.freeze({}),
148
+ max: fallback === undefined
149
+ ? reflected.max
150
+ : maxClassification([fallback, ...(reflected === undefined ? [] : [reflected.max])]),
151
+ });
152
+ }
33
153
  //# sourceMappingURL=classification.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"classification.js","sourceRoot":"","sources":["../src/classification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,iEAAiE;AACjE,MAAM,CAAC,MAAM,wBAAwB,GAAiD,MAAM,CAAC,MAAM,CACjG;IACE,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;CACV,CACF,CAAA;AAED,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAkC,CAAA;AAE9F,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC5F,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,MAAoC;IACpE,IAAI,GAAG,GAAuB,QAAQ,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,wBAAwB,CAAC,KAAK,CAAC,GAAG,wBAAwB,CAAC,GAAG,CAAC;YAAE,GAAG,GAAG,KAAK,CAAA;IAClF,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,qBAAqB,CACnC,KAAyB,EACzB,KAAyB;IAEzB,OAAO,wBAAwB,CAAC,KAAK,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"classification.js","sourceRoot":"","sources":["../src/classification.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare class FrameworkError extends Error {
8
8
  constructor(code: string, message: string);
9
9
  }
10
10
  /** Stable codes for boot-time (L2) route configuration failures. */
11
- export type RouteConfigErrorCode = "DUPLICATE_ROUTE" | "DUPLICATE_PARAM" | "PARAM_NAME_CONFLICT" | "INVALID_PATH" | "INVALID_PARAM_NAME" | "WILDCARD_NOT_LAST" | "INVALID_METHOD" | "INVALID_ASSURANCE";
11
+ export type RouteConfigErrorCode = "DUPLICATE_ROUTE" | "DUPLICATE_PARAM" | "PARAM_NAME_CONFLICT" | "INVALID_PATH" | "INVALID_PARAM_NAME" | "WILDCARD_NOT_LAST" | "INVALID_METHOD" | "INVALID_ASSURANCE" | "INVALID_IDEMPOTENCY";
12
12
  /**
13
13
  * Thrown at route registration when a route is misconfigured. This is the
14
14
  * boot-time rejection layer: loud and early,
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAET,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,CAAA;AAEvB;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAElD,SAAiB,IAAI,EAAE,oBAAoB,CAAA;gBAE/B,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAIxD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAET,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,CAAA;AAEzB;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAElD,SAAiB,IAAI,EAAE,oBAAoB,CAAA;gBAE/B,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAIxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAQ;IAErB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAaD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAIlD,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAQ;IAErB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAcD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAIlD,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF"}