@manifesto-ai/sdk 3.3.2 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -11
- package/dist/chunk-N774NZRO.js +2 -0
- package/dist/chunk-N774NZRO.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -491
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +11 -3
- package/dist/provider.js +1 -16
- package/dist/snapshot-projection.d.ts +23 -0
- package/dist/types.d.ts +24 -5
- package/package.json +4 -4
- package/dist/chunk-ND4PXKJT.js +0 -407
- package/dist/chunk-ND4PXKJT.js.map +0 -1
package/dist/internal.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type DomainSchema, type Snapshot as CoreSnapshot } from "@manifesto-ai/core";
|
|
2
|
-
import type { HostResult, ManifestoHost } from "@manifesto-ai/host";
|
|
3
|
-
import
|
|
2
|
+
import type { HostContextProvider, HostResult, ManifestoHost } from "@manifesto-ai/host";
|
|
3
|
+
import { ManifestoError } from "./errors.js";
|
|
4
|
+
import type { BaseLaws, CanonicalSnapshot, ComposableManifesto, ManifestoBaseInstance, ManifestoDomainShape, ManifestoEvent, ManifestoEventMap, SchemaGraph, Snapshot, TypedCreateIntent, TypedGetActionMetadata, TypedIntent, TypedMEL, TypedOn, TypedSimulate, TypedSubscribe } from "./types.js";
|
|
5
|
+
import { type SnapshotProjectionPlan } from "./snapshot-projection.js";
|
|
4
6
|
export declare const ACTION_PARAM_NAMES: unique symbol;
|
|
5
7
|
export declare const RUNTIME_KERNEL_FACTORY: unique symbol;
|
|
6
8
|
export declare const ACTIVATION_STATE: unique symbol;
|
|
@@ -15,9 +17,12 @@ export interface RuntimeKernel<T extends ManifestoDomainShape> {
|
|
|
15
17
|
readonly subscribe: TypedSubscribe<T>;
|
|
16
18
|
readonly on: TypedOn<T>;
|
|
17
19
|
readonly getSnapshot: () => Snapshot<T["state"]>;
|
|
20
|
+
readonly getCanonicalSnapshot: () => CanonicalSnapshot<T["state"]>;
|
|
18
21
|
readonly getAvailableActions: () => readonly (keyof T["actions"])[];
|
|
19
22
|
readonly getActionMetadata: TypedGetActionMetadata<T>;
|
|
20
23
|
readonly isActionAvailable: (name: keyof T["actions"]) => boolean;
|
|
24
|
+
readonly getSchemaGraph: () => SchemaGraph;
|
|
25
|
+
readonly simulate: TypedSimulate<T>;
|
|
21
26
|
readonly dispose: () => void;
|
|
22
27
|
readonly isDisposed: () => boolean;
|
|
23
28
|
readonly getVisibleCoreSnapshot: () => CoreSnapshot;
|
|
@@ -29,6 +34,7 @@ export interface RuntimeKernel<T extends ManifestoDomainShape> {
|
|
|
29
34
|
readonly enqueue: <R>(task: () => Promise<R>) => Promise<R>;
|
|
30
35
|
readonly ensureIntentId: (intent: TypedIntent<T>) => TypedIntent<T>;
|
|
31
36
|
readonly executeHost: (intent: TypedIntent<T>, options?: HostDispatchOptions) => Promise<HostResult>;
|
|
37
|
+
readonly createUnavailableError: (intent: TypedIntent<T>) => ManifestoError;
|
|
32
38
|
readonly rejectUnavailable: (intent: TypedIntent<T>) => never;
|
|
33
39
|
}
|
|
34
40
|
export type RuntimeKernelFactory<T extends ManifestoDomainShape> = () => RuntimeKernel<T>;
|
|
@@ -38,7 +44,9 @@ export type InternalComposableManifesto<T extends ManifestoDomainShape, Laws ext
|
|
|
38
44
|
};
|
|
39
45
|
type RuntimeKernelOptions<T extends ManifestoDomainShape> = {
|
|
40
46
|
readonly schema: DomainSchema;
|
|
47
|
+
readonly projectionPlan: SnapshotProjectionPlan;
|
|
41
48
|
readonly host: ManifestoHost;
|
|
49
|
+
readonly hostContextProvider: HostContextProvider;
|
|
42
50
|
readonly MEL: TypedMEL<T>;
|
|
43
51
|
readonly createIntent: TypedCreateIntent<T>;
|
|
44
52
|
};
|
|
@@ -47,6 +55,6 @@ export declare function getRuntimeKernelFactory<T extends ManifestoDomainShape,
|
|
|
47
55
|
export declare function getActivationState<T extends ManifestoDomainShape, Laws extends BaseLaws>(manifesto: ComposableManifesto<T, Laws>): ActivationState;
|
|
48
56
|
export declare function assertComposableNotActivated<T extends ManifestoDomainShape, Laws extends BaseLaws>(manifesto: ComposableManifesto<T, Laws>): void;
|
|
49
57
|
export declare function activateComposable<T extends ManifestoDomainShape, Laws extends BaseLaws>(manifesto: ComposableManifesto<T, Laws>): void;
|
|
50
|
-
export declare function createRuntimeKernel<T extends ManifestoDomainShape>({ schema, host, MEL, createIntent, }: RuntimeKernelOptions<T>): RuntimeKernel<T>;
|
|
58
|
+
export declare function createRuntimeKernel<T extends ManifestoDomainShape>({ schema, projectionPlan, host, hostContextProvider, MEL, createIntent, }: RuntimeKernelOptions<T>): RuntimeKernel<T>;
|
|
51
59
|
export declare function createBaseRuntimeInstance<T extends ManifestoDomainShape>(kernel: RuntimeKernel<T>): ManifestoBaseInstance<T>;
|
|
52
60
|
export {};
|
package/dist/provider.js
CHANGED
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
activateComposable,
|
|
3
|
-
assertComposableNotActivated,
|
|
4
|
-
attachRuntimeKernelFactory,
|
|
5
|
-
createRuntimeKernel,
|
|
6
|
-
getActivationState,
|
|
7
|
-
getRuntimeKernelFactory
|
|
8
|
-
} from "./chunk-ND4PXKJT.js";
|
|
9
|
-
export {
|
|
10
|
-
activateComposable,
|
|
11
|
-
assertComposableNotActivated,
|
|
12
|
-
attachRuntimeKernelFactory,
|
|
13
|
-
createRuntimeKernel,
|
|
14
|
-
getActivationState,
|
|
15
|
-
getRuntimeKernelFactory
|
|
16
|
-
};
|
|
1
|
+
import{j as t,k as e,l as a,m as o,n,o as r}from"./chunk-N774NZRO.js";export{n as activateComposable,o as assertComposableNotActivated,t as attachRuntimeKernelFactory,r as createRuntimeKernel,a as getActivationState,e as getRuntimeKernelFactory};
|
|
17
2
|
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DomainSchema, type Snapshot as CoreSnapshot } from "@manifesto-ai/core";
|
|
2
|
+
export type CanonicalPlatformNamespaces = {
|
|
3
|
+
$host?: Record<string, unknown>;
|
|
4
|
+
$mel?: Record<string, unknown>;
|
|
5
|
+
[k: `$${string}`]: unknown;
|
|
6
|
+
};
|
|
7
|
+
export type Snapshot<T = unknown> = {
|
|
8
|
+
data: T;
|
|
9
|
+
computed: Record<string, unknown>;
|
|
10
|
+
system: Pick<CoreSnapshot["system"], "status" | "lastError">;
|
|
11
|
+
meta: Pick<CoreSnapshot["meta"], "schemaHash">;
|
|
12
|
+
};
|
|
13
|
+
export type CanonicalSnapshot<T = unknown> = Omit<CoreSnapshot, "data"> & {
|
|
14
|
+
data: T & CanonicalPlatformNamespaces;
|
|
15
|
+
};
|
|
16
|
+
export type SnapshotProjectionPlan = {
|
|
17
|
+
visibleComputedKeys: readonly string[];
|
|
18
|
+
};
|
|
19
|
+
export declare function buildSnapshotProjectionPlan(schema: DomainSchema): SnapshotProjectionPlan;
|
|
20
|
+
export declare function projectCanonicalSnapshot<T = unknown>(snapshot: CoreSnapshot, plan: SnapshotProjectionPlan): Snapshot<T>;
|
|
21
|
+
export declare function projectEffectContextSnapshot<T = unknown>(snapshot: CoreSnapshot, plan: SnapshotProjectionPlan): Snapshot<T>;
|
|
22
|
+
export declare function cloneAndDeepFreeze<T>(value: T): T;
|
|
23
|
+
export declare function projectedSnapshotsEqual<T>(left: Snapshot<T>, right: Snapshot<T>): boolean;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { DomainSchema, Intent, Patch,
|
|
1
|
+
import type { ComputeStatus, DomainSchema, Intent, Patch, Requirement } from "@manifesto-ai/core";
|
|
2
|
+
import type { SchemaGraph as CompilerSchemaGraph, SchemaGraphEdge, SchemaGraphEdgeRelation, SchemaGraphNode, SchemaGraphNodeId, SchemaGraphNodeKind } from "@manifesto-ai/compiler";
|
|
3
|
+
import type { CanonicalPlatformNamespaces, CanonicalSnapshot, Snapshot } from "./snapshot-projection.js";
|
|
2
4
|
type ActionFn = {
|
|
3
5
|
bivarianceHack(...args: unknown[]): unknown;
|
|
4
6
|
}["bivarianceHack"];
|
|
@@ -24,9 +26,6 @@ export type LineageComposableLaws = BaseLaws & LineageLaws & {
|
|
|
24
26
|
readonly __governanceLaws?: never;
|
|
25
27
|
};
|
|
26
28
|
export type GovernedComposableLaws = BaseLaws & LineageLaws & GovernanceLaws;
|
|
27
|
-
export type Snapshot<T = unknown> = Omit<CoreSnapshot, "data"> & {
|
|
28
|
-
data: T;
|
|
29
|
-
};
|
|
30
29
|
export type EffectContext<T = unknown> = {
|
|
31
30
|
readonly snapshot: Readonly<Snapshot<T>>;
|
|
32
31
|
};
|
|
@@ -37,10 +36,12 @@ export type TypedActionRef<T extends ManifestoDomainShape, K extends keyof T["ac
|
|
|
37
36
|
};
|
|
38
37
|
export type FieldRef<TValue> = {
|
|
39
38
|
readonly __kind: "FieldRef";
|
|
39
|
+
readonly name: string;
|
|
40
40
|
readonly _type?: TValue;
|
|
41
41
|
};
|
|
42
42
|
export type ComputedRef<TValue> = {
|
|
43
43
|
readonly __kind: "ComputedRef";
|
|
44
|
+
readonly name: string;
|
|
44
45
|
readonly _type?: TValue;
|
|
45
46
|
};
|
|
46
47
|
export type TypedMEL<T extends ManifestoDomainShape> = {
|
|
@@ -69,6 +70,21 @@ export type TypedIntent<T extends ManifestoDomainShape, K extends keyof T["actio
|
|
|
69
70
|
export type TypedCreateIntent<T extends ManifestoDomainShape> = <K extends keyof T["actions"]>(action: TypedActionRef<T, K>, ...args: CreateIntentArgs<T, K>) => TypedIntent<T, K>;
|
|
70
71
|
export type TypedDispatchAsync<T extends ManifestoDomainShape> = (intent: TypedIntent<T>) => Promise<Snapshot<T["state"]>>;
|
|
71
72
|
export type TypedCommitAsync<T extends ManifestoDomainShape> = TypedDispatchAsync<T>;
|
|
73
|
+
export type SchemaGraphNodeRef = TypedActionRef<ManifestoDomainShape> | FieldRef<unknown> | ComputedRef<unknown>;
|
|
74
|
+
export type SchemaGraph = CompilerSchemaGraph & {
|
|
75
|
+
traceUp(ref: SchemaGraphNodeRef): SchemaGraph;
|
|
76
|
+
traceUp(nodeId: SchemaGraphNodeId): SchemaGraph;
|
|
77
|
+
traceDown(ref: SchemaGraphNodeRef): SchemaGraph;
|
|
78
|
+
traceDown(nodeId: SchemaGraphNodeId): SchemaGraph;
|
|
79
|
+
};
|
|
80
|
+
export type SimulateResult<T extends ManifestoDomainShape = ManifestoDomainShape> = {
|
|
81
|
+
readonly snapshot: Snapshot<T["state"]>;
|
|
82
|
+
readonly changedPaths: readonly string[];
|
|
83
|
+
readonly newAvailableActions: readonly (keyof T["actions"])[];
|
|
84
|
+
readonly requirements: readonly Requirement[];
|
|
85
|
+
readonly status: ComputeStatus;
|
|
86
|
+
};
|
|
87
|
+
export type TypedSimulate<T extends ManifestoDomainShape> = <K extends keyof T["actions"]>(action: TypedActionRef<T, K>, ...args: CreateIntentArgs<T, K>) => SimulateResult<T>;
|
|
72
88
|
export type TypedSubscribe<T extends ManifestoDomainShape> = <R>(selector: Selector<T["state"], R>, listener: (value: R) => void) => Unsubscribe;
|
|
73
89
|
export type TypedActionMetadata<T extends ManifestoDomainShape, K extends keyof T["actions"] = keyof T["actions"]> = {
|
|
74
90
|
readonly name: K;
|
|
@@ -107,9 +123,12 @@ export type ManifestoBaseInstance<T extends ManifestoDomainShape> = {
|
|
|
107
123
|
readonly subscribe: TypedSubscribe<T>;
|
|
108
124
|
readonly on: TypedOn<T>;
|
|
109
125
|
readonly getSnapshot: () => Snapshot<T["state"]>;
|
|
126
|
+
readonly getCanonicalSnapshot: () => CanonicalSnapshot<T["state"]>;
|
|
110
127
|
readonly getAvailableActions: () => readonly (keyof T["actions"])[];
|
|
111
128
|
readonly getActionMetadata: TypedGetActionMetadata<T>;
|
|
112
129
|
readonly isActionAvailable: (name: keyof T["actions"]) => boolean;
|
|
130
|
+
readonly getSchemaGraph: () => SchemaGraph;
|
|
131
|
+
readonly simulate: TypedSimulate<T>;
|
|
113
132
|
readonly MEL: TypedMEL<T>;
|
|
114
133
|
readonly schema: DomainSchema;
|
|
115
134
|
readonly dispose: () => void;
|
|
@@ -125,9 +144,9 @@ export type ActivatedInstance<T extends ManifestoDomainShape, Laws> = Laws exten
|
|
|
125
144
|
} ? Runtime : never : Laws extends LineageLaws ? ResolvedManifestoRuntimeByLaws<T> extends {
|
|
126
145
|
readonly lineage: infer Runtime;
|
|
127
146
|
} ? Runtime : never : ManifestoRuntimeByLaws<T>["base"];
|
|
147
|
+
export type { CanonicalPlatformNamespaces, CanonicalSnapshot, Snapshot, SchemaGraphEdge, SchemaGraphEdgeRelation, SchemaGraphNode, SchemaGraphNodeId, SchemaGraphNodeKind, };
|
|
128
148
|
export type ComposableManifesto<T extends ManifestoDomainShape, Laws extends BaseLaws = BaseComposableLaws> = {
|
|
129
149
|
readonly _laws: Laws;
|
|
130
150
|
readonly schema: DomainSchema;
|
|
131
151
|
activate(): ActivatedInstance<T, Laws>;
|
|
132
152
|
};
|
|
133
|
-
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifesto-ai/sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Manifesto SDK - Activation-first public API for the base runtime",
|
|
5
5
|
"author": "eggplantiny <eggplantiny@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"dist"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@manifesto-ai/compiler": "3.
|
|
43
|
-
"@manifesto-ai/
|
|
44
|
-
"@manifesto-ai/
|
|
42
|
+
"@manifesto-ai/compiler": "3.2.0",
|
|
43
|
+
"@manifesto-ai/core": "2.10.0",
|
|
44
|
+
"@manifesto-ai/host": "2.7.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"typescript": "^5.9.3",
|
package/dist/chunk-ND4PXKJT.js
DELETED
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
// src/errors.ts
|
|
2
|
-
var ManifestoError = class extends Error {
|
|
3
|
-
code;
|
|
4
|
-
constructor(code, message, options) {
|
|
5
|
-
super(message, options);
|
|
6
|
-
this.name = "ManifestoError";
|
|
7
|
-
this.code = code;
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var ReservedEffectError = class extends ManifestoError {
|
|
11
|
-
effectType;
|
|
12
|
-
constructor(effectType) {
|
|
13
|
-
super(
|
|
14
|
-
"RESERVED_EFFECT",
|
|
15
|
-
`Effect type "${effectType}" is reserved and cannot be overridden`
|
|
16
|
-
);
|
|
17
|
-
this.name = "ReservedEffectError";
|
|
18
|
-
this.effectType = effectType;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
var CompileError = class extends ManifestoError {
|
|
22
|
-
diagnostics;
|
|
23
|
-
constructor(diagnostics, formattedMessage) {
|
|
24
|
-
super("COMPILE_ERROR", formattedMessage);
|
|
25
|
-
this.name = "CompileError";
|
|
26
|
-
this.diagnostics = diagnostics;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
var DisposedError = class extends ManifestoError {
|
|
30
|
-
constructor() {
|
|
31
|
-
super("DISPOSED", "Cannot use a disposed Manifesto runtime");
|
|
32
|
-
this.name = "DisposedError";
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
var AlreadyActivatedError = class extends ManifestoError {
|
|
36
|
-
constructor() {
|
|
37
|
-
super("ALREADY_ACTIVATED", "ComposableManifesto.activate() may only be called once");
|
|
38
|
-
this.name = "AlreadyActivatedError";
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
// src/internal.ts
|
|
43
|
-
import {
|
|
44
|
-
getAvailableActions as queryAvailableActions,
|
|
45
|
-
isActionAvailable as queryActionAvailable
|
|
46
|
-
} from "@manifesto-ai/core";
|
|
47
|
-
var ACTION_PARAM_NAMES = /* @__PURE__ */ Symbol("manifesto-sdk.action-param-names");
|
|
48
|
-
var RUNTIME_KERNEL_FACTORY = /* @__PURE__ */ Symbol("manifesto-sdk.runtime-kernel-factory");
|
|
49
|
-
var ACTIVATION_STATE = /* @__PURE__ */ Symbol("manifesto-sdk.activation-state");
|
|
50
|
-
function attachRuntimeKernelFactory(manifesto, factory, activationState) {
|
|
51
|
-
Object.defineProperty(manifesto, RUNTIME_KERNEL_FACTORY, {
|
|
52
|
-
enumerable: false,
|
|
53
|
-
configurable: false,
|
|
54
|
-
writable: false,
|
|
55
|
-
value: factory
|
|
56
|
-
});
|
|
57
|
-
const state = activationState ?? getExistingActivationState(manifesto) ?? {
|
|
58
|
-
activated: false
|
|
59
|
-
};
|
|
60
|
-
if (!getExistingActivationState(manifesto)) {
|
|
61
|
-
Object.defineProperty(manifesto, ACTIVATION_STATE, {
|
|
62
|
-
enumerable: false,
|
|
63
|
-
configurable: false,
|
|
64
|
-
writable: false,
|
|
65
|
-
value: state
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
return manifesto;
|
|
69
|
-
}
|
|
70
|
-
function getRuntimeKernelFactory(manifesto) {
|
|
71
|
-
const internal = manifesto;
|
|
72
|
-
const factory = internal[RUNTIME_KERNEL_FACTORY];
|
|
73
|
-
if (typeof factory !== "function") {
|
|
74
|
-
throw new ManifestoError(
|
|
75
|
-
"SCHEMA_ERROR",
|
|
76
|
-
"ComposableManifesto is missing its runtime kernel factory"
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return factory;
|
|
80
|
-
}
|
|
81
|
-
function getActivationState(manifesto) {
|
|
82
|
-
const internal = manifesto;
|
|
83
|
-
const state = internal[ACTIVATION_STATE];
|
|
84
|
-
if (!state) {
|
|
85
|
-
throw new ManifestoError(
|
|
86
|
-
"SCHEMA_ERROR",
|
|
87
|
-
"ComposableManifesto is missing its activation state"
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
return state;
|
|
91
|
-
}
|
|
92
|
-
function assertComposableNotActivated(manifesto) {
|
|
93
|
-
if (getActivationState(manifesto).activated) {
|
|
94
|
-
throw new AlreadyActivatedError();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function activateComposable(manifesto) {
|
|
98
|
-
const state = getActivationState(manifesto);
|
|
99
|
-
if (state.activated) {
|
|
100
|
-
throw new AlreadyActivatedError();
|
|
101
|
-
}
|
|
102
|
-
state.activated = true;
|
|
103
|
-
}
|
|
104
|
-
function getExistingActivationState(manifesto) {
|
|
105
|
-
const internal = manifesto;
|
|
106
|
-
return internal[ACTIVATION_STATE] ?? null;
|
|
107
|
-
}
|
|
108
|
-
function getActionInputFieldNames(input) {
|
|
109
|
-
if (!input || input.type !== "object" || !input.fields) {
|
|
110
|
-
return [];
|
|
111
|
-
}
|
|
112
|
-
return Object.keys(input.fields);
|
|
113
|
-
}
|
|
114
|
-
function createRuntimeKernel({
|
|
115
|
-
schema,
|
|
116
|
-
host,
|
|
117
|
-
MEL,
|
|
118
|
-
createIntent
|
|
119
|
-
}) {
|
|
120
|
-
const initialSnapshot = host.getSnapshot();
|
|
121
|
-
if (!initialSnapshot) {
|
|
122
|
-
throw new ManifestoError("SCHEMA_ERROR", "Host failed to initialize its genesis snapshot");
|
|
123
|
-
}
|
|
124
|
-
let visibleSnapshot = initialSnapshot;
|
|
125
|
-
let dispatchQueue = Promise.resolve();
|
|
126
|
-
let disposed = false;
|
|
127
|
-
const actionNames = Object.keys(schema.actions);
|
|
128
|
-
const actionMetadataByName = Object.freeze(
|
|
129
|
-
Object.fromEntries(
|
|
130
|
-
actionNames.map((name) => {
|
|
131
|
-
const action = schema.actions[name];
|
|
132
|
-
const actionRef = MEL.actions[name];
|
|
133
|
-
const rawParams = actionRef?.[ACTION_PARAM_NAMES];
|
|
134
|
-
const params = Object.freeze(
|
|
135
|
-
Array.isArray(rawParams) ? [...rawParams] : getActionInputFieldNames(action.input)
|
|
136
|
-
);
|
|
137
|
-
return [name, Object.freeze({
|
|
138
|
-
name,
|
|
139
|
-
params,
|
|
140
|
-
input: action.input,
|
|
141
|
-
description: action.description
|
|
142
|
-
})];
|
|
143
|
-
})
|
|
144
|
-
)
|
|
145
|
-
);
|
|
146
|
-
const actionMetadata = Object.freeze(
|
|
147
|
-
actionNames.map((name) => actionMetadataByName[name])
|
|
148
|
-
);
|
|
149
|
-
const subscribers = /* @__PURE__ */ new Set();
|
|
150
|
-
const eventListeners = /* @__PURE__ */ new Map();
|
|
151
|
-
function subscribe(selector, listener) {
|
|
152
|
-
if (disposed) {
|
|
153
|
-
return () => {
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
let lastValue;
|
|
157
|
-
let initialized = false;
|
|
158
|
-
try {
|
|
159
|
-
lastValue = selector(snapshotForSelector(visibleSnapshot));
|
|
160
|
-
initialized = true;
|
|
161
|
-
} catch {
|
|
162
|
-
lastValue = void 0;
|
|
163
|
-
initialized = false;
|
|
164
|
-
}
|
|
165
|
-
const subscriber = {
|
|
166
|
-
selector,
|
|
167
|
-
listener,
|
|
168
|
-
lastValue,
|
|
169
|
-
initialized
|
|
170
|
-
};
|
|
171
|
-
subscribers.add(subscriber);
|
|
172
|
-
return () => {
|
|
173
|
-
subscribers.delete(subscriber);
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
function on(event, handler) {
|
|
177
|
-
if (disposed) {
|
|
178
|
-
return () => {
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
let listeners = eventListeners.get(event);
|
|
182
|
-
if (!listeners) {
|
|
183
|
-
listeners = /* @__PURE__ */ new Set();
|
|
184
|
-
eventListeners.set(
|
|
185
|
-
event,
|
|
186
|
-
listeners
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
listeners.add(handler);
|
|
190
|
-
return () => {
|
|
191
|
-
listeners?.delete(handler);
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
function getSnapshot() {
|
|
195
|
-
return freezeSnapshot(visibleSnapshot);
|
|
196
|
-
}
|
|
197
|
-
function getAvailableActions() {
|
|
198
|
-
return queryAvailableActions(schema, visibleSnapshot);
|
|
199
|
-
}
|
|
200
|
-
const getActionMetadata = ((name) => {
|
|
201
|
-
if (name !== void 0) {
|
|
202
|
-
return actionMetadataByName[String(name)];
|
|
203
|
-
}
|
|
204
|
-
return actionMetadata;
|
|
205
|
-
});
|
|
206
|
-
function isActionAvailable(name) {
|
|
207
|
-
return queryActionAvailable(schema, visibleSnapshot, String(name));
|
|
208
|
-
}
|
|
209
|
-
function dispose() {
|
|
210
|
-
if (disposed) {
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
disposed = true;
|
|
214
|
-
subscribers.clear();
|
|
215
|
-
eventListeners.clear();
|
|
216
|
-
}
|
|
217
|
-
function setVisibleSnapshot(snapshot, options) {
|
|
218
|
-
visibleSnapshot = structuredClone(snapshot);
|
|
219
|
-
host.reset(visibleSnapshot);
|
|
220
|
-
const publishedSnapshot = freezeSnapshot(visibleSnapshot);
|
|
221
|
-
if (options?.notify !== false) {
|
|
222
|
-
notifySubscribers(publishedSnapshot);
|
|
223
|
-
}
|
|
224
|
-
return publishedSnapshot;
|
|
225
|
-
}
|
|
226
|
-
function restoreVisibleSnapshot() {
|
|
227
|
-
host.reset(visibleSnapshot);
|
|
228
|
-
}
|
|
229
|
-
function emitEvent(event, payload) {
|
|
230
|
-
const listeners = eventListeners.get(event);
|
|
231
|
-
if (!listeners) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
for (const handler of listeners) {
|
|
235
|
-
try {
|
|
236
|
-
handler(payload);
|
|
237
|
-
} catch {
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
function enqueue(task) {
|
|
242
|
-
const result = dispatchQueue.catch(() => {
|
|
243
|
-
}).then(task);
|
|
244
|
-
dispatchQueue = result.then(() => void 0, () => void 0);
|
|
245
|
-
return result;
|
|
246
|
-
}
|
|
247
|
-
function ensureIntentId(intent) {
|
|
248
|
-
if (intent.intentId && intent.intentId.length > 0) {
|
|
249
|
-
return intent;
|
|
250
|
-
}
|
|
251
|
-
return {
|
|
252
|
-
...intent,
|
|
253
|
-
intentId: generateUUID()
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
async function executeHost(intent, options) {
|
|
257
|
-
return host.dispatch(intent, options);
|
|
258
|
-
}
|
|
259
|
-
function rejectUnavailable(intent) {
|
|
260
|
-
const error = new ManifestoError(
|
|
261
|
-
"ACTION_UNAVAILABLE",
|
|
262
|
-
`Action "${intent.type}" is unavailable against the current visible snapshot`
|
|
263
|
-
);
|
|
264
|
-
emitEvent("dispatch:rejected", {
|
|
265
|
-
intentId: intent.intentId ?? "",
|
|
266
|
-
intent,
|
|
267
|
-
reason: error.message
|
|
268
|
-
});
|
|
269
|
-
throw error;
|
|
270
|
-
}
|
|
271
|
-
function notifySubscribers(snapshot) {
|
|
272
|
-
for (const subscriber of subscribers) {
|
|
273
|
-
let selected;
|
|
274
|
-
try {
|
|
275
|
-
selected = subscriber.selector(snapshot);
|
|
276
|
-
} catch {
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
if (subscriber.initialized && Object.is(subscriber.lastValue, selected)) {
|
|
280
|
-
continue;
|
|
281
|
-
}
|
|
282
|
-
subscriber.lastValue = selected;
|
|
283
|
-
subscriber.initialized = true;
|
|
284
|
-
try {
|
|
285
|
-
subscriber.listener(selected);
|
|
286
|
-
} catch {
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return {
|
|
291
|
-
schema,
|
|
292
|
-
MEL,
|
|
293
|
-
createIntent,
|
|
294
|
-
subscribe,
|
|
295
|
-
on,
|
|
296
|
-
getSnapshot,
|
|
297
|
-
getAvailableActions,
|
|
298
|
-
getActionMetadata,
|
|
299
|
-
isActionAvailable,
|
|
300
|
-
dispose,
|
|
301
|
-
isDisposed: () => disposed,
|
|
302
|
-
getVisibleCoreSnapshot: () => structuredClone(visibleSnapshot),
|
|
303
|
-
setVisibleSnapshot,
|
|
304
|
-
restoreVisibleSnapshot,
|
|
305
|
-
emitEvent,
|
|
306
|
-
enqueue,
|
|
307
|
-
ensureIntentId,
|
|
308
|
-
executeHost,
|
|
309
|
-
rejectUnavailable
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
function createBaseRuntimeInstance(kernel) {
|
|
313
|
-
async function processIntent(intent) {
|
|
314
|
-
if (kernel.isDisposed()) {
|
|
315
|
-
throw new DisposedError();
|
|
316
|
-
}
|
|
317
|
-
if (!kernel.isActionAvailable(intent.type)) {
|
|
318
|
-
return kernel.rejectUnavailable(intent);
|
|
319
|
-
}
|
|
320
|
-
let result;
|
|
321
|
-
try {
|
|
322
|
-
result = await kernel.executeHost(intent);
|
|
323
|
-
} catch (error) {
|
|
324
|
-
const failure = toError(error);
|
|
325
|
-
kernel.emitEvent("dispatch:failed", {
|
|
326
|
-
intentId: intent.intentId ?? "",
|
|
327
|
-
intent,
|
|
328
|
-
error: failure
|
|
329
|
-
});
|
|
330
|
-
throw failure;
|
|
331
|
-
}
|
|
332
|
-
if (result.status === "error") {
|
|
333
|
-
const publishedSnapshot2 = kernel.setVisibleSnapshot(result.snapshot);
|
|
334
|
-
const failure = result.error ?? new ManifestoError("HOST_ERROR", "Host dispatch failed");
|
|
335
|
-
kernel.emitEvent("dispatch:failed", {
|
|
336
|
-
intentId: intent.intentId ?? "",
|
|
337
|
-
intent,
|
|
338
|
-
error: failure,
|
|
339
|
-
snapshot: publishedSnapshot2
|
|
340
|
-
});
|
|
341
|
-
throw failure;
|
|
342
|
-
}
|
|
343
|
-
const publishedSnapshot = kernel.setVisibleSnapshot(result.snapshot);
|
|
344
|
-
kernel.emitEvent("dispatch:completed", {
|
|
345
|
-
intentId: intent.intentId ?? "",
|
|
346
|
-
intent,
|
|
347
|
-
snapshot: publishedSnapshot
|
|
348
|
-
});
|
|
349
|
-
return publishedSnapshot;
|
|
350
|
-
}
|
|
351
|
-
function dispatchAsync(intent) {
|
|
352
|
-
if (kernel.isDisposed()) {
|
|
353
|
-
return Promise.reject(new DisposedError());
|
|
354
|
-
}
|
|
355
|
-
const enrichedIntent = kernel.ensureIntentId(intent);
|
|
356
|
-
return kernel.enqueue(() => processIntent(enrichedIntent));
|
|
357
|
-
}
|
|
358
|
-
return {
|
|
359
|
-
createIntent: kernel.createIntent,
|
|
360
|
-
dispatchAsync,
|
|
361
|
-
subscribe: kernel.subscribe,
|
|
362
|
-
on: kernel.on,
|
|
363
|
-
getSnapshot: kernel.getSnapshot,
|
|
364
|
-
getAvailableActions: kernel.getAvailableActions,
|
|
365
|
-
getActionMetadata: kernel.getActionMetadata,
|
|
366
|
-
isActionAvailable: kernel.isActionAvailable,
|
|
367
|
-
MEL: kernel.MEL,
|
|
368
|
-
schema: kernel.schema,
|
|
369
|
-
dispose: kernel.dispose
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
function snapshotForSelector(snapshot) {
|
|
373
|
-
return freezeSnapshot(snapshot);
|
|
374
|
-
}
|
|
375
|
-
function freezeSnapshot(snapshot) {
|
|
376
|
-
return Object.freeze(structuredClone(snapshot));
|
|
377
|
-
}
|
|
378
|
-
function toError(error) {
|
|
379
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
380
|
-
}
|
|
381
|
-
function generateUUID() {
|
|
382
|
-
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
383
|
-
return crypto.randomUUID();
|
|
384
|
-
}
|
|
385
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (char) => {
|
|
386
|
-
const random = Math.random() * 16 | 0;
|
|
387
|
-
const value = char === "x" ? random : random & 3 | 8;
|
|
388
|
-
return value.toString(16);
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
export {
|
|
393
|
-
ManifestoError,
|
|
394
|
-
ReservedEffectError,
|
|
395
|
-
CompileError,
|
|
396
|
-
DisposedError,
|
|
397
|
-
AlreadyActivatedError,
|
|
398
|
-
ACTION_PARAM_NAMES,
|
|
399
|
-
attachRuntimeKernelFactory,
|
|
400
|
-
getRuntimeKernelFactory,
|
|
401
|
-
getActivationState,
|
|
402
|
-
assertComposableNotActivated,
|
|
403
|
-
activateComposable,
|
|
404
|
-
createRuntimeKernel,
|
|
405
|
-
createBaseRuntimeInstance
|
|
406
|
-
};
|
|
407
|
-
//# sourceMappingURL=chunk-ND4PXKJT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/internal.ts"],"sourcesContent":["export class ManifestoError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"ManifestoError\";\n this.code = code;\n }\n}\n\nexport class ReservedEffectError extends ManifestoError {\n readonly effectType: string;\n\n constructor(effectType: string) {\n super(\n \"RESERVED_EFFECT\",\n `Effect type \"${effectType}\" is reserved and cannot be overridden`,\n );\n this.name = \"ReservedEffectError\";\n this.effectType = effectType;\n }\n}\n\nexport interface CompileDiagnostic {\n readonly severity: \"error\" | \"warning\" | \"info\";\n readonly code: string;\n readonly message: string;\n readonly location: {\n readonly start: { readonly line: number; readonly column: number; readonly offset: number };\n readonly end: { readonly line: number; readonly column: number; readonly offset: number };\n };\n readonly source?: string;\n readonly suggestion?: string;\n}\n\nexport class CompileError extends ManifestoError {\n readonly diagnostics: readonly CompileDiagnostic[];\n\n constructor(diagnostics: readonly CompileDiagnostic[], formattedMessage: string) {\n super(\"COMPILE_ERROR\", formattedMessage);\n this.name = \"CompileError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport class DisposedError extends ManifestoError {\n constructor() {\n super(\"DISPOSED\", \"Cannot use a disposed Manifesto runtime\");\n this.name = \"DisposedError\";\n }\n}\n\nexport class AlreadyActivatedError extends ManifestoError {\n constructor() {\n super(\"ALREADY_ACTIVATED\", \"ComposableManifesto.activate() may only be called once\");\n this.name = \"AlreadyActivatedError\";\n }\n}\n","import {\n getAvailableActions as queryAvailableActions,\n isActionAvailable as queryActionAvailable,\n type DomainSchema,\n type Snapshot as CoreSnapshot,\n} from \"@manifesto-ai/core\";\nimport type { HostResult, ManifestoHost } from \"@manifesto-ai/host\";\n\nimport {\n AlreadyActivatedError,\n DisposedError,\n ManifestoError,\n} from \"./errors.js\";\nimport type {\n BaseLaws,\n ComposableManifesto,\n ManifestoBaseInstance,\n ManifestoDomainShape,\n ManifestoEvent,\n ManifestoEventMap,\n Selector,\n Snapshot,\n TypedActionMetadata,\n TypedCreateIntent,\n TypedGetActionMetadata,\n TypedIntent,\n TypedMEL,\n TypedOn,\n TypedSubscribe,\n Unsubscribe,\n} from \"./types.js\";\n\nexport const ACTION_PARAM_NAMES = Symbol(\"manifesto-sdk.action-param-names\");\nexport const RUNTIME_KERNEL_FACTORY = Symbol(\"manifesto-sdk.runtime-kernel-factory\");\nexport const ACTIVATION_STATE = Symbol(\"manifesto-sdk.activation-state\");\n\ntype RuntimeActionParamMetadata = readonly string[] | null;\ntype RuntimeActionRef = {\n readonly name: PropertyKey;\n readonly [ACTION_PARAM_NAMES]?: RuntimeActionParamMetadata;\n};\n\nexport type ActivationState = {\n activated: boolean;\n};\n\nexport type HostDispatchOptions = NonNullable<Parameters<ManifestoHost[\"dispatch\"]>[1]>;\n\ninterface Subscriber<TState, R> {\n readonly selector: Selector<TState, R>;\n readonly listener: (value: R) => void;\n lastValue: R | undefined;\n initialized: boolean;\n}\n\nexport interface RuntimeKernel<T extends ManifestoDomainShape> {\n readonly schema: DomainSchema;\n readonly MEL: TypedMEL<T>;\n readonly createIntent: TypedCreateIntent<T>;\n readonly subscribe: TypedSubscribe<T>;\n readonly on: TypedOn<T>;\n readonly getSnapshot: () => Snapshot<T[\"state\"]>;\n readonly getAvailableActions: () => readonly (keyof T[\"actions\"])[];\n readonly getActionMetadata: TypedGetActionMetadata<T>;\n readonly isActionAvailable: (name: keyof T[\"actions\"]) => boolean;\n readonly dispose: () => void;\n readonly isDisposed: () => boolean;\n readonly getVisibleCoreSnapshot: () => CoreSnapshot;\n readonly setVisibleSnapshot: (\n snapshot: CoreSnapshot,\n options?: { readonly notify?: boolean },\n ) => Snapshot<T[\"state\"]>;\n readonly restoreVisibleSnapshot: () => void;\n readonly emitEvent: <K extends ManifestoEvent>(\n event: K,\n payload: ManifestoEventMap<T>[K],\n ) => void;\n readonly enqueue: <R>(task: () => Promise<R>) => Promise<R>;\n readonly ensureIntentId: (intent: TypedIntent<T>) => TypedIntent<T>;\n readonly executeHost: (\n intent: TypedIntent<T>,\n options?: HostDispatchOptions,\n ) => Promise<HostResult>;\n readonly rejectUnavailable: (intent: TypedIntent<T>) => never;\n}\n\nexport type RuntimeKernelFactory<T extends ManifestoDomainShape> = () => RuntimeKernel<T>;\n\nexport type InternalComposableManifesto<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n> = ComposableManifesto<T, Laws> & {\n readonly [RUNTIME_KERNEL_FACTORY]: RuntimeKernelFactory<T>;\n readonly [ACTIVATION_STATE]: ActivationState;\n};\n\ntype RuntimeKernelOptions<T extends ManifestoDomainShape> = {\n readonly schema: DomainSchema;\n readonly host: ManifestoHost;\n readonly MEL: TypedMEL<T>;\n readonly createIntent: TypedCreateIntent<T>;\n};\n\nexport function attachRuntimeKernelFactory<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n factory: RuntimeKernelFactory<T>,\n activationState?: ActivationState,\n): InternalComposableManifesto<T, Laws> {\n Object.defineProperty(manifesto, RUNTIME_KERNEL_FACTORY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: factory,\n });\n\n const state = activationState ?? getExistingActivationState(manifesto) ?? {\n activated: false,\n };\n\n if (!getExistingActivationState(manifesto)) {\n Object.defineProperty(manifesto, ACTIVATION_STATE, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: state,\n });\n }\n\n return manifesto as InternalComposableManifesto<T, Laws>;\n}\n\nexport function getRuntimeKernelFactory<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n): RuntimeKernelFactory<T> {\n const internal = manifesto as Partial<InternalComposableManifesto<T, Laws>>;\n const factory = internal[RUNTIME_KERNEL_FACTORY];\n\n if (typeof factory !== \"function\") {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"ComposableManifesto is missing its runtime kernel factory\",\n );\n }\n\n return factory;\n}\n\nexport function getActivationState<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n): ActivationState {\n const internal = manifesto as Partial<InternalComposableManifesto<T, Laws>>;\n const state = internal[ACTIVATION_STATE];\n\n if (!state) {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"ComposableManifesto is missing its activation state\",\n );\n }\n\n return state;\n}\n\nexport function assertComposableNotActivated<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n): void {\n if (getActivationState(manifesto).activated) {\n throw new AlreadyActivatedError();\n }\n}\n\nexport function activateComposable<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n): void {\n const state = getActivationState(manifesto);\n if (state.activated) {\n throw new AlreadyActivatedError();\n }\n state.activated = true;\n}\n\nfunction getExistingActivationState<\n T extends ManifestoDomainShape,\n Laws extends BaseLaws,\n>(\n manifesto: ComposableManifesto<T, Laws>,\n): ActivationState | null {\n const internal = manifesto as Partial<InternalComposableManifesto<T, Laws>>;\n return internal[ACTIVATION_STATE] ?? null;\n}\n\nfunction getActionInputFieldNames(\n input: DomainSchema[\"actions\"][string][\"input\"],\n): readonly string[] {\n if (!input || input.type !== \"object\" || !input.fields) {\n return [];\n }\n\n return Object.keys(input.fields);\n}\n\nexport function createRuntimeKernel<T extends ManifestoDomainShape>({\n schema,\n host,\n MEL,\n createIntent,\n}: RuntimeKernelOptions<T>): RuntimeKernel<T> {\n const initialSnapshot = host.getSnapshot();\n if (!initialSnapshot) {\n throw new ManifestoError(\"SCHEMA_ERROR\", \"Host failed to initialize its genesis snapshot\");\n }\n\n let visibleSnapshot: CoreSnapshot = initialSnapshot;\n let dispatchQueue: Promise<void> = Promise.resolve();\n let disposed = false;\n const actionNames = Object.keys(schema.actions) as Array<keyof T[\"actions\"] & string>;\n const actionMetadataByName = Object.freeze(\n Object.fromEntries(\n actionNames.map((name) => {\n const action = schema.actions[name];\n const actionRef = MEL.actions[name] as unknown as RuntimeActionRef | undefined;\n const rawParams = actionRef?.[ACTION_PARAM_NAMES];\n const params = Object.freeze(\n Array.isArray(rawParams) ? [...rawParams] : getActionInputFieldNames(action.input),\n );\n\n return [name, Object.freeze({\n name,\n params,\n input: action.input,\n description: action.description,\n })];\n }),\n ),\n ) as Readonly<Record<keyof T[\"actions\"] & string, TypedActionMetadata<T>>>;\n const actionMetadata = Object.freeze(\n actionNames.map((name) => actionMetadataByName[name]),\n ) as readonly TypedActionMetadata<T>[];\n\n const subscribers = new Set<Subscriber<T[\"state\"], unknown>>();\n const eventListeners = new Map<\n ManifestoEvent,\n Set<(payload: ManifestoEventMap<T>[ManifestoEvent]) => void>\n >();\n\n function subscribe<R>(\n selector: Selector<T[\"state\"], R>,\n listener: (value: R) => void,\n ): Unsubscribe {\n if (disposed) {\n return () => {};\n }\n\n let lastValue: R | undefined;\n let initialized = false;\n\n try {\n lastValue = selector(snapshotForSelector<T[\"state\"]>(visibleSnapshot));\n initialized = true;\n } catch {\n lastValue = undefined;\n initialized = false;\n }\n\n const subscriber: Subscriber<T[\"state\"], R> = {\n selector,\n listener,\n lastValue,\n initialized,\n };\n\n subscribers.add(subscriber as Subscriber<T[\"state\"], unknown>);\n return () => {\n subscribers.delete(subscriber as Subscriber<T[\"state\"], unknown>);\n };\n }\n\n function on<K extends ManifestoEvent>(\n event: K,\n handler: (payload: ManifestoEventMap<T>[K]) => void,\n ): Unsubscribe {\n if (disposed) {\n return () => {};\n }\n\n let listeners = eventListeners.get(event);\n if (!listeners) {\n listeners = new Set();\n eventListeners.set(\n event,\n listeners as Set<(payload: ManifestoEventMap<T>[ManifestoEvent]) => void>,\n );\n }\n\n listeners.add(handler as (payload: ManifestoEventMap<T>[ManifestoEvent]) => void);\n return () => {\n listeners?.delete(handler as (payload: ManifestoEventMap<T>[ManifestoEvent]) => void);\n };\n }\n\n function getSnapshot(): Snapshot<T[\"state\"]> {\n return freezeSnapshot(visibleSnapshot) as Snapshot<T[\"state\"]>;\n }\n\n function getAvailableActions(): readonly (keyof T[\"actions\"])[] {\n return queryAvailableActions(schema, visibleSnapshot) as readonly (keyof T[\"actions\"])[];\n }\n\n const getActionMetadata: TypedGetActionMetadata<T> = ((name?: keyof T[\"actions\"]) => {\n if (name !== undefined) {\n return actionMetadataByName[String(name) as keyof T[\"actions\"] & string];\n }\n\n return actionMetadata;\n }) as TypedGetActionMetadata<T>;\n\n function isActionAvailable(name: keyof T[\"actions\"]): boolean {\n return queryActionAvailable(schema, visibleSnapshot, String(name));\n }\n\n function dispose(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n subscribers.clear();\n eventListeners.clear();\n }\n\n function setVisibleSnapshot(\n snapshot: CoreSnapshot,\n options?: { readonly notify?: boolean },\n ): Snapshot<T[\"state\"]> {\n visibleSnapshot = structuredClone(snapshot);\n host.reset(visibleSnapshot);\n\n const publishedSnapshot = freezeSnapshot(visibleSnapshot) as Snapshot<T[\"state\"]>;\n if (options?.notify !== false) {\n notifySubscribers(publishedSnapshot);\n }\n return publishedSnapshot;\n }\n\n function restoreVisibleSnapshot(): void {\n host.reset(visibleSnapshot);\n }\n\n function emitEvent<K extends ManifestoEvent>(\n event: K,\n payload: ManifestoEventMap<T>[K],\n ): void {\n const listeners = eventListeners.get(event);\n if (!listeners) {\n return;\n }\n\n for (const handler of listeners) {\n try {\n handler(payload);\n } catch {\n // Event handler failures are isolated from runtime semantics.\n }\n }\n }\n\n function enqueue<R>(task: () => Promise<R>): Promise<R> {\n const result = dispatchQueue\n .catch(() => {})\n .then(task);\n\n dispatchQueue = result.then(() => undefined, () => undefined);\n return result;\n }\n\n function ensureIntentId(intent: TypedIntent<T>): TypedIntent<T> {\n if (intent.intentId && intent.intentId.length > 0) {\n return intent;\n }\n\n return {\n ...intent,\n intentId: generateUUID(),\n } as TypedIntent<T>;\n }\n\n async function executeHost(\n intent: TypedIntent<T>,\n options?: HostDispatchOptions,\n ): Promise<HostResult> {\n return host.dispatch(intent, options);\n }\n\n function rejectUnavailable(intent: TypedIntent<T>): never {\n const error = new ManifestoError(\n \"ACTION_UNAVAILABLE\",\n `Action \"${intent.type}\" is unavailable against the current visible snapshot`,\n );\n emitEvent(\"dispatch:rejected\", {\n intentId: intent.intentId ?? \"\",\n intent,\n reason: error.message,\n });\n throw error;\n }\n\n function notifySubscribers(snapshot: Snapshot<T[\"state\"]>): void {\n for (const subscriber of subscribers) {\n let selected: unknown;\n try {\n selected = subscriber.selector(snapshot);\n } catch {\n continue;\n }\n\n if (subscriber.initialized && Object.is(subscriber.lastValue, selected)) {\n continue;\n }\n\n subscriber.lastValue = selected;\n subscriber.initialized = true;\n\n try {\n subscriber.listener(selected);\n } catch {\n // Listener failures are isolated from runtime semantics.\n }\n }\n }\n\n return {\n schema,\n MEL,\n createIntent,\n subscribe,\n on,\n getSnapshot,\n getAvailableActions,\n getActionMetadata,\n isActionAvailable,\n dispose,\n isDisposed: () => disposed,\n getVisibleCoreSnapshot: () => structuredClone(visibleSnapshot),\n setVisibleSnapshot,\n restoreVisibleSnapshot,\n emitEvent,\n enqueue,\n ensureIntentId,\n executeHost,\n rejectUnavailable,\n };\n}\n\nexport function createBaseRuntimeInstance<T extends ManifestoDomainShape>(\n kernel: RuntimeKernel<T>,\n): ManifestoBaseInstance<T> {\n async function processIntent(intent: TypedIntent<T>): Promise<Snapshot<T[\"state\"]>> {\n if (kernel.isDisposed()) {\n throw new DisposedError();\n }\n\n if (!kernel.isActionAvailable(intent.type as keyof T[\"actions\"])) {\n return kernel.rejectUnavailable(intent);\n }\n\n let result: HostResult;\n try {\n result = await kernel.executeHost(intent);\n } catch (error) {\n const failure = toError(error);\n kernel.emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n error: failure,\n });\n throw failure;\n }\n\n if (result.status === \"error\") {\n const publishedSnapshot = kernel.setVisibleSnapshot(result.snapshot);\n const failure = result.error ?? new ManifestoError(\"HOST_ERROR\", \"Host dispatch failed\");\n kernel.emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n error: failure,\n snapshot: publishedSnapshot,\n });\n throw failure;\n }\n\n const publishedSnapshot = kernel.setVisibleSnapshot(result.snapshot);\n kernel.emitEvent(\"dispatch:completed\", {\n intentId: intent.intentId ?? \"\",\n intent,\n snapshot: publishedSnapshot,\n });\n return publishedSnapshot;\n }\n\n function dispatchAsync(intent: TypedIntent<T>): Promise<Snapshot<T[\"state\"]>> {\n if (kernel.isDisposed()) {\n return Promise.reject(new DisposedError());\n }\n\n const enrichedIntent = kernel.ensureIntentId(intent);\n return kernel.enqueue(() => processIntent(enrichedIntent));\n }\n\n return {\n createIntent: kernel.createIntent,\n dispatchAsync,\n subscribe: kernel.subscribe,\n on: kernel.on,\n getSnapshot: kernel.getSnapshot,\n getAvailableActions: kernel.getAvailableActions,\n getActionMetadata: kernel.getActionMetadata,\n isActionAvailable: kernel.isActionAvailable,\n MEL: kernel.MEL,\n schema: kernel.schema,\n dispose: kernel.dispose,\n };\n}\n\nfunction snapshotForSelector<TState>(snapshot: CoreSnapshot): Snapshot<TState> {\n return freezeSnapshot(snapshot) as Snapshot<TState>;\n}\n\nfunction freezeSnapshot<TData = unknown>(snapshot: CoreSnapshot): Snapshot<TData> {\n return Object.freeze(structuredClone(snapshot)) as Snapshot<TData>;\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error\n ? error\n : new Error(String(error));\n}\n\nfunction generateUUID(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n"],"mappings":"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","names":["publishedSnapshot"]}
|