@bluelibs/runner 4.7.0 → 4.8.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.
Files changed (49) hide show
  1. package/AI.md +88 -95
  2. package/README.md +205 -144
  3. package/dist/browser/index.cjs +739 -487
  4. package/dist/browser/index.cjs.map +1 -1
  5. package/dist/browser/index.mjs +736 -487
  6. package/dist/browser/index.mjs.map +1 -1
  7. package/dist/define.d.ts +1 -1
  8. package/dist/definers/builders/asyncContext.d.ts +11 -0
  9. package/dist/definers/builders/error.d.ts +13 -0
  10. package/dist/definers/builders/middleware.d.ts +3 -3
  11. package/dist/definers/defineAsyncContext.d.ts +15 -0
  12. package/dist/definers/defineError.d.ts +26 -0
  13. package/dist/definers/tools.d.ts +6 -0
  14. package/dist/edge/index.cjs +739 -487
  15. package/dist/edge/index.cjs.map +1 -1
  16. package/dist/edge/index.mjs +736 -487
  17. package/dist/edge/index.mjs.map +1 -1
  18. package/dist/errors.d.ts +60 -102
  19. package/dist/globals/debug.d.ts +10 -0
  20. package/dist/globals/globalMiddleware.d.ts +3 -3
  21. package/dist/globals/middleware/requireContext.middleware.d.ts +2 -2
  22. package/dist/globals/resources/tunnel/protocol.d.ts +8 -1
  23. package/dist/globals/resources/tunnel/serializer.d.ts +1 -1
  24. package/dist/globals/types.d.ts +1 -0
  25. package/dist/http-client.d.ts +4 -0
  26. package/dist/http-fetch-tunnel.resource.d.ts +11 -0
  27. package/dist/index.d.ts +14 -5
  28. package/dist/models/Store.d.ts +6 -2
  29. package/dist/models/StoreRegistry.d.ts +6 -0
  30. package/dist/node/exposure/httpResponse.d.ts +1 -1
  31. package/dist/node/exposure/requestContext.d.ts +1 -1
  32. package/dist/node/{mixed-http-client.node.d.ts → http-mixed-client.d.ts} +1 -1
  33. package/dist/node/http-smart-client.model.d.ts +2 -0
  34. package/dist/node/node.cjs +918 -4296
  35. package/dist/node/node.cjs.map +1 -1
  36. package/dist/node/node.mjs +914 -4296
  37. package/dist/node/node.mjs.map +1 -1
  38. package/dist/types/asyncContext.d.ts +39 -0
  39. package/dist/types/error.d.ts +34 -0
  40. package/dist/types/runner.d.ts +13 -0
  41. package/dist/types/symbols.d.ts +6 -0
  42. package/dist/types/utilities.d.ts +6 -4
  43. package/dist/universal/index.cjs +739 -487
  44. package/dist/universal/index.cjs.map +1 -1
  45. package/dist/universal/index.mjs +736 -487
  46. package/dist/universal/index.mjs.map +1 -1
  47. package/dist/utils/detectRunnerMode.d.ts +9 -0
  48. package/package.json +1 -1
  49. package/dist/context.d.ts +0 -31
@@ -18,8 +18,11 @@ var __export = (target, all) => {
18
18
  // src/defs.ts
19
19
  var defs_exports = {};
20
20
  __export(defs_exports, {
21
+ RunnerMode: () => RunnerMode,
21
22
  isOneOf: () => isOneOf,
22
23
  onAnyOf: () => onAnyOf,
24
+ symbolAsyncContext: () => symbolAsyncContext,
25
+ symbolError: () => symbolError,
23
26
  symbolEvent: () => symbolEvent,
24
27
  symbolFilePath: () => symbolFilePath,
25
28
  symbolHook: () => symbolHook,
@@ -34,6 +37,7 @@ __export(defs_exports, {
34
37
  symbolTagConfigured: () => symbolTagConfigured,
35
38
  symbolTask: () => symbolTask,
36
39
  symbolTaskMiddleware: () => symbolTaskMiddleware,
40
+ symbolTunneledBy: () => symbolTunneledBy,
37
41
  symbolTunneledTask: () => symbolTunneledTask
38
42
  });
39
43
 
@@ -47,6 +51,7 @@ var symbolResourceWithConfig = Symbol.for(
47
51
  "runner.resourceWithConfig"
48
52
  );
49
53
  var symbolEvent = Symbol.for("runner.event");
54
+ var symbolError = Symbol.for("runner.error");
50
55
  var symbolMiddleware = Symbol.for("runner.middleware");
51
56
  var symbolTaskMiddleware = Symbol.for(
52
57
  "runner.taskMiddleware"
@@ -60,6 +65,9 @@ var symbolMiddlewareConfigured = Symbol.for(
60
65
  var symbolTunneledTask = Symbol.for(
61
66
  "runner.tunneledTask"
62
67
  );
68
+ var symbolTunneledBy = Symbol.for(
69
+ "runner.tunneledBy"
70
+ );
63
71
  var symbolHook = Symbol.for("runner.hook");
64
72
  var symbolTag = Symbol.for("runner.tag");
65
73
  var symbolTagConfigured = Symbol.for(
@@ -69,6 +77,9 @@ var symbolOptionalDependency = Symbol.for(
69
77
  "runner.optionalDependency"
70
78
  );
71
79
  var symbolFilePath = Symbol.for("runner.filePath");
80
+ var symbolAsyncContext = Symbol.for(
81
+ "runner.asyncContext"
82
+ );
72
83
 
73
84
  // src/types/event.ts
74
85
  function onAnyOf(...defs) {
@@ -79,6 +90,14 @@ function isOneOf(emission, defs) {
79
90
  return defs.some((d) => d.id === emission.id);
80
91
  }
81
92
  __name(isOneOf, "isOneOf");
93
+
94
+ // src/types/runner.ts
95
+ var RunnerMode = /* @__PURE__ */ ((RunnerMode2) => {
96
+ RunnerMode2["TEST"] = "test";
97
+ RunnerMode2["DEV"] = "dev";
98
+ RunnerMode2["PROD"] = "prod";
99
+ return RunnerMode2;
100
+ })(RunnerMode || {});
82
101
  var cacheFactoryTask = defineTask({
83
102
  id: "globals.tasks.cacheFactory",
84
103
  run: /* @__PURE__ */ __name(async (options) => {
@@ -223,29 +242,126 @@ __name(defineHook, "defineHook");
223
242
  // src/errors.ts
224
243
  var errors_exports = {};
225
244
  __export(errors_exports, {
226
- CancellationError: () => CancellationError,
227
- CircularDependenciesError: () => CircularDependenciesError,
228
- ContextError: () => ContextError,
229
- DependencyNotFoundError: () => DependencyNotFoundError,
230
- DuplicateRegistrationError: () => DuplicateRegistrationError,
231
- EventCycleError: () => EventCycleError,
232
- EventEmissionCycleError: () => EventEmissionCycleError,
233
- EventNotFoundError: () => EventNotFoundError,
234
- LockedError: () => LockedError,
235
- MiddlewareNotRegisteredError: () => MiddlewareNotRegisteredError,
236
- PlatformUnsupportedFunction: () => PlatformUnsupportedFunction,
237
- ResourceNotFoundError: () => ResourceNotFoundError,
238
- RuntimeError: () => RuntimeError,
239
- StoreAlreadyInitializedError: () => StoreAlreadyInitializedError,
240
- TagNotFoundError: () => TagNotFoundError,
241
- UnknownItemTypeError: () => UnknownItemTypeError,
242
- ValidationError: () => ValidationError,
243
- isCancellationError: () => isCancellationError
245
+ cancellationError: () => cancellationError,
246
+ circularDependenciesError: () => circularDependenciesError,
247
+ contextError: () => contextError,
248
+ dependencyNotFoundError: () => dependencyNotFoundError,
249
+ duplicateRegistrationError: () => duplicateRegistrationError,
250
+ eventCycleError: () => eventCycleError,
251
+ eventEmissionCycleError: () => eventEmissionCycleError,
252
+ eventNotFoundError: () => eventNotFoundError,
253
+ isCancellationError: () => isCancellationError,
254
+ lockedError: () => lockedError,
255
+ middlewareNotRegisteredError: () => middlewareNotRegisteredError,
256
+ platformUnsupportedFunctionError: () => platformUnsupportedFunctionError,
257
+ resourceNotFoundError: () => resourceNotFoundError,
258
+ storeAlreadyInitializedError: () => storeAlreadyInitializedError,
259
+ tagNotFoundError: () => tagNotFoundError,
260
+ tunnelOwnershipConflictError: () => tunnelOwnershipConflictError,
261
+ unknownItemTypeError: () => unknownItemTypeError,
262
+ validationError: () => validationError
244
263
  });
245
264
 
265
+ // src/definers/defineError.ts
266
+ var RunnerError = class extends Error {
267
+ constructor(id2, message, data) {
268
+ super(message);
269
+ this.id = id2;
270
+ this.data = data;
271
+ this.name = id2;
272
+ }
273
+ static {
274
+ __name(this, "RunnerError");
275
+ }
276
+ };
277
+ var _a;
278
+ _a = symbolError;
279
+ var ErrorHelper = class {
280
+ constructor(definition) {
281
+ this.definition = definition;
282
+ this[_a] = true;
283
+ }
284
+ static {
285
+ __name(this, "ErrorHelper");
286
+ }
287
+ get id() {
288
+ return this.definition.id;
289
+ }
290
+ throw(data) {
291
+ const parsed = this.definition.dataSchema ? this.definition.dataSchema.parse(data) : data;
292
+ const message = this.definition.format(parsed);
293
+ throw new RunnerError(this.definition.id, message, parsed);
294
+ }
295
+ is(error2) {
296
+ return error2 instanceof RunnerError && error2.name === this.definition.id;
297
+ }
298
+ optional() {
299
+ return {
300
+ inner: this,
301
+ [symbolOptionalDependency]: true
302
+ };
303
+ }
304
+ };
305
+ function defineError(definition) {
306
+ if (!definition.format) {
307
+ definition.format = (data) => `${JSON.stringify(data)}`;
308
+ }
309
+ return new ErrorHelper(definition);
310
+ }
311
+ __name(defineError, "defineError");
312
+
313
+ // src/definers/builders/error.ts
314
+ function clone(s, patch) {
315
+ return Object.freeze({ ...s, ...patch });
316
+ }
317
+ __name(clone, "clone");
318
+ function makeErrorBuilder(state) {
319
+ const b = {
320
+ id: state.id,
321
+ serialize(fn) {
322
+ const next = clone(state, { serialize: fn });
323
+ return makeErrorBuilder(next);
324
+ },
325
+ parse(fn) {
326
+ const next = clone(state, { parse: fn });
327
+ return makeErrorBuilder(next);
328
+ },
329
+ dataSchema(schema) {
330
+ const next = clone(state, { dataSchema: schema });
331
+ return makeErrorBuilder(next);
332
+ },
333
+ format(fn) {
334
+ const next = clone(state, { format: fn });
335
+ return makeErrorBuilder(next);
336
+ },
337
+ build() {
338
+ return defineError({
339
+ id: state.id,
340
+ serialize: state.serialize,
341
+ parse: state.parse,
342
+ dataSchema: state.dataSchema,
343
+ format: state.format
344
+ });
345
+ }
346
+ };
347
+ return b;
348
+ }
349
+ __name(makeErrorBuilder, "makeErrorBuilder");
350
+ function errorBuilder(id2) {
351
+ const initial = Object.freeze({
352
+ id: id2,
353
+ serialize: void 0,
354
+ parse: void 0,
355
+ dataSchema: void 0
356
+ });
357
+ return makeErrorBuilder(initial);
358
+ }
359
+ __name(errorBuilder, "errorBuilder");
360
+ var error = errorBuilder;
361
+
246
362
  // src/platform/adapters/node-als.ts
247
363
  async function loadAsyncLocalStorageClass() {
248
- const mod = await import('async_hooks');
364
+ const mod = __require("async_hooks");
249
365
  return mod.AsyncLocalStorage;
250
366
  }
251
367
  __name(loadAsyncLocalStorageClass, "loadAsyncLocalStorageClass");
@@ -366,7 +482,7 @@ var BrowserPlatformAdapter = class {
366
482
  };
367
483
  }
368
484
  exit() {
369
- throw new PlatformUnsupportedFunction("exit");
485
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
370
486
  }
371
487
  getEnv(key) {
372
488
  const g = globalThis;
@@ -382,10 +498,14 @@ var BrowserPlatformAdapter = class {
382
498
  createAsyncLocalStorage() {
383
499
  return {
384
500
  getStore: /* @__PURE__ */ __name(() => {
385
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
501
+ platformUnsupportedFunctionError.throw({
502
+ functionName: "createAsyncLocalStorage"
503
+ });
386
504
  }, "getStore"),
387
- run: /* @__PURE__ */ __name(() => {
388
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
505
+ run: /* @__PURE__ */ __name((_store, _callback) => {
506
+ platformUnsupportedFunctionError.throw({
507
+ functionName: "createAsyncLocalStorage"
508
+ });
389
509
  }, "run")
390
510
  };
391
511
  }
@@ -461,7 +581,7 @@ var GenericUniversalPlatformAdapter = class {
461
581
  };
462
582
  }
463
583
  exit() {
464
- throw new PlatformUnsupportedFunction("exit");
584
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
465
585
  }
466
586
  getEnv(key) {
467
587
  const g = globalThis;
@@ -477,10 +597,14 @@ var GenericUniversalPlatformAdapter = class {
477
597
  createAsyncLocalStorage() {
478
598
  return {
479
599
  getStore: /* @__PURE__ */ __name(() => {
480
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
600
+ platformUnsupportedFunctionError.throw({
601
+ functionName: "createAsyncLocalStorage"
602
+ });
481
603
  }, "getStore"),
482
- run: /* @__PURE__ */ __name(() => {
483
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
604
+ run: /* @__PURE__ */ __name((_store, _callback) => {
605
+ platformUnsupportedFunctionError.throw({
606
+ functionName: "createAsyncLocalStorage"
607
+ });
484
608
  }, "run")
485
609
  };
486
610
  }
@@ -677,198 +801,90 @@ var PlatformAdapter = class {
677
801
  };
678
802
 
679
803
  // src/errors.ts
680
- var RuntimeError = class extends Error {
681
- static {
682
- __name(this, "RuntimeError");
683
- }
684
- constructor(message) {
685
- super(message);
686
- this.name = "RuntimeError";
687
- }
688
- };
689
- var DuplicateRegistrationError = class extends RuntimeError {
690
- static {
691
- __name(this, "DuplicateRegistrationError");
692
- }
693
- constructor(type, id2) {
694
- super(
695
- `${type} "${id2.toString()}" already registered. You might have used the same 'id' in two different components or you may have registered the same element twice.`
696
- );
697
- this.name = "DuplicateRegistrationError";
698
- }
699
- };
700
- var DependencyNotFoundError = class extends RuntimeError {
701
- static {
702
- __name(this, "DependencyNotFoundError");
703
- }
704
- constructor(key) {
705
- super(
706
- `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
707
- );
708
- this.name = "DependencyNotFoundError";
709
- }
710
- };
711
- var UnknownItemTypeError = class extends RuntimeError {
712
- static {
713
- __name(this, "UnknownItemTypeError");
714
- }
715
- constructor(item) {
716
- super(
717
- `Unknown item type: ${item}. Please ensure you are not using different versions of '@bluelibs/runner'`
718
- );
719
- this.name = "UnknownItemTypeError";
720
- }
721
- };
722
- var ContextError = class extends Error {
723
- static {
724
- __name(this, "ContextError");
725
- }
726
- constructor(message) {
727
- super(message);
728
- this.name = "ContextError";
729
- }
730
- };
731
- var CircularDependenciesError = class extends RuntimeError {
732
- static {
733
- __name(this, "CircularDependenciesError");
734
- }
735
- constructor(cycles) {
736
- const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
737
- const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
738
- let guidance = "\n\nTo resolve circular dependencies:";
739
- guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
740
- guidance += "\n \u2022 Extract shared dependencies into separate resources";
741
- if (hasMiddleware) {
742
- guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
743
- guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
744
- }
745
- super(`Circular dependencies detected:
746
- ${cycleDetails}${guidance}`);
747
- this.name = "CircularDependenciesError";
748
- }
749
- };
750
- var EventNotFoundError = class extends RuntimeError {
751
- static {
752
- __name(this, "EventNotFoundError");
753
- }
754
- constructor(id2) {
755
- super(`Event "${id2.toString()}" not found. Did you forget to register it?`);
756
- this.name = "EventNotFoundError";
757
- }
758
- };
759
- var ResourceNotFoundError = class extends RuntimeError {
760
- static {
761
- __name(this, "ResourceNotFoundError");
762
- }
763
- constructor(id2) {
764
- super(
765
- `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
766
- );
767
- this.name = "ResourceNotFoundError";
768
- }
769
- };
770
- var MiddlewareNotRegisteredError = class extends RuntimeError {
771
- static {
772
- __name(this, "MiddlewareNotRegisteredError");
773
- }
774
- constructor(type, source, middlewareId) {
775
- super(
776
- `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
777
- );
778
- this.name = `MiddlewareNotRegisteredError: ${type} ${source} ${middlewareId}`;
779
- }
780
- };
781
- var TagNotFoundError = class extends RuntimeError {
782
- static {
783
- __name(this, "TagNotFoundError");
784
- }
785
- constructor(id2) {
786
- super(
787
- `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
788
- );
789
- this.name = "TagNotRegisteredError";
790
- }
791
- };
792
- var LockedError = class extends RuntimeError {
793
- static {
794
- __name(this, "LockedError");
795
- }
796
- constructor(what) {
797
- super(`Cannot modify the ${what.toString()} when it is locked.`);
798
- this.name = "LockedError";
799
- }
800
- };
801
- var StoreAlreadyInitializedError = class extends RuntimeError {
802
- static {
803
- __name(this, "StoreAlreadyInitializedError");
804
- }
805
- constructor() {
806
- super("Store already initialized. Cannot reinitialize.");
807
- this.name = "StoreAlreadyInitializedError";
808
- }
809
- };
810
- var ValidationError = class extends RuntimeError {
811
- static {
812
- __name(this, "ValidationError");
813
- }
814
- constructor(type, id2, originalError) {
815
- const errorMessage = originalError instanceof Error ? originalError.message : String(originalError);
816
- super(`${type} validation failed for ${id2.toString()}: ${errorMessage}`);
817
- this.name = "ValidationError";
818
- }
819
- };
820
- var EventCycleError = class extends RuntimeError {
821
- static {
822
- __name(this, "EventCycleError");
823
- }
824
- constructor(path) {
825
- const chain = path.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
826
- super(
827
- `Event emission cycle detected:
804
+ var duplicateRegistrationError = error("runner.errors.duplicateRegistration").format(
805
+ ({ type, id: id2 }) => `${type} "${id2.toString()}" already registered. You might have used the same 'id' in two different components or you may have registered the same element twice.`
806
+ ).build();
807
+ var dependencyNotFoundError = error("runner.errors.dependencyNotFound").format(
808
+ ({ key }) => `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
809
+ ).build();
810
+ var unknownItemTypeError = error(
811
+ "runner.errors.unknownItemType"
812
+ ).format(
813
+ ({ item }) => `Unknown item type: ${String(
814
+ item
815
+ )}. Please ensure you are not using different versions of '@bluelibs/runner'`
816
+ ).build();
817
+ var contextError = error(
818
+ "runner.errors.context"
819
+ ).format(({ details }) => details ?? "Context error").build();
820
+ var circularDependenciesError = error("runner.errors.circularDependencies").format(({ cycles }) => {
821
+ const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
822
+ const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
823
+ let guidance = "\n\nTo resolve circular dependencies:";
824
+ guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
825
+ guidance += "\n \u2022 Extract shared dependencies into separate resources";
826
+ if (hasMiddleware) {
827
+ guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
828
+ guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
829
+ }
830
+ return `Circular dependencies detected:
831
+ ${cycleDetails}${guidance}`;
832
+ }).build();
833
+ var eventNotFoundError = error(
834
+ "runner.errors.eventNotFound"
835
+ ).format(
836
+ ({ id: id2 }) => `Event "${id2.toString()}" not found. Did you forget to register it?`
837
+ ).build();
838
+ var resourceNotFoundError = error(
839
+ "runner.errors.resourceNotFound"
840
+ ).format(
841
+ ({ id: id2 }) => `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
842
+ ).build();
843
+ var middlewareNotRegisteredError = error("runner.errors.middlewareNotRegistered").format(
844
+ ({ type, source, middlewareId }) => `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
845
+ ).build();
846
+ var tagNotFoundError = error(
847
+ "runner.errors.tagNotFound"
848
+ ).format(
849
+ ({ id: id2 }) => `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
850
+ ).build();
851
+ var lockedError = error(
852
+ "runner.errors.locked"
853
+ ).format(
854
+ ({ what }) => `Cannot modify the ${what.toString()} when it is locked.`
855
+ ).build();
856
+ var storeAlreadyInitializedError = error(
857
+ "runner.errors.storeAlreadyInitialized"
858
+ ).format(() => "Store already initialized. Cannot reinitialize.").build();
859
+ var validationError = error("runner.errors.validation").format(({ subject, id: id2, originalError }) => {
860
+ const errorMessage = originalError instanceof Error ? originalError.message : String(originalError);
861
+ return `${subject} validation failed for ${id2.toString()}: ${errorMessage}`;
862
+ }).build();
863
+ var eventCycleError = error("runner.errors.eventCycle").format(({ path }) => {
864
+ const chain = path.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
865
+ return `Event emission cycle detected:
828
866
  ${chain}
829
867
 
830
- Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`
831
- );
832
- this.name = "EventCycleError";
833
- }
834
- };
835
- var EventEmissionCycleError = class extends RuntimeError {
836
- static {
837
- __name(this, "EventEmissionCycleError");
838
- }
839
- constructor(cycles) {
840
- const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
841
- super(
842
- `Event emission cycles detected between hooks and events:
868
+ Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`;
869
+ }).build();
870
+ var eventEmissionCycleError = error("runner.errors.eventEmissionCycle").format(({ cycles }) => {
871
+ const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
872
+ return `Event emission cycles detected between hooks and events:
843
873
  ${list}
844
874
 
845
- This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`
846
- );
847
- this.name = "EventEmissionCycleError";
848
- }
849
- };
850
- var PlatformUnsupportedFunction = class extends RuntimeError {
851
- static {
852
- __name(this, "PlatformUnsupportedFunction");
853
- }
854
- constructor(functionName) {
855
- super(
856
- `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
857
- );
858
- this.name = "PlatformUnsupportedFunction";
859
- }
860
- };
861
- var CancellationError = class extends RuntimeError {
862
- static {
863
- __name(this, "CancellationError");
864
- }
865
- constructor(message = "Operation cancelled") {
866
- super(message);
867
- this.name = "CancellationError";
868
- }
869
- };
875
+ This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`;
876
+ }).build();
877
+ var platformUnsupportedFunctionError = error("runner.errors.platformUnsupportedFunction").format(
878
+ ({ functionName }) => `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
879
+ ).build();
880
+ var cancellationError = error(
881
+ "runner.errors.cancellation"
882
+ ).format(({ reason }) => reason || "Operation cancelled").build();
883
+ var tunnelOwnershipConflictError = error("runner.errors.tunnelOwnershipConflict").format(
884
+ ({ taskId, currentOwnerId, attemptedOwnerId }) => `Task "${taskId}" is already tunneled by resource "${currentOwnerId}". Resource "${attemptedOwnerId}" cannot tunnel it again. Ensure each task is owned by a single tunnel client.`
885
+ ).build();
870
886
  function isCancellationError(err) {
871
- return !!err && err.name === "CancellationError";
887
+ return cancellationError.is(err);
872
888
  }
873
889
  __name(isCancellationError, "isCancellationError");
874
890
 
@@ -893,12 +909,12 @@ function defineResource(constConfig) {
893
909
  if (constConfig.configSchema) {
894
910
  try {
895
911
  config = constConfig.configSchema.parse(config);
896
- } catch (error) {
897
- throw new ValidationError(
898
- "Resource config",
899
- id2,
900
- error instanceof Error ? error : new Error(String(error))
901
- );
912
+ } catch (error2) {
913
+ validationError.throw({
914
+ subject: "Resource config",
915
+ id: id2,
916
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
917
+ });
902
918
  }
903
919
  }
904
920
  return {
@@ -959,12 +975,12 @@ function defineTaskMiddleware(middlewareDef) {
959
975
  if (obj.configSchema) {
960
976
  try {
961
977
  config = obj.configSchema.parse(config);
962
- } catch (error) {
963
- throw new ValidationError(
964
- "Middleware config",
965
- obj.id,
966
- error instanceof Error ? error : new Error(String(error))
967
- );
978
+ } catch (error2) {
979
+ validationError.throw({
980
+ subject: "Middleware config",
981
+ id: obj.id,
982
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
983
+ });
968
984
  }
969
985
  }
970
986
  return wrap({
@@ -1000,12 +1016,12 @@ function defineResourceMiddleware(middlewareDef) {
1000
1016
  if (obj.configSchema) {
1001
1017
  try {
1002
1018
  config = obj.configSchema.parse(config);
1003
- } catch (error) {
1004
- throw new ValidationError(
1005
- "Middleware config",
1006
- obj.id,
1007
- error
1008
- );
1019
+ } catch (error2) {
1020
+ validationError.throw({
1021
+ subject: "Middleware config",
1022
+ id: obj.id,
1023
+ originalError: error2
1024
+ });
1009
1025
  }
1010
1026
  }
1011
1027
  return wrap({
@@ -1057,8 +1073,12 @@ function defineTag(definition) {
1057
1073
  if (definition.configSchema) {
1058
1074
  try {
1059
1075
  tagConfig = definition.configSchema.parse(tagConfig);
1060
- } catch (error) {
1061
- throw new ValidationError("Tag config", this.id, error);
1076
+ } catch (error2) {
1077
+ validationError.throw({
1078
+ subject: "Tag config",
1079
+ id: this.id,
1080
+ originalError: error2
1081
+ });
1062
1082
  }
1063
1083
  }
1064
1084
  let config;
@@ -1159,6 +1179,14 @@ function isOptional(definition) {
1159
1179
  return definition && definition[symbolOptionalDependency];
1160
1180
  }
1161
1181
  __name(isOptional, "isOptional");
1182
+ function isError(definition) {
1183
+ return Boolean(definition && definition[symbolError]);
1184
+ }
1185
+ __name(isError, "isError");
1186
+ function isAsyncContext(definition) {
1187
+ return Boolean(definition && definition[symbolAsyncContext]);
1188
+ }
1189
+ __name(isAsyncContext, "isAsyncContext");
1162
1190
 
1163
1191
  // src/globals/middleware/requireContext.middleware.ts
1164
1192
  var requireContextTaskMiddleware = defineTaskMiddleware({
@@ -1173,29 +1201,45 @@ var requireContextTaskMiddleware = defineTaskMiddleware({
1173
1201
  return next(task2?.input);
1174
1202
  }
1175
1203
  });
1204
+ var EjsonSerializer = {
1205
+ stringify(value) {
1206
+ return EJSON.stringify(value);
1207
+ },
1208
+ parse(text) {
1209
+ return EJSON.parse(text);
1210
+ },
1211
+ addType(name, factory) {
1212
+ EJSON.addType(name, factory);
1213
+ }
1214
+ };
1215
+ function getDefaultSerializer() {
1216
+ return EjsonSerializer;
1217
+ }
1218
+ __name(getDefaultSerializer, "getDefaultSerializer");
1176
1219
 
1177
- // src/context.ts
1220
+ // src/definers/defineAsyncContext.ts
1178
1221
  var platform = getPlatform();
1179
1222
  var storage = platform.createAsyncLocalStorage();
1180
1223
  function getCurrentStore() {
1181
1224
  return storage.getStore();
1182
1225
  }
1183
1226
  __name(getCurrentStore, "getCurrentStore");
1184
- function createContext(name = "runner.context") {
1227
+ function defineAsyncContext(def) {
1185
1228
  if (!platform.hasAsyncLocalStorage()) {
1186
- throw new PlatformUnsupportedFunction(
1187
- `createAsyncLocalStorage: Cannot create context ${name}: no async storage available in this environment`
1188
- );
1229
+ platformUnsupportedFunctionError.throw({
1230
+ functionName: `createAsyncLocalStorage: Cannot create context ${def.id}: no async storage available in this environment`
1231
+ });
1189
1232
  }
1190
- const ctxId = Symbol(name);
1233
+ const ctxId = def.id;
1191
1234
  const use = /* @__PURE__ */ __name(() => {
1192
1235
  const store2 = getCurrentStore();
1193
1236
  if (!store2 || !store2.has(ctxId)) {
1194
- throw new ContextError(
1195
- `Context not available for symbol ${ctxId.toString()}`
1196
- );
1237
+ contextError.throw({
1238
+ details: `Context not available for symbol ${ctxId.toString()}`
1239
+ });
1197
1240
  }
1198
- return store2.get(ctxId);
1241
+ const s = store2;
1242
+ return s.get(ctxId);
1199
1243
  }, "use");
1200
1244
  const provide = /* @__PURE__ */ __name((value, fn) => {
1201
1245
  const currentStore = getCurrentStore();
@@ -1203,16 +1247,39 @@ function createContext(name = "runner.context") {
1203
1247
  map.set(ctxId, value);
1204
1248
  return storage.run(map, fn);
1205
1249
  }, "provide");
1250
+ const serializer = getDefaultSerializer();
1206
1251
  const api = {
1207
1252
  id: ctxId,
1253
+ [symbolAsyncContext]: true,
1208
1254
  use,
1209
- provide,
1255
+ /* istanbul ignore next */
1256
+ provide(value, fn) {
1257
+ const validated = def.configSchema ? def.configSchema.parse(value) : value;
1258
+ return provide(validated, fn);
1259
+ },
1210
1260
  require() {
1211
- return requireContextTaskMiddleware.with({ context: api });
1261
+ return requireContextTaskMiddleware.with({
1262
+ context: api
1263
+ });
1264
+ },
1265
+ /* istanbul ignore next */
1266
+ serialize: def.serialize || ((data) => serializer.stringify(data)),
1267
+ /* istanbul ignore next */
1268
+ parse: def.parse || ((data) => serializer.parse(data)),
1269
+ optional() {
1270
+ return {
1271
+ inner: api,
1272
+ [symbolOptionalDependency]: true
1273
+ };
1212
1274
  }
1213
1275
  };
1214
1276
  return api;
1215
1277
  }
1278
+ __name(defineAsyncContext, "defineAsyncContext");
1279
+ function createContext(name) {
1280
+ const id2 = name ?? `context.${Math.random().toString(36).slice(2)}.${Date.now()}`;
1281
+ return defineAsyncContext({ id: id2 });
1282
+ }
1216
1283
  __name(createContext, "createContext");
1217
1284
 
1218
1285
  // src/globals/resources/debug/debug.tag.ts
@@ -1427,10 +1494,10 @@ var retryTaskMiddleware = defineTaskMiddleware({
1427
1494
  while (true) {
1428
1495
  try {
1429
1496
  return await next(input);
1430
- } catch (error) {
1431
- const err = error;
1497
+ } catch (error2) {
1498
+ const err = error2;
1432
1499
  if (shouldStop(err) || attempts >= maxRetries) {
1433
- throw error;
1500
+ throw error2;
1434
1501
  }
1435
1502
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
1436
1503
  if (delay > 0) {
@@ -1451,10 +1518,10 @@ var retryResourceMiddleware = defineResourceMiddleware({
1451
1518
  while (true) {
1452
1519
  try {
1453
1520
  return await next(input);
1454
- } catch (error) {
1455
- const err = error;
1521
+ } catch (error2) {
1522
+ const err = error2;
1456
1523
  if (shouldStop(err) || attempts >= maxRetries) {
1457
- throw error;
1524
+ throw error2;
1458
1525
  }
1459
1526
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
1460
1527
  if (delay > 0) {
@@ -1474,17 +1541,17 @@ var timeoutTaskMiddleware = defineTaskMiddleware({
1474
1541
  const ttl = Math.max(0, config.ttl);
1475
1542
  const message = `Operation timed out after ${ttl}ms`;
1476
1543
  if (ttl === 0) {
1477
- const error = new Error(message);
1478
- error.name = "TimeoutError";
1479
- throw error;
1544
+ const error2 = new Error(message);
1545
+ error2.name = "TimeoutError";
1546
+ throw error2;
1480
1547
  }
1481
1548
  const controller = new AbortController();
1482
1549
  const timeoutPromise = new Promise((_, reject) => {
1483
1550
  const timeoutId = setTimeout(() => {
1484
1551
  controller.abort();
1485
- const error = new Error(message);
1486
- error.name = "TimeoutError";
1487
- reject(error);
1552
+ const error2 = new Error(message);
1553
+ error2.name = "TimeoutError";
1554
+ reject(error2);
1488
1555
  }, ttl);
1489
1556
  controller.signal.addEventListener("abort", () => {
1490
1557
  clearTimeout(timeoutId);
@@ -1500,17 +1567,17 @@ var timeoutResourceMiddleware = defineResourceMiddleware({
1500
1567
  const ttl = Math.max(0, config.ttl);
1501
1568
  const message = `Operation timed out after ${ttl}ms`;
1502
1569
  if (ttl === 0) {
1503
- const error = new Error(message);
1504
- error.name = "TimeoutError";
1505
- throw error;
1570
+ const error2 = new Error(message);
1571
+ error2.name = "TimeoutError";
1572
+ throw error2;
1506
1573
  }
1507
1574
  const controller = new AbortController();
1508
1575
  const timeoutPromise = new Promise((_, reject) => {
1509
1576
  const timeoutId = setTimeout(() => {
1510
1577
  controller.abort();
1511
- const error = new Error(message);
1512
- error.name = "TimeoutError";
1513
- reject(error);
1578
+ const error2 = new Error(message);
1579
+ error2.name = "TimeoutError";
1580
+ reject(error2);
1514
1581
  }, ttl);
1515
1582
  controller.signal.addEventListener("abort", () => {
1516
1583
  clearTimeout(timeoutId);
@@ -1536,6 +1603,77 @@ var globalMiddlewares = {
1536
1603
  }
1537
1604
  };
1538
1605
 
1606
+ // src/globals/resources/debug/types.ts
1607
+ var allFalse = Object.freeze({
1608
+ logResourceBeforeRun: false,
1609
+ logResourceAfterRun: false,
1610
+ logMiddlewareBeforeRun: false,
1611
+ logMiddlewareAfterRun: false,
1612
+ logTaskBeforeRun: false,
1613
+ logTaskAfterRun: false,
1614
+ logTaskInput: false,
1615
+ logTaskOutput: false,
1616
+ logResourceConfig: false,
1617
+ logResourceValue: false,
1618
+ logHookTriggered: false,
1619
+ logHookCompleted: false,
1620
+ logEventEmissionOnRun: false,
1621
+ logEventEmissionInput: false
1622
+ });
1623
+ var levelNormal = Object.freeze({
1624
+ ...allFalse,
1625
+ logTaskAfterRun: true,
1626
+ logTaskBeforeRun: true,
1627
+ logResourceBeforeRun: true,
1628
+ logResourceAfterRun: true,
1629
+ logMiddlewareBeforeRun: true,
1630
+ logMiddlewareAfterRun: true,
1631
+ logHookTriggered: true,
1632
+ logHookCompleted: true,
1633
+ logEventEmissionOnRun: true
1634
+ });
1635
+ Object.freeze(levelNormal);
1636
+ var levelVerbose = Object.freeze({
1637
+ ...levelNormal,
1638
+ logTaskInput: true,
1639
+ logTaskOutput: true,
1640
+ logResourceConfig: true,
1641
+ logResourceValue: true,
1642
+ logHookTriggered: true,
1643
+ logHookCompleted: true
1644
+ });
1645
+ Object.freeze(levelVerbose);
1646
+ function formatConfig(config) {
1647
+ if (config === "normal") {
1648
+ return { ...levelNormal };
1649
+ }
1650
+ if (config === "verbose") {
1651
+ return { ...levelVerbose };
1652
+ }
1653
+ return { ...allFalse, ...config };
1654
+ }
1655
+ __name(formatConfig, "formatConfig");
1656
+ var getConfig = /* @__PURE__ */ __name((config, taggable) => {
1657
+ if (!taggable) {
1658
+ return formatConfig(config);
1659
+ }
1660
+ const debugTagConfig = debugTag.extract(taggable);
1661
+ if (debugTagConfig) {
1662
+ const debugTagConfigFormatted = formatConfig(debugTagConfig);
1663
+ return { ...formatConfig(config), ...debugTagConfigFormatted };
1664
+ }
1665
+ return formatConfig(config);
1666
+ }, "getConfig");
1667
+
1668
+ // src/globals/debug.ts
1669
+ var debugLevels = {
1670
+ normal: levelNormal,
1671
+ verbose: levelVerbose
1672
+ };
1673
+ var debug = {
1674
+ levels: debugLevels
1675
+ };
1676
+
1539
1677
  // src/models/TaskRunner.ts
1540
1678
  var TaskRunner = class {
1541
1679
  constructor(store2, eventManager, logger) {
@@ -1562,16 +1700,16 @@ var TaskRunner = class {
1562
1700
  }
1563
1701
  try {
1564
1702
  return await runner(input);
1565
- } catch (error) {
1703
+ } catch (error2) {
1566
1704
  try {
1567
1705
  await this.store.onUnhandledError({
1568
- error,
1706
+ error: error2,
1569
1707
  kind: "task",
1570
1708
  source: task2.id
1571
1709
  });
1572
1710
  } catch (_) {
1573
1711
  }
1574
- throw error;
1712
+ throw error2;
1575
1713
  }
1576
1714
  }
1577
1715
  /**
@@ -1622,7 +1760,7 @@ var MiddlewareManager = class {
1622
1760
  */
1623
1761
  checkLock() {
1624
1762
  if (this.#isLocked) {
1625
- throw new LockedError("MiddlewareManager");
1763
+ lockedError.throw({ what: "MiddlewareManager" });
1626
1764
  }
1627
1765
  }
1628
1766
  /**
@@ -1740,12 +1878,12 @@ var MiddlewareManager = class {
1740
1878
  if (runnerTask.inputSchema) {
1741
1879
  try {
1742
1880
  rawInput = runnerTask.inputSchema.parse(rawInput);
1743
- } catch (error) {
1744
- throw new ValidationError(
1745
- "Task input",
1746
- runnerTask.id,
1747
- error instanceof Error ? error : new Error(String(error))
1748
- );
1881
+ } catch (error2) {
1882
+ validationError.throw({
1883
+ subject: "Task input",
1884
+ id: runnerTask.id,
1885
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
1886
+ });
1749
1887
  }
1750
1888
  }
1751
1889
  const deps = storeTask.computedDependencies;
@@ -1753,8 +1891,12 @@ var MiddlewareManager = class {
1753
1891
  if (runnerTask.resultSchema) {
1754
1892
  try {
1755
1893
  return runnerTask.resultSchema.parse(rawResult);
1756
- } catch (error) {
1757
- throw new ValidationError("Task result", runnerTask.id, error);
1894
+ } catch (error2) {
1895
+ validationError.throw({
1896
+ subject: "Task result",
1897
+ id: runnerTask.id,
1898
+ originalError: error2
1899
+ });
1758
1900
  }
1759
1901
  }
1760
1902
  return rawResult;
@@ -1849,12 +1991,12 @@ var MiddlewareManager = class {
1849
1991
  if (resource2.resultSchema) {
1850
1992
  try {
1851
1993
  return resource2.resultSchema.parse(rawValue);
1852
- } catch (error) {
1853
- throw new ValidationError(
1854
- "Resource result",
1855
- resource2.id,
1856
- error
1857
- );
1994
+ } catch (error2) {
1995
+ validationError.throw({
1996
+ subject: "Resource result",
1997
+ id: resource2.id,
1998
+ originalError: error2
1999
+ });
1858
2000
  }
1859
2001
  }
1860
2002
  return rawValue;
@@ -1880,16 +2022,16 @@ var MiddlewareManager = class {
1880
2022
  middleware.config
1881
2023
  );
1882
2024
  return result;
1883
- } catch (error) {
2025
+ } catch (error2) {
1884
2026
  try {
1885
2027
  await this.store.onUnhandledError({
1886
- error,
2028
+ error: error2,
1887
2029
  kind: "resourceInit",
1888
2030
  source: resource2.id
1889
2031
  });
1890
2032
  } catch (_) {
1891
2033
  }
1892
- throw error;
2034
+ throw error2;
1893
2035
  }
1894
2036
  }, "baseMiddlewareRunner");
1895
2037
  const middlewareInterceptors = this.perResourceMiddlewareInterceptors.get(middleware.id) || [];
@@ -2101,7 +2243,7 @@ var LogPrinter = class _LogPrinter {
2101
2243
  _LogPrinter.writers.log(safeStringify(this.normalizeForJson(log), 2));
2102
2244
  return;
2103
2245
  }
2104
- const { level, source, message, timestamp, error, data, context } = log;
2246
+ const { level, source, message, timestamp, error: error2, data, context } = log;
2105
2247
  const timePart = this.formatTime(timestamp);
2106
2248
  const levelPart = this.formatLevel(level);
2107
2249
  const sourcePart = this.formatSource(source);
@@ -2115,7 +2257,7 @@ var LogPrinter = class _LogPrinter {
2115
2257
  if (message) {
2116
2258
  output.push(...messageLines.map((line) => `${indentation}${line}`));
2117
2259
  }
2118
- const errorLines = this.formatError(error);
2260
+ const errorLines = this.formatError(error2);
2119
2261
  const dataLines = this.formatData(data);
2120
2262
  const contextLines = this.formatContext(context);
2121
2263
  const detailsExist = errorLines.length > 0 || dataLines.length > 0 || contextLines.length > 0;
@@ -2158,14 +2300,14 @@ var LogPrinter = class _LogPrinter {
2158
2300
  }
2159
2301
  return String(message);
2160
2302
  }
2161
- formatError(error, indentation = " ") {
2162
- if (!error) return [];
2303
+ formatError(error2, indentation = " ") {
2304
+ if (!error2) return [];
2163
2305
  const lines = [];
2164
2306
  lines.push(
2165
- `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error.name}: ${error.message}${this.colors.reset}`
2307
+ `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error2.name}: ${error2.message}${this.colors.reset}`
2166
2308
  );
2167
- if (error.stack) {
2168
- const frames = error.stack.split("\n").slice(1);
2309
+ if (error2.stack) {
2310
+ const frames = error2.stack.split("\n").slice(1);
2169
2311
  frames.forEach((frame) => {
2170
2312
  const cleaned = frame.trim().replace(/^at /, "");
2171
2313
  lines.push(
@@ -2316,13 +2458,13 @@ var Logger = class _Logger {
2316
2458
  * Core logging method with structured LogInfo
2317
2459
  */
2318
2460
  async log(level, message, logInfo = {}) {
2319
- const { source, error, data, ...context } = logInfo;
2461
+ const { source, error: error2, data, ...context } = logInfo;
2320
2462
  const log = {
2321
2463
  level,
2322
2464
  message,
2323
2465
  source: source || this.source,
2324
2466
  timestamp: /* @__PURE__ */ new Date(),
2325
- error: error ? this.extractErrorInfo(error) : void 0,
2467
+ error: error2 ? this.extractErrorInfo(error2) : void 0,
2326
2468
  data: data || void 0,
2327
2469
  context: { ...this.boundContext, ...context }
2328
2470
  };
@@ -2336,17 +2478,17 @@ var Logger = class _Logger {
2336
2478
  root.printer.print(log);
2337
2479
  }
2338
2480
  }
2339
- extractErrorInfo(error) {
2340
- if (error instanceof Error) {
2481
+ extractErrorInfo(error2) {
2482
+ if (error2 instanceof Error) {
2341
2483
  return {
2342
- name: error.name,
2343
- message: error.message,
2344
- stack: error.stack
2484
+ name: error2.name,
2485
+ message: error2.message,
2486
+ stack: error2.stack
2345
2487
  };
2346
2488
  }
2347
2489
  return {
2348
2490
  name: "UnknownError",
2349
- message: String(error)
2491
+ message: String(error2)
2350
2492
  };
2351
2493
  }
2352
2494
  async info(message, logInfo) {
@@ -2420,14 +2562,14 @@ var Logger = class _Logger {
2420
2562
  for (const listener of this.localListeners) {
2421
2563
  try {
2422
2564
  await listener(log);
2423
- } catch (error) {
2565
+ } catch (error2) {
2424
2566
  this.print({
2425
2567
  level: "error",
2426
2568
  message: "Error in log listener",
2427
2569
  timestamp: /* @__PURE__ */ new Date(),
2428
2570
  error: {
2429
2571
  name: "ListenerError",
2430
- message: error instanceof Error ? error.message : String(error)
2572
+ message: error2 instanceof Error ? error2.message : String(error2)
2431
2573
  }
2432
2574
  });
2433
2575
  continue;
@@ -2603,7 +2745,7 @@ var DependencyProcessor = class {
2603
2745
  } else if (Array.isArray(eventDefinition)) {
2604
2746
  for (const ed of eventDefinition) {
2605
2747
  if (this.store.events.get(ed.id) === void 0) {
2606
- throw new EventNotFoundError(ed.id);
2748
+ eventNotFoundError.throw({ id: ed.id });
2607
2749
  }
2608
2750
  }
2609
2751
  this.eventManager.addListener(eventDefinition, handler, {
@@ -2611,7 +2753,7 @@ var DependencyProcessor = class {
2611
2753
  });
2612
2754
  } else {
2613
2755
  if (this.store.events.get(eventDefinition.id) === void 0) {
2614
- throw new EventNotFoundError(eventDefinition.id);
2756
+ eventNotFoundError.throw({ id: eventDefinition.id });
2615
2757
  }
2616
2758
  this.eventManager.addListener(eventDefinition, handler, {
2617
2759
  order
@@ -2652,8 +2794,14 @@ var DependencyProcessor = class {
2652
2794
  } else if (isEvent(inner)) {
2653
2795
  const exists = this.store.events.get(inner.id) !== void 0;
2654
2796
  return exists ? this.extractEventDependency(inner, source) : void 0;
2797
+ } else if (isError(inner)) {
2798
+ const exists = this.store.errors.get(inner.id) !== void 0;
2799
+ return exists ? inner : void 0;
2800
+ } else if (isAsyncContext(inner)) {
2801
+ const exists = this.store.asyncContexts.get(inner.id) !== void 0;
2802
+ return exists ? inner : void 0;
2655
2803
  }
2656
- throw new UnknownItemTypeError(inner);
2804
+ unknownItemTypeError.throw({ item: inner });
2657
2805
  }
2658
2806
  if (isResource(object)) {
2659
2807
  return this.extractResourceDependency(object);
@@ -2661,8 +2809,18 @@ var DependencyProcessor = class {
2661
2809
  return this.extractTaskDependency(object);
2662
2810
  } else if (isEvent(object)) {
2663
2811
  return this.extractEventDependency(object, source);
2812
+ } else if (isError(object)) {
2813
+ if (this.store.errors.get(object.id) === void 0) {
2814
+ dependencyNotFoundError.throw({ key: `Error ${object.id}` });
2815
+ }
2816
+ return object;
2817
+ } else if (isAsyncContext(object)) {
2818
+ if (this.store.asyncContexts.get(object.id) === void 0) {
2819
+ dependencyNotFoundError.throw({ key: `AsyncContext ${object.id}` });
2820
+ }
2821
+ return object;
2664
2822
  } else {
2665
- throw new UnknownItemTypeError(object);
2823
+ unknownItemTypeError.throw({ item: object });
2666
2824
  }
2667
2825
  }
2668
2826
  /**
@@ -2678,27 +2836,29 @@ var DependencyProcessor = class {
2678
2836
  async extractTaskDependency(object) {
2679
2837
  const storeTask = this.store.tasks.get(object.id);
2680
2838
  if (storeTask === void 0) {
2681
- throw new DependencyNotFoundError(`Task ${object.id}`);
2839
+ dependencyNotFoundError.throw({ key: `Task ${object.id}` });
2682
2840
  }
2683
- if (!storeTask.isInitialized) {
2841
+ const st = storeTask;
2842
+ if (!st.isInitialized) {
2684
2843
  const dependencies = object.dependencies;
2685
- storeTask.computedDependencies = await this.extractDependencies(
2844
+ st.computedDependencies = await this.extractDependencies(
2686
2845
  dependencies,
2687
- storeTask.task.id
2846
+ st.task.id
2688
2847
  );
2689
- storeTask.isInitialized = true;
2848
+ st.isInitialized = true;
2690
2849
  }
2691
2850
  return (input) => {
2692
- return this.taskRunner.run(storeTask.task, input);
2851
+ return this.taskRunner.run(st.task, input);
2693
2852
  };
2694
2853
  }
2695
2854
  async extractResourceDependency(object) {
2696
2855
  const storeResource = this.store.resources.get(object.id);
2697
2856
  if (storeResource === void 0) {
2698
- throw new DependencyNotFoundError(`Resource ${object.id}`);
2857
+ dependencyNotFoundError.throw({ key: `Resource ${object.id}` });
2699
2858
  }
2700
- const { resource: resource2, config } = storeResource;
2701
- if (!storeResource.isInitialized) {
2859
+ const sr = storeResource;
2860
+ const { resource: resource2, config } = sr;
2861
+ if (!sr.isInitialized) {
2702
2862
  if (resource2.init) {
2703
2863
  const depMap = resource2.dependencies || {};
2704
2864
  const raw = await this.extractDependencies(depMap, resource2.id);
@@ -2708,12 +2868,12 @@ var DependencyProcessor = class {
2708
2868
  config,
2709
2869
  wrapped
2710
2870
  );
2711
- storeResource.context = context;
2712
- storeResource.value = value;
2871
+ sr.context = context;
2872
+ sr.value = value;
2713
2873
  }
2714
- storeResource.isInitialized = true;
2874
+ sr.isInitialized = true;
2715
2875
  }
2716
- return storeResource.value;
2876
+ return sr.value;
2717
2877
  }
2718
2878
  };
2719
2879
 
@@ -2771,12 +2931,12 @@ var EventManager = class {
2771
2931
  if (eventDefinition.payloadSchema) {
2772
2932
  try {
2773
2933
  data = eventDefinition.payloadSchema.parse(data);
2774
- } catch (error) {
2775
- throw new ValidationError(
2776
- "Event payload",
2777
- eventDefinition.id,
2778
- error instanceof Error ? error : new Error(String(error))
2779
- );
2934
+ } catch (error2) {
2935
+ validationError.throw({
2936
+ subject: "Event payload",
2937
+ id: eventDefinition.id,
2938
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
2939
+ });
2780
2940
  }
2781
2941
  }
2782
2942
  const frame = { id: eventDefinition.id, source };
@@ -2832,10 +2992,9 @@ var EventManager = class {
2832
2992
  const currentHookId = this.currentHookIdContext.getStore();
2833
2993
  const safeReEmitBySameHook = top.id === frame.id && currentHookId && currentHookId === source;
2834
2994
  if (!safeReEmitBySameHook) {
2835
- throw new EventCycleError([
2836
- ...currentStack.slice(cycleStart),
2837
- frame
2838
- ]);
2995
+ eventCycleError.throw({
2996
+ path: [...currentStack.slice(cycleStart), frame]
2997
+ });
2839
2998
  }
2840
2999
  }
2841
3000
  }
@@ -2975,7 +3134,7 @@ var EventManager = class {
2975
3134
  */
2976
3135
  checkLock() {
2977
3136
  if (this.#isLocked) {
2978
- throw new LockedError("EventManager");
3137
+ lockedError.throw({ what: "EventManager" });
2979
3138
  }
2980
3139
  }
2981
3140
  /**
@@ -3131,25 +3290,31 @@ var StoreValidator = class {
3131
3290
  }
3132
3291
  checkIfIDExists(id2) {
3133
3292
  if (this.registry.tasks.has(id2)) {
3134
- throw new DuplicateRegistrationError("Task", id2);
3293
+ duplicateRegistrationError.throw({ type: "Task", id: id2 });
3135
3294
  }
3136
3295
  if (this.registry.resources.has(id2)) {
3137
- throw new DuplicateRegistrationError("Resource", id2);
3296
+ duplicateRegistrationError.throw({ type: "Resource", id: id2 });
3138
3297
  }
3139
3298
  if (this.registry.events.has(id2)) {
3140
- throw new DuplicateRegistrationError("Event", id2);
3299
+ duplicateRegistrationError.throw({ type: "Event", id: id2 });
3300
+ }
3301
+ if (this.registry.errors.has(id2)) {
3302
+ duplicateRegistrationError.throw({ type: "Error", id: id2 });
3303
+ }
3304
+ if (this.registry.asyncContexts.has(id2)) {
3305
+ duplicateRegistrationError.throw({ type: "AsyncContext", id: id2 });
3141
3306
  }
3142
3307
  if (this.registry.taskMiddlewares.has(id2)) {
3143
- throw new DuplicateRegistrationError("Middleware", id2);
3308
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
3144
3309
  }
3145
3310
  if (this.registry.resourceMiddlewares.has(id2)) {
3146
- throw new DuplicateRegistrationError("Middleware", id2);
3311
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
3147
3312
  }
3148
3313
  if (this.registry.tags.has(id2)) {
3149
- throw new DuplicateRegistrationError("Tag", id2);
3314
+ duplicateRegistrationError.throw({ type: "Tag", id: id2 });
3150
3315
  }
3151
3316
  if (this.registry.hooks.has(id2)) {
3152
- throw new DuplicateRegistrationError("Hook", id2);
3317
+ duplicateRegistrationError.throw({ type: "Hook", id: id2 });
3153
3318
  }
3154
3319
  }
3155
3320
  runSanityChecks() {
@@ -3157,11 +3322,11 @@ var StoreValidator = class {
3157
3322
  const middlewares = task2.task.middleware;
3158
3323
  middlewares.forEach((middlewareAttachment) => {
3159
3324
  if (!this.registry.taskMiddlewares.has(middlewareAttachment.id)) {
3160
- throw new MiddlewareNotRegisteredError(
3161
- "task",
3162
- task2.task.id,
3163
- middlewareAttachment.id
3164
- );
3325
+ middlewareNotRegisteredError.throw({
3326
+ type: "task",
3327
+ source: task2.task.id,
3328
+ middlewareId: middlewareAttachment.id
3329
+ });
3165
3330
  }
3166
3331
  });
3167
3332
  }
@@ -3169,11 +3334,11 @@ var StoreValidator = class {
3169
3334
  const middlewares = resource2.resource.middleware;
3170
3335
  middlewares.forEach((middlewareAttachment) => {
3171
3336
  if (!this.registry.resourceMiddlewares.has(middlewareAttachment.id)) {
3172
- throw new MiddlewareNotRegisteredError(
3173
- "resource",
3174
- resource2.resource.id,
3175
- middlewareAttachment.id
3176
- );
3337
+ middlewareNotRegisteredError.throw({
3338
+ type: "resource",
3339
+ source: resource2.resource.id,
3340
+ middlewareId: middlewareAttachment.id
3341
+ });
3177
3342
  }
3178
3343
  });
3179
3344
  }
@@ -3197,7 +3362,7 @@ var StoreValidator = class {
3197
3362
  if (tags) {
3198
3363
  for (const tag2 of tags) {
3199
3364
  if (!this.registry.tags.has(tag2.id)) {
3200
- throw new TagNotFoundError(tag2.id);
3365
+ tagNotFoundError.throw({ id: tag2.id });
3201
3366
  }
3202
3367
  }
3203
3368
  }
@@ -3216,6 +3381,8 @@ var StoreRegistry = class {
3216
3381
  this.resourceMiddlewares = /* @__PURE__ */ new Map();
3217
3382
  this.hooks = /* @__PURE__ */ new Map();
3218
3383
  this.tags = /* @__PURE__ */ new Map();
3384
+ this.asyncContexts = /* @__PURE__ */ new Map();
3385
+ this.errors = /* @__PURE__ */ new Map();
3219
3386
  this.validator = new StoreValidator(this);
3220
3387
  }
3221
3388
  static {
@@ -3227,12 +3394,16 @@ var StoreRegistry = class {
3227
3394
  storeGenericItem(item) {
3228
3395
  if (isTask(item)) {
3229
3396
  this.storeTask(item);
3397
+ } else if (isError(item)) {
3398
+ this.storeError(item);
3230
3399
  } else if (isHook && isHook(item)) {
3231
3400
  this.storeHook(item);
3232
3401
  } else if (isResource(item)) {
3233
3402
  this.storeResource(item);
3234
3403
  } else if (isEvent(item)) {
3235
3404
  this.storeEvent(item);
3405
+ } else if (isAsyncContext(item)) {
3406
+ this.storeAsyncContext(item);
3236
3407
  } else if (isTaskMiddleware(item)) {
3237
3408
  this.storeTaskMiddleware(item);
3238
3409
  } else if (isResourceMiddleware(item)) {
@@ -3242,9 +3413,17 @@ var StoreRegistry = class {
3242
3413
  } else if (isTag(item)) {
3243
3414
  this.storeTag(item);
3244
3415
  } else {
3245
- throw new UnknownItemTypeError(item);
3416
+ unknownItemTypeError.throw({ item });
3246
3417
  }
3247
3418
  }
3419
+ storeError(item) {
3420
+ this.validator.checkIfIDExists(item.id);
3421
+ this.errors.set(item.id, item);
3422
+ }
3423
+ storeAsyncContext(item) {
3424
+ this.validator.checkIfIDExists(item.id);
3425
+ this.asyncContexts.set(item.id, item);
3426
+ }
3248
3427
  storeTag(item) {
3249
3428
  this.validator.checkIfIDExists(item.id);
3250
3429
  this.tags.set(item.id, item);
@@ -3608,7 +3787,7 @@ var OverrideManager = class {
3608
3787
  }
3609
3788
  if (!hasAnyItem) {
3610
3789
  const id2 = isResourceWithConfig(override) ? override.resource.id : override.id;
3611
- throw new DependencyNotFoundError(id2);
3790
+ dependencyNotFoundError.throw({ key: id2 });
3612
3791
  }
3613
3792
  }
3614
3793
  for (const override of this.overrides.values()) {
@@ -3661,6 +3840,15 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
3661
3840
  return value;
3662
3841
  }
3663
3842
  for (const t of tasks) {
3843
+ const currentOwner = t[symbolTunneledBy];
3844
+ const resourceId = resource2.definition.id;
3845
+ if (currentOwner && currentOwner !== resourceId) {
3846
+ tunnelOwnershipConflictError.throw({
3847
+ taskId: t.id,
3848
+ currentOwnerId: currentOwner,
3849
+ attemptedOwnerId: resourceId
3850
+ });
3851
+ }
3664
3852
  if (!originalRuns.has(t)) {
3665
3853
  originalRuns.set(t, t.run);
3666
3854
  }
@@ -3668,6 +3856,7 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
3668
3856
  return value.run(t, input);
3669
3857
  });
3670
3858
  t[symbolTunneledTask] = "client";
3859
+ t[symbolTunneledBy] = resourceId;
3671
3860
  }
3672
3861
  if (events.length > 0) {
3673
3862
  const selectedEventIds = new Set(events.map((e) => e.id));
@@ -3755,8 +3944,28 @@ function resolveEvents(store2, selector) {
3755
3944
  return out;
3756
3945
  }
3757
3946
  __name(resolveEvents, "resolveEvents");
3947
+
3948
+ // src/utils/detectRunnerMode.ts
3949
+ function detectRunnerMode(explicitMode) {
3950
+ if (explicitMode !== void 0) {
3951
+ return explicitMode;
3952
+ }
3953
+ const env = getPlatform().getEnv("NODE_ENV");
3954
+ switch (env) {
3955
+ case "test":
3956
+ return "test" /* TEST */;
3957
+ case "production":
3958
+ return "prod" /* PROD */;
3959
+ case "development":
3960
+ default:
3961
+ return "dev" /* DEV */;
3962
+ }
3963
+ }
3964
+ __name(detectRunnerMode, "detectRunnerMode");
3965
+
3966
+ // src/models/Store.ts
3758
3967
  var Store = class {
3759
- constructor(eventManager, logger, onUnhandledError) {
3968
+ constructor(eventManager, logger, onUnhandledError, mode) {
3760
3969
  this.eventManager = eventManager;
3761
3970
  this.logger = logger;
3762
3971
  this.onUnhandledError = onUnhandledError;
@@ -3764,6 +3973,7 @@ var Store = class {
3764
3973
  this.validator = this.registry.getValidator();
3765
3974
  this.overrideManager = new OverrideManager(this.registry);
3766
3975
  this.middlewareManager = new MiddlewareManager(this, eventManager, logger);
3976
+ this.mode = detectRunnerMode(mode);
3767
3977
  }
3768
3978
  static {
3769
3979
  __name(this, "Store");
@@ -3783,6 +3993,12 @@ var Store = class {
3783
3993
  get events() {
3784
3994
  return this.registry.events;
3785
3995
  }
3996
+ get errors() {
3997
+ return this.registry.errors;
3998
+ }
3999
+ get asyncContexts() {
4000
+ return this.registry.asyncContexts;
4001
+ }
3786
4002
  get taskMiddlewares() {
3787
4003
  return this.registry.taskMiddlewares;
3788
4004
  }
@@ -3885,19 +4101,19 @@ var Store = class {
3885
4101
  const dependentNodes = this.registry.getDependentNodes();
3886
4102
  const circularDependencies = findCircularDependencies(dependentNodes);
3887
4103
  if (circularDependencies.cycles.length > 0) {
3888
- throw new CircularDependenciesError(circularDependencies.cycles);
4104
+ circularDependenciesError.throw({ cycles: circularDependencies.cycles });
3889
4105
  }
3890
4106
  }
3891
4107
  validateEventEmissionGraph() {
3892
4108
  const eventNodes = this.registry.buildEventEmissionGraph();
3893
4109
  const circular = findCircularDependencies(eventNodes);
3894
4110
  if (circular.cycles.length > 0) {
3895
- throw new EventEmissionCycleError(circular.cycles);
4111
+ eventEmissionCycleError.throw({ cycles: circular.cycles });
3896
4112
  }
3897
4113
  }
3898
4114
  initializeStore(root, config) {
3899
4115
  if (this.#isInitialized) {
3900
- throw new StoreAlreadyInitializedError();
4116
+ storeAlreadyInitializedError.throw({});
3901
4117
  }
3902
4118
  this.registerGlobalComponents();
3903
4119
  this.setupRootResource(root, config);
@@ -3951,68 +4167,6 @@ var Store = class {
3951
4167
  }
3952
4168
  };
3953
4169
 
3954
- // src/globals/resources/debug/types.ts
3955
- var allFalse = Object.freeze({
3956
- logResourceBeforeRun: false,
3957
- logResourceAfterRun: false,
3958
- logMiddlewareBeforeRun: false,
3959
- logMiddlewareAfterRun: false,
3960
- logTaskBeforeRun: false,
3961
- logTaskAfterRun: false,
3962
- logTaskInput: false,
3963
- logTaskOutput: false,
3964
- logResourceConfig: false,
3965
- logResourceValue: false,
3966
- logHookTriggered: false,
3967
- logHookCompleted: false,
3968
- logEventEmissionOnRun: false,
3969
- logEventEmissionInput: false
3970
- });
3971
- var levelNormal = Object.freeze({
3972
- ...allFalse,
3973
- logTaskAfterRun: true,
3974
- logTaskBeforeRun: true,
3975
- logResourceBeforeRun: true,
3976
- logResourceAfterRun: true,
3977
- logMiddlewareBeforeRun: true,
3978
- logMiddlewareAfterRun: true,
3979
- logHookTriggered: true,
3980
- logHookCompleted: true,
3981
- logEventEmissionOnRun: true
3982
- });
3983
- Object.freeze(levelNormal);
3984
- var levelVerbose = Object.freeze({
3985
- ...levelNormal,
3986
- logTaskInput: true,
3987
- logTaskOutput: true,
3988
- logResourceConfig: true,
3989
- logResourceValue: true,
3990
- logHookTriggered: true,
3991
- logHookCompleted: true
3992
- });
3993
- Object.freeze(levelVerbose);
3994
- function formatConfig(config) {
3995
- if (config === "normal") {
3996
- return { ...levelNormal };
3997
- }
3998
- if (config === "verbose") {
3999
- return { ...levelVerbose };
4000
- }
4001
- return { ...allFalse, ...config };
4002
- }
4003
- __name(formatConfig, "formatConfig");
4004
- var getConfig = /* @__PURE__ */ __name((config, taggable) => {
4005
- if (!taggable) {
4006
- return formatConfig(config);
4007
- }
4008
- const debugTagConfig = debugTag.extract(taggable);
4009
- if (debugTagConfig) {
4010
- const debugTagConfigFormatted = formatConfig(debugTagConfig);
4011
- return { ...formatConfig(config), ...debugTagConfigFormatted };
4012
- }
4013
- return formatConfig(config);
4014
- }, "getConfig");
4015
-
4016
4170
  // src/globals/resources/debug/debugConfig.resource.ts
4017
4171
  var debugConfig = defineResource({
4018
4172
  id: "globals.debug.resources.config",
@@ -4340,8 +4494,8 @@ __name(registerShutdownHook, "registerShutdownHook");
4340
4494
 
4341
4495
  // src/models/UnhandledError.ts
4342
4496
  function createDefaultUnhandledError(logger) {
4343
- return async ({ error, kind, source }) => {
4344
- const normalizedError = error instanceof Error ? error : new Error(String(error));
4497
+ return async ({ error: error2, kind, source }) => {
4498
+ const normalizedError = error2 instanceof Error ? error2 : new Error(String(error2));
4345
4499
  await logger.error(`${normalizedError.toString()}`, {
4346
4500
  source,
4347
4501
  error: normalizedError,
@@ -4353,9 +4507,9 @@ function createDefaultUnhandledError(logger) {
4353
4507
  }
4354
4508
  __name(createDefaultUnhandledError, "createDefaultUnhandledError");
4355
4509
  function bindProcessErrorHandler(handler) {
4356
- return async (error, source) => {
4510
+ return async (error2, source) => {
4357
4511
  try {
4358
- await handler({ error, kind: "process", source });
4512
+ await handler({ error: error2, kind: "process", source });
4359
4513
  } catch {
4360
4514
  }
4361
4515
  };
@@ -4388,7 +4542,7 @@ var RunResult = class {
4388
4542
  if (typeof task2 === "string") {
4389
4543
  const taskId = task2;
4390
4544
  if (!this.store.tasks.has(taskId)) {
4391
- throw new RuntimeError(`Task "${taskId}" not found.`);
4545
+ throw new Error(`Task "${taskId}" not found.`);
4392
4546
  }
4393
4547
  task2 = this.store.tasks.get(taskId).task;
4394
4548
  }
@@ -4403,7 +4557,7 @@ var RunResult = class {
4403
4557
  if (typeof event2 === "string") {
4404
4558
  const eventId = event2;
4405
4559
  if (!this.store.events.has(eventId)) {
4406
- throw new RuntimeError(`Event "${eventId}" not found.`);
4560
+ throw new Error(`Event "${eventId}" not found.`);
4407
4561
  }
4408
4562
  event2 = this.store.events.get(eventId).event;
4409
4563
  }
@@ -4417,7 +4571,7 @@ var RunResult = class {
4417
4571
  this.getResourceValue = /* @__PURE__ */ __name((resource2) => {
4418
4572
  const resourceId = typeof resource2 === "string" ? resource2 : resource2.id;
4419
4573
  if (!this.store.resources.has(resourceId)) {
4420
- throw new ResourceNotFoundError(resourceId);
4574
+ throw new Error(`Resource "${resourceId}" not found.`);
4421
4575
  }
4422
4576
  return this.store.resources.get(resourceId).value;
4423
4577
  }, "getResourceValue");
@@ -4434,7 +4588,7 @@ var RunResult = class {
4434
4588
  async function run(resourceOrResourceWithConfig, options) {
4435
4589
  await getPlatform().init();
4436
4590
  const {
4437
- debug = void 0,
4591
+ debug: debug2 = void 0,
4438
4592
  logs = {},
4439
4593
  errorBoundary = true,
4440
4594
  shutdownHooks = true,
@@ -4490,8 +4644,8 @@ async function run(resourceOrResourceWithConfig, options) {
4490
4644
  }
4491
4645
  }, "disposeAll");
4492
4646
  try {
4493
- if (debug) {
4494
- store2.storeGenericItem(debugResource.with(debug));
4647
+ if (debug2) {
4648
+ store2.storeGenericItem(debugResource.with(debug2));
4495
4649
  }
4496
4650
  store2.initializeStore(resource2, config);
4497
4651
  await store2.processOverrides();
@@ -4558,11 +4712,13 @@ var TunnelError = class extends Error {
4558
4712
  static {
4559
4713
  __name(this, "TunnelError");
4560
4714
  }
4561
- constructor(code, message, details) {
4715
+ constructor(code, message, details, extras) {
4562
4716
  super(message);
4563
4717
  this.name = "TunnelError";
4564
4718
  this.code = code;
4565
4719
  this.details = details;
4720
+ this.id = extras?.id;
4721
+ this.data = extras?.data;
4566
4722
  }
4567
4723
  };
4568
4724
  function toTunnelError(input, fallbackMessage) {
@@ -4572,7 +4728,10 @@ function toTunnelError(input, fallbackMessage) {
4572
4728
  if (input && typeof input === "object" && "code" in input && "message" in input && typeof input.message === "string" && typeof input.code === "string") {
4573
4729
  const pe = input;
4574
4730
  const msg = pe.message || fallbackMessage || "Tunnel error";
4575
- return new TunnelError(pe.code, msg, pe.details);
4731
+ return new TunnelError(pe.code, msg, pe.details, {
4732
+ id: pe.id,
4733
+ data: pe.data
4734
+ });
4576
4735
  }
4577
4736
  if (input && typeof input === "object" && "message" in input && typeof input.message === "string") {
4578
4737
  return new TunnelError("UNKNOWN", input.message);
@@ -4603,7 +4762,7 @@ function assertOkEnvelope(envelope, opts) {
4603
4762
  __name(assertOkEnvelope, "assertOkEnvelope");
4604
4763
 
4605
4764
  // src/http-fetch-tunnel.resource.ts
4606
- async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest) {
4765
+ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest, contextHeaderText) {
4607
4766
  const controller = timeoutMs && timeoutMs > 0 ? new AbortController() : void 0;
4608
4767
  let timeout;
4609
4768
  try {
@@ -4614,6 +4773,7 @@ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer
4614
4773
  "content-type": "application/json; charset=utf-8",
4615
4774
  ...headers
4616
4775
  };
4776
+ if (contextHeaderText) reqHeaders["x-runner-context"] = contextHeaderText;
4617
4777
  if (onRequest) await onRequest({ url, headers: reqHeaders });
4618
4778
  const res = await fetchFn(url, {
4619
4779
  method: "POST",
@@ -4644,6 +4804,20 @@ function createExposureFetch(cfg) {
4644
4804
  "global fetch is not available; provide fetchImpl in config"
4645
4805
  );
4646
4806
  }
4807
+ const buildContextHeader = /* @__PURE__ */ __name(() => {
4808
+ if (!cfg.contexts || cfg.contexts.length === 0) return void 0;
4809
+ const map = {};
4810
+ for (const ctx of cfg.contexts) {
4811
+ try {
4812
+ const v = ctx.use();
4813
+ map[ctx.id] = ctx.serialize(v);
4814
+ } catch {
4815
+ }
4816
+ }
4817
+ const keys = Object.keys(map);
4818
+ if (keys.length === 0) return void 0;
4819
+ return cfg.serializer.stringify(map);
4820
+ }, "buildContextHeader");
4647
4821
  return {
4648
4822
  async task(id2, input) {
4649
4823
  const url = `${baseUrl}/task/${encodeURIComponent(id2)}`;
@@ -4654,9 +4828,19 @@ function createExposureFetch(cfg) {
4654
4828
  buildHeaders(),
4655
4829
  cfg?.timeoutMs,
4656
4830
  cfg.serializer,
4657
- cfg?.onRequest
4831
+ cfg?.onRequest,
4832
+ buildContextHeader()
4658
4833
  );
4659
- return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
4834
+ try {
4835
+ return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
4836
+ } catch (e) {
4837
+ const te = e;
4838
+ if (te && cfg.errorRegistry && te.id && te.data) {
4839
+ const helper = cfg.errorRegistry.get(String(te.id));
4840
+ if (helper) helper.throw(te.data);
4841
+ }
4842
+ throw e;
4843
+ }
4660
4844
  },
4661
4845
  async event(id2, payload) {
4662
4846
  const url = `${baseUrl}/event/${encodeURIComponent(id2)}`;
@@ -4667,9 +4851,19 @@ function createExposureFetch(cfg) {
4667
4851
  buildHeaders(),
4668
4852
  cfg?.timeoutMs,
4669
4853
  cfg.serializer,
4670
- cfg?.onRequest
4854
+ cfg?.onRequest,
4855
+ buildContextHeader()
4671
4856
  );
4672
- assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
4857
+ try {
4858
+ assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
4859
+ } catch (e) {
4860
+ const te = e;
4861
+ if (te && cfg.errorRegistry && te.id && te.data) {
4862
+ const helper = cfg.errorRegistry.get(String(te.id));
4863
+ if (helper) helper.throw(te.data);
4864
+ }
4865
+ throw e;
4866
+ }
4673
4867
  }
4674
4868
  };
4675
4869
  }
@@ -4721,14 +4915,14 @@ function buildTestFacade(deps) {
4721
4915
  __name(buildTestFacade, "buildTestFacade");
4722
4916
 
4723
4917
  // src/definers/builders/resource.ts
4724
- function clone(s, patch) {
4918
+ function clone2(s, patch) {
4725
4919
  return Object.freeze({
4726
4920
  // We reuse the frozen state while widening generics, hence the temporary cast.
4727
4921
  ...s,
4728
4922
  ...patch
4729
4923
  });
4730
4924
  }
4731
- __name(clone, "clone");
4925
+ __name(clone2, "clone");
4732
4926
  function toRegisterArray(items) {
4733
4927
  return Array.isArray(items) ? [...items] : [items];
4734
4928
  }
@@ -4812,7 +5006,7 @@ function makeResourceBuilder(state) {
4812
5006
  id: state.id,
4813
5007
  dependencies(deps, options) {
4814
5008
  const override = options?.override ?? false;
4815
- const next = clone(state, {
5009
+ const next = clone2(state, {
4816
5010
  dependencies: mergeDependencies(
4817
5011
  state.dependencies,
4818
5012
  deps,
@@ -4826,50 +5020,50 @@ function makeResourceBuilder(state) {
4826
5020
  },
4827
5021
  register(items, options) {
4828
5022
  const override = options?.override ?? false;
4829
- const next = clone(state, {
5023
+ const next = clone2(state, {
4830
5024
  register: mergeRegister(state.register, items, override)
4831
5025
  });
4832
5026
  return makeResourceBuilder(next);
4833
5027
  },
4834
5028
  middleware(mw, options) {
4835
5029
  const override = options?.override ?? false;
4836
- const next = clone(state, {
5030
+ const next = clone2(state, {
4837
5031
  middleware: mergeArray(state.middleware, mw, override)
4838
5032
  });
4839
5033
  return makeResourceBuilder(next);
4840
5034
  },
4841
5035
  tags(tags, options) {
4842
5036
  const override = options?.override ?? false;
4843
- const next = clone(state, { tags: mergeArray(state.tags, tags, override) });
5037
+ const next = clone2(state, { tags: mergeArray(state.tags, tags, override) });
4844
5038
  return makeResourceBuilder(next);
4845
5039
  },
4846
5040
  context(factory) {
4847
- const next = clone(state, { context: factory });
5041
+ const next = clone2(state, { context: factory });
4848
5042
  return makeResourceBuilder(next);
4849
5043
  },
4850
5044
  configSchema(schema) {
4851
- const next = clone(state, { configSchema: schema });
5045
+ const next = clone2(state, { configSchema: schema });
4852
5046
  return makeResourceBuilder(next);
4853
5047
  },
4854
5048
  resultSchema(schema) {
4855
- const next = clone(state, { resultSchema: schema });
5049
+ const next = clone2(state, { resultSchema: schema });
4856
5050
  return makeResourceBuilder(next);
4857
5051
  },
4858
5052
  init(fn) {
4859
- const next = clone(state, { init: fn });
5053
+ const next = clone2(state, { init: fn });
4860
5054
  return makeResourceBuilder(next);
4861
5055
  },
4862
5056
  dispose(fn) {
4863
- const next = clone(state, { dispose: fn });
5057
+ const next = clone2(state, { dispose: fn });
4864
5058
  return makeResourceBuilder(next);
4865
5059
  },
4866
5060
  meta(m) {
4867
- const next = clone(state, { meta: m });
5061
+ const next = clone2(state, { meta: m });
4868
5062
  return makeResourceBuilder(next);
4869
5063
  },
4870
5064
  overrides(o, options) {
4871
5065
  const override = options?.override ?? false;
4872
- const next = clone(state, {
5066
+ const next = clone2(state, {
4873
5067
  overrides: mergeArray(state.overrides, o, override)
4874
5068
  });
4875
5069
  return makeResourceBuilder(next);
@@ -4956,16 +5150,16 @@ function mergeDepsNoConfig(existing, addition, override) {
4956
5150
  __name(mergeDepsNoConfig, "mergeDepsNoConfig");
4957
5151
 
4958
5152
  // src/definers/builders/task.phantom.ts
4959
- function clone2(s, patch) {
5153
+ function clone3(s, patch) {
4960
5154
  return cloneState(s, patch);
4961
5155
  }
4962
- __name(clone2, "clone");
5156
+ __name(clone3, "clone");
4963
5157
  function makePhantomTaskBuilder(state) {
4964
5158
  const builder = {
4965
5159
  id: state.id,
4966
5160
  dependencies(deps, options) {
4967
5161
  const override = options?.override ?? false;
4968
- const next = clone2(state, {
5162
+ const next = clone3(state, {
4969
5163
  dependencies: mergeDepsNoConfig(
4970
5164
  state.dependencies,
4971
5165
  deps,
@@ -4979,26 +5173,26 @@ function makePhantomTaskBuilder(state) {
4979
5173
  },
4980
5174
  middleware(mw, options) {
4981
5175
  const override = options?.override ?? false;
4982
- const next = clone2(state, {
5176
+ const next = clone3(state, {
4983
5177
  middleware: mergeArray2(state.middleware, mw, override)
4984
5178
  });
4985
5179
  return makePhantomTaskBuilder(next);
4986
5180
  },
4987
5181
  tags(t, options) {
4988
5182
  const override = options?.override ?? false;
4989
- const next = clone2(state, { tags: mergeArray2(state.tags, t, override) });
5183
+ const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
4990
5184
  return makePhantomTaskBuilder(next);
4991
5185
  },
4992
5186
  inputSchema(schema) {
4993
- const next = clone2(state, { inputSchema: schema });
5187
+ const next = clone3(state, { inputSchema: schema });
4994
5188
  return makePhantomTaskBuilder(next);
4995
5189
  },
4996
5190
  resultSchema(schema) {
4997
- const next = clone2(state, { resultSchema: schema });
5191
+ const next = clone3(state, { resultSchema: schema });
4998
5192
  return makePhantomTaskBuilder(next);
4999
5193
  },
5000
5194
  meta(m) {
5001
- const next = clone2(state, { meta: m });
5195
+ const next = clone3(state, { meta: m });
5002
5196
  return makePhantomTaskBuilder(next);
5003
5197
  },
5004
5198
  build() {
@@ -5032,16 +5226,16 @@ function phantomTaskBuilder(id2) {
5032
5226
  __name(phantomTaskBuilder, "phantomTaskBuilder");
5033
5227
 
5034
5228
  // src/definers/builders/task.ts
5035
- function clone3(s, patch) {
5229
+ function clone4(s, patch) {
5036
5230
  return cloneState(s, patch);
5037
5231
  }
5038
- __name(clone3, "clone");
5232
+ __name(clone4, "clone");
5039
5233
  function makeTaskBuilder(state) {
5040
5234
  const builder = {
5041
5235
  id: state.id,
5042
5236
  dependencies(deps, options) {
5043
5237
  const override = options?.override ?? false;
5044
- const next = clone3(state, {
5238
+ const next = clone4(state, {
5045
5239
  dependencies: mergeDepsNoConfig(
5046
5240
  state.dependencies,
5047
5241
  deps,
@@ -5055,22 +5249,22 @@ function makeTaskBuilder(state) {
5055
5249
  },
5056
5250
  middleware(mw, options) {
5057
5251
  const override = options?.override ?? false;
5058
- const next = clone3(state, {
5252
+ const next = clone4(state, {
5059
5253
  middleware: mergeArray2(state.middleware, mw, override)
5060
5254
  });
5061
5255
  return makeTaskBuilder(next);
5062
5256
  },
5063
5257
  tags(t, options) {
5064
5258
  const override = options?.override ?? false;
5065
- const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
5259
+ const next = clone4(state, { tags: mergeArray2(state.tags, t, override) });
5066
5260
  return makeTaskBuilder(next);
5067
5261
  },
5068
5262
  inputSchema(schema) {
5069
- const next = clone3(state, { inputSchema: schema });
5263
+ const next = clone4(state, { inputSchema: schema });
5070
5264
  return makeTaskBuilder(next);
5071
5265
  },
5072
5266
  resultSchema(schema) {
5073
- const next = clone3(state, { resultSchema: schema });
5267
+ const next = clone4(state, { resultSchema: schema });
5074
5268
  return makeTaskBuilder(next);
5075
5269
  },
5076
5270
  run(fn) {
@@ -5078,11 +5272,11 @@ function makeTaskBuilder(state) {
5078
5272
  input,
5079
5273
  deps
5080
5274
  ), "wrapped");
5081
- const next = clone3(state, { run: wrapped });
5275
+ const next = clone4(state, { run: wrapped });
5082
5276
  return makeTaskBuilder(next);
5083
5277
  },
5084
5278
  meta(m) {
5085
- const next = clone3(state, { meta: m });
5279
+ const next = clone4(state, { meta: m });
5086
5280
  return makeTaskBuilder(next);
5087
5281
  },
5088
5282
  build() {
@@ -5113,25 +5307,25 @@ var task = Object.assign(taskBuilder, {
5113
5307
  });
5114
5308
 
5115
5309
  // src/definers/builders/event.ts
5116
- function clone4(s, patch) {
5310
+ function clone5(s, patch) {
5117
5311
  return Object.freeze({ ...s, ...patch });
5118
5312
  }
5119
- __name(clone4, "clone");
5313
+ __name(clone5, "clone");
5120
5314
  function makeEventBuilder(state) {
5121
5315
  const b = {
5122
5316
  id: state.id,
5123
5317
  payloadSchema(schema) {
5124
- const next = clone4(state, { payloadSchema: schema });
5318
+ const next = clone5(state, { payloadSchema: schema });
5125
5319
  return makeEventBuilder(next);
5126
5320
  },
5127
5321
  tags(t, options) {
5128
5322
  const override = options?.override ?? false;
5129
5323
  const tags = mergeArray2(state.tags, t, override);
5130
- const next = clone4(state, { tags });
5324
+ const next = clone5(state, { tags });
5131
5325
  return makeEventBuilder(next);
5132
5326
  },
5133
5327
  meta(m) {
5134
- const next = clone4(state, { meta: m });
5328
+ const next = clone5(state, { meta: m });
5135
5329
  return makeEventBuilder(next);
5136
5330
  },
5137
5331
  build() {
@@ -5156,21 +5350,21 @@ __name(eventBuilder, "eventBuilder");
5156
5350
  var event = eventBuilder;
5157
5351
 
5158
5352
  // src/definers/builders/hook.ts
5159
- function clone5(s, patch) {
5353
+ function clone6(s, patch) {
5160
5354
  return Object.freeze({ ...s, ...patch });
5161
5355
  }
5162
- __name(clone5, "clone");
5356
+ __name(clone6, "clone");
5163
5357
  function makeHookBuilder(state) {
5164
5358
  const b = {
5165
5359
  id: state.id,
5166
5360
  on(on) {
5167
- const next = clone5(state, { on });
5361
+ const next = clone6(state, { on });
5168
5362
  return makeHookBuilder(
5169
5363
  next
5170
5364
  );
5171
5365
  },
5172
5366
  order(order) {
5173
- const next = clone5(state, { order });
5367
+ const next = clone6(state, { order });
5174
5368
  return makeHookBuilder(next);
5175
5369
  },
5176
5370
  dependencies(deps, options) {
@@ -5197,7 +5391,7 @@ function makeHookBuilder(state) {
5197
5391
  const a = deps;
5198
5392
  merged = { ...e, ...a };
5199
5393
  }
5200
- const next = clone5(state, { dependencies: merged });
5394
+ const next = clone6(state, { dependencies: merged });
5201
5395
  if (override) {
5202
5396
  return makeHookBuilder(
5203
5397
  next
@@ -5210,17 +5404,17 @@ function makeHookBuilder(state) {
5210
5404
  tags(t, options) {
5211
5405
  const override = options?.override ?? false;
5212
5406
  const tags = mergeArray2(state.tags, t, override);
5213
- const next = clone5(state, { tags });
5407
+ const next = clone6(state, { tags });
5214
5408
  return makeHookBuilder(next);
5215
5409
  },
5216
5410
  meta(m) {
5217
- const next = clone5(state, { meta: m });
5411
+ const next = clone6(state, { meta: m });
5218
5412
  return makeHookBuilder(
5219
5413
  next
5220
5414
  );
5221
5415
  },
5222
5416
  run(fn) {
5223
- const next = clone5(state, { run: fn });
5417
+ const next = clone6(state, { run: fn });
5224
5418
  return makeHookBuilder(next);
5225
5419
  },
5226
5420
  build() {
@@ -5265,7 +5459,10 @@ function makeTaskMiddlewareBuilder(state) {
5265
5459
  } else if (isFnExisting && isFnAddition) {
5266
5460
  const e = state.dependencies;
5267
5461
  const a = deps;
5268
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
5462
+ merged = /* @__PURE__ */ __name(((cfg) => ({
5463
+ ...e(cfg),
5464
+ ...a(cfg)
5465
+ })), "merged");
5269
5466
  } else if (isFnExisting && !isFnAddition) {
5270
5467
  const e = state.dependencies;
5271
5468
  const a = deps;
@@ -5352,7 +5549,10 @@ function makeResourceMiddlewareBuilder(state) {
5352
5549
  } else if (isFnExisting && isFnAddition) {
5353
5550
  const e = state.dependencies;
5354
5551
  const a = deps;
5355
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
5552
+ merged = /* @__PURE__ */ __name(((cfg) => ({
5553
+ ...e(cfg),
5554
+ ...a(cfg)
5555
+ })), "merged");
5356
5556
  } else if (isFnExisting && !isFnAddition) {
5357
5557
  const e = state.dependencies;
5358
5558
  const a = deps;
@@ -5426,25 +5626,25 @@ var taskMiddleware = taskMiddlewareBuilder;
5426
5626
  var resourceMiddleware = resourceMiddlewareBuilder;
5427
5627
 
5428
5628
  // src/definers/builders/tag.ts
5429
- function clone6(s, patch) {
5629
+ function clone7(s, patch) {
5430
5630
  return Object.freeze({ ...s, ...patch });
5431
5631
  }
5432
- __name(clone6, "clone");
5632
+ __name(clone7, "clone");
5433
5633
  function makeTagBuilder(state) {
5434
5634
  const b = {
5435
5635
  id: state.id,
5436
5636
  meta(m) {
5437
- const next = clone6(state, { meta: m });
5637
+ const next = clone7(state, { meta: m });
5438
5638
  return makeTagBuilder(next);
5439
5639
  },
5440
5640
  configSchema(schema) {
5441
- const next = clone6(state, { configSchema: schema });
5641
+ const next = clone7(state, { configSchema: schema });
5442
5642
  return makeTagBuilder(
5443
5643
  next
5444
5644
  );
5445
5645
  },
5446
5646
  config(config) {
5447
- const next = clone6(state, { config });
5647
+ const next = clone7(state, { config });
5448
5648
  return makeTagBuilder(
5449
5649
  next
5450
5650
  );
@@ -5475,6 +5675,51 @@ function tagBuilder(id2) {
5475
5675
  __name(tagBuilder, "tagBuilder");
5476
5676
  var tag = tagBuilder;
5477
5677
 
5678
+ // src/definers/builders/asyncContext.ts
5679
+ function clone8(s, patch) {
5680
+ return Object.freeze({ ...s, ...patch });
5681
+ }
5682
+ __name(clone8, "clone");
5683
+ function makeAsyncContextBuilder(state) {
5684
+ const b = {
5685
+ id: state.id,
5686
+ serialize(fn) {
5687
+ const next = clone8(state, { serialize: fn });
5688
+ return makeAsyncContextBuilder(next);
5689
+ },
5690
+ parse(fn) {
5691
+ const next = clone8(state, { parse: fn });
5692
+ return makeAsyncContextBuilder(next);
5693
+ },
5694
+ configSchema(schema) {
5695
+ const next = clone8(state, { configSchema: schema });
5696
+ return makeAsyncContextBuilder(next);
5697
+ },
5698
+ build() {
5699
+ const def = {
5700
+ id: state.id,
5701
+ serialize: state.serialize,
5702
+ parse: state.parse,
5703
+ configSchema: state.configSchema
5704
+ };
5705
+ return defineAsyncContext(def);
5706
+ }
5707
+ };
5708
+ return b;
5709
+ }
5710
+ __name(makeAsyncContextBuilder, "makeAsyncContextBuilder");
5711
+ function asyncContextBuilder(id2) {
5712
+ const initial = Object.freeze({
5713
+ id: id2,
5714
+ serialize: void 0,
5715
+ parse: void 0,
5716
+ configSchema: void 0
5717
+ });
5718
+ return makeAsyncContextBuilder(initial);
5719
+ }
5720
+ __name(asyncContextBuilder, "asyncContextBuilder");
5721
+ var asyncContext = asyncContextBuilder;
5722
+
5478
5723
  // src/models/Semaphore.ts
5479
5724
  var Semaphore = class {
5480
5725
  constructor(maxPermits) {
@@ -5525,9 +5770,9 @@ var Semaphore = class {
5525
5770
  options.signal.removeEventListener("abort", abortHandler);
5526
5771
  originalResolve();
5527
5772
  };
5528
- operation.reject = (error) => {
5773
+ operation.reject = (error2) => {
5529
5774
  options.signal.removeEventListener("abort", abortHandler);
5530
- originalReject(error);
5775
+ originalReject(error2);
5531
5776
  };
5532
5777
  }
5533
5778
  this.waitingQueue.push(operation);
@@ -5628,20 +5873,24 @@ var globals = {
5628
5873
  resources: globalResources,
5629
5874
  middleware: globalMiddlewares,
5630
5875
  tags: globalTags,
5631
- tunnels
5876
+ tunnels,
5877
+ debug
5632
5878
  };
5879
+ var createContext2 = createContext;
5633
5880
  var r = Object.freeze({
5634
5881
  resource,
5635
5882
  task,
5636
5883
  event,
5637
5884
  hook,
5638
5885
  tag,
5886
+ asyncContext,
5887
+ error,
5639
5888
  middleware: Object.freeze({
5640
5889
  task: taskMiddleware,
5641
5890
  resource: resourceMiddleware
5642
5891
  })
5643
5892
  });
5644
5893
 
5645
- export { DependencyProcessor, errors_exports as Errors, EventManager, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, Semaphore, Store, TaskRunner, allFalse, bindProcessErrorHandler, createContext, createDefaultUnhandledError, createTestResource, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, levelNormal, levelVerbose, defineOverride as override, r, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
5894
+ export { DependencyProcessor, errors_exports as Errors, EventManager, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, Semaphore, Store, TaskRunner, allFalse, defineAsyncContext as asyncContext, bindProcessErrorHandler, createContext2 as createContext, createDefaultUnhandledError, createTestResource, debug, debugLevels, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, levelNormal, levelVerbose, defineOverride as override, r, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
5646
5895
  //# sourceMappingURL=index.mjs.map
5647
5896
  //# sourceMappingURL=index.mjs.map