@fabricorg/platform 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.cjs +48 -0
- package/dist/actions/index.cjs.map +1 -0
- package/dist/actions/index.d.cts +116 -0
- package/dist/adapters/index.cjs +28 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +83 -0
- package/dist/chunk-7KJHGAZY.cjs +99 -0
- package/dist/chunk-7KJHGAZY.cjs.map +1 -0
- package/dist/chunk-GB2PSZ33.cjs +74 -0
- package/dist/chunk-GB2PSZ33.cjs.map +1 -0
- package/dist/chunk-JAXDEK5Z.cjs +63 -0
- package/dist/chunk-JAXDEK5Z.cjs.map +1 -0
- package/dist/chunk-KQEBNUZI.cjs +70 -0
- package/dist/chunk-KQEBNUZI.cjs.map +1 -0
- package/dist/chunk-LHCSVEFT.cjs +8 -0
- package/dist/chunk-LHCSVEFT.cjs.map +1 -0
- package/dist/chunk-LYX73U3P.cjs +195 -0
- package/dist/chunk-LYX73U3P.cjs.map +1 -0
- package/dist/chunk-LZSE6QGQ.cjs +60 -0
- package/dist/chunk-LZSE6QGQ.cjs.map +1 -0
- package/dist/chunk-NPVIFZQV.cjs +107 -0
- package/dist/chunk-NPVIFZQV.cjs.map +1 -0
- package/dist/chunk-PG5LYTUX.cjs +4 -0
- package/dist/chunk-PG5LYTUX.cjs.map +1 -0
- package/dist/chunk-Q3WYIWCN.cjs +183 -0
- package/dist/chunk-Q3WYIWCN.cjs.map +1 -0
- package/dist/chunk-QETQGAXJ.cjs +35 -0
- package/dist/chunk-QETQGAXJ.cjs.map +1 -0
- package/dist/chunk-SDXDHVTV.cjs +555 -0
- package/dist/chunk-SDXDHVTV.cjs.map +1 -0
- package/dist/chunk-YZKUEC2J.cjs +31 -0
- package/dist/chunk-YZKUEC2J.cjs.map +1 -0
- package/dist/displays/index.cjs +24 -0
- package/dist/displays/index.cjs.map +1 -0
- package/dist/displays/index.d.cts +34 -0
- package/dist/events/index.cjs +36 -0
- package/dist/events/index.cjs.map +1 -0
- package/dist/events/index.d.cts +35 -0
- package/dist/evidence/index.cjs +6 -0
- package/dist/evidence/index.cjs.map +1 -0
- package/dist/evidence/index.d.cts +43 -0
- package/dist/ids/index.cjs +24 -0
- package/dist/ids/index.cjs.map +1 -0
- package/dist/ids/index.d.cts +19 -0
- package/dist/index.cjs +268 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +13 -0
- package/dist/modules/index.cjs +42 -0
- package/dist/modules/index.cjs.map +1 -0
- package/dist/modules/index.d.cts +73 -0
- package/dist/objects/index.cjs +24 -0
- package/dist/objects/index.cjs.map +1 -0
- package/dist/objects/index.d.cts +7 -0
- package/dist/policies/index.cjs +48 -0
- package/dist/policies/index.cjs.map +1 -0
- package/dist/policies/index.d.cts +143 -0
- package/dist/privacy/index.cjs +12 -0
- package/dist/privacy/index.cjs.map +1 -0
- package/dist/privacy/index.d.cts +77 -0
- package/dist/projections/index.cjs +12 -0
- package/dist/projections/index.cjs.map +1 -0
- package/dist/projections/index.d.cts +52 -0
- package/dist/state-machines/index.cjs +32 -0
- package/dist/state-machines/index.cjs.map +1 -0
- package/dist/state-machines/index.d.cts +60 -0
- package/dist/testing/index.cjs +21 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +19 -0
- package/package.json +196 -111
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKQEBNUZI_cjs = require('../chunk-KQEBNUZI.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "ACTOR_TYPES", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkKQEBNUZI_cjs.ACTOR_TYPES; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "assertActionId", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkKQEBNUZI_cjs.assertActionId; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "assertActorType", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkKQEBNUZI_cjs.assertActorType; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "getRegisteredActionIds", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkKQEBNUZI_cjs.getRegisteredActionIds; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "isActorType", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunkKQEBNUZI_cjs.isActorType; }
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(exports, "isRegisteredActionId", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () { return chunkKQEBNUZI_cjs.isRegisteredActionId; }
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "registerAction", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () { return chunkKQEBNUZI_cjs.registerAction; }
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(exports, "registerActionIfMissing", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return chunkKQEBNUZI_cjs.registerActionIfMissing; }
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "resolveAction", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkKQEBNUZI_cjs.resolveAction; }
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "resolveRegisteredAction", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () { return chunkKQEBNUZI_cjs.resolveRegisteredAction; }
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=index.cjs.map
|
|
48
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
type ActionId = `${string}.${string}`;
|
|
2
|
+
interface SchemaParseIssue {
|
|
3
|
+
path: PropertyKey[];
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
type SchemaParseResult<T = unknown> = {
|
|
7
|
+
success: true;
|
|
8
|
+
data: T;
|
|
9
|
+
} | {
|
|
10
|
+
success: false;
|
|
11
|
+
error: {
|
|
12
|
+
issues: SchemaParseIssue[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
interface SchemaValidator<T = unknown> {
|
|
16
|
+
parse(input: unknown): T;
|
|
17
|
+
safeParse(input: unknown): SchemaParseResult<T>;
|
|
18
|
+
}
|
|
19
|
+
type ActorType = "natural_person" | "agent" | "system" | "service_account" | "external_system" | "integration";
|
|
20
|
+
declare const ACTOR_TYPES: readonly ActorType[];
|
|
21
|
+
declare function isActorType(value: string): value is ActorType;
|
|
22
|
+
declare function assertActorType(value: string): asserts value is ActorType;
|
|
23
|
+
type ActionStatus = "pending" | "running" | "completed" | "failed" | "blocked_by_policy" | "waiting_for_approval" | "validation_failed";
|
|
24
|
+
interface FabricRuntimeServices {
|
|
25
|
+
readonly [serviceName: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
interface ActionContext<TDb = unknown> {
|
|
28
|
+
actionInvocationId: string;
|
|
29
|
+
tenantId: string;
|
|
30
|
+
spaceId: string;
|
|
31
|
+
actorId: string;
|
|
32
|
+
actorType: ActorType;
|
|
33
|
+
correlationId: string;
|
|
34
|
+
causationId?: string;
|
|
35
|
+
db: TDb;
|
|
36
|
+
services?: FabricRuntimeServices;
|
|
37
|
+
}
|
|
38
|
+
interface ActionResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
data?: Record<string, unknown>;
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
type ActionHandler<TDb = unknown> = (ctx: ActionContext<TDb>, params: unknown) => Promise<ActionResult>;
|
|
44
|
+
interface AdapterStepRetryPolicy {
|
|
45
|
+
idempotent: boolean;
|
|
46
|
+
maxAttempts?: number;
|
|
47
|
+
initialDelayMs?: number;
|
|
48
|
+
backoffMultiplier?: number;
|
|
49
|
+
maxDelayMs?: number;
|
|
50
|
+
}
|
|
51
|
+
interface AdapterStep {
|
|
52
|
+
adapterType: string;
|
|
53
|
+
operation: string;
|
|
54
|
+
retryPolicy?: AdapterStepRetryPolicy;
|
|
55
|
+
getInput: (params: unknown, handlerResult: Record<string, unknown>) => Record<string, unknown> | undefined;
|
|
56
|
+
}
|
|
57
|
+
interface ActionStateMachineBinding {
|
|
58
|
+
entityType: string;
|
|
59
|
+
targetState: string | ((params: unknown) => string);
|
|
60
|
+
getEntityId: (params: unknown) => string | undefined;
|
|
61
|
+
}
|
|
62
|
+
interface ActionDefinition<TDb = unknown> {
|
|
63
|
+
actionId: ActionId;
|
|
64
|
+
namespace: string;
|
|
65
|
+
version: number;
|
|
66
|
+
schema: SchemaValidator;
|
|
67
|
+
handler?: ActionHandler<TDb>;
|
|
68
|
+
requiredRoles?: string[];
|
|
69
|
+
requiredPermissions?: string[];
|
|
70
|
+
policies?: `${string}.v${number}`[];
|
|
71
|
+
emitsEvents: string[];
|
|
72
|
+
idempotent: boolean;
|
|
73
|
+
mutatesDomain: boolean;
|
|
74
|
+
stateMachine?: ActionStateMachineBinding;
|
|
75
|
+
adapterSteps?: AdapterStep[];
|
|
76
|
+
/**
|
|
77
|
+
* If "saga", the action is a multi-step orchestration. The worker dispatches
|
|
78
|
+
* to a registered saga implementation instead of running `handler` directly.
|
|
79
|
+
*/
|
|
80
|
+
kind?: "atomic" | "saga";
|
|
81
|
+
}
|
|
82
|
+
interface SagaContext {
|
|
83
|
+
actionInvocationId: string;
|
|
84
|
+
tenantId: string;
|
|
85
|
+
spaceId: string;
|
|
86
|
+
parameters: unknown;
|
|
87
|
+
sleep?: (delayMs: number) => Promise<void>;
|
|
88
|
+
query?: <T = unknown>(model: string, operation: string, args: unknown) => Promise<T>;
|
|
89
|
+
}
|
|
90
|
+
interface SagaChildActionInput {
|
|
91
|
+
suffix: string;
|
|
92
|
+
actionId: string;
|
|
93
|
+
parameters: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
type SagaRunChild = (input: SagaChildActionInput) => Promise<Record<string, unknown>>;
|
|
96
|
+
interface SagaCompletionEvent {
|
|
97
|
+
eventType: string;
|
|
98
|
+
subjectType: string;
|
|
99
|
+
subjectId: string;
|
|
100
|
+
payload: unknown;
|
|
101
|
+
eventSchemaVersion?: number;
|
|
102
|
+
}
|
|
103
|
+
interface SagaCompletion {
|
|
104
|
+
resultData: Record<string, unknown>;
|
|
105
|
+
event?: SagaCompletionEvent;
|
|
106
|
+
}
|
|
107
|
+
type SagaImplementation = (ctx: SagaContext, runChild: SagaRunChild) => Promise<SagaCompletion>;
|
|
108
|
+
declare function assertActionId(actionId: string): asserts actionId is ActionId;
|
|
109
|
+
declare function registerAction(definition: ActionDefinition): void;
|
|
110
|
+
declare function resolveAction(actionId: ActionId): ActionDefinition | undefined;
|
|
111
|
+
declare function isRegisteredActionId(actionId: string): actionId is ActionId;
|
|
112
|
+
declare function resolveRegisteredAction(actionId: string): ActionDefinition | undefined;
|
|
113
|
+
declare function getRegisteredActionIds(): ActionId[];
|
|
114
|
+
declare function registerActionIfMissing(definition: ActionDefinition): void;
|
|
115
|
+
|
|
116
|
+
export { ACTOR_TYPES, type ActionContext, type ActionDefinition, type ActionHandler, type ActionId, type ActionResult, type ActionStateMachineBinding, type ActionStatus, type ActorType, type AdapterStep, type AdapterStepRetryPolicy, type FabricRuntimeServices, type SagaChildActionInput, type SagaCompletion, type SagaCompletionEvent, type SagaContext, type SagaImplementation, type SagaRunChild, type SchemaParseIssue, type SchemaParseResult, type SchemaValidator, assertActionId, assertActorType, getRegisteredActionIds, isActorType, isRegisteredActionId, registerAction, registerActionIfMissing, resolveAction, resolveRegisteredAction };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkNPVIFZQV_cjs = require('../chunk-NPVIFZQV.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "AdapterRegistry", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkNPVIFZQV_cjs.AdapterRegistry; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "MissingAdapterRegistrationError", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkNPVIFZQV_cjs.MissingAdapterRegistrationError; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "executeWithAdapterRetry", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkNPVIFZQV_cjs.executeWithAdapterRetry; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "getRetryDelayMs", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkNPVIFZQV_cjs.getRetryDelayMs; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "resolveAdapterRetryPolicy", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunkNPVIFZQV_cjs.resolveAdapterRetryPolicy; }
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=index.cjs.map
|
|
28
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
interface AdapterExecutionContext {
|
|
2
|
+
tenantId: string;
|
|
3
|
+
spaceId: string;
|
|
4
|
+
actionInvocationId: string;
|
|
5
|
+
adapterInvocationId: string;
|
|
6
|
+
correlationId: string;
|
|
7
|
+
causationId?: string;
|
|
8
|
+
attempt: number;
|
|
9
|
+
maxAttempts: number;
|
|
10
|
+
}
|
|
11
|
+
interface AdapterExecutionResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
correlationId?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
type AdapterExecutor = (input: Record<string, unknown>, context: AdapterExecutionContext) => Promise<AdapterExecutionResult>;
|
|
17
|
+
interface AdapterRetryPolicy {
|
|
18
|
+
/** External calls must explicitly opt into retry by being idempotent. */
|
|
19
|
+
idempotent: boolean;
|
|
20
|
+
/** Total attempts including the first call. Non-idempotent policies are forced to 1. */
|
|
21
|
+
maxAttempts?: number;
|
|
22
|
+
/** First backoff delay in milliseconds. */
|
|
23
|
+
initialDelayMs?: number;
|
|
24
|
+
/** Exponential multiplier applied after each failed attempt. */
|
|
25
|
+
backoffMultiplier?: number;
|
|
26
|
+
/** Upper bound for any single retry delay in milliseconds. */
|
|
27
|
+
maxDelayMs?: number;
|
|
28
|
+
}
|
|
29
|
+
interface ResolvedAdapterRetryPolicy {
|
|
30
|
+
idempotent: boolean;
|
|
31
|
+
maxAttempts: number;
|
|
32
|
+
initialDelayMs: number;
|
|
33
|
+
backoffMultiplier: number;
|
|
34
|
+
maxDelayMs: number;
|
|
35
|
+
}
|
|
36
|
+
interface AdapterCircuitBreakerConfig {
|
|
37
|
+
mode: "monitor" | "enforce";
|
|
38
|
+
failureThreshold: number;
|
|
39
|
+
windowMs: number;
|
|
40
|
+
cooldownMs: number;
|
|
41
|
+
minimumSamples?: number;
|
|
42
|
+
}
|
|
43
|
+
interface AdapterImplementation {
|
|
44
|
+
adapterType: string;
|
|
45
|
+
operation: string;
|
|
46
|
+
vendor: string;
|
|
47
|
+
/** Whether this adapter operation can be safely retried by default. */
|
|
48
|
+
idempotent: boolean;
|
|
49
|
+
retryPolicy?: AdapterRetryPolicy;
|
|
50
|
+
/** Defaults to monitor-only; enforce mode must be explicitly configured. */
|
|
51
|
+
circuitBreaker?: AdapterCircuitBreakerConfig;
|
|
52
|
+
execute: AdapterExecutor;
|
|
53
|
+
}
|
|
54
|
+
interface AdapterAttempt<T> {
|
|
55
|
+
attempt: number;
|
|
56
|
+
result?: T;
|
|
57
|
+
error?: string;
|
|
58
|
+
willRetry: boolean;
|
|
59
|
+
nextDelayMs?: number;
|
|
60
|
+
}
|
|
61
|
+
interface ExecuteWithRetryOptions<T> {
|
|
62
|
+
policy?: AdapterRetryPolicy;
|
|
63
|
+
defaultIdempotent: boolean;
|
|
64
|
+
execute: (attempt: number, maxAttempts: number) => Promise<T>;
|
|
65
|
+
isSuccessful: (result: T) => boolean;
|
|
66
|
+
getError: (result: T) => string | undefined;
|
|
67
|
+
sleep?: (delayMs: number) => Promise<void>;
|
|
68
|
+
onAttempt?: (attempt: AdapterAttempt<T>) => Promise<void> | void;
|
|
69
|
+
}
|
|
70
|
+
declare class MissingAdapterRegistrationError extends Error {
|
|
71
|
+
constructor(adapterType: string, operation: string);
|
|
72
|
+
}
|
|
73
|
+
declare class AdapterRegistry {
|
|
74
|
+
private readonly adapters;
|
|
75
|
+
register(adapter: AdapterImplementation): void;
|
|
76
|
+
resolve(adapterType: string, operation: string): AdapterImplementation | undefined;
|
|
77
|
+
require(adapterType: string, operation: string): AdapterImplementation;
|
|
78
|
+
}
|
|
79
|
+
declare function resolveAdapterRetryPolicy(policy: AdapterRetryPolicy | undefined, defaultIdempotent: boolean): ResolvedAdapterRetryPolicy;
|
|
80
|
+
declare function getRetryDelayMs(attempt: number, policy: ResolvedAdapterRetryPolicy): number;
|
|
81
|
+
declare function executeWithAdapterRetry<T>(options: ExecuteWithRetryOptions<T>): Promise<T>;
|
|
82
|
+
|
|
83
|
+
export { type AdapterAttempt, type AdapterCircuitBreakerConfig, type AdapterExecutionContext, type AdapterExecutionResult, type AdapterExecutor, type AdapterImplementation, AdapterRegistry, type AdapterRetryPolicy, type ExecuteWithRetryOptions, MissingAdapterRegistrationError, type ResolvedAdapterRetryPolicy, executeWithAdapterRetry, getRetryDelayMs, resolveAdapterRetryPolicy };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var assert = require('assert');
|
|
4
|
+
|
|
5
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var assert__default = /*#__PURE__*/_interopDefault(assert);
|
|
9
|
+
|
|
10
|
+
// displays/index.ts
|
|
11
|
+
var registry = /* @__PURE__ */ new Map();
|
|
12
|
+
function registerDisplayRenderer(eventType, renderer) {
|
|
13
|
+
registry.set(eventType, renderer);
|
|
14
|
+
}
|
|
15
|
+
function resolveDisplayRenderer(eventType) {
|
|
16
|
+
return registry.get(eventType);
|
|
17
|
+
}
|
|
18
|
+
function denormalizeDisplaySnapshot(payload) {
|
|
19
|
+
if (payload !== null && typeof payload === "object" && "_displaySnapshot" in payload && payload._displaySnapshot !== null && typeof payload._displaySnapshot === "object" && "title" in payload._displaySnapshot) {
|
|
20
|
+
return payload._displaySnapshot;
|
|
21
|
+
}
|
|
22
|
+
if (payload !== null && typeof payload === "object" && "_projectionSnapshot" in payload && payload._projectionSnapshot !== null && typeof payload._projectionSnapshot === "object" && "display" in payload._projectionSnapshot && payload._projectionSnapshot.display !== null && typeof payload._projectionSnapshot.display === "object" && "title" in payload._projectionSnapshot.display) {
|
|
23
|
+
const snapshot = payload._projectionSnapshot;
|
|
24
|
+
return {
|
|
25
|
+
...snapshot.display,
|
|
26
|
+
_cachedDisplay: {
|
|
27
|
+
source: "projection_snapshot",
|
|
28
|
+
cursor: snapshot.eventCursor,
|
|
29
|
+
checksum: snapshot.checksum,
|
|
30
|
+
generatedAt: snapshot.updatedAt
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return void 0;
|
|
35
|
+
}
|
|
36
|
+
async function renderEventDisplay(eventType, payload, ctx) {
|
|
37
|
+
const snapshot = denormalizeDisplaySnapshot(payload);
|
|
38
|
+
if (snapshot) {
|
|
39
|
+
return snapshot;
|
|
40
|
+
}
|
|
41
|
+
const renderer = resolveDisplayRenderer(eventType);
|
|
42
|
+
if (!renderer) {
|
|
43
|
+
return {
|
|
44
|
+
title: eventType,
|
|
45
|
+
subtitle: "No display renderer registered for this event type."
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return await renderer(payload, ctx);
|
|
49
|
+
}
|
|
50
|
+
async function _runInlineTests() {
|
|
51
|
+
const testEventType = "__TestEvent__";
|
|
52
|
+
registerDisplayRenderer(testEventType, (payload) => ({
|
|
53
|
+
title: `Test: ${payload.name}`,
|
|
54
|
+
subtitle: "registered renderer"
|
|
55
|
+
}));
|
|
56
|
+
const renderer = resolveDisplayRenderer(testEventType);
|
|
57
|
+
assert__default.default.ok(renderer, "resolveDisplayRenderer should return the registered renderer");
|
|
58
|
+
const result = await renderEventDisplay(testEventType, { name: "Alice" });
|
|
59
|
+
assert__default.default.strictEqual(result.title, "Test: Alice");
|
|
60
|
+
assert__default.default.strictEqual(result.subtitle, "registered renderer");
|
|
61
|
+
const snapshot = {
|
|
62
|
+
title: "Snapshot Title",
|
|
63
|
+
subtitle: "snapshot subtitle",
|
|
64
|
+
stateLabel: "archived",
|
|
65
|
+
primaryFacts: [{ label: "ID", value: "123" }]
|
|
66
|
+
};
|
|
67
|
+
const snapshotResult = await renderEventDisplay(testEventType, {
|
|
68
|
+
_displaySnapshot: snapshot
|
|
69
|
+
});
|
|
70
|
+
assert__default.default.deepStrictEqual(snapshotResult, snapshot);
|
|
71
|
+
const fallback = await renderEventDisplay("__UnknownEvent__", {});
|
|
72
|
+
assert__default.default.strictEqual(fallback.title, "__UnknownEvent__");
|
|
73
|
+
assert__default.default.strictEqual(fallback.subtitle, "No display renderer registered for this event type.");
|
|
74
|
+
registerDisplayRenderer("__AsyncEvent__", async (_payload, ctx) => {
|
|
75
|
+
return {
|
|
76
|
+
title: `Async: ${ctx?.tenantId ?? "no-ctx"}`
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
const asyncResult = await renderEventDisplay(
|
|
80
|
+
"__AsyncEvent__",
|
|
81
|
+
{},
|
|
82
|
+
{ tenantId: "t-1", spaceId: "s-1", db: {} }
|
|
83
|
+
);
|
|
84
|
+
assert__default.default.strictEqual(asyncResult.title, "Async: t-1");
|
|
85
|
+
console.log("\u2705 display engine inline tests passed");
|
|
86
|
+
}
|
|
87
|
+
if ((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-7KJHGAZY.cjs', document.baseURI).href)) === `file://${process.argv[1]}`) {
|
|
88
|
+
_runInlineTests().catch((err) => {
|
|
89
|
+
console.error("\u274C display engine inline tests failed", err);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
exports.denormalizeDisplaySnapshot = denormalizeDisplaySnapshot;
|
|
95
|
+
exports.registerDisplayRenderer = registerDisplayRenderer;
|
|
96
|
+
exports.renderEventDisplay = renderEventDisplay;
|
|
97
|
+
exports.resolveDisplayRenderer = resolveDisplayRenderer;
|
|
98
|
+
//# sourceMappingURL=chunk-7KJHGAZY.cjs.map
|
|
99
|
+
//# sourceMappingURL=chunk-7KJHGAZY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../displays/index.ts"],"names":["assert"],"mappings":"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","file":"chunk-7KJHGAZY.cjs","sourcesContent":["import assert from \"node:assert\";\n\nexport interface DisplayDescriptor {\n\ttitle: string;\n\tsubtitle?: string;\n\tstateLabel?: string;\n\tprimaryFacts?: Array<{ label: string; value: string }>;\n}\n\nexport interface CachedDisplayDescriptor extends DisplayDescriptor {\n\t_cachedDisplay?: {\n\t\tsource: \"event_payload\" | \"projection_snapshot\";\n\t\tcursor?: string | null;\n\t\tchecksum?: string;\n\t\tgeneratedAt?: string;\n\t};\n}\n\nexport type DisplayDatabaseClient = any;\n\nexport interface DisplayContext<TDb = DisplayDatabaseClient> {\n\ttenantId: string;\n\tspaceId: string;\n\tdb: TDb;\n}\n\nexport type DisplayRenderer = (\n\tpayload: unknown,\n\tctx?: DisplayContext,\n) => DisplayDescriptor | Promise<DisplayDescriptor>;\n\nexport interface DisplayRendererRegistration {\n\teventType: string;\n\trenderer: DisplayRenderer;\n}\n\nconst registry = new Map<string, DisplayRenderer>();\n\nexport function registerDisplayRenderer(eventType: string, renderer: DisplayRenderer): void {\n\tregistry.set(eventType, renderer);\n}\n\nexport function resolveDisplayRenderer(eventType: string): DisplayRenderer | undefined {\n\treturn registry.get(eventType);\n}\n\nexport function denormalizeDisplaySnapshot(payload: unknown): CachedDisplayDescriptor | undefined {\n\tif (\n\t\tpayload !== null &&\n\t\ttypeof payload === \"object\" &&\n\t\t\"_displaySnapshot\" in payload &&\n\t\tpayload._displaySnapshot !== null &&\n\t\ttypeof payload._displaySnapshot === \"object\" &&\n\t\t\"title\" in payload._displaySnapshot\n\t) {\n\t\treturn payload._displaySnapshot as CachedDisplayDescriptor;\n\t}\n\n\tif (\n\t\tpayload !== null &&\n\t\ttypeof payload === \"object\" &&\n\t\t\"_projectionSnapshot\" in payload &&\n\t\tpayload._projectionSnapshot !== null &&\n\t\ttypeof payload._projectionSnapshot === \"object\" &&\n\t\t\"display\" in payload._projectionSnapshot &&\n\t\tpayload._projectionSnapshot.display !== null &&\n\t\ttypeof payload._projectionSnapshot.display === \"object\" &&\n\t\t\"title\" in payload._projectionSnapshot.display\n\t) {\n\t\tconst snapshot = payload._projectionSnapshot as {\n\t\t\tdisplay: DisplayDescriptor;\n\t\t\teventCursor?: string | null;\n\t\t\tchecksum?: string;\n\t\t\tupdatedAt?: string;\n\t\t};\n\t\treturn {\n\t\t\t...snapshot.display,\n\t\t\t_cachedDisplay: {\n\t\t\t\tsource: \"projection_snapshot\",\n\t\t\t\tcursor: snapshot.eventCursor,\n\t\t\t\tchecksum: snapshot.checksum,\n\t\t\t\tgeneratedAt: snapshot.updatedAt,\n\t\t\t},\n\t\t};\n\t}\n\treturn undefined;\n}\n\nexport async function renderEventDisplay(\n\teventType: string,\n\tpayload: unknown,\n\tctx?: DisplayContext,\n): Promise<CachedDisplayDescriptor> {\n\tconst snapshot = denormalizeDisplaySnapshot(payload);\n\tif (snapshot) {\n\t\treturn snapshot;\n\t}\n\n\tconst renderer = resolveDisplayRenderer(eventType);\n\tif (!renderer) {\n\t\treturn {\n\t\t\ttitle: eventType,\n\t\t\tsubtitle: \"No display renderer registered for this event type.\",\n\t\t};\n\t}\n\n\treturn await renderer(payload, ctx);\n}\n\n// Inline test: verify registry round-trip, snapshot denormalization, and fallback.\nasync function _runInlineTests(): Promise<void> {\n\tconst testEventType = \"__TestEvent__\";\n\n\t// 1. Registry round-trip\n\tregisterDisplayRenderer(testEventType, (payload) => ({\n\t\ttitle: `Test: ${(payload as { name: string }).name}`,\n\t\tsubtitle: \"registered renderer\",\n\t}));\n\n\tconst renderer = resolveDisplayRenderer(testEventType);\n\tassert.ok(renderer, \"resolveDisplayRenderer should return the registered renderer\");\n\n\tconst result = await renderEventDisplay(testEventType, { name: \"Alice\" });\n\tassert.strictEqual(result.title, \"Test: Alice\");\n\tassert.strictEqual(result.subtitle, \"registered renderer\");\n\n\t// 2. Snapshot denormalization takes precedence over renderer\n\tconst snapshot: DisplayDescriptor = {\n\t\ttitle: \"Snapshot Title\",\n\t\tsubtitle: \"snapshot subtitle\",\n\t\tstateLabel: \"archived\",\n\t\tprimaryFacts: [{ label: \"ID\", value: \"123\" }],\n\t};\n\tconst snapshotResult = await renderEventDisplay(testEventType, {\n\t\t_displaySnapshot: snapshot,\n\t});\n\tassert.deepStrictEqual(snapshotResult, snapshot);\n\n\t// 3. Fallback for unregistered event type\n\tconst fallback = await renderEventDisplay(\"__UnknownEvent__\", {});\n\tassert.strictEqual(fallback.title, \"__UnknownEvent__\");\n\tassert.strictEqual(fallback.subtitle, \"No display renderer registered for this event type.\");\n\n\t// 4. Async renderer with context\n\tregisterDisplayRenderer(\"__AsyncEvent__\", async (_payload, ctx) => {\n\t\treturn {\n\t\t\ttitle: `Async: ${ctx?.tenantId ?? \"no-ctx\"}`,\n\t\t};\n\t});\n\tconst asyncResult = await renderEventDisplay(\n\t\t\"__AsyncEvent__\",\n\t\t{},\n\t\t{ tenantId: \"t-1\", spaceId: \"s-1\", db: {} },\n\t);\n\tassert.strictEqual(asyncResult.title, \"Async: t-1\");\n\n\tconsole.log(\"✅ display engine inline tests passed\");\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n\t_runInlineTests().catch((err) => {\n\t\tconsole.error(\"❌ display engine inline tests failed\", err);\n\t\tprocess.exit(1);\n\t});\n}\n"]}
|
|
@@ -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
|