@almadar/runtime 6.30.0 → 6.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{OrbitalServerRuntime-BkaBvI6-.d.ts → OrbitalServerRuntime-DpAwIrmv.d.ts} +13 -2
- package/dist/OrbitalServerRuntime.d.ts +1 -1
- package/dist/OrbitalServerRuntime.js +5 -7
- package/dist/ServerBridge.js +1 -3
- package/dist/{chunk-PZ5AY32C.js → chunk-MLKGABMK.js} +0 -2
- package/dist/{chunk-U4PL237A.js → chunk-OU3ITB5S.js} +0 -2
- package/dist/{chunk-TGL6XC6E.js → chunk-YFH577FH.js} +3 -5
- package/dist/{createAgentSubstrateHandlers-RUX4RFC6.js → createAgentSubstrateHandlers-G6KSTJPA.js} +1 -3
- package/dist/createOsHandlers.js +2 -4
- package/dist/{external-loader-C2LO5XG3.js → external-loader-OPXVTNC4.js} +1 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -6
- package/package.json +7 -7
- package/dist/OrbitalServerRuntime.js.map +0 -1
- package/dist/ServerBridge.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- package/dist/chunk-TGL6XC6E.js.map +0 -1
- package/dist/chunk-U4PL237A.js.map +0 -1
- package/dist/createAgentSubstrateHandlers-RUX4RFC6.js.map +0 -1
- package/dist/createOsHandlers.js.map +0 -1
- package/dist/external-loader-C2LO5XG3.js.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cron.ts"],"names":[],"mappings":"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","file":"chunk-U4PL237A.js","sourcesContent":["/**\n * Cron expression parsing and matching — the ONE canonical implementation\n * every engine that schedules a cron-shaped interval delegates to (the\n * `os/watch-cron` effect handler in `createOsHandlers.ts`, `OrbitalServerRuntime`,\n * `TickScheduler`, and generated client codegen). No Node.js dependencies, so\n * it's safe to import client-side too.\n *\n * @packageDocumentation\n */\n\nexport interface CronFields {\n minute: Set<number>;\n hour: Set<number>;\n day: Set<number>;\n month: Set<number>;\n weekday: Set<number>;\n}\n\nexport function parseCronField(field: string, min: number, max: number): Set<number> {\n const values = new Set<number>();\n for (const part of field.split(\",\")) {\n if (part === \"*\") {\n for (let i = min; i <= max; i++) values.add(i);\n } else if (part.includes(\"/\")) {\n const [range, stepStr] = part.split(\"/\");\n const step = parseInt(stepStr, 10);\n const start = range === \"*\" ? min : parseInt(range, 10);\n for (let i = start; i <= max; i += step) values.add(i);\n } else if (part.includes(\"-\")) {\n const [lo, hi] = part.split(\"-\").map(Number);\n for (let i = lo; i <= hi; i++) values.add(i);\n } else {\n values.add(parseInt(part, 10));\n }\n }\n return values;\n}\n\nexport function parseCron(expression: string): CronFields {\n const parts = expression.trim().split(/\\s+/);\n if (parts.length !== 5) {\n throw new Error(`Invalid cron expression (expected 5 fields): ${expression}`);\n }\n return {\n minute: parseCronField(parts[0], 0, 59),\n hour: parseCronField(parts[1], 0, 23),\n day: parseCronField(parts[2], 1, 31),\n month: parseCronField(parts[3], 1, 12),\n weekday: parseCronField(parts[4], 0, 6),\n };\n}\n\n/** Returns true if `expression` is a syntactically valid 5-field cron expression. */\nexport function isValidCronExpression(expression: string): boolean {\n try {\n parseCron(expression);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function cronMatches(fields: CronFields, date: Date): boolean {\n return (\n fields.minute.has(date.getMinutes()) &&\n fields.hour.has(date.getHours()) &&\n fields.day.has(date.getDate()) &&\n fields.month.has(date.getMonth() + 1) &&\n fields.weekday.has(date.getDay())\n );\n}\n\n/** Calendar-minute key for once-per-minute dedup — the same shape `os/watch-cron` uses. */\nexport function cronMinuteKey(date: Date): number {\n return (\n date.getFullYear() * 1e8 +\n date.getMonth() * 1e6 +\n date.getDate() * 1e4 +\n date.getHours() * 100 +\n date.getMinutes()\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createAgentSubstrateHandlers.ts"],"names":[],"mappings":";;;AAyBA,IAAM,GAAA,GAAM,aAAa,oCAAoC,CAAA;AAqBtD,SAAS,6BAA6B,GAAA,EAAgE;AACzG,EAAA,MAAM,QAAA,GAAoC;AAAA,IACtC,mBAAA,EAAqB,OAAO,MAAA,KAAW;AACnC,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,UAAA,EAAY;AAC1B,QAAA,GAAA,CAAI,KAAK,oCAAoC,CAAA;AAC7C,QAAA,OAAO,IAAA;AAAA,MACX;AAIA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA;AAAA,IACzC,CAAA;AAAA,IAEA,wBAAA,EAA0B,OAAO,UAAA,EAAY,QAAA,KAAa;AACtD,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,eAAA,EAAiB;AAC/B,QAAA,GAAA,CAAI,KAAK,yCAAyC,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,eAAA,CAAgB,UAAA,EAAY,QAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IAEA,oBAAA,EAAsB,OAAO,UAAA,EAAY,QAAA,EAAU,MAAA,KAAW;AAC1D,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa;AAC3B,QAAA,GAAA,CAAI,KAAK,oCAAoC,CAAA;AAC7C,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,UAAA,EAAY,UAAU,MAAM,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,aAAA,EAAe,OAAO,QAAA,EAAU,MAAA,KAAW;AACvC,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM;AACpB,QAAA,GAAA,CAAI,KAAK,6BAA6B,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,WAAA,KAAgB;AACtC,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU;AACxB,QAAA,GAAA,CAAI,KAAK,iCAAiC,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,WAAA,KAAgB;AACtC,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU;AACxB,QAAA,GAAA,CAAI,KAAK,kCAAkC,CAAA;AAC3C,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,WAAA,EAAa,EAAE,CAAA;AAAA,IAChD;AAAA,GACJ;AAEA,EAAA,OAAO;AAAA,IACH,QAAA;AAAA,IACA,SAAS,MAAM;AAAA,IAAC;AAAA,GACpB;AACJ","file":"createAgentSubstrateHandlers-RUX4RFC6.js","sourcesContent":["/**\n * Agent Substrate Handlers — Server-Side Only\n *\n * Provides implementations for the effect-position substrate operators:\n * compose/compose-all, compose/compose-children, behavior/instantiate,\n * behavior/call, validate/validate, lolo/emit-body.\n *\n * Used by OrbitalServerRuntime (interpreted path). Wired alongside\n * createOsHandlers — same lazy-import + merge-under-user-handlers pattern.\n *\n * The actual service invocations are injected via the `services` field of\n * AgentSubstrateHandlerContext. @almadar-io/rabit supplies these at runtime;\n * tests can inject mocks. When a service is absent, the handler logs a\n * warning and returns a safe default.\n *\n * NOT exported from the main index.ts because it references Node-only types.\n * Import directly: import { createAgentSubstrateHandlers } from '@almadar/runtime/createAgentSubstrateHandlers';\n *\n * @packageDocumentation\n */\n\nimport { createLogger } from '@almadar/logger';\nimport type { EventPayload, EffectHandlers } from './types.js';\nimport type { ServiceCallResult, Orbital, TraitConfig } from '@almadar/core';\n\nconst log = createLogger('almadar:runtime:substrate-handlers');\n\nexport interface SubstrateServices {\n composeAll?: (config: { appName: string; orbitals: Orbital[]; layoutStrategy?: string }) => Promise<ServiceCallResult>;\n composeChildren?: (parentName: string, children: Orbital[]) => Promise<ServiceCallResult>;\n instantiate?: (parentName: string, behavior: string, params?: TraitConfig) => Promise<ServiceCallResult>;\n call?: (behavior: string, method: string, params?: TraitConfig) => Promise<ServiceCallResult>;\n validate?: (orbitalName: string) => Promise<ServiceCallResult>;\n emitBody?: (orbitalName: string, loloSource: string) => Promise<ServiceCallResult>;\n}\n\nexport interface AgentSubstrateHandlerContext {\n emitEvent: (type: string, payload: EventPayload) => void;\n services: SubstrateServices;\n}\n\nexport interface AgentSubstrateHandlerResult {\n handlers: Partial<EffectHandlers>;\n cleanup: () => void;\n}\n\nexport function createAgentSubstrateHandlers(ctx: AgentSubstrateHandlerContext): AgentSubstrateHandlerResult {\n const handlers: Partial<EffectHandlers> = {\n substrateComposeAll: async (config) => {\n if (!ctx.services.composeAll) {\n log.warn('compose-all service not registered');\n return null;\n }\n // Success/failure events are dispatched by EffectExecutor via the\n // author's `emit:` config (uniform `{ result }` payload); this\n // handler only performs the invocation and returns the value.\n return ctx.services.composeAll(config);\n },\n\n substrateComposeChildren: async (parentName, children) => {\n if (!ctx.services.composeChildren) {\n log.warn('compose-children service not registered');\n return null;\n }\n return ctx.services.composeChildren(parentName, children);\n },\n\n substrateInstantiate: async (parentName, behavior, params) => {\n if (!ctx.services.instantiate) {\n log.warn('instantiate service not registered');\n return null;\n }\n return ctx.services.instantiate(parentName, behavior, params);\n },\n\n substrateCall: async (behavior, method) => {\n if (!ctx.services.call) {\n log.warn('call service not registered');\n return null;\n }\n return ctx.services.call(behavior, method);\n },\n\n substrateValidate: async (orbitalName) => {\n if (!ctx.services.validate) {\n log.warn('validate service not registered');\n return null;\n }\n return ctx.services.validate(orbitalName);\n },\n\n substrateEmitBody: async (orbitalName) => {\n if (!ctx.services.emitBody) {\n log.warn('emit-body service not registered');\n return null;\n }\n return ctx.services.emitBody(orbitalName, '');\n },\n };\n\n return {\n handlers,\n cleanup: () => {},\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createOsHandlers.ts"],"names":[],"mappings":"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","file":"createOsHandlers.js","sourcesContent":["/**\n * OS Trigger Handlers — Server-Side Only\n *\n * Provides Node.js implementations for all 8 os/* operators.\n * Used by OrbitalServerRuntime (interpreted path).\n *\n * NOT exported from the main index.ts because it imports Node.js-only modules.\n * Import directly: import { createOsHandlers } from '@almadar/runtime/createOsHandlers';\n *\n * @packageDocumentation\n */\n\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport { execFileSync } from \"child_process\";\nimport { createLogger } from '@almadar/logger';\nimport type { EventPayload, OsEmitConfig } from './types.js';\nimport type { EffectHandlers } from \"./types.js\";\nimport { parseCron, cronMatches, cronMinuteKey, type CronFields } from './cron.js';\n\nconst log = createLogger('almadar:runtime:os-handlers');\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface OsHandlerContext {\n /** Emit an event on the EventBus */\n emitEvent: (type: string, payload: EventPayload) => void;\n /** Working directory for file watching (defaults to process.cwd()) */\n cwd?: string;\n}\n\nexport interface OsHandlerResult {\n handlers: Partial<EffectHandlers>;\n cleanup: () => void;\n}\n\n// ============================================================================\n// Glob Matching (minimal, no external dependency)\n// ============================================================================\n\nfunction globToRegex(glob: string): RegExp {\n let regex = \"\";\n let i = 0;\n while (i < glob.length) {\n const c = glob[i];\n if (c === \"*\") {\n if (glob[i + 1] === \"*\") {\n // ** matches any path segment\n regex += \".*\";\n i += 2;\n if (glob[i] === \"/\") i++; // skip trailing slash\n continue;\n }\n // * matches anything except /\n regex += \"[^/]*\";\n } else if (c === \"?\") {\n regex += \"[^/]\";\n } else if (c === \".\") {\n regex += \"\\\\.\";\n } else if (c === \"/\" || c === \"-\" || c === \"_\") {\n regex += c;\n } else if (/[{}()[\\]^$+|\\\\]/.test(c)) {\n regex += \"\\\\\" + c;\n } else {\n regex += c;\n }\n i++;\n }\n return new RegExp(\"^\" + regex + \"$\");\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createOsHandlers(ctx: OsHandlerContext): OsHandlerResult {\n const cwd = ctx.cwd ?? process.cwd();\n\n // Resource tracking for cleanup\n const watchers: fs.FSWatcher[] = [];\n const intervals: ReturnType<typeof setInterval>[] = [];\n const signalHandlers: Array<{ signal: NodeJS.Signals; handler: () => void }> = [];\n let httpWatchActive = false;\n\n // Debounce configuration: { eventType: ms }\n const debounceConfig = new Map<string, number>();\n const debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function debouncedEmit(eventType: string, payload: EventPayload): void {\n const ms = debounceConfig.get(eventType);\n if (ms !== undefined && ms > 0) {\n const existing = debounceTimers.get(eventType);\n if (existing) clearTimeout(existing);\n debounceTimers.set(\n eventType,\n setTimeout(() => {\n debounceTimers.delete(eventType);\n ctx.emitEvent(eventType, payload);\n }, ms),\n );\n } else {\n ctx.emitEvent(eventType, payload);\n }\n }\n\n // ============================================================================\n // Handler Implementations\n // ============================================================================\n\n // When an author sets `emit: { on_message: \"X\" }` on an os/watch-* effect,\n // we swap the hardcoded default event name for X. Null-safe: absent emit\n // config preserves the legacy names so existing schemas keep working.\n const resolveOnMessage = (emit: OsEmitConfig | undefined, fallback: string): string =>\n emit?.on_message ?? fallback;\n\n const handlers: Partial<EffectHandlers> = {\n osWatchFiles: (\n glob: string,\n options: { recursive?: boolean; debounce?: number },\n emit?: OsEmitConfig,\n ) => {\n const recursive = (options.recursive as boolean) !== false;\n const pattern = globToRegex(glob);\n const eventName = resolveOnMessage(emit, \"OS_FILE_MODIFIED\");\n\n try {\n const watcher = fs.watch(cwd, { recursive }, (_event, filename) => {\n if (filename && pattern.test(filename)) {\n debouncedEmit(eventName, {\n file: filename,\n glob,\n cwd,\n });\n }\n });\n watchers.push(watcher);\n } catch (err) {\n if (emit?.failure) {\n ctx.emitEvent(emit.failure, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n log.warn('watch-files-failed-to-start', { error: err instanceof Error ? err : String(err) });\n }\n },\n\n osWatchProcess: (name: string, subcommand?: string, emit?: OsEmitConfig) => {\n const searchTerm = subcommand ? `${name} ${subcommand}` : name;\n // execFileSync below runs pgrep with no shell, so searchTerm can never inject\n // a command; this guard additionally rejects pathological / metacharacter input.\n if (!/^[\\w .\\-/:@]+$/.test(searchTerm)) {\n log.warn('watch-process-invalid-name', { searchTerm });\n return;\n }\n let wasRunning = false;\n // Both start + exit transitions share one event name when emit.on_message\n // is configured (consumers discriminate on the payload's `process` field).\n const startEvent = resolveOnMessage(emit, \"OS_PROCESS_STARTED\");\n const exitEvent = resolveOnMessage(emit, \"OS_PROCESS_EXITED\");\n\n const interval = setInterval(() => {\n let isRunning = false;\n try {\n const result = execFileSync(\"pgrep\", [\"-f\", searchTerm], {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n isRunning = result.trim().length > 0;\n } catch {\n isRunning = false;\n }\n\n if (isRunning && !wasRunning) {\n debouncedEmit(startEvent, { process: name, subcommand: subcommand ?? null });\n } else if (!isRunning && wasRunning) {\n debouncedEmit(exitEvent, { process: name, subcommand: subcommand ?? null });\n }\n wasRunning = isRunning;\n }, 2000);\n\n intervals.push(interval);\n },\n\n osWatchPort: (port: number, protocol: string, emit?: OsEmitConfig) => {\n if (protocol !== \"tcp\") {\n log.warn('watch-port-only-tcp-supported', { protocol });\n return;\n }\n\n let wasOpen = false;\n const openEvent = resolveOnMessage(emit, \"OS_PORT_OPENED\");\n const closeEvent = resolveOnMessage(emit, \"OS_PORT_CLOSED\");\n\n const interval = setInterval(() => {\n const socket = new net.Socket();\n socket.setTimeout(1000);\n\n socket.on(\"connect\", () => {\n socket.destroy();\n if (!wasOpen) {\n wasOpen = true;\n debouncedEmit(openEvent, { port, protocol });\n }\n });\n\n socket.on(\"error\", () => {\n socket.destroy();\n if (wasOpen) {\n wasOpen = false;\n debouncedEmit(closeEvent, { port, protocol });\n }\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n if (wasOpen) {\n wasOpen = false;\n debouncedEmit(closeEvent, { port, protocol });\n }\n });\n\n socket.connect(port, \"127.0.0.1\");\n }, 3000);\n\n intervals.push(interval);\n },\n\n osWatchHttp: (urlPattern: string, method?: string, _emit?: OsEmitConfig) => {\n // HTTP interception requires monkey-patching Node.js module exports (read-only in TS types).\n // The compiled path (backend.rs) generates untyped inline code that handles this.\n // For the interpreted runtime, log a warning.\n if (!httpWatchActive) {\n httpWatchActive = true;\n log.warn('watch-http-compiled-only', {\n pattern: urlPattern,\n method: method ?? null,\n });\n }\n },\n\n osWatchCron: (expression: string, emit?: OsEmitConfig) => {\n let fields: CronFields;\n try {\n fields = parseCron(expression);\n } catch (err) {\n if (emit?.failure) {\n ctx.emitEvent(emit.failure, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n log.warn('watch-cron-invalid-expression', { error: err instanceof Error ? err : String(err) });\n return;\n }\n\n let lastFired = -1;\n const eventName = resolveOnMessage(emit, \"OS_CRON_FIRE\");\n\n const interval = setInterval(() => {\n const now = new Date();\n const minuteKey = cronMinuteKey(now);\n\n if (minuteKey !== lastFired && cronMatches(fields, now)) {\n lastFired = minuteKey;\n debouncedEmit(eventName, {\n expression,\n firedAt: now.toISOString(),\n });\n }\n }, 1000);\n\n intervals.push(interval);\n },\n\n osWatchSignal: (signal: string, emit?: OsEmitConfig) => {\n const sig = signal.toUpperCase() as NodeJS.Signals;\n // Default name keeps the per-signal suffix (OS_SIGNAL_TERM); a\n // configured on_message drops that convention in favor of the single\n // author-chosen event.\n const handler = () => {\n const eventName = emit?.on_message ?? `OS_SIGNAL_${sig}`;\n debouncedEmit(eventName, { signal: sig });\n };\n\n try {\n process.on(sig, handler);\n signalHandlers.push({ signal: sig, handler });\n } catch (err) {\n if (emit?.failure) {\n ctx.emitEvent(emit.failure, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n log.warn('watch-signal-cannot-listen', { signal: sig, error: err instanceof Error ? err : String(err) });\n }\n },\n\n osWatchEnv: (variable: string, emit?: OsEmitConfig) => {\n let lastValue = process.env[variable];\n const eventName = resolveOnMessage(emit, \"OS_ENV_CHANGED\");\n\n const interval = setInterval(() => {\n const current = process.env[variable];\n if (current !== lastValue) {\n const previous = lastValue;\n lastValue = current;\n debouncedEmit(eventName, {\n variable,\n value: current ?? null,\n previous: previous ?? null,\n });\n }\n }, 1000);\n\n intervals.push(interval);\n },\n\n osDebounce: (ms: number, eventType: string) => {\n debounceConfig.set(eventType, ms);\n },\n };\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n function cleanup(): void {\n for (const w of watchers) {\n try { w.close(); } catch { /* already closed */ }\n }\n watchers.length = 0;\n\n for (const i of intervals) {\n clearInterval(i);\n }\n intervals.length = 0;\n\n for (const { signal, handler } of signalHandlers) {\n try { process.removeListener(signal, handler); } catch { /* noop */ }\n }\n signalHandlers.length = 0;\n\n httpWatchActive = false;\n\n // Clear pending debounce timers\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n }\n\n return { handlers, cleanup };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader/external-loader.ts"],"names":[],"mappings":"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","file":"external-loader-C2LO5XG3.js","sourcesContent":["/**\n * External Orbital Loader\n *\n * Loads external .orb files from various sources:\n * - Local filesystem (relative paths)\n * - Standard library (std/...)\n * - Scoped packages (@name/...)\n *\n * @packageDocumentation\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { Orbital, OrbitalSchema } from \"@almadar/core\";\nimport { OrbitalSchemaSchema } from \"@almadar/core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of loading an orbital.\n */\nexport interface LoadedOrbital {\n /** The loaded orbital */\n orbital: Orbital;\n\n /** Source path (resolved absolute path) */\n sourcePath: string;\n\n /** Original import path */\n importPath: string;\n}\n\n/**\n * Result of loading an orbital schema (may contain multiple orbitals).\n */\nexport interface LoadedSchema {\n /** The loaded schema */\n schema: OrbitalSchema;\n\n /** Source path (resolved absolute path) */\n sourcePath: string;\n\n /** Original import path */\n importPath: string;\n}\n\n/**\n * Loader options.\n */\nexport interface LoaderOptions {\n /** Base directory for resolving relative imports */\n basePath: string;\n\n /** Standard library root path */\n stdLibPath?: string;\n\n /**\n * Additional roots searched for `std/behaviors/*` imports after `stdLibPath`.\n * After the v16.0.0 package split, domain behaviors (app/, game/, marketing/,\n * probes/, service/) moved from `@almadar/std` to `@almadar-io/behaviors`.\n * Callers can pass that package's root here so cross-package `uses` resolve.\n *\n * If omitted, the loader auto-detects a sibling `@almadar-io/behaviors`\n * next to `stdLibPath` in node_modules at construction time.\n */\n behaviorsLibPaths?: string[];\n\n /** Scoped package roots (e.g., { \"@game-lib\": \"/path/to/lib\" }) */\n scopedPaths?: Record<string, string>;\n\n /** Whether to allow paths outside basePath (security) */\n allowOutsideBasePath?: boolean;\n}\n\n/**\n * Loader result with error handling.\n */\nexport type LoadResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n\n// ============================================================================\n// Circular Import Detection\n// ============================================================================\n\n/**\n * Tracks import chains to detect circular imports.\n */\nexport class ImportChain {\n private chain: string[] = [];\n\n /**\n * Try to add a path to the chain.\n * @returns Error message if circular, null if OK\n */\n push(absolutePath: string): string | null {\n if (this.chain.includes(absolutePath)) {\n const cycle = [...this.chain.slice(this.chain.indexOf(absolutePath)), absolutePath];\n return `Circular import detected: ${cycle.join(\" -> \")}`;\n }\n this.chain.push(absolutePath);\n return null;\n }\n\n /**\n * Remove the last path from the chain.\n */\n pop(): void {\n this.chain.pop();\n }\n\n /**\n * Clone the chain for nested loading.\n */\n clone(): ImportChain {\n const newChain = new ImportChain();\n newChain.chain = [...this.chain];\n return newChain;\n }\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\n/**\n * Cache for loaded schemas to avoid re-loading.\n */\nexport class LoaderCache {\n private cache = new Map<string, LoadedSchema>();\n\n get(absolutePath: string): LoadedSchema | undefined {\n return this.cache.get(absolutePath);\n }\n\n set(absolutePath: string, schema: LoadedSchema): void {\n this.cache.set(absolutePath, schema);\n }\n\n has(absolutePath: string): boolean {\n return this.cache.has(absolutePath);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n// ============================================================================\n// External Orbital Loader\n// ============================================================================\n\n/**\n * ExternalOrbitalLoader - Loads external .orb files with security and caching.\n *\n * Security Model:\n * - By default, only allows loading from within basePath\n * - std library has its own allowed path\n * - Scoped packages have their own allowed paths\n * - No path traversal outside allowed directories\n *\n * @example\n * ```typescript\n * const loader = new ExternalOrbitalLoader({\n * basePath: \"/project/schemas\",\n * stdLibPath: \"/project/std\",\n * });\n *\n * // Load relative .orb file\n * const result = await loader.load(\"./shared/health.orb\");\n *\n * // Load from std library\n * const stdResult = await loader.load(\"std/behaviors/game-core\");\n * ```\n */\nexport class ExternalOrbitalLoader {\n private options: Required<LoaderOptions>;\n private cache: LoaderCache;\n\n constructor(options: LoaderOptions) {\n this.options = {\n stdLibPath: options.stdLibPath ?? \"\",\n behaviorsLibPaths: options.behaviorsLibPaths ?? autoDetectBehaviorsLibPaths(options.stdLibPath),\n scopedPaths: options.scopedPaths ?? {},\n allowOutsideBasePath: options.allowOutsideBasePath ?? false,\n ...options,\n };\n this.cache = new LoaderCache();\n }\n\n /**\n * Load a schema from an import path.\n *\n * @param importPath - The import path (e.g., \"./health.orb\", \"std/behaviors/game-core\")\n * @param fromPath - The path of the file doing the import (for relative resolution)\n * @param chain - Import chain for circular detection\n */\n async load(\n importPath: string,\n fromPath?: string,\n chain?: ImportChain\n ): Promise<LoadResult<LoadedSchema>> {\n const importChain = chain ?? new ImportChain();\n\n // Resolve the absolute path\n const resolveResult = this.resolvePath(importPath, fromPath);\n if (!resolveResult.success) {\n return resolveResult;\n }\n const absolutePath = resolveResult.data;\n\n // Check for circular imports\n const circularError = importChain.push(absolutePath);\n if (circularError) {\n return { success: false, error: circularError };\n }\n\n try {\n // Check cache\n const cached = this.cache.get(absolutePath);\n if (cached) {\n return { success: true, data: cached };\n }\n\n // Load and parse the file\n const loadResult = await this.loadFile(absolutePath);\n if (!loadResult.success) {\n return loadResult;\n }\n\n const loaded: LoadedSchema = {\n schema: loadResult.data,\n sourcePath: absolutePath,\n importPath,\n };\n\n // Cache the result\n this.cache.set(absolutePath, loaded);\n\n return { success: true, data: loaded };\n } finally {\n importChain.pop();\n }\n }\n\n /**\n * Load a specific orbital from a schema by name.\n *\n * @param importPath - The import path\n * @param orbitalName - The orbital name (optional, defaults to first orbital)\n * @param fromPath - The path of the file doing the import\n * @param chain - Import chain for circular detection\n */\n async loadOrbital(\n importPath: string,\n orbitalName?: string,\n fromPath?: string,\n chain?: ImportChain\n ): Promise<LoadResult<LoadedOrbital>> {\n const schemaResult = await this.load(importPath, fromPath, chain);\n if (!schemaResult.success) {\n return schemaResult;\n }\n\n const schema = schemaResult.data.schema;\n let orbital: Orbital;\n\n if (orbitalName) {\n const found = schema.orbitals.find((o: Orbital) => o.name === orbitalName);\n if (!found) {\n return {\n success: false,\n error: `Orbital \"${orbitalName}\" not found in ${importPath}. Available: ${schema.orbitals.map((o: Orbital) => o.name).join(\", \")}`,\n };\n }\n orbital = found;\n } else {\n // Default to first orbital\n if (schema.orbitals.length === 0) {\n return {\n success: false,\n error: `No orbitals found in ${importPath}`,\n };\n }\n orbital = schema.orbitals[0];\n }\n\n return {\n success: true,\n data: {\n orbital,\n sourcePath: schemaResult.data.sourcePath,\n importPath,\n },\n };\n }\n\n /**\n * Resolve an import path to an absolute filesystem path.\n */\n resolvePath(importPath: string, fromPath?: string): LoadResult<string> {\n // Standard library\n if (importPath.startsWith(\"std/\")) {\n return this.resolveStdPath(importPath);\n }\n\n // Scoped packages\n if (importPath.startsWith(\"@\")) {\n return this.resolveScopedPath(importPath);\n }\n\n // Relative paths\n if (importPath.startsWith(\"./\") || importPath.startsWith(\"../\")) {\n return this.resolveRelativePath(importPath, fromPath);\n }\n\n // Absolute paths (only if allowed)\n if (path.isAbsolute(importPath)) {\n if (!this.options.allowOutsideBasePath) {\n return {\n success: false,\n error: `Absolute paths not allowed: ${importPath}`,\n };\n }\n return { success: true, data: importPath };\n }\n\n // Behavior-package registry: a bare `<package>/<behavior-name>` import\n // (e.g. `almadar-behaviors/rpg-hero`) resolves to the emitted\n // `<root>/behaviors/registry/.../<name>.orb`. Mirrors the compiled-path\n // loader; std stays handled above.\n if (\n importPath.includes(\"/\") &&\n !importPath.startsWith(\"./\") &&\n !importPath.startsWith(\"../\") &&\n !importPath.startsWith(\"@\") &&\n !importPath.startsWith(\"std/\")\n ) {\n const name = importPath\n .slice(importPath.lastIndexOf(\"/\") + 1)\n .replace(/\\.orb$/, \"\");\n const result = this.resolveBehaviorInRegistries(name);\n if (result.success) {\n return result;\n }\n }\n\n // Default: treat as relative to base path\n return this.resolveRelativePath(`./${importPath}`, fromPath);\n }\n\n /**\n * Resolve a bare behavior name by recursively searching each configured\n * registry root (`stdLibPath` + `behaviorsLibPaths`) for a file named\n * `<name>.orb` anywhere under `<root>/behaviors/registry/`. Each candidate\n * is path-traversal-guarded against its root.\n */\n private resolveBehaviorInRegistries(name: string): LoadResult<string> {\n const roots: string[] = [];\n if (this.options.stdLibPath) roots.push(path.normalize(this.options.stdLibPath));\n for (const p of this.options.behaviorsLibPaths) {\n const norm = path.normalize(p);\n if (!roots.includes(norm)) roots.push(norm);\n }\n const target = `${name}.orb`;\n for (const root of roots) {\n const registryRoot = path.join(root, \"behaviors\", \"registry\");\n if (!fs.existsSync(registryRoot)) continue;\n const found = this.findFileRecursive(registryRoot, target, root);\n if (found) return { success: true, data: found };\n }\n return {\n success: false,\n error: `Behavior not found in registries: ${name} (searched ${roots.length} root(s): ${roots.join(\", \")})`,\n };\n }\n\n /** Depth-first recursive search for `target` filename under `dir`, guarded\n * to stay within `root`. Returns the normalized absolute path on hit. */\n private findFileRecursive(\n dir: string,\n target: string,\n root: string\n ): string | undefined {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return undefined;\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n const normalized = path.normalize(full);\n if (!normalized.startsWith(root)) continue;\n if (entry.isDirectory()) {\n const hit = this.findFileRecursive(full, target, root);\n if (hit) return hit;\n } else if (entry.name === target) {\n return normalized;\n }\n }\n return undefined;\n }\n\n /**\n * Resolve a standard library path.\n *\n * The std registry uses a topic/tier layout under\n * `<stdLibPath>/behaviors/registry/<topic>/{atoms,molecules,organisms}/<name>.orb`\n * (topic ∈ core|agent|game|service|app|probes). For `std/behaviors/<name>`\n * imports, try each (topic × tier) combination in order and return the first\n * one that exists on disk. Falls back to the pre-topic flat-tier layout and\n * the very old flat layout for back-compat. This matches how the Rust\n * compiler's `embedded.rs` resolves std paths.\n */\n private resolveStdPath(importPath: string): LoadResult<string> {\n if (!this.options.stdLibPath && this.options.behaviorsLibPaths.length === 0) {\n return {\n success: false,\n error: `Standard library path not configured. Cannot load: ${importPath}`,\n };\n }\n\n // std/behaviors/<name> → extract <name>.\n const relativePath = importPath.slice(4); // strip \"std/\"\n const name = relativePath\n .replace(/^behaviors\\//, \"\")\n .replace(/\\.orb$/, \"\");\n\n const topics = [\"core\", \"core-variations\", \"agent\", \"game\", \"service\", \"app\", \"probes\", \"marketing\"] as const;\n const tiers = [\"atoms\", \"molecules\", \"organisms\"] as const;\n\n // Build candidate list across all configured roots: std first, then any\n // companion package (@almadar-io/behaviors). For each root we try the\n // canonical topic/tier layout, plus two legacy fallbacks for very old\n // std layouts. Each (root, candidate) pair is path-traversal-guarded.\n const roots: string[] = [];\n if (this.options.stdLibPath) roots.push(path.normalize(this.options.stdLibPath));\n for (const p of this.options.behaviorsLibPaths) {\n const norm = path.normalize(p);\n if (!roots.includes(norm)) roots.push(norm);\n }\n\n let totalCandidates = 0;\n for (const root of roots) {\n const candidates: string[] = [];\n for (const topic of topics) {\n for (const tier of tiers) {\n candidates.push(path.join(root, \"behaviors\", \"registry\", topic, tier, `${name}.orb`));\n }\n }\n // UI family layout: behaviors/registry/ui/<family>/{atoms,molecules,organisms}/<name>.orb\n const uiRoot = path.join(root, \"behaviors\", \"registry\", \"ui\");\n if (fs.existsSync(uiRoot)) {\n const families = fs.readdirSync(uiRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n for (const family of families) {\n for (const tier of tiers) {\n candidates.push(path.join(uiRoot, family, tier, `${name}.orb`));\n }\n }\n }\n // Back-compat: pre-topic flat-tier layout (std 6.1–7.10).\n for (const tier of tiers) {\n candidates.push(path.join(root, \"behaviors\", \"registry\", tier, `${name}.orb`));\n }\n // Oldest back-compat: flat `<root>/behaviors/<name>.orb`.\n candidates.push(path.join(root, relativePath.endsWith(\".orb\") ? relativePath : `${relativePath}.orb`));\n totalCandidates += candidates.length;\n\n for (const candidate of candidates) {\n const normalized = path.normalize(candidate);\n // Path-traversal guard: each candidate must stay within its own root\n if (!normalized.startsWith(root)) continue;\n if (fs.existsSync(normalized)) {\n return { success: true, data: normalized };\n }\n }\n }\n\n return {\n success: false,\n error: `std behavior not found in registry: ${importPath} (tried ${totalCandidates} locations across ${roots.length} root(s): ${roots.join(\", \")})`,\n };\n }\n\n /**\n * Resolve a scoped package path.\n */\n private resolveScopedPath(importPath: string): LoadResult<string> {\n // Extract scope: @game-lib/enemies.orb -> @game-lib\n const match = importPath.match(/^(@[^/]+)/);\n if (!match) {\n return {\n success: false,\n error: `Invalid scoped package path: ${importPath}`,\n };\n }\n\n const scope = match[1];\n const scopeRoot = this.options.scopedPaths[scope];\n if (!scopeRoot) {\n return {\n success: false,\n error: `Scoped package \"${scope}\" not configured. Available: ${Object.keys(this.options.scopedPaths).join(\", \") || \"none\"}`,\n };\n }\n\n // @game-lib/enemies.orb -> scopeRoot/enemies.orb\n const relativePath = importPath.slice(scope.length + 1); // Remove \"@scope/\"\n let absolutePath = path.join(scopeRoot, relativePath);\n\n // Add .orb extension if not present\n if (!absolutePath.endsWith(\".orb\")) {\n absolutePath += \".orb\";\n }\n\n // Validate it's within scope root\n const normalizedPath = path.normalize(absolutePath);\n const normalizedRoot = path.normalize(scopeRoot);\n if (!normalizedPath.startsWith(normalizedRoot)) {\n return {\n success: false,\n error: `Path traversal outside scoped package: ${importPath}`,\n };\n }\n\n return { success: true, data: absolutePath };\n }\n\n /**\n * Resolve a relative path.\n */\n private resolveRelativePath(\n importPath: string,\n fromPath?: string\n ): LoadResult<string> {\n const baseDir = fromPath\n ? path.dirname(fromPath)\n : this.options.basePath;\n\n let absolutePath = path.resolve(baseDir, importPath);\n\n // Add .orb extension if not present\n if (!absolutePath.endsWith(\".orb\")) {\n absolutePath += \".orb\";\n }\n\n // Security check: ensure within base path\n if (!this.options.allowOutsideBasePath) {\n const normalizedPath = path.normalize(absolutePath);\n const normalizedBase = path.normalize(this.options.basePath);\n if (!normalizedPath.startsWith(normalizedBase)) {\n return {\n success: false,\n error: `Path traversal outside base path: ${importPath}. Base: ${this.options.basePath}`,\n };\n }\n }\n\n return { success: true, data: absolutePath };\n }\n\n /**\n * Load and parse an .orb file.\n */\n private async loadFile(absolutePath: string): Promise<LoadResult<OrbitalSchema>> {\n try {\n // Check file exists\n if (!fs.existsSync(absolutePath)) {\n return {\n success: false,\n error: `File not found: ${absolutePath}`,\n };\n }\n\n // Read file\n const content = await fs.promises.readFile(absolutePath, \"utf-8\");\n\n // Parse JSON\n let data: unknown;\n try {\n data = JSON.parse(content);\n } catch (e) {\n return {\n success: false,\n error: `Invalid JSON in ${absolutePath}: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n\n // Validate with Zod\n const parseResult = OrbitalSchemaSchema.safeParse(data);\n if (!parseResult.success) {\n const errors = parseResult.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n return {\n success: false,\n error: `Invalid schema in ${absolutePath}:\\n${errors}`,\n };\n }\n\n return { success: true, data: parseResult.data as OrbitalSchema };\n } catch (e) {\n return {\n success: false,\n error: `Failed to load ${absolutePath}: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n\n /**\n * Clear the cache.\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics.\n */\n getCacheStats(): { size: number } {\n return { size: this.cache.size };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a loader with sensible defaults.\n */\nexport function createLoader(basePath: string, options?: Partial<LoaderOptions>): ExternalOrbitalLoader {\n return new ExternalOrbitalLoader({\n basePath,\n ...options,\n });\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Parse an import path with optional fragment.\n *\n * @example\n * parseImportPath(\"./health.orb\") // { path: \"./health.orb\", fragment: undefined }\n * parseImportPath(\"./game.orb#Player\") // { path: \"./game.orb\", fragment: \"Player\" }\n */\nexport function parseImportPath(importPath: string): { path: string; fragment?: string } {\n const hashIndex = importPath.indexOf(\"#\");\n if (hashIndex === -1) {\n return { path: importPath };\n }\n return {\n path: importPath.slice(0, hashIndex),\n fragment: importPath.slice(hashIndex + 1),\n };\n}\n\n/**\n * Auto-detect a sibling `@almadar-io/behaviors` next to `@almadar/std`.\n *\n * After the v16.0.0 split, domain behaviors live in a companion package.\n * When a caller passes `stdLibPath` pointing at an installed `@almadar/std`,\n * the io package is usually a sibling in the same node_modules layout:\n *\n * <pkg>/node_modules/.pnpm/@almadar+std@x.y.z/node_modules/@almadar/std\n * <pkg>/node_modules/.pnpm/@almadar-io+behaviors@a.b.c/node_modules/@almadar-io/behaviors\n *\n * or the simpler hoisted form:\n *\n * <pkg>/node_modules/@almadar/std\n * <pkg>/node_modules/@almadar-io/behaviors\n *\n * We walk up from `stdLibPath` looking for either layout and return every\n * `behaviors/registry/` directory we find. Callers can override by passing\n * `behaviorsLibPaths` explicitly.\n */\nfunction autoDetectBehaviorsLibPaths(stdLibPath: string | undefined): string[] {\n if (!stdLibPath) return [];\n const found: string[] = [];\n try {\n // Walk up to the nearest `node_modules` ancestor\n let dir = path.normalize(stdLibPath);\n for (let i = 0; i < 10; i++) {\n const parent = path.dirname(dir);\n if (parent === dir) break;\n // Hoisted layout: <…>/node_modules/@almadar/std → check sibling\n if (path.basename(parent) === \"@almadar\" && path.basename(path.dirname(parent)) === \"node_modules\") {\n const nm = path.dirname(parent);\n const ioPath = path.join(nm, \"@almadar-io\", \"behaviors\");\n if (fs.existsSync(path.join(ioPath, \"behaviors\", \"registry\"))) found.push(ioPath);\n }\n // pnpm layout: <…>/.pnpm/@almadar+std@x.y.z/node_modules/@almadar/std\n if (path.basename(parent) === \".pnpm\") {\n const pnpmRoot = parent;\n try {\n for (const entry of fs.readdirSync(pnpmRoot)) {\n if (!entry.startsWith(\"@almadar-io+behaviors@\")) continue;\n const ioPath = path.join(pnpmRoot, entry, \"node_modules\", \"@almadar-io\", \"behaviors\");\n if (fs.existsSync(path.join(ioPath, \"behaviors\", \"registry\"))) found.push(ioPath);\n }\n } catch {\n // unreadable .pnpm dir — skip\n }\n break;\n }\n dir = parent;\n }\n } catch {\n // Filesystem access failed (read-only mount, missing perms) — return what\n // we have. Explicit `behaviorsLibPaths` override remains available.\n }\n return found;\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ClientEffectHandlers.ts","../src/ServerEffectHandlers.ts","../src/composition/index.ts","../src/composition/event-wiring.ts","../src/composition/layout-strategy.ts","../src/composition/compose-behaviors.ts","../src/composition/pipe.ts"],"names":["createLogger"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Client Effect Handlers Factory\n *\n * Creates the standard effect handler set for client-side trait execution.\n * Platform-agnostic — works with any UI framework that provides the required interfaces.\n *\n * @packageDocumentation\n */\n\nimport { createLogger } from '@almadar/logger';\nimport type { EffectHandlers, EventPayload, PatternProps } from './types.js';\n\nconst log = createLogger('almadar:runtime:effects:client');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal event bus interface required by the factory.\n */\nexport interface ClientEventBus {\n emit: (type: string, payload?: EventPayload) => void;\n}\n\n/**\n * Slot setter interface for render-ui effects.\n * The factory doesn't know about React state — it just calls this function.\n */\nexport interface SlotSetter {\n /** Accumulate a pattern into the pending slot map */\n addPattern: (slot: string, pattern: unknown, props?: PatternProps) => void;\n /** Mark a slot for clearing */\n clearSlot: (slot: string) => void;\n}\n\n/**\n * Options for creating client effect handlers.\n */\nexport interface CreateClientEffectHandlersOptions {\n /** Event bus for emit effects */\n eventBus: ClientEventBus;\n /** Slot setter for render-ui effects */\n slotSetter: SlotSetter;\n /** Navigate function for navigate effects */\n navigate?: (path: string, params?: { [key: string]: string }) => void;\n /** Notify function for notification effects */\n notify?: (message: string, type: 'success' | 'error' | 'warning' | 'info') => void;\n /**\n * Send-server handler for `send-server` effects.\n * When omitted, defaults to a lazy WebSocket transport connecting to the\n * server's `/ws/events` endpoint. The handler produces the server wire\n * message `{ type: 'ORBITAL_EVENT', payload: { orbital, event, payload } }`\n * that `setupEventBroadcast` decodes.\n *\n * Pass a custom function here to override the transport (e.g. in tests or\n * when the WS URL differs from the default).\n *\n * `orbitalName` is injected at call time by the EffectContext when available.\n */\n sendServer?: (event: string, payload?: EventPayload) => void;\n /** Orbital name used to stamp the WS message (used by the default transport) */\n orbitalName?: string;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n// ============================================================================\n// WS Transport (lazy singleton per page-load)\n// ============================================================================\n\n/** Lazily-opened WebSocket to the server's /ws/events endpoint. */\nlet _ws: WebSocket | null = null;\nlet _wsQueue: string[] = [];\n\nfunction getOrOpenWs(): WebSocket | null {\n if (typeof WebSocket === 'undefined' || typeof location === 'undefined') return null;\n if (_ws && (_ws.readyState === WebSocket.OPEN || _ws.readyState === WebSocket.CONNECTING)) {\n return _ws;\n }\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const url = `${protocol}//${location.host}/ws/events`;\n try {\n _ws = new WebSocket(url);\n _ws.addEventListener('open', () => {\n const queued = _wsQueue.splice(0);\n for (const msg of queued) {\n _ws!.send(msg);\n }\n });\n _ws.addEventListener('error', () => {\n _ws = null;\n });\n _ws.addEventListener('close', () => {\n _ws = null;\n });\n } catch {\n _ws = null;\n }\n return _ws;\n}\n\nfunction sendServerEvent(orbital: string, event: string, payload?: EventPayload): void {\n const msg = JSON.stringify({\n type: 'ORBITAL_EVENT',\n payload: { orbital, event, payload: payload ?? null },\n });\n const ws = getOrOpenWs();\n if (!ws) {\n log.warn('send-server:no-ws', { event });\n return;\n }\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n } else {\n _wsQueue.push(msg);\n }\n}\n\n/**\n * Create client-side effect handlers for trait state machine execution.\n *\n * Client handles: emit, renderUI, navigate, notify, sendServer\n * Server handles: persist, set, callService (logged as warnings on client)\n *\n * @example\n * ```ts\n * const handlers = createClientEffectHandlers({\n * eventBus,\n * slotSetter: {\n * addPattern: (slot, pattern, props) => pendingSlots.get(slot)?.push({ pattern, props }),\n * clearSlot: (slot) => pendingSlots.set(slot, []),\n * },\n * navigate: (path) => router.push(path),\n * notify: (msg, type) => toast[type](msg),\n * });\n * ```\n */\nexport function createClientEffectHandlers(\n options: CreateClientEffectHandlersOptions\n): EffectHandlers {\n const { eventBus, slotSetter, navigate, notify, sendServer, orbitalName = '' } = options;\n\n return {\n emit: (event: string, payload?: EventPayload) => {\n // The event bus emits with shape `{ type, payload, source }` per\n // IEventBus. Subscribers read `event.payload` to get the trait-\n // supplied payload. Wrapping it again as `{ payload }` here\n // produced a doubly-nested envelope — `@payload.X` bindings on\n // the receiving render-ui then resolved to `undefined` because\n // the real keys lived one level deeper. Pass the payload through\n // directly so the subscriber sees exactly what the trait emitted.\n const prefixedEvent = event.startsWith('UI:') ? event : `UI:${event}`;\n eventBus.emit(prefixedEvent, payload);\n },\n\n persist: async () => {\n log.warn('persist-server-side-only');\n },\n\n set: () => {\n log.warn('set-server-side-only');\n },\n\n callService: async () => {\n log.warn('call-service-server-side-only');\n return {};\n },\n\n renderUI: (slot: string, pattern: unknown, props?: PatternProps) => {\n if (pattern === null) {\n slotSetter.clearSlot(slot);\n return;\n }\n slotSetter.addPattern(slot, pattern, props);\n },\n\n navigate: navigate ?? ((path: string) => {\n if (typeof window !== 'undefined' && /^https?:\\/\\//.test(path)) {\n window.location.href = path;\n return;\n }\n log.warn('navigate-no-handler', { path });\n }),\n\n notify: notify ?? ((msg: string, type?: string) => {\n log.debug('notify', { type: type ?? null, message: msg });\n }),\n\n sendServer: sendServer ?? ((event: string, payload?: EventPayload) => {\n sendServerEvent(orbitalName, event, payload);\n }),\n };\n}\n","/**\n * ServerEffectHandlers — reusable factory for the server-side effect layer.\n *\n * Mirrors the handlers built inline in\n * `OrbitalServerRuntime.executeEffects` so both the real server runtime\n * AND the in-browser mock runtime (`@almadar/ui` OrbPreview autoMock) can\n * share the same `fetch` / `persist` / `set` / `ref` / `deref` / `swap!` /\n * `atomic` / `callService` semantics against a `PersistenceAdapter`.\n *\n * Browser-safe: only imports core + this package's browser-safe modules.\n * Does NOT import express/Node, so it is reachable from `@almadar/ui`.\n *\n * @packageDocumentation\n */\n\nimport type { EventPayload, SExpr, ServiceParams } from \"@almadar/core\";\nimport type { PersistenceAdapter } from \"./PersistenceAdapter.js\";\nimport type {\n EffectHandlers,\n BindingContext,\n EffectContext,\n EntityRow,\n} from \"./types.js\";\nimport { EffectExecutor } from \"./EffectExecutor.js\";\nimport { createContextFromBindings } from \"./BindingResolver.js\";\nimport { evaluate } from \"@almadar/evaluator\";\nimport { createLogger } from '@almadar/logger';\n\nconst effectLog = createLogger(\"almadar:runtime:effects\");\n\n/**\n * Minimal event-bus contract the server handlers need. Narrower than the\n * full `IEventBus` so clients with a React-context bus (only `emit` is\n * relevant for effect dispatch) can hand it in without adapter code.\n */\nexport interface ServerEffectEventBus {\n emit(\n event: string,\n payload?: EventPayload,\n source?: { orbital?: string; trait?: string },\n ): void;\n}\n\n/**\n * Result entry recorded for each effect invocation. Mirrors the server\n * runtime's `EffectResult`. Callers who want telemetry pass an array that\n * the factory appends to; otherwise it's unused.\n */\nexport interface ServerEffectResult {\n effect:\n | \"set\"\n | \"persist\"\n | \"call-service\"\n | \"fetch\"\n | \"ref\"\n | \"deref\"\n | \"swap\"\n | \"atomic\";\n action?: string;\n entityType?: string;\n data?: unknown;\n success: boolean;\n error?: string;\n}\n\nexport interface CreateServerEffectHandlersOptions {\n /** Persistent store backing `fetch` / `persist` / `ref` / `deref` / `swap`. */\n persistence: PersistenceAdapter;\n /** Event bus that `emit` delegates to. Only `.emit()` is required. */\n eventBus: ServerEffectEventBus;\n /** The trait's linked entity type (used as the default for persist/set). */\n entityType: string;\n /** Current entity row id (used by `set`, `persist update/delete` fallback). */\n entityId?: string;\n /**\n * Binding object passed to inner `atomic` evaluator. When absent, atomic\n * effects still run but have no access to `@entity` / `@payload` bindings.\n */\n bindings?: BindingContext;\n /** Effect context passed to the inner `atomic` executor. */\n context?: EffectContext;\n /** Per-event result sink. Optional — telemetry only. */\n effectResults?: ServerEffectResult[];\n /**\n * Per-event fetched-data cache. `fetch` writes here so downstream UI\n * renderers can resolve `@entity` bindings from the latest load without\n * a separate round-trip.\n */\n fetchedData?: Record<string, EntityRow[]>;\n /** Per-event emit log. Optional — telemetry only. */\n emittedEvents?: Array<{ event: string; payload?: EventPayload }>;\n /** Source stamp applied to all emits. */\n source?: { orbital?: string; trait?: string };\n /** Consumer-supplied `call-service` handler. When absent, calls warn and return null. */\n callService?: (\n service: string,\n action: string,\n params?: ServiceParams,\n ) => Promise<EventPayload | null>;\n /** Verbose logging. */\n debug?: boolean;\n}\n\n/**\n * Build the full server-side effect handler set bound to a persistence\n * adapter. The returned object satisfies `EffectHandlers` and can be\n * handed directly to `EffectExecutor`.\n *\n * Scope: one handler object per transition — capture `entityId`,\n * `bindings`, `context`, and the sink arrays at build time. For a new\n * transition, call this factory again.\n *\n * Intentionally does NOT implement:\n * - `renderUI` / `notify` / `navigate` — these are client-side, provided\n * by `createClientEffectHandlers`. A mock runtime merges both handler\n * sets.\n * - `os/watch-*` observers — these are a no-op outside the server.\n * - Schema-aware relation cardinality / on-delete cascades — those live\n * in `OrbitalServerRuntime` and depend on the full registered schema.\n * Clients that need them can wrap the persist handler with their own\n * validation.\n */\nexport function createServerEffectHandlers(\n opts: CreateServerEffectHandlersOptions,\n): EffectHandlers {\n const {\n persistence,\n eventBus,\n entityType,\n entityId,\n bindings,\n context,\n effectResults,\n fetchedData,\n emittedEvents,\n source,\n callService: consumerCallService,\n debug,\n } = opts;\n\n const record = (entry: ServerEffectResult): void => {\n effectResults?.push(entry);\n };\n\n const handlers: EffectHandlers = {\n emit: (event, eventPayload, emitSource) => {\n if (debug) {\n effectLog.debug('emit', {\n event,\n payloadKeys: eventPayload ? Object.keys(eventPayload).join(',') : '',\n });\n }\n const stamp = emitSource ?? source;\n eventBus.emit(event, eventPayload, stamp);\n emittedEvents?.push({ event, payload: eventPayload });\n effectLog.debug(\"emit:push\", {\n event,\n cumulativeEmittedCount: emittedEvents?.length,\n sourceTrait: stamp?.trait,\n sourceOrbital: stamp?.orbital,\n emittedEventsBound: emittedEvents !== undefined,\n });\n },\n\n set: async (targetId, field, value) => {\n const id = targetId || entityId;\n if (!id) return;\n try {\n await persistence.update(entityType, id, { [field]: value } as EntityRow);\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: true,\n });\n } catch (err) {\n record({\n effect: \"set\",\n entityType,\n data: { id, field, value },\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n persist: async (action, targetEntityType, data) => {\n if (action === \"batch\") {\n const operations = (data as { operations?: unknown[] } | undefined)?.operations;\n if (!Array.isArray(operations) || operations.length === 0) {\n record({\n effect: \"persist\",\n action: \"batch\",\n success: false,\n error: \"Batch requires a non-empty operations array\",\n });\n return;\n }\n const batchResults: unknown[] = [];\n const completed: unknown[] = [];\n let batchFailed = false;\n let batchError = \"\";\n for (const op of operations) {\n if (!Array.isArray(op) || op.length < 2) {\n batchFailed = true;\n batchError = `Invalid batch operation format: ${JSON.stringify(op)}`;\n break;\n }\n const [opAction, opEntityType, ...opRest] = op as [\n string,\n string,\n ...unknown[],\n ];\n try {\n switch (opAction) {\n case \"create\": {\n const createData = (opRest[0] as EntityRow) || ({} as EntityRow);\n const { id: newId } = await persistence.create(\n opEntityType,\n createData,\n );\n batchResults.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n ...createData,\n });\n completed.push({\n action: \"create\",\n entityType: opEntityType,\n id: newId,\n });\n break;\n }\n case \"update\": {\n const updateId = opRest[0] as string;\n const updateData = (opRest[1] as EntityRow) || ({} as EntityRow);\n await persistence.update(opEntityType, updateId, updateData);\n const updated = await persistence.getById(opEntityType, updateId);\n batchResults.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n ...(updated || updateData),\n });\n completed.push({\n action: \"update\",\n entityType: opEntityType,\n id: updateId,\n });\n break;\n }\n case \"delete\": {\n const deleteId = opRest[0] as string;\n await persistence.delete(opEntityType, deleteId);\n batchResults.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n deleted: true,\n });\n completed.push({\n action: \"delete\",\n entityType: opEntityType,\n id: deleteId,\n });\n break;\n }\n default:\n batchFailed = true;\n batchError = `Unknown batch operation action: ${opAction}`;\n break;\n }\n } catch (err) {\n batchFailed = true;\n batchError = `Batch operation [${opAction}, ${opEntityType}] failed: ${\n err instanceof Error ? err.message : String(err)\n }`;\n break;\n }\n if (batchFailed) break;\n }\n record({\n effect: \"persist\",\n action: \"batch\",\n data: {\n operations: batchResults,\n completedCount: completed.length,\n totalCount: operations.length,\n },\n success: !batchFailed,\n ...(batchFailed ? { error: batchError } : {}),\n });\n return;\n }\n\n const type = targetEntityType || entityType;\n let resultData: EntityRow | undefined;\n const sizeBefore = (await persistence.list(type)).length;\n try {\n switch (action) {\n case \"create\": {\n const { id } = await persistence.create(type, (data ?? {}) as EntityRow);\n resultData = { id, ...((data ?? {}) as EntityRow) };\n break;\n }\n case \"update\": {\n const row = (data ?? {}) as EntityRow;\n const idOrFallback = (row.id as string | undefined) ?? entityId;\n if (idOrFallback) {\n await persistence.update(type, idOrFallback, row);\n const updated = await persistence.getById(type, idOrFallback);\n resultData = updated ?? { id: idOrFallback, ...row };\n }\n break;\n }\n case \"delete\": {\n const directId = typeof data === \"string\" ? data : undefined;\n const nestedId =\n typeof data === \"object\" && data !== null\n ? ((data as { id?: string }).id)\n : undefined;\n const deleteId = directId ?? nestedId ?? entityId;\n if (deleteId) {\n await persistence.delete(type, deleteId);\n resultData = { id: deleteId, deleted: true } as EntityRow;\n }\n break;\n }\n }\n const sizeAfter = (await persistence.list(type)).length;\n effectLog.debug(\"persist:store-mutate\", {\n action,\n entityType: type,\n resultId: resultData?.id as string | undefined,\n sizeBefore,\n sizeAfter,\n delta: sizeAfter - sizeBefore,\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n data: resultData,\n success: true,\n });\n } catch (err) {\n effectLog.error(\"persist:store-mutate-error\", {\n action,\n entityType: type,\n error: err instanceof Error ? err.message : String(err),\n });\n record({\n effect: \"persist\",\n action,\n entityType: type,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n\n callService: async (service, action, params) => {\n try {\n let result: EventPayload | null = null;\n if (consumerCallService) {\n result = await consumerCallService(service, action, params);\n } else {\n // Mock fallback: synthetic result satisfying common service-atom\n // emit shapes ({id, clientSecret, success, status, params-echo}).\n // Mirrors createClientEffectHandlers + OrbitalServerRuntime mock\n // mode so service-atom chains advance end-to-end in offline /\n // standalone-preview without explicit handler wiring.\n const mockId = `mock_${service}_${action}_${Math.random().toString(36).slice(2, 10)}`;\n const paramsEcho: Partial<EntityRow> = {};\n if (params && typeof params === \"object\") {\n for (const [k, v] of Object.entries(params as ServiceParams)) {\n if (\n v !== undefined &&\n (typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n v === null ||\n v instanceof Date)\n ) {\n paramsEcho[k] = v;\n }\n }\n }\n result = {\n id: mockId,\n clientSecret: `secret_${mockId}`,\n success: true,\n status: \"succeeded\",\n ...paramsEcho,\n } as EntityRow;\n if (debug) {\n effectLog.warn('call-service-not-configured-using-mock', { service, action });\n }\n }\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n data: result,\n success: true,\n });\n return result;\n } catch (err) {\n record({\n effect: \"call-service\",\n action: `${service}.${action}`,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n fetch: async (fetchEntityType, options) => {\n try {\n effectLog.info(\"clientFetch:enter\", () => ({\n entityType: fetchEntityType,\n hasOptions: options !== undefined && options !== null,\n optionsKeys: options ? Object.keys(options).join(',') : '',\n filterType: typeof options?.filter,\n filterIsArray: Array.isArray(options?.filter),\n filterJson: JSON.stringify(options?.filter ?? null).slice(0, 300),\n payloadJson: JSON.stringify(bindings?.payload ?? null).slice(0, 300),\n }));\n let result: EntityRow | EntityRow[] | null = null;\n let total = 0;\n if (options?.id) {\n const entity = await persistence.getById(fetchEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[fetchEntityType] = [entity];\n result = entity;\n total = 1;\n }\n } else {\n let entities = await persistence.list(fetchEntityType);\n if (options?.filter !== undefined && options.filter !== null) {\n const predicate = options.filter as SExpr;\n entities = entities.filter((entity) => {\n const ctx = createContextFromBindings(\n { entity, payload: bindings?.payload, current: entity },\n false,\n );\n try {\n return Boolean(evaluate(predicate, ctx));\n } catch (err) {\n effectLog.error('fetch-filter-eval-error', {\n entityType: fetchEntityType,\n error: err instanceof Error ? err : String(err),\n });\n return false;\n }\n });\n }\n // Capture total AFTER filter, BEFORE offset/limit so paginating\n // consumers receive the count of rows matching the filter.\n total = entities.length;\n if (options?.offset && options.offset > 0) {\n entities = entities.slice(options.offset);\n }\n if (options?.limit && options.limit > 0) {\n entities = entities.slice(0, options.limit);\n }\n if (fetchedData) fetchedData[fetchEntityType] = entities;\n result = entities;\n }\n return result === null ? null : { rows: result, total };\n } catch (err) {\n effectLog.error('fetch-error', {\n entityType: fetchEntityType,\n error: err instanceof Error ? err : String(err),\n });\n return null;\n }\n },\n\n fetchStream: async (streamEntityType, options, onChunk) => {\n // Default implementation: load all rows and call onChunk per row.\n // Real streaming (SSE/LLM) is wired by the server runtime via the\n // streaming SSE endpoint added in B2. This fallback keeps orbital-verify\n // and test environments working without a live SSE transport.\n try {\n const rows = await persistence.list(streamEntityType);\n const matched = options?.id\n ? rows.filter(r => r['id'] === options.id)\n : rows;\n for (const row of matched) {\n onChunk(row);\n }\n return matched;\n } catch (err) {\n effectLog.error('fetch-stream-error', {\n entityType: streamEntityType,\n error: err instanceof Error ? err : String(err),\n });\n return null;\n }\n },\n\n ref: async (refEntityType, options) => {\n // `ref` = `fetch` for mock/dev runtimes; real server uses the same\n // underlying persistence read, the difference (reactive subscription\n // vs one-shot) is a render-layer concern.\n return handlers.fetch!(refEntityType, options);\n },\n\n deref: async (derefEntityType, options) => {\n try {\n let result: EntityRow | EntityRow[] | null = null;\n let total = 0;\n if (options?.id) {\n const entity = await persistence.getById(derefEntityType, options.id);\n if (entity) {\n if (fetchedData) fetchedData[derefEntityType] = [entity];\n result = entity;\n total = 1;\n }\n } else {\n const entities = await persistence.list(derefEntityType);\n if (fetchedData) fetchedData[derefEntityType] = entities;\n result = entities;\n total = entities.length;\n }\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: true,\n });\n return result === null ? null : { rows: result, total };\n } catch (err) {\n record({\n effect: \"deref\",\n entityType: derefEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n swap: async (swapEntityType, swapEntityId, transform) => {\n try {\n const current = await persistence.getById(swapEntityType, swapEntityId);\n if (!current) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: `Entity ${swapEntityType}/${swapEntityId} not found`,\n });\n return null;\n }\n const ctx = createContextFromBindings(\n { current, entity: bindings?.entity, payload: bindings?.payload },\n false,\n );\n let newData: EntityRow;\n if (Array.isArray(transform)) {\n const evalResult = evaluate(transform as SExpr, ctx);\n if (\n evalResult &&\n typeof evalResult === \"object\" &&\n !Array.isArray(evalResult)\n ) {\n newData = evalResult as EntityRow;\n } else {\n newData = current;\n }\n } else if (typeof transform === \"object\" && transform !== null) {\n newData = { ...current, ...transform };\n } else {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: \"swap! transform must be an S-expression or object\",\n });\n return null;\n }\n await persistence.update(swapEntityType, swapEntityId, newData);\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n data: { id: swapEntityId, ...newData },\n success: true,\n });\n return newData;\n } catch (err) {\n record({\n effect: \"swap\",\n entityType: swapEntityType,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n\n watch: (_watchEntityType: string) => {\n // watch is a server-only reactive subscription. In the browser mock\n // runtime there is no long-lived observation — every render already\n // re-reads the persistence snapshot, so this is a no-op.\n },\n\n atomic: async (atomicEffects) => {\n const atomicExecutor = new EffectExecutor({\n handlers,\n bindings: bindings ?? ({} as BindingContext),\n context:\n context ?? ({\n traitName: \"atomic\",\n state: \"unknown\",\n transition: \"unknown\",\n } as EffectContext),\n });\n try {\n await atomicExecutor.executeAll(atomicEffects as unknown[]);\n record({ effect: \"atomic\", success: true });\n } catch (err) {\n record({\n effect: \"atomic\",\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n },\n };\n\n return handlers;\n}\n","/**\n * Composition Module\n *\n * Runtime-side TypeScript composition layer for behavior/* operators.\n *\n * Composition is normally a compile-time concept, evaluated by the Rust\n * compiler pass before code generation. The runtime ships an equivalent\n * TypeScript implementation so dev-mode hot reload, agent-driven dynamic\n * composition, and the legacy `composeBehaviors()` callers all have a\n * usable in-process implementation. The handlers are wired into\n * `EffectExecutor` as optional handlers (`composeBehaviors`,\n * `applyEventWiring`, `detectLayoutStrategy`, `pipeBehaviors`) so\n * consumers that do not need composition pay no cost.\n *\n * @packageDocumentation\n */\n\n// Compose behaviors (main entry point)\nexport {\n type ComposeBehaviorsInput,\n type ComposeBehaviorsResult,\n composeBehaviors,\n} from './compose-behaviors.js';\n\n// Event wiring\nexport { type EventWiringEntry, applyEventWiring } from './event-wiring.js';\n\n// Layout strategy detection\nexport { type LayoutStrategy, detectLayoutStrategy } from './layout-strategy.js';\n\n// Pipe (left-to-right behavior pipeline)\nexport { type PipeStep, pipeBehaviors } from './pipe.js';\n","/**\n * Event Wiring\n *\n * Applies cross-orbital event wiring to orbital definitions.\n * Adds emits/listens declarations to traits so they can communicate\n * across orbital boundaries.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalDefinition,\n Trait,\n TraitEventContract,\n TraitEventListener,\n} from '@almadar/core';\nimport { isInlineTrait } from '@almadar/core';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A single event wiring entry connecting two traits across orbitals.\n */\nexport interface EventWiringEntry {\n /** Source trait name or orbital name */\n from: string;\n /** Event name (UPPER_SNAKE_CASE) */\n event: string;\n /** Target trait name or orbital name */\n to: string;\n /** Event to trigger on the listener side */\n triggers: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Find a trait by name across all orbitals.\n * Only inline traits can be mutated; string/ref traits are skipped.\n * Returns the inline Trait object if found, or null.\n */\nfunction findInlineTrait(\n orbitals: OrbitalDefinition[],\n name: string,\n): Trait | null {\n for (const orbital of orbitals) {\n for (const traitRef of orbital.traits) {\n if (isInlineTrait(traitRef) && traitRef.name === name) {\n return traitRef;\n }\n }\n }\n return null;\n}\n\n/**\n * Check if an emit already exists in the list.\n * @internal\n */\nfunction hasEmit(emits: TraitEventContract[], event: string): boolean {\n return emits.some((e) => e.event === event);\n}\n\n/**\n * Check if a listen already exists in the list.\n * @internal\n */\nfunction hasListen(\n listens: TraitEventListener[],\n event: string,\n triggers: string,\n): boolean {\n return listens.some((l) => l.event === event && l.triggers === triggers);\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Apply event wiring to orbital definitions.\n *\n * For each wiring entry:\n * 1. Find the source trait and add an external emit (if not already present)\n * 2. Find the target trait and add an external listen (if not already present)\n *\n * Returns a new array of orbitals with wiring applied (deep-cloned).\n */\nexport function applyEventWiring(\n orbitals: OrbitalDefinition[],\n wiring: EventWiringEntry[],\n): OrbitalDefinition[] {\n // Deep clone to avoid mutating input\n const cloned: OrbitalDefinition[] = JSON.parse(\n JSON.stringify(orbitals),\n ) as OrbitalDefinition[];\n\n for (const entry of wiring) {\n // Wire the source: add emit\n const sourceTrait = findInlineTrait(cloned, entry.from);\n if (sourceTrait) {\n if (!sourceTrait.emits) {\n sourceTrait.emits = [];\n }\n if (!hasEmit(sourceTrait.emits, entry.event)) {\n sourceTrait.emits.push({\n event: entry.event,\n scope: 'external',\n });\n }\n }\n\n // Wire the target: add listen\n const targetTrait = findInlineTrait(cloned, entry.to);\n if (targetTrait) {\n if (!targetTrait.listens) {\n targetTrait.listens = [];\n }\n if (!hasListen(targetTrait.listens, entry.event, entry.triggers)) {\n targetTrait.listens.push({\n event: entry.event,\n triggers: entry.triggers,\n scope: 'external',\n });\n }\n }\n }\n\n return cloned;\n}\n","/**\n * Layout Strategy Detection\n *\n * Auto-detects the best layout strategy for a composed application\n * based on the number of orbitals and their event wiring topology.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Layout strategy for the composed application.\n *\n * - 'single': One orbital, one page\n * - 'tabs': 2-4 orbitals with no sequential chain\n * - 'sidebar': 5+ orbitals (navigation-heavy)\n * - 'dashboard': Single page with all orbitals visible\n * - 'wizard-flow': Sequential event chain detected (A -> B -> C)\n */\nexport type LayoutStrategy =\n | 'sidebar'\n | 'tabs'\n | 'dashboard'\n | 'wizard-flow'\n | 'single';\n\n// ============================================================================\n// Chain Detection\n// ============================================================================\n\n/**\n * Detect whether the event wiring forms a sequential chain.\n *\n * A sequential chain exists when orbital A's `from` feeds into B's `to`,\n * and B's `from` feeds into C's `to`, forming A -> B -> C.\n *\n * We build a directed graph from wiring entries and look for a chain\n * that covers 3+ nodes (the minimum for a meaningful wizard flow).\n */\nfunction hasSequentialChain(wiring: EventWiringEntry[]): boolean {\n if (wiring.length < 2) {\n return false;\n }\n\n // Build adjacency: from -> Set<to>\n const adjacency = new Map<string, Set<string>>();\n const allTargets = new Set<string>();\n\n for (const entry of wiring) {\n let targets = adjacency.get(entry.from);\n if (!targets) {\n targets = new Set<string>();\n adjacency.set(entry.from, targets);\n }\n targets.add(entry.to);\n allTargets.add(entry.to);\n }\n\n // Find roots (nodes that are sources but never targets)\n const roots: string[] = [];\n for (const from of adjacency.keys()) {\n if (!allTargets.has(from)) {\n roots.push(from);\n }\n }\n\n // If no clear root, try all sources\n const starts = roots.length > 0 ? roots : [...adjacency.keys()];\n\n // Walk from each start and measure chain length\n for (const start of starts) {\n let current = start;\n let length = 1;\n const visited = new Set<string>([current]);\n\n while (true) {\n const nexts = adjacency.get(current);\n if (!nexts || nexts.size === 0) break;\n\n // Follow the first unvisited successor (linear chain)\n let advanced = false;\n for (const next of nexts) {\n if (!visited.has(next)) {\n visited.add(next);\n current = next;\n length++;\n advanced = true;\n break;\n }\n }\n\n if (!advanced) break;\n }\n\n // A chain of 3+ nodes qualifies as wizard-flow\n if (length >= 3) {\n return true;\n }\n }\n\n return false;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Detect the best layout strategy based on orbital count and event wiring.\n *\n * Heuristic:\n * 1. Sequential event chain detected -> 'wizard-flow'\n * 2. 1 orbital -> 'single'\n * 3. 2-4 orbitals -> 'tabs'\n * 4. 5+ orbitals -> 'sidebar'\n */\nexport function detectLayoutStrategy(\n orbitals: OrbitalDefinition[],\n eventWiring?: EventWiringEntry[],\n): LayoutStrategy {\n // Check for sequential chain first (takes priority)\n if (eventWiring && eventWiring.length > 0 && hasSequentialChain(eventWiring)) {\n return 'wizard-flow';\n }\n\n const count = orbitals.length;\n\n if (count <= 1) {\n return 'single';\n }\n\n if (count <= 4) {\n return 'tabs';\n }\n\n return 'sidebar';\n}\n","/**\n * Compose Behaviors\n *\n * Main entry point for composing multiple orbital definitions into\n * a single OrbitalSchema application. Handles event wiring, layout\n * strategy detection, and page generation.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition, OrbitalSchema, Page } from '@almadar/core';\nimport type { EventWiringEntry } from './event-wiring.js';\nimport { applyEventWiring } from './event-wiring.js';\nimport type { LayoutStrategy } from './layout-strategy.js';\nimport { detectLayoutStrategy } from './layout-strategy.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input for composing behaviors into an application.\n */\nexport interface ComposeBehaviorsInput {\n /** Application name */\n appName: string;\n /** Orbital definitions to compose */\n orbitals: OrbitalDefinition[];\n /** Layout strategy override, or 'auto' to detect */\n layoutStrategy?: LayoutStrategy | 'auto';\n /** Cross-orbital event wiring */\n eventWiring?: EventWiringEntry[];\n /** Optional entity name mappings (original -> renamed) */\n entityMappings?: Record<string, string>;\n}\n\n/**\n * Result of composing behaviors.\n */\nexport interface ComposeBehaviorsResult {\n /** The composed OrbitalSchema */\n schema: OrbitalSchema;\n /** Layout metadata */\n layout: { strategy: LayoutStrategy; pageCount: number };\n /** Wiring metadata */\n wiring: { connections: number };\n}\n\n// ============================================================================\n// Page Generation\n// ============================================================================\n\nfunction toKebabCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Generate pages for each orbital based on the layout strategy.\n *\n * For strategies that produce one page per orbital (sidebar, tabs, wizard-flow),\n * each orbital gets a page at `/<kebab-name>` with `isInitial` on the first.\n *\n * For 'dashboard', all orbitals share a single page.\n * For 'single', the lone orbital gets a single root page.\n */\nfunction generatePages(\n orbitals: OrbitalDefinition[],\n strategy: LayoutStrategy,\n): Page[] {\n switch (strategy) {\n case 'single': {\n const orbital = orbitals[0];\n const name = orbital?.name ?? 'Main';\n return [\n {\n name: `${name}Page`,\n path: '/',\n isInitial: true,\n primaryEntity: getEntityName(orbital),\n },\n ];\n }\n\n case 'dashboard': {\n return [\n {\n name: 'DashboardPage',\n path: '/',\n viewType: 'dashboard',\n isInitial: true,\n },\n ];\n }\n\n case 'sidebar':\n case 'tabs':\n case 'wizard-flow': {\n return orbitals.map((orbital, index) => ({\n name: `${orbital.name}Page`,\n path: index === 0 ? '/' : `/${toKebabCase(orbital.name)}`,\n isInitial: index === 0,\n primaryEntity: getEntityName(orbital),\n }));\n }\n }\n}\n\n/**\n * Extract entity name from an orbital definition.\n * Handles both inline entities and string references.\n */\nfunction getEntityName(orbital: OrbitalDefinition | undefined): string | undefined {\n if (!orbital) return undefined;\n const entity = orbital.entity;\n if (typeof entity === 'string') {\n // Reference like \"Alias.entity\" - extract the alias as entity name\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compose multiple orbital definitions into a single application schema.\n *\n * Steps:\n * 1. Apply event wiring (adds emits/listens to traits)\n * 2. Detect or use provided layout strategy\n * 3. Generate pages based on the strategy\n * 4. Build the final OrbitalSchema\n */\nexport function composeBehaviors(\n input: ComposeBehaviorsInput,\n): ComposeBehaviorsResult {\n const {\n appName,\n orbitals: rawOrbitals,\n layoutStrategy: strategyInput,\n eventWiring,\n } = input;\n\n // Step 1: Apply event wiring\n const wiredOrbitals =\n eventWiring && eventWiring.length > 0\n ? applyEventWiring(rawOrbitals, eventWiring)\n : rawOrbitals;\n\n // Step 2: Determine layout strategy\n const strategy: LayoutStrategy =\n !strategyInput || strategyInput === 'auto'\n ? detectLayoutStrategy(wiredOrbitals, eventWiring)\n : strategyInput;\n\n // Step 3: Generate pages\n const pages = generatePages(wiredOrbitals, strategy);\n\n // Step 4: Assign generated pages to orbitals (merge, don't replace existing)\n const orbitalsWithPages = wiredOrbitals.map((orbital, index) => {\n // If the orbital already has pages, keep them\n if (orbital.pages && orbital.pages.length > 0) {\n return orbital;\n }\n\n // Assign the generated page for this orbital\n const page = strategy === 'dashboard' || strategy === 'single'\n ? pages[0]\n : pages[index];\n\n return {\n ...orbital,\n pages: page ? [page] : [],\n };\n });\n\n // Step 5: Build the schema\n const schema: OrbitalSchema = {\n name: appName,\n version: '1.0.0',\n orbitals: orbitalsWithPages,\n };\n\n return {\n schema,\n layout: {\n strategy,\n pageCount: pages.length,\n },\n wiring: {\n connections: eventWiring?.length ?? 0,\n },\n };\n}\n","/**\n * Pipe Behaviors\n *\n * Left-to-right composition. Each step receives the previous result as its\n * first argument and returns the value handed to the next step.\n *\n * @packageDocumentation\n */\n\n/**\n * A single step in a behavior pipeline.\n */\nexport type PipeStep<I, O> = (input: I) => O;\n\n/**\n * Apply a series of transformation steps to a seed value, left to right.\n * Each step receives the previous step's output as its first argument.\n *\n * @example\n * ```ts\n * pipeBehaviors(1, (n) => n + 1, (n) => n * 10); // -> 20\n * ```\n */\nexport function pipeBehaviors<T>(\n seed: T,\n ...steps: Array<PipeStep<unknown, unknown>>\n): unknown {\n let current: unknown = seed;\n for (const step of steps) {\n current = step(current);\n }\n return current;\n}\n"]}
|