@almadar/runtime 3.3.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -168,6 +168,13 @@ var ExternalOrbitalLoader = class {
168
168
  }
169
169
  /**
170
170
  * Resolve a standard library path.
171
+ *
172
+ * The std registry uses a tiered layout under
173
+ * `<stdLibPath>/behaviors/registry/{atoms,molecules,organisms}/<name>.orb`.
174
+ * For `std/behaviors/<name>` imports, try each tier in order and return
175
+ * the first one that exists on disk. This matches how the Rust compiler's
176
+ * `embedded.rs` resolves std paths — one registry, three tiers, flat
177
+ * import name.
171
178
  */
172
179
  resolveStdPath(importPath) {
173
180
  if (!this.options.stdLibPath) {
@@ -177,19 +184,27 @@ var ExternalOrbitalLoader = class {
177
184
  };
178
185
  }
179
186
  const relativePath = importPath.slice(4);
180
- let absolutePath = path.join(this.options.stdLibPath, relativePath);
181
- if (!absolutePath.endsWith(".orb")) {
182
- absolutePath += ".orb";
183
- }
184
- const normalizedPath = path.normalize(absolutePath);
187
+ const name = relativePath.replace(/^behaviors\//, "").replace(/\.orb$/, "");
185
188
  const normalizedStdLib = path.normalize(this.options.stdLibPath);
186
- if (!normalizedPath.startsWith(normalizedStdLib)) {
187
- return {
188
- success: false,
189
- error: `Path traversal outside std library: ${importPath}`
190
- };
189
+ const tiers = ["atoms", "molecules", "organisms"];
190
+ const candidates = tiers.map(
191
+ (tier) => path.join(normalizedStdLib, "behaviors", "registry", tier, `${name}.orb`)
192
+ );
193
+ const legacyPath = path.join(normalizedStdLib, relativePath.endsWith(".orb") ? relativePath : `${relativePath}.orb`);
194
+ candidates.push(legacyPath);
195
+ for (const candidate of candidates) {
196
+ const normalized = path.normalize(candidate);
197
+ if (!normalized.startsWith(normalizedStdLib)) {
198
+ continue;
199
+ }
200
+ if (fs.existsSync(normalized)) {
201
+ return { success: true, data: normalized };
202
+ }
191
203
  }
192
- return { success: true, data: absolutePath };
204
+ return {
205
+ success: false,
206
+ error: `std behavior not found in registry: ${importPath} (tried ${candidates.length} locations under ${normalizedStdLib})`
207
+ };
193
208
  }
194
209
  /**
195
210
  * Resolve a scoped package path.
@@ -315,5 +330,5 @@ function parseImportPath(importPath) {
315
330
  }
316
331
 
317
332
  export { ExternalOrbitalLoader, ImportChain, LoaderCache, createLoader, parseImportPath };
318
- //# sourceMappingURL=external-loader-UBJ6VRW5.js.map
319
- //# sourceMappingURL=external-loader-UBJ6VRW5.js.map
333
+ //# sourceMappingURL=external-loader-22F5V5NN.js.map
334
+ //# sourceMappingURL=external-loader-22F5V5NN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/loader/external-loader.ts"],"names":[],"mappings":"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","file":"external-loader-22F5V5NN.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 /** 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 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 tiered layout under\n * `<stdLibPath>/behaviors/registry/{atoms,molecules,organisms}/<name>.orb`.\n * For `std/behaviors/<name>` imports, try each tier in order and return\n * the first one that exists on disk. This matches how the Rust compiler's\n * `embedded.rs` resolves std paths — one registry, three tiers, flat\n * import name.\n */\n private resolveStdPath(importPath: string): LoadResult<string> {\n if (!this.options.stdLibPath) {\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 // `relativePath` shape is `behaviors/<name>` or `behaviors/<name>.orb`.\n const relativePath = importPath.slice(4); // strip \"std/\"\n const name = relativePath\n .replace(/^behaviors\\//, \"\")\n .replace(/\\.orb$/, \"\");\n\n const normalizedStdLib = path.normalize(this.options.stdLibPath);\n const tiers = [\"atoms\", \"molecules\", \"organisms\"] as const;\n const candidates = tiers.map((tier) =>\n path.join(normalizedStdLib, \"behaviors\", \"registry\", tier, `${name}.orb`),\n );\n\n // Back-compat: if the caller pointed stdLibPath at something older (no\n // tiered registry), also try the legacy flat layout\n // `<stdLibPath>/behaviors/<name>.orb`.\n const legacyPath = path.join(normalizedStdLib, relativePath.endsWith(\".orb\") ? relativePath : `${relativePath}.orb`);\n candidates.push(legacyPath);\n\n for (const candidate of candidates) {\n const normalized = path.normalize(candidate);\n // Validate within stdLib (path traversal guard)\n if (!normalized.startsWith(normalizedStdLib)) {\n continue;\n }\n if (fs.existsSync(normalized)) {\n return { success: true, data: normalized };\n }\n }\n\n return {\n success: false,\n error: `std behavior not found in registry: ${importPath} (tried ${candidates.length} locations under ${normalizedStdLib})`,\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"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { B as BindingContext, E as EvaluationContextExtensions, P as PatternProps, a as EffectHandlers, b as EffectContext, c as ExecutionEnvironment, d as EffectResult, T as TraitDefinition } from './types-B8OfRFfV.js';
2
- export { e as Effect, f 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-B8OfRFfV.js';
3
- import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital } from './OrbitalServerRuntime-DMRvEfcT.js';
4
- export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, O as OrbitalEventRequest, e as OrbitalEventResponse, f as OrbitalServerRuntimeConfig, P as PersistenceAdapter, g as PreprocessOptions, h as PreprocessResult, i as PreprocessedSchema, j as ProcessEventOptions, R as RegisteredOrbital, k as RuntimeOrbital, l as RuntimeOrbitalSchema, m as RuntimeTrait, n as StateMachineManager, o as createInitialTraitState, p as findInitialState, q as findTransition, r as getIsolatedCollectionName, s as getNamespacedEvent, t as isBrowser, u as isElectron, v as isNamespacedEvent, w as isNode, x as normalizeEventKey, y as parseNamespacedEvent, z as preprocessSchema, A as processEvent } from './OrbitalServerRuntime-DMRvEfcT.js';
1
+ import { B as BindingContext, E as EvaluationContextExtensions, P as PatternProps, a as EffectHandlers, b as EffectContext, c as ExecutionEnvironment, d as EffectResult, T as TraitDefinition } from './types-CVSBlnzV.js';
2
+ export { e as Effect, f 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-CVSBlnzV.js';
3
+ import { U as UnifiedLoaderOptions, S as SchemaLoader, I as ImportChainLike, L as LoadResult, a as LoadedSchema, b as LoadedOrbital } from './OrbitalServerRuntime-DXMHHVZI.js';
4
+ export { E as EntitySharingMap, c as EventBus, d as EventNamespaceMap, O as OrbitalEventRequest, e as OrbitalEventResponse, f as OrbitalServerRuntimeConfig, P as PersistenceAdapter, g as PreprocessOptions, h as PreprocessResult, i as PreprocessedSchema, j as ProcessEventOptions, R as RegisteredOrbital, k as RuntimeOrbital, l as RuntimeOrbitalSchema, m as RuntimeTrait, n as StateMachineManager, o as createInitialTraitState, p as findInitialState, q as findTransition, r as getIsolatedCollectionName, s as getNamespacedEvent, t as isBrowser, u as isElectron, v as isNamespacedEvent, w as isNode, x as normalizeEventKey, y as parseNamespacedEvent, z as preprocessSchema, A as processEvent } from './OrbitalServerRuntime-DXMHHVZI.js';
5
5
  import { EvaluationContext } from '@almadar/evaluator';
6
6
  export { EvaluationContext, createMinimalContext } from '@almadar/evaluator';
7
7
  import { EventPayload, EntityRow, OrbitalDefinition, OrbitalSchema } from '@almadar/core';
@@ -290,6 +290,8 @@ declare class EffectExecutor {
290
290
  */
291
291
  executeWithResults(effects: unknown[]): Promise<EffectResult[]>;
292
292
  private extractEmitConfig;
293
+ /** Build the source metadata stamp for an emit fired from this trait. */
294
+ private sourceStamp;
293
295
  private emitSuccess;
294
296
  private emitFailure;
295
297
  /**
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { EffectExecutor, EventBus, HANDLER_MANIFEST, StateMachineManager, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent } from './chunk-II3JSETH.js';
1
+ export { EffectExecutor, EventBus, HANDLER_MANIFEST, StateMachineManager, containsBindings, createContextFromBindings, createInitialTraitState, createMinimalContext, createTestExecutor, createUnifiedLoader, extractBindings, findInitialState, findTransition, getIsolatedCollectionName, getNamespacedEvent, interpolateProps, interpolateValue, isBrowser, isElectron, isNamespacedEvent, isNode, normalizeEventKey, parseNamespacedEvent, preprocessSchema, processEvent } from './chunk-Z72NLOSF.js';
2
2
  import { __export } from './chunk-PZ5AY32C.js';
3
3
  import { isInlineTrait } from '@almadar/core';
4
4
 
@@ -115,8 +115,16 @@ interface TraitDefinition {
115
115
  * Server: Express, database, integrators
116
116
  */
117
117
  interface EffectHandlers {
118
- /** Emit an event to the event bus */
119
- emit: (event: string, payload?: EventPayload) => void;
118
+ /**
119
+ * Emit an event to the event bus.
120
+ *
121
+ * `source` carries the emitter's identity (orbital + trait) so that
122
+ * source-scoped listeners (`TraitName EVENT -> TRIGGER` and
123
+ * `Orbital.TraitName EVENT -> TRIGGER` in .lolo) can filter incoming
124
+ * events by their originating trait. Omitted when the emit is
125
+ * synthesized by a non-trait context (e.g. test harness).
126
+ */
127
+ emit: (event: string, payload?: EventPayload, source?: RuntimeEvent['source']) => void;
120
128
  /** Persist data (create/update/delete/batch) */
121
129
  persist: (action: 'create' | 'update' | 'delete' | 'batch', entityType: string, data?: EntityRow) => Promise<void>;
122
130
  /** Set a field value on an entity */
@@ -235,6 +243,11 @@ type Effect = [string, ...unknown[]];
235
243
  interface EffectContext {
236
244
  /** Trait name */
237
245
  traitName: string;
246
+ /** Orbital that owns the firing trait. Used to stamp the source
247
+ * metadata on emits so source-scoped listens (`TraitName EVENT` for
248
+ * intra-orbital, `Orbital.TraitName EVENT` for cross-orbital) can
249
+ * filter by emitter identity. */
250
+ orbitalName?: string;
238
251
  /** Current state */
239
252
  state: string;
240
253
  /** Transition description */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/runtime",
3
- "version": "3.3.0",
3
+ "version": "4.1.0",
4
4
  "description": "Interpreted runtime for Almadar orbital applications (OrbitalServerRuntime)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -36,24 +36,24 @@
36
36
  "access": "public"
37
37
  },
38
38
  "dependencies": {
39
+ "@almadar/core": ">=5.0.0",
39
40
  "@almadar/evaluator": ">=2.8.1",
40
- "@almadar/std": ">=6.5.0",
41
- "@almadar/core": ">=4.8.2",
41
+ "@almadar/std": "7.2.0",
42
42
  "@faker-js/faker": "^9.3.0"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "express": "^4.0.0"
46
46
  },
47
47
  "devDependencies": {
48
+ "@almadar/eslint-plugin": ">=2.7.0",
48
49
  "@types/express": "^5.0.0",
49
50
  "@types/node": "^20.0.0",
51
+ "@typescript-eslint/parser": "8.56.0",
52
+ "eslint": "10.0.0",
50
53
  "express": "^4.21.0",
51
54
  "tsup": "^8.0.0",
52
55
  "typescript": "^5.7.0",
53
- "vitest": "^2.1.0",
54
- "eslint": "10.0.0",
55
- "@typescript-eslint/parser": "8.56.0",
56
- "@almadar/eslint-plugin": ">=2.7.0"
56
+ "vitest": "^2.1.0"
57
57
  },
58
58
  "repository": {
59
59
  "type": "git",