@fabricorg/platform 0.1.2 → 0.2.1

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 (70) hide show
  1. package/README.md +105 -61
  2. package/dist/actions/index.cjs +48 -0
  3. package/dist/actions/index.cjs.map +1 -0
  4. package/dist/actions/index.d.cts +116 -0
  5. package/dist/adapters/index.cjs +28 -0
  6. package/dist/adapters/index.cjs.map +1 -0
  7. package/dist/adapters/index.d.cts +83 -0
  8. package/dist/chunk-7KJHGAZY.cjs +99 -0
  9. package/dist/chunk-7KJHGAZY.cjs.map +1 -0
  10. package/dist/chunk-GB2PSZ33.cjs +74 -0
  11. package/dist/chunk-GB2PSZ33.cjs.map +1 -0
  12. package/dist/chunk-JAXDEK5Z.cjs +63 -0
  13. package/dist/chunk-JAXDEK5Z.cjs.map +1 -0
  14. package/dist/chunk-KQEBNUZI.cjs +70 -0
  15. package/dist/chunk-KQEBNUZI.cjs.map +1 -0
  16. package/dist/chunk-LHCSVEFT.cjs +8 -0
  17. package/dist/chunk-LHCSVEFT.cjs.map +1 -0
  18. package/dist/chunk-LYX73U3P.cjs +195 -0
  19. package/dist/chunk-LYX73U3P.cjs.map +1 -0
  20. package/dist/chunk-LZSE6QGQ.cjs +60 -0
  21. package/dist/chunk-LZSE6QGQ.cjs.map +1 -0
  22. package/dist/chunk-NPVIFZQV.cjs +107 -0
  23. package/dist/chunk-NPVIFZQV.cjs.map +1 -0
  24. package/dist/chunk-PG5LYTUX.cjs +4 -0
  25. package/dist/chunk-PG5LYTUX.cjs.map +1 -0
  26. package/dist/chunk-Q3WYIWCN.cjs +183 -0
  27. package/dist/chunk-Q3WYIWCN.cjs.map +1 -0
  28. package/dist/chunk-QETQGAXJ.cjs +35 -0
  29. package/dist/chunk-QETQGAXJ.cjs.map +1 -0
  30. package/dist/chunk-SDXDHVTV.cjs +555 -0
  31. package/dist/chunk-SDXDHVTV.cjs.map +1 -0
  32. package/dist/chunk-YZKUEC2J.cjs +31 -0
  33. package/dist/chunk-YZKUEC2J.cjs.map +1 -0
  34. package/dist/displays/index.cjs +24 -0
  35. package/dist/displays/index.cjs.map +1 -0
  36. package/dist/displays/index.d.cts +34 -0
  37. package/dist/events/index.cjs +36 -0
  38. package/dist/events/index.cjs.map +1 -0
  39. package/dist/events/index.d.cts +35 -0
  40. package/dist/evidence/index.cjs +6 -0
  41. package/dist/evidence/index.cjs.map +1 -0
  42. package/dist/evidence/index.d.cts +43 -0
  43. package/dist/ids/index.cjs +24 -0
  44. package/dist/ids/index.cjs.map +1 -0
  45. package/dist/ids/index.d.cts +19 -0
  46. package/dist/index.cjs +268 -0
  47. package/dist/index.cjs.map +1 -0
  48. package/dist/index.d.cts +13 -0
  49. package/dist/modules/index.cjs +42 -0
  50. package/dist/modules/index.cjs.map +1 -0
  51. package/dist/modules/index.d.cts +73 -0
  52. package/dist/objects/index.cjs +24 -0
  53. package/dist/objects/index.cjs.map +1 -0
  54. package/dist/objects/index.d.cts +7 -0
  55. package/dist/policies/index.cjs +48 -0
  56. package/dist/policies/index.cjs.map +1 -0
  57. package/dist/policies/index.d.cts +143 -0
  58. package/dist/privacy/index.cjs +12 -0
  59. package/dist/privacy/index.cjs.map +1 -0
  60. package/dist/privacy/index.d.cts +77 -0
  61. package/dist/projections/index.cjs +12 -0
  62. package/dist/projections/index.cjs.map +1 -0
  63. package/dist/projections/index.d.cts +52 -0
  64. package/dist/state-machines/index.cjs +32 -0
  65. package/dist/state-machines/index.cjs.map +1 -0
  66. package/dist/state-machines/index.d.cts +60 -0
  67. package/dist/testing/index.cjs +21 -0
  68. package/dist/testing/index.cjs.map +1 -0
  69. package/dist/testing/index.d.cts +19 -0
  70. package/package.json +196 -111
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ // state-machines/engine.ts
4
+ var registry = /* @__PURE__ */ new Map();
5
+ function registerStateMachine(def) {
6
+ if (registry.has(def.entityType)) {
7
+ throw new Error(`State machine for entity type "${def.entityType}" is already registered.`);
8
+ }
9
+ registry.set(def.entityType, def);
10
+ }
11
+ function registerStateMachineIfMissing(def) {
12
+ if (!registry.has(def.entityType)) {
13
+ registerStateMachine(def);
14
+ }
15
+ }
16
+ function resolveStateMachine(entityType) {
17
+ return registry.get(entityType);
18
+ }
19
+ function validateTransition(entityType, from, to, actionId) {
20
+ const sm = registry.get(entityType);
21
+ if (!sm) {
22
+ return {
23
+ valid: false,
24
+ error: `No state machine registered for entity type "${entityType}".`
25
+ };
26
+ }
27
+ const fromDef = sm.states[from];
28
+ if (!fromDef) {
29
+ return {
30
+ valid: false,
31
+ error: `State "${from}" does not exist in state machine for entity type "${entityType}".`
32
+ };
33
+ }
34
+ const toDef = sm.states[to];
35
+ if (!toDef) {
36
+ return {
37
+ valid: false,
38
+ error: `State "${to}" does not exist in state machine for entity type "${entityType}".`
39
+ };
40
+ }
41
+ const transitionExists = sm.transitions.some(
42
+ (t) => t.from === from && t.to === to && t.causedByAction === actionId
43
+ );
44
+ if (!transitionExists) {
45
+ return {
46
+ valid: false,
47
+ error: `Transition from "${from}" to "${to}" via action "${actionId}" is not defined for entity type "${entityType}".`
48
+ };
49
+ }
50
+ return { valid: true };
51
+ }
52
+ function getAllowedTransitions(entityType, from) {
53
+ const sm = registry.get(entityType);
54
+ if (!sm) {
55
+ return [];
56
+ }
57
+ return sm.transitions.filter((t) => t.from === from).map((t) => ({ to: t.to, causedByAction: t.causedByAction }));
58
+ }
59
+ function getEntityStateClass(entityType, state) {
60
+ const sm = registry.get(entityType);
61
+ if (!sm) {
62
+ return void 0;
63
+ }
64
+ return sm.states[state]?.stateClass;
65
+ }
66
+
67
+ exports.getAllowedTransitions = getAllowedTransitions;
68
+ exports.getEntityStateClass = getEntityStateClass;
69
+ exports.registerStateMachine = registerStateMachine;
70
+ exports.registerStateMachineIfMissing = registerStateMachineIfMissing;
71
+ exports.resolveStateMachine = resolveStateMachine;
72
+ exports.validateTransition = validateTransition;
73
+ //# sourceMappingURL=chunk-GB2PSZ33.cjs.map
74
+ //# sourceMappingURL=chunk-GB2PSZ33.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../state-machines/engine.ts"],"names":[],"mappings":"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","file":"chunk-GB2PSZ33.cjs","sourcesContent":["import type { StateClass, StateDefinition } from \"./index\";\n\nexport interface StateMachineDefinition {\n\tentityType: string;\n\tstates: Record<string, StateDefinition>;\n\ttransitions: Array<{\n\t\tfrom: string;\n\t\tto: string;\n\t\tcausedByAction: string;\n\t\tguard?: (ctx: TransitionContext) => boolean | Promise<boolean>;\n\t}>;\n}\n\nexport type StateMachineDatabaseClient = any;\n\nexport interface TransitionContext<TDb = StateMachineDatabaseClient> {\n\tentity: Record<string, unknown>;\n\tactionInvocationId: string;\n\tactorId: string;\n\tparameters: unknown;\n\tdb: TDb;\n}\n\nconst registry = new Map<string, StateMachineDefinition>();\n\n/**\n * Register a state-machine definition for an entity type.\n * Throws if a definition for this entity type is already registered.\n */\nexport function registerStateMachine(def: StateMachineDefinition): void {\n\tif (registry.has(def.entityType)) {\n\t\tthrow new Error(`State machine for entity type \"${def.entityType}\" is already registered.`);\n\t}\n\tregistry.set(def.entityType, def);\n}\n\n/**\n * Register a state-machine definition only if one for this entity type\n * is not already registered. Idempotent — safe to call multiple times.\n */\nexport function registerStateMachineIfMissing(def: StateMachineDefinition): void {\n\tif (!registry.has(def.entityType)) {\n\t\tregisterStateMachine(def);\n\t}\n}\n\n/**\n * Resolve a previously registered state-machine definition by entity type.\n */\nexport function resolveStateMachine(entityType: string): StateMachineDefinition | undefined {\n\treturn registry.get(entityType);\n}\n\n/**\n * Validate whether a transition is allowed for the given entity type,\n * from state, to state, and action ID.\n */\nexport function validateTransition(\n\tentityType: string,\n\tfrom: string,\n\tto: string,\n\tactionId: string,\n): { valid: boolean; error?: string } {\n\tconst sm = registry.get(entityType);\n\tif (!sm) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: `No state machine registered for entity type \"${entityType}\".`,\n\t\t};\n\t}\n\n\tconst fromDef = sm.states[from];\n\tif (!fromDef) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: `State \"${from}\" does not exist in state machine for entity type \"${entityType}\".`,\n\t\t};\n\t}\n\n\tconst toDef = sm.states[to];\n\tif (!toDef) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: `State \"${to}\" does not exist in state machine for entity type \"${entityType}\".`,\n\t\t};\n\t}\n\n\tconst transitionExists = sm.transitions.some(\n\t\t(t) => t.from === from && t.to === to && t.causedByAction === actionId,\n\t);\n\tif (!transitionExists) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: `Transition from \"${from}\" to \"${to}\" via action \"${actionId}\" is not defined for entity type \"${entityType}\".`,\n\t\t};\n\t}\n\n\treturn { valid: true };\n}\n\n/**\n * Get all allowed transitions from a given state for an entity type.\n */\nexport function getAllowedTransitions(\n\tentityType: string,\n\tfrom: string,\n): Array<{ to: string; causedByAction: string }> {\n\tconst sm = registry.get(entityType);\n\tif (!sm) {\n\t\treturn [];\n\t}\n\treturn sm.transitions\n\t\t.filter((t) => t.from === from)\n\t\t.map((t) => ({ to: t.to, causedByAction: t.causedByAction }));\n}\n\n/**\n * Get the StateClass of a given state for an entity type.\n */\nexport function getEntityStateClass(entityType: string, state: string): StateClass | undefined {\n\tconst sm = registry.get(entityType);\n\tif (!sm) {\n\t\treturn undefined;\n\t}\n\treturn sm.states[state]?.stateClass;\n}\n"]}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ // events/index.ts
4
+ var subjectTypeRegistry = /* @__PURE__ */ new Set([
5
+ "ActionInvocation",
6
+ "PolicyEvaluation",
7
+ "AdapterInvocation"
8
+ ]);
9
+ var eventTypeRegistry = /* @__PURE__ */ new Set([
10
+ "ComplianceBlocked",
11
+ "StateTransitioned",
12
+ "AdapterInvocationStarted",
13
+ "AdapterInvocationSucceeded",
14
+ "AdapterInvocationFailed",
15
+ "WebhookReceived"
16
+ ]);
17
+ var dynamicSubjectTypes = /* @__PURE__ */ new Set();
18
+ var dynamicEventTypes = /* @__PURE__ */ new Set();
19
+ function registerSubjectType(type) {
20
+ dynamicSubjectTypes.add(type);
21
+ }
22
+ function isValidSubjectType(type) {
23
+ return subjectTypeRegistry.has(type) || dynamicSubjectTypes.has(type);
24
+ }
25
+ function getRegisteredSubjectTypes() {
26
+ return Array.from(/* @__PURE__ */ new Set([...subjectTypeRegistry, ...dynamicSubjectTypes]));
27
+ }
28
+ function registerEventType(type) {
29
+ dynamicEventTypes.add(type);
30
+ }
31
+ function isValidEventType(type) {
32
+ return eventTypeRegistry.has(type) || dynamicEventTypes.has(type);
33
+ }
34
+ function getRegisteredEventTypes() {
35
+ return Array.from(/* @__PURE__ */ new Set([...eventTypeRegistry, ...dynamicEventTypes]));
36
+ }
37
+ function createEventTypeRegistry(initialEventTypes = []) {
38
+ const eventTypes = new Set(initialEventTypes);
39
+ return {
40
+ register(eventType) {
41
+ if (!eventType) {
42
+ throw new Error("Event type cannot be empty");
43
+ }
44
+ eventTypes.add(eventType);
45
+ },
46
+ has(eventType) {
47
+ return eventTypes.has(eventType);
48
+ },
49
+ list() {
50
+ return Array.from(eventTypes).sort();
51
+ }
52
+ };
53
+ }
54
+
55
+ exports.createEventTypeRegistry = createEventTypeRegistry;
56
+ exports.getRegisteredEventTypes = getRegisteredEventTypes;
57
+ exports.getRegisteredSubjectTypes = getRegisteredSubjectTypes;
58
+ exports.isValidEventType = isValidEventType;
59
+ exports.isValidSubjectType = isValidSubjectType;
60
+ exports.registerEventType = registerEventType;
61
+ exports.registerSubjectType = registerSubjectType;
62
+ //# sourceMappingURL=chunk-JAXDEK5Z.cjs.map
63
+ //# sourceMappingURL=chunk-JAXDEK5Z.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../events/index.ts"],"names":[],"mappings":";;;AAmBA,IAAM,mBAAA,uBAA0B,GAAA,CAAY;AAAA,EAC3C,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACD,CAAC,CAAA;AAED,IAAM,iBAAA,uBAAwB,GAAA,CAAY;AAAA,EACzC,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,0BAAA;AAAA,EACA,4BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACD,CAAC,CAAA;AAED,IAAM,mBAAA,uBAA0B,GAAA,EAAY;AAC5C,IAAM,iBAAA,uBAAwB,GAAA,EAAY;AAMnC,SAAS,oBAAoB,IAAA,EAAoB;AACvD,EAAA,mBAAA,CAAoB,IAAI,IAAI,CAAA;AAC7B;AAEO,SAAS,mBAAmB,IAAA,EAAuB;AACzD,EAAA,OAAO,oBAAoB,GAAA,CAAI,IAAI,CAAA,IAAK,mBAAA,CAAoB,IAAI,IAAI,CAAA;AACrE;AAEO,SAAS,yBAAA,GAAsC;AACrD,EAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,mBAAA,EAAqB,GAAG,mBAAmB,CAAC,CAAC,CAAA;AAC5E;AAEO,SAAS,kBAAkB,IAAA,EAAoB;AACrD,EAAA,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAC3B;AAEO,SAAS,iBAAiB,IAAA,EAAuB;AACvD,EAAA,OAAO,kBAAkB,GAAA,CAAI,IAAI,CAAA,IAAK,iBAAA,CAAkB,IAAI,IAAI,CAAA;AACjE;AAEO,SAAS,uBAAA,GAAoC;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,iBAAA,EAAmB,GAAG,iBAAiB,CAAC,CAAC,CAAA;AACxE;AAQO,SAAS,uBAAA,CAAwB,iBAAA,GAA8B,EAAC,EAAsB;AAC5F,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,iBAAiB,CAAA;AAC5C,EAAA,OAAO;AAAA,IACN,SAAS,SAAA,EAAW;AACnB,MAAA,IAAI,CAAC,SAAA,EAAW;AACf,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC7C;AACA,MAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,IAAI,SAAA,EAAW;AACd,MAAA,OAAO,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,IAAA,GAAO;AACN,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,EAAK;AAAA,IACpC;AAAA,GACD;AACD","file":"chunk-JAXDEK5Z.cjs","sourcesContent":["export interface AssetEventEnvelope<TPayload = unknown> {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\teventSchemaVersion: number;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactorId: string;\n\tactorType: string;\n\tactionInvocationId?: string;\n\tpayload: TPayload;\n\tsequence: number;\n\toccurredAt: Date;\n\trecordedAt: Date;\n\tcorrelationId: string;\n\tcausationId?: string;\n}\n\nconst subjectTypeRegistry = new Set<string>([\n\t\"ActionInvocation\",\n\t\"PolicyEvaluation\",\n\t\"AdapterInvocation\",\n]);\n\nconst eventTypeRegistry = new Set<string>([\n\t\"ComplianceBlocked\",\n\t\"StateTransitioned\",\n\t\"AdapterInvocationStarted\",\n\t\"AdapterInvocationSucceeded\",\n\t\"AdapterInvocationFailed\",\n\t\"WebhookReceived\",\n]);\n\nconst dynamicSubjectTypes = new Set<string>();\nconst dynamicEventTypes = new Set<string>();\n\nexport type AssetEventSubjectType = string;\nexport type AssetEventType = string;\nexport type AssetEventActorType = \"natural_person\" | \"agent\" | \"adapter\" | \"system\" | \"service_account\" | \"external_system\" | \"integration\";\n\nexport function registerSubjectType(type: string): void {\n\tdynamicSubjectTypes.add(type);\n}\n\nexport function isValidSubjectType(type: string): boolean {\n\treturn subjectTypeRegistry.has(type) || dynamicSubjectTypes.has(type);\n}\n\nexport function getRegisteredSubjectTypes(): string[] {\n\treturn Array.from(new Set([...subjectTypeRegistry, ...dynamicSubjectTypes]));\n}\n\nexport function registerEventType(type: string): void {\n\tdynamicEventTypes.add(type);\n}\n\nexport function isValidEventType(type: string): boolean {\n\treturn eventTypeRegistry.has(type) || dynamicEventTypes.has(type);\n}\n\nexport function getRegisteredEventTypes(): string[] {\n\treturn Array.from(new Set([...eventTypeRegistry, ...dynamicEventTypes]));\n}\n\nexport interface EventTypeRegistry {\n\tregister(eventType: string): void;\n\thas(eventType: string): boolean;\n\tlist(): string[];\n}\n\nexport function createEventTypeRegistry(initialEventTypes: string[] = []): EventTypeRegistry {\n\tconst eventTypes = new Set(initialEventTypes);\n\treturn {\n\t\tregister(eventType) {\n\t\t\tif (!eventType) {\n\t\t\t\tthrow new Error(\"Event type cannot be empty\");\n\t\t\t}\n\t\t\teventTypes.add(eventType);\n\t\t},\n\t\thas(eventType) {\n\t\t\treturn eventTypes.has(eventType);\n\t\t},\n\t\tlist() {\n\t\t\treturn Array.from(eventTypes).sort();\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ // actions/index.ts
4
+ var ACTOR_TYPES = [
5
+ "natural_person",
6
+ "agent",
7
+ "system",
8
+ "service_account",
9
+ "external_system",
10
+ "integration"
11
+ ];
12
+ function isActorType(value) {
13
+ return ACTOR_TYPES.includes(value);
14
+ }
15
+ function assertActorType(value) {
16
+ if (!isActorType(value)) {
17
+ throw new Error(`Invalid actorType: ${value}`);
18
+ }
19
+ }
20
+ var registry = /* @__PURE__ */ new Map();
21
+ function assertActionId(actionId) {
22
+ if (!/^[a-z][a-z0-9-]*\.[a-z][a-z0-9_]*$/.test(actionId)) {
23
+ throw new Error(`Invalid action ID: ${actionId}`);
24
+ }
25
+ }
26
+ function registerAction(definition) {
27
+ assertActionId(definition.actionId);
28
+ if (registry.has(definition.actionId)) {
29
+ throw new Error(`Action "${definition.actionId}" is already registered`);
30
+ }
31
+ if (definition.mutatesDomain && definition.emitsEvents.length === 0) {
32
+ throw new Error(
33
+ `Action "${definition.actionId}" mutates domain but emits no events. Every mutating action must emit at least one AssetEvent.`
34
+ );
35
+ }
36
+ registry.set(definition.actionId, definition);
37
+ }
38
+ function resolveAction(actionId) {
39
+ return registry.get(actionId);
40
+ }
41
+ function isRegisteredActionId(actionId) {
42
+ return registry.has(actionId);
43
+ }
44
+ function resolveRegisteredAction(actionId) {
45
+ if (!isRegisteredActionId(actionId)) {
46
+ return void 0;
47
+ }
48
+ return resolveAction(actionId);
49
+ }
50
+ function getRegisteredActionIds() {
51
+ return Array.from(registry.keys());
52
+ }
53
+ function registerActionIfMissing(definition) {
54
+ if (!registry.has(definition.actionId)) {
55
+ registerAction(definition);
56
+ }
57
+ }
58
+
59
+ exports.ACTOR_TYPES = ACTOR_TYPES;
60
+ exports.assertActionId = assertActionId;
61
+ exports.assertActorType = assertActorType;
62
+ exports.getRegisteredActionIds = getRegisteredActionIds;
63
+ exports.isActorType = isActorType;
64
+ exports.isRegisteredActionId = isRegisteredActionId;
65
+ exports.registerAction = registerAction;
66
+ exports.registerActionIfMissing = registerActionIfMissing;
67
+ exports.resolveAction = resolveAction;
68
+ exports.resolveRegisteredAction = resolveRegisteredAction;
69
+ //# sourceMappingURL=chunk-KQEBNUZI.cjs.map
70
+ //# sourceMappingURL=chunk-KQEBNUZI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../actions/index.ts"],"names":[],"mappings":";;;AAwBO,IAAM,WAAA,GAAoC;AAAA,EAChD,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACD;AAEO,SAAS,YAAY,KAAA,EAAmC;AAC9D,EAAA,OAAQ,WAAA,CAAkC,SAAS,KAAK,CAAA;AACzD;AAEO,SAAS,gBAAgB,KAAA,EAA2C;AAC1E,EAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9C;AACD;AAsHA,IAAM,QAAA,uBAAe,GAAA,EAAgC;AAE9C,SAAS,eAAe,QAAA,EAAgD;AAC9E,EAAA,IAAI,CAAC,oCAAA,CAAqC,IAAA,CAAK,QAAQ,CAAA,EAAG;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAAA,EACjD;AACD;AAEO,SAAS,eAAe,UAAA,EAAoC;AAClE,EAAA,cAAA,CAAe,WAAW,QAAQ,CAAA;AAElC,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,UAAA,CAAW,QAAQ,CAAA,uBAAA,CAAyB,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,UAAA,CAAW,aAAA,IAAiB,UAAA,CAAW,WAAA,CAAY,WAAW,CAAA,EAAG;AACpE,IAAA,MAAM,IAAI,KAAA;AAAA,MACT,CAAA,QAAA,EAAW,WAAW,QAAQ,CAAA,8FAAA;AAAA,KAE/B;AAAA,EACD;AAEA,EAAA,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,QAAA,EAAU,UAAU,CAAA;AAC7C;AAEO,SAAS,cAAc,QAAA,EAAkD;AAC/E,EAAA,OAAO,QAAA,CAAS,IAAI,QAAQ,CAAA;AAC7B;AAEO,SAAS,qBAAqB,QAAA,EAAwC;AAC5E,EAAA,OAAO,QAAA,CAAS,IAAI,QAAoB,CAAA;AACzC;AAEO,SAAS,wBAAwB,QAAA,EAAgD;AACvF,EAAA,IAAI,CAAC,oBAAA,CAAqB,QAAQ,CAAA,EAAG;AACpC,IAAA,OAAO,MAAA;AAAA,EACR;AAEA,EAAA,OAAO,cAAc,QAAQ,CAAA;AAC9B;AAEO,SAAS,sBAAA,GAAqC;AACpD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AAClC;AAEO,SAAS,wBAAwB,UAAA,EAAoC;AAC3E,EAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACvC,IAAA,cAAA,CAAe,UAAU,CAAA;AAAA,EAC1B;AACD","file":"chunk-KQEBNUZI.cjs","sourcesContent":["export type ActionId = `${string}.${string}`;\n\nexport interface SchemaParseIssue {\n\tpath: PropertyKey[];\n\tmessage: string;\n}\n\nexport type SchemaParseResult<T = unknown> =\n\t| { success: true; data: T }\n\t| { success: false; error: { issues: SchemaParseIssue[] } };\n\nexport interface SchemaValidator<T = unknown> {\n\tparse(input: unknown): T;\n\tsafeParse(input: unknown): SchemaParseResult<T>;\n}\n\nexport type ActorType =\n\t| \"natural_person\"\n\t| \"agent\"\n\t| \"system\"\n\t| \"service_account\"\n\t| \"external_system\"\n\t| \"integration\";\n\nexport const ACTOR_TYPES: readonly ActorType[] = [\n\t\"natural_person\",\n\t\"agent\",\n\t\"system\",\n\t\"service_account\",\n\t\"external_system\",\n\t\"integration\",\n] as const;\n\nexport function isActorType(value: string): value is ActorType {\n\treturn (ACTOR_TYPES as readonly string[]).includes(value);\n}\n\nexport function assertActorType(value: string): asserts value is ActorType {\n\tif (!isActorType(value)) {\n\t\tthrow new Error(`Invalid actorType: ${value}`);\n\t}\n}\n\nexport type ActionStatus =\n\t| \"pending\"\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"blocked_by_policy\"\n\t| \"waiting_for_approval\"\n\t| \"validation_failed\";\n\nexport interface FabricRuntimeServices {\n\treadonly [serviceName: string]: unknown;\n}\n\nexport interface ActionContext<TDb = unknown> {\n\tactionInvocationId: string;\n\ttenantId: string;\n\tspaceId: string;\n\tactorId: string;\n\tactorType: ActorType;\n\tcorrelationId: string;\n\tcausationId?: string;\n\tdb: TDb;\n\tservices?: FabricRuntimeServices;\n}\n\nexport interface ActionResult {\n\tsuccess: boolean;\n\tdata?: Record<string, unknown>;\n\terror?: string;\n}\n\nexport type ActionHandler<TDb = unknown> = (\n\tctx: ActionContext<TDb>,\n\tparams: unknown,\n) => Promise<ActionResult>;\n\nexport interface AdapterStepRetryPolicy {\n\tidempotent: boolean;\n\tmaxAttempts?: number;\n\tinitialDelayMs?: number;\n\tbackoffMultiplier?: number;\n\tmaxDelayMs?: number;\n}\n\nexport interface AdapterStep {\n\tadapterType: string;\n\toperation: string;\n\tretryPolicy?: AdapterStepRetryPolicy;\n\tgetInput: (\n\t\tparams: unknown,\n\t\thandlerResult: Record<string, unknown>,\n\t) => Record<string, unknown> | undefined;\n}\n\nexport interface ActionStateMachineBinding {\n\tentityType: string;\n\ttargetState: string | ((params: unknown) => string);\n\tgetEntityId: (params: unknown) => string | undefined;\n}\n\nexport interface ActionDefinition<TDb = unknown> {\n\tactionId: ActionId;\n\tnamespace: string;\n\tversion: number;\n\tschema: SchemaValidator;\n\thandler?: ActionHandler<TDb>;\n\trequiredRoles?: string[];\n\trequiredPermissions?: string[];\n\tpolicies?: `${string}.v${number}`[];\n\temitsEvents: string[];\n\tidempotent: boolean;\n\tmutatesDomain: boolean;\n\tstateMachine?: ActionStateMachineBinding;\n\tadapterSteps?: AdapterStep[];\n\t/**\n\t * If \"saga\", the action is a multi-step orchestration. The worker dispatches\n\t * to a registered saga implementation instead of running `handler` directly.\n\t */\n\tkind?: \"atomic\" | \"saga\";\n}\n\nexport interface SagaContext {\n\tactionInvocationId: string;\n\ttenantId: string;\n\tspaceId: string;\n\tparameters: unknown;\n\tsleep?: (delayMs: number) => Promise<void>;\n\tquery?: <T = unknown>(model: string, operation: string, args: unknown) => Promise<T>;\n}\n\nexport interface SagaChildActionInput {\n\tsuffix: string;\n\tactionId: string;\n\tparameters: Record<string, unknown>;\n}\n\nexport type SagaRunChild = (input: SagaChildActionInput) => Promise<Record<string, unknown>>;\n\nexport interface SagaCompletionEvent {\n\teventType: string;\n\tsubjectType: string;\n\tsubjectId: string;\n\tpayload: unknown;\n\teventSchemaVersion?: number;\n}\n\nexport interface SagaCompletion {\n\tresultData: Record<string, unknown>;\n\tevent?: SagaCompletionEvent;\n}\n\nexport type SagaImplementation = (\n\tctx: SagaContext,\n\trunChild: SagaRunChild,\n) => Promise<SagaCompletion>;\n\nconst registry = new Map<ActionId, ActionDefinition>();\n\nexport function assertActionId(actionId: string): asserts actionId is ActionId {\n\tif (!/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9_]*$/.test(actionId)) {\n\t\tthrow new Error(`Invalid action ID: ${actionId}`);\n\t}\n}\n\nexport function registerAction(definition: ActionDefinition): void {\n\tassertActionId(definition.actionId);\n\n\tif (registry.has(definition.actionId)) {\n\t\tthrow new Error(`Action \"${definition.actionId}\" is already registered`);\n\t}\n\n\tif (definition.mutatesDomain && definition.emitsEvents.length === 0) {\n\t\tthrow new Error(\n\t\t\t`Action \"${definition.actionId}\" mutates domain but emits no events. ` +\n\t\t\t\t`Every mutating action must emit at least one AssetEvent.`,\n\t\t);\n\t}\n\n\tregistry.set(definition.actionId, definition);\n}\n\nexport function resolveAction(actionId: ActionId): ActionDefinition | undefined {\n\treturn registry.get(actionId);\n}\n\nexport function isRegisteredActionId(actionId: string): actionId is ActionId {\n\treturn registry.has(actionId as ActionId);\n}\n\nexport function resolveRegisteredAction(actionId: string): ActionDefinition | undefined {\n\tif (!isRegisteredActionId(actionId)) {\n\t\treturn undefined;\n\t}\n\n\treturn resolveAction(actionId);\n}\n\nexport function getRegisteredActionIds(): ActionId[] {\n\treturn Array.from(registry.keys());\n}\n\nexport function registerActionIfMissing(definition: ActionDefinition): void {\n\tif (!registry.has(definition.actionId)) {\n\t\tregisterAction(definition);\n\t}\n}\n"]}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ // privacy/index.ts
4
+ var PLATFORM_PRIVACY_POLICY_VERSION = "fabric-platform-privacy-v1";
5
+
6
+ exports.PLATFORM_PRIVACY_POLICY_VERSION = PLATFORM_PRIVACY_POLICY_VERSION;
7
+ //# sourceMappingURL=chunk-LHCSVEFT.cjs.map
8
+ //# sourceMappingURL=chunk-LHCSVEFT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../privacy/index.ts"],"names":[],"mappings":";;;AAAO,IAAM,+BAAA,GAAkC","file":"chunk-LHCSVEFT.cjs","sourcesContent":["export const PLATFORM_PRIVACY_POLICY_VERSION = \"fabric-platform-privacy-v1\";\n\nexport type RedactionMethod = \"nullify\" | \"mask\" | \"hash\" | \"tokenize\" | \"generalize\" | \"drop\";\n\nexport type PlatformDataClass =\n\t| \"asset_event\"\n\t| \"read_model\"\n\t| \"raw_payload\"\n\t| \"evidence_packet\"\n\t| \"action_evidence\"\n\t| \"access_event\";\n\nexport interface RedactionRule {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\treason: string;\n\tdataClass?: PlatformDataClass;\n}\n\nexport interface DataClassificationRule {\n\tfieldPath: string;\n\tclassification: string;\n\tcontainsDirectIdentifier?: boolean;\n\tcontainsSensitiveData?: boolean;\n}\n\nexport interface AnonymizationContext {\n\ttenantId: string;\n\tspaceId?: string | null;\n\tjobId: string;\n\treason: string;\n\tredactedAt?: Date;\n\tpolicyVersion?: string;\n}\n\nexport interface AnonymizationFieldMetadata {\n\tfieldPath: string;\n\tmethod: RedactionMethod;\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tbeforeChecksum: string;\n}\n\nexport interface AnonymizationMetadata {\n\tredactionState: \"anonymized\";\n\tpolicyVersion: string;\n\tjobId: string;\n\tredactedAt: string;\n\treason: string;\n\tdataClass: PlatformDataClass;\n\tredactedFields: AnonymizationFieldMetadata[];\n\tpreservedSemantics: string[];\n}\n\nexport interface AnonymizationResult<TValue> {\n\tvalue: TValue;\n\tmetadata: AnonymizationMetadata;\n}\n\nexport interface AnalyticsDataContractSource {\n\tname: string;\n\tprivacyClass:\n\t\t| \"raw\"\n\t\t| \"operational_pii\"\n\t\t| \"tenant_scoped_tokenized\"\n\t\t| \"anonymized\"\n\t\t| \"aggregated\"\n\t\t| \"differentially_minimized\";\n\tcontainsDirectIdentifiers?: boolean;\n\tcontainsGloballyStablePersonTokens?: boolean;\n\tanonymizationPolicyVersion?: string;\n\tminimumGroupSize?: number;\n}\n\nexport interface AnalyticsDataContract {\n\tcontractId: string;\n\tstatus: \"draft\" | \"accepted\" | \"deprecated\";\n\tcrossTenant: boolean;\n\tacceptedBy?: string;\n\tacceptedAt?: string;\n\tadrReference?: string;\n\tsources: AnalyticsDataContractSource[];\n}\n\nexport interface AnalyticsEligibilityDecision {\n\teligible: boolean;\n\tpolicyVersion: string;\n\treasons: string[];\n}\n\nexport interface RetentionRule {\n\tdataClass: PlatformDataClass;\n\tretainForDays: number;\n\tafterRetention: \"delete\" | \"anonymize\" | \"archive\";\n\tlegalHoldExempt?: boolean;\n}\n"]}
@@ -0,0 +1,195 @@
1
+ 'use strict';
2
+
3
+ var chunkQETQGAXJ_cjs = require('./chunk-QETQGAXJ.cjs');
4
+ var chunkSDXDHVTV_cjs = require('./chunk-SDXDHVTV.cjs');
5
+ var chunkGB2PSZ33_cjs = require('./chunk-GB2PSZ33.cjs');
6
+ var chunkKQEBNUZI_cjs = require('./chunk-KQEBNUZI.cjs');
7
+ var chunk7KJHGAZY_cjs = require('./chunk-7KJHGAZY.cjs');
8
+ var chunkJAXDEK5Z_cjs = require('./chunk-JAXDEK5Z.cjs');
9
+
10
+ // modules/index.ts
11
+ var registeredModuleNamespaces = /* @__PURE__ */ new Set();
12
+ function getModuleDependencyNamespace(dependency) {
13
+ return typeof dependency === "string" ? dependency : dependency.namespace;
14
+ }
15
+ function getObjectTypeName(objectType) {
16
+ return typeof objectType === "string" ? objectType : objectType.type;
17
+ }
18
+ function getEventTypeName(eventType) {
19
+ return typeof eventType === "string" ? eventType : eventType.eventType;
20
+ }
21
+ function validateModuleNamespace(namespace) {
22
+ if (!namespace) {
23
+ throw new Error("Module namespace cannot be empty");
24
+ }
25
+ if (!/^[a-z][a-z0-9-]*$/.test(namespace)) {
26
+ throw new Error(
27
+ `Invalid module namespace: "${namespace}". Must be lowercase letters, numbers, and hyphens only.`
28
+ );
29
+ }
30
+ }
31
+ function createModuleRegistry(modules = []) {
32
+ const registered = /* @__PURE__ */ new Map();
33
+ for (const module of modules) {
34
+ validateModuleNamespace(module.namespace);
35
+ if (registered.has(module.namespace)) {
36
+ throw new Error(`Duplicate FabricModule namespace "${module.namespace}".`);
37
+ }
38
+ registered.set(module.namespace, module);
39
+ }
40
+ return { modules: registered };
41
+ }
42
+ function validateIdentifierList(values, label, namespace) {
43
+ for (const value of values ?? []) {
44
+ if (!value) {
45
+ throw new Error(`Module "${namespace}" has an empty ${label} entry.`);
46
+ }
47
+ }
48
+ }
49
+ function validateManifest(module, context = {}) {
50
+ validateModuleNamespace(module.namespace);
51
+ const dependencies = (module.dependencies ?? []).map(getModuleDependencyNamespace);
52
+ const objectTypes = (module.objectTypes ?? []).map(getObjectTypeName);
53
+ const eventTypes = (module.eventTypes ?? []).map(getEventTypeName);
54
+ for (const dependency of dependencies) {
55
+ validateModuleNamespace(dependency);
56
+ if (dependency === module.namespace) {
57
+ throw new Error(`Module "${module.namespace}" cannot depend on itself.`);
58
+ }
59
+ if (context.availableNamespaces && !context.availableNamespaces.has(dependency)) {
60
+ throw new Error(`Module "${module.namespace}" depends on missing module "${dependency}".`);
61
+ }
62
+ }
63
+ validateIdentifierList(objectTypes, "objectTypes", module.namespace);
64
+ validateIdentifierList(module.subjectTypes, "subjectTypes", module.namespace);
65
+ validateIdentifierList(eventTypes, "eventTypes", module.namespace);
66
+ for (const objectType of objectTypes) {
67
+ if (!/^[A-Z][a-zA-Z0-9]*$/.test(objectType)) {
68
+ throw new Error(
69
+ `Invalid object type: "${objectType}". Object types must be PascalCase alphanumeric.`
70
+ );
71
+ }
72
+ }
73
+ for (const action of module.actions ?? []) {
74
+ if (!/^[a-z][a-z0-9-]*\.[a-z][a-z0-9_]*$/.test(action.actionId)) {
75
+ throw new Error(`Invalid action ID: ${action.actionId}`);
76
+ }
77
+ if (action.namespace !== module.namespace) {
78
+ throw new Error(
79
+ `Action "${action.actionId}" declares namespace "${action.namespace}" but is registered by module "${module.namespace}".`
80
+ );
81
+ }
82
+ if (!action.actionId.startsWith(`${module.namespace}.`)) {
83
+ throw new Error(
84
+ `Action "${action.actionId}" must start with module namespace "${module.namespace}."`
85
+ );
86
+ }
87
+ if (action.mutatesDomain && action.emitsEvents.length === 0) {
88
+ throw new Error(
89
+ `Action "${action.actionId}" mutates domain but emits no events. Every mutating action must emit at least one AssetEvent.`
90
+ );
91
+ }
92
+ }
93
+ for (const descriptor of module.displayRenderers ?? []) {
94
+ const isPlannedEventType = context.plannedEventTypes?.has(descriptor.eventType) ?? false;
95
+ const isModuleEventType = eventTypes.includes(descriptor.eventType);
96
+ if (!chunkJAXDEK5Z_cjs.isValidEventType(descriptor.eventType) && !isModuleEventType && !isPlannedEventType) {
97
+ throw new Error(
98
+ `Display renderer registered for unknown event type "${descriptor.eventType}". Register the event type before adding a display renderer.`
99
+ );
100
+ }
101
+ }
102
+ }
103
+ function sortModulesByDependency(modules, registeredNamespaces = registeredModuleNamespaces) {
104
+ const modulesByNamespace = /* @__PURE__ */ new Map();
105
+ for (const module of modules) {
106
+ validateModuleNamespace(module.namespace);
107
+ if (modulesByNamespace.has(module.namespace)) {
108
+ throw new Error(`Duplicate Fabric module namespace "${module.namespace}".`);
109
+ }
110
+ modulesByNamespace.set(module.namespace, module);
111
+ }
112
+ const sorted = [];
113
+ const visiting = /* @__PURE__ */ new Set();
114
+ const visited = /* @__PURE__ */ new Set();
115
+ function visit(module, path) {
116
+ if (visited.has(module.namespace)) {
117
+ return;
118
+ }
119
+ if (visiting.has(module.namespace)) {
120
+ throw new Error(
121
+ `Cyclic Fabric module dependency detected: ${[...path, module.namespace].join(" -> ")}`
122
+ );
123
+ }
124
+ visiting.add(module.namespace);
125
+ for (const dependency of (module.dependencies ?? []).map(getModuleDependencyNamespace)) {
126
+ const dependencyModule = modulesByNamespace.get(dependency);
127
+ if (!dependencyModule) {
128
+ if (registeredNamespaces.has(dependency)) {
129
+ continue;
130
+ }
131
+ throw new Error(`Module "${module.namespace}" depends on missing module "${dependency}".`);
132
+ }
133
+ visit(dependencyModule, [...path, module.namespace]);
134
+ }
135
+ visiting.delete(module.namespace);
136
+ visited.add(module.namespace);
137
+ sorted.push(module);
138
+ }
139
+ for (const module of modules) {
140
+ visit(module, []);
141
+ }
142
+ return sorted;
143
+ }
144
+ function registerFabricModule(module) {
145
+ validateManifest(module, { availableNamespaces: registeredModuleNamespaces });
146
+ for (const objectType of module.objectTypes ?? []) {
147
+ chunkQETQGAXJ_cjs.registerObjectType(getObjectTypeName(objectType));
148
+ }
149
+ for (const subjectType of module.subjectTypes ?? []) {
150
+ chunkJAXDEK5Z_cjs.registerSubjectType(subjectType);
151
+ }
152
+ for (const eventType of module.eventTypes ?? []) {
153
+ chunkJAXDEK5Z_cjs.registerEventType(getEventTypeName(eventType));
154
+ }
155
+ for (const policy of module.policies ?? []) {
156
+ chunkSDXDHVTV_cjs.registerPolicyIfMissing(policy);
157
+ }
158
+ for (const machine of module.stateMachines ?? []) {
159
+ chunkGB2PSZ33_cjs.registerStateMachineIfMissing(machine);
160
+ }
161
+ for (const action of module.actions ?? []) {
162
+ chunkKQEBNUZI_cjs.registerActionIfMissing(action);
163
+ }
164
+ for (const descriptor of module.displayRenderers ?? []) {
165
+ chunk7KJHGAZY_cjs.registerDisplayRenderer(descriptor.eventType, descriptor.renderer);
166
+ }
167
+ registeredModuleNamespaces.add(module.namespace);
168
+ }
169
+ function registerFabricModules(modules) {
170
+ const availableNamespaces = /* @__PURE__ */ new Set([
171
+ ...registeredModuleNamespaces,
172
+ ...modules.map((module) => module.namespace)
173
+ ]);
174
+ const plannedEventTypes = new Set(
175
+ modules.flatMap((module) => (module.eventTypes ?? []).map(getEventTypeName))
176
+ );
177
+ for (const module of modules) {
178
+ validateManifest(module, { availableNamespaces, plannedEventTypes });
179
+ }
180
+ const sortedModules = sortModulesByDependency(modules);
181
+ for (const module of sortedModules) {
182
+ registerFabricModule(module);
183
+ }
184
+ return sortedModules;
185
+ }
186
+
187
+ exports.createModuleRegistry = createModuleRegistry;
188
+ exports.getEventTypeName = getEventTypeName;
189
+ exports.getModuleDependencyNamespace = getModuleDependencyNamespace;
190
+ exports.getObjectTypeName = getObjectTypeName;
191
+ exports.registerFabricModule = registerFabricModule;
192
+ exports.registerFabricModules = registerFabricModules;
193
+ exports.validateModuleNamespace = validateModuleNamespace;
194
+ //# sourceMappingURL=chunk-LYX73U3P.cjs.map
195
+ //# sourceMappingURL=chunk-LYX73U3P.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../modules/index.ts"],"names":["isValidEventType","registerObjectType","registerSubjectType","registerEventType","registerPolicyIfMissing","registerStateMachineIfMissing","registerActionIfMissing","registerDisplayRenderer"],"mappings":"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","file":"chunk-LYX73U3P.cjs","sourcesContent":["import { registerActionIfMissing, type ActionDefinition } from \"../actions\";\nimport { registerDisplayRenderer, type DisplayRenderer } from \"../displays\";\nimport { isValidEventType, registerEventType, registerSubjectType } from \"../events\";\nimport { registerObjectType } from \"../objects\";\nimport { registerPolicyIfMissing, type PolicyEvaluator } from \"../policies\";\nimport { registerStateMachineIfMissing, type StateMachineDefinition } from \"../state-machines\";\n\nexport interface ModuleDependency {\n\tnamespace: string;\n\tversion?: string;\n\toptional?: boolean;\n}\n\nexport type ModuleDependencyInput = string | ModuleDependency;\n\nexport interface IdPrefixRegistration {\n\tprefix: string;\n\tname: string;\n\tmodule: string;\n}\n\nexport interface EventTypeRegistration {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n}\n\nexport type EventTypeRegistrationInput = string | EventTypeRegistration;\n\nexport interface ObjectTypeRegistration {\n\ttype: string;\n\tdisplayName?: string;\n\tidPrefix?: string;\n\tisCoreModuleType?: boolean;\n}\n\nexport type ObjectTypeRegistrationInput = string | ObjectTypeRegistration;\n\nexport interface ModuleDisplayRendererRegistration {\n\teventType: string;\n\trenderer: (payload: unknown, ctx?: any) => unknown;\n}\n\nexport interface PolicyRegistration {\n\tid: string;\n\tversion?: string;\n\tdescription?: string;\n}\n\nexport interface StateMachineRegistration {\n\tentityType: string;\n\tstates: string[];\n}\n\nexport interface FabricModule<TDb = unknown> {\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tdependencies?: ModuleDependencyInput[];\n\tobjectTypes?: ObjectTypeRegistrationInput[];\n\tsubjectTypes?: string[];\n\tidPrefixes?: IdPrefixRegistration[];\n\teventTypes?: EventTypeRegistrationInput[];\n\tactions?: ActionDefinition<TDb>[];\n\tpolicies?: unknown[];\n\tstateMachines?: unknown[];\n\tdisplayRenderers?: ModuleDisplayRendererRegistration[];\n\tadapterDefinitions?: unknown[];\n\tpermissions?: unknown[];\n\troles?: unknown[];\n\tredactionRules?: unknown[];\n\tdataClassifications?: unknown[];\n\tretentionRules?: unknown[];\n\tevidenceRenderers?: unknown[];\n}\n\nexport interface ModuleRegistry<TDb = unknown> {\n\tmodules: ReadonlyMap<string, FabricModule<TDb>>;\n}\n\ninterface ModuleValidationContext {\n\tavailableNamespaces?: Set<string>;\n\tplannedEventTypes?: Set<string>;\n}\n\nconst registeredModuleNamespaces = new Set<string>();\n\nexport function getModuleDependencyNamespace(dependency: ModuleDependencyInput): string {\n\treturn typeof dependency === \"string\" ? dependency : dependency.namespace;\n}\n\nexport function getObjectTypeName(objectType: ObjectTypeRegistrationInput): string {\n\treturn typeof objectType === \"string\" ? objectType : objectType.type;\n}\n\nexport function getEventTypeName(eventType: EventTypeRegistrationInput): string {\n\treturn typeof eventType === \"string\" ? eventType : eventType.eventType;\n}\n\nexport function validateModuleNamespace(namespace: string): void {\n\tif (!namespace) {\n\t\tthrow new Error(\"Module namespace cannot be empty\");\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(namespace)) {\n\t\tthrow new Error(\n\t\t\t`Invalid module namespace: \"${namespace}\". Must be lowercase letters, numbers, and hyphens only.`,\n\t\t);\n\t}\n}\n\nexport function createModuleRegistry<TDb = unknown>(\n\tmodules: FabricModule<TDb>[] = [],\n): ModuleRegistry<TDb> {\n\tconst registered = new Map<string, FabricModule<TDb>>();\n\tfor (const module of modules) {\n\t\tvalidateModuleNamespace(module.namespace);\n\t\tif (registered.has(module.namespace)) {\n\t\t\tthrow new Error(`Duplicate FabricModule namespace \"${module.namespace}\".`);\n\t\t}\n\t\tregistered.set(module.namespace, module);\n\t}\n\treturn { modules: registered };\n}\n\nfunction validateIdentifierList(\n\tvalues: string[] | undefined,\n\tlabel: string,\n\tnamespace: string,\n): void {\n\tfor (const value of values ?? []) {\n\t\tif (!value) {\n\t\t\tthrow new Error(`Module \"${namespace}\" has an empty ${label} entry.`);\n\t\t}\n\t}\n}\n\nfunction validateManifest(module: FabricModule<any>, context: ModuleValidationContext = {}): void {\n\tvalidateModuleNamespace(module.namespace);\n\n\tconst dependencies = (module.dependencies ?? []).map(getModuleDependencyNamespace);\n\tconst objectTypes = (module.objectTypes ?? []).map(getObjectTypeName);\n\tconst eventTypes = (module.eventTypes ?? []).map(getEventTypeName);\n\n\tfor (const dependency of dependencies) {\n\t\tvalidateModuleNamespace(dependency);\n\t\tif (dependency === module.namespace) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" cannot depend on itself.`);\n\t\t}\n\t\tif (context.availableNamespaces && !context.availableNamespaces.has(dependency)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t}\n\t}\n\n\tvalidateIdentifierList(objectTypes, \"objectTypes\", module.namespace);\n\tvalidateIdentifierList(module.subjectTypes, \"subjectTypes\", module.namespace);\n\tvalidateIdentifierList(eventTypes, \"eventTypes\", module.namespace);\n\n\tfor (const objectType of objectTypes) {\n\t\tif (!/^[A-Z][a-zA-Z0-9]*$/.test(objectType)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid object type: \"${objectType}\". Object types must be PascalCase alphanumeric.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const action of module.actions ?? []) {\n\t\tif (!/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9_]*$/.test(action.actionId)) {\n\t\t\tthrow new Error(`Invalid action ID: ${action.actionId}`);\n\t\t}\n\n\t\tif (action.namespace !== module.namespace) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" declares namespace \"${action.namespace}\" ` +\n\t\t\t\t\t`but is registered by module \"${module.namespace}\".`,\n\t\t\t);\n\t\t}\n\n\t\tif (!action.actionId.startsWith(`${module.namespace}.`)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" must start with module namespace \"${module.namespace}.\"`,\n\t\t\t);\n\t\t}\n\n\t\tif (action.mutatesDomain && action.emitsEvents.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" mutates domain but emits no events. ` +\n\t\t\t\t\t`Every mutating action must emit at least one AssetEvent.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const descriptor of module.displayRenderers ?? []) {\n\t\tconst isPlannedEventType = context.plannedEventTypes?.has(descriptor.eventType) ?? false;\n\t\tconst isModuleEventType = eventTypes.includes(descriptor.eventType);\n\t\tif (!isValidEventType(descriptor.eventType) && !isModuleEventType && !isPlannedEventType) {\n\t\t\tthrow new Error(\n\t\t\t\t`Display renderer registered for unknown event type \"${descriptor.eventType}\". ` +\n\t\t\t\t\t`Register the event type before adding a display renderer.`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction sortModulesByDependency(\n\tmodules: FabricModule<any>[],\n\tregisteredNamespaces = registeredModuleNamespaces,\n): FabricModule<any>[] {\n\tconst modulesByNamespace = new Map<string, FabricModule<any>>();\n\n\tfor (const module of modules) {\n\t\tvalidateModuleNamespace(module.namespace);\n\t\tif (modulesByNamespace.has(module.namespace)) {\n\t\t\tthrow new Error(`Duplicate Fabric module namespace \"${module.namespace}\".`);\n\t\t}\n\t\tmodulesByNamespace.set(module.namespace, module);\n\t}\n\n\tconst sorted: FabricModule<any>[] = [];\n\tconst visiting = new Set<string>();\n\tconst visited = new Set<string>();\n\n\tfunction visit(module: FabricModule<any>, path: string[]): void {\n\t\tif (visited.has(module.namespace)) {\n\t\t\treturn;\n\t\t}\n\t\tif (visiting.has(module.namespace)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cyclic Fabric module dependency detected: ${[...path, module.namespace].join(\" -> \")}`,\n\t\t\t);\n\t\t}\n\n\t\tvisiting.add(module.namespace);\n\t\tfor (const dependency of (module.dependencies ?? []).map(getModuleDependencyNamespace)) {\n\t\t\tconst dependencyModule = modulesByNamespace.get(dependency);\n\t\t\tif (!dependencyModule) {\n\t\t\t\tif (registeredNamespaces.has(dependency)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t\t}\n\t\t\tvisit(dependencyModule, [...path, module.namespace]);\n\t\t}\n\t\tvisiting.delete(module.namespace);\n\t\tvisited.add(module.namespace);\n\t\tsorted.push(module);\n\t}\n\n\tfor (const module of modules) {\n\t\tvisit(module, []);\n\t}\n\n\treturn sorted;\n}\n\nexport function registerFabricModule(module: FabricModule<any>): void {\n\tvalidateManifest(module, { availableNamespaces: registeredModuleNamespaces });\n\n\tfor (const objectType of module.objectTypes ?? []) {\n\t\tregisterObjectType(getObjectTypeName(objectType));\n\t}\n\n\tfor (const subjectType of module.subjectTypes ?? []) {\n\t\tregisterSubjectType(subjectType);\n\t}\n\n\tfor (const eventType of module.eventTypes ?? []) {\n\t\tregisterEventType(getEventTypeName(eventType));\n\t}\n\n\tfor (const policy of module.policies ?? []) {\n\t\tregisterPolicyIfMissing(policy as PolicyEvaluator);\n\t}\n\n\tfor (const machine of module.stateMachines ?? []) {\n\t\tregisterStateMachineIfMissing(machine as StateMachineDefinition);\n\t}\n\n\tfor (const action of module.actions ?? []) {\n\t\tregisterActionIfMissing(action);\n\t}\n\n\tfor (const descriptor of module.displayRenderers ?? []) {\n\t\tregisterDisplayRenderer(descriptor.eventType, descriptor.renderer as DisplayRenderer);\n\t}\n\n\tregisteredModuleNamespaces.add(module.namespace);\n}\n\nexport function registerFabricModules(modules: FabricModule<any>[]): FabricModule<any>[] {\n\tconst availableNamespaces = new Set([\n\t\t...registeredModuleNamespaces,\n\t\t...modules.map((module) => module.namespace),\n\t]);\n\tconst plannedEventTypes = new Set(\n\t\tmodules.flatMap((module) => (module.eventTypes ?? []).map(getEventTypeName)),\n\t);\n\n\tfor (const module of modules) {\n\t\tvalidateManifest(module, { availableNamespaces, plannedEventTypes });\n\t}\n\n\tconst sortedModules = sortModulesByDependency(modules);\n\tfor (const module of sortedModules) {\n\t\tregisterFabricModule(module);\n\t}\n\n\treturn sortedModules;\n}\n"]}
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ // ids/index.ts
4
+ var CROCKFORD_BASE32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
5
+ var FABRIC_ID_PREFIXES = {
6
+ assetEvent: "evt",
7
+ actionInvocation: "act",
8
+ policyEvaluation: "pol",
9
+ adapterInvocation: "adp",
10
+ adapterDeadLetterQueue: "dlq",
11
+ accessEvent: "acc",
12
+ projectionSnapshot: "psn",
13
+ complianceEvidencePacket: "cep"
14
+ };
15
+ var ID_REGEX = /^([a-z][a-z0-9]{1,7})_([0-9A-Z]{26})$/;
16
+ function randomBase32(length) {
17
+ let output = "";
18
+ const randomValues = new Uint8Array(length);
19
+ globalThis.crypto.getRandomValues(randomValues);
20
+ for (const value of randomValues) {
21
+ output += CROCKFORD_BASE32[value % CROCKFORD_BASE32.length];
22
+ }
23
+ return output;
24
+ }
25
+ function createSortableRandomId() {
26
+ let timestamp = Date.now();
27
+ let encodedTime = "";
28
+ for (let index = 0; index < 10; index++) {
29
+ encodedTime = CROCKFORD_BASE32[timestamp % 32] + encodedTime;
30
+ timestamp = Math.floor(timestamp / 32);
31
+ }
32
+ return `${encodedTime}${randomBase32(16)}`;
33
+ }
34
+ function createFabricId(prefix) {
35
+ if (!/^[a-z][a-z0-9]{1,7}$/.test(prefix)) {
36
+ throw new Error(`Invalid Fabric ID prefix: ${prefix}`);
37
+ }
38
+ return `${prefix}_${createSortableRandomId()}`;
39
+ }
40
+ function isFabricId(id, prefix) {
41
+ const match = ID_REGEX.exec(id);
42
+ if (!match) {
43
+ return false;
44
+ }
45
+ return prefix ? match[1] === prefix : true;
46
+ }
47
+ function parseFabricId(id) {
48
+ const match = ID_REGEX.exec(id);
49
+ if (!match) {
50
+ return null;
51
+ }
52
+ return { prefix: match[1], ulid: match[2] };
53
+ }
54
+
55
+ exports.FABRIC_ID_PREFIXES = FABRIC_ID_PREFIXES;
56
+ exports.createFabricId = createFabricId;
57
+ exports.isFabricId = isFabricId;
58
+ exports.parseFabricId = parseFabricId;
59
+ //# sourceMappingURL=chunk-LZSE6QGQ.cjs.map
60
+ //# sourceMappingURL=chunk-LZSE6QGQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ids/index.ts"],"names":[],"mappings":";;;AAAA,IAAM,gBAAA,GAAmB,kCAAA;AAElB,IAAM,kBAAA,GAAqB;AAAA,EACjC,UAAA,EAAY,KAAA;AAAA,EACZ,gBAAA,EAAkB,KAAA;AAAA,EAClB,gBAAA,EAAkB,KAAA;AAAA,EAClB,iBAAA,EAAmB,KAAA;AAAA,EACnB,sBAAA,EAAwB,KAAA;AAAA,EACxB,WAAA,EAAa,KAAA;AAAA,EACb,kBAAA,EAAoB,KAAA;AAAA,EACpB,wBAAA,EAA0B;AAC3B;AAIA,IAAM,QAAA,GAAW,uCAAA;AAEjB,SAAS,aAAa,MAAA,EAAwB;AAC7C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,MAAM,CAAA;AAC1C,EAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,YAAY,CAAA;AAC9C,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AACjC,IAAA,MAAA,IAAU,gBAAA,CAAiB,KAAA,GAAQ,gBAAA,CAAiB,MAAM,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACR;AAEA,SAAS,sBAAA,GAAiC;AACzC,EAAA,IAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,KAAA,EAAA,EAAS;AACxC,IAAA,WAAA,GAAc,gBAAA,CAAiB,SAAA,GAAY,EAAE,CAAA,GAAI,WAAA;AACjD,IAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,EAAG,YAAA,CAAa,EAAE,CAAC,CAAA,CAAA;AACzC;AAEO,SAAS,eAAe,MAAA,EAAgC;AAC9D,EAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAM,CAAA,CAAE,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,sBAAA,EAAwB,CAAA,CAAA;AAC7C;AAEO,SAAS,UAAA,CAAW,IAAY,MAAA,EAAkC;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,EAAO;AACX,IAAA,OAAO,KAAA;AAAA,EACR;AACA,EAAA,OAAO,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,GAAS,IAAA;AACvC;AAEO,SAAS,cAAc,EAAA,EAAqD;AAClF,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,EAAO;AACX,IAAA,OAAO,IAAA;AAAA,EACR;AACA,EAAA,OAAO,EAAE,QAAQ,KAAA,CAAM,CAAC,GAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAC3C","file":"chunk-LZSE6QGQ.cjs","sourcesContent":["const CROCKFORD_BASE32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nexport const FABRIC_ID_PREFIXES = {\n\tassetEvent: \"evt\",\n\tactionInvocation: \"act\",\n\tpolicyEvaluation: \"pol\",\n\tadapterInvocation: \"adp\",\n\tadapterDeadLetterQueue: \"dlq\",\n\taccessEvent: \"acc\",\n\tprojectionSnapshot: \"psn\",\n\tcomplianceEvidencePacket: \"cep\",\n} as const;\n\nexport type FabricIdPrefix = (typeof FABRIC_ID_PREFIXES)[keyof typeof FABRIC_ID_PREFIXES] | string;\n\nconst ID_REGEX = /^([a-z][a-z0-9]{1,7})_([0-9A-Z]{26})$/;\n\nfunction randomBase32(length: number): string {\n\tlet output = \"\";\n\tconst randomValues = new Uint8Array(length);\n\tglobalThis.crypto.getRandomValues(randomValues);\n\tfor (const value of randomValues) {\n\t\toutput += CROCKFORD_BASE32[value % CROCKFORD_BASE32.length];\n\t}\n\treturn output;\n}\n\nfunction createSortableRandomId(): string {\n\tlet timestamp = Date.now();\n\tlet encodedTime = \"\";\n\tfor (let index = 0; index < 10; index++) {\n\t\tencodedTime = CROCKFORD_BASE32[timestamp % 32] + encodedTime;\n\t\ttimestamp = Math.floor(timestamp / 32);\n\t}\n\treturn `${encodedTime}${randomBase32(16)}`;\n}\n\nexport function createFabricId(prefix: FabricIdPrefix): string {\n\tif (!/^[a-z][a-z0-9]{1,7}$/.test(prefix)) {\n\t\tthrow new Error(`Invalid Fabric ID prefix: ${prefix}`);\n\t}\n\treturn `${prefix}_${createSortableRandomId()}`;\n}\n\nexport function isFabricId(id: string, prefix?: FabricIdPrefix): boolean {\n\tconst match = ID_REGEX.exec(id);\n\tif (!match) {\n\t\treturn false;\n\t}\n\treturn prefix ? match[1] === prefix : true;\n}\n\nexport function parseFabricId(id: string): { prefix: string; ulid: string } | null {\n\tconst match = ID_REGEX.exec(id);\n\tif (!match) {\n\t\treturn null;\n\t}\n\treturn { prefix: match[1], ulid: match[2] };\n}\n"]}