@almadar/runtime 6.5.0 → 6.6.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-DhrQA78C.d.ts → OrbitalServerRuntime-CzUrdroI.d.ts} +12 -2
- package/dist/OrbitalServerRuntime.d.ts +2 -2
- package/dist/OrbitalServerRuntime.js +1 -1
- package/dist/ServerBridge.d.ts +1 -1
- package/dist/{chunk-VCDCBBYE.js → chunk-YJ6RSKMU.js} +6 -6
- package/dist/chunk-YJ6RSKMU.js.map +1 -0
- package/dist/createOsHandlers.d.ts +1 -1
- package/dist/{external-loader-UHZQPCKW.js → external-loader-IN246DQM.js} +60 -26
- package/dist/external-loader-IN246DQM.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/{types-cuy5gd29.d.ts → types-CjvQG_33.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-VCDCBBYE.js.map +0 -1
- package/dist/external-loader-UHZQPCKW.js.map +0 -1
|
@@ -56,6 +56,7 @@ var ExternalOrbitalLoader = class {
|
|
|
56
56
|
constructor(options) {
|
|
57
57
|
this.options = {
|
|
58
58
|
stdLibPath: options.stdLibPath ?? "",
|
|
59
|
+
behaviorsLibPaths: options.behaviorsLibPaths ?? autoDetectBehaviorsLibPaths(options.stdLibPath),
|
|
59
60
|
scopedPaths: options.scopedPaths ?? {},
|
|
60
61
|
allowOutsideBasePath: options.allowOutsideBasePath ?? false,
|
|
61
62
|
...options
|
|
@@ -178,7 +179,7 @@ var ExternalOrbitalLoader = class {
|
|
|
178
179
|
* compiler's `embedded.rs` resolves std paths.
|
|
179
180
|
*/
|
|
180
181
|
resolveStdPath(importPath) {
|
|
181
|
-
if (!this.options.stdLibPath) {
|
|
182
|
+
if (!this.options.stdLibPath && this.options.behaviorsLibPaths.length === 0) {
|
|
182
183
|
return {
|
|
183
184
|
success: false,
|
|
184
185
|
error: `Standard library path not configured. Cannot load: ${importPath}`
|
|
@@ -186,36 +187,38 @@ var ExternalOrbitalLoader = class {
|
|
|
186
187
|
}
|
|
187
188
|
const relativePath = importPath.slice(4);
|
|
188
189
|
const name = relativePath.replace(/^behaviors\//, "").replace(/\.orb$/, "");
|
|
189
|
-
const
|
|
190
|
-
const topics = ["core", "agent", "game", "service", "app", "probes"];
|
|
190
|
+
const topics = ["core", "core-variations", "agent", "game", "service", "app", "probes", "marketing"];
|
|
191
191
|
const tiers = ["atoms", "molecules", "organisms"];
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
for (const tier of tiers) {
|
|
201
|
-
candidates.push(
|
|
202
|
-
path.join(normalizedStdLib, "behaviors", "registry", tier, `${name}.orb`)
|
|
203
|
-
);
|
|
192
|
+
const roots = [];
|
|
193
|
+
if (this.options.stdLibPath) roots.push(path.normalize(this.options.stdLibPath));
|
|
194
|
+
for (const p of this.options.behaviorsLibPaths) {
|
|
195
|
+
const norm = path.normalize(p);
|
|
196
|
+
if (!roots.includes(norm)) roots.push(norm);
|
|
204
197
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
198
|
+
let totalCandidates = 0;
|
|
199
|
+
for (const root of roots) {
|
|
200
|
+
const candidates = [];
|
|
201
|
+
for (const topic of topics) {
|
|
202
|
+
for (const tier of tiers) {
|
|
203
|
+
candidates.push(path.join(root, "behaviors", "registry", topic, tier, `${name}.orb`));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const tier of tiers) {
|
|
207
|
+
candidates.push(path.join(root, "behaviors", "registry", tier, `${name}.orb`));
|
|
211
208
|
}
|
|
212
|
-
|
|
213
|
-
|
|
209
|
+
candidates.push(path.join(root, relativePath.endsWith(".orb") ? relativePath : `${relativePath}.orb`));
|
|
210
|
+
totalCandidates += candidates.length;
|
|
211
|
+
for (const candidate of candidates) {
|
|
212
|
+
const normalized = path.normalize(candidate);
|
|
213
|
+
if (!normalized.startsWith(root)) continue;
|
|
214
|
+
if (fs.existsSync(normalized)) {
|
|
215
|
+
return { success: true, data: normalized };
|
|
216
|
+
}
|
|
214
217
|
}
|
|
215
218
|
}
|
|
216
219
|
return {
|
|
217
220
|
success: false,
|
|
218
|
-
error: `std behavior not found in registry: ${importPath} (tried ${
|
|
221
|
+
error: `std behavior not found in registry: ${importPath} (tried ${totalCandidates} locations across ${roots.length} root(s): ${roots.join(", ")})`
|
|
219
222
|
};
|
|
220
223
|
}
|
|
221
224
|
/**
|
|
@@ -340,7 +343,38 @@ function parseImportPath(importPath) {
|
|
|
340
343
|
fragment: importPath.slice(hashIndex + 1)
|
|
341
344
|
};
|
|
342
345
|
}
|
|
346
|
+
function autoDetectBehaviorsLibPaths(stdLibPath) {
|
|
347
|
+
if (!stdLibPath) return [];
|
|
348
|
+
const found = [];
|
|
349
|
+
try {
|
|
350
|
+
let dir = path.normalize(stdLibPath);
|
|
351
|
+
for (let i = 0; i < 10; i++) {
|
|
352
|
+
const parent = path.dirname(dir);
|
|
353
|
+
if (parent === dir) break;
|
|
354
|
+
if (path.basename(parent) === "@almadar" && path.basename(path.dirname(parent)) === "node_modules") {
|
|
355
|
+
const nm = path.dirname(parent);
|
|
356
|
+
const ioPath = path.join(nm, "@almadar-io", "behaviors");
|
|
357
|
+
if (fs.existsSync(path.join(ioPath, "behaviors", "registry"))) found.push(ioPath);
|
|
358
|
+
}
|
|
359
|
+
if (path.basename(parent) === ".pnpm") {
|
|
360
|
+
const pnpmRoot = parent;
|
|
361
|
+
try {
|
|
362
|
+
for (const entry of fs.readdirSync(pnpmRoot)) {
|
|
363
|
+
if (!entry.startsWith("@almadar-io+behaviors@")) continue;
|
|
364
|
+
const ioPath = path.join(pnpmRoot, entry, "node_modules", "@almadar-io", "behaviors");
|
|
365
|
+
if (fs.existsSync(path.join(ioPath, "behaviors", "registry"))) found.push(ioPath);
|
|
366
|
+
}
|
|
367
|
+
} catch {
|
|
368
|
+
}
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
dir = parent;
|
|
372
|
+
}
|
|
373
|
+
} catch {
|
|
374
|
+
}
|
|
375
|
+
return found;
|
|
376
|
+
}
|
|
343
377
|
|
|
344
378
|
export { ExternalOrbitalLoader, ImportChain, LoaderCache, createLoader, parseImportPath };
|
|
345
|
-
//# sourceMappingURL=external-loader-
|
|
346
|
-
//# sourceMappingURL=external-loader-
|
|
379
|
+
//# sourceMappingURL=external-loader-IN246DQM.js.map
|
|
380
|
+
//# sourceMappingURL=external-loader-IN246DQM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/loader/external-loader.ts"],"names":[],"mappings":"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","file":"external-loader-IN246DQM.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 // Default: treat as relative to base path\n return this.resolveRelativePath(`./${importPath}`, fromPath);\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 // 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.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { B as BindingContext,
|
|
2
|
-
export {
|
|
3
|
-
import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult,
|
|
4
|
-
export {
|
|
1
|
+
import { B as BindingContext, d as EvaluationContextExtensions, P as PatternProps, b as EffectHandlers, a as EffectContext, f as ExecutionEnvironment, c as EffectResult, T as TraitDefinition } from './types-CjvQG_33.js';
|
|
2
|
+
export { E as Effect, e as EventListener, H as HANDLER_MANIFEST, I as IEventBus, R as RuntimeConfig, g as RuntimeEvent, h as TraitState, i as TransitionObserver, j as TransitionResult, U as Unsubscribe } from './types-CjvQG_33.js';
|
|
3
|
+
import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, h as LoadedSchema, g as LoadedOrbital } from './OrbitalServerRuntime-CzUrdroI.js';
|
|
4
|
+
export { d as EntitySharingMap, e as EventBus, f as EventNamespaceMap, O as OrbitalEventRequest, j as OrbitalEventResponse, l as OrbitalServerRuntimeConfig, P as PreprocessOptions, m as PreprocessResult, n as PreprocessedSchema, o as ProcessEventOptions, R as RegisteredOrbital, p as RuntimeOrbital, q as RuntimeOrbitalSchema, r as RuntimeTrait, t as StateMachineManager, u as collectDeclaredConfigDefaults, v as createInitialTraitState, x as findInitialState, y as findTransition, z as getIsolatedCollectionName, A as getNamespacedEvent, B as isBrowser, D as isElectron, F as isNamespacedEvent, G as isNode, H as normalizeEventKey, J as parseNamespacedEvent, K as preprocessSchema, M as processEvent } from './OrbitalServerRuntime-CzUrdroI.js';
|
|
5
5
|
import { EvaluationContext } from '@almadar/evaluator';
|
|
6
6
|
export { EvaluationContext, createMinimalContext } from '@almadar/evaluator';
|
|
7
7
|
import { EventPayload, EntityRow, PayloadField, OrbitalDefinition, OrbitalSchema } from '@almadar/core';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EffectExecutor, createContextFromBindings } from './chunk-
|
|
2
|
-
export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, buildEmitsFromTraits, collectDeclaredConfigDefaults, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createMockPersistence, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, formatPayloadValidationError, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent, validateEventPayload, validatePayloadShapes } from './chunk-
|
|
1
|
+
import { EffectExecutor, createContextFromBindings } from './chunk-YJ6RSKMU.js';
|
|
2
|
+
export { EffectExecutor, EventBus, HANDLER_MANIFEST, InMemoryPersistence, MockPersistenceAdapter, StateMachineManager, buildEmitsFromTraits, collectDeclaredConfigDefaults, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createMockPersistence, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, formatPayloadValidationError, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent, validateEventPayload, validatePayloadShapes } from './chunk-YJ6RSKMU.js';
|
|
3
3
|
import { __export } from './chunk-PZ5AY32C.js';
|
|
4
4
|
import { createLogger } from '@almadar/logger';
|
|
5
5
|
import { evaluate } from '@almadar/evaluator';
|
|
@@ -346,4 +346,4 @@ interface TransitionObserver {
|
|
|
346
346
|
*/
|
|
347
347
|
declare const HANDLER_MANIFEST: Record<ExecutionEnvironment, string[]>;
|
|
348
348
|
|
|
349
|
-
export { type BindingContext as B, type ConfigContext as C, type
|
|
349
|
+
export { type BindingContext as B, type ConfigContext as C, type Effect as E, HANDLER_MANIFEST as H, type IEventBus as I, type PatternProps as P, type RuntimeConfig as R, type TraitDefinition as T, type Unsubscribe as U, type EffectContext as a, type EffectHandlers as b, type EffectResult as c, type EvaluationContextExtensions as d, type EventListener as e, type ExecutionEnvironment as f, type RuntimeEvent as g, type TraitState as h, type TransitionObserver as i, type TransitionResult as j };
|