@almadar/runtime 3.1.4 → 3.2.1

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.
@@ -1,5 +1,5 @@
1
1
  import { Router } from 'express';
2
- import { I as IEventBus, g as RuntimeEvent, f as EventListener, U as Unsubscribe, T as TraitDefinition, R as RuntimeConfig, i as TransitionObserver, h as TraitState, j as TransitionResult, E as EvaluationContextExtensions, a as EffectHandlers } from './types-CM6txTNy.js';
2
+ import { I as IEventBus, g as RuntimeEvent, f as EventListener, U as Unsubscribe, T as TraitDefinition, R as RuntimeConfig, i as TransitionObserver, h as TraitState, j as TransitionResult, E as EvaluationContextExtensions, a as EffectHandlers } from './types-B8OfRFfV.js';
3
3
  import { EventPayload, EntityRow, OrbitalSchema, Orbital, Trait, OrbitalDefinition, Entity, TraitTick } from '@almadar/core';
4
4
 
5
5
  /**
@@ -1,4 +1,4 @@
1
1
  import 'express';
2
- export { v as EffectResult, L as LoaderConfig, w as LocalPersistenceAdapter, O as OrbitalEventRequest, c as OrbitalEventResponse, x as OrbitalServerRuntime, d as OrbitalServerRuntimeConfig, P as PersistenceAdapter, R as RegisteredOrbital, i as RuntimeOrbital, j as RuntimeOrbitalSchema, k as RuntimeTrait, y as RuntimeTraitTick, z as createOrbitalServerRuntime } from './OrbitalServerRuntime-DWJYcIJG.js';
3
- import './types-CM6txTNy.js';
2
+ export { v as EffectResult, L as LoaderConfig, w as LocalPersistenceAdapter, O as OrbitalEventRequest, c as OrbitalEventResponse, x as OrbitalServerRuntime, d as OrbitalServerRuntimeConfig, P as PersistenceAdapter, R as RegisteredOrbital, i as RuntimeOrbital, j as RuntimeOrbitalSchema, k as RuntimeTrait, y as RuntimeTraitTick, z as createOrbitalServerRuntime } from './OrbitalServerRuntime-CQsVhY4Y.js';
3
+ import './types-B8OfRFfV.js';
4
4
  import '@almadar/core';
@@ -1,4 +1,4 @@
1
- import { EventBus, createUnifiedLoader, preprocessSchema, StateMachineManager, createContextFromBindings, EffectExecutor } from './chunk-6PAKTVTR.js';
1
+ import { EventBus, createUnifiedLoader, preprocessSchema, StateMachineManager, createContextFromBindings, EffectExecutor } from './chunk-PXASRZKG.js';
2
2
  import './chunk-PZ5AY32C.js';
3
3
  import { Router } from 'express';
4
4
  import * as fs from 'fs';
@@ -429,14 +429,16 @@ function createOsHandlers(ctx) {
429
429
  ctx.emitEvent(eventType, payload);
430
430
  }
431
431
  }
432
+ const resolveOnMessage = (emit, fallback) => emit?.on_message ?? fallback;
432
433
  const handlers = {
433
- osWatchFiles: (glob, options) => {
434
+ osWatchFiles: (glob, options, emit) => {
434
435
  const recursive = options.recursive !== false;
435
436
  const pattern = globToRegex(glob);
437
+ const eventName = resolveOnMessage(emit, "OS_FILE_MODIFIED");
436
438
  try {
437
439
  const watcher = fs.watch(cwd, { recursive }, (_event, filename) => {
438
440
  if (filename && pattern.test(filename)) {
439
- debouncedEmit("OS_FILE_MODIFIED", {
441
+ debouncedEmit(eventName, {
440
442
  file: filename,
441
443
  glob,
442
444
  cwd
@@ -445,12 +447,19 @@ function createOsHandlers(ctx) {
445
447
  });
446
448
  watchers.push(watcher);
447
449
  } catch (err) {
450
+ if (emit?.failure) {
451
+ ctx.emitEvent(emit.failure, {
452
+ error: err instanceof Error ? err.message : String(err)
453
+ });
454
+ }
448
455
  console.warn("[os/watch-files] Failed to start watcher:", err);
449
456
  }
450
457
  },
451
- osWatchProcess: (name, subcommand) => {
458
+ osWatchProcess: (name, subcommand, emit) => {
452
459
  const searchTerm = subcommand ? `${name} ${subcommand}` : name;
453
460
  let wasRunning = false;
461
+ const startEvent = resolveOnMessage(emit, "OS_PROCESS_STARTED");
462
+ const exitEvent = resolveOnMessage(emit, "OS_PROCESS_EXITED");
454
463
  const interval = setInterval(() => {
455
464
  let isRunning = false;
456
465
  try {
@@ -463,20 +472,22 @@ function createOsHandlers(ctx) {
463
472
  isRunning = false;
464
473
  }
465
474
  if (isRunning && !wasRunning) {
466
- debouncedEmit("OS_PROCESS_STARTED", { process: name, subcommand: subcommand ?? null });
475
+ debouncedEmit(startEvent, { process: name, subcommand: subcommand ?? null });
467
476
  } else if (!isRunning && wasRunning) {
468
- debouncedEmit("OS_PROCESS_EXITED", { process: name, subcommand: subcommand ?? null });
477
+ debouncedEmit(exitEvent, { process: name, subcommand: subcommand ?? null });
469
478
  }
470
479
  wasRunning = isRunning;
471
480
  }, 2e3);
472
481
  intervals.push(interval);
473
482
  },
474
- osWatchPort: (port, protocol) => {
483
+ osWatchPort: (port, protocol, emit) => {
475
484
  if (protocol !== "tcp") {
476
485
  console.warn(`[os/watch-port] Only TCP is supported, got: ${protocol}`);
477
486
  return;
478
487
  }
479
488
  let wasOpen = false;
489
+ const openEvent = resolveOnMessage(emit, "OS_PORT_OPENED");
490
+ const closeEvent = resolveOnMessage(emit, "OS_PORT_CLOSED");
480
491
  const interval = setInterval(() => {
481
492
  const socket = new net.Socket();
482
493
  socket.setTimeout(1e3);
@@ -484,28 +495,28 @@ function createOsHandlers(ctx) {
484
495
  socket.destroy();
485
496
  if (!wasOpen) {
486
497
  wasOpen = true;
487
- debouncedEmit("OS_PORT_OPENED", { port, protocol });
498
+ debouncedEmit(openEvent, { port, protocol });
488
499
  }
489
500
  });
490
501
  socket.on("error", () => {
491
502
  socket.destroy();
492
503
  if (wasOpen) {
493
504
  wasOpen = false;
494
- debouncedEmit("OS_PORT_CLOSED", { port, protocol });
505
+ debouncedEmit(closeEvent, { port, protocol });
495
506
  }
496
507
  });
497
508
  socket.on("timeout", () => {
498
509
  socket.destroy();
499
510
  if (wasOpen) {
500
511
  wasOpen = false;
501
- debouncedEmit("OS_PORT_CLOSED", { port, protocol });
512
+ debouncedEmit(closeEvent, { port, protocol });
502
513
  }
503
514
  });
504
515
  socket.connect(port, "127.0.0.1");
505
516
  }, 3e3);
506
517
  intervals.push(interval);
507
518
  },
508
- osWatchHttp: (urlPattern, method) => {
519
+ osWatchHttp: (urlPattern, method, _emit) => {
509
520
  if (!httpWatchActive) {
510
521
  httpWatchActive = true;
511
522
  console.warn(
@@ -513,21 +524,27 @@ function createOsHandlers(ctx) {
513
524
  );
514
525
  }
515
526
  },
516
- osWatchCron: (expression) => {
527
+ osWatchCron: (expression, emit) => {
517
528
  let fields;
518
529
  try {
519
530
  fields = parseCron(expression);
520
531
  } catch (err) {
532
+ if (emit?.failure) {
533
+ ctx.emitEvent(emit.failure, {
534
+ error: err instanceof Error ? err.message : String(err)
535
+ });
536
+ }
521
537
  console.warn("[os/watch-cron] Invalid expression:", err);
522
538
  return;
523
539
  }
524
540
  let lastFired = -1;
541
+ const eventName = resolveOnMessage(emit, "OS_CRON_FIRE");
525
542
  const interval = setInterval(() => {
526
543
  const now = /* @__PURE__ */ new Date();
527
544
  const minuteKey = now.getFullYear() * 1e8 + now.getMonth() * 1e6 + now.getDate() * 1e4 + now.getHours() * 100 + now.getMinutes();
528
545
  if (minuteKey !== lastFired && cronMatches(fields, now)) {
529
546
  lastFired = minuteKey;
530
- debouncedEmit("OS_CRON_FIRE", {
547
+ debouncedEmit(eventName, {
531
548
  expression,
532
549
  firedAt: now.toISOString()
533
550
  });
@@ -535,26 +552,33 @@ function createOsHandlers(ctx) {
535
552
  }, 1e3);
536
553
  intervals.push(interval);
537
554
  },
538
- osWatchSignal: (signal) => {
555
+ osWatchSignal: (signal, emit) => {
539
556
  const sig = signal.toUpperCase();
540
557
  const handler = () => {
541
- debouncedEmit(`OS_SIGNAL_${sig}`, { signal: sig });
558
+ const eventName = emit?.on_message ?? `OS_SIGNAL_${sig}`;
559
+ debouncedEmit(eventName, { signal: sig });
542
560
  };
543
561
  try {
544
562
  process.on(sig, handler);
545
563
  signalHandlers.push({ signal: sig, handler });
546
564
  } catch (err) {
565
+ if (emit?.failure) {
566
+ ctx.emitEvent(emit.failure, {
567
+ error: err instanceof Error ? err.message : String(err)
568
+ });
569
+ }
547
570
  console.warn(`[os/watch-signal] Cannot listen for ${sig}:`, err);
548
571
  }
549
572
  },
550
- osWatchEnv: (variable) => {
573
+ osWatchEnv: (variable, emit) => {
551
574
  let lastValue = process.env[variable];
575
+ const eventName = resolveOnMessage(emit, "OS_ENV_CHANGED");
552
576
  const interval = setInterval(() => {
553
577
  const current = process.env[variable];
554
578
  if (current !== lastValue) {
555
579
  const previous = lastValue;
556
580
  lastValue = current;
557
- debouncedEmit("OS_ENV_CHANGED", {
581
+ debouncedEmit(eventName, {
558
582
  variable,
559
583
  value: current ?? null,
560
584
  previous: previous ?? null