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