@almadar/runtime 6.28.0 → 6.29.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-DCkk0alk.d.ts → OrbitalServerRuntime-BkaBvI6-.d.ts} +6 -6
- package/dist/OrbitalServerRuntime.d.ts +2 -2
- package/dist/OrbitalServerRuntime.js +3 -3
- package/dist/ServerBridge.d.ts +1 -1
- package/dist/{chunk-FWBY567U.js → chunk-6YDQGA6X.js} +4 -4
- package/dist/chunk-6YDQGA6X.js.map +1 -0
- package/dist/{createAgentSubstrateHandlers-4JMLGDZQ.js → createAgentSubstrateHandlers-WZCHKGU6.js} +2 -2
- package/dist/createAgentSubstrateHandlers-WZCHKGU6.js.map +1 -0
- package/dist/createOsHandlers.d.ts +1 -1
- package/dist/{external-loader-YF6A3256.js → external-loader-C2LO5XG3.js} +56 -2
- package/dist/external-loader-C2LO5XG3.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/{types-CguyGOms.d.ts → types-D-9feVsj.d.ts} +8 -8
- package/package.json +1 -1
- package/dist/chunk-FWBY567U.js.map +0 -1
- package/dist/createAgentSubstrateHandlers-4JMLGDZQ.js.map +0 -1
- package/dist/external-loader-YF6A3256.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createAgentSubstrateHandlers.ts"],"names":[],"mappings":"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","file":"createAgentSubstrateHandlers-4JMLGDZQ.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 } from '@almadar/core';\n\nconst log = createLogger('almadar:runtime:substrate-handlers');\n\nexport interface SubstrateServices {\n composeAll?: (config: { appName: string; orbitals: unknown[]; layoutStrategy?: string }) => Promise<ServiceCallResult>;\n composeChildren?: (parentName: string, children: unknown[]) => Promise<ServiceCallResult>;\n instantiate?: (parentName: string, behavior: string, params?: unknown) => Promise<ServiceCallResult>;\n call?: (behavior: string, method: string, params?: unknown) => 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 const result = await ctx.services.composeAll(config);\n ctx.emitEvent('COMPOSED_ALL', { appName: config.appName, orbitalCount: config.orbitals.length });\n return result;\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 const result = await ctx.services.composeChildren(parentName, children);\n ctx.emitEvent('COMPOSED_CHILDREN', { parentName, childCount: children.length });\n return result;\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 const result = await ctx.services.instantiate(parentName, behavior, params);\n ctx.emitEvent('BEHAVIOR_INSTANTIATED', { parentName, behavior });\n return result;\n },\n\n substrateCall: async (behavior, method) => {\n if (!ctx.services.call) {\n log.warn('call service not registered');\n return null;\n }\n const result = await ctx.services.call(behavior, method);\n ctx.emitEvent('BEHAVIOR_CALLED', { behavior, method });\n return result;\n },\n\n substrateValidate: async (orbitalName) => {\n if (!ctx.services.validate) {\n log.warn('validate service not registered');\n return null;\n }\n const result = await ctx.services.validate(orbitalName);\n ctx.emitEvent('VALIDATED', { orbitalName });\n return result;\n },\n\n substrateEmitBody: async (orbitalName) => {\n if (!ctx.services.emitBody) {\n log.warn('emit-body service not registered');\n return null;\n }\n const result = await ctx.services.emitBody(orbitalName, '');\n ctx.emitEvent('LOLO_EMITTED', { orbitalName });\n return result;\n },\n };\n\n return {\n handlers,\n cleanup: () => {},\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader/external-loader.ts"],"names":[],"mappings":"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","file":"external-loader-YF6A3256.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 // 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"]}
|