@fabricorg/platform-host 0.3.0 → 0.3.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.
- package/CHANGELOG.md +6 -0
- package/README.md +5 -0
- package/dist/index.cjs +68 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +68 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @fabricorg/platform-host
|
|
2
2
|
|
|
3
|
+
## 0.3.1 — 2026-07-19
|
|
4
|
+
|
|
5
|
+
- Make policy, event, and adapter checkpoints deterministic and replay-safe.
|
|
6
|
+
- Resume idempotent interrupted actions without repeating succeeded adapters.
|
|
7
|
+
- Fail stale non-idempotent work terminally for explicit operator reconciliation.
|
|
8
|
+
|
|
3
9
|
## 0.3.0 — 2026-07-19
|
|
4
10
|
|
|
5
11
|
- Add tenant-scoped stable command idempotency and terminal replay.
|
package/README.md
CHANGED
|
@@ -24,6 +24,11 @@ bounded batches with an atomic lease and `FOR UPDATE SKIP LOCKED`, and an expire
|
|
|
24
24
|
recoverable after interruption. Pass a stable `idempotencyKey` to `submitAction()` so retries resolve
|
|
25
25
|
to the original tenant-scoped invocation instead of creating another mutation.
|
|
26
26
|
|
|
27
|
+
Lifecycle records use deterministic checkpoint ids. Recovered idempotent actions do not repeat an
|
|
28
|
+
adapter that already reached `succeeded`, and event, policy, and adapter writes are append-safe. A
|
|
29
|
+
stale action that was not declared idempotent fails terminally for manual reconciliation instead of
|
|
30
|
+
silently rerunning unknown side effects.
|
|
31
|
+
|
|
27
32
|
Sensitive values must not be passed as action parameters. Stage them in tenant-bound encrypted storage
|
|
28
33
|
and pass an opaque identifier instead; action parameters are intentionally durable audit evidence.
|
|
29
34
|
Hosts should additionally configure `redactActionParameters` as a fail-safe allowlist for actions
|
package/dist/index.cjs
CHANGED
|
@@ -101,6 +101,13 @@ function createGovernedActionHost(options) {
|
|
|
101
101
|
if (!action) {
|
|
102
102
|
return fail(invocation, "failed", `Unknown action: ${invocation.actionId}`);
|
|
103
103
|
}
|
|
104
|
+
if (invocation.attemptCount > 1 && !action.idempotent) {
|
|
105
|
+
return fail(
|
|
106
|
+
invocation,
|
|
107
|
+
"failed",
|
|
108
|
+
`Interrupted action ${invocation.actionId} is not declared idempotent; manual reconciliation is required.`
|
|
109
|
+
);
|
|
110
|
+
}
|
|
104
111
|
await options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {
|
|
105
112
|
status: "running"
|
|
106
113
|
});
|
|
@@ -129,7 +136,7 @@ function createGovernedActionHost(options) {
|
|
|
129
136
|
});
|
|
130
137
|
for (const outcome of outcomes) {
|
|
131
138
|
await options.store.appendPolicyEvaluation({
|
|
132
|
-
id:
|
|
139
|
+
id: lifecycleId("pol", actionInvocationId, outcome.policyId),
|
|
133
140
|
actionInvocationId,
|
|
134
141
|
tenantId,
|
|
135
142
|
spaceId,
|
|
@@ -145,7 +152,7 @@ function createGovernedActionHost(options) {
|
|
|
145
152
|
subjectType: "ActionInvocation",
|
|
146
153
|
subjectId: actionInvocationId,
|
|
147
154
|
payload: { actionId: action.actionId, policyId: aggregate.policyId, reason }
|
|
148
|
-
});
|
|
155
|
+
}, `compliance:${aggregate.policyId}`);
|
|
149
156
|
return fail(invocation, "blocked_by_policy", reason);
|
|
150
157
|
}
|
|
151
158
|
const binding = action.stateMachine;
|
|
@@ -164,7 +171,8 @@ function createGovernedActionHost(options) {
|
|
|
164
171
|
targetState,
|
|
165
172
|
action.actionId
|
|
166
173
|
);
|
|
167
|
-
|
|
174
|
+
const replayingAppliedTransition = action.idempotent && currentState === targetState;
|
|
175
|
+
if (!transition.valid && !replayingAppliedTransition) {
|
|
168
176
|
return fail(invocation, "failed", transition.error ?? "Invalid state transition");
|
|
169
177
|
}
|
|
170
178
|
}
|
|
@@ -193,16 +201,22 @@ function createGovernedActionHost(options) {
|
|
|
193
201
|
data = handlerResult.data ?? {};
|
|
194
202
|
domainEvents = extractEvents(data);
|
|
195
203
|
if (action.eventPhase !== "after_adapters") {
|
|
196
|
-
for (const event of domainEvents)
|
|
204
|
+
for (const [index, event] of domainEvents.entries()) {
|
|
205
|
+
await appendEvent(invocation, event, `domain:${index}`);
|
|
206
|
+
}
|
|
197
207
|
}
|
|
198
208
|
} catch (error) {
|
|
199
209
|
return fail(invocation, "failed", errorMessage(error));
|
|
200
210
|
}
|
|
201
|
-
for (const step of action.adapterSteps ?? []) {
|
|
211
|
+
for (const [stepIndex, step] of (action.adapterSteps ?? []).entries()) {
|
|
202
212
|
const input = step.getInput(parsed.data, data);
|
|
203
213
|
if (!input) continue;
|
|
204
214
|
const adapter = adapters.require(step.adapterType, step.operation);
|
|
205
|
-
const adapterInvocationId =
|
|
215
|
+
const adapterInvocationId = lifecycleId("adp", actionInvocationId, String(stepIndex));
|
|
216
|
+
const previousAdapterInvocation = await options.store.getAdapterInvocation(
|
|
217
|
+
adapterInvocationId
|
|
218
|
+
);
|
|
219
|
+
if (previousAdapterInvocation?.status === "succeeded") continue;
|
|
206
220
|
const adapterEventSubject = options.adapterEventSubject?.(
|
|
207
221
|
action.actionId,
|
|
208
222
|
parsed.data,
|
|
@@ -235,7 +249,7 @@ function createGovernedActionHost(options) {
|
|
|
235
249
|
subjectType: adapterEventSubject.subjectType,
|
|
236
250
|
subjectId: adapterEventSubject.subjectId,
|
|
237
251
|
payload: { adapterType: step.adapterType, operation: step.operation }
|
|
238
|
-
});
|
|
252
|
+
}, `adapter:${stepIndex}:started`);
|
|
239
253
|
try {
|
|
240
254
|
const result2 = await platform.executeWithAdapterRetry({
|
|
241
255
|
policy: step.retryPolicy ?? adapter.retryPolicy,
|
|
@@ -270,7 +284,7 @@ function createGovernedActionHost(options) {
|
|
|
270
284
|
subjectType: adapterEventSubject.subjectType,
|
|
271
285
|
subjectId: adapterEventSubject.subjectId,
|
|
272
286
|
payload: { adapterType: step.adapterType, operation: step.operation }
|
|
273
|
-
});
|
|
287
|
+
}, `adapter:${stepIndex}:failed`);
|
|
274
288
|
return fail(invocation, "failed", result2.error ?? "Adapter failed");
|
|
275
289
|
}
|
|
276
290
|
const resultRecord = result2;
|
|
@@ -294,7 +308,7 @@ function createGovernedActionHost(options) {
|
|
|
294
308
|
input: recordedInput,
|
|
295
309
|
output
|
|
296
310
|
}
|
|
297
|
-
});
|
|
311
|
+
}, `adapter:${stepIndex}:succeeded`);
|
|
298
312
|
} catch (error) {
|
|
299
313
|
const message = errorMessage(error);
|
|
300
314
|
await options.store.updateAdapterInvocation(adapterInvocationId, {
|
|
@@ -306,7 +320,9 @@ function createGovernedActionHost(options) {
|
|
|
306
320
|
}
|
|
307
321
|
}
|
|
308
322
|
if (action.eventPhase === "after_adapters") {
|
|
309
|
-
for (const event of domainEvents)
|
|
323
|
+
for (const [index, event] of domainEvents.entries()) {
|
|
324
|
+
await appendEvent(invocation, event, `domain:${index}`);
|
|
325
|
+
}
|
|
310
326
|
}
|
|
311
327
|
const result = withoutPrivateHostFields(data);
|
|
312
328
|
await options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {
|
|
@@ -318,10 +334,10 @@ function createGovernedActionHost(options) {
|
|
|
318
334
|
return fail(invocation, "failed", errorMessage(error));
|
|
319
335
|
}
|
|
320
336
|
}
|
|
321
|
-
async function appendEvent(invocation, event) {
|
|
337
|
+
async function appendEvent(invocation, event, deduplicationKey) {
|
|
322
338
|
const timestamp = now();
|
|
323
339
|
const envelope = {
|
|
324
|
-
id:
|
|
340
|
+
id: lifecycleId("evt", invocation.id, deduplicationKey),
|
|
325
341
|
tenantId: invocation.tenantId,
|
|
326
342
|
spaceId: invocation.spaceId,
|
|
327
343
|
eventType: event.eventType,
|
|
@@ -391,6 +407,10 @@ function errorMessage(error) {
|
|
|
391
407
|
function isRecord(value) {
|
|
392
408
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
393
409
|
}
|
|
410
|
+
function lifecycleId(prefix, invocationId, key) {
|
|
411
|
+
const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 96);
|
|
412
|
+
return `${prefix}_${invocationId}_${safeKey}`;
|
|
413
|
+
}
|
|
394
414
|
|
|
395
415
|
// src/memory-store.ts
|
|
396
416
|
var MemoryPlatformHostStore = class {
|
|
@@ -428,17 +448,23 @@ var MemoryPlatformHostStore = class {
|
|
|
428
448
|
Object.assign(record, patch, { updatedAt: /* @__PURE__ */ new Date() });
|
|
429
449
|
}
|
|
430
450
|
async appendPolicyEvaluation(record) {
|
|
451
|
+
if (this.policyEvaluations.some((candidate) => candidate.id === record.id)) return;
|
|
431
452
|
this.policyEvaluations.push(record);
|
|
432
453
|
}
|
|
433
454
|
async createAdapterInvocation(record) {
|
|
455
|
+
if (this.adapterInvocations.some((candidate) => candidate.id === record.id)) return;
|
|
434
456
|
this.adapterInvocations.push(record);
|
|
435
457
|
}
|
|
458
|
+
async getAdapterInvocation(id) {
|
|
459
|
+
return this.adapterInvocations.find((candidate) => candidate.id === id);
|
|
460
|
+
}
|
|
436
461
|
async updateAdapterInvocation(id, patch) {
|
|
437
462
|
const record = this.adapterInvocations.find((candidate) => candidate.id === id);
|
|
438
463
|
if (!record) throw new Error(`AdapterInvocation not found: ${id}`);
|
|
439
464
|
Object.assign(record, patch);
|
|
440
465
|
}
|
|
441
466
|
async appendEvent(event) {
|
|
467
|
+
if (this.events.some((candidate) => candidate.id === event.id)) return;
|
|
442
468
|
this.events.push(event);
|
|
443
469
|
}
|
|
444
470
|
async nextEventSequence(tenantId, spaceId) {
|
|
@@ -609,7 +635,7 @@ var PostgresPlatformHostStore = class {
|
|
|
609
635
|
await this.sql.query(
|
|
610
636
|
`INSERT INTO fabric_platform.policy_evaluations
|
|
611
637
|
(id,action_invocation_id,tenant_id,space_id,outcome,created_at)
|
|
612
|
-
VALUES ($1,$2,$3,$4,$5::jsonb,$6)`,
|
|
638
|
+
VALUES ($1,$2,$3,$4,$5::jsonb,$6) ON CONFLICT (id) DO NOTHING`,
|
|
613
639
|
[
|
|
614
640
|
record.id,
|
|
615
641
|
record.actionInvocationId,
|
|
@@ -625,7 +651,8 @@ var PostgresPlatformHostStore = class {
|
|
|
625
651
|
`INSERT INTO fabric_platform.adapter_invocations
|
|
626
652
|
(id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,
|
|
627
653
|
input,output,error,attempt,created_at,updated_at)
|
|
628
|
-
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)
|
|
654
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)
|
|
655
|
+
ON CONFLICT (id) DO NOTHING`,
|
|
629
656
|
[
|
|
630
657
|
record.id,
|
|
631
658
|
record.actionInvocationId,
|
|
@@ -644,6 +671,13 @@ var PostgresPlatformHostStore = class {
|
|
|
644
671
|
]
|
|
645
672
|
);
|
|
646
673
|
}
|
|
674
|
+
async getAdapterInvocation(id) {
|
|
675
|
+
const result = await this.sql.query(
|
|
676
|
+
`SELECT * FROM fabric_platform.adapter_invocations WHERE id=$1`,
|
|
677
|
+
[id]
|
|
678
|
+
);
|
|
679
|
+
return result.rows[0] ? toAdapterRecord(result.rows[0]) : void 0;
|
|
680
|
+
}
|
|
647
681
|
async updateAdapterInvocation(id, patch) {
|
|
648
682
|
await this.sql.query(
|
|
649
683
|
`UPDATE fabric_platform.adapter_invocations SET
|
|
@@ -667,7 +701,8 @@ var PostgresPlatformHostStore = class {
|
|
|
667
701
|
(id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,
|
|
668
702
|
actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,
|
|
669
703
|
correlation_id,causation_id)
|
|
670
|
-
|
|
704
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)
|
|
705
|
+
ON CONFLICT (id) DO NOTHING`,
|
|
671
706
|
[
|
|
672
707
|
event.id,
|
|
673
708
|
event.tenantId,
|
|
@@ -767,6 +802,24 @@ var PostgresPlatformHostStore = class {
|
|
|
767
802
|
return result.rows.map(toEventRecord);
|
|
768
803
|
}
|
|
769
804
|
};
|
|
805
|
+
function toAdapterRecord(row) {
|
|
806
|
+
return {
|
|
807
|
+
id: String(row.id),
|
|
808
|
+
actionInvocationId: String(row.action_invocation_id),
|
|
809
|
+
tenantId: String(row.tenant_id),
|
|
810
|
+
spaceId: String(row.space_id),
|
|
811
|
+
adapterType: String(row.adapter_type),
|
|
812
|
+
operation: String(row.operation),
|
|
813
|
+
vendor: String(row.vendor),
|
|
814
|
+
status: String(row.status),
|
|
815
|
+
input: row.input,
|
|
816
|
+
...row.output ? { output: row.output } : {},
|
|
817
|
+
...row.error ? { error: String(row.error) } : {},
|
|
818
|
+
attempt: Number(row.attempt),
|
|
819
|
+
createdAt: new Date(row.created_at),
|
|
820
|
+
updatedAt: new Date(row.updated_at)
|
|
821
|
+
};
|
|
822
|
+
}
|
|
770
823
|
function toActionRecord(row) {
|
|
771
824
|
return {
|
|
772
825
|
id: String(row.id),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/host.ts","../src/memory-store.ts","../src/postgres-store.ts","../src/worker.ts"],"names":["AdapterRegistry","resolveAction","createFabricId","evaluatePolicyDefinitions","aggregatePolicyOutcomes","validateTransition","result","executeWithAdapterRetry","resolveStateMachine","record"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n\tAdapterRegistry,\n\taggregatePolicyOutcomes,\n\tcreateFabricId,\n\tevaluatePolicyDefinitions,\n\texecuteWithAdapterRetry,\n\tresolveAction,\n\tresolveStateMachine,\n\tvalidateTransition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionDefinition,\n\tActionId,\n\tActionStatus,\n\tAssetEventEnvelope,\n\tRuntimePolicyDefinition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionAuthorizationInput,\n\tAdapterInvocationRecord,\n\tExecuteActionResult,\n\tGovernedActionHost,\n\tPendingAssetEvent,\n\tPlatformHostOptions,\n\tSubmitActionInput,\n\tSubmitActionResult,\n} from \"./types\";\n\nconst DEFAULT_EXTRACT_EVENTS = (data: Record<string, unknown>): PendingAssetEvent[] => {\n\tconst value = data._events;\n\treturn Array.isArray(value) ? (value as PendingAssetEvent[]) : [];\n};\n\nexport function createGovernedActionHost<TDb>(\n\toptions: PlatformHostOptions<TDb>,\n): GovernedActionHost {\n\tconst adapters = new AdapterRegistry();\n\tfor (const adapter of options.adapters ?? []) adapters.register(adapter);\n\tconst now = options.now ?? (() => new Date());\n\tconst extractEvents = options.extractEvents ?? DEFAULT_EXTRACT_EVENTS;\n\n\tasync function submitAction(input: SubmitActionInput): Promise<SubmitActionResult> {\n\t\tconst action = resolveAction(input.actionId);\n\t\tif (!action) throw new Error(`Unknown action: ${input.actionId}`);\n\t\tconst authorizationInput = toAuthorizationInput(action, input);\n\t\tif (!(await options.authorization.checkEntitlement(authorizationInput))) {\n\t\t\tthrow new Error(`Module \"${action.namespace}\" is not enabled for tenant ${input.tenantId}`);\n\t\t}\n\t\tif (!(await options.authorization.authorize(authorizationInput))) {\n\t\t\tthrow new Error(`Actor ${input.actorId} is not authorized for action ${input.actionId}`);\n\t\t}\n\n\t\tconst actionInvocationId = createFabricId(\"act\");\n\t\tconst correlationId = input.correlationId ?? createFabricId(\"corr\");\n\t\tconst durableParameters = options.redactActionParameters\n\t\t\t? options.redactActionParameters(input.actionId, input.parameters)\n\t\t\t: input.parameters;\n\t\tconst durableInvocation = await options.store.createActionInvocation({\n\t\t\tid: actionInvocationId,\n\t\t\ttenantId: input.tenantId,\n\t\t\tspaceId: input.spaceId,\n\t\t\tactionId: input.actionId,\n\t\t\tactionVersion: action.version,\n\t\t\tactorId: input.actorId,\n\t\t\tactorType: input.actorType,\n\t\t\tstatus: \"pending\",\n\t\t\tparameters: durableParameters,\n\t\t\tresult: {},\n\t\t\tcorrelationId,\n\t\t\t...(input.causationId ? { causationId: input.causationId } : {}),\n\t\t\t...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n\t\t});\n\t\tconst durableWorkflowId = `action-invocation-${durableInvocation.id}`;\n\t\tif (durableInvocation.id !== actionInvocationId && isTerminal(durableInvocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\tresult: durableInvocation.result,\n\t\t\t\t...(durableInvocation.error ? { error: durableInvocation.error } : {}),\n\t\t\t};\n\t\t}\n\n\t\tif (options.dispatcher) {\n\t\t\ttry {\n\t\t\t\tconst dispatched = await options.dispatcher.dispatch({\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\ttenantId: input.tenantId,\n\t\t\t\t\tspaceId: input.spaceId,\n\t\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\t\tworkflowId: dispatched.workflowId,\n\t\t\t\t\t...(dispatched.runId ? { runId: dispatched.runId } : {}),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateActionInvocation(\n\t\t\t\t\tdurableInvocation.id,\n\t\t\t\t\tinput.tenantId,\n\t\t\t\t\tinput.spaceId,\n\t\t\t\t\t{ status: \"failed\", error: message },\n\t\t\t\t);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst executed = await executeInvocation(\n\t\t\tdurableInvocation.id,\n\t\t\tinput.tenantId,\n\t\t\tinput.spaceId,\n\t\t);\n\t\treturn { ...executed, workflowId: durableWorkflowId };\n\t}\n\n\tasync function executeInvocation(\n\t\tactionInvocationId: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ExecuteActionResult> {\n\t\tconst invocation = await options.store.getActionInvocation(\n\t\t\tactionInvocationId,\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t);\n\t\tif (!invocation) throw new Error(`ActionInvocation not found: ${actionInvocationId}`);\n\t\tif (isTerminal(invocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId,\n\t\t\t\tstatus: invocation.status,\n\t\t\t\tresult: invocation.result,\n\t\t\t\t...(invocation.error ? { error: invocation.error } : {}),\n\t\t\t};\n\t\t}\n\t\tconst action = resolveAction(invocation.actionId);\n\t\tif (!action) {\n\t\t\treturn fail(invocation, \"failed\", `Unknown action: ${invocation.actionId}`);\n\t\t}\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"running\",\n\t\t});\n\t\ttry {\n\n\t\tconst parsed = action.schema.safeParse(invocation.parameters);\n\t\tif (!parsed.success) {\n\t\t\tconst message = parsed.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n\t\t\t\t.join(\"; \");\n\t\t\treturn fail(invocation, \"validation_failed\", message);\n\t\t}\n\n\t\tconst authorizationInput = toAuthorizationInput(action, invocation);\n\t\tconst definitions = options.resolvePolicies\n\t\t\t? await options.resolvePolicies({\n\t\t\t\t\t...authorizationInput,\n\t\t\t\t\tdeclaredPolicyIds: action.policies ?? [],\n\t\t\t\t})\n\t\t\t: declaredPolicies(action.policies ?? []);\n\t\tconst outcomes = await evaluatePolicyDefinitions(definitions, {\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t\tactionInvocationId,\n\t\t\tactionId: action.actionId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tparameters: parsed.data,\n\t\t\tdb: options.store.db,\n\t\t\tservices: options.services,\n\t\t\tmode: \"execute\",\n\t\t});\n\t\tfor (const outcome of outcomes) {\n\t\t\tawait options.store.appendPolicyEvaluation({\n\t\t\t\tid: createFabricId(\"pol\"),\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\toutcome,\n\t\t\t\tcreatedAt: now(),\n\t\t\t});\n\t\t}\n\t\tconst aggregate = aggregatePolicyOutcomes(outcomes);\n\t\tif (aggregate?.result === \"block\") {\n\t\t\tconst reason = aggregate.reason ?? `Blocked by policy ${aggregate.policyId}`;\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"ComplianceBlocked\",\n\t\t\t\tsubjectType: \"ActionInvocation\",\n\t\t\t\tsubjectId: actionInvocationId,\n\t\t\t\tpayload: { actionId: action.actionId, policyId: aggregate.policyId, reason },\n\t\t\t});\n\t\t\treturn fail(invocation, \"blocked_by_policy\", reason);\n\t\t}\n\n\t\tconst binding = action.stateMachine;\n\t\tif (binding) {\n\t\t\tconst entityId = binding.getEntityId(parsed.data);\n\t\t\tconst currentState = entityId\n\t\t\t\t? ((await options.store.getEntityState(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\tbinding.entityType,\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t)) ?? initialState(binding.entityType))\n\t\t\t\t: initialState(binding.entityType);\n\t\t\tconst targetState =\n\t\t\t\ttypeof binding.targetState === \"function\"\n\t\t\t\t\t? binding.targetState(parsed.data)\n\t\t\t\t\t: binding.targetState;\n\t\t\tconst transition = validateTransition(\n\t\t\t\tbinding.entityType,\n\t\t\t\tcurrentState,\n\t\t\t\ttargetState,\n\t\t\t\taction.actionId,\n\t\t\t);\n\t\t\tif (!transition.valid) {\n\t\t\t\treturn fail(invocation, \"failed\", transition.error ?? \"Invalid state transition\");\n\t\t\t}\n\t\t}\n\n\t\tlet data: Record<string, unknown>;\n\t\tlet domainEvents: PendingAssetEvent[] = [];\n\t\ttry {\n\t\t\tconst handlerResult = await options.store.transaction((db) =>\n\t\t\t\taction.handler\n\t\t\t\t\t? action.handler(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\t\tactorId: invocation.actorId,\n\t\t\t\t\t\t\t\tactorType: invocation.actorType,\n\t\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tservices: options.services,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparsed.data,\n\t\t\t\t\t\t)\n\t\t\t\t\t: Promise.resolve({ success: true, data: {} }),\n\t\t\t);\n\t\t\tif (!handlerResult.success) {\n\t\t\t\treturn fail(invocation, \"failed\", handlerResult.error ?? \"Action handler failed\");\n\t\t\t}\n\t\t\tdata = handlerResult.data ?? {};\n\t\t\tdomainEvents = extractEvents(data);\n\t\t\tif (action.eventPhase !== \"after_adapters\") {\n\t\t\t\tfor (const event of domainEvents) await appendEvent(invocation, event);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\n\t\tfor (const step of action.adapterSteps ?? []) {\n\t\t\tconst input = step.getInput(parsed.data, data);\n\t\t\tif (!input) continue;\n\t\t\tconst adapter = adapters.require(step.adapterType, step.operation);\n\t\t\tconst adapterInvocationId = createFabricId(\"adp\");\n\t\t\tconst adapterEventSubject = options.adapterEventSubject?.(\n\t\t\t\taction.actionId,\n\t\t\t\tparsed.data,\n\t\t\t\tdata,\n\t\t\t) ?? { subjectType: \"AdapterInvocation\", subjectId: adapterInvocationId };\n\t\t\tconst recordedInput = options.redactAdapterInput\n\t\t\t\t? options.redactAdapterInput(\n\t\t\t\t\t\taction.actionId,\n\t\t\t\t\t\tstep.adapterType,\n\t\t\t\t\t\tstep.operation,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t)\n\t\t\t\t: input;\n\t\t\tconst startedAt = now();\n\t\t\tconst record: AdapterInvocationRecord = {\n\t\t\t\tid: adapterInvocationId,\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\tadapterType: step.adapterType,\n\t\t\t\toperation: step.operation,\n\t\t\t\tvendor: adapter.vendor,\n\t\t\t\tstatus: \"running\",\n\t\t\t\tinput: recordedInput,\n\t\t\t\tattempt: 1,\n\t\t\t\tcreatedAt: startedAt,\n\t\t\t\tupdatedAt: startedAt,\n\t\t\t};\n\t\t\tawait options.store.createAdapterInvocation(record);\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"AdapterInvocationStarted\",\n\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst result = await executeWithAdapterRetry({\n\t\t\t\t\tpolicy: step.retryPolicy ?? adapter.retryPolicy,\n\t\t\t\t\tdefaultIdempotent: adapter.idempotent,\n\t\t\t\t\texecute: async (attempt, maxAttempts) => {\n\t\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn adapter.execute(input, {\n\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\tadapterInvocationId,\n\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t...(invocation.causationId\n\t\t\t\t\t\t\t\t? { causationId: invocation.causationId }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tisSuccessful: (result) => result.success,\n\t\t\t\t\tgetError: (result) => result.error,\n\t\t\t\t});\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\terror: result.error ?? \"Adapter failed\",\n\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t});\n\t\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\t\teventType: \"AdapterInvocationFailed\",\n\t\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t\t\t});\n\t\t\t\t\treturn fail(invocation, \"failed\", result.error ?? \"Adapter failed\");\n\t\t\t\t}\n\t\t\t\tconst resultRecord = result as unknown as Record<string, unknown>;\n\t\t\t\tconst output = isRecord(resultRecord.output)\n\t\t\t\t\t? resultRecord.output\n\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(resultRecord).filter(\n\t\t\t\t\t\t\t\t([key]) => key !== \"success\" && key !== \"error\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"succeeded\",\n\t\t\t\t\toutput,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\teventType: \"AdapterInvocationSucceeded\",\n\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tadapterType: step.adapterType,\n\t\t\t\t\t\toperation: step.operation,\n\t\t\t\t\t\tinput: recordedInput,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: message,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\treturn fail(invocation, \"failed\", message);\n\t\t\t}\n\t\t}\n\n\t\tif (action.eventPhase === \"after_adapters\") {\n\t\t\tfor (const event of domainEvents) await appendEvent(invocation, event);\n\t\t}\n\n\t\tconst result = withoutPrivateHostFields(data);\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"completed\",\n\t\t\tresult,\n\t\t});\n\t\treturn { actionInvocationId, status: \"completed\", result };\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\t}\n\n\tasync function appendEvent(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t\tactorId: string;\n\t\t\tactorType: string;\n\t\t\tcorrelationId: string;\n\t\t\tcausationId?: string;\n\t\t},\n\t\tevent: PendingAssetEvent,\n\t): Promise<void> {\n\t\tconst timestamp = now();\n\t\tconst envelope: AssetEventEnvelope = {\n\t\t\tid: createFabricId(\"evt\"),\n\t\t\ttenantId: invocation.tenantId,\n\t\t\tspaceId: invocation.spaceId,\n\t\t\teventType: event.eventType,\n\t\t\teventSchemaVersion: event.eventSchemaVersion ?? 1,\n\t\t\tsubjectType: event.subjectType,\n\t\t\tsubjectId: event.subjectId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tactionInvocationId: invocation.id,\n\t\t\tpayload: event.payload,\n\t\t\tsequence: await options.store.nextEventSequence(\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t),\n\t\t\toccurredAt: timestamp,\n\t\t\trecordedAt: timestamp,\n\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t};\n\t\tawait options.store.appendEvent(envelope);\n\t}\n\n\tasync function fail(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t},\n\t\tstatus: Extract<ActionStatus, \"failed\" | \"blocked_by_policy\" | \"validation_failed\">,\n\t\terror: string,\n\t): Promise<ExecuteActionResult> {\n\t\tawait options.store.updateActionInvocation(\n\t\t\tinvocation.id,\n\t\t\tinvocation.tenantId,\n\t\t\tinvocation.spaceId,\n\t\t\t{ status, error },\n\t\t);\n\t\treturn { actionInvocationId: invocation.id, status, error };\n\t}\n\n\treturn { submitAction, executeInvocation };\n}\n\nfunction toAuthorizationInput(\n\taction: ActionDefinition,\n\tinput: {\n\t\ttenantId: string;\n\t\tspaceId: string;\n\t\tactorId: string;\n\t\tactorType: import(\"@fabricorg/platform\").ActorType;\n\t},\n): ActionAuthorizationInput {\n\treturn {\n\t\tactionId: action.actionId,\n\t\tnamespace: action.namespace,\n\t\trequiredPermissions: action.requiredPermissions ?? [],\n\t\trequiredRoles: action.requiredRoles ?? [],\n\t\ttenantId: input.tenantId,\n\t\tspaceId: input.spaceId,\n\t\tactorId: input.actorId,\n\t\tactorType: input.actorType,\n\t};\n}\n\nfunction declaredPolicies(policyIds: readonly string[]): RuntimePolicyDefinition[] {\n\treturn policyIds.map((policyId) => ({\n\t\tpolicyId: policyId as `${string}.v${number}`,\n\t\tpolicyVersion: Number(policyId.split(\".v\").at(-1) ?? 1),\n\t\tkind: \"code\",\n\t\tcodeEvaluatorPolicyId: policyId as `${string}.v${number}`,\n\t}));\n}\n\nfunction initialState(entityType: string): string {\n\tconst machine = resolveStateMachine(entityType);\n\treturn Object.values(machine?.states ?? {}).find((state) => state.stateClass === \"initial\")?.id ?? \"none\";\n}\n\nfunction isTerminal(status: ActionStatus): boolean {\n\treturn [\"completed\", \"failed\", \"blocked_by_policy\", \"validation_failed\"].includes(status);\n}\n\nfunction withoutPrivateHostFields(data: Record<string, unknown>): Record<string, unknown> {\n\tconst { _events: _ignored, ...result } = data;\n\treturn result;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\treadonly invocations: ActionInvocationRecord[] = [];\n\treadonly policyEvaluations: PolicyEvaluationRecord[] = [];\n\treadonly adapterInvocations: AdapterInvocationRecord[] = [];\n\treadonly events: AssetEventEnvelope[] = [];\n\n\tconstructor(readonly db: TDb) {}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tif (input.idempotencyKey) {\n\t\t\tconst existing = this.invocations.find(\n\t\t\t\t(record) =>\n\t\t\t\t\trecord.tenantId === input.tenantId &&\n\t\t\t\t\trecord.spaceId === input.spaceId &&\n\t\t\t\t\trecord.actionId === input.actionId &&\n\t\t\t\t\trecord.idempotencyKey === input.idempotencyKey,\n\t\t\t);\n\t\t\tif (existing) return existing;\n\t\t}\n\t\tconst now = new Date();\n\t\tconst record = { ...input, attemptCount: 0, createdAt: now, updatedAt: now };\n\t\tthis.invocations.push(record);\n\t\treturn record;\n\t}\n\n\tasync getActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ActionInvocationRecord | undefined> {\n\t\treturn this.invocations.find(\n\t\t\t(record) => record.id === id && record.tenantId === tenantId && record.spaceId === spaceId,\n\t\t);\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tconst record = await this.getActionInvocation(id, tenantId, spaceId);\n\t\tif (!record) throw new Error(`ActionInvocation not found: ${id}`);\n\t\tObject.assign(record, patch, { updatedAt: new Date() });\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tthis.policyEvaluations.push(record);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tthis.adapterInvocations.push(record);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tconst record = this.adapterInvocations.find((candidate) => candidate.id === id);\n\t\tif (!record) throw new Error(`AdapterInvocation not found: ${id}`);\n\t\tObject.assign(record, patch);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tthis.events.push(event);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\treturn (\n\t\t\tthis.events.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t\t.length + 1\n\t\t);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t): Promise<string | undefined> {\n\t\tlet state: string | undefined;\n\t\tfor (const event of this.events) {\n\t\t\tif (\n\t\t\t\tevent.tenantId !== tenantId ||\n\t\t\t\tevent.spaceId !== spaceId ||\n\t\t\t\tevent.subjectType !== entityType ||\n\t\t\t\tevent.subjectId !== entityId\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidate = (event.payload as { toState?: unknown } | undefined)?.toState;\n\t\t\tif (typeof candidate === \"string\") state = candidate;\n\t\t}\n\t\treturn state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\treturn this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(!input.statuses?.length || input.statuses.includes(record.status)) &&\n\t\t\t\t\t(!input.updatedBefore || record.updatedAt < input.updatedBefore),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 100);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst eligible = this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(record.status === \"pending\" ||\n\t\t\t\t\t\t(record.status === \"running\" &&\n\t\t\t\t\t\t\t(!record.leaseExpiresAt || record.leaseExpiresAt <= current))),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 10);\n\t\tfor (const record of eligible) {\n\t\t\trecord.status = \"running\";\n\t\t\trecord.leaseOwner = input.workerId;\n\t\t\trecord.leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\t\trecord.attemptCount += 1;\n\t\t\trecord.updatedAt = current;\n\t\t}\n\t\treturn eligible;\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\treturn this.events\n\t\t\t.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t.sort((left, right) => left.sequence - right.sequence);\n\t}\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport interface PlatformHostSqlResult<Row = Record<string, unknown>> {\n\trows: Row[];\n}\n\n/** Structural subset implemented by `pg.Pool` and Lakebase-compatible clients. */\nexport interface PlatformHostSqlClient {\n\tquery<Row = Record<string, unknown>>(\n\t\tsql: string,\n\t\tvalues?: unknown[],\n\t): Promise<PlatformHostSqlResult<Row>>;\n}\n\n/** Durable mutation-pipeline ledger for Databricks Lakebase or standard Postgres. */\nexport class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\tconstructor(\n\t\treadonly db: TDb,\n\t\tprivate readonly sql: PlatformHostSqlClient,\n\t) {}\n\n\tasync ensureSchema(): Promise<void> {\n\t\tawait this.sql.query(`\n\t\t\tCREATE SCHEMA IF NOT EXISTS fabric_platform;\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.action_invocations (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\taction_id text NOT NULL, action_version integer NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, status text NOT NULL,\n\t\t\t\tparameters jsonb NOT NULL, result jsonb NOT NULL DEFAULT '{}'::jsonb,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text, idempotency_key text, error text,\n\t\t\t\tattempt_count integer NOT NULL DEFAULT 0, lease_owner text,\n\t\t\t\tlease_expires_at timestamptz,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tALTER TABLE fabric_platform.action_invocations\n\t\t\t\tADD COLUMN IF NOT EXISTS idempotency_key text,\n\t\t\t\tADD COLUMN IF NOT EXISTS attempt_count integer NOT NULL DEFAULT 0,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_owner text,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_expires_at timestamptz;\n\t\t\tCREATE UNIQUE INDEX IF NOT EXISTS action_invocations_idempotency_idx\n\t\t\t\tON fabric_platform.action_invocations\n\t\t\t\t(tenant_id, space_id, action_id, idempotency_key)\n\t\t\t\tWHERE idempotency_key IS NOT NULL;\n\t\t\tCREATE INDEX IF NOT EXISTS action_invocations_worker_idx\n\t\t\t\tON fabric_platform.action_invocations (status, lease_expires_at, created_at);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.policy_evaluations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, outcome jsonb NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.adapter_invocations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, adapter_type text NOT NULL,\n\t\t\t\toperation text NOT NULL, vendor text NOT NULL, status text NOT NULL,\n\t\t\t\tinput jsonb NOT NULL, output jsonb, error text, attempt integer NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.event_sequences (\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, next_sequence bigint NOT NULL,\n\t\t\t\tPRIMARY KEY (tenant_id, space_id)\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.asset_events (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\tevent_type text NOT NULL, event_schema_version integer NOT NULL,\n\t\t\t\tsubject_type text NOT NULL, subject_id text NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, action_invocation_id text,\n\t\t\t\tpayload jsonb NOT NULL, sequence bigint NOT NULL,\n\t\t\t\toccurred_at timestamptz NOT NULL, recorded_at timestamptz NOT NULL,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text,\n\t\t\t\tUNIQUE (tenant_id, space_id, sequence)\n\t\t\t);\n\t\t\tCREATE INDEX IF NOT EXISTS asset_events_subject_idx\n\t\t\t\tON fabric_platform.asset_events\n\t\t\t\t(tenant_id, space_id, subject_type, subject_id, sequence);\n\t\t`);\n\t}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tconst now = new Date();\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`INSERT INTO fabric_platform.action_invocations\n\t\t\t (id,tenant_id,space_id,action_id,action_version,actor_id,actor_type,status,\n\t\t\t parameters,result,correlation_id,causation_id,idempotency_key,error,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14,$15,$15)\n\t\t\t ON CONFLICT (tenant_id,space_id,action_id,idempotency_key)\n\t\t\t WHERE idempotency_key IS NOT NULL DO UPDATE SET id=fabric_platform.action_invocations.id\n\t\t\t RETURNING *`,\n\t\t\t[\n\t\t\t\tinput.id, input.tenantId, input.spaceId, input.actionId, input.actionVersion,\n\t\t\t\tinput.actorId, input.actorType, input.status, JSON.stringify(input.parameters),\n\t\t\t\tJSON.stringify(input.result), input.correlationId, input.causationId ?? null,\n\t\t\t\tinput.idempotencyKey ?? null, input.error ?? null, now,\n\t\t\t],\n\t\t);\n\t\treturn toActionRecord(result.rows[0]!);\n\t}\n\n\tasync getActionInvocation(id: string, tenantId: string, spaceId: string) {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId],\n\t\t);\n\t\treturn result.rows[0] ? toActionRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.action_invocations SET\n\t\t\t status=COALESCE($4,status), result=COALESCE($5::jsonb,result),\n\t\t\t error=CASE WHEN $6::boolean THEN $7 ELSE error END,\n\t\t\t lease_owner=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_owner END,\n\t\t\t lease_expires_at=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_expires_at END,\n\t\t\t updated_at=now()\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId, patch.status ?? null,\n\t\t\t patch.result === undefined ? null : JSON.stringify(patch.result),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null],\n\t\t);\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.policy_evaluations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,outcome,created_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5::jsonb,$6)`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t JSON.stringify(record.outcome), record.createdAt],\n\t\t);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.adapter_invocations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,\n\t\t\t input,output,error,attempt,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t record.adapterType, record.operation, record.vendor, record.status,\n\t\t\t JSON.stringify(record.input), record.output ? JSON.stringify(record.output) : null,\n\t\t\t record.error ?? null, record.attempt, record.createdAt, record.updatedAt],\n\t\t);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.adapter_invocations SET\n\t\t\t status=COALESCE($2,status), output=COALESCE($3::jsonb,output),\n\t\t\t error=CASE WHEN $4::boolean THEN $5 ELSE error END,\n\t\t\t attempt=COALESCE($6,attempt), updated_at=COALESCE($7,now()) WHERE id=$1`,\n\t\t\t[id, patch.status ?? null,\n\t\t\t patch.output === undefined ? null : JSON.stringify(patch.output),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null, patch.attempt ?? null,\n\t\t\t patch.updatedAt ?? null],\n\t\t);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.asset_events\n\t\t\t (id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,\n\t\t\t actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,\n\t\t\t correlation_id,causation_id)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)`,\n\t\t\t[event.id, event.tenantId, event.spaceId, event.eventType, event.eventSchemaVersion,\n\t\t\t event.subjectType, event.subjectId, event.actorId, event.actorType,\n\t\t\t event.actionInvocationId ?? null, JSON.stringify(event.payload), event.sequence,\n\t\t\t event.occurredAt, event.recordedAt, event.correlationId, event.causationId ?? null],\n\t\t);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\tconst result = await this.sql.query<{ next_sequence: string | number }>(\n\t\t\t`INSERT INTO fabric_platform.event_sequences (tenant_id,space_id,next_sequence)\n\t\t\t VALUES ($1,$2,1) ON CONFLICT (tenant_id,space_id) DO UPDATE\n\t\t\t SET next_sequence=fabric_platform.event_sequences.next_sequence+1\n\t\t\t RETURNING next_sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn Number(result.rows[0]!.next_sequence);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t) {\n\t\tconst result = await this.sql.query<{ state?: string }>(\n\t\t\t`SELECT payload->>'toState' AS state FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 AND subject_type=$3 AND subject_id=$4\n\t\t\t AND payload ? 'toState' ORDER BY sequence DESC LIMIT 1`,\n\t\t\t[tenantId, spaceId, entityType, entityId],\n\t\t);\n\t\treturn result.rows[0]?.state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst conditions: string[] = [];\n\t\tconst values: unknown[] = [];\n\t\tconst add = (condition: string, value: unknown) => {\n\t\t\tvalues.push(value);\n\t\t\tconditions.push(condition.replace(\"?\", `$${values.length}`));\n\t\t};\n\t\tif (input.tenantId) add(\"tenant_id=?\", input.tenantId);\n\t\tif (input.spaceId) add(\"space_id=?\", input.spaceId);\n\t\tif (input.statuses?.length) add(\"status = ANY(?::text[])\", [...input.statuses]);\n\t\tif (input.updatedBefore) add(\"updated_at<?\", input.updatedBefore);\n\t\tvalues.push(Math.max(1, Math.min(input.limit ?? 100, 1_000)));\n\t\tconst where = conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations ${where}\n\t\t\t ORDER BY created_at LIMIT $${values.length}`,\n\t\t\tvalues,\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst limit = Math.max(1, Math.min(input.limit ?? 10, 100));\n\t\tconst leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`WITH claimable AS (\n\t\t\t\tSELECT id FROM fabric_platform.action_invocations\n\t\t\t\tWHERE (status='pending' OR\n\t\t\t\t (status='running' AND (lease_expires_at IS NULL OR lease_expires_at <= $1)))\n\t\t\t\t AND ($2::text IS NULL OR tenant_id=$2)\n\t\t\t\t AND ($3::text IS NULL OR space_id=$3)\n\t\t\t\tORDER BY created_at\n\t\t\t\tFOR UPDATE SKIP LOCKED\n\t\t\t\tLIMIT $4\n\t\t\t)\n\t\t\tUPDATE fabric_platform.action_invocations AS invocation\n\t\t\tSET status='running', lease_owner=$5, lease_expires_at=$6,\n\t\t\t attempt_count=attempt_count+1, updated_at=$1\n\t\t\tFROM claimable WHERE invocation.id=claimable.id\n\t\t\tRETURNING invocation.*`,\n\t\t\t[current, input.tenantId ?? null, input.spaceId ?? null, limit, input.workerId,\n\t\t\t leaseExpiresAt],\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 ORDER BY sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn result.rows.map(toEventRecord);\n\t}\n}\n\nfunction toActionRecord(row: Record<string, unknown>): ActionInvocationRecord {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\tactionId: String(row.action_id) as ActionInvocationRecord[\"actionId\"],\n\t\tactionVersion: Number(row.action_version),\n\t\tactorId: String(row.actor_id),\n\t\tactorType: String(row.actor_type) as ActionInvocationRecord[\"actorType\"],\n\t\tstatus: String(row.status) as ActionInvocationRecord[\"status\"],\n\t\tparameters: row.parameters as Record<string, unknown>,\n\t\tresult: row.result as Record<string, unknown>, correlationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t\t...(row.idempotency_key ? { idempotencyKey: String(row.idempotency_key) } : {}),\n\t\tattemptCount: Number(row.attempt_count ?? 0),\n\t\t...(row.lease_owner ? { leaseOwner: String(row.lease_owner) } : {}),\n\t\t...(row.lease_expires_at\n\t\t\t? { leaseExpiresAt: new Date(row.lease_expires_at as string | Date) }\n\t\t\t: {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toEventRecord(row: Record<string, unknown>): AssetEventEnvelope {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\teventType: String(row.event_type), eventSchemaVersion: Number(row.event_schema_version),\n\t\tsubjectType: String(row.subject_type), subjectId: String(row.subject_id),\n\t\tactorId: String(row.actor_id), actorType: String(row.actor_type),\n\t\t...(row.action_invocation_id\n\t\t\t? { actionInvocationId: String(row.action_invocation_id) }\n\t\t\t: {}),\n\t\tpayload: row.payload, sequence: Number(row.sequence),\n\t\toccurredAt: new Date(row.occurred_at as string | Date),\n\t\trecordedAt: new Date(row.recorded_at as string | Date),\n\t\tcorrelationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t};\n}\n","import type {\n\tPlatformActionDispatcher,\n\tPlatformActionWorkerCycleResult,\n\tPlatformActionWorkerOptions,\n} from \"./types\";\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_LEASE_DURATION_MS = 5 * 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\n\n/**\n * Durable store-backed dispatch: the pending invocation row is the queue item.\n * Repeated dispatches are safe because the workflow id is stable per invocation.\n */\nexport function createStoreBackedActionDispatcher(): PlatformActionDispatcher {\n\treturn {\n\t\tdispatch: async (input) => ({ workflowId: input.workflowId }),\n\t};\n}\n\n/** Claim and execute one bounded batch. Safe to run concurrently across workers. */\nexport async function runPlatformActionWorkerCycle<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<PlatformActionWorkerCycleResult> {\n\tconst claimed = await options.store.claimActionInvocations({\n\t\tworkerId: options.workerId,\n\t\tlimit: options.batchSize ?? DEFAULT_BATCH_SIZE,\n\t\tleaseDurationMs: options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n\t\t...(options.tenantId ? { tenantId: options.tenantId } : {}),\n\t\t...(options.spaceId ? { spaceId: options.spaceId } : {}),\n\t});\n\tlet completed = 0;\n\tlet failed = 0;\n\tfor (const invocation of claimed) {\n\t\ttry {\n\t\t\tconst result = await options.host.executeInvocation(\n\t\t\t\tinvocation.id,\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t);\n\t\t\tif (result.status === \"completed\") completed += 1;\n\t\t\telse failed += 1;\n\t\t} catch (error) {\n\t\t\tfailed += 1;\n\t\t\toptions.onError?.(error, invocation);\n\t\t}\n\t}\n\treturn { claimed: claimed.length, completed, failed };\n}\n\n/** Poll until aborted. Each iteration is bounded and waits without busy-spinning. */\nexport async function runPlatformActionWorker<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<void> {\n\twhile (!options.signal?.aborted) {\n\t\ttry {\n\t\t\tawait runPlatformActionWorkerCycle(options);\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t\tawait abortableDelay(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, options.signal);\n\t}\n}\n\nasync function abortableDelay(milliseconds: number, signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\tawait new Promise<void>((resolve) => {\n\t\tconst timeout = setTimeout(resolve, milliseconds);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/host.ts","../src/memory-store.ts","../src/postgres-store.ts","../src/worker.ts"],"names":["AdapterRegistry","resolveAction","createFabricId","evaluatePolicyDefinitions","aggregatePolicyOutcomes","validateTransition","result","executeWithAdapterRetry","resolveStateMachine","record"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n\tAdapterRegistry,\n\taggregatePolicyOutcomes,\n\tcreateFabricId,\n\tevaluatePolicyDefinitions,\n\texecuteWithAdapterRetry,\n\tresolveAction,\n\tresolveStateMachine,\n\tvalidateTransition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionDefinition,\n\tActionId,\n\tActionStatus,\n\tAssetEventEnvelope,\n\tRuntimePolicyDefinition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionAuthorizationInput,\n\tAdapterInvocationRecord,\n\tExecuteActionResult,\n\tGovernedActionHost,\n\tPendingAssetEvent,\n\tPlatformHostOptions,\n\tSubmitActionInput,\n\tSubmitActionResult,\n} from \"./types\";\n\nconst DEFAULT_EXTRACT_EVENTS = (data: Record<string, unknown>): PendingAssetEvent[] => {\n\tconst value = data._events;\n\treturn Array.isArray(value) ? (value as PendingAssetEvent[]) : [];\n};\n\nexport function createGovernedActionHost<TDb>(\n\toptions: PlatformHostOptions<TDb>,\n): GovernedActionHost {\n\tconst adapters = new AdapterRegistry();\n\tfor (const adapter of options.adapters ?? []) adapters.register(adapter);\n\tconst now = options.now ?? (() => new Date());\n\tconst extractEvents = options.extractEvents ?? DEFAULT_EXTRACT_EVENTS;\n\n\tasync function submitAction(input: SubmitActionInput): Promise<SubmitActionResult> {\n\t\tconst action = resolveAction(input.actionId);\n\t\tif (!action) throw new Error(`Unknown action: ${input.actionId}`);\n\t\tconst authorizationInput = toAuthorizationInput(action, input);\n\t\tif (!(await options.authorization.checkEntitlement(authorizationInput))) {\n\t\t\tthrow new Error(`Module \"${action.namespace}\" is not enabled for tenant ${input.tenantId}`);\n\t\t}\n\t\tif (!(await options.authorization.authorize(authorizationInput))) {\n\t\t\tthrow new Error(`Actor ${input.actorId} is not authorized for action ${input.actionId}`);\n\t\t}\n\n\t\tconst actionInvocationId = createFabricId(\"act\");\n\t\tconst correlationId = input.correlationId ?? createFabricId(\"corr\");\n\t\tconst durableParameters = options.redactActionParameters\n\t\t\t? options.redactActionParameters(input.actionId, input.parameters)\n\t\t\t: input.parameters;\n\t\tconst durableInvocation = await options.store.createActionInvocation({\n\t\t\tid: actionInvocationId,\n\t\t\ttenantId: input.tenantId,\n\t\t\tspaceId: input.spaceId,\n\t\t\tactionId: input.actionId,\n\t\t\tactionVersion: action.version,\n\t\t\tactorId: input.actorId,\n\t\t\tactorType: input.actorType,\n\t\t\tstatus: \"pending\",\n\t\t\tparameters: durableParameters,\n\t\t\tresult: {},\n\t\t\tcorrelationId,\n\t\t\t...(input.causationId ? { causationId: input.causationId } : {}),\n\t\t\t...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n\t\t});\n\t\tconst durableWorkflowId = `action-invocation-${durableInvocation.id}`;\n\t\tif (durableInvocation.id !== actionInvocationId && isTerminal(durableInvocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\tresult: durableInvocation.result,\n\t\t\t\t...(durableInvocation.error ? { error: durableInvocation.error } : {}),\n\t\t\t};\n\t\t}\n\n\t\tif (options.dispatcher) {\n\t\t\ttry {\n\t\t\t\tconst dispatched = await options.dispatcher.dispatch({\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\ttenantId: input.tenantId,\n\t\t\t\t\tspaceId: input.spaceId,\n\t\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\t\tworkflowId: dispatched.workflowId,\n\t\t\t\t\t...(dispatched.runId ? { runId: dispatched.runId } : {}),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateActionInvocation(\n\t\t\t\t\tdurableInvocation.id,\n\t\t\t\t\tinput.tenantId,\n\t\t\t\t\tinput.spaceId,\n\t\t\t\t\t{ status: \"failed\", error: message },\n\t\t\t\t);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst executed = await executeInvocation(\n\t\t\tdurableInvocation.id,\n\t\t\tinput.tenantId,\n\t\t\tinput.spaceId,\n\t\t);\n\t\treturn { ...executed, workflowId: durableWorkflowId };\n\t}\n\n\tasync function executeInvocation(\n\t\tactionInvocationId: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ExecuteActionResult> {\n\t\tconst invocation = await options.store.getActionInvocation(\n\t\t\tactionInvocationId,\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t);\n\t\tif (!invocation) throw new Error(`ActionInvocation not found: ${actionInvocationId}`);\n\t\tif (isTerminal(invocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId,\n\t\t\t\tstatus: invocation.status,\n\t\t\t\tresult: invocation.result,\n\t\t\t\t...(invocation.error ? { error: invocation.error } : {}),\n\t\t\t};\n\t\t}\n\t\tconst action = resolveAction(invocation.actionId);\n\t\tif (!action) {\n\t\t\treturn fail(invocation, \"failed\", `Unknown action: ${invocation.actionId}`);\n\t\t}\n\t\tif (invocation.attemptCount > 1 && !action.idempotent) {\n\t\t\treturn fail(\n\t\t\t\tinvocation,\n\t\t\t\t\"failed\",\n\t\t\t\t`Interrupted action ${invocation.actionId} is not declared idempotent; manual reconciliation is required.`,\n\t\t\t);\n\t\t}\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"running\",\n\t\t});\n\t\ttry {\n\n\t\tconst parsed = action.schema.safeParse(invocation.parameters);\n\t\tif (!parsed.success) {\n\t\t\tconst message = parsed.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n\t\t\t\t.join(\"; \");\n\t\t\treturn fail(invocation, \"validation_failed\", message);\n\t\t}\n\n\t\tconst authorizationInput = toAuthorizationInput(action, invocation);\n\t\tconst definitions = options.resolvePolicies\n\t\t\t? await options.resolvePolicies({\n\t\t\t\t\t...authorizationInput,\n\t\t\t\t\tdeclaredPolicyIds: action.policies ?? [],\n\t\t\t\t})\n\t\t\t: declaredPolicies(action.policies ?? []);\n\t\tconst outcomes = await evaluatePolicyDefinitions(definitions, {\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t\tactionInvocationId,\n\t\t\tactionId: action.actionId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tparameters: parsed.data,\n\t\t\tdb: options.store.db,\n\t\t\tservices: options.services,\n\t\t\tmode: \"execute\",\n\t\t});\n\t\tfor (const outcome of outcomes) {\n\t\t\tawait options.store.appendPolicyEvaluation({\n\t\t\t\tid: lifecycleId(\"pol\", actionInvocationId, outcome.policyId),\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\toutcome,\n\t\t\t\tcreatedAt: now(),\n\t\t\t});\n\t\t}\n\t\tconst aggregate = aggregatePolicyOutcomes(outcomes);\n\t\tif (aggregate?.result === \"block\") {\n\t\t\tconst reason = aggregate.reason ?? `Blocked by policy ${aggregate.policyId}`;\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"ComplianceBlocked\",\n\t\t\t\tsubjectType: \"ActionInvocation\",\n\t\t\t\tsubjectId: actionInvocationId,\n\t\t\t\tpayload: { actionId: action.actionId, policyId: aggregate.policyId, reason },\n\t\t\t}, `compliance:${aggregate.policyId}`);\n\t\t\treturn fail(invocation, \"blocked_by_policy\", reason);\n\t\t}\n\n\t\tconst binding = action.stateMachine;\n\t\tif (binding) {\n\t\t\tconst entityId = binding.getEntityId(parsed.data);\n\t\t\tconst currentState = entityId\n\t\t\t\t? ((await options.store.getEntityState(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\tbinding.entityType,\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t)) ?? initialState(binding.entityType))\n\t\t\t\t: initialState(binding.entityType);\n\t\t\tconst targetState =\n\t\t\t\ttypeof binding.targetState === \"function\"\n\t\t\t\t\t? binding.targetState(parsed.data)\n\t\t\t\t\t: binding.targetState;\n\t\t\tconst transition = validateTransition(\n\t\t\t\tbinding.entityType,\n\t\t\t\tcurrentState,\n\t\t\t\ttargetState,\n\t\t\t\taction.actionId,\n\t\t\t);\n\t\t\tconst replayingAppliedTransition = action.idempotent && currentState === targetState;\n\t\t\tif (!transition.valid && !replayingAppliedTransition) {\n\t\t\t\treturn fail(invocation, \"failed\", transition.error ?? \"Invalid state transition\");\n\t\t\t}\n\t\t}\n\n\t\tlet data: Record<string, unknown>;\n\t\tlet domainEvents: PendingAssetEvent[] = [];\n\t\ttry {\n\t\t\tconst handlerResult = await options.store.transaction((db) =>\n\t\t\t\taction.handler\n\t\t\t\t\t? action.handler(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\t\tactorId: invocation.actorId,\n\t\t\t\t\t\t\t\tactorType: invocation.actorType,\n\t\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tservices: options.services,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparsed.data,\n\t\t\t\t\t\t)\n\t\t\t\t\t: Promise.resolve({ success: true, data: {} }),\n\t\t\t);\n\t\t\tif (!handlerResult.success) {\n\t\t\t\treturn fail(invocation, \"failed\", handlerResult.error ?? \"Action handler failed\");\n\t\t\t}\n\t\t\tdata = handlerResult.data ?? {};\n\t\t\tdomainEvents = extractEvents(data);\n\t\t\tif (action.eventPhase !== \"after_adapters\") {\n\t\t\t\tfor (const [index, event] of domainEvents.entries()) {\n\t\t\t\t\tawait appendEvent(invocation, event, `domain:${index}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\n\t\tfor (const [stepIndex, step] of (action.adapterSteps ?? []).entries()) {\n\t\t\tconst input = step.getInput(parsed.data, data);\n\t\t\tif (!input) continue;\n\t\t\tconst adapter = adapters.require(step.adapterType, step.operation);\n\t\t\tconst adapterInvocationId = lifecycleId(\"adp\", actionInvocationId, String(stepIndex));\n\t\t\tconst previousAdapterInvocation = await options.store.getAdapterInvocation(\n\t\t\t\tadapterInvocationId,\n\t\t\t);\n\t\t\tif (previousAdapterInvocation?.status === \"succeeded\") continue;\n\t\t\tconst adapterEventSubject = options.adapterEventSubject?.(\n\t\t\t\taction.actionId,\n\t\t\t\tparsed.data,\n\t\t\t\tdata,\n\t\t\t) ?? { subjectType: \"AdapterInvocation\", subjectId: adapterInvocationId };\n\t\t\tconst recordedInput = options.redactAdapterInput\n\t\t\t\t? options.redactAdapterInput(\n\t\t\t\t\t\taction.actionId,\n\t\t\t\t\t\tstep.adapterType,\n\t\t\t\t\t\tstep.operation,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t)\n\t\t\t\t: input;\n\t\t\tconst startedAt = now();\n\t\t\tconst record: AdapterInvocationRecord = {\n\t\t\t\tid: adapterInvocationId,\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\tadapterType: step.adapterType,\n\t\t\t\toperation: step.operation,\n\t\t\t\tvendor: adapter.vendor,\n\t\t\t\tstatus: \"running\",\n\t\t\t\tinput: recordedInput,\n\t\t\t\tattempt: 1,\n\t\t\t\tcreatedAt: startedAt,\n\t\t\t\tupdatedAt: startedAt,\n\t\t\t};\n\t\t\tawait options.store.createAdapterInvocation(record);\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"AdapterInvocationStarted\",\n\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t}, `adapter:${stepIndex}:started`);\n\t\t\ttry {\n\t\t\t\tconst result = await executeWithAdapterRetry({\n\t\t\t\t\tpolicy: step.retryPolicy ?? adapter.retryPolicy,\n\t\t\t\t\tdefaultIdempotent: adapter.idempotent,\n\t\t\t\t\texecute: async (attempt, maxAttempts) => {\n\t\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn adapter.execute(input, {\n\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\tadapterInvocationId,\n\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t...(invocation.causationId\n\t\t\t\t\t\t\t\t? { causationId: invocation.causationId }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tisSuccessful: (result) => result.success,\n\t\t\t\t\tgetError: (result) => result.error,\n\t\t\t\t});\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\terror: result.error ?? \"Adapter failed\",\n\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t});\n\t\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\t\teventType: \"AdapterInvocationFailed\",\n\t\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t\t\t}, `adapter:${stepIndex}:failed`);\n\t\t\t\t\treturn fail(invocation, \"failed\", result.error ?? \"Adapter failed\");\n\t\t\t\t}\n\t\t\t\tconst resultRecord = result as unknown as Record<string, unknown>;\n\t\t\t\tconst output = isRecord(resultRecord.output)\n\t\t\t\t\t? resultRecord.output\n\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(resultRecord).filter(\n\t\t\t\t\t\t\t\t([key]) => key !== \"success\" && key !== \"error\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"succeeded\",\n\t\t\t\t\toutput,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\teventType: \"AdapterInvocationSucceeded\",\n\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tadapterType: step.adapterType,\n\t\t\t\t\t\toperation: step.operation,\n\t\t\t\t\t\tinput: recordedInput,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t},\n\t\t\t\t}, `adapter:${stepIndex}:succeeded`);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: message,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\treturn fail(invocation, \"failed\", message);\n\t\t\t}\n\t\t}\n\n\t\tif (action.eventPhase === \"after_adapters\") {\n\t\t\tfor (const [index, event] of domainEvents.entries()) {\n\t\t\t\tawait appendEvent(invocation, event, `domain:${index}`);\n\t\t\t}\n\t\t}\n\n\t\tconst result = withoutPrivateHostFields(data);\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"completed\",\n\t\t\tresult,\n\t\t});\n\t\treturn { actionInvocationId, status: \"completed\", result };\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\t}\n\n\tasync function appendEvent(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t\tactorId: string;\n\t\t\tactorType: string;\n\t\t\tcorrelationId: string;\n\t\t\tcausationId?: string;\n\t\t},\n\t\tevent: PendingAssetEvent,\n\t\tdeduplicationKey: string,\n\t): Promise<void> {\n\t\tconst timestamp = now();\n\t\tconst envelope: AssetEventEnvelope = {\n\t\t\tid: lifecycleId(\"evt\", invocation.id, deduplicationKey),\n\t\t\ttenantId: invocation.tenantId,\n\t\t\tspaceId: invocation.spaceId,\n\t\t\teventType: event.eventType,\n\t\t\teventSchemaVersion: event.eventSchemaVersion ?? 1,\n\t\t\tsubjectType: event.subjectType,\n\t\t\tsubjectId: event.subjectId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tactionInvocationId: invocation.id,\n\t\t\tpayload: event.payload,\n\t\t\tsequence: await options.store.nextEventSequence(\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t),\n\t\t\toccurredAt: timestamp,\n\t\t\trecordedAt: timestamp,\n\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t};\n\t\tawait options.store.appendEvent(envelope);\n\t}\n\n\tasync function fail(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t},\n\t\tstatus: Extract<ActionStatus, \"failed\" | \"blocked_by_policy\" | \"validation_failed\">,\n\t\terror: string,\n\t): Promise<ExecuteActionResult> {\n\t\tawait options.store.updateActionInvocation(\n\t\t\tinvocation.id,\n\t\t\tinvocation.tenantId,\n\t\t\tinvocation.spaceId,\n\t\t\t{ status, error },\n\t\t);\n\t\treturn { actionInvocationId: invocation.id, status, error };\n\t}\n\n\treturn { submitAction, executeInvocation };\n}\n\nfunction toAuthorizationInput(\n\taction: ActionDefinition,\n\tinput: {\n\t\ttenantId: string;\n\t\tspaceId: string;\n\t\tactorId: string;\n\t\tactorType: import(\"@fabricorg/platform\").ActorType;\n\t},\n): ActionAuthorizationInput {\n\treturn {\n\t\tactionId: action.actionId,\n\t\tnamespace: action.namespace,\n\t\trequiredPermissions: action.requiredPermissions ?? [],\n\t\trequiredRoles: action.requiredRoles ?? [],\n\t\ttenantId: input.tenantId,\n\t\tspaceId: input.spaceId,\n\t\tactorId: input.actorId,\n\t\tactorType: input.actorType,\n\t};\n}\n\nfunction declaredPolicies(policyIds: readonly string[]): RuntimePolicyDefinition[] {\n\treturn policyIds.map((policyId) => ({\n\t\tpolicyId: policyId as `${string}.v${number}`,\n\t\tpolicyVersion: Number(policyId.split(\".v\").at(-1) ?? 1),\n\t\tkind: \"code\",\n\t\tcodeEvaluatorPolicyId: policyId as `${string}.v${number}`,\n\t}));\n}\n\nfunction initialState(entityType: string): string {\n\tconst machine = resolveStateMachine(entityType);\n\treturn Object.values(machine?.states ?? {}).find((state) => state.stateClass === \"initial\")?.id ?? \"none\";\n}\n\nfunction isTerminal(status: ActionStatus): boolean {\n\treturn [\"completed\", \"failed\", \"blocked_by_policy\", \"validation_failed\"].includes(status);\n}\n\nfunction withoutPrivateHostFields(data: Record<string, unknown>): Record<string, unknown> {\n\tconst { _events: _ignored, ...result } = data;\n\treturn result;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction lifecycleId(prefix: string, invocationId: string, key: string): string {\n\tconst safeKey = key.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 96);\n\treturn `${prefix}_${invocationId}_${safeKey}`;\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\treadonly invocations: ActionInvocationRecord[] = [];\n\treadonly policyEvaluations: PolicyEvaluationRecord[] = [];\n\treadonly adapterInvocations: AdapterInvocationRecord[] = [];\n\treadonly events: AssetEventEnvelope[] = [];\n\n\tconstructor(readonly db: TDb) {}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tif (input.idempotencyKey) {\n\t\t\tconst existing = this.invocations.find(\n\t\t\t\t(record) =>\n\t\t\t\t\trecord.tenantId === input.tenantId &&\n\t\t\t\t\trecord.spaceId === input.spaceId &&\n\t\t\t\t\trecord.actionId === input.actionId &&\n\t\t\t\t\trecord.idempotencyKey === input.idempotencyKey,\n\t\t\t);\n\t\t\tif (existing) return existing;\n\t\t}\n\t\tconst now = new Date();\n\t\tconst record = { ...input, attemptCount: 0, createdAt: now, updatedAt: now };\n\t\tthis.invocations.push(record);\n\t\treturn record;\n\t}\n\n\tasync getActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ActionInvocationRecord | undefined> {\n\t\treturn this.invocations.find(\n\t\t\t(record) => record.id === id && record.tenantId === tenantId && record.spaceId === spaceId,\n\t\t);\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tconst record = await this.getActionInvocation(id, tenantId, spaceId);\n\t\tif (!record) throw new Error(`ActionInvocation not found: ${id}`);\n\t\tObject.assign(record, patch, { updatedAt: new Date() });\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tif (this.policyEvaluations.some((candidate) => candidate.id === record.id)) return;\n\t\tthis.policyEvaluations.push(record);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tif (this.adapterInvocations.some((candidate) => candidate.id === record.id)) return;\n\t\tthis.adapterInvocations.push(record);\n\t}\n\n\tasync getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined> {\n\t\treturn this.adapterInvocations.find((candidate) => candidate.id === id);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tconst record = this.adapterInvocations.find((candidate) => candidate.id === id);\n\t\tif (!record) throw new Error(`AdapterInvocation not found: ${id}`);\n\t\tObject.assign(record, patch);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tif (this.events.some((candidate) => candidate.id === event.id)) return;\n\t\tthis.events.push(event);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\treturn (\n\t\t\tthis.events.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t\t.length + 1\n\t\t);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t): Promise<string | undefined> {\n\t\tlet state: string | undefined;\n\t\tfor (const event of this.events) {\n\t\t\tif (\n\t\t\t\tevent.tenantId !== tenantId ||\n\t\t\t\tevent.spaceId !== spaceId ||\n\t\t\t\tevent.subjectType !== entityType ||\n\t\t\t\tevent.subjectId !== entityId\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidate = (event.payload as { toState?: unknown } | undefined)?.toState;\n\t\t\tif (typeof candidate === \"string\") state = candidate;\n\t\t}\n\t\treturn state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\treturn this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(!input.statuses?.length || input.statuses.includes(record.status)) &&\n\t\t\t\t\t(!input.updatedBefore || record.updatedAt < input.updatedBefore),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 100);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst eligible = this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(record.status === \"pending\" ||\n\t\t\t\t\t\t(record.status === \"running\" &&\n\t\t\t\t\t\t\t(!record.leaseExpiresAt || record.leaseExpiresAt <= current))),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 10);\n\t\tfor (const record of eligible) {\n\t\t\trecord.status = \"running\";\n\t\t\trecord.leaseOwner = input.workerId;\n\t\t\trecord.leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\t\trecord.attemptCount += 1;\n\t\t\trecord.updatedAt = current;\n\t\t}\n\t\treturn eligible;\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\treturn this.events\n\t\t\t.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t.sort((left, right) => left.sequence - right.sequence);\n\t}\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport interface PlatformHostSqlResult<Row = Record<string, unknown>> {\n\trows: Row[];\n}\n\n/** Structural subset implemented by `pg.Pool` and Lakebase-compatible clients. */\nexport interface PlatformHostSqlClient {\n\tquery<Row = Record<string, unknown>>(\n\t\tsql: string,\n\t\tvalues?: unknown[],\n\t): Promise<PlatformHostSqlResult<Row>>;\n}\n\n/** Durable mutation-pipeline ledger for Databricks Lakebase or standard Postgres. */\nexport class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\tconstructor(\n\t\treadonly db: TDb,\n\t\tprivate readonly sql: PlatformHostSqlClient,\n\t) {}\n\n\tasync ensureSchema(): Promise<void> {\n\t\tawait this.sql.query(`\n\t\t\tCREATE SCHEMA IF NOT EXISTS fabric_platform;\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.action_invocations (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\taction_id text NOT NULL, action_version integer NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, status text NOT NULL,\n\t\t\t\tparameters jsonb NOT NULL, result jsonb NOT NULL DEFAULT '{}'::jsonb,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text, idempotency_key text, error text,\n\t\t\t\tattempt_count integer NOT NULL DEFAULT 0, lease_owner text,\n\t\t\t\tlease_expires_at timestamptz,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tALTER TABLE fabric_platform.action_invocations\n\t\t\t\tADD COLUMN IF NOT EXISTS idempotency_key text,\n\t\t\t\tADD COLUMN IF NOT EXISTS attempt_count integer NOT NULL DEFAULT 0,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_owner text,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_expires_at timestamptz;\n\t\t\tCREATE UNIQUE INDEX IF NOT EXISTS action_invocations_idempotency_idx\n\t\t\t\tON fabric_platform.action_invocations\n\t\t\t\t(tenant_id, space_id, action_id, idempotency_key)\n\t\t\t\tWHERE idempotency_key IS NOT NULL;\n\t\t\tCREATE INDEX IF NOT EXISTS action_invocations_worker_idx\n\t\t\t\tON fabric_platform.action_invocations (status, lease_expires_at, created_at);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.policy_evaluations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, outcome jsonb NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.adapter_invocations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, adapter_type text NOT NULL,\n\t\t\t\toperation text NOT NULL, vendor text NOT NULL, status text NOT NULL,\n\t\t\t\tinput jsonb NOT NULL, output jsonb, error text, attempt integer NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.event_sequences (\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, next_sequence bigint NOT NULL,\n\t\t\t\tPRIMARY KEY (tenant_id, space_id)\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.asset_events (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\tevent_type text NOT NULL, event_schema_version integer NOT NULL,\n\t\t\t\tsubject_type text NOT NULL, subject_id text NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, action_invocation_id text,\n\t\t\t\tpayload jsonb NOT NULL, sequence bigint NOT NULL,\n\t\t\t\toccurred_at timestamptz NOT NULL, recorded_at timestamptz NOT NULL,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text,\n\t\t\t\tUNIQUE (tenant_id, space_id, sequence)\n\t\t\t);\n\t\t\tCREATE INDEX IF NOT EXISTS asset_events_subject_idx\n\t\t\t\tON fabric_platform.asset_events\n\t\t\t\t(tenant_id, space_id, subject_type, subject_id, sequence);\n\t\t`);\n\t}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tconst now = new Date();\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`INSERT INTO fabric_platform.action_invocations\n\t\t\t (id,tenant_id,space_id,action_id,action_version,actor_id,actor_type,status,\n\t\t\t parameters,result,correlation_id,causation_id,idempotency_key,error,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14,$15,$15)\n\t\t\t ON CONFLICT (tenant_id,space_id,action_id,idempotency_key)\n\t\t\t WHERE idempotency_key IS NOT NULL DO UPDATE SET id=fabric_platform.action_invocations.id\n\t\t\t RETURNING *`,\n\t\t\t[\n\t\t\t\tinput.id, input.tenantId, input.spaceId, input.actionId, input.actionVersion,\n\t\t\t\tinput.actorId, input.actorType, input.status, JSON.stringify(input.parameters),\n\t\t\t\tJSON.stringify(input.result), input.correlationId, input.causationId ?? null,\n\t\t\t\tinput.idempotencyKey ?? null, input.error ?? null, now,\n\t\t\t],\n\t\t);\n\t\treturn toActionRecord(result.rows[0]!);\n\t}\n\n\tasync getActionInvocation(id: string, tenantId: string, spaceId: string) {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId],\n\t\t);\n\t\treturn result.rows[0] ? toActionRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.action_invocations SET\n\t\t\t status=COALESCE($4,status), result=COALESCE($5::jsonb,result),\n\t\t\t error=CASE WHEN $6::boolean THEN $7 ELSE error END,\n\t\t\t lease_owner=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_owner END,\n\t\t\t lease_expires_at=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_expires_at END,\n\t\t\t updated_at=now()\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId, patch.status ?? null,\n\t\t\t patch.result === undefined ? null : JSON.stringify(patch.result),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null],\n\t\t);\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.policy_evaluations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,outcome,created_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5::jsonb,$6) ON CONFLICT (id) DO NOTHING`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t JSON.stringify(record.outcome), record.createdAt],\n\t\t);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.adapter_invocations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,\n\t\t\t input,output,error,attempt,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)\n\t\t\t ON CONFLICT (id) DO NOTHING`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t record.adapterType, record.operation, record.vendor, record.status,\n\t\t\t JSON.stringify(record.input), record.output ? JSON.stringify(record.output) : null,\n\t\t\t record.error ?? null, record.attempt, record.createdAt, record.updatedAt],\n\t\t);\n\t}\n\n\tasync getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.adapter_invocations WHERE id=$1`,\n\t\t\t[id],\n\t\t);\n\t\treturn result.rows[0] ? toAdapterRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.adapter_invocations SET\n\t\t\t status=COALESCE($2,status), output=COALESCE($3::jsonb,output),\n\t\t\t error=CASE WHEN $4::boolean THEN $5 ELSE error END,\n\t\t\t attempt=COALESCE($6,attempt), updated_at=COALESCE($7,now()) WHERE id=$1`,\n\t\t\t[id, patch.status ?? null,\n\t\t\t patch.output === undefined ? null : JSON.stringify(patch.output),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null, patch.attempt ?? null,\n\t\t\t patch.updatedAt ?? null],\n\t\t);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.asset_events\n\t\t\t (id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,\n\t\t\t actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,\n\t\t\t correlation_id,causation_id)\n\t\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)\n\t\t\t\t ON CONFLICT (id) DO NOTHING`,\n\t\t\t[event.id, event.tenantId, event.spaceId, event.eventType, event.eventSchemaVersion,\n\t\t\t event.subjectType, event.subjectId, event.actorId, event.actorType,\n\t\t\t event.actionInvocationId ?? null, JSON.stringify(event.payload), event.sequence,\n\t\t\t event.occurredAt, event.recordedAt, event.correlationId, event.causationId ?? null],\n\t\t);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\tconst result = await this.sql.query<{ next_sequence: string | number }>(\n\t\t\t`INSERT INTO fabric_platform.event_sequences (tenant_id,space_id,next_sequence)\n\t\t\t VALUES ($1,$2,1) ON CONFLICT (tenant_id,space_id) DO UPDATE\n\t\t\t SET next_sequence=fabric_platform.event_sequences.next_sequence+1\n\t\t\t RETURNING next_sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn Number(result.rows[0]!.next_sequence);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t) {\n\t\tconst result = await this.sql.query<{ state?: string }>(\n\t\t\t`SELECT payload->>'toState' AS state FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 AND subject_type=$3 AND subject_id=$4\n\t\t\t AND payload ? 'toState' ORDER BY sequence DESC LIMIT 1`,\n\t\t\t[tenantId, spaceId, entityType, entityId],\n\t\t);\n\t\treturn result.rows[0]?.state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst conditions: string[] = [];\n\t\tconst values: unknown[] = [];\n\t\tconst add = (condition: string, value: unknown) => {\n\t\t\tvalues.push(value);\n\t\t\tconditions.push(condition.replace(\"?\", `$${values.length}`));\n\t\t};\n\t\tif (input.tenantId) add(\"tenant_id=?\", input.tenantId);\n\t\tif (input.spaceId) add(\"space_id=?\", input.spaceId);\n\t\tif (input.statuses?.length) add(\"status = ANY(?::text[])\", [...input.statuses]);\n\t\tif (input.updatedBefore) add(\"updated_at<?\", input.updatedBefore);\n\t\tvalues.push(Math.max(1, Math.min(input.limit ?? 100, 1_000)));\n\t\tconst where = conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations ${where}\n\t\t\t ORDER BY created_at LIMIT $${values.length}`,\n\t\t\tvalues,\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst limit = Math.max(1, Math.min(input.limit ?? 10, 100));\n\t\tconst leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`WITH claimable AS (\n\t\t\t\tSELECT id FROM fabric_platform.action_invocations\n\t\t\t\tWHERE (status='pending' OR\n\t\t\t\t (status='running' AND (lease_expires_at IS NULL OR lease_expires_at <= $1)))\n\t\t\t\t AND ($2::text IS NULL OR tenant_id=$2)\n\t\t\t\t AND ($3::text IS NULL OR space_id=$3)\n\t\t\t\tORDER BY created_at\n\t\t\t\tFOR UPDATE SKIP LOCKED\n\t\t\t\tLIMIT $4\n\t\t\t)\n\t\t\tUPDATE fabric_platform.action_invocations AS invocation\n\t\t\tSET status='running', lease_owner=$5, lease_expires_at=$6,\n\t\t\t attempt_count=attempt_count+1, updated_at=$1\n\t\t\tFROM claimable WHERE invocation.id=claimable.id\n\t\t\tRETURNING invocation.*`,\n\t\t\t[current, input.tenantId ?? null, input.spaceId ?? null, limit, input.workerId,\n\t\t\t leaseExpiresAt],\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 ORDER BY sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn result.rows.map(toEventRecord);\n\t}\n}\n\nfunction toAdapterRecord(row: Record<string, unknown>): AdapterInvocationRecord {\n\treturn {\n\t\tid: String(row.id),\n\t\tactionInvocationId: String(row.action_invocation_id),\n\t\ttenantId: String(row.tenant_id),\n\t\tspaceId: String(row.space_id),\n\t\tadapterType: String(row.adapter_type),\n\t\toperation: String(row.operation),\n\t\tvendor: String(row.vendor),\n\t\tstatus: String(row.status) as AdapterInvocationRecord[\"status\"],\n\t\tinput: row.input as Record<string, unknown>,\n\t\t...(row.output ? { output: row.output as Record<string, unknown> } : {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tattempt: Number(row.attempt),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toActionRecord(row: Record<string, unknown>): ActionInvocationRecord {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\tactionId: String(row.action_id) as ActionInvocationRecord[\"actionId\"],\n\t\tactionVersion: Number(row.action_version),\n\t\tactorId: String(row.actor_id),\n\t\tactorType: String(row.actor_type) as ActionInvocationRecord[\"actorType\"],\n\t\tstatus: String(row.status) as ActionInvocationRecord[\"status\"],\n\t\tparameters: row.parameters as Record<string, unknown>,\n\t\tresult: row.result as Record<string, unknown>, correlationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t\t...(row.idempotency_key ? { idempotencyKey: String(row.idempotency_key) } : {}),\n\t\tattemptCount: Number(row.attempt_count ?? 0),\n\t\t...(row.lease_owner ? { leaseOwner: String(row.lease_owner) } : {}),\n\t\t...(row.lease_expires_at\n\t\t\t? { leaseExpiresAt: new Date(row.lease_expires_at as string | Date) }\n\t\t\t: {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toEventRecord(row: Record<string, unknown>): AssetEventEnvelope {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\teventType: String(row.event_type), eventSchemaVersion: Number(row.event_schema_version),\n\t\tsubjectType: String(row.subject_type), subjectId: String(row.subject_id),\n\t\tactorId: String(row.actor_id), actorType: String(row.actor_type),\n\t\t...(row.action_invocation_id\n\t\t\t? { actionInvocationId: String(row.action_invocation_id) }\n\t\t\t: {}),\n\t\tpayload: row.payload, sequence: Number(row.sequence),\n\t\toccurredAt: new Date(row.occurred_at as string | Date),\n\t\trecordedAt: new Date(row.recorded_at as string | Date),\n\t\tcorrelationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t};\n}\n","import type {\n\tPlatformActionDispatcher,\n\tPlatformActionWorkerCycleResult,\n\tPlatformActionWorkerOptions,\n} from \"./types\";\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_LEASE_DURATION_MS = 5 * 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\n\n/**\n * Durable store-backed dispatch: the pending invocation row is the queue item.\n * Repeated dispatches are safe because the workflow id is stable per invocation.\n */\nexport function createStoreBackedActionDispatcher(): PlatformActionDispatcher {\n\treturn {\n\t\tdispatch: async (input) => ({ workflowId: input.workflowId }),\n\t};\n}\n\n/** Claim and execute one bounded batch. Safe to run concurrently across workers. */\nexport async function runPlatformActionWorkerCycle<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<PlatformActionWorkerCycleResult> {\n\tconst claimed = await options.store.claimActionInvocations({\n\t\tworkerId: options.workerId,\n\t\tlimit: options.batchSize ?? DEFAULT_BATCH_SIZE,\n\t\tleaseDurationMs: options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n\t\t...(options.tenantId ? { tenantId: options.tenantId } : {}),\n\t\t...(options.spaceId ? { spaceId: options.spaceId } : {}),\n\t});\n\tlet completed = 0;\n\tlet failed = 0;\n\tfor (const invocation of claimed) {\n\t\ttry {\n\t\t\tconst result = await options.host.executeInvocation(\n\t\t\t\tinvocation.id,\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t);\n\t\t\tif (result.status === \"completed\") completed += 1;\n\t\t\telse failed += 1;\n\t\t} catch (error) {\n\t\t\tfailed += 1;\n\t\t\toptions.onError?.(error, invocation);\n\t\t}\n\t}\n\treturn { claimed: claimed.length, completed, failed };\n}\n\n/** Poll until aborted. Each iteration is bounded and waits without busy-spinning. */\nexport async function runPlatformActionWorker<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<void> {\n\twhile (!options.signal?.aborted) {\n\t\ttry {\n\t\t\tawait runPlatformActionWorkerCycle(options);\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t\tawait abortableDelay(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, options.signal);\n\t}\n}\n\nasync function abortableDelay(milliseconds: number, signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\tawait new Promise<void>((resolve) => {\n\t\tconst timeout = setTimeout(resolve, milliseconds);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -63,6 +63,7 @@ interface PlatformHostStore<TDb> {
|
|
|
63
63
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
64
64
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
65
65
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
66
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
66
67
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
67
68
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
68
69
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
|
@@ -198,6 +199,7 @@ declare class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {
|
|
|
198
199
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
199
200
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
200
201
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
202
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
201
203
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
202
204
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
203
205
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
|
@@ -226,6 +228,7 @@ declare class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {
|
|
|
226
228
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
227
229
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
228
230
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
231
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
229
232
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
230
233
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
231
234
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
package/dist/index.d.ts
CHANGED
|
@@ -63,6 +63,7 @@ interface PlatformHostStore<TDb> {
|
|
|
63
63
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
64
64
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
65
65
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
66
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
66
67
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
67
68
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
68
69
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
|
@@ -198,6 +199,7 @@ declare class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {
|
|
|
198
199
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
199
200
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
200
201
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
202
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
201
203
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
202
204
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
203
205
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
|
@@ -226,6 +228,7 @@ declare class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {
|
|
|
226
228
|
updateActionInvocation(id: string, tenantId: string, spaceId: string, patch: Partial<Pick<ActionInvocationRecord, "status" | "result" | "error">>): Promise<void>;
|
|
227
229
|
appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void>;
|
|
228
230
|
createAdapterInvocation(record: AdapterInvocationRecord): Promise<void>;
|
|
231
|
+
getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined>;
|
|
229
232
|
updateAdapterInvocation(id: string, patch: Partial<Pick<AdapterInvocationRecord, "status" | "output" | "error" | "attempt" | "updatedAt">>): Promise<void>;
|
|
230
233
|
appendEvent(event: AssetEventEnvelope): Promise<void>;
|
|
231
234
|
nextEventSequence(tenantId: string, spaceId: string): Promise<number>;
|
package/dist/index.js
CHANGED
|
@@ -99,6 +99,13 @@ function createGovernedActionHost(options) {
|
|
|
99
99
|
if (!action) {
|
|
100
100
|
return fail(invocation, "failed", `Unknown action: ${invocation.actionId}`);
|
|
101
101
|
}
|
|
102
|
+
if (invocation.attemptCount > 1 && !action.idempotent) {
|
|
103
|
+
return fail(
|
|
104
|
+
invocation,
|
|
105
|
+
"failed",
|
|
106
|
+
`Interrupted action ${invocation.actionId} is not declared idempotent; manual reconciliation is required.`
|
|
107
|
+
);
|
|
108
|
+
}
|
|
102
109
|
await options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {
|
|
103
110
|
status: "running"
|
|
104
111
|
});
|
|
@@ -127,7 +134,7 @@ function createGovernedActionHost(options) {
|
|
|
127
134
|
});
|
|
128
135
|
for (const outcome of outcomes) {
|
|
129
136
|
await options.store.appendPolicyEvaluation({
|
|
130
|
-
id:
|
|
137
|
+
id: lifecycleId("pol", actionInvocationId, outcome.policyId),
|
|
131
138
|
actionInvocationId,
|
|
132
139
|
tenantId,
|
|
133
140
|
spaceId,
|
|
@@ -143,7 +150,7 @@ function createGovernedActionHost(options) {
|
|
|
143
150
|
subjectType: "ActionInvocation",
|
|
144
151
|
subjectId: actionInvocationId,
|
|
145
152
|
payload: { actionId: action.actionId, policyId: aggregate.policyId, reason }
|
|
146
|
-
});
|
|
153
|
+
}, `compliance:${aggregate.policyId}`);
|
|
147
154
|
return fail(invocation, "blocked_by_policy", reason);
|
|
148
155
|
}
|
|
149
156
|
const binding = action.stateMachine;
|
|
@@ -162,7 +169,8 @@ function createGovernedActionHost(options) {
|
|
|
162
169
|
targetState,
|
|
163
170
|
action.actionId
|
|
164
171
|
);
|
|
165
|
-
|
|
172
|
+
const replayingAppliedTransition = action.idempotent && currentState === targetState;
|
|
173
|
+
if (!transition.valid && !replayingAppliedTransition) {
|
|
166
174
|
return fail(invocation, "failed", transition.error ?? "Invalid state transition");
|
|
167
175
|
}
|
|
168
176
|
}
|
|
@@ -191,16 +199,22 @@ function createGovernedActionHost(options) {
|
|
|
191
199
|
data = handlerResult.data ?? {};
|
|
192
200
|
domainEvents = extractEvents(data);
|
|
193
201
|
if (action.eventPhase !== "after_adapters") {
|
|
194
|
-
for (const event of domainEvents)
|
|
202
|
+
for (const [index, event] of domainEvents.entries()) {
|
|
203
|
+
await appendEvent(invocation, event, `domain:${index}`);
|
|
204
|
+
}
|
|
195
205
|
}
|
|
196
206
|
} catch (error) {
|
|
197
207
|
return fail(invocation, "failed", errorMessage(error));
|
|
198
208
|
}
|
|
199
|
-
for (const step of action.adapterSteps ?? []) {
|
|
209
|
+
for (const [stepIndex, step] of (action.adapterSteps ?? []).entries()) {
|
|
200
210
|
const input = step.getInput(parsed.data, data);
|
|
201
211
|
if (!input) continue;
|
|
202
212
|
const adapter = adapters.require(step.adapterType, step.operation);
|
|
203
|
-
const adapterInvocationId =
|
|
213
|
+
const adapterInvocationId = lifecycleId("adp", actionInvocationId, String(stepIndex));
|
|
214
|
+
const previousAdapterInvocation = await options.store.getAdapterInvocation(
|
|
215
|
+
adapterInvocationId
|
|
216
|
+
);
|
|
217
|
+
if (previousAdapterInvocation?.status === "succeeded") continue;
|
|
204
218
|
const adapterEventSubject = options.adapterEventSubject?.(
|
|
205
219
|
action.actionId,
|
|
206
220
|
parsed.data,
|
|
@@ -233,7 +247,7 @@ function createGovernedActionHost(options) {
|
|
|
233
247
|
subjectType: adapterEventSubject.subjectType,
|
|
234
248
|
subjectId: adapterEventSubject.subjectId,
|
|
235
249
|
payload: { adapterType: step.adapterType, operation: step.operation }
|
|
236
|
-
});
|
|
250
|
+
}, `adapter:${stepIndex}:started`);
|
|
237
251
|
try {
|
|
238
252
|
const result2 = await executeWithAdapterRetry({
|
|
239
253
|
policy: step.retryPolicy ?? adapter.retryPolicy,
|
|
@@ -268,7 +282,7 @@ function createGovernedActionHost(options) {
|
|
|
268
282
|
subjectType: adapterEventSubject.subjectType,
|
|
269
283
|
subjectId: adapterEventSubject.subjectId,
|
|
270
284
|
payload: { adapterType: step.adapterType, operation: step.operation }
|
|
271
|
-
});
|
|
285
|
+
}, `adapter:${stepIndex}:failed`);
|
|
272
286
|
return fail(invocation, "failed", result2.error ?? "Adapter failed");
|
|
273
287
|
}
|
|
274
288
|
const resultRecord = result2;
|
|
@@ -292,7 +306,7 @@ function createGovernedActionHost(options) {
|
|
|
292
306
|
input: recordedInput,
|
|
293
307
|
output
|
|
294
308
|
}
|
|
295
|
-
});
|
|
309
|
+
}, `adapter:${stepIndex}:succeeded`);
|
|
296
310
|
} catch (error) {
|
|
297
311
|
const message = errorMessage(error);
|
|
298
312
|
await options.store.updateAdapterInvocation(adapterInvocationId, {
|
|
@@ -304,7 +318,9 @@ function createGovernedActionHost(options) {
|
|
|
304
318
|
}
|
|
305
319
|
}
|
|
306
320
|
if (action.eventPhase === "after_adapters") {
|
|
307
|
-
for (const event of domainEvents)
|
|
321
|
+
for (const [index, event] of domainEvents.entries()) {
|
|
322
|
+
await appendEvent(invocation, event, `domain:${index}`);
|
|
323
|
+
}
|
|
308
324
|
}
|
|
309
325
|
const result = withoutPrivateHostFields(data);
|
|
310
326
|
await options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {
|
|
@@ -316,10 +332,10 @@ function createGovernedActionHost(options) {
|
|
|
316
332
|
return fail(invocation, "failed", errorMessage(error));
|
|
317
333
|
}
|
|
318
334
|
}
|
|
319
|
-
async function appendEvent(invocation, event) {
|
|
335
|
+
async function appendEvent(invocation, event, deduplicationKey) {
|
|
320
336
|
const timestamp = now();
|
|
321
337
|
const envelope = {
|
|
322
|
-
id:
|
|
338
|
+
id: lifecycleId("evt", invocation.id, deduplicationKey),
|
|
323
339
|
tenantId: invocation.tenantId,
|
|
324
340
|
spaceId: invocation.spaceId,
|
|
325
341
|
eventType: event.eventType,
|
|
@@ -389,6 +405,10 @@ function errorMessage(error) {
|
|
|
389
405
|
function isRecord(value) {
|
|
390
406
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
391
407
|
}
|
|
408
|
+
function lifecycleId(prefix, invocationId, key) {
|
|
409
|
+
const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 96);
|
|
410
|
+
return `${prefix}_${invocationId}_${safeKey}`;
|
|
411
|
+
}
|
|
392
412
|
|
|
393
413
|
// src/memory-store.ts
|
|
394
414
|
var MemoryPlatformHostStore = class {
|
|
@@ -426,17 +446,23 @@ var MemoryPlatformHostStore = class {
|
|
|
426
446
|
Object.assign(record, patch, { updatedAt: /* @__PURE__ */ new Date() });
|
|
427
447
|
}
|
|
428
448
|
async appendPolicyEvaluation(record) {
|
|
449
|
+
if (this.policyEvaluations.some((candidate) => candidate.id === record.id)) return;
|
|
429
450
|
this.policyEvaluations.push(record);
|
|
430
451
|
}
|
|
431
452
|
async createAdapterInvocation(record) {
|
|
453
|
+
if (this.adapterInvocations.some((candidate) => candidate.id === record.id)) return;
|
|
432
454
|
this.adapterInvocations.push(record);
|
|
433
455
|
}
|
|
456
|
+
async getAdapterInvocation(id) {
|
|
457
|
+
return this.adapterInvocations.find((candidate) => candidate.id === id);
|
|
458
|
+
}
|
|
434
459
|
async updateAdapterInvocation(id, patch) {
|
|
435
460
|
const record = this.adapterInvocations.find((candidate) => candidate.id === id);
|
|
436
461
|
if (!record) throw new Error(`AdapterInvocation not found: ${id}`);
|
|
437
462
|
Object.assign(record, patch);
|
|
438
463
|
}
|
|
439
464
|
async appendEvent(event) {
|
|
465
|
+
if (this.events.some((candidate) => candidate.id === event.id)) return;
|
|
440
466
|
this.events.push(event);
|
|
441
467
|
}
|
|
442
468
|
async nextEventSequence(tenantId, spaceId) {
|
|
@@ -607,7 +633,7 @@ var PostgresPlatformHostStore = class {
|
|
|
607
633
|
await this.sql.query(
|
|
608
634
|
`INSERT INTO fabric_platform.policy_evaluations
|
|
609
635
|
(id,action_invocation_id,tenant_id,space_id,outcome,created_at)
|
|
610
|
-
VALUES ($1,$2,$3,$4,$5::jsonb,$6)`,
|
|
636
|
+
VALUES ($1,$2,$3,$4,$5::jsonb,$6) ON CONFLICT (id) DO NOTHING`,
|
|
611
637
|
[
|
|
612
638
|
record.id,
|
|
613
639
|
record.actionInvocationId,
|
|
@@ -623,7 +649,8 @@ var PostgresPlatformHostStore = class {
|
|
|
623
649
|
`INSERT INTO fabric_platform.adapter_invocations
|
|
624
650
|
(id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,
|
|
625
651
|
input,output,error,attempt,created_at,updated_at)
|
|
626
|
-
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)
|
|
652
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)
|
|
653
|
+
ON CONFLICT (id) DO NOTHING`,
|
|
627
654
|
[
|
|
628
655
|
record.id,
|
|
629
656
|
record.actionInvocationId,
|
|
@@ -642,6 +669,13 @@ var PostgresPlatformHostStore = class {
|
|
|
642
669
|
]
|
|
643
670
|
);
|
|
644
671
|
}
|
|
672
|
+
async getAdapterInvocation(id) {
|
|
673
|
+
const result = await this.sql.query(
|
|
674
|
+
`SELECT * FROM fabric_platform.adapter_invocations WHERE id=$1`,
|
|
675
|
+
[id]
|
|
676
|
+
);
|
|
677
|
+
return result.rows[0] ? toAdapterRecord(result.rows[0]) : void 0;
|
|
678
|
+
}
|
|
645
679
|
async updateAdapterInvocation(id, patch) {
|
|
646
680
|
await this.sql.query(
|
|
647
681
|
`UPDATE fabric_platform.adapter_invocations SET
|
|
@@ -665,7 +699,8 @@ var PostgresPlatformHostStore = class {
|
|
|
665
699
|
(id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,
|
|
666
700
|
actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,
|
|
667
701
|
correlation_id,causation_id)
|
|
668
|
-
|
|
702
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)
|
|
703
|
+
ON CONFLICT (id) DO NOTHING`,
|
|
669
704
|
[
|
|
670
705
|
event.id,
|
|
671
706
|
event.tenantId,
|
|
@@ -765,6 +800,24 @@ var PostgresPlatformHostStore = class {
|
|
|
765
800
|
return result.rows.map(toEventRecord);
|
|
766
801
|
}
|
|
767
802
|
};
|
|
803
|
+
function toAdapterRecord(row) {
|
|
804
|
+
return {
|
|
805
|
+
id: String(row.id),
|
|
806
|
+
actionInvocationId: String(row.action_invocation_id),
|
|
807
|
+
tenantId: String(row.tenant_id),
|
|
808
|
+
spaceId: String(row.space_id),
|
|
809
|
+
adapterType: String(row.adapter_type),
|
|
810
|
+
operation: String(row.operation),
|
|
811
|
+
vendor: String(row.vendor),
|
|
812
|
+
status: String(row.status),
|
|
813
|
+
input: row.input,
|
|
814
|
+
...row.output ? { output: row.output } : {},
|
|
815
|
+
...row.error ? { error: String(row.error) } : {},
|
|
816
|
+
attempt: Number(row.attempt),
|
|
817
|
+
createdAt: new Date(row.created_at),
|
|
818
|
+
updatedAt: new Date(row.updated_at)
|
|
819
|
+
};
|
|
820
|
+
}
|
|
768
821
|
function toActionRecord(row) {
|
|
769
822
|
return {
|
|
770
823
|
id: String(row.id),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/host.ts","../src/memory-store.ts","../src/postgres-store.ts","../src/worker.ts"],"names":["result","record"],"mappings":"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","file":"index.js","sourcesContent":["import {\n\tAdapterRegistry,\n\taggregatePolicyOutcomes,\n\tcreateFabricId,\n\tevaluatePolicyDefinitions,\n\texecuteWithAdapterRetry,\n\tresolveAction,\n\tresolveStateMachine,\n\tvalidateTransition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionDefinition,\n\tActionId,\n\tActionStatus,\n\tAssetEventEnvelope,\n\tRuntimePolicyDefinition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionAuthorizationInput,\n\tAdapterInvocationRecord,\n\tExecuteActionResult,\n\tGovernedActionHost,\n\tPendingAssetEvent,\n\tPlatformHostOptions,\n\tSubmitActionInput,\n\tSubmitActionResult,\n} from \"./types\";\n\nconst DEFAULT_EXTRACT_EVENTS = (data: Record<string, unknown>): PendingAssetEvent[] => {\n\tconst value = data._events;\n\treturn Array.isArray(value) ? (value as PendingAssetEvent[]) : [];\n};\n\nexport function createGovernedActionHost<TDb>(\n\toptions: PlatformHostOptions<TDb>,\n): GovernedActionHost {\n\tconst adapters = new AdapterRegistry();\n\tfor (const adapter of options.adapters ?? []) adapters.register(adapter);\n\tconst now = options.now ?? (() => new Date());\n\tconst extractEvents = options.extractEvents ?? DEFAULT_EXTRACT_EVENTS;\n\n\tasync function submitAction(input: SubmitActionInput): Promise<SubmitActionResult> {\n\t\tconst action = resolveAction(input.actionId);\n\t\tif (!action) throw new Error(`Unknown action: ${input.actionId}`);\n\t\tconst authorizationInput = toAuthorizationInput(action, input);\n\t\tif (!(await options.authorization.checkEntitlement(authorizationInput))) {\n\t\t\tthrow new Error(`Module \"${action.namespace}\" is not enabled for tenant ${input.tenantId}`);\n\t\t}\n\t\tif (!(await options.authorization.authorize(authorizationInput))) {\n\t\t\tthrow new Error(`Actor ${input.actorId} is not authorized for action ${input.actionId}`);\n\t\t}\n\n\t\tconst actionInvocationId = createFabricId(\"act\");\n\t\tconst correlationId = input.correlationId ?? createFabricId(\"corr\");\n\t\tconst durableParameters = options.redactActionParameters\n\t\t\t? options.redactActionParameters(input.actionId, input.parameters)\n\t\t\t: input.parameters;\n\t\tconst durableInvocation = await options.store.createActionInvocation({\n\t\t\tid: actionInvocationId,\n\t\t\ttenantId: input.tenantId,\n\t\t\tspaceId: input.spaceId,\n\t\t\tactionId: input.actionId,\n\t\t\tactionVersion: action.version,\n\t\t\tactorId: input.actorId,\n\t\t\tactorType: input.actorType,\n\t\t\tstatus: \"pending\",\n\t\t\tparameters: durableParameters,\n\t\t\tresult: {},\n\t\t\tcorrelationId,\n\t\t\t...(input.causationId ? { causationId: input.causationId } : {}),\n\t\t\t...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n\t\t});\n\t\tconst durableWorkflowId = `action-invocation-${durableInvocation.id}`;\n\t\tif (durableInvocation.id !== actionInvocationId && isTerminal(durableInvocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\tresult: durableInvocation.result,\n\t\t\t\t...(durableInvocation.error ? { error: durableInvocation.error } : {}),\n\t\t\t};\n\t\t}\n\n\t\tif (options.dispatcher) {\n\t\t\ttry {\n\t\t\t\tconst dispatched = await options.dispatcher.dispatch({\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\ttenantId: input.tenantId,\n\t\t\t\t\tspaceId: input.spaceId,\n\t\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\t\tworkflowId: dispatched.workflowId,\n\t\t\t\t\t...(dispatched.runId ? { runId: dispatched.runId } : {}),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateActionInvocation(\n\t\t\t\t\tdurableInvocation.id,\n\t\t\t\t\tinput.tenantId,\n\t\t\t\t\tinput.spaceId,\n\t\t\t\t\t{ status: \"failed\", error: message },\n\t\t\t\t);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst executed = await executeInvocation(\n\t\t\tdurableInvocation.id,\n\t\t\tinput.tenantId,\n\t\t\tinput.spaceId,\n\t\t);\n\t\treturn { ...executed, workflowId: durableWorkflowId };\n\t}\n\n\tasync function executeInvocation(\n\t\tactionInvocationId: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ExecuteActionResult> {\n\t\tconst invocation = await options.store.getActionInvocation(\n\t\t\tactionInvocationId,\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t);\n\t\tif (!invocation) throw new Error(`ActionInvocation not found: ${actionInvocationId}`);\n\t\tif (isTerminal(invocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId,\n\t\t\t\tstatus: invocation.status,\n\t\t\t\tresult: invocation.result,\n\t\t\t\t...(invocation.error ? { error: invocation.error } : {}),\n\t\t\t};\n\t\t}\n\t\tconst action = resolveAction(invocation.actionId);\n\t\tif (!action) {\n\t\t\treturn fail(invocation, \"failed\", `Unknown action: ${invocation.actionId}`);\n\t\t}\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"running\",\n\t\t});\n\t\ttry {\n\n\t\tconst parsed = action.schema.safeParse(invocation.parameters);\n\t\tif (!parsed.success) {\n\t\t\tconst message = parsed.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n\t\t\t\t.join(\"; \");\n\t\t\treturn fail(invocation, \"validation_failed\", message);\n\t\t}\n\n\t\tconst authorizationInput = toAuthorizationInput(action, invocation);\n\t\tconst definitions = options.resolvePolicies\n\t\t\t? await options.resolvePolicies({\n\t\t\t\t\t...authorizationInput,\n\t\t\t\t\tdeclaredPolicyIds: action.policies ?? [],\n\t\t\t\t})\n\t\t\t: declaredPolicies(action.policies ?? []);\n\t\tconst outcomes = await evaluatePolicyDefinitions(definitions, {\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t\tactionInvocationId,\n\t\t\tactionId: action.actionId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tparameters: parsed.data,\n\t\t\tdb: options.store.db,\n\t\t\tservices: options.services,\n\t\t\tmode: \"execute\",\n\t\t});\n\t\tfor (const outcome of outcomes) {\n\t\t\tawait options.store.appendPolicyEvaluation({\n\t\t\t\tid: createFabricId(\"pol\"),\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\toutcome,\n\t\t\t\tcreatedAt: now(),\n\t\t\t});\n\t\t}\n\t\tconst aggregate = aggregatePolicyOutcomes(outcomes);\n\t\tif (aggregate?.result === \"block\") {\n\t\t\tconst reason = aggregate.reason ?? `Blocked by policy ${aggregate.policyId}`;\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"ComplianceBlocked\",\n\t\t\t\tsubjectType: \"ActionInvocation\",\n\t\t\t\tsubjectId: actionInvocationId,\n\t\t\t\tpayload: { actionId: action.actionId, policyId: aggregate.policyId, reason },\n\t\t\t});\n\t\t\treturn fail(invocation, \"blocked_by_policy\", reason);\n\t\t}\n\n\t\tconst binding = action.stateMachine;\n\t\tif (binding) {\n\t\t\tconst entityId = binding.getEntityId(parsed.data);\n\t\t\tconst currentState = entityId\n\t\t\t\t? ((await options.store.getEntityState(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\tbinding.entityType,\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t)) ?? initialState(binding.entityType))\n\t\t\t\t: initialState(binding.entityType);\n\t\t\tconst targetState =\n\t\t\t\ttypeof binding.targetState === \"function\"\n\t\t\t\t\t? binding.targetState(parsed.data)\n\t\t\t\t\t: binding.targetState;\n\t\t\tconst transition = validateTransition(\n\t\t\t\tbinding.entityType,\n\t\t\t\tcurrentState,\n\t\t\t\ttargetState,\n\t\t\t\taction.actionId,\n\t\t\t);\n\t\t\tif (!transition.valid) {\n\t\t\t\treturn fail(invocation, \"failed\", transition.error ?? \"Invalid state transition\");\n\t\t\t}\n\t\t}\n\n\t\tlet data: Record<string, unknown>;\n\t\tlet domainEvents: PendingAssetEvent[] = [];\n\t\ttry {\n\t\t\tconst handlerResult = await options.store.transaction((db) =>\n\t\t\t\taction.handler\n\t\t\t\t\t? action.handler(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\t\tactorId: invocation.actorId,\n\t\t\t\t\t\t\t\tactorType: invocation.actorType,\n\t\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tservices: options.services,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparsed.data,\n\t\t\t\t\t\t)\n\t\t\t\t\t: Promise.resolve({ success: true, data: {} }),\n\t\t\t);\n\t\t\tif (!handlerResult.success) {\n\t\t\t\treturn fail(invocation, \"failed\", handlerResult.error ?? \"Action handler failed\");\n\t\t\t}\n\t\t\tdata = handlerResult.data ?? {};\n\t\t\tdomainEvents = extractEvents(data);\n\t\t\tif (action.eventPhase !== \"after_adapters\") {\n\t\t\t\tfor (const event of domainEvents) await appendEvent(invocation, event);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\n\t\tfor (const step of action.adapterSteps ?? []) {\n\t\t\tconst input = step.getInput(parsed.data, data);\n\t\t\tif (!input) continue;\n\t\t\tconst adapter = adapters.require(step.adapterType, step.operation);\n\t\t\tconst adapterInvocationId = createFabricId(\"adp\");\n\t\t\tconst adapterEventSubject = options.adapterEventSubject?.(\n\t\t\t\taction.actionId,\n\t\t\t\tparsed.data,\n\t\t\t\tdata,\n\t\t\t) ?? { subjectType: \"AdapterInvocation\", subjectId: adapterInvocationId };\n\t\t\tconst recordedInput = options.redactAdapterInput\n\t\t\t\t? options.redactAdapterInput(\n\t\t\t\t\t\taction.actionId,\n\t\t\t\t\t\tstep.adapterType,\n\t\t\t\t\t\tstep.operation,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t)\n\t\t\t\t: input;\n\t\t\tconst startedAt = now();\n\t\t\tconst record: AdapterInvocationRecord = {\n\t\t\t\tid: adapterInvocationId,\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\tadapterType: step.adapterType,\n\t\t\t\toperation: step.operation,\n\t\t\t\tvendor: adapter.vendor,\n\t\t\t\tstatus: \"running\",\n\t\t\t\tinput: recordedInput,\n\t\t\t\tattempt: 1,\n\t\t\t\tcreatedAt: startedAt,\n\t\t\t\tupdatedAt: startedAt,\n\t\t\t};\n\t\t\tawait options.store.createAdapterInvocation(record);\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"AdapterInvocationStarted\",\n\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst result = await executeWithAdapterRetry({\n\t\t\t\t\tpolicy: step.retryPolicy ?? adapter.retryPolicy,\n\t\t\t\t\tdefaultIdempotent: adapter.idempotent,\n\t\t\t\t\texecute: async (attempt, maxAttempts) => {\n\t\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn adapter.execute(input, {\n\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\tadapterInvocationId,\n\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t...(invocation.causationId\n\t\t\t\t\t\t\t\t? { causationId: invocation.causationId }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tisSuccessful: (result) => result.success,\n\t\t\t\t\tgetError: (result) => result.error,\n\t\t\t\t});\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\terror: result.error ?? \"Adapter failed\",\n\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t});\n\t\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\t\teventType: \"AdapterInvocationFailed\",\n\t\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t\t\t});\n\t\t\t\t\treturn fail(invocation, \"failed\", result.error ?? \"Adapter failed\");\n\t\t\t\t}\n\t\t\t\tconst resultRecord = result as unknown as Record<string, unknown>;\n\t\t\t\tconst output = isRecord(resultRecord.output)\n\t\t\t\t\t? resultRecord.output\n\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(resultRecord).filter(\n\t\t\t\t\t\t\t\t([key]) => key !== \"success\" && key !== \"error\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"succeeded\",\n\t\t\t\t\toutput,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\teventType: \"AdapterInvocationSucceeded\",\n\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tadapterType: step.adapterType,\n\t\t\t\t\t\toperation: step.operation,\n\t\t\t\t\t\tinput: recordedInput,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: message,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\treturn fail(invocation, \"failed\", message);\n\t\t\t}\n\t\t}\n\n\t\tif (action.eventPhase === \"after_adapters\") {\n\t\t\tfor (const event of domainEvents) await appendEvent(invocation, event);\n\t\t}\n\n\t\tconst result = withoutPrivateHostFields(data);\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"completed\",\n\t\t\tresult,\n\t\t});\n\t\treturn { actionInvocationId, status: \"completed\", result };\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\t}\n\n\tasync function appendEvent(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t\tactorId: string;\n\t\t\tactorType: string;\n\t\t\tcorrelationId: string;\n\t\t\tcausationId?: string;\n\t\t},\n\t\tevent: PendingAssetEvent,\n\t): Promise<void> {\n\t\tconst timestamp = now();\n\t\tconst envelope: AssetEventEnvelope = {\n\t\t\tid: createFabricId(\"evt\"),\n\t\t\ttenantId: invocation.tenantId,\n\t\t\tspaceId: invocation.spaceId,\n\t\t\teventType: event.eventType,\n\t\t\teventSchemaVersion: event.eventSchemaVersion ?? 1,\n\t\t\tsubjectType: event.subjectType,\n\t\t\tsubjectId: event.subjectId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tactionInvocationId: invocation.id,\n\t\t\tpayload: event.payload,\n\t\t\tsequence: await options.store.nextEventSequence(\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t),\n\t\t\toccurredAt: timestamp,\n\t\t\trecordedAt: timestamp,\n\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t};\n\t\tawait options.store.appendEvent(envelope);\n\t}\n\n\tasync function fail(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t},\n\t\tstatus: Extract<ActionStatus, \"failed\" | \"blocked_by_policy\" | \"validation_failed\">,\n\t\terror: string,\n\t): Promise<ExecuteActionResult> {\n\t\tawait options.store.updateActionInvocation(\n\t\t\tinvocation.id,\n\t\t\tinvocation.tenantId,\n\t\t\tinvocation.spaceId,\n\t\t\t{ status, error },\n\t\t);\n\t\treturn { actionInvocationId: invocation.id, status, error };\n\t}\n\n\treturn { submitAction, executeInvocation };\n}\n\nfunction toAuthorizationInput(\n\taction: ActionDefinition,\n\tinput: {\n\t\ttenantId: string;\n\t\tspaceId: string;\n\t\tactorId: string;\n\t\tactorType: import(\"@fabricorg/platform\").ActorType;\n\t},\n): ActionAuthorizationInput {\n\treturn {\n\t\tactionId: action.actionId,\n\t\tnamespace: action.namespace,\n\t\trequiredPermissions: action.requiredPermissions ?? [],\n\t\trequiredRoles: action.requiredRoles ?? [],\n\t\ttenantId: input.tenantId,\n\t\tspaceId: input.spaceId,\n\t\tactorId: input.actorId,\n\t\tactorType: input.actorType,\n\t};\n}\n\nfunction declaredPolicies(policyIds: readonly string[]): RuntimePolicyDefinition[] {\n\treturn policyIds.map((policyId) => ({\n\t\tpolicyId: policyId as `${string}.v${number}`,\n\t\tpolicyVersion: Number(policyId.split(\".v\").at(-1) ?? 1),\n\t\tkind: \"code\",\n\t\tcodeEvaluatorPolicyId: policyId as `${string}.v${number}`,\n\t}));\n}\n\nfunction initialState(entityType: string): string {\n\tconst machine = resolveStateMachine(entityType);\n\treturn Object.values(machine?.states ?? {}).find((state) => state.stateClass === \"initial\")?.id ?? \"none\";\n}\n\nfunction isTerminal(status: ActionStatus): boolean {\n\treturn [\"completed\", \"failed\", \"blocked_by_policy\", \"validation_failed\"].includes(status);\n}\n\nfunction withoutPrivateHostFields(data: Record<string, unknown>): Record<string, unknown> {\n\tconst { _events: _ignored, ...result } = data;\n\treturn result;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\treadonly invocations: ActionInvocationRecord[] = [];\n\treadonly policyEvaluations: PolicyEvaluationRecord[] = [];\n\treadonly adapterInvocations: AdapterInvocationRecord[] = [];\n\treadonly events: AssetEventEnvelope[] = [];\n\n\tconstructor(readonly db: TDb) {}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tif (input.idempotencyKey) {\n\t\t\tconst existing = this.invocations.find(\n\t\t\t\t(record) =>\n\t\t\t\t\trecord.tenantId === input.tenantId &&\n\t\t\t\t\trecord.spaceId === input.spaceId &&\n\t\t\t\t\trecord.actionId === input.actionId &&\n\t\t\t\t\trecord.idempotencyKey === input.idempotencyKey,\n\t\t\t);\n\t\t\tif (existing) return existing;\n\t\t}\n\t\tconst now = new Date();\n\t\tconst record = { ...input, attemptCount: 0, createdAt: now, updatedAt: now };\n\t\tthis.invocations.push(record);\n\t\treturn record;\n\t}\n\n\tasync getActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ActionInvocationRecord | undefined> {\n\t\treturn this.invocations.find(\n\t\t\t(record) => record.id === id && record.tenantId === tenantId && record.spaceId === spaceId,\n\t\t);\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tconst record = await this.getActionInvocation(id, tenantId, spaceId);\n\t\tif (!record) throw new Error(`ActionInvocation not found: ${id}`);\n\t\tObject.assign(record, patch, { updatedAt: new Date() });\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tthis.policyEvaluations.push(record);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tthis.adapterInvocations.push(record);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tconst record = this.adapterInvocations.find((candidate) => candidate.id === id);\n\t\tif (!record) throw new Error(`AdapterInvocation not found: ${id}`);\n\t\tObject.assign(record, patch);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tthis.events.push(event);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\treturn (\n\t\t\tthis.events.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t\t.length + 1\n\t\t);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t): Promise<string | undefined> {\n\t\tlet state: string | undefined;\n\t\tfor (const event of this.events) {\n\t\t\tif (\n\t\t\t\tevent.tenantId !== tenantId ||\n\t\t\t\tevent.spaceId !== spaceId ||\n\t\t\t\tevent.subjectType !== entityType ||\n\t\t\t\tevent.subjectId !== entityId\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidate = (event.payload as { toState?: unknown } | undefined)?.toState;\n\t\t\tif (typeof candidate === \"string\") state = candidate;\n\t\t}\n\t\treturn state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\treturn this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(!input.statuses?.length || input.statuses.includes(record.status)) &&\n\t\t\t\t\t(!input.updatedBefore || record.updatedAt < input.updatedBefore),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 100);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst eligible = this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(record.status === \"pending\" ||\n\t\t\t\t\t\t(record.status === \"running\" &&\n\t\t\t\t\t\t\t(!record.leaseExpiresAt || record.leaseExpiresAt <= current))),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 10);\n\t\tfor (const record of eligible) {\n\t\t\trecord.status = \"running\";\n\t\t\trecord.leaseOwner = input.workerId;\n\t\t\trecord.leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\t\trecord.attemptCount += 1;\n\t\t\trecord.updatedAt = current;\n\t\t}\n\t\treturn eligible;\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\treturn this.events\n\t\t\t.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t.sort((left, right) => left.sequence - right.sequence);\n\t}\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport interface PlatformHostSqlResult<Row = Record<string, unknown>> {\n\trows: Row[];\n}\n\n/** Structural subset implemented by `pg.Pool` and Lakebase-compatible clients. */\nexport interface PlatformHostSqlClient {\n\tquery<Row = Record<string, unknown>>(\n\t\tsql: string,\n\t\tvalues?: unknown[],\n\t): Promise<PlatformHostSqlResult<Row>>;\n}\n\n/** Durable mutation-pipeline ledger for Databricks Lakebase or standard Postgres. */\nexport class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\tconstructor(\n\t\treadonly db: TDb,\n\t\tprivate readonly sql: PlatformHostSqlClient,\n\t) {}\n\n\tasync ensureSchema(): Promise<void> {\n\t\tawait this.sql.query(`\n\t\t\tCREATE SCHEMA IF NOT EXISTS fabric_platform;\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.action_invocations (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\taction_id text NOT NULL, action_version integer NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, status text NOT NULL,\n\t\t\t\tparameters jsonb NOT NULL, result jsonb NOT NULL DEFAULT '{}'::jsonb,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text, idempotency_key text, error text,\n\t\t\t\tattempt_count integer NOT NULL DEFAULT 0, lease_owner text,\n\t\t\t\tlease_expires_at timestamptz,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tALTER TABLE fabric_platform.action_invocations\n\t\t\t\tADD COLUMN IF NOT EXISTS idempotency_key text,\n\t\t\t\tADD COLUMN IF NOT EXISTS attempt_count integer NOT NULL DEFAULT 0,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_owner text,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_expires_at timestamptz;\n\t\t\tCREATE UNIQUE INDEX IF NOT EXISTS action_invocations_idempotency_idx\n\t\t\t\tON fabric_platform.action_invocations\n\t\t\t\t(tenant_id, space_id, action_id, idempotency_key)\n\t\t\t\tWHERE idempotency_key IS NOT NULL;\n\t\t\tCREATE INDEX IF NOT EXISTS action_invocations_worker_idx\n\t\t\t\tON fabric_platform.action_invocations (status, lease_expires_at, created_at);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.policy_evaluations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, outcome jsonb NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.adapter_invocations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, adapter_type text NOT NULL,\n\t\t\t\toperation text NOT NULL, vendor text NOT NULL, status text NOT NULL,\n\t\t\t\tinput jsonb NOT NULL, output jsonb, error text, attempt integer NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.event_sequences (\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, next_sequence bigint NOT NULL,\n\t\t\t\tPRIMARY KEY (tenant_id, space_id)\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.asset_events (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\tevent_type text NOT NULL, event_schema_version integer NOT NULL,\n\t\t\t\tsubject_type text NOT NULL, subject_id text NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, action_invocation_id text,\n\t\t\t\tpayload jsonb NOT NULL, sequence bigint NOT NULL,\n\t\t\t\toccurred_at timestamptz NOT NULL, recorded_at timestamptz NOT NULL,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text,\n\t\t\t\tUNIQUE (tenant_id, space_id, sequence)\n\t\t\t);\n\t\t\tCREATE INDEX IF NOT EXISTS asset_events_subject_idx\n\t\t\t\tON fabric_platform.asset_events\n\t\t\t\t(tenant_id, space_id, subject_type, subject_id, sequence);\n\t\t`);\n\t}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tconst now = new Date();\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`INSERT INTO fabric_platform.action_invocations\n\t\t\t (id,tenant_id,space_id,action_id,action_version,actor_id,actor_type,status,\n\t\t\t parameters,result,correlation_id,causation_id,idempotency_key,error,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14,$15,$15)\n\t\t\t ON CONFLICT (tenant_id,space_id,action_id,idempotency_key)\n\t\t\t WHERE idempotency_key IS NOT NULL DO UPDATE SET id=fabric_platform.action_invocations.id\n\t\t\t RETURNING *`,\n\t\t\t[\n\t\t\t\tinput.id, input.tenantId, input.spaceId, input.actionId, input.actionVersion,\n\t\t\t\tinput.actorId, input.actorType, input.status, JSON.stringify(input.parameters),\n\t\t\t\tJSON.stringify(input.result), input.correlationId, input.causationId ?? null,\n\t\t\t\tinput.idempotencyKey ?? null, input.error ?? null, now,\n\t\t\t],\n\t\t);\n\t\treturn toActionRecord(result.rows[0]!);\n\t}\n\n\tasync getActionInvocation(id: string, tenantId: string, spaceId: string) {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId],\n\t\t);\n\t\treturn result.rows[0] ? toActionRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.action_invocations SET\n\t\t\t status=COALESCE($4,status), result=COALESCE($5::jsonb,result),\n\t\t\t error=CASE WHEN $6::boolean THEN $7 ELSE error END,\n\t\t\t lease_owner=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_owner END,\n\t\t\t lease_expires_at=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_expires_at END,\n\t\t\t updated_at=now()\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId, patch.status ?? null,\n\t\t\t patch.result === undefined ? null : JSON.stringify(patch.result),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null],\n\t\t);\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.policy_evaluations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,outcome,created_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5::jsonb,$6)`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t JSON.stringify(record.outcome), record.createdAt],\n\t\t);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.adapter_invocations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,\n\t\t\t input,output,error,attempt,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t record.adapterType, record.operation, record.vendor, record.status,\n\t\t\t JSON.stringify(record.input), record.output ? JSON.stringify(record.output) : null,\n\t\t\t record.error ?? null, record.attempt, record.createdAt, record.updatedAt],\n\t\t);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.adapter_invocations SET\n\t\t\t status=COALESCE($2,status), output=COALESCE($3::jsonb,output),\n\t\t\t error=CASE WHEN $4::boolean THEN $5 ELSE error END,\n\t\t\t attempt=COALESCE($6,attempt), updated_at=COALESCE($7,now()) WHERE id=$1`,\n\t\t\t[id, patch.status ?? null,\n\t\t\t patch.output === undefined ? null : JSON.stringify(patch.output),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null, patch.attempt ?? null,\n\t\t\t patch.updatedAt ?? null],\n\t\t);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.asset_events\n\t\t\t (id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,\n\t\t\t actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,\n\t\t\t correlation_id,causation_id)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)`,\n\t\t\t[event.id, event.tenantId, event.spaceId, event.eventType, event.eventSchemaVersion,\n\t\t\t event.subjectType, event.subjectId, event.actorId, event.actorType,\n\t\t\t event.actionInvocationId ?? null, JSON.stringify(event.payload), event.sequence,\n\t\t\t event.occurredAt, event.recordedAt, event.correlationId, event.causationId ?? null],\n\t\t);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\tconst result = await this.sql.query<{ next_sequence: string | number }>(\n\t\t\t`INSERT INTO fabric_platform.event_sequences (tenant_id,space_id,next_sequence)\n\t\t\t VALUES ($1,$2,1) ON CONFLICT (tenant_id,space_id) DO UPDATE\n\t\t\t SET next_sequence=fabric_platform.event_sequences.next_sequence+1\n\t\t\t RETURNING next_sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn Number(result.rows[0]!.next_sequence);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t) {\n\t\tconst result = await this.sql.query<{ state?: string }>(\n\t\t\t`SELECT payload->>'toState' AS state FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 AND subject_type=$3 AND subject_id=$4\n\t\t\t AND payload ? 'toState' ORDER BY sequence DESC LIMIT 1`,\n\t\t\t[tenantId, spaceId, entityType, entityId],\n\t\t);\n\t\treturn result.rows[0]?.state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst conditions: string[] = [];\n\t\tconst values: unknown[] = [];\n\t\tconst add = (condition: string, value: unknown) => {\n\t\t\tvalues.push(value);\n\t\t\tconditions.push(condition.replace(\"?\", `$${values.length}`));\n\t\t};\n\t\tif (input.tenantId) add(\"tenant_id=?\", input.tenantId);\n\t\tif (input.spaceId) add(\"space_id=?\", input.spaceId);\n\t\tif (input.statuses?.length) add(\"status = ANY(?::text[])\", [...input.statuses]);\n\t\tif (input.updatedBefore) add(\"updated_at<?\", input.updatedBefore);\n\t\tvalues.push(Math.max(1, Math.min(input.limit ?? 100, 1_000)));\n\t\tconst where = conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations ${where}\n\t\t\t ORDER BY created_at LIMIT $${values.length}`,\n\t\t\tvalues,\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst limit = Math.max(1, Math.min(input.limit ?? 10, 100));\n\t\tconst leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`WITH claimable AS (\n\t\t\t\tSELECT id FROM fabric_platform.action_invocations\n\t\t\t\tWHERE (status='pending' OR\n\t\t\t\t (status='running' AND (lease_expires_at IS NULL OR lease_expires_at <= $1)))\n\t\t\t\t AND ($2::text IS NULL OR tenant_id=$2)\n\t\t\t\t AND ($3::text IS NULL OR space_id=$3)\n\t\t\t\tORDER BY created_at\n\t\t\t\tFOR UPDATE SKIP LOCKED\n\t\t\t\tLIMIT $4\n\t\t\t)\n\t\t\tUPDATE fabric_platform.action_invocations AS invocation\n\t\t\tSET status='running', lease_owner=$5, lease_expires_at=$6,\n\t\t\t attempt_count=attempt_count+1, updated_at=$1\n\t\t\tFROM claimable WHERE invocation.id=claimable.id\n\t\t\tRETURNING invocation.*`,\n\t\t\t[current, input.tenantId ?? null, input.spaceId ?? null, limit, input.workerId,\n\t\t\t leaseExpiresAt],\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 ORDER BY sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn result.rows.map(toEventRecord);\n\t}\n}\n\nfunction toActionRecord(row: Record<string, unknown>): ActionInvocationRecord {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\tactionId: String(row.action_id) as ActionInvocationRecord[\"actionId\"],\n\t\tactionVersion: Number(row.action_version),\n\t\tactorId: String(row.actor_id),\n\t\tactorType: String(row.actor_type) as ActionInvocationRecord[\"actorType\"],\n\t\tstatus: String(row.status) as ActionInvocationRecord[\"status\"],\n\t\tparameters: row.parameters as Record<string, unknown>,\n\t\tresult: row.result as Record<string, unknown>, correlationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t\t...(row.idempotency_key ? { idempotencyKey: String(row.idempotency_key) } : {}),\n\t\tattemptCount: Number(row.attempt_count ?? 0),\n\t\t...(row.lease_owner ? { leaseOwner: String(row.lease_owner) } : {}),\n\t\t...(row.lease_expires_at\n\t\t\t? { leaseExpiresAt: new Date(row.lease_expires_at as string | Date) }\n\t\t\t: {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toEventRecord(row: Record<string, unknown>): AssetEventEnvelope {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\teventType: String(row.event_type), eventSchemaVersion: Number(row.event_schema_version),\n\t\tsubjectType: String(row.subject_type), subjectId: String(row.subject_id),\n\t\tactorId: String(row.actor_id), actorType: String(row.actor_type),\n\t\t...(row.action_invocation_id\n\t\t\t? { actionInvocationId: String(row.action_invocation_id) }\n\t\t\t: {}),\n\t\tpayload: row.payload, sequence: Number(row.sequence),\n\t\toccurredAt: new Date(row.occurred_at as string | Date),\n\t\trecordedAt: new Date(row.recorded_at as string | Date),\n\t\tcorrelationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t};\n}\n","import type {\n\tPlatformActionDispatcher,\n\tPlatformActionWorkerCycleResult,\n\tPlatformActionWorkerOptions,\n} from \"./types\";\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_LEASE_DURATION_MS = 5 * 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\n\n/**\n * Durable store-backed dispatch: the pending invocation row is the queue item.\n * Repeated dispatches are safe because the workflow id is stable per invocation.\n */\nexport function createStoreBackedActionDispatcher(): PlatformActionDispatcher {\n\treturn {\n\t\tdispatch: async (input) => ({ workflowId: input.workflowId }),\n\t};\n}\n\n/** Claim and execute one bounded batch. Safe to run concurrently across workers. */\nexport async function runPlatformActionWorkerCycle<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<PlatformActionWorkerCycleResult> {\n\tconst claimed = await options.store.claimActionInvocations({\n\t\tworkerId: options.workerId,\n\t\tlimit: options.batchSize ?? DEFAULT_BATCH_SIZE,\n\t\tleaseDurationMs: options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n\t\t...(options.tenantId ? { tenantId: options.tenantId } : {}),\n\t\t...(options.spaceId ? { spaceId: options.spaceId } : {}),\n\t});\n\tlet completed = 0;\n\tlet failed = 0;\n\tfor (const invocation of claimed) {\n\t\ttry {\n\t\t\tconst result = await options.host.executeInvocation(\n\t\t\t\tinvocation.id,\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t);\n\t\t\tif (result.status === \"completed\") completed += 1;\n\t\t\telse failed += 1;\n\t\t} catch (error) {\n\t\t\tfailed += 1;\n\t\t\toptions.onError?.(error, invocation);\n\t\t}\n\t}\n\treturn { claimed: claimed.length, completed, failed };\n}\n\n/** Poll until aborted. Each iteration is bounded and waits without busy-spinning. */\nexport async function runPlatformActionWorker<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<void> {\n\twhile (!options.signal?.aborted) {\n\t\ttry {\n\t\t\tawait runPlatformActionWorkerCycle(options);\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t\tawait abortableDelay(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, options.signal);\n\t}\n}\n\nasync function abortableDelay(milliseconds: number, signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\tawait new Promise<void>((resolve) => {\n\t\tconst timeout = setTimeout(resolve, milliseconds);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/host.ts","../src/memory-store.ts","../src/postgres-store.ts","../src/worker.ts"],"names":["result","record"],"mappings":"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","file":"index.js","sourcesContent":["import {\n\tAdapterRegistry,\n\taggregatePolicyOutcomes,\n\tcreateFabricId,\n\tevaluatePolicyDefinitions,\n\texecuteWithAdapterRetry,\n\tresolveAction,\n\tresolveStateMachine,\n\tvalidateTransition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionDefinition,\n\tActionId,\n\tActionStatus,\n\tAssetEventEnvelope,\n\tRuntimePolicyDefinition,\n} from \"@fabricorg/platform\";\nimport type {\n\tActionAuthorizationInput,\n\tAdapterInvocationRecord,\n\tExecuteActionResult,\n\tGovernedActionHost,\n\tPendingAssetEvent,\n\tPlatformHostOptions,\n\tSubmitActionInput,\n\tSubmitActionResult,\n} from \"./types\";\n\nconst DEFAULT_EXTRACT_EVENTS = (data: Record<string, unknown>): PendingAssetEvent[] => {\n\tconst value = data._events;\n\treturn Array.isArray(value) ? (value as PendingAssetEvent[]) : [];\n};\n\nexport function createGovernedActionHost<TDb>(\n\toptions: PlatformHostOptions<TDb>,\n): GovernedActionHost {\n\tconst adapters = new AdapterRegistry();\n\tfor (const adapter of options.adapters ?? []) adapters.register(adapter);\n\tconst now = options.now ?? (() => new Date());\n\tconst extractEvents = options.extractEvents ?? DEFAULT_EXTRACT_EVENTS;\n\n\tasync function submitAction(input: SubmitActionInput): Promise<SubmitActionResult> {\n\t\tconst action = resolveAction(input.actionId);\n\t\tif (!action) throw new Error(`Unknown action: ${input.actionId}`);\n\t\tconst authorizationInput = toAuthorizationInput(action, input);\n\t\tif (!(await options.authorization.checkEntitlement(authorizationInput))) {\n\t\t\tthrow new Error(`Module \"${action.namespace}\" is not enabled for tenant ${input.tenantId}`);\n\t\t}\n\t\tif (!(await options.authorization.authorize(authorizationInput))) {\n\t\t\tthrow new Error(`Actor ${input.actorId} is not authorized for action ${input.actionId}`);\n\t\t}\n\n\t\tconst actionInvocationId = createFabricId(\"act\");\n\t\tconst correlationId = input.correlationId ?? createFabricId(\"corr\");\n\t\tconst durableParameters = options.redactActionParameters\n\t\t\t? options.redactActionParameters(input.actionId, input.parameters)\n\t\t\t: input.parameters;\n\t\tconst durableInvocation = await options.store.createActionInvocation({\n\t\t\tid: actionInvocationId,\n\t\t\ttenantId: input.tenantId,\n\t\t\tspaceId: input.spaceId,\n\t\t\tactionId: input.actionId,\n\t\t\tactionVersion: action.version,\n\t\t\tactorId: input.actorId,\n\t\t\tactorType: input.actorType,\n\t\t\tstatus: \"pending\",\n\t\t\tparameters: durableParameters,\n\t\t\tresult: {},\n\t\t\tcorrelationId,\n\t\t\t...(input.causationId ? { causationId: input.causationId } : {}),\n\t\t\t...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n\t\t});\n\t\tconst durableWorkflowId = `action-invocation-${durableInvocation.id}`;\n\t\tif (durableInvocation.id !== actionInvocationId && isTerminal(durableInvocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\tresult: durableInvocation.result,\n\t\t\t\t...(durableInvocation.error ? { error: durableInvocation.error } : {}),\n\t\t\t};\n\t\t}\n\n\t\tif (options.dispatcher) {\n\t\t\ttry {\n\t\t\t\tconst dispatched = await options.dispatcher.dispatch({\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\ttenantId: input.tenantId,\n\t\t\t\t\tspaceId: input.spaceId,\n\t\t\t\t\tworkflowId: durableWorkflowId,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tactionInvocationId: durableInvocation.id,\n\t\t\t\t\tstatus: durableInvocation.status,\n\t\t\t\t\tworkflowId: dispatched.workflowId,\n\t\t\t\t\t...(dispatched.runId ? { runId: dispatched.runId } : {}),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateActionInvocation(\n\t\t\t\t\tdurableInvocation.id,\n\t\t\t\t\tinput.tenantId,\n\t\t\t\t\tinput.spaceId,\n\t\t\t\t\t{ status: \"failed\", error: message },\n\t\t\t\t);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst executed = await executeInvocation(\n\t\t\tdurableInvocation.id,\n\t\t\tinput.tenantId,\n\t\t\tinput.spaceId,\n\t\t);\n\t\treturn { ...executed, workflowId: durableWorkflowId };\n\t}\n\n\tasync function executeInvocation(\n\t\tactionInvocationId: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ExecuteActionResult> {\n\t\tconst invocation = await options.store.getActionInvocation(\n\t\t\tactionInvocationId,\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t);\n\t\tif (!invocation) throw new Error(`ActionInvocation not found: ${actionInvocationId}`);\n\t\tif (isTerminal(invocation.status)) {\n\t\t\treturn {\n\t\t\t\tactionInvocationId,\n\t\t\t\tstatus: invocation.status,\n\t\t\t\tresult: invocation.result,\n\t\t\t\t...(invocation.error ? { error: invocation.error } : {}),\n\t\t\t};\n\t\t}\n\t\tconst action = resolveAction(invocation.actionId);\n\t\tif (!action) {\n\t\t\treturn fail(invocation, \"failed\", `Unknown action: ${invocation.actionId}`);\n\t\t}\n\t\tif (invocation.attemptCount > 1 && !action.idempotent) {\n\t\t\treturn fail(\n\t\t\t\tinvocation,\n\t\t\t\t\"failed\",\n\t\t\t\t`Interrupted action ${invocation.actionId} is not declared idempotent; manual reconciliation is required.`,\n\t\t\t);\n\t\t}\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"running\",\n\t\t});\n\t\ttry {\n\n\t\tconst parsed = action.schema.safeParse(invocation.parameters);\n\t\tif (!parsed.success) {\n\t\t\tconst message = parsed.error.issues\n\t\t\t\t.map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n\t\t\t\t.join(\"; \");\n\t\t\treturn fail(invocation, \"validation_failed\", message);\n\t\t}\n\n\t\tconst authorizationInput = toAuthorizationInput(action, invocation);\n\t\tconst definitions = options.resolvePolicies\n\t\t\t? await options.resolvePolicies({\n\t\t\t\t\t...authorizationInput,\n\t\t\t\t\tdeclaredPolicyIds: action.policies ?? [],\n\t\t\t\t})\n\t\t\t: declaredPolicies(action.policies ?? []);\n\t\tconst outcomes = await evaluatePolicyDefinitions(definitions, {\n\t\t\ttenantId,\n\t\t\tspaceId,\n\t\t\tactionInvocationId,\n\t\t\tactionId: action.actionId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tparameters: parsed.data,\n\t\t\tdb: options.store.db,\n\t\t\tservices: options.services,\n\t\t\tmode: \"execute\",\n\t\t});\n\t\tfor (const outcome of outcomes) {\n\t\t\tawait options.store.appendPolicyEvaluation({\n\t\t\t\tid: lifecycleId(\"pol\", actionInvocationId, outcome.policyId),\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\toutcome,\n\t\t\t\tcreatedAt: now(),\n\t\t\t});\n\t\t}\n\t\tconst aggregate = aggregatePolicyOutcomes(outcomes);\n\t\tif (aggregate?.result === \"block\") {\n\t\t\tconst reason = aggregate.reason ?? `Blocked by policy ${aggregate.policyId}`;\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"ComplianceBlocked\",\n\t\t\t\tsubjectType: \"ActionInvocation\",\n\t\t\t\tsubjectId: actionInvocationId,\n\t\t\t\tpayload: { actionId: action.actionId, policyId: aggregate.policyId, reason },\n\t\t\t}, `compliance:${aggregate.policyId}`);\n\t\t\treturn fail(invocation, \"blocked_by_policy\", reason);\n\t\t}\n\n\t\tconst binding = action.stateMachine;\n\t\tif (binding) {\n\t\t\tconst entityId = binding.getEntityId(parsed.data);\n\t\t\tconst currentState = entityId\n\t\t\t\t? ((await options.store.getEntityState(\n\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\tbinding.entityType,\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t)) ?? initialState(binding.entityType))\n\t\t\t\t: initialState(binding.entityType);\n\t\t\tconst targetState =\n\t\t\t\ttypeof binding.targetState === \"function\"\n\t\t\t\t\t? binding.targetState(parsed.data)\n\t\t\t\t\t: binding.targetState;\n\t\t\tconst transition = validateTransition(\n\t\t\t\tbinding.entityType,\n\t\t\t\tcurrentState,\n\t\t\t\ttargetState,\n\t\t\t\taction.actionId,\n\t\t\t);\n\t\t\tconst replayingAppliedTransition = action.idempotent && currentState === targetState;\n\t\t\tif (!transition.valid && !replayingAppliedTransition) {\n\t\t\t\treturn fail(invocation, \"failed\", transition.error ?? \"Invalid state transition\");\n\t\t\t}\n\t\t}\n\n\t\tlet data: Record<string, unknown>;\n\t\tlet domainEvents: PendingAssetEvent[] = [];\n\t\ttry {\n\t\t\tconst handlerResult = await options.store.transaction((db) =>\n\t\t\t\taction.handler\n\t\t\t\t\t? action.handler(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\t\tactorId: invocation.actorId,\n\t\t\t\t\t\t\t\tactorType: invocation.actorType,\n\t\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tservices: options.services,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparsed.data,\n\t\t\t\t\t\t)\n\t\t\t\t\t: Promise.resolve({ success: true, data: {} }),\n\t\t\t);\n\t\t\tif (!handlerResult.success) {\n\t\t\t\treturn fail(invocation, \"failed\", handlerResult.error ?? \"Action handler failed\");\n\t\t\t}\n\t\t\tdata = handlerResult.data ?? {};\n\t\t\tdomainEvents = extractEvents(data);\n\t\t\tif (action.eventPhase !== \"after_adapters\") {\n\t\t\t\tfor (const [index, event] of domainEvents.entries()) {\n\t\t\t\t\tawait appendEvent(invocation, event, `domain:${index}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\n\t\tfor (const [stepIndex, step] of (action.adapterSteps ?? []).entries()) {\n\t\t\tconst input = step.getInput(parsed.data, data);\n\t\t\tif (!input) continue;\n\t\t\tconst adapter = adapters.require(step.adapterType, step.operation);\n\t\t\tconst adapterInvocationId = lifecycleId(\"adp\", actionInvocationId, String(stepIndex));\n\t\t\tconst previousAdapterInvocation = await options.store.getAdapterInvocation(\n\t\t\t\tadapterInvocationId,\n\t\t\t);\n\t\t\tif (previousAdapterInvocation?.status === \"succeeded\") continue;\n\t\t\tconst adapterEventSubject = options.adapterEventSubject?.(\n\t\t\t\taction.actionId,\n\t\t\t\tparsed.data,\n\t\t\t\tdata,\n\t\t\t) ?? { subjectType: \"AdapterInvocation\", subjectId: adapterInvocationId };\n\t\t\tconst recordedInput = options.redactAdapterInput\n\t\t\t\t? options.redactAdapterInput(\n\t\t\t\t\t\taction.actionId,\n\t\t\t\t\t\tstep.adapterType,\n\t\t\t\t\t\tstep.operation,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t)\n\t\t\t\t: input;\n\t\t\tconst startedAt = now();\n\t\t\tconst record: AdapterInvocationRecord = {\n\t\t\t\tid: adapterInvocationId,\n\t\t\t\tactionInvocationId,\n\t\t\t\ttenantId,\n\t\t\t\tspaceId,\n\t\t\t\tadapterType: step.adapterType,\n\t\t\t\toperation: step.operation,\n\t\t\t\tvendor: adapter.vendor,\n\t\t\t\tstatus: \"running\",\n\t\t\t\tinput: recordedInput,\n\t\t\t\tattempt: 1,\n\t\t\t\tcreatedAt: startedAt,\n\t\t\t\tupdatedAt: startedAt,\n\t\t\t};\n\t\t\tawait options.store.createAdapterInvocation(record);\n\t\t\tawait appendEvent(invocation, {\n\t\t\t\teventType: \"AdapterInvocationStarted\",\n\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t}, `adapter:${stepIndex}:started`);\n\t\t\ttry {\n\t\t\t\tconst result = await executeWithAdapterRetry({\n\t\t\t\t\tpolicy: step.retryPolicy ?? adapter.retryPolicy,\n\t\t\t\t\tdefaultIdempotent: adapter.idempotent,\n\t\t\t\t\texecute: async (attempt, maxAttempts) => {\n\t\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn adapter.execute(input, {\n\t\t\t\t\t\t\ttenantId,\n\t\t\t\t\t\t\tspaceId,\n\t\t\t\t\t\t\tactionInvocationId,\n\t\t\t\t\t\t\tadapterInvocationId,\n\t\t\t\t\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t\t\t\t\t...(invocation.causationId\n\t\t\t\t\t\t\t\t? { causationId: invocation.causationId }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tisSuccessful: (result) => result.success,\n\t\t\t\t\tgetError: (result) => result.error,\n\t\t\t\t});\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\terror: result.error ?? \"Adapter failed\",\n\t\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t\t});\n\t\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\t\teventType: \"AdapterInvocationFailed\",\n\t\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\t\tpayload: { adapterType: step.adapterType, operation: step.operation },\n\t\t\t\t\t}, `adapter:${stepIndex}:failed`);\n\t\t\t\t\treturn fail(invocation, \"failed\", result.error ?? \"Adapter failed\");\n\t\t\t\t}\n\t\t\t\tconst resultRecord = result as unknown as Record<string, unknown>;\n\t\t\t\tconst output = isRecord(resultRecord.output)\n\t\t\t\t\t? resultRecord.output\n\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(resultRecord).filter(\n\t\t\t\t\t\t\t\t([key]) => key !== \"success\" && key !== \"error\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"succeeded\",\n\t\t\t\t\toutput,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\tawait appendEvent(invocation, {\n\t\t\t\t\teventType: \"AdapterInvocationSucceeded\",\n\t\t\t\t\tsubjectType: adapterEventSubject.subjectType,\n\t\t\t\t\tsubjectId: adapterEventSubject.subjectId,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tadapterType: step.adapterType,\n\t\t\t\t\t\toperation: step.operation,\n\t\t\t\t\t\tinput: recordedInput,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t},\n\t\t\t\t}, `adapter:${stepIndex}:succeeded`);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = errorMessage(error);\n\t\t\t\tawait options.store.updateAdapterInvocation(adapterInvocationId, {\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: message,\n\t\t\t\t\tupdatedAt: now(),\n\t\t\t\t});\n\t\t\t\treturn fail(invocation, \"failed\", message);\n\t\t\t}\n\t\t}\n\n\t\tif (action.eventPhase === \"after_adapters\") {\n\t\t\tfor (const [index, event] of domainEvents.entries()) {\n\t\t\t\tawait appendEvent(invocation, event, `domain:${index}`);\n\t\t\t}\n\t\t}\n\n\t\tconst result = withoutPrivateHostFields(data);\n\t\tawait options.store.updateActionInvocation(actionInvocationId, tenantId, spaceId, {\n\t\t\tstatus: \"completed\",\n\t\t\tresult,\n\t\t});\n\t\treturn { actionInvocationId, status: \"completed\", result };\n\t\t} catch (error) {\n\t\t\treturn fail(invocation, \"failed\", errorMessage(error));\n\t\t}\n\t}\n\n\tasync function appendEvent(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t\tactorId: string;\n\t\t\tactorType: string;\n\t\t\tcorrelationId: string;\n\t\t\tcausationId?: string;\n\t\t},\n\t\tevent: PendingAssetEvent,\n\t\tdeduplicationKey: string,\n\t): Promise<void> {\n\t\tconst timestamp = now();\n\t\tconst envelope: AssetEventEnvelope = {\n\t\t\tid: lifecycleId(\"evt\", invocation.id, deduplicationKey),\n\t\t\ttenantId: invocation.tenantId,\n\t\t\tspaceId: invocation.spaceId,\n\t\t\teventType: event.eventType,\n\t\t\teventSchemaVersion: event.eventSchemaVersion ?? 1,\n\t\t\tsubjectType: event.subjectType,\n\t\t\tsubjectId: event.subjectId,\n\t\t\tactorId: invocation.actorId,\n\t\t\tactorType: invocation.actorType,\n\t\t\tactionInvocationId: invocation.id,\n\t\t\tpayload: event.payload,\n\t\t\tsequence: await options.store.nextEventSequence(\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t),\n\t\t\toccurredAt: timestamp,\n\t\t\trecordedAt: timestamp,\n\t\t\tcorrelationId: invocation.correlationId,\n\t\t\t...(invocation.causationId ? { causationId: invocation.causationId } : {}),\n\t\t};\n\t\tawait options.store.appendEvent(envelope);\n\t}\n\n\tasync function fail(\n\t\tinvocation: {\n\t\t\tid: string;\n\t\t\ttenantId: string;\n\t\t\tspaceId: string;\n\t\t},\n\t\tstatus: Extract<ActionStatus, \"failed\" | \"blocked_by_policy\" | \"validation_failed\">,\n\t\terror: string,\n\t): Promise<ExecuteActionResult> {\n\t\tawait options.store.updateActionInvocation(\n\t\t\tinvocation.id,\n\t\t\tinvocation.tenantId,\n\t\t\tinvocation.spaceId,\n\t\t\t{ status, error },\n\t\t);\n\t\treturn { actionInvocationId: invocation.id, status, error };\n\t}\n\n\treturn { submitAction, executeInvocation };\n}\n\nfunction toAuthorizationInput(\n\taction: ActionDefinition,\n\tinput: {\n\t\ttenantId: string;\n\t\tspaceId: string;\n\t\tactorId: string;\n\t\tactorType: import(\"@fabricorg/platform\").ActorType;\n\t},\n): ActionAuthorizationInput {\n\treturn {\n\t\tactionId: action.actionId,\n\t\tnamespace: action.namespace,\n\t\trequiredPermissions: action.requiredPermissions ?? [],\n\t\trequiredRoles: action.requiredRoles ?? [],\n\t\ttenantId: input.tenantId,\n\t\tspaceId: input.spaceId,\n\t\tactorId: input.actorId,\n\t\tactorType: input.actorType,\n\t};\n}\n\nfunction declaredPolicies(policyIds: readonly string[]): RuntimePolicyDefinition[] {\n\treturn policyIds.map((policyId) => ({\n\t\tpolicyId: policyId as `${string}.v${number}`,\n\t\tpolicyVersion: Number(policyId.split(\".v\").at(-1) ?? 1),\n\t\tkind: \"code\",\n\t\tcodeEvaluatorPolicyId: policyId as `${string}.v${number}`,\n\t}));\n}\n\nfunction initialState(entityType: string): string {\n\tconst machine = resolveStateMachine(entityType);\n\treturn Object.values(machine?.states ?? {}).find((state) => state.stateClass === \"initial\")?.id ?? \"none\";\n}\n\nfunction isTerminal(status: ActionStatus): boolean {\n\treturn [\"completed\", \"failed\", \"blocked_by_policy\", \"validation_failed\"].includes(status);\n}\n\nfunction withoutPrivateHostFields(data: Record<string, unknown>): Record<string, unknown> {\n\tconst { _events: _ignored, ...result } = data;\n\treturn result;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction lifecycleId(prefix: string, invocationId: string, key: string): string {\n\tconst safeKey = key.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 96);\n\treturn `${prefix}_${invocationId}_${safeKey}`;\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport class MemoryPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\treadonly invocations: ActionInvocationRecord[] = [];\n\treadonly policyEvaluations: PolicyEvaluationRecord[] = [];\n\treadonly adapterInvocations: AdapterInvocationRecord[] = [];\n\treadonly events: AssetEventEnvelope[] = [];\n\n\tconstructor(readonly db: TDb) {}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tif (input.idempotencyKey) {\n\t\t\tconst existing = this.invocations.find(\n\t\t\t\t(record) =>\n\t\t\t\t\trecord.tenantId === input.tenantId &&\n\t\t\t\t\trecord.spaceId === input.spaceId &&\n\t\t\t\t\trecord.actionId === input.actionId &&\n\t\t\t\t\trecord.idempotencyKey === input.idempotencyKey,\n\t\t\t);\n\t\t\tif (existing) return existing;\n\t\t}\n\t\tconst now = new Date();\n\t\tconst record = { ...input, attemptCount: 0, createdAt: now, updatedAt: now };\n\t\tthis.invocations.push(record);\n\t\treturn record;\n\t}\n\n\tasync getActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t): Promise<ActionInvocationRecord | undefined> {\n\t\treturn this.invocations.find(\n\t\t\t(record) => record.id === id && record.tenantId === tenantId && record.spaceId === spaceId,\n\t\t);\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tconst record = await this.getActionInvocation(id, tenantId, spaceId);\n\t\tif (!record) throw new Error(`ActionInvocation not found: ${id}`);\n\t\tObject.assign(record, patch, { updatedAt: new Date() });\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tif (this.policyEvaluations.some((candidate) => candidate.id === record.id)) return;\n\t\tthis.policyEvaluations.push(record);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tif (this.adapterInvocations.some((candidate) => candidate.id === record.id)) return;\n\t\tthis.adapterInvocations.push(record);\n\t}\n\n\tasync getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined> {\n\t\treturn this.adapterInvocations.find((candidate) => candidate.id === id);\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tconst record = this.adapterInvocations.find((candidate) => candidate.id === id);\n\t\tif (!record) throw new Error(`AdapterInvocation not found: ${id}`);\n\t\tObject.assign(record, patch);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tif (this.events.some((candidate) => candidate.id === event.id)) return;\n\t\tthis.events.push(event);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\treturn (\n\t\t\tthis.events.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t\t.length + 1\n\t\t);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t): Promise<string | undefined> {\n\t\tlet state: string | undefined;\n\t\tfor (const event of this.events) {\n\t\t\tif (\n\t\t\t\tevent.tenantId !== tenantId ||\n\t\t\t\tevent.spaceId !== spaceId ||\n\t\t\t\tevent.subjectType !== entityType ||\n\t\t\t\tevent.subjectId !== entityId\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst candidate = (event.payload as { toState?: unknown } | undefined)?.toState;\n\t\t\tif (typeof candidate === \"string\") state = candidate;\n\t\t}\n\t\treturn state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\treturn this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(!input.statuses?.length || input.statuses.includes(record.status)) &&\n\t\t\t\t\t(!input.updatedBefore || record.updatedAt < input.updatedBefore),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 100);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst eligible = this.invocations\n\t\t\t.filter(\n\t\t\t\t(record) =>\n\t\t\t\t\t(!input.tenantId || record.tenantId === input.tenantId) &&\n\t\t\t\t\t(!input.spaceId || record.spaceId === input.spaceId) &&\n\t\t\t\t\t(record.status === \"pending\" ||\n\t\t\t\t\t\t(record.status === \"running\" &&\n\t\t\t\t\t\t\t(!record.leaseExpiresAt || record.leaseExpiresAt <= current))),\n\t\t\t)\n\t\t\t.sort((left, right) => left.createdAt.getTime() - right.createdAt.getTime())\n\t\t\t.slice(0, input.limit ?? 10);\n\t\tfor (const record of eligible) {\n\t\t\trecord.status = \"running\";\n\t\t\trecord.leaseOwner = input.workerId;\n\t\t\trecord.leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\t\trecord.attemptCount += 1;\n\t\t\trecord.updatedAt = current;\n\t\t}\n\t\treturn eligible;\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\treturn this.events\n\t\t\t.filter((event) => event.tenantId === tenantId && event.spaceId === spaceId)\n\t\t\t.sort((left, right) => left.sequence - right.sequence);\n\t}\n}\n","import type { AssetEventEnvelope } from \"@fabricorg/platform\";\nimport type {\n\tActionInvocationRecord,\n\tAdapterInvocationRecord,\n\tClaimActionInvocationsInput,\n\tCreateActionInvocationInput,\n\tListActionInvocationsInput,\n\tPlatformHostStore,\n\tPolicyEvaluationRecord,\n} from \"./types\";\n\nexport interface PlatformHostSqlResult<Row = Record<string, unknown>> {\n\trows: Row[];\n}\n\n/** Structural subset implemented by `pg.Pool` and Lakebase-compatible clients. */\nexport interface PlatformHostSqlClient {\n\tquery<Row = Record<string, unknown>>(\n\t\tsql: string,\n\t\tvalues?: unknown[],\n\t): Promise<PlatformHostSqlResult<Row>>;\n}\n\n/** Durable mutation-pipeline ledger for Databricks Lakebase or standard Postgres. */\nexport class PostgresPlatformHostStore<TDb> implements PlatformHostStore<TDb> {\n\tconstructor(\n\t\treadonly db: TDb,\n\t\tprivate readonly sql: PlatformHostSqlClient,\n\t) {}\n\n\tasync ensureSchema(): Promise<void> {\n\t\tawait this.sql.query(`\n\t\t\tCREATE SCHEMA IF NOT EXISTS fabric_platform;\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.action_invocations (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\taction_id text NOT NULL, action_version integer NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, status text NOT NULL,\n\t\t\t\tparameters jsonb NOT NULL, result jsonb NOT NULL DEFAULT '{}'::jsonb,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text, idempotency_key text, error text,\n\t\t\t\tattempt_count integer NOT NULL DEFAULT 0, lease_owner text,\n\t\t\t\tlease_expires_at timestamptz,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tALTER TABLE fabric_platform.action_invocations\n\t\t\t\tADD COLUMN IF NOT EXISTS idempotency_key text,\n\t\t\t\tADD COLUMN IF NOT EXISTS attempt_count integer NOT NULL DEFAULT 0,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_owner text,\n\t\t\t\tADD COLUMN IF NOT EXISTS lease_expires_at timestamptz;\n\t\t\tCREATE UNIQUE INDEX IF NOT EXISTS action_invocations_idempotency_idx\n\t\t\t\tON fabric_platform.action_invocations\n\t\t\t\t(tenant_id, space_id, action_id, idempotency_key)\n\t\t\t\tWHERE idempotency_key IS NOT NULL;\n\t\t\tCREATE INDEX IF NOT EXISTS action_invocations_worker_idx\n\t\t\t\tON fabric_platform.action_invocations (status, lease_expires_at, created_at);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.policy_evaluations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, outcome jsonb NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.adapter_invocations (\n\t\t\t\tid text PRIMARY KEY, action_invocation_id text NOT NULL,\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, adapter_type text NOT NULL,\n\t\t\t\toperation text NOT NULL, vendor text NOT NULL, status text NOT NULL,\n\t\t\t\tinput jsonb NOT NULL, output jsonb, error text, attempt integer NOT NULL,\n\t\t\t\tcreated_at timestamptz NOT NULL, updated_at timestamptz NOT NULL\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.event_sequences (\n\t\t\t\ttenant_id text NOT NULL, space_id text NOT NULL, next_sequence bigint NOT NULL,\n\t\t\t\tPRIMARY KEY (tenant_id, space_id)\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS fabric_platform.asset_events (\n\t\t\t\tid text PRIMARY KEY, tenant_id text NOT NULL, space_id text NOT NULL,\n\t\t\t\tevent_type text NOT NULL, event_schema_version integer NOT NULL,\n\t\t\t\tsubject_type text NOT NULL, subject_id text NOT NULL,\n\t\t\t\tactor_id text NOT NULL, actor_type text NOT NULL, action_invocation_id text,\n\t\t\t\tpayload jsonb NOT NULL, sequence bigint NOT NULL,\n\t\t\t\toccurred_at timestamptz NOT NULL, recorded_at timestamptz NOT NULL,\n\t\t\t\tcorrelation_id text NOT NULL, causation_id text,\n\t\t\t\tUNIQUE (tenant_id, space_id, sequence)\n\t\t\t);\n\t\t\tCREATE INDEX IF NOT EXISTS asset_events_subject_idx\n\t\t\t\tON fabric_platform.asset_events\n\t\t\t\t(tenant_id, space_id, subject_type, subject_id, sequence);\n\t\t`);\n\t}\n\n\tasync transaction<TResult>(run: (db: TDb) => Promise<TResult>): Promise<TResult> {\n\t\treturn run(this.db);\n\t}\n\n\tasync createActionInvocation(\n\t\tinput: CreateActionInvocationInput,\n\t): Promise<ActionInvocationRecord> {\n\t\tconst now = new Date();\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`INSERT INTO fabric_platform.action_invocations\n\t\t\t (id,tenant_id,space_id,action_id,action_version,actor_id,actor_type,status,\n\t\t\t parameters,result,correlation_id,causation_id,idempotency_key,error,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14,$15,$15)\n\t\t\t ON CONFLICT (tenant_id,space_id,action_id,idempotency_key)\n\t\t\t WHERE idempotency_key IS NOT NULL DO UPDATE SET id=fabric_platform.action_invocations.id\n\t\t\t RETURNING *`,\n\t\t\t[\n\t\t\t\tinput.id, input.tenantId, input.spaceId, input.actionId, input.actionVersion,\n\t\t\t\tinput.actorId, input.actorType, input.status, JSON.stringify(input.parameters),\n\t\t\t\tJSON.stringify(input.result), input.correlationId, input.causationId ?? null,\n\t\t\t\tinput.idempotencyKey ?? null, input.error ?? null, now,\n\t\t\t],\n\t\t);\n\t\treturn toActionRecord(result.rows[0]!);\n\t}\n\n\tasync getActionInvocation(id: string, tenantId: string, spaceId: string) {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId],\n\t\t);\n\t\treturn result.rows[0] ? toActionRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateActionInvocation(\n\t\tid: string,\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tpatch: Partial<Pick<ActionInvocationRecord, \"status\" | \"result\" | \"error\">>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.action_invocations SET\n\t\t\t status=COALESCE($4,status), result=COALESCE($5::jsonb,result),\n\t\t\t error=CASE WHEN $6::boolean THEN $7 ELSE error END,\n\t\t\t lease_owner=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_owner END,\n\t\t\t lease_expires_at=CASE WHEN $4 IN ('completed','failed','blocked_by_policy','validation_failed')\n\t\t\t THEN NULL ELSE lease_expires_at END,\n\t\t\t updated_at=now()\n\t\t\t WHERE id=$1 AND tenant_id=$2 AND space_id=$3`,\n\t\t\t[id, tenantId, spaceId, patch.status ?? null,\n\t\t\t patch.result === undefined ? null : JSON.stringify(patch.result),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null],\n\t\t);\n\t}\n\n\tasync appendPolicyEvaluation(record: PolicyEvaluationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.policy_evaluations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,outcome,created_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5::jsonb,$6) ON CONFLICT (id) DO NOTHING`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t JSON.stringify(record.outcome), record.createdAt],\n\t\t);\n\t}\n\n\tasync createAdapterInvocation(record: AdapterInvocationRecord): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.adapter_invocations\n\t\t\t (id,action_invocation_id,tenant_id,space_id,adapter_type,operation,vendor,status,\n\t\t\t input,output,error,attempt,created_at,updated_at)\n\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::jsonb,$10::jsonb,$11,$12,$13,$14)\n\t\t\t ON CONFLICT (id) DO NOTHING`,\n\t\t\t[record.id, record.actionInvocationId, record.tenantId, record.spaceId,\n\t\t\t record.adapterType, record.operation, record.vendor, record.status,\n\t\t\t JSON.stringify(record.input), record.output ? JSON.stringify(record.output) : null,\n\t\t\t record.error ?? null, record.attempt, record.createdAt, record.updatedAt],\n\t\t);\n\t}\n\n\tasync getAdapterInvocation(id: string): Promise<AdapterInvocationRecord | undefined> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.adapter_invocations WHERE id=$1`,\n\t\t\t[id],\n\t\t);\n\t\treturn result.rows[0] ? toAdapterRecord(result.rows[0]) : undefined;\n\t}\n\n\tasync updateAdapterInvocation(\n\t\tid: string,\n\t\tpatch: Partial<\n\t\t\tPick<AdapterInvocationRecord, \"status\" | \"output\" | \"error\" | \"attempt\" | \"updatedAt\">\n\t\t>,\n\t): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`UPDATE fabric_platform.adapter_invocations SET\n\t\t\t status=COALESCE($2,status), output=COALESCE($3::jsonb,output),\n\t\t\t error=CASE WHEN $4::boolean THEN $5 ELSE error END,\n\t\t\t attempt=COALESCE($6,attempt), updated_at=COALESCE($7,now()) WHERE id=$1`,\n\t\t\t[id, patch.status ?? null,\n\t\t\t patch.output === undefined ? null : JSON.stringify(patch.output),\n\t\t\t Object.hasOwn(patch, \"error\"), patch.error ?? null, patch.attempt ?? null,\n\t\t\t patch.updatedAt ?? null],\n\t\t);\n\t}\n\n\tasync appendEvent(event: AssetEventEnvelope): Promise<void> {\n\t\tawait this.sql.query(\n\t\t\t`INSERT INTO fabric_platform.asset_events\n\t\t\t (id,tenant_id,space_id,event_type,event_schema_version,subject_type,subject_id,\n\t\t\t actor_id,actor_type,action_invocation_id,payload,sequence,occurred_at,recorded_at,\n\t\t\t correlation_id,causation_id)\n\t\t\t\t VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13,$14,$15,$16)\n\t\t\t\t ON CONFLICT (id) DO NOTHING`,\n\t\t\t[event.id, event.tenantId, event.spaceId, event.eventType, event.eventSchemaVersion,\n\t\t\t event.subjectType, event.subjectId, event.actorId, event.actorType,\n\t\t\t event.actionInvocationId ?? null, JSON.stringify(event.payload), event.sequence,\n\t\t\t event.occurredAt, event.recordedAt, event.correlationId, event.causationId ?? null],\n\t\t);\n\t}\n\n\tasync nextEventSequence(tenantId: string, spaceId: string): Promise<number> {\n\t\tconst result = await this.sql.query<{ next_sequence: string | number }>(\n\t\t\t`INSERT INTO fabric_platform.event_sequences (tenant_id,space_id,next_sequence)\n\t\t\t VALUES ($1,$2,1) ON CONFLICT (tenant_id,space_id) DO UPDATE\n\t\t\t SET next_sequence=fabric_platform.event_sequences.next_sequence+1\n\t\t\t RETURNING next_sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn Number(result.rows[0]!.next_sequence);\n\t}\n\n\tasync getEntityState(\n\t\ttenantId: string,\n\t\tspaceId: string,\n\t\tentityType: string,\n\t\tentityId: string,\n\t) {\n\t\tconst result = await this.sql.query<{ state?: string }>(\n\t\t\t`SELECT payload->>'toState' AS state FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 AND subject_type=$3 AND subject_id=$4\n\t\t\t AND payload ? 'toState' ORDER BY sequence DESC LIMIT 1`,\n\t\t\t[tenantId, spaceId, entityType, entityId],\n\t\t);\n\t\treturn result.rows[0]?.state;\n\t}\n\n\tasync listActionInvocations(\n\t\tinput: ListActionInvocationsInput = {},\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst conditions: string[] = [];\n\t\tconst values: unknown[] = [];\n\t\tconst add = (condition: string, value: unknown) => {\n\t\t\tvalues.push(value);\n\t\t\tconditions.push(condition.replace(\"?\", `$${values.length}`));\n\t\t};\n\t\tif (input.tenantId) add(\"tenant_id=?\", input.tenantId);\n\t\tif (input.spaceId) add(\"space_id=?\", input.spaceId);\n\t\tif (input.statuses?.length) add(\"status = ANY(?::text[])\", [...input.statuses]);\n\t\tif (input.updatedBefore) add(\"updated_at<?\", input.updatedBefore);\n\t\tvalues.push(Math.max(1, Math.min(input.limit ?? 100, 1_000)));\n\t\tconst where = conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.action_invocations ${where}\n\t\t\t ORDER BY created_at LIMIT $${values.length}`,\n\t\t\tvalues,\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync claimActionInvocations(\n\t\tinput: ClaimActionInvocationsInput,\n\t): Promise<ActionInvocationRecord[]> {\n\t\tconst current = input.now ?? new Date();\n\t\tconst limit = Math.max(1, Math.min(input.limit ?? 10, 100));\n\t\tconst leaseExpiresAt = new Date(current.getTime() + input.leaseDurationMs);\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`WITH claimable AS (\n\t\t\t\tSELECT id FROM fabric_platform.action_invocations\n\t\t\t\tWHERE (status='pending' OR\n\t\t\t\t (status='running' AND (lease_expires_at IS NULL OR lease_expires_at <= $1)))\n\t\t\t\t AND ($2::text IS NULL OR tenant_id=$2)\n\t\t\t\t AND ($3::text IS NULL OR space_id=$3)\n\t\t\t\tORDER BY created_at\n\t\t\t\tFOR UPDATE SKIP LOCKED\n\t\t\t\tLIMIT $4\n\t\t\t)\n\t\t\tUPDATE fabric_platform.action_invocations AS invocation\n\t\t\tSET status='running', lease_owner=$5, lease_expires_at=$6,\n\t\t\t attempt_count=attempt_count+1, updated_at=$1\n\t\t\tFROM claimable WHERE invocation.id=claimable.id\n\t\t\tRETURNING invocation.*`,\n\t\t\t[current, input.tenantId ?? null, input.spaceId ?? null, limit, input.workerId,\n\t\t\t leaseExpiresAt],\n\t\t);\n\t\treturn result.rows.map(toActionRecord);\n\t}\n\n\tasync listEvents(tenantId: string, spaceId: string): Promise<AssetEventEnvelope[]> {\n\t\tconst result = await this.sql.query<Record<string, unknown>>(\n\t\t\t`SELECT * FROM fabric_platform.asset_events\n\t\t\t WHERE tenant_id=$1 AND space_id=$2 ORDER BY sequence`,\n\t\t\t[tenantId, spaceId],\n\t\t);\n\t\treturn result.rows.map(toEventRecord);\n\t}\n}\n\nfunction toAdapterRecord(row: Record<string, unknown>): AdapterInvocationRecord {\n\treturn {\n\t\tid: String(row.id),\n\t\tactionInvocationId: String(row.action_invocation_id),\n\t\ttenantId: String(row.tenant_id),\n\t\tspaceId: String(row.space_id),\n\t\tadapterType: String(row.adapter_type),\n\t\toperation: String(row.operation),\n\t\tvendor: String(row.vendor),\n\t\tstatus: String(row.status) as AdapterInvocationRecord[\"status\"],\n\t\tinput: row.input as Record<string, unknown>,\n\t\t...(row.output ? { output: row.output as Record<string, unknown> } : {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tattempt: Number(row.attempt),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toActionRecord(row: Record<string, unknown>): ActionInvocationRecord {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\tactionId: String(row.action_id) as ActionInvocationRecord[\"actionId\"],\n\t\tactionVersion: Number(row.action_version),\n\t\tactorId: String(row.actor_id),\n\t\tactorType: String(row.actor_type) as ActionInvocationRecord[\"actorType\"],\n\t\tstatus: String(row.status) as ActionInvocationRecord[\"status\"],\n\t\tparameters: row.parameters as Record<string, unknown>,\n\t\tresult: row.result as Record<string, unknown>, correlationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t\t...(row.idempotency_key ? { idempotencyKey: String(row.idempotency_key) } : {}),\n\t\tattemptCount: Number(row.attempt_count ?? 0),\n\t\t...(row.lease_owner ? { leaseOwner: String(row.lease_owner) } : {}),\n\t\t...(row.lease_expires_at\n\t\t\t? { leaseExpiresAt: new Date(row.lease_expires_at as string | Date) }\n\t\t\t: {}),\n\t\t...(row.error ? { error: String(row.error) } : {}),\n\t\tcreatedAt: new Date(row.created_at as string | Date),\n\t\tupdatedAt: new Date(row.updated_at as string | Date),\n\t};\n}\n\nfunction toEventRecord(row: Record<string, unknown>): AssetEventEnvelope {\n\treturn {\n\t\tid: String(row.id), tenantId: String(row.tenant_id), spaceId: String(row.space_id),\n\t\teventType: String(row.event_type), eventSchemaVersion: Number(row.event_schema_version),\n\t\tsubjectType: String(row.subject_type), subjectId: String(row.subject_id),\n\t\tactorId: String(row.actor_id), actorType: String(row.actor_type),\n\t\t...(row.action_invocation_id\n\t\t\t? { actionInvocationId: String(row.action_invocation_id) }\n\t\t\t: {}),\n\t\tpayload: row.payload, sequence: Number(row.sequence),\n\t\toccurredAt: new Date(row.occurred_at as string | Date),\n\t\trecordedAt: new Date(row.recorded_at as string | Date),\n\t\tcorrelationId: String(row.correlation_id),\n\t\t...(row.causation_id ? { causationId: String(row.causation_id) } : {}),\n\t};\n}\n","import type {\n\tPlatformActionDispatcher,\n\tPlatformActionWorkerCycleResult,\n\tPlatformActionWorkerOptions,\n} from \"./types\";\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_LEASE_DURATION_MS = 5 * 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\n\n/**\n * Durable store-backed dispatch: the pending invocation row is the queue item.\n * Repeated dispatches are safe because the workflow id is stable per invocation.\n */\nexport function createStoreBackedActionDispatcher(): PlatformActionDispatcher {\n\treturn {\n\t\tdispatch: async (input) => ({ workflowId: input.workflowId }),\n\t};\n}\n\n/** Claim and execute one bounded batch. Safe to run concurrently across workers. */\nexport async function runPlatformActionWorkerCycle<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<PlatformActionWorkerCycleResult> {\n\tconst claimed = await options.store.claimActionInvocations({\n\t\tworkerId: options.workerId,\n\t\tlimit: options.batchSize ?? DEFAULT_BATCH_SIZE,\n\t\tleaseDurationMs: options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n\t\t...(options.tenantId ? { tenantId: options.tenantId } : {}),\n\t\t...(options.spaceId ? { spaceId: options.spaceId } : {}),\n\t});\n\tlet completed = 0;\n\tlet failed = 0;\n\tfor (const invocation of claimed) {\n\t\ttry {\n\t\t\tconst result = await options.host.executeInvocation(\n\t\t\t\tinvocation.id,\n\t\t\t\tinvocation.tenantId,\n\t\t\t\tinvocation.spaceId,\n\t\t\t);\n\t\t\tif (result.status === \"completed\") completed += 1;\n\t\t\telse failed += 1;\n\t\t} catch (error) {\n\t\t\tfailed += 1;\n\t\t\toptions.onError?.(error, invocation);\n\t\t}\n\t}\n\treturn { claimed: claimed.length, completed, failed };\n}\n\n/** Poll until aborted. Each iteration is bounded and waits without busy-spinning. */\nexport async function runPlatformActionWorker<TDb>(\n\toptions: PlatformActionWorkerOptions<TDb>,\n): Promise<void> {\n\twhile (!options.signal?.aborted) {\n\t\ttry {\n\t\t\tawait runPlatformActionWorkerCycle(options);\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t\tawait abortableDelay(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, options.signal);\n\t}\n}\n\nasync function abortableDelay(milliseconds: number, signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\tawait new Promise<void>((resolve) => {\n\t\tconst timeout = setTimeout(resolve, milliseconds);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabricorg/platform-host",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Canonical governed mutation host for @fabricorg/platform: durable invocation, policy, state-machine, handler, event, and adapter orchestration behind persistence ports.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fabric",
|