@manifesto-ai/sdk 2.3.0 → 3.1.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 +50 -29
- package/dist/chunk-CMZQTFX2.js +332 -0
- package/dist/chunk-CMZQTFX2.js.map +1 -0
- package/dist/index.d.ts +15 -386
- package/dist/index.js +267 -375
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +44 -0
- package/dist/internal.js +17 -0
- package/dist/internal.js.map +1 -0
- package/dist/types-oXciBlAp.d.ts +99 -0
- package/package.json +11 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create-manifesto.ts","../src/errors.ts","../src/dispatch-async.ts","../src/typed-ops.ts","../src/index.ts"],"sourcesContent":["/**\n * createManifesto() Factory\n *\n * The sole SDK-owned concept. Creates a ManifestoInstance for the default\n * direct-dispatch path by composing schema compilation and Host execution into\n * a single handle. Governed World composition remains explicit outside this\n * factory.\n *\n * @see SDK SPEC v1.0.0 §5\n * @see ADR-010\n * @module\n */\n\nimport {\n createHost,\n type ManifestoHost,\n type EffectHandler as HostEffectHandler,\n type EffectContext as HostEffectContext,\n} from \"@manifesto-ai/host\";\nimport {\n type DomainSchema,\n type Patch,\n type Snapshot as CoreSnapshot,\n type Intent,\n getAvailableActions as queryAvailableActions,\n isActionAvailable as queryActionAvailable,\n semanticPathToPatchPath,\n extractDefaults,\n} from \"@manifesto-ai/core\";\nimport { compileMelDomain } from \"@manifesto-ai/compiler\";\n\nimport type {\n Snapshot,\n ManifestoConfig,\n ManifestoInstance,\n ManifestoEvent,\n ManifestoEventMap,\n EffectHandler,\n Selector,\n Unsubscribe,\n} from \"./types.js\";\nimport { ReservedEffectError, DisposedError, ManifestoError, CompileError } from \"./errors.js\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Reserved effect type used by the compiler for $system.* references. */\nconst RESERVED_EFFECT_TYPE = \"system.get\";\n\n/** Reserved namespace prefix for system actions. */\nconst RESERVED_NAMESPACE_PREFIX = \"system.\";\n\n// =============================================================================\n// createManifesto() — SDK SPEC v1.0.0 §5\n// =============================================================================\n\n/**\n * Create a ManifestoInstance.\n *\n * This is the sole entry point for SDK consumers. It composes the protocol\n * axes required for the default direct-dispatch runtime into a single handle with\n * 7 methods: dispatch, subscribe, on, isActionAvailable,\n * getAvailableActions, getSnapshot, dispose.\n *\n * @see SDK-FACTORY-1 through SDK-FACTORY-5\n * @see SDK-INV-1 through SDK-INV-6\n */\nexport function createManifesto<T = unknown>(\n config: ManifestoConfig<T>,\n): ManifestoInstance<T> {\n // ─── INV-3: Schema resolution ──────────────────────────────────────────\n const schema = resolveSchema(config.schema);\n\n // ─── INV-4: Reserved effect protection ─────────────────────────────────\n if (RESERVED_EFFECT_TYPE in config.effects) {\n throw new ReservedEffectError(RESERVED_EFFECT_TYPE);\n }\n\n // Validate no user actions use reserved namespace\n validateReservedNamespaces(schema);\n\n // ─── INV-5: Host creation + effect registration ────────────────────────\n const host = createInternalHost(schema, config.effects, config.snapshot);\n\n // ─── State holder (closure-captured) ───────────────────────────────────\n // Host always initializes with a snapshot (initialData defaults to {})\n let currentSnapshot: CoreSnapshot = host.getSnapshot()!;\n\n // ─── Subscription store ────────────────────────────────────────────────\n const subscribers = new Set<Subscriber<unknown>>();\n\n // ─── Event channel (telemetry) ─────────────────────────────────────────\n const eventListeners = new Map<ManifestoEvent, Set<(payload: ManifestoEventMap<T>[ManifestoEvent]) => void>>();\n\n // ─── Serial dispatch queue (SDK-INV-5) ─────────────────────────────────\n let dispatchQueue: Promise<void> = Promise.resolve();\n\n // ─── Disposed flag ─────────────────────────────────────────────────────\n let disposed = false;\n\n // ─── Guard function ────────────────────────────────────────────────────\n const guard = config.guard ?? null;\n\n // =========================================================================\n // dispatch() — SDK-DISPATCH-1~4\n // =========================================================================\n\n function dispatch(intent: Intent): void {\n // SDK-DISPATCH-4\n if (disposed) {\n throw new DisposedError();\n }\n\n // SDK-DISPATCH-2: Enrich with intentId if not provided\n const enrichedIntent: Intent = intent.intentId\n ? intent\n : { ...intent, intentId: generateIntentId() };\n\n // SDK-DISPATCH-1, SDK-DISPATCH-3: Enqueue for serial processing\n const prev = dispatchQueue;\n dispatchQueue = prev\n .catch(() => {}) // Previous failure doesn't block queue\n .then(() => processIntent(enrichedIntent));\n // Tail always resolves\n dispatchQueue = dispatchQueue.catch(() => {});\n }\n\n /**\n * Process a single intent through the Host dispatch cycle.\n */\n async function processIntent(intent: Intent): Promise<void> {\n // SDK-DISPOSE-1: Do not process queued intents after dispose\n if (disposed) return;\n\n // SDK-INV-5: Guard evaluates against current snapshot at dequeue time\n if (guard) {\n try {\n // SDK-SNAP-IMMUTABLE: Prevent guard from mutating internal state\n const allowed = guard(intent, Object.freeze(structuredClone(currentSnapshot)) as Snapshot<T>);\n if (!allowed) {\n emitEvent(\"dispatch:rejected\", {\n intentId: intent.intentId,\n intent,\n reason: \"Guard rejected the intent\",\n });\n return;\n }\n } catch (error) {\n emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId,\n intent,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n return;\n }\n }\n\n try {\n const result = await host.dispatch(intent);\n\n if (result.status === \"error\") {\n currentSnapshot = result.snapshot;\n notifySubscribers();\n emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId,\n intent,\n error: result.error ?? new ManifestoError(\"HOST_ERROR\", \"Host dispatch failed\"),\n });\n return;\n }\n\n // Update state\n currentSnapshot = result.snapshot;\n\n // SDK-INV-1: notify subscribers at terminal snapshot only\n notifySubscribers();\n\n emitEvent(\"dispatch:completed\", {\n intentId: intent.intentId,\n intent,\n snapshot: result.snapshot as Snapshot<T>,\n });\n } catch (error) {\n emitEvent(\"dispatch:failed\", {\n intentId: intent.intentId,\n intent,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n // =========================================================================\n // subscribe() — SDK-SUB-1~4\n // =========================================================================\n\n function subscribe<R>(\n selector: Selector<T, R>,\n listener: (value: R) => void,\n ): Unsubscribe {\n if (disposed) return () => {};\n\n const sub: Subscriber<R> = {\n selector: selector as Selector<unknown, R>,\n listener,\n lastValue: selector(currentSnapshot as Snapshot<T>),\n initialized: true,\n };\n\n subscribers.add(sub as Subscriber<unknown>);\n\n return () => {\n subscribers.delete(sub as Subscriber<unknown>);\n };\n }\n\n // =========================================================================\n // on() — SDK-EVENT-1~3, SDK-INV-2\n // =========================================================================\n\n function on<K extends ManifestoEvent>(\n event: K,\n handler: (payload: ManifestoEventMap<T>[K]) => void,\n ): Unsubscribe {\n if (disposed) return () => {};\n\n let listeners = eventListeners.get(event);\n if (!listeners) {\n listeners = new Set();\n eventListeners.set(event, listeners as Set<(payload: ManifestoEventMap<T>[ManifestoEvent]) => void>);\n }\n listeners.add(handler as (payload: ManifestoEventMap<T>[ManifestoEvent]) => void);\n\n return () => {\n listeners!.delete(handler as (payload: ManifestoEventMap<T>[ManifestoEvent]) => void);\n };\n }\n\n // =========================================================================\n // Availability Queries\n // =========================================================================\n\n function isActionAvailable(actionName: string): boolean {\n return queryActionAvailable(schema, currentSnapshot, actionName);\n }\n\n function getAvailableActions(): readonly string[] {\n return queryAvailableActions(schema, currentSnapshot);\n }\n\n // =========================================================================\n // getSnapshot() — SDK-SNAP-1\n // =========================================================================\n\n function getSnapshot(): Snapshot<T> {\n // SDK-SNAP-IMMUTABLE: Return a frozen copy to prevent external mutation\n // that would bypass the patch/apply pipeline.\n return Object.freeze(structuredClone(currentSnapshot)) as Snapshot<T>;\n }\n\n // =========================================================================\n // dispose() — SDK-DISPOSE-1~3\n // =========================================================================\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n\n // Release all resources\n subscribers.clear();\n eventListeners.clear();\n }\n\n // =========================================================================\n // Internal helpers\n // =========================================================================\n\n /** Notify all subscribers with current snapshot (SDK-INV-1). */\n function notifySubscribers(): void {\n // SDK-SNAP-IMMUTABLE: Pass a frozen clone to selectors so that neither\n // selector nor listener can mutate internal state.\n const frozenSnap = Object.freeze(structuredClone(currentSnapshot)) as Snapshot<T>;\n for (const sub of subscribers) {\n const selected = (sub.selector as Selector<T, unknown>)(frozenSnap);\n\n // Selector-based change detection (SDK-SUB-4)\n if (sub.initialized && Object.is(sub.lastValue, selected)) {\n continue;\n }\n\n sub.lastValue = selected;\n sub.initialized = true;\n sub.listener(selected);\n }\n }\n\n /** Emit an event to the telemetry channel. */\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) return;\n for (const handler of listeners) {\n try {\n handler(payload);\n } catch {\n // Event handlers must not break the dispatch loop\n }\n }\n }\n\n // =========================================================================\n // Return ManifestoInstance\n // =========================================================================\n\n return {\n dispatch,\n subscribe,\n on,\n isActionAvailable,\n getAvailableActions,\n getSnapshot,\n dispose,\n };\n}\n\n// =============================================================================\n// Schema Resolution (INV-3)\n// =============================================================================\n\n/**\n * Resolve schema from DomainSchema or MEL text string.\n * Injects platform namespaces ($host, $mel).\n */\nfunction resolveSchema(schema: DomainSchema | string): DomainSchema {\n let domainSchema: DomainSchema;\n\n if (typeof schema === \"string\") {\n const result = compileMelDomain(schema, { mode: \"domain\" });\n\n if (result.errors.length > 0) {\n const formatted = result.errors.map((d) => {\n const loc = d.location;\n const header = loc && (loc.start.line > 0 || loc.start.column > 0)\n ? `[${d.code}] ${d.message} (${loc.start.line}:${loc.start.column})`\n : `[${d.code}] ${d.message}`;\n\n if (!loc || loc.start.line === 0) return header;\n\n const sourceLines = schema.split(\"\\n\");\n const lineContent = sourceLines[loc.start.line - 1];\n if (!lineContent) return header;\n\n const lineNumStr = String(loc.start.line).padStart(4, \" \");\n const underlineLen = Math.max(1,\n loc.end.line === loc.start.line\n ? Math.min(loc.end.column - loc.start.column, lineContent.length - loc.start.column + 1)\n : 1);\n const padding = \" \".repeat(lineNumStr.length + 3 + loc.start.column - 1);\n return `${header}\\n${lineNumStr} | ${lineContent}\\n${padding}${\"^\".repeat(underlineLen)}`;\n }).join(\"\\n\\n\");\n\n throw new CompileError(\n result.errors,\n `MEL compilation failed:\\n${formatted}`,\n );\n }\n\n if (!result.schema) {\n throw new ManifestoError(\n \"COMPILE_ERROR\",\n \"MEL compilation produced no schema\",\n );\n }\n\n domainSchema = result.schema as DomainSchema;\n } else {\n domainSchema = schema;\n }\n\n return withPlatformNamespaces(domainSchema);\n}\n\n// =============================================================================\n// Platform Namespace Injection (INV-3)\n// =============================================================================\n\n/**\n * Inject $host and $mel platform namespaces into schema.\n * Absorbed from runtime/src/schema/schema-manager.ts.\n */\nfunction withPlatformNamespaces(schema: DomainSchema): DomainSchema {\n const fields = { ...schema.state.fields };\n let changed = false;\n\n // $host namespace\n if (!fields.$host) {\n fields.$host = {\n type: \"object\",\n required: false,\n default: {},\n };\n changed = true;\n } else if (fields.$host.type !== \"object\") {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"Reserved namespace '$host' must be an object field\",\n );\n } else if (fields.$host.default === undefined) {\n fields.$host = { ...fields.$host, default: {} };\n changed = true;\n }\n\n // $mel namespace with guards.intent structure\n if (!fields.$mel) {\n fields.$mel = {\n type: \"object\",\n required: false,\n default: { guards: { intent: {} } },\n fields: {\n guards: {\n type: \"object\",\n required: false,\n default: { intent: {} },\n fields: {\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n },\n },\n };\n changed = true;\n } else if (fields.$mel.type !== \"object\") {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"Reserved namespace '$mel' must be an object field\",\n );\n } else {\n let nextMel = fields.$mel;\n if (nextMel.default === undefined) {\n nextMel = { ...nextMel, default: { guards: { intent: {} } } };\n changed = true;\n }\n\n const melFields = nextMel.fields ?? {};\n const guardsField = melFields.guards;\n\n if (!guardsField) {\n nextMel = {\n ...nextMel,\n fields: {\n ...melFields,\n guards: {\n type: \"object\",\n required: false,\n default: { intent: {} },\n fields: {\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n },\n },\n };\n changed = true;\n } else if (guardsField.type !== \"object\") {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"Reserved namespace '$mel.guards' must be an object field\",\n );\n } else {\n let nextGuards = guardsField;\n if (guardsField.default === undefined) {\n nextGuards = { ...nextGuards, default: { intent: {} } };\n changed = true;\n }\n\n const guardFields = nextGuards.fields ?? {};\n const intentField = guardFields.intent;\n\n if (!intentField) {\n nextGuards = {\n ...nextGuards,\n fields: {\n ...guardFields,\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n };\n changed = true;\n } else if (intentField.type !== \"object\") {\n throw new ManifestoError(\n \"SCHEMA_ERROR\",\n \"Reserved namespace '$mel.guards.intent' must be an object field\",\n );\n } else if (intentField.default === undefined) {\n nextGuards = {\n ...nextGuards,\n fields: {\n ...guardFields,\n intent: { ...intentField, default: {} },\n },\n };\n changed = true;\n }\n\n if (nextGuards !== guardsField) {\n nextMel = {\n ...nextMel,\n fields: {\n ...melFields,\n guards: nextGuards,\n },\n };\n }\n }\n\n if (nextMel !== fields.$mel) {\n fields.$mel = nextMel;\n changed = true;\n }\n }\n\n if (!changed) return schema;\n\n return {\n ...schema,\n state: {\n ...schema.state,\n fields,\n },\n };\n}\n\n// =============================================================================\n// Reserved Namespace Validation\n// =============================================================================\n\nfunction validateReservedNamespaces(schema: DomainSchema): void {\n const actions = schema.actions || {};\n for (const actionType of Object.keys(actions)) {\n if (actionType.startsWith(RESERVED_NAMESPACE_PREFIX)) {\n throw new ManifestoError(\n \"RESERVED_NAMESPACE\",\n `Action type \"${actionType}\" uses reserved namespace prefix \"${RESERVED_NAMESPACE_PREFIX}\"`,\n );\n }\n }\n}\n\n// =============================================================================\n// Internal Host Creation (INV-5)\n// Absorbed from runtime/src/execution/internal-host.ts\n// =============================================================================\n\nfunction createInternalHost(\n schema: DomainSchema,\n effects: Record<string, EffectHandler>,\n initialSnapshot?: Snapshot,\n): ManifestoHost {\n const host = createHost(schema, {\n initialData: initialSnapshot?.data ?? extractDefaults(schema.state),\n });\n\n // P1-1: When restoring from a persisted snapshot, use host.reset() to\n // hydrate the full canonical Snapshot (meta, system, input) rather than\n // only forwarding data via initialData which resets meta.version to 0.\n if (initialSnapshot) {\n host.reset(initialSnapshot);\n }\n\n // Register reserved system.get handler (compiler-internal, CRITICAL)\n host.registerEffect(RESERVED_EFFECT_TYPE, async (\n _type: string,\n params: Record<string, unknown>,\n ctx: HostEffectContext,\n ): Promise<Patch[]> => {\n const { patches } = executeSystemGet(params, ctx.snapshot);\n return patches;\n });\n\n // Register user effects, adapting 2-param → 3-param signature\n for (const [effectType, appHandler] of Object.entries(effects)) {\n const hostHandler: HostEffectHandler = async (\n _type: string,\n params: Record<string, unknown>,\n ctx: HostEffectContext,\n ): Promise<Patch[]> => {\n const appCtx = { snapshot: ctx.snapshot };\n const patches = await appHandler(params, appCtx);\n return patches as Patch[];\n };\n\n host.registerEffect(effectType, hostHandler);\n }\n\n return host;\n}\n\n// =============================================================================\n// system.get Effect Implementation\n// Absorbed from runtime/src/execution/system-get.ts\n// =============================================================================\n\ninterface SystemGetReadParams {\n path: string;\n target?: string;\n}\n\ninterface SystemGetGenerateParams {\n key: string;\n into: string;\n}\n\ntype SystemGetParams = SystemGetReadParams | SystemGetGenerateParams;\n\nfunction isGenerateParams(params: unknown): params is SystemGetGenerateParams {\n return (\n typeof params === \"object\" &&\n params !== null &&\n \"key\" in params &&\n \"into\" in params\n );\n}\n\nfunction generateSystemValue(key: string): unknown {\n switch (key) {\n case \"uuid\":\n return generateUUID();\n case \"timestamp\":\n case \"time.now\":\n return Date.now();\n case \"isoTimestamp\":\n return new Date().toISOString();\n default:\n return null;\n }\n}\n\nfunction generateUUID(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction executeSystemGet(\n params: unknown,\n snapshot: Snapshot,\n): { patches: Patch[] } {\n if (isGenerateParams(params)) {\n const value = generateSystemValue(params.key);\n const patches: Patch[] = [{\n op: \"set\",\n path: normalizeTargetPath(params.into),\n value,\n }];\n return { patches };\n }\n\n // Read mode\n const { path, target } = params as SystemGetReadParams;\n const result = resolvePathValue(path, snapshot);\n\n const patches: Patch[] = [];\n if (target) {\n patches.push({\n op: \"set\",\n path: normalizeTargetPath(target),\n value: result.value,\n });\n }\n\n return { patches };\n}\n\nfunction normalizePath(path: string): string {\n if (path.startsWith(\"/\")) {\n return path.slice(1).replace(/\\//g, \".\");\n }\n return path;\n}\n\nfunction normalizeTargetPath(path: string): Patch[\"path\"] {\n const normalized = normalizePath(path);\n const withoutDataRoot = normalized.startsWith(\"data.\")\n ? normalized.slice(\"data.\".length)\n : normalized;\n return semanticPathToPatchPath(withoutDataRoot);\n}\n\nfunction resolvePathValue(\n path: string,\n snapshot: Snapshot,\n): { value: unknown; found: boolean } {\n const normalized = normalizePath(path);\n const parts = normalized.split(\".\");\n\n if (parts.length === 0) {\n return { value: undefined, found: false };\n }\n\n const root = parts[0];\n const rest = parts.slice(1);\n\n let current: unknown;\n\n switch (root) {\n case \"data\":\n current = snapshot.data;\n break;\n case \"computed\":\n current = snapshot.computed;\n break;\n case \"system\":\n current = snapshot.system;\n break;\n case \"meta\":\n current = snapshot.meta;\n break;\n default:\n current = snapshot.data;\n rest.unshift(root);\n }\n\n for (const part of rest) {\n if (current === null || current === undefined) {\n return { value: undefined, found: false };\n }\n if (typeof current !== \"object\") {\n return { value: undefined, found: false };\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return { value: current, found: current !== undefined };\n}\n\n// =============================================================================\n// Subscriber Type (internal)\n// =============================================================================\n\ninterface Subscriber<R> {\n selector: Selector<unknown, R>;\n listener: (value: R) => void;\n lastValue: R | undefined;\n initialized: boolean;\n}\n\n// =============================================================================\n// Intent ID Generation (SDK-DISPATCH-2, SDK-INV-6)\n// =============================================================================\n\nfunction generateIntentId(): string {\n return generateUUID();\n}\n","/**\n * SDK v1.0.0 Error Types\n *\n * @see SDK SPEC v1.0.0 §12\n * @see SDK-ERR-1, SDK-ERR-2, SDK-ERR-3\n * @module\n */\n\n// =============================================================================\n// Base Error\n// =============================================================================\n\n/**\n * Base error for all SDK errors.\n *\n * @see SDK-ERR-1\n */\nexport 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\n// =============================================================================\n// Reserved Effect Error\n// =============================================================================\n\n/**\n * Thrown when user effects attempt to override reserved effect types (e.g. system.get).\n *\n * @see SDK-ERR-2, SDK-INV-4\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\n// =============================================================================\n// Disposed Error\n// =============================================================================\n\n// =============================================================================\n// Compile Error\n// =============================================================================\n\n/**\n * Thrown when MEL compilation fails. Exposes full diagnostic info.\n *\n * @see SDK-ERR-4\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\n/**\n * Minimal diagnostic shape exposed by SDK.\n * Matches @manifesto-ai/compiler Diagnostic but avoids hard dependency.\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\n// =============================================================================\n// Disposed Error\n// =============================================================================\n\n/**\n * Thrown when dispatch is called on a disposed instance.\n *\n * @see SDK-ERR-3, SDK-DISPATCH-4\n */\nexport class DisposedError extends ManifestoError {\n constructor() {\n super(\"DISPOSED\", \"Cannot dispatch on a disposed ManifestoInstance\");\n this.name = \"DisposedError\";\n }\n}\n","/**\n * dispatchAsync() — Non-normative convenience utility\n *\n * Promise-based wrapper around dispatch() + on().\n * Resolves when the intent reaches a terminal state.\n *\n * @see SDK SPEC v1.0.0 §14.3\n * @module\n */\n\nimport type { Intent } from \"@manifesto-ai/core\";\nimport type { Snapshot, ManifestoInstance } from \"./types.js\";\n\n/**\n * Error thrown when an intent is rejected by a guard.\n */\nexport class DispatchRejectedError extends Error {\n readonly code = \"DISPATCH_REJECTED\";\n readonly intentId: string;\n\n constructor(intentId: string, reason?: string) {\n super(reason ?? \"Intent was rejected by guard\");\n this.name = \"DispatchRejectedError\";\n this.intentId = intentId;\n }\n}\n\n/**\n * Dispatch an intent and wait for it to complete.\n *\n * - Resolves with the terminal Snapshot on `dispatch:completed`\n * - Rejects with the error on `dispatch:failed`\n * - Rejects with DispatchRejectedError on `dispatch:rejected`\n *\n * This is a convenience utility derived entirely from `dispatch` + `on`.\n * It does NOT violate the \"one owned concept\" rule.\n *\n * @see SDK SPEC v1.0.0 §14.3\n */\nexport function dispatchAsync<T = unknown>(\n instance: ManifestoInstance<T>,\n intent: Intent,\n): Promise<Snapshot<T>> {\n const intentId = intent.intentId ?? generateId();\n const enriched: Intent = intent.intentId ? intent : { ...intent, intentId };\n\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n unsubCompleted();\n unsubFailed();\n unsubRejected();\n };\n\n const unsubCompleted = instance.on(\"dispatch:completed\", (e) => {\n if (e.intentId === intentId) {\n cleanup();\n resolve(e.snapshot);\n }\n });\n\n const unsubFailed = instance.on(\"dispatch:failed\", (e) => {\n if (e.intentId === intentId) {\n cleanup();\n reject(e.error ?? new Error(\"Dispatch failed\"));\n }\n });\n\n const unsubRejected = instance.on(\"dispatch:rejected\", (e) => {\n if (e.intentId === intentId) {\n cleanup();\n reject(new DispatchRejectedError(intentId, e.reason));\n }\n });\n\n instance.dispatch(enriched);\n });\n}\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import { semanticPathToPatchPath } from \"@manifesto-ai/core\";\nimport type { SetPatch, UnsetPatch, MergePatch } from \"@manifesto-ai/core\";\n\n// ============================================================================\n// Type-Level Path Utilities\n// ============================================================================\n\n/**\n * Depth counter for recursive type operations.\n * Prevents infinite recursion in TypeScript's type system.\n *\n * Usage: Prev[4] = 3, Prev[3] = 2, ... Prev[0] = never\n */\ntype Prev = [never, 0, 1, 2, 3, 4];\n\n/**\n * Extract all valid dot-separated paths from a data type.\n *\n * - Object keys become path segments\n * - Nested objects generate dot-separated paths (e.g. \"user.name\")\n * - Arrays, primitives, and Record<string, T> are leaf nodes\n * (Record sub-paths are not supported by Core's path resolution)\n * - Limited to 3 levels of nesting to avoid TS recursion limits\n * (root key + 3 nested levels = max 4 path segments)\n *\n * @example\n * type State = { user: { name: string; age: number }; count: number };\n * type P = DataPaths<State>;\n * // \"user\" | \"user.name\" | \"user.age\" | \"count\"\n */\nexport type DataPaths<T, D extends number = 3> = [D] extends [never]\n ? never\n : T extends Record<string, unknown>\n ? T extends unknown[]\n ? never\n : {\n [K in keyof T & string]:\n | K\n | (NonNullable<T[K]> extends Record<string, unknown>\n ? NonNullable<T[K]> extends unknown[]\n ? never\n : string extends keyof NonNullable<T[K]>\n ? never // Record<string, T> — dynamic keys not resolved by Core\n : `${K}.${DataPaths<NonNullable<T[K]>, Prev[D]>}`\n : never);\n }[keyof T & string]\n : never;\n\n/**\n * Resolve the value type at a dot-separated path.\n *\n * @example\n * type State = { user: { name: string } };\n * type V = ValueAt<State, \"user.name\">; // string\n * type U = ValueAt<State, \"user\">; // { name: string }\n */\nexport type ValueAt<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? ValueAt<NonNullable<T[K]>, Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/**\n * Paths that resolve to plain object types (valid targets for merge).\n * Arrays and primitives are excluded since merge performs shallow object merge.\n *\n * @example\n * type State = { user: { name: string }; tags: string[]; count: number };\n * type M = ObjectPaths<State>;\n * // \"user\" (tags and count excluded - not plain objects)\n */\nexport type ObjectPaths<T, D extends number = 3> = [D] extends [never]\n ? never\n : T extends Record<string, unknown>\n ? T extends unknown[]\n ? never\n : {\n [K in keyof T & string]:\n | (NonNullable<T[K]> extends Record<string, unknown>\n ? NonNullable<T[K]> extends unknown[]\n ? never\n : K\n : never)\n | (NonNullable<T[K]> extends Record<string, unknown>\n ? NonNullable<T[K]> extends unknown[]\n ? never\n : string extends keyof NonNullable<T[K]>\n ? never // Record<string, T> — don't recurse into dynamic keys\n : `${K}.${ObjectPaths<NonNullable<T[K]>, Prev[D]>}`\n : never);\n }[keyof T & string]\n : never;\n\n// ============================================================================\n// TypedOps Interface\n// ============================================================================\n\n/**\n * Type-safe patch operations builder.\n *\n * Provides IDE autocomplete for state paths and compile-time type checking\n * for patch values. All methods return standard Patch objects compatible\n * with Core's apply() function.\n * System mutation convenience APIs are intentionally excluded.\n *\n * @typeParam TData - The shape of domain state (snapshot.data)\n */\nexport interface TypedOps<TData extends Record<string, unknown>> {\n /**\n * Create a set patch — replace value at path (create if missing).\n *\n * @example\n * ops.set('count', 5);\n * ops.set('user.name', 'Alice');\n */\n set<P extends DataPaths<TData>>(path: P, value: Exclude<ValueAt<TData, P>, undefined>): SetPatch;\n\n /**\n * Create an unset patch — remove property at path.\n *\n * @example\n * ops.unset('temporaryField');\n */\n unset<P extends DataPaths<TData>>(path: P): UnsetPatch;\n\n /**\n * Create a merge patch — shallow merge at object path.\n * Only valid for paths that resolve to plain object types.\n *\n * @example\n * ops.merge('user', { name: 'Bob' });\n */\n merge<P extends ObjectPaths<TData>>(\n path: P,\n value: { [K in keyof ValueAt<TData, P>]?: Exclude<ValueAt<TData, P>[K], undefined> },\n ): MergePatch;\n\n /**\n * Raw (untyped) patch creation — escape hatch for dynamic paths\n * or platform namespace ($*) targets.\n */\n raw: {\n set(path: string, value: unknown): SetPatch;\n unset(path: string): UnsetPatch;\n merge(path: string, value: Record<string, unknown>): MergePatch;\n };\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a type-safe patch operations builder.\n *\n * Injects the domain state type to enable:\n * - IDE autocomplete on all valid state paths\n * - Compile-time type checking of patch values\n * - Merge restricted to object-typed paths\n *\n * @typeParam TData - The shape of domain state (snapshot.data)\n *\n * @example\n * type State = {\n * count: number;\n * user: { name: string; age: number };\n * tags: string[];\n * };\n *\n * const ops = defineOps<State>();\n *\n * ops.set('count', 5); // OK — value: number\n * ops.set('user.name', 'Alice'); // OK — value: string\n * ops.set('count', 'hello'); // TS error — expected number\n * ops.merge('user', { name: 'B' }); // OK — partial object merge\n * ops.unset('tags'); // OK\n *\n * // Escape hatch for dynamic / platform paths\n * ops.raw.set('$host.custom', { key: 'value' });\n */\nexport function defineOps<\n TData extends Record<string, unknown>,\n>(): TypedOps<TData> {\n const toPatchPath = (path: string) => semanticPathToPatchPath(path);\n\n return {\n set(path: string, value: unknown): SetPatch {\n return { op: \"set\", path: toPatchPath(path), value };\n },\n unset(path: string): UnsetPatch {\n return { op: \"unset\", path: toPatchPath(path) };\n },\n merge(path: string, value: unknown): MergePatch {\n return { op: \"merge\", path: toPatchPath(path), value: value as Record<string, unknown> };\n },\n raw: {\n set(path: string, value: unknown): SetPatch {\n return { op: \"set\", path: toPatchPath(path), value };\n },\n unset(path: string): UnsetPatch {\n return { op: \"unset\", path: toPatchPath(path) };\n },\n merge(path: string, value: Record<string, unknown>): MergePatch {\n return { op: \"merge\", path: toPatchPath(path), value };\n },\n },\n };\n}\n","/**\n * @manifesto-ai/sdk v2.0.0\n *\n * Protocol-first SDK — thin composition layer over the Manifesto protocol stack.\n * The SDK owns one concept: createManifesto() and exposes only a narrow\n * pass-through World surface for callers that opt into explicit governed\n * composition.\n *\n * @see sdk-SPEC-v2.0.0.md\n * @see ADR-010\n * @packageDocumentation\n */\n\nexport type { SdkManifest } from \"./manifest.js\";\n\n// =============================================================================\n// SDK-Owned Exports\n// =============================================================================\n\nexport { createManifesto } from \"./create-manifesto.js\";\nexport { dispatchAsync, DispatchRejectedError } from \"./dispatch-async.js\";\n\nexport type {\n Snapshot,\n ManifestoInstance,\n ManifestoConfig,\n ManifestoEvent,\n ManifestoEventMap,\n ManifestoEventPayload,\n EffectContext,\n EffectHandler,\n Selector,\n Unsubscribe,\n} from \"./types.js\";\n\nexport {\n ManifestoError,\n ReservedEffectError,\n DisposedError,\n CompileError,\n} from \"./errors.js\";\n\nexport type { CompileDiagnostic } from \"./errors.js\";\n\n// =============================================================================\n// Typed Patch Operations (SDK-owned utility)\n// =============================================================================\n\nexport { defineOps } from \"./typed-ops.js\";\nexport type { TypedOps, DataPaths, ValueAt, ObjectPaths } from \"./typed-ops.js\";\n\n// =============================================================================\n// Protocol Re-exports — @manifesto-ai/core (SDK-REEXPORT-1)\n// =============================================================================\n\nexport type {\n DomainSchema,\n Snapshot as CoreSnapshot,\n Patch,\n SetPatch,\n UnsetPatch,\n MergePatch,\n Intent,\n ComputeResult,\n Requirement,\n ErrorValue,\n TraceGraph,\n} from \"@manifesto-ai/core\";\n\nexport { createIntent, createSnapshot, createCore } from \"@manifesto-ai/core\";\n\n// =============================================================================\n// Protocol Re-exports — @manifesto-ai/host (SDK-REEXPORT-1)\n// =============================================================================\n\nexport type { HostResult, HostOptions } from \"@manifesto-ai/host\";\n\n// =============================================================================\n// Protocol Re-exports — @manifesto-ai/world (SDK-REEXPORT-1)\n// =============================================================================\n\nexport type {\n CoordinatorSealGenesisParams,\n CoordinatorSealNextParams,\n ExecuteApprovedProposalInput,\n GovernedWorldStore,\n GovernanceEventDispatcher,\n RecoveredWorldRuntimeCompletion,\n ResumeExecutingProposalInput,\n SealResult,\n SealedWorldRuntimeCompletion,\n WorldStoreTransaction,\n WorldConfig,\n WorldCoordinator,\n WorldExecutionOptions,\n WorldExecutionResult,\n WorldExecutor,\n WorldInstance,\n WorldRuntimeCompletion,\n WorldRuntime,\n} from \"@manifesto-ai/world\";\nexport { createWorld } from \"@manifesto-ai/world\";\n"],"mappings":"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","names":["patches","semanticPathToPatchPath"]}
|
|
1
|
+
{"version":3,"sources":["../src/create-manifesto.ts","../src/index.ts"],"sourcesContent":["import {\n type EffectContext as HostEffectContext,\n type EffectHandler as HostEffectHandler,\n type ManifestoHost,\n createHost,\n} from \"@manifesto-ai/host\";\nimport {\n createIntent as createCoreIntent,\n extractDefaults,\n hashSchemaSync,\n semanticPathToPatchPath,\n type DomainSchema,\n type Intent,\n type Patch,\n} from \"@manifesto-ai/core\";\nimport {\n compileMelDomain,\n parse as parseMel,\n tokenize as tokenizeMel,\n} from \"@manifesto-ai/compiler\";\n\nimport {\n ACTION_PARAM_NAMES,\n attachRuntimeKernelFactory,\n createBaseRuntimeInstance,\n createRuntimeKernel,\n} from \"./internal.js\";\nimport {\n type BaseLaws,\n type ComposableManifesto,\n type EffectHandler,\n type ManifestoDomainShape,\n type Snapshot,\n type TypedActionRef,\n type TypedMEL,\n} from \"./types.js\";\nimport {\n AlreadyActivatedError,\n CompileError,\n ManifestoError,\n ReservedEffectError,\n} from \"./errors.js\";\n\nconst RESERVED_EFFECT_TYPE = \"system.get\";\nconst RESERVED_NAMESPACE_PREFIX = \"system.\";\nconst BASE_LAWS: BaseLaws = Object.freeze({ __baseLaws: true });\n\ntype RuntimeActionRef = TypedActionRef<ManifestoDomainShape> & {\n readonly [ACTION_PARAM_NAMES]: readonly string[] | null;\n};\n\ntype ActionParamMetadata = readonly string[] | null;\n\ntype ResolvedSchema = {\n readonly schema: DomainSchema;\n readonly actionParamMetadata: Readonly<Record<string, ActionParamMetadata>>;\n};\n\nexport function createManifesto<T extends ManifestoDomainShape>(\n schemaInput: DomainSchema | string,\n effects: Record<string, EffectHandler>,\n): ComposableManifesto<T, BaseLaws> {\n if (RESERVED_EFFECT_TYPE in effects) {\n throw new ReservedEffectError(RESERVED_EFFECT_TYPE);\n }\n\n const resolved = resolveSchema(schemaInput);\n validateReservedNamespaces(resolved.schema);\n\n let activated = false;\n const manifesto = {\n _laws: BASE_LAWS,\n schema: resolved.schema,\n activate() {\n if (activated) {\n throw new AlreadyActivatedError();\n }\n activated = true;\n return createBaseRuntimeInstance(\n createRuntimeKernel<T>({\n schema: resolved.schema,\n host: createInternalHost(resolved.schema, effects),\n MEL: buildTypedMel<T>(resolved.schema, resolved.actionParamMetadata),\n createIntent: buildCreateIntent<T>(),\n }),\n );\n },\n };\n\n return attachRuntimeKernelFactory(manifesto, () =>\n createRuntimeKernel<T>({\n schema: resolved.schema,\n host: createInternalHost(resolved.schema, effects),\n MEL: buildTypedMel<T>(resolved.schema, resolved.actionParamMetadata),\n createIntent: buildCreateIntent<T>(),\n }),\n );\n}\n\nfunction resolveSchema(schema: DomainSchema | string): ResolvedSchema {\n const resolved = typeof schema === \"string\"\n ? compileSchema(schema)\n : {\n schema,\n actionParamMetadata: deriveActionParamMetadata(schema),\n };\n\n return {\n schema: withPlatformNamespaces(resolved.schema),\n actionParamMetadata: resolved.actionParamMetadata,\n };\n}\n\nfunction compileSchema(source: string): ResolvedSchema {\n const result = compileMelDomain(source, { mode: \"domain\" });\n\n if (result.errors.length > 0) {\n const formatted = result.errors.map((diagnostic) => {\n const loc = diagnostic.location;\n if (!loc || (loc.start.line === 0 && loc.start.column === 0)) {\n return `[${diagnostic.code}] ${diagnostic.message}`;\n }\n\n const header = `[${diagnostic.code}] ${diagnostic.message} (${loc.start.line}:${loc.start.column})`;\n const line = source.split(\"\\n\")[loc.start.line - 1];\n if (!line) {\n return header;\n }\n\n const lineNum = String(loc.start.line).padStart(4, \" \");\n const underlineLen = Math.max(\n 1,\n loc.end.line === loc.start.line\n ? Math.min(loc.end.column - loc.start.column, Math.max(1, line.length - loc.start.column + 1))\n : 1,\n );\n const padding = \" \".repeat(lineNum.length + 3 + loc.start.column - 1);\n return `${header}\\n${lineNum} | ${line}\\n${padding}${\"^\".repeat(underlineLen)}`;\n }).join(\"\\n\\n\");\n\n throw new CompileError(result.errors, `MEL compilation failed:\\n${formatted}`);\n }\n\n if (!result.schema) {\n throw new ManifestoError(\"COMPILE_ERROR\", \"MEL compilation produced no schema\");\n }\n\n const schema = result.schema as DomainSchema;\n return {\n schema,\n actionParamMetadata: deriveActionParamMetadata(\n schema,\n extractActionParamOrderFromMel(source),\n ),\n };\n}\n\nfunction withPlatformNamespaces(schema: DomainSchema): DomainSchema {\n const fields = { ...schema.state.fields };\n let changed = false;\n\n if (!fields.$host) {\n fields.$host = {\n type: \"object\",\n required: false,\n default: {},\n };\n changed = true;\n } else if (fields.$host.type !== \"object\") {\n throw new ManifestoError(\"SCHEMA_ERROR\", \"Reserved namespace '$host' must be an object field\");\n } else if (fields.$host.default === undefined) {\n fields.$host = { ...fields.$host, default: {} };\n changed = true;\n }\n\n if (!fields.$mel) {\n fields.$mel = {\n type: \"object\",\n required: false,\n default: { guards: { intent: {} } },\n fields: {\n guards: {\n type: \"object\",\n required: false,\n default: { intent: {} },\n fields: {\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n },\n },\n };\n changed = true;\n } else if (fields.$mel.type !== \"object\") {\n throw new ManifestoError(\"SCHEMA_ERROR\", \"Reserved namespace '$mel' must be an object field\");\n } else {\n let nextMel = fields.$mel;\n if (nextMel.default === undefined) {\n nextMel = { ...nextMel, default: { guards: { intent: {} } } };\n changed = true;\n }\n\n const melFields = nextMel.fields ?? {};\n const guardsField = melFields.guards;\n\n if (!guardsField) {\n nextMel = {\n ...nextMel,\n fields: {\n ...melFields,\n guards: {\n type: \"object\",\n required: false,\n default: { intent: {} },\n fields: {\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n },\n },\n };\n changed = true;\n } else if (guardsField.type !== \"object\") {\n throw new ManifestoError(\"SCHEMA_ERROR\", \"Reserved namespace '$mel.guards' must be an object field\");\n } else {\n let nextGuards = guardsField;\n if (nextGuards.default === undefined) {\n nextGuards = { ...nextGuards, default: { intent: {} } };\n changed = true;\n }\n\n const guardFields = nextGuards.fields ?? {};\n const intentField = guardFields.intent;\n\n if (!intentField) {\n nextGuards = {\n ...nextGuards,\n fields: {\n ...guardFields,\n intent: {\n type: \"object\",\n required: false,\n default: {},\n },\n },\n };\n changed = true;\n } else if (intentField.type !== \"object\") {\n throw new ManifestoError(\"SCHEMA_ERROR\", \"Reserved namespace '$mel.guards.intent' must be an object field\");\n } else if (intentField.default === undefined) {\n nextGuards = {\n ...nextGuards,\n fields: {\n ...guardFields,\n intent: { ...intentField, default: {} },\n },\n };\n changed = true;\n }\n\n if (nextGuards !== guardsField) {\n nextMel = {\n ...nextMel,\n fields: {\n ...melFields,\n guards: nextGuards,\n },\n };\n }\n }\n\n if (nextMel !== fields.$mel) {\n fields.$mel = nextMel;\n }\n }\n\n if (!changed) {\n return schema;\n }\n\n const nextSchema = {\n ...schema,\n state: {\n ...schema.state,\n fields,\n },\n };\n\n const { hash: _hash, ...schemaWithoutHash } = nextSchema;\n return {\n ...nextSchema,\n hash: hashSchemaSync(schemaWithoutHash),\n };\n}\n\nfunction validateReservedNamespaces(schema: DomainSchema): void {\n for (const actionType of Object.keys(schema.actions ?? {})) {\n if (actionType.startsWith(RESERVED_NAMESPACE_PREFIX)) {\n throw new ManifestoError(\n \"RESERVED_NAMESPACE\",\n `Action type \"${actionType}\" uses reserved namespace prefix \"${RESERVED_NAMESPACE_PREFIX}\"`,\n );\n }\n }\n}\n\nfunction buildTypedMel<T extends ManifestoDomainShape>(\n schema: DomainSchema,\n actionParamMetadata: Readonly<Record<string, ActionParamMetadata>>,\n): TypedMEL<T> {\n const actions = Object.fromEntries(\n Object.keys(schema.actions).map((name) => {\n const ref: Record<PropertyKey, unknown> = {\n __kind: \"ActionRef\",\n name,\n };\n Object.defineProperty(ref, ACTION_PARAM_NAMES, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: Object.hasOwn(actionParamMetadata, name)\n ? actionParamMetadata[name]\n : [],\n });\n return [name, Object.freeze(ref)];\n }),\n );\n\n const state = Object.fromEntries(\n Object.keys(schema.state.fields)\n .filter((name) => !name.startsWith(\"$\"))\n .map((name) => [name, Object.freeze({\n __kind: \"FieldRef\",\n path: name,\n })]),\n );\n\n const computed = Object.fromEntries(\n Object.keys(schema.computed.fields)\n .map((name) => [name, Object.freeze({\n __kind: \"ComputedRef\",\n path: name,\n })]),\n );\n\n return Object.freeze({\n actions: Object.freeze(actions),\n state: Object.freeze(state),\n computed: Object.freeze(computed),\n }) as unknown as TypedMEL<T>;\n}\n\nfunction buildCreateIntent<T extends ManifestoDomainShape>(): (\n action: TypedActionRef<T, keyof T[\"actions\"]>,\n ...args: unknown[]\n) => Intent {\n return (action, ...args) => {\n const actionRef = action as unknown as RuntimeActionRef;\n const intentId = generateUUID();\n const input = packIntentInput(actionRef, args);\n return createCoreIntent(\n String(action.name),\n input,\n intentId,\n );\n };\n}\n\nfunction getActionParamNames(input: DomainSchema[\"actions\"][string][\"input\"]): readonly string[] {\n if (!input || input.type !== \"object\" || !input.fields) {\n return [];\n }\n\n return Object.keys(input.fields);\n}\n\nfunction deriveActionParamMetadata(\n schema: DomainSchema,\n actionParamOrder?: Readonly<Record<string, readonly string[]>>,\n): Readonly<Record<string, ActionParamMetadata>> {\n return Object.freeze(Object.fromEntries(\n Object.entries(schema.actions).map(([name, action]) => {\n const preferredOrder = actionParamOrder?.[name];\n if (preferredOrder && preferredOrder.length > 0) {\n return [name, Object.freeze([...preferredOrder])];\n }\n\n if (!action.input || action.input.type !== \"object\" || !action.input.fields) {\n return [name, []];\n }\n\n const fieldNames = getActionParamNames(action.input);\n return [name, fieldNames.length <= 1 ? fieldNames : null];\n }),\n ));\n}\n\nfunction extractActionParamOrderFromMel(\n source: string,\n): Readonly<Record<string, readonly string[]>> | undefined {\n const lexed = tokenizeMel(source);\n if (lexed.diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) {\n return undefined;\n }\n\n const parsed = parseMel(lexed.tokens);\n if (!parsed.program) {\n return undefined;\n }\n\n return Object.freeze(Object.fromEntries(\n parsed.program.domain.members\n .filter((member) => member.kind === \"action\")\n .map((action) => [action.name, Object.freeze(action.params.map((param) => param.name))]),\n ));\n}\n\nfunction packIntentInput(action: RuntimeActionRef, args: readonly unknown[]): unknown {\n const paramNames = Object.hasOwn(action, ACTION_PARAM_NAMES)\n ? action[ACTION_PARAM_NAMES]\n : [];\n if (args.length === 0) {\n return undefined;\n }\n\n if (paramNames === null) {\n if (args.length === 1 && isPlainObject(args[0])) {\n return args[0];\n }\n\n throw new ManifestoError(\n \"INVALID_INTENT_ARGS\",\n `Action \"${String(action.name)}\" requires a single object argument because positional parameter metadata is unavailable`,\n );\n }\n\n if (paramNames.length === 0) {\n if (args.length === 1) {\n return args[0];\n }\n\n throw new ManifestoError(\n \"INVALID_INTENT_ARGS\",\n `Action \"${String(action.name)}\" does not accept multiple positional arguments`,\n );\n }\n\n if (args.length === 1 && isPlainObject(args[0]) && paramNames.length > 1) {\n return args[0];\n }\n\n return Object.fromEntries(args.map((value, index) => [\n paramNames[index] ?? `arg${index}`,\n value,\n ]));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createInternalHost(\n schema: DomainSchema,\n effects: Record<string, EffectHandler>,\n): ManifestoHost {\n const host = createHost(schema, {\n initialData: extractDefaults(schema.state),\n });\n\n host.registerEffect(RESERVED_EFFECT_TYPE, async (\n _type: string,\n params: Record<string, unknown>,\n ctx: HostEffectContext,\n ): Promise<Patch[]> => {\n const { patches } = executeSystemGet(params, ctx.snapshot as Snapshot);\n return patches;\n });\n\n for (const [effectType, appHandler] of Object.entries(effects)) {\n const hostHandler: HostEffectHandler = async (\n _type: string,\n params: Record<string, unknown>,\n ctx: HostEffectContext,\n ): Promise<Patch[]> => {\n const patches = await appHandler(params, { snapshot: freezeSnapshot(ctx.snapshot) });\n return patches as Patch[];\n };\n\n host.registerEffect(effectType, hostHandler);\n }\n\n return host;\n}\n\ninterface SystemGetReadParams {\n path: string;\n target?: string;\n}\n\ninterface SystemGetGenerateParams {\n key: string;\n into: string;\n}\n\nfunction isGenerateParams(params: unknown): params is SystemGetGenerateParams {\n return (\n typeof params === \"object\" &&\n params !== null &&\n \"key\" in params &&\n \"into\" in params\n );\n}\n\nfunction executeSystemGet(\n params: unknown,\n snapshot: Snapshot,\n): { patches: Patch[] } {\n if (isGenerateParams(params)) {\n return {\n patches: [{\n op: \"set\",\n path: normalizeTargetPath(params.into),\n value: generateSystemValue(params.key),\n }],\n };\n }\n\n const { path, target } = params as SystemGetReadParams;\n const result = resolvePathValue(path, snapshot);\n if (!target) {\n return { patches: [] };\n }\n\n return {\n patches: [{\n op: \"set\",\n path: normalizeTargetPath(target),\n value: result.value,\n }],\n };\n}\n\nfunction generateSystemValue(key: string): unknown {\n switch (key) {\n case \"uuid\":\n return generateUUID();\n case \"timestamp\":\n case \"time.now\":\n return Date.now();\n case \"isoTimestamp\":\n return new Date().toISOString();\n default:\n return null;\n }\n}\n\nfunction normalizeTargetPath(path: string): Patch[\"path\"] {\n const normalized = normalizePath(path);\n const withoutDataRoot = normalized.startsWith(\"data.\")\n ? normalized.slice(\"data.\".length)\n : normalized;\n return semanticPathToPatchPath(withoutDataRoot);\n}\n\nfunction normalizePath(path: string): string {\n if (path.startsWith(\"/\")) {\n return path.slice(1).replace(/\\//g, \".\");\n }\n return path;\n}\n\nfunction resolvePathValue(\n path: string,\n snapshot: Snapshot,\n): { value: unknown; found: boolean } {\n const normalized = normalizePath(path);\n const parts = normalized.split(\".\");\n if (parts.length === 0) {\n return { value: undefined, found: false };\n }\n\n const [root, ...rest] = parts;\n let current: unknown;\n\n switch (root) {\n case \"data\":\n current = snapshot.data;\n break;\n case \"computed\":\n current = snapshot.computed;\n break;\n case \"system\":\n current = snapshot.system;\n break;\n case \"meta\":\n current = snapshot.meta;\n break;\n default:\n current = snapshot.data;\n rest.unshift(root);\n break;\n }\n\n for (const part of rest) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return { value: undefined, found: false };\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return { value: current, found: current !== undefined };\n}\n\nfunction freezeSnapshot<TData = unknown>(snapshot: Snapshot<TData>): Snapshot<TData> {\n return Object.freeze(structuredClone(snapshot)) as Snapshot<TData>;\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","/**\n * @manifesto-ai/sdk v3.0.0\n *\n * SDK hard cut around the activation boundary.\n *\n * @see sdk-SPEC-v3.0.0-draft.md\n * @see ADR-017\n * @packageDocumentation\n */\n\nexport type { SdkManifest } from \"./manifest.js\";\n\nexport { createManifesto } from \"./create-manifesto.js\";\n\nexport type {\n ActivatedInstance,\n ActionArgs,\n BaseLaws,\n ComposableManifesto,\n ComputedRef,\n EffectContext,\n EffectHandler,\n FieldRef,\n GovernanceInstance,\n GovernanceLaws,\n LineageInstance,\n LineageLaws,\n ManifestoBaseInstance,\n ManifestoDomainShape,\n ManifestoEvent,\n ManifestoEventMap,\n ManifestoEventPayload,\n Selector,\n Snapshot,\n TypedActionRef,\n TypedCreateIntent,\n TypedDispatchAsync,\n TypedMEL,\n TypedOn,\n TypedSubscribe,\n Unsubscribe,\n} from \"./types.js\";\n\nexport {\n AlreadyActivatedError,\n CompileError,\n DisposedError,\n ManifestoError,\n ReservedEffectError,\n} from \"./errors.js\";\n\nexport type { CompileDiagnostic } from \"./errors.js\";\n\nexport type {\n DomainSchema,\n Intent,\n Patch,\n Snapshot as CoreSnapshot,\n} from \"@manifesto-ai/core\";\n\nexport { createSnapshot } from \"@manifesto-ai/core\";\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DomainSchema, Snapshot as Snapshot$1, Intent } from '@manifesto-ai/core';
|
|
2
|
+
import { HostResult, ManifestoHost } from '@manifesto-ai/host';
|
|
3
|
+
import { M as ManifestoDomainShape, m as TypedMEL, k as TypedCreateIntent, o as TypedSubscribe, n as TypedOn, j as Snapshot, g as ManifestoEvent, h as ManifestoEventMap, B as BaseLaws, C as ComposableManifesto, f as ManifestoBaseInstance } from './types-oXciBlAp.js';
|
|
4
|
+
|
|
5
|
+
declare const ACTION_PARAM_NAMES: unique symbol;
|
|
6
|
+
declare const RUNTIME_KERNEL_FACTORY: unique symbol;
|
|
7
|
+
interface RuntimeKernel<T extends ManifestoDomainShape> {
|
|
8
|
+
readonly schema: DomainSchema;
|
|
9
|
+
readonly MEL: TypedMEL<T>;
|
|
10
|
+
readonly createIntent: TypedCreateIntent<T>;
|
|
11
|
+
readonly subscribe: TypedSubscribe<T>;
|
|
12
|
+
readonly on: TypedOn<T>;
|
|
13
|
+
readonly getSnapshot: () => Snapshot<T["state"]>;
|
|
14
|
+
readonly getAvailableActions: () => readonly (keyof T["actions"])[];
|
|
15
|
+
readonly isActionAvailable: (name: keyof T["actions"]) => boolean;
|
|
16
|
+
readonly dispose: () => void;
|
|
17
|
+
readonly isDisposed: () => boolean;
|
|
18
|
+
readonly getVisibleCoreSnapshot: () => Snapshot$1;
|
|
19
|
+
readonly setVisibleSnapshot: (snapshot: Snapshot$1, options?: {
|
|
20
|
+
readonly notify?: boolean;
|
|
21
|
+
}) => Snapshot<T["state"]>;
|
|
22
|
+
readonly restoreVisibleSnapshot: () => void;
|
|
23
|
+
readonly emitEvent: <K extends ManifestoEvent>(event: K, payload: ManifestoEventMap<T>[K]) => void;
|
|
24
|
+
readonly enqueue: <R>(task: () => Promise<R>) => Promise<R>;
|
|
25
|
+
readonly ensureIntentId: (intent: Intent) => Intent;
|
|
26
|
+
readonly executeHost: (intent: Intent) => Promise<HostResult>;
|
|
27
|
+
readonly rejectUnavailable: (intent: Intent) => never;
|
|
28
|
+
}
|
|
29
|
+
type RuntimeKernelFactory<T extends ManifestoDomainShape> = () => RuntimeKernel<T>;
|
|
30
|
+
type InternalComposableManifesto<T extends ManifestoDomainShape, Laws extends BaseLaws> = ComposableManifesto<T, Laws> & {
|
|
31
|
+
readonly [RUNTIME_KERNEL_FACTORY]: RuntimeKernelFactory<T>;
|
|
32
|
+
};
|
|
33
|
+
type RuntimeKernelOptions<T extends ManifestoDomainShape> = {
|
|
34
|
+
readonly schema: DomainSchema;
|
|
35
|
+
readonly host: ManifestoHost;
|
|
36
|
+
readonly MEL: TypedMEL<T>;
|
|
37
|
+
readonly createIntent: TypedCreateIntent<T>;
|
|
38
|
+
};
|
|
39
|
+
declare function attachRuntimeKernelFactory<T extends ManifestoDomainShape, Laws extends BaseLaws>(manifesto: ComposableManifesto<T, Laws>, factory: RuntimeKernelFactory<T>): InternalComposableManifesto<T, Laws>;
|
|
40
|
+
declare function getRuntimeKernelFactory<T extends ManifestoDomainShape, Laws extends BaseLaws>(manifesto: ComposableManifesto<T, Laws>): RuntimeKernelFactory<T>;
|
|
41
|
+
declare function createRuntimeKernel<T extends ManifestoDomainShape>({ schema, host, MEL, createIntent, }: RuntimeKernelOptions<T>): RuntimeKernel<T>;
|
|
42
|
+
declare function createBaseRuntimeInstance<T extends ManifestoDomainShape>(kernel: RuntimeKernel<T>): ManifestoBaseInstance<T>;
|
|
43
|
+
|
|
44
|
+
export { ACTION_PARAM_NAMES, type InternalComposableManifesto, RUNTIME_KERNEL_FACTORY, type RuntimeKernel, type RuntimeKernelFactory, attachRuntimeKernelFactory, createBaseRuntimeInstance, createRuntimeKernel, getRuntimeKernelFactory };
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ACTION_PARAM_NAMES,
|
|
3
|
+
RUNTIME_KERNEL_FACTORY,
|
|
4
|
+
attachRuntimeKernelFactory,
|
|
5
|
+
createBaseRuntimeInstance,
|
|
6
|
+
createRuntimeKernel,
|
|
7
|
+
getRuntimeKernelFactory
|
|
8
|
+
} from "./chunk-CMZQTFX2.js";
|
|
9
|
+
export {
|
|
10
|
+
ACTION_PARAM_NAMES,
|
|
11
|
+
RUNTIME_KERNEL_FACTORY,
|
|
12
|
+
attachRuntimeKernelFactory,
|
|
13
|
+
createBaseRuntimeInstance,
|
|
14
|
+
createRuntimeKernel,
|
|
15
|
+
getRuntimeKernelFactory
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Snapshot as Snapshot$1, Patch, DomainSchema, Intent } from '@manifesto-ai/core';
|
|
2
|
+
|
|
3
|
+
type ManifestoDomainShape = {
|
|
4
|
+
readonly actions: Record<string, (...args: unknown[]) => unknown>;
|
|
5
|
+
readonly state: Record<string, unknown>;
|
|
6
|
+
readonly computed: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
type BaseLaws = {
|
|
9
|
+
readonly __baseLaws: true;
|
|
10
|
+
};
|
|
11
|
+
type LineageLaws = {
|
|
12
|
+
readonly __lineageLaws: true;
|
|
13
|
+
};
|
|
14
|
+
type GovernanceLaws = {
|
|
15
|
+
readonly __governanceLaws: true;
|
|
16
|
+
};
|
|
17
|
+
type Snapshot<T = unknown> = Omit<Snapshot$1, "data"> & {
|
|
18
|
+
data: T;
|
|
19
|
+
};
|
|
20
|
+
type EffectContext<T = unknown> = {
|
|
21
|
+
readonly snapshot: Readonly<Snapshot<T>>;
|
|
22
|
+
};
|
|
23
|
+
type EffectHandler = (params: unknown, ctx: EffectContext) => Promise<readonly Patch[]>;
|
|
24
|
+
type TypedActionRef<T extends ManifestoDomainShape, K extends keyof T["actions"] = keyof T["actions"]> = {
|
|
25
|
+
readonly __kind: "ActionRef";
|
|
26
|
+
readonly name: K;
|
|
27
|
+
};
|
|
28
|
+
type FieldRef<TValue> = {
|
|
29
|
+
readonly __kind: "FieldRef";
|
|
30
|
+
readonly _type?: TValue;
|
|
31
|
+
};
|
|
32
|
+
type ComputedRef<TValue> = {
|
|
33
|
+
readonly __kind: "ComputedRef";
|
|
34
|
+
readonly _type?: TValue;
|
|
35
|
+
};
|
|
36
|
+
type TypedMEL<T extends ManifestoDomainShape> = {
|
|
37
|
+
readonly actions: {
|
|
38
|
+
readonly [K in keyof T["actions"]]: TypedActionRef<T, K>;
|
|
39
|
+
};
|
|
40
|
+
readonly state: {
|
|
41
|
+
readonly [K in keyof T["state"]]: FieldRef<T["state"][K]>;
|
|
42
|
+
};
|
|
43
|
+
readonly computed: {
|
|
44
|
+
readonly [K in keyof T["computed"]]: ComputedRef<T["computed"][K]>;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
type ActionArgs<T extends ManifestoDomainShape, K extends keyof T["actions"]> = T["actions"][K] extends (...args: infer P) => unknown ? P : never;
|
|
48
|
+
type Selector<T, R> = (snapshot: Snapshot<T>) => R;
|
|
49
|
+
type Unsubscribe = () => void;
|
|
50
|
+
type TypedCreateIntent<T extends ManifestoDomainShape> = <K extends keyof T["actions"]>(action: TypedActionRef<T, K>, ...args: ActionArgs<T, K>) => Intent;
|
|
51
|
+
type TypedDispatchAsync<T extends ManifestoDomainShape> = (intent: Intent) => Promise<Snapshot<T["state"]>>;
|
|
52
|
+
type TypedSubscribe<T extends ManifestoDomainShape> = <R>(selector: Selector<T["state"], R>, listener: (value: R) => void) => Unsubscribe;
|
|
53
|
+
interface ManifestoEventMap<T extends ManifestoDomainShape> {
|
|
54
|
+
"dispatch:completed": {
|
|
55
|
+
readonly intentId: string;
|
|
56
|
+
readonly intent: Intent;
|
|
57
|
+
readonly snapshot: Snapshot<T["state"]>;
|
|
58
|
+
};
|
|
59
|
+
"dispatch:rejected": {
|
|
60
|
+
readonly intentId: string;
|
|
61
|
+
readonly intent: Intent;
|
|
62
|
+
readonly reason: string;
|
|
63
|
+
};
|
|
64
|
+
"dispatch:failed": {
|
|
65
|
+
readonly intentId: string;
|
|
66
|
+
readonly intent: Intent;
|
|
67
|
+
readonly error: Error;
|
|
68
|
+
readonly snapshot?: Snapshot<T["state"]>;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
type ManifestoEvent = "dispatch:completed" | "dispatch:rejected" | "dispatch:failed";
|
|
72
|
+
type ManifestoEventPayload<T extends ManifestoDomainShape> = ManifestoEventMap<T>[ManifestoEvent];
|
|
73
|
+
type TypedOn<T extends ManifestoDomainShape> = <K extends ManifestoEvent>(event: K, handler: (payload: ManifestoEventMap<T>[K]) => void) => Unsubscribe;
|
|
74
|
+
type ManifestoBaseInstance<T extends ManifestoDomainShape> = {
|
|
75
|
+
readonly createIntent: TypedCreateIntent<T>;
|
|
76
|
+
readonly dispatchAsync: TypedDispatchAsync<T>;
|
|
77
|
+
readonly subscribe: TypedSubscribe<T>;
|
|
78
|
+
readonly on: TypedOn<T>;
|
|
79
|
+
readonly getSnapshot: () => Snapshot<T["state"]>;
|
|
80
|
+
readonly getAvailableActions: () => readonly (keyof T["actions"])[];
|
|
81
|
+
readonly isActionAvailable: (name: keyof T["actions"]) => boolean;
|
|
82
|
+
readonly MEL: TypedMEL<T>;
|
|
83
|
+
readonly schema: DomainSchema;
|
|
84
|
+
readonly dispose: () => void;
|
|
85
|
+
};
|
|
86
|
+
type LineageInstance<T extends ManifestoDomainShape> = ManifestoBaseInstance<T> & {
|
|
87
|
+
readonly __lineageBrand?: true;
|
|
88
|
+
};
|
|
89
|
+
type GovernanceInstance<T extends ManifestoDomainShape> = Omit<LineageInstance<T>, "dispatchAsync"> & {
|
|
90
|
+
readonly __governanceBrand?: true;
|
|
91
|
+
};
|
|
92
|
+
type ActivatedInstance<T extends ManifestoDomainShape, Laws> = Laws extends GovernanceLaws ? GovernanceInstance<T> : Laws extends LineageLaws ? LineageInstance<T> : ManifestoBaseInstance<T>;
|
|
93
|
+
type ComposableManifesto<T extends ManifestoDomainShape, Laws extends BaseLaws = BaseLaws> = {
|
|
94
|
+
readonly _laws: Laws;
|
|
95
|
+
readonly schema: DomainSchema;
|
|
96
|
+
activate(): ActivatedInstance<T, Laws>;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export type { ActivatedInstance as A, BaseLaws as B, ComposableManifesto as C, EffectHandler as E, FieldRef as F, GovernanceInstance as G, LineageInstance as L, ManifestoDomainShape as M, Selector as S, TypedActionRef as T, Unsubscribe as U, ActionArgs as a, ComputedRef as b, EffectContext as c, GovernanceLaws as d, LineageLaws as e, ManifestoBaseInstance as f, ManifestoEvent as g, ManifestoEventMap as h, ManifestoEventPayload as i, Snapshot as j, TypedCreateIntent as k, TypedDispatchAsync as l, TypedMEL as m, TypedOn as n, TypedSubscribe as o };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifesto-ai/sdk",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Manifesto SDK -
|
|
3
|
+
"version": "3.1.0",
|
|
4
|
+
"description": "Manifesto SDK - Activation-first public API for the base runtime",
|
|
5
5
|
"author": "eggplantiny <eggplantiny@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -29,21 +29,24 @@
|
|
|
29
29
|
".": {
|
|
30
30
|
"types": "./dist/index.d.ts",
|
|
31
31
|
"import": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./internal": {
|
|
34
|
+
"types": "./dist/internal.d.ts",
|
|
35
|
+
"import": "./dist/internal.js"
|
|
32
36
|
}
|
|
33
37
|
},
|
|
34
38
|
"files": [
|
|
35
39
|
"dist"
|
|
36
40
|
],
|
|
37
41
|
"dependencies": {
|
|
38
|
-
"@manifesto-ai/
|
|
39
|
-
"@manifesto-ai/
|
|
40
|
-
"@manifesto-ai/
|
|
41
|
-
"@manifesto-ai/compiler": "1.9.0"
|
|
42
|
+
"@manifesto-ai/compiler": "1.9.0",
|
|
43
|
+
"@manifesto-ai/host": "2.5.0",
|
|
44
|
+
"@manifesto-ai/core": "2.8.0"
|
|
42
45
|
},
|
|
43
46
|
"devDependencies": {
|
|
44
47
|
"typescript": "^5.9.3",
|
|
45
|
-
"vite": "^
|
|
46
|
-
"vitest": "^4.1.
|
|
48
|
+
"vite": "^8.0.3",
|
|
49
|
+
"vitest": "^4.1.2"
|
|
47
50
|
},
|
|
48
51
|
"scripts": {
|
|
49
52
|
"build": "tsup",
|