@bluelibs/runner 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/AI.md +88 -95
  2. package/README.md +205 -144
  3. package/dist/browser/index.cjs +738 -486
  4. package/dist/browser/index.cjs.map +1 -1
  5. package/dist/browser/index.mjs +735 -486
  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 +738 -486
  15. package/dist/edge/index.cjs.map +1 -1
  16. package/dist/edge/index.mjs +735 -486
  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 +914 -531
  35. package/dist/node/node.cjs.map +1 -1
  36. package/dist/node/node.mjs +911 -531
  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 +738 -486
  44. package/dist/universal/index.cjs.map +1 -1
  45. package/dist/universal/index.mjs +735 -486
  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
@@ -3787,8 +3787,11 @@ var require_lib = __commonJS({
3787
3787
  // src/defs.ts
3788
3788
  var defs_exports = {};
3789
3789
  __export(defs_exports, {
3790
+ RunnerMode: () => RunnerMode,
3790
3791
  isOneOf: () => isOneOf,
3791
3792
  onAnyOf: () => onAnyOf,
3793
+ symbolAsyncContext: () => symbolAsyncContext,
3794
+ symbolError: () => symbolError,
3792
3795
  symbolEvent: () => symbolEvent,
3793
3796
  symbolFilePath: () => symbolFilePath,
3794
3797
  symbolHook: () => symbolHook,
@@ -3803,6 +3806,7 @@ __export(defs_exports, {
3803
3806
  symbolTagConfigured: () => symbolTagConfigured,
3804
3807
  symbolTask: () => symbolTask,
3805
3808
  symbolTaskMiddleware: () => symbolTaskMiddleware,
3809
+ symbolTunneledBy: () => symbolTunneledBy,
3806
3810
  symbolTunneledTask: () => symbolTunneledTask
3807
3811
  });
3808
3812
 
@@ -3816,6 +3820,7 @@ var symbolResourceWithConfig = Symbol.for(
3816
3820
  "runner.resourceWithConfig"
3817
3821
  );
3818
3822
  var symbolEvent = Symbol.for("runner.event");
3823
+ var symbolError = Symbol.for("runner.error");
3819
3824
  var symbolMiddleware = Symbol.for("runner.middleware");
3820
3825
  var symbolTaskMiddleware = Symbol.for(
3821
3826
  "runner.taskMiddleware"
@@ -3829,6 +3834,9 @@ var symbolMiddlewareConfigured = Symbol.for(
3829
3834
  var symbolTunneledTask = Symbol.for(
3830
3835
  "runner.tunneledTask"
3831
3836
  );
3837
+ var symbolTunneledBy = Symbol.for(
3838
+ "runner.tunneledBy"
3839
+ );
3832
3840
  var symbolHook = Symbol.for("runner.hook");
3833
3841
  var symbolTag = Symbol.for("runner.tag");
3834
3842
  var symbolTagConfigured = Symbol.for(
@@ -3838,6 +3846,9 @@ var symbolOptionalDependency = Symbol.for(
3838
3846
  "runner.optionalDependency"
3839
3847
  );
3840
3848
  var symbolFilePath = Symbol.for("runner.filePath");
3849
+ var symbolAsyncContext = Symbol.for(
3850
+ "runner.asyncContext"
3851
+ );
3841
3852
 
3842
3853
  // src/types/event.ts
3843
3854
  function onAnyOf(...defs) {
@@ -3848,6 +3859,14 @@ function isOneOf(emission, defs) {
3848
3859
  return defs.some((d) => d.id === emission.id);
3849
3860
  }
3850
3861
  __name(isOneOf, "isOneOf");
3862
+
3863
+ // src/types/runner.ts
3864
+ var RunnerMode = /* @__PURE__ */ ((RunnerMode2) => {
3865
+ RunnerMode2["TEST"] = "test";
3866
+ RunnerMode2["DEV"] = "dev";
3867
+ RunnerMode2["PROD"] = "prod";
3868
+ return RunnerMode2;
3869
+ })(RunnerMode || {});
3851
3870
  var cacheFactoryTask = defineTask({
3852
3871
  id: "globals.tasks.cacheFactory",
3853
3872
  run: /* @__PURE__ */ __name(async (options) => {
@@ -3992,26 +4011,123 @@ __name(defineHook, "defineHook");
3992
4011
  // src/errors.ts
3993
4012
  var errors_exports = {};
3994
4013
  __export(errors_exports, {
3995
- CancellationError: () => CancellationError,
3996
- CircularDependenciesError: () => CircularDependenciesError,
3997
- ContextError: () => ContextError,
3998
- DependencyNotFoundError: () => DependencyNotFoundError,
3999
- DuplicateRegistrationError: () => DuplicateRegistrationError,
4000
- EventCycleError: () => EventCycleError,
4001
- EventEmissionCycleError: () => EventEmissionCycleError,
4002
- EventNotFoundError: () => EventNotFoundError,
4003
- LockedError: () => LockedError,
4004
- MiddlewareNotRegisteredError: () => MiddlewareNotRegisteredError,
4005
- PlatformUnsupportedFunction: () => PlatformUnsupportedFunction,
4006
- ResourceNotFoundError: () => ResourceNotFoundError,
4007
- RuntimeError: () => RuntimeError,
4008
- StoreAlreadyInitializedError: () => StoreAlreadyInitializedError,
4009
- TagNotFoundError: () => TagNotFoundError,
4010
- UnknownItemTypeError: () => UnknownItemTypeError,
4011
- ValidationError: () => ValidationError,
4012
- isCancellationError: () => isCancellationError
4014
+ cancellationError: () => cancellationError,
4015
+ circularDependenciesError: () => circularDependenciesError,
4016
+ contextError: () => contextError,
4017
+ dependencyNotFoundError: () => dependencyNotFoundError,
4018
+ duplicateRegistrationError: () => duplicateRegistrationError,
4019
+ eventCycleError: () => eventCycleError,
4020
+ eventEmissionCycleError: () => eventEmissionCycleError,
4021
+ eventNotFoundError: () => eventNotFoundError,
4022
+ isCancellationError: () => isCancellationError,
4023
+ lockedError: () => lockedError,
4024
+ middlewareNotRegisteredError: () => middlewareNotRegisteredError,
4025
+ platformUnsupportedFunctionError: () => platformUnsupportedFunctionError,
4026
+ resourceNotFoundError: () => resourceNotFoundError,
4027
+ storeAlreadyInitializedError: () => storeAlreadyInitializedError,
4028
+ tagNotFoundError: () => tagNotFoundError,
4029
+ tunnelOwnershipConflictError: () => tunnelOwnershipConflictError,
4030
+ unknownItemTypeError: () => unknownItemTypeError,
4031
+ validationError: () => validationError
4013
4032
  });
4014
4033
 
4034
+ // src/definers/defineError.ts
4035
+ var RunnerError = class extends Error {
4036
+ constructor(id2, message, data) {
4037
+ super(message);
4038
+ this.id = id2;
4039
+ this.data = data;
4040
+ this.name = id2;
4041
+ }
4042
+ static {
4043
+ __name(this, "RunnerError");
4044
+ }
4045
+ };
4046
+ var _a;
4047
+ _a = symbolError;
4048
+ var ErrorHelper = class {
4049
+ constructor(definition) {
4050
+ this.definition = definition;
4051
+ this[_a] = true;
4052
+ }
4053
+ static {
4054
+ __name(this, "ErrorHelper");
4055
+ }
4056
+ get id() {
4057
+ return this.definition.id;
4058
+ }
4059
+ throw(data) {
4060
+ const parsed = this.definition.dataSchema ? this.definition.dataSchema.parse(data) : data;
4061
+ const message = this.definition.format(parsed);
4062
+ throw new RunnerError(this.definition.id, message, parsed);
4063
+ }
4064
+ is(error2) {
4065
+ return error2 instanceof RunnerError && error2.name === this.definition.id;
4066
+ }
4067
+ optional() {
4068
+ return {
4069
+ inner: this,
4070
+ [symbolOptionalDependency]: true
4071
+ };
4072
+ }
4073
+ };
4074
+ function defineError(definition) {
4075
+ if (!definition.format) {
4076
+ definition.format = (data) => `${JSON.stringify(data)}`;
4077
+ }
4078
+ return new ErrorHelper(definition);
4079
+ }
4080
+ __name(defineError, "defineError");
4081
+
4082
+ // src/definers/builders/error.ts
4083
+ function clone(s, patch) {
4084
+ return Object.freeze({ ...s, ...patch });
4085
+ }
4086
+ __name(clone, "clone");
4087
+ function makeErrorBuilder(state) {
4088
+ const b = {
4089
+ id: state.id,
4090
+ serialize(fn) {
4091
+ const next = clone(state, { serialize: fn });
4092
+ return makeErrorBuilder(next);
4093
+ },
4094
+ parse(fn) {
4095
+ const next = clone(state, { parse: fn });
4096
+ return makeErrorBuilder(next);
4097
+ },
4098
+ dataSchema(schema) {
4099
+ const next = clone(state, { dataSchema: schema });
4100
+ return makeErrorBuilder(next);
4101
+ },
4102
+ format(fn) {
4103
+ const next = clone(state, { format: fn });
4104
+ return makeErrorBuilder(next);
4105
+ },
4106
+ build() {
4107
+ return defineError({
4108
+ id: state.id,
4109
+ serialize: state.serialize,
4110
+ parse: state.parse,
4111
+ dataSchema: state.dataSchema,
4112
+ format: state.format
4113
+ });
4114
+ }
4115
+ };
4116
+ return b;
4117
+ }
4118
+ __name(makeErrorBuilder, "makeErrorBuilder");
4119
+ function errorBuilder(id2) {
4120
+ const initial = Object.freeze({
4121
+ id: id2,
4122
+ serialize: void 0,
4123
+ parse: void 0,
4124
+ dataSchema: void 0
4125
+ });
4126
+ return makeErrorBuilder(initial);
4127
+ }
4128
+ __name(errorBuilder, "errorBuilder");
4129
+ var error = errorBuilder;
4130
+
4015
4131
  // src/platform/adapters/node-als.ts
4016
4132
  async function loadAsyncLocalStorageClass() {
4017
4133
  const mod = await import('async_hooks');
@@ -4135,7 +4251,7 @@ var BrowserPlatformAdapter = class {
4135
4251
  };
4136
4252
  }
4137
4253
  exit() {
4138
- throw new PlatformUnsupportedFunction("exit");
4254
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
4139
4255
  }
4140
4256
  getEnv(key) {
4141
4257
  const g = globalThis;
@@ -4151,10 +4267,14 @@ var BrowserPlatformAdapter = class {
4151
4267
  createAsyncLocalStorage() {
4152
4268
  return {
4153
4269
  getStore: /* @__PURE__ */ __name(() => {
4154
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4270
+ platformUnsupportedFunctionError.throw({
4271
+ functionName: "createAsyncLocalStorage"
4272
+ });
4155
4273
  }, "getStore"),
4156
- run: /* @__PURE__ */ __name(() => {
4157
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4274
+ run: /* @__PURE__ */ __name((_store, _callback) => {
4275
+ platformUnsupportedFunctionError.throw({
4276
+ functionName: "createAsyncLocalStorage"
4277
+ });
4158
4278
  }, "run")
4159
4279
  };
4160
4280
  }
@@ -4230,7 +4350,7 @@ var GenericUniversalPlatformAdapter = class {
4230
4350
  };
4231
4351
  }
4232
4352
  exit() {
4233
- throw new PlatformUnsupportedFunction("exit");
4353
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
4234
4354
  }
4235
4355
  getEnv(key) {
4236
4356
  const g = globalThis;
@@ -4246,10 +4366,14 @@ var GenericUniversalPlatformAdapter = class {
4246
4366
  createAsyncLocalStorage() {
4247
4367
  return {
4248
4368
  getStore: /* @__PURE__ */ __name(() => {
4249
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4369
+ platformUnsupportedFunctionError.throw({
4370
+ functionName: "createAsyncLocalStorage"
4371
+ });
4250
4372
  }, "getStore"),
4251
- run: /* @__PURE__ */ __name(() => {
4252
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4373
+ run: /* @__PURE__ */ __name((_store, _callback) => {
4374
+ platformUnsupportedFunctionError.throw({
4375
+ functionName: "createAsyncLocalStorage"
4376
+ });
4253
4377
  }, "run")
4254
4378
  };
4255
4379
  }
@@ -4446,198 +4570,90 @@ var PlatformAdapter = class {
4446
4570
  };
4447
4571
 
4448
4572
  // src/errors.ts
4449
- var RuntimeError = class extends Error {
4450
- static {
4451
- __name(this, "RuntimeError");
4452
- }
4453
- constructor(message) {
4454
- super(message);
4455
- this.name = "RuntimeError";
4456
- }
4457
- };
4458
- var DuplicateRegistrationError = class extends RuntimeError {
4459
- static {
4460
- __name(this, "DuplicateRegistrationError");
4461
- }
4462
- constructor(type, id2) {
4463
- super(
4464
- `${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.`
4465
- );
4466
- this.name = "DuplicateRegistrationError";
4467
- }
4468
- };
4469
- var DependencyNotFoundError = class extends RuntimeError {
4470
- static {
4471
- __name(this, "DependencyNotFoundError");
4472
- }
4473
- constructor(key) {
4474
- super(
4475
- `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
4476
- );
4477
- this.name = "DependencyNotFoundError";
4478
- }
4479
- };
4480
- var UnknownItemTypeError = class extends RuntimeError {
4481
- static {
4482
- __name(this, "UnknownItemTypeError");
4483
- }
4484
- constructor(item) {
4485
- super(
4486
- `Unknown item type: ${item}. Please ensure you are not using different versions of '@bluelibs/runner'`
4487
- );
4488
- this.name = "UnknownItemTypeError";
4489
- }
4490
- };
4491
- var ContextError = class extends Error {
4492
- static {
4493
- __name(this, "ContextError");
4494
- }
4495
- constructor(message) {
4496
- super(message);
4497
- this.name = "ContextError";
4498
- }
4499
- };
4500
- var CircularDependenciesError = class extends RuntimeError {
4501
- static {
4502
- __name(this, "CircularDependenciesError");
4503
- }
4504
- constructor(cycles) {
4505
- const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
4506
- const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
4507
- let guidance = "\n\nTo resolve circular dependencies:";
4508
- guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
4509
- guidance += "\n \u2022 Extract shared dependencies into separate resources";
4510
- if (hasMiddleware) {
4511
- guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
4512
- guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
4513
- }
4514
- super(`Circular dependencies detected:
4515
- ${cycleDetails}${guidance}`);
4516
- this.name = "CircularDependenciesError";
4517
- }
4518
- };
4519
- var EventNotFoundError = class extends RuntimeError {
4520
- static {
4521
- __name(this, "EventNotFoundError");
4522
- }
4523
- constructor(id2) {
4524
- super(`Event "${id2.toString()}" not found. Did you forget to register it?`);
4525
- this.name = "EventNotFoundError";
4526
- }
4527
- };
4528
- var ResourceNotFoundError = class extends RuntimeError {
4529
- static {
4530
- __name(this, "ResourceNotFoundError");
4531
- }
4532
- constructor(id2) {
4533
- super(
4534
- `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
4535
- );
4536
- this.name = "ResourceNotFoundError";
4537
- }
4538
- };
4539
- var MiddlewareNotRegisteredError = class extends RuntimeError {
4540
- static {
4541
- __name(this, "MiddlewareNotRegisteredError");
4542
- }
4543
- constructor(type, source, middlewareId) {
4544
- super(
4545
- `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
4546
- );
4547
- this.name = `MiddlewareNotRegisteredError: ${type} ${source} ${middlewareId}`;
4548
- }
4549
- };
4550
- var TagNotFoundError = class extends RuntimeError {
4551
- static {
4552
- __name(this, "TagNotFoundError");
4553
- }
4554
- constructor(id2) {
4555
- super(
4556
- `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
4557
- );
4558
- this.name = "TagNotRegisteredError";
4559
- }
4560
- };
4561
- var LockedError = class extends RuntimeError {
4562
- static {
4563
- __name(this, "LockedError");
4564
- }
4565
- constructor(what) {
4566
- super(`Cannot modify the ${what.toString()} when it is locked.`);
4567
- this.name = "LockedError";
4568
- }
4569
- };
4570
- var StoreAlreadyInitializedError = class extends RuntimeError {
4571
- static {
4572
- __name(this, "StoreAlreadyInitializedError");
4573
- }
4574
- constructor() {
4575
- super("Store already initialized. Cannot reinitialize.");
4576
- this.name = "StoreAlreadyInitializedError";
4577
- }
4578
- };
4579
- var ValidationError = class extends RuntimeError {
4580
- static {
4581
- __name(this, "ValidationError");
4582
- }
4583
- constructor(type, id2, originalError) {
4584
- const errorMessage2 = originalError instanceof Error ? originalError.message : String(originalError);
4585
- super(`${type} validation failed for ${id2.toString()}: ${errorMessage2}`);
4586
- this.name = "ValidationError";
4587
- }
4588
- };
4589
- var EventCycleError = class extends RuntimeError {
4590
- static {
4591
- __name(this, "EventCycleError");
4592
- }
4593
- constructor(path3) {
4594
- const chain = path3.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
4595
- super(
4596
- `Event emission cycle detected:
4573
+ var duplicateRegistrationError = error("runner.errors.duplicateRegistration").format(
4574
+ ({ 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.`
4575
+ ).build();
4576
+ var dependencyNotFoundError = error("runner.errors.dependencyNotFound").format(
4577
+ ({ key }) => `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
4578
+ ).build();
4579
+ var unknownItemTypeError = error(
4580
+ "runner.errors.unknownItemType"
4581
+ ).format(
4582
+ ({ item }) => `Unknown item type: ${String(
4583
+ item
4584
+ )}. Please ensure you are not using different versions of '@bluelibs/runner'`
4585
+ ).build();
4586
+ var contextError = error(
4587
+ "runner.errors.context"
4588
+ ).format(({ details }) => details ?? "Context error").build();
4589
+ var circularDependenciesError = error("runner.errors.circularDependencies").format(({ cycles }) => {
4590
+ const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
4591
+ const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
4592
+ let guidance = "\n\nTo resolve circular dependencies:";
4593
+ guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
4594
+ guidance += "\n \u2022 Extract shared dependencies into separate resources";
4595
+ if (hasMiddleware) {
4596
+ guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
4597
+ guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
4598
+ }
4599
+ return `Circular dependencies detected:
4600
+ ${cycleDetails}${guidance}`;
4601
+ }).build();
4602
+ var eventNotFoundError = error(
4603
+ "runner.errors.eventNotFound"
4604
+ ).format(
4605
+ ({ id: id2 }) => `Event "${id2.toString()}" not found. Did you forget to register it?`
4606
+ ).build();
4607
+ var resourceNotFoundError = error(
4608
+ "runner.errors.resourceNotFound"
4609
+ ).format(
4610
+ ({ id: id2 }) => `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
4611
+ ).build();
4612
+ var middlewareNotRegisteredError = error("runner.errors.middlewareNotRegistered").format(
4613
+ ({ type, source, middlewareId }) => `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
4614
+ ).build();
4615
+ var tagNotFoundError = error(
4616
+ "runner.errors.tagNotFound"
4617
+ ).format(
4618
+ ({ id: id2 }) => `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
4619
+ ).build();
4620
+ var lockedError = error(
4621
+ "runner.errors.locked"
4622
+ ).format(
4623
+ ({ what }) => `Cannot modify the ${what.toString()} when it is locked.`
4624
+ ).build();
4625
+ var storeAlreadyInitializedError = error(
4626
+ "runner.errors.storeAlreadyInitialized"
4627
+ ).format(() => "Store already initialized. Cannot reinitialize.").build();
4628
+ var validationError = error("runner.errors.validation").format(({ subject, id: id2, originalError }) => {
4629
+ const errorMessage2 = originalError instanceof Error ? originalError.message : String(originalError);
4630
+ return `${subject} validation failed for ${id2.toString()}: ${errorMessage2}`;
4631
+ }).build();
4632
+ var eventCycleError = error("runner.errors.eventCycle").format(({ path: path3 }) => {
4633
+ const chain = path3.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
4634
+ return `Event emission cycle detected:
4597
4635
  ${chain}
4598
4636
 
4599
- Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`
4600
- );
4601
- this.name = "EventCycleError";
4602
- }
4603
- };
4604
- var EventEmissionCycleError = class extends RuntimeError {
4605
- static {
4606
- __name(this, "EventEmissionCycleError");
4607
- }
4608
- constructor(cycles) {
4609
- const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
4610
- super(
4611
- `Event emission cycles detected between hooks and events:
4637
+ Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`;
4638
+ }).build();
4639
+ var eventEmissionCycleError = error("runner.errors.eventEmissionCycle").format(({ cycles }) => {
4640
+ const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
4641
+ return `Event emission cycles detected between hooks and events:
4612
4642
  ${list}
4613
4643
 
4614
- This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`
4615
- );
4616
- this.name = "EventEmissionCycleError";
4617
- }
4618
- };
4619
- var PlatformUnsupportedFunction = class extends RuntimeError {
4620
- static {
4621
- __name(this, "PlatformUnsupportedFunction");
4622
- }
4623
- constructor(functionName) {
4624
- super(
4625
- `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
4626
- );
4627
- this.name = "PlatformUnsupportedFunction";
4628
- }
4629
- };
4630
- var CancellationError = class extends RuntimeError {
4631
- static {
4632
- __name(this, "CancellationError");
4633
- }
4634
- constructor(message = "Operation cancelled") {
4635
- super(message);
4636
- this.name = "CancellationError";
4637
- }
4638
- };
4644
+ This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`;
4645
+ }).build();
4646
+ var platformUnsupportedFunctionError = error("runner.errors.platformUnsupportedFunction").format(
4647
+ ({ functionName }) => `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
4648
+ ).build();
4649
+ var cancellationError = error(
4650
+ "runner.errors.cancellation"
4651
+ ).format(({ reason }) => reason || "Operation cancelled").build();
4652
+ var tunnelOwnershipConflictError = error("runner.errors.tunnelOwnershipConflict").format(
4653
+ ({ 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.`
4654
+ ).build();
4639
4655
  function isCancellationError(err) {
4640
- return !!err && err.name === "CancellationError";
4656
+ return cancellationError.is(err);
4641
4657
  }
4642
4658
  __name(isCancellationError, "isCancellationError");
4643
4659
 
@@ -4662,12 +4678,12 @@ function defineResource(constConfig) {
4662
4678
  if (constConfig.configSchema) {
4663
4679
  try {
4664
4680
  config = constConfig.configSchema.parse(config);
4665
- } catch (error) {
4666
- throw new ValidationError(
4667
- "Resource config",
4668
- id2,
4669
- error instanceof Error ? error : new Error(String(error))
4670
- );
4681
+ } catch (error2) {
4682
+ validationError.throw({
4683
+ subject: "Resource config",
4684
+ id: id2,
4685
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
4686
+ });
4671
4687
  }
4672
4688
  }
4673
4689
  return {
@@ -4728,12 +4744,12 @@ function defineTaskMiddleware(middlewareDef) {
4728
4744
  if (obj.configSchema) {
4729
4745
  try {
4730
4746
  config = obj.configSchema.parse(config);
4731
- } catch (error) {
4732
- throw new ValidationError(
4733
- "Middleware config",
4734
- obj.id,
4735
- error instanceof Error ? error : new Error(String(error))
4736
- );
4747
+ } catch (error2) {
4748
+ validationError.throw({
4749
+ subject: "Middleware config",
4750
+ id: obj.id,
4751
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
4752
+ });
4737
4753
  }
4738
4754
  }
4739
4755
  return wrap({
@@ -4769,12 +4785,12 @@ function defineResourceMiddleware(middlewareDef) {
4769
4785
  if (obj.configSchema) {
4770
4786
  try {
4771
4787
  config = obj.configSchema.parse(config);
4772
- } catch (error) {
4773
- throw new ValidationError(
4774
- "Middleware config",
4775
- obj.id,
4776
- error
4777
- );
4788
+ } catch (error2) {
4789
+ validationError.throw({
4790
+ subject: "Middleware config",
4791
+ id: obj.id,
4792
+ originalError: error2
4793
+ });
4778
4794
  }
4779
4795
  }
4780
4796
  return wrap({
@@ -4826,8 +4842,12 @@ function defineTag(definition) {
4826
4842
  if (definition.configSchema) {
4827
4843
  try {
4828
4844
  tagConfig = definition.configSchema.parse(tagConfig);
4829
- } catch (error) {
4830
- throw new ValidationError("Tag config", this.id, error);
4845
+ } catch (error2) {
4846
+ validationError.throw({
4847
+ subject: "Tag config",
4848
+ id: this.id,
4849
+ originalError: error2
4850
+ });
4831
4851
  }
4832
4852
  }
4833
4853
  let config;
@@ -4928,6 +4948,14 @@ function isOptional(definition) {
4928
4948
  return definition && definition[symbolOptionalDependency];
4929
4949
  }
4930
4950
  __name(isOptional, "isOptional");
4951
+ function isError(definition) {
4952
+ return Boolean(definition && definition[symbolError]);
4953
+ }
4954
+ __name(isError, "isError");
4955
+ function isAsyncContext(definition) {
4956
+ return Boolean(definition && definition[symbolAsyncContext]);
4957
+ }
4958
+ __name(isAsyncContext, "isAsyncContext");
4931
4959
 
4932
4960
  // src/globals/middleware/requireContext.middleware.ts
4933
4961
  var requireContextTaskMiddleware = defineTaskMiddleware({
@@ -4942,29 +4970,45 @@ var requireContextTaskMiddleware = defineTaskMiddleware({
4942
4970
  return next(task2?.input);
4943
4971
  }
4944
4972
  });
4973
+ var EjsonSerializer = {
4974
+ stringify(value) {
4975
+ return EJSON.stringify(value);
4976
+ },
4977
+ parse(text) {
4978
+ return EJSON.parse(text);
4979
+ },
4980
+ addType(name, factory) {
4981
+ EJSON.addType(name, factory);
4982
+ }
4983
+ };
4984
+ function getDefaultSerializer() {
4985
+ return EjsonSerializer;
4986
+ }
4987
+ __name(getDefaultSerializer, "getDefaultSerializer");
4945
4988
 
4946
- // src/context.ts
4989
+ // src/definers/defineAsyncContext.ts
4947
4990
  var platform = getPlatform();
4948
4991
  var storage = platform.createAsyncLocalStorage();
4949
4992
  function getCurrentStore() {
4950
4993
  return storage.getStore();
4951
4994
  }
4952
4995
  __name(getCurrentStore, "getCurrentStore");
4953
- function createContext(name = "runner.context") {
4996
+ function defineAsyncContext(def) {
4954
4997
  if (!platform.hasAsyncLocalStorage()) {
4955
- throw new PlatformUnsupportedFunction(
4956
- `createAsyncLocalStorage: Cannot create context ${name}: no async storage available in this environment`
4957
- );
4998
+ platformUnsupportedFunctionError.throw({
4999
+ functionName: `createAsyncLocalStorage: Cannot create context ${def.id}: no async storage available in this environment`
5000
+ });
4958
5001
  }
4959
- const ctxId = Symbol(name);
5002
+ const ctxId = def.id;
4960
5003
  const use = /* @__PURE__ */ __name(() => {
4961
5004
  const store2 = getCurrentStore();
4962
5005
  if (!store2 || !store2.has(ctxId)) {
4963
- throw new ContextError(
4964
- `Context not available for symbol ${ctxId.toString()}`
4965
- );
5006
+ contextError.throw({
5007
+ details: `Context not available for symbol ${ctxId.toString()}`
5008
+ });
4966
5009
  }
4967
- return store2.get(ctxId);
5010
+ const s = store2;
5011
+ return s.get(ctxId);
4968
5012
  }, "use");
4969
5013
  const provide = /* @__PURE__ */ __name((value, fn) => {
4970
5014
  const currentStore = getCurrentStore();
@@ -4972,16 +5016,39 @@ function createContext(name = "runner.context") {
4972
5016
  map.set(ctxId, value);
4973
5017
  return storage.run(map, fn);
4974
5018
  }, "provide");
5019
+ const serializer = getDefaultSerializer();
4975
5020
  const api = {
4976
5021
  id: ctxId,
5022
+ [symbolAsyncContext]: true,
4977
5023
  use,
4978
- provide,
5024
+ /* istanbul ignore next */
5025
+ provide(value, fn) {
5026
+ const validated = def.configSchema ? def.configSchema.parse(value) : value;
5027
+ return provide(validated, fn);
5028
+ },
4979
5029
  require() {
4980
- return requireContextTaskMiddleware.with({ context: api });
5030
+ return requireContextTaskMiddleware.with({
5031
+ context: api
5032
+ });
5033
+ },
5034
+ /* istanbul ignore next */
5035
+ serialize: def.serialize || ((data) => serializer.stringify(data)),
5036
+ /* istanbul ignore next */
5037
+ parse: def.parse || ((data) => serializer.parse(data)),
5038
+ optional() {
5039
+ return {
5040
+ inner: api,
5041
+ [symbolOptionalDependency]: true
5042
+ };
4981
5043
  }
4982
5044
  };
4983
5045
  return api;
4984
5046
  }
5047
+ __name(defineAsyncContext, "defineAsyncContext");
5048
+ function createContext(name) {
5049
+ const id2 = name ?? `context.${Math.random().toString(36).slice(2)}.${Date.now()}`;
5050
+ return defineAsyncContext({ id: id2 });
5051
+ }
4985
5052
  __name(createContext, "createContext");
4986
5053
 
4987
5054
  // src/globals/resources/debug/debug.tag.ts
@@ -5196,10 +5263,10 @@ var retryTaskMiddleware = defineTaskMiddleware({
5196
5263
  while (true) {
5197
5264
  try {
5198
5265
  return await next(input);
5199
- } catch (error) {
5200
- const err = error;
5266
+ } catch (error2) {
5267
+ const err = error2;
5201
5268
  if (shouldStop(err) || attempts >= maxRetries) {
5202
- throw error;
5269
+ throw error2;
5203
5270
  }
5204
5271
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
5205
5272
  if (delay > 0) {
@@ -5220,10 +5287,10 @@ var retryResourceMiddleware = defineResourceMiddleware({
5220
5287
  while (true) {
5221
5288
  try {
5222
5289
  return await next(input);
5223
- } catch (error) {
5224
- const err = error;
5290
+ } catch (error2) {
5291
+ const err = error2;
5225
5292
  if (shouldStop(err) || attempts >= maxRetries) {
5226
- throw error;
5293
+ throw error2;
5227
5294
  }
5228
5295
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
5229
5296
  if (delay > 0) {
@@ -5243,17 +5310,17 @@ var timeoutTaskMiddleware = defineTaskMiddleware({
5243
5310
  const ttl = Math.max(0, config.ttl);
5244
5311
  const message = `Operation timed out after ${ttl}ms`;
5245
5312
  if (ttl === 0) {
5246
- const error = new Error(message);
5247
- error.name = "TimeoutError";
5248
- throw error;
5313
+ const error2 = new Error(message);
5314
+ error2.name = "TimeoutError";
5315
+ throw error2;
5249
5316
  }
5250
5317
  const controller = new AbortController();
5251
5318
  const timeoutPromise = new Promise((_, reject) => {
5252
5319
  const timeoutId = setTimeout(() => {
5253
5320
  controller.abort();
5254
- const error = new Error(message);
5255
- error.name = "TimeoutError";
5256
- reject(error);
5321
+ const error2 = new Error(message);
5322
+ error2.name = "TimeoutError";
5323
+ reject(error2);
5257
5324
  }, ttl);
5258
5325
  controller.signal.addEventListener("abort", () => {
5259
5326
  clearTimeout(timeoutId);
@@ -5269,17 +5336,17 @@ var timeoutResourceMiddleware = defineResourceMiddleware({
5269
5336
  const ttl = Math.max(0, config.ttl);
5270
5337
  const message = `Operation timed out after ${ttl}ms`;
5271
5338
  if (ttl === 0) {
5272
- const error = new Error(message);
5273
- error.name = "TimeoutError";
5274
- throw error;
5339
+ const error2 = new Error(message);
5340
+ error2.name = "TimeoutError";
5341
+ throw error2;
5275
5342
  }
5276
5343
  const controller = new AbortController();
5277
5344
  const timeoutPromise = new Promise((_, reject) => {
5278
5345
  const timeoutId = setTimeout(() => {
5279
5346
  controller.abort();
5280
- const error = new Error(message);
5281
- error.name = "TimeoutError";
5282
- reject(error);
5347
+ const error2 = new Error(message);
5348
+ error2.name = "TimeoutError";
5349
+ reject(error2);
5283
5350
  }, ttl);
5284
5351
  controller.signal.addEventListener("abort", () => {
5285
5352
  clearTimeout(timeoutId);
@@ -5305,6 +5372,77 @@ var globalMiddlewares = {
5305
5372
  }
5306
5373
  };
5307
5374
 
5375
+ // src/globals/resources/debug/types.ts
5376
+ var allFalse = Object.freeze({
5377
+ logResourceBeforeRun: false,
5378
+ logResourceAfterRun: false,
5379
+ logMiddlewareBeforeRun: false,
5380
+ logMiddlewareAfterRun: false,
5381
+ logTaskBeforeRun: false,
5382
+ logTaskAfterRun: false,
5383
+ logTaskInput: false,
5384
+ logTaskOutput: false,
5385
+ logResourceConfig: false,
5386
+ logResourceValue: false,
5387
+ logHookTriggered: false,
5388
+ logHookCompleted: false,
5389
+ logEventEmissionOnRun: false,
5390
+ logEventEmissionInput: false
5391
+ });
5392
+ var levelNormal = Object.freeze({
5393
+ ...allFalse,
5394
+ logTaskAfterRun: true,
5395
+ logTaskBeforeRun: true,
5396
+ logResourceBeforeRun: true,
5397
+ logResourceAfterRun: true,
5398
+ logMiddlewareBeforeRun: true,
5399
+ logMiddlewareAfterRun: true,
5400
+ logHookTriggered: true,
5401
+ logHookCompleted: true,
5402
+ logEventEmissionOnRun: true
5403
+ });
5404
+ Object.freeze(levelNormal);
5405
+ var levelVerbose = Object.freeze({
5406
+ ...levelNormal,
5407
+ logTaskInput: true,
5408
+ logTaskOutput: true,
5409
+ logResourceConfig: true,
5410
+ logResourceValue: true,
5411
+ logHookTriggered: true,
5412
+ logHookCompleted: true
5413
+ });
5414
+ Object.freeze(levelVerbose);
5415
+ function formatConfig(config) {
5416
+ if (config === "normal") {
5417
+ return { ...levelNormal };
5418
+ }
5419
+ if (config === "verbose") {
5420
+ return { ...levelVerbose };
5421
+ }
5422
+ return { ...allFalse, ...config };
5423
+ }
5424
+ __name(formatConfig, "formatConfig");
5425
+ var getConfig = /* @__PURE__ */ __name((config, taggable) => {
5426
+ if (!taggable) {
5427
+ return formatConfig(config);
5428
+ }
5429
+ const debugTagConfig = debugTag.extract(taggable);
5430
+ if (debugTagConfig) {
5431
+ const debugTagConfigFormatted = formatConfig(debugTagConfig);
5432
+ return { ...formatConfig(config), ...debugTagConfigFormatted };
5433
+ }
5434
+ return formatConfig(config);
5435
+ }, "getConfig");
5436
+
5437
+ // src/globals/debug.ts
5438
+ var debugLevels = {
5439
+ normal: levelNormal,
5440
+ verbose: levelVerbose
5441
+ };
5442
+ var debug = {
5443
+ levels: debugLevels
5444
+ };
5445
+
5308
5446
  // src/models/TaskRunner.ts
5309
5447
  var TaskRunner = class {
5310
5448
  constructor(store2, eventManager, logger) {
@@ -5331,16 +5469,16 @@ var TaskRunner = class {
5331
5469
  }
5332
5470
  try {
5333
5471
  return await runner(input);
5334
- } catch (error) {
5472
+ } catch (error2) {
5335
5473
  try {
5336
5474
  await this.store.onUnhandledError({
5337
- error,
5475
+ error: error2,
5338
5476
  kind: "task",
5339
5477
  source: task2.id
5340
5478
  });
5341
5479
  } catch (_) {
5342
5480
  }
5343
- throw error;
5481
+ throw error2;
5344
5482
  }
5345
5483
  }
5346
5484
  /**
@@ -5391,7 +5529,7 @@ var MiddlewareManager = class {
5391
5529
  */
5392
5530
  checkLock() {
5393
5531
  if (this.#isLocked) {
5394
- throw new LockedError("MiddlewareManager");
5532
+ lockedError.throw({ what: "MiddlewareManager" });
5395
5533
  }
5396
5534
  }
5397
5535
  /**
@@ -5509,12 +5647,12 @@ var MiddlewareManager = class {
5509
5647
  if (runnerTask.inputSchema) {
5510
5648
  try {
5511
5649
  rawInput = runnerTask.inputSchema.parse(rawInput);
5512
- } catch (error) {
5513
- throw new ValidationError(
5514
- "Task input",
5515
- runnerTask.id,
5516
- error instanceof Error ? error : new Error(String(error))
5517
- );
5650
+ } catch (error2) {
5651
+ validationError.throw({
5652
+ subject: "Task input",
5653
+ id: runnerTask.id,
5654
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
5655
+ });
5518
5656
  }
5519
5657
  }
5520
5658
  const deps = storeTask.computedDependencies;
@@ -5522,8 +5660,12 @@ var MiddlewareManager = class {
5522
5660
  if (runnerTask.resultSchema) {
5523
5661
  try {
5524
5662
  return runnerTask.resultSchema.parse(rawResult);
5525
- } catch (error) {
5526
- throw new ValidationError("Task result", runnerTask.id, error);
5663
+ } catch (error2) {
5664
+ validationError.throw({
5665
+ subject: "Task result",
5666
+ id: runnerTask.id,
5667
+ originalError: error2
5668
+ });
5527
5669
  }
5528
5670
  }
5529
5671
  return rawResult;
@@ -5618,12 +5760,12 @@ var MiddlewareManager = class {
5618
5760
  if (resource2.resultSchema) {
5619
5761
  try {
5620
5762
  return resource2.resultSchema.parse(rawValue);
5621
- } catch (error) {
5622
- throw new ValidationError(
5623
- "Resource result",
5624
- resource2.id,
5625
- error
5626
- );
5763
+ } catch (error2) {
5764
+ validationError.throw({
5765
+ subject: "Resource result",
5766
+ id: resource2.id,
5767
+ originalError: error2
5768
+ });
5627
5769
  }
5628
5770
  }
5629
5771
  return rawValue;
@@ -5649,16 +5791,16 @@ var MiddlewareManager = class {
5649
5791
  middleware.config
5650
5792
  );
5651
5793
  return result;
5652
- } catch (error) {
5794
+ } catch (error2) {
5653
5795
  try {
5654
5796
  await this.store.onUnhandledError({
5655
- error,
5797
+ error: error2,
5656
5798
  kind: "resourceInit",
5657
5799
  source: resource2.id
5658
5800
  });
5659
5801
  } catch (_) {
5660
5802
  }
5661
- throw error;
5803
+ throw error2;
5662
5804
  }
5663
5805
  }, "baseMiddlewareRunner");
5664
5806
  const middlewareInterceptors = this.perResourceMiddlewareInterceptors.get(middleware.id) || [];
@@ -5870,7 +6012,7 @@ var LogPrinter = class _LogPrinter {
5870
6012
  _LogPrinter.writers.log(safeStringify(this.normalizeForJson(log), 2));
5871
6013
  return;
5872
6014
  }
5873
- const { level, source, message, timestamp, error, data, context } = log;
6015
+ const { level, source, message, timestamp, error: error2, data, context } = log;
5874
6016
  const timePart = this.formatTime(timestamp);
5875
6017
  const levelPart = this.formatLevel(level);
5876
6018
  const sourcePart = this.formatSource(source);
@@ -5884,7 +6026,7 @@ var LogPrinter = class _LogPrinter {
5884
6026
  if (message) {
5885
6027
  output.push(...messageLines.map((line) => `${indentation}${line}`));
5886
6028
  }
5887
- const errorLines = this.formatError(error);
6029
+ const errorLines = this.formatError(error2);
5888
6030
  const dataLines = this.formatData(data);
5889
6031
  const contextLines = this.formatContext(context);
5890
6032
  const detailsExist = errorLines.length > 0 || dataLines.length > 0 || contextLines.length > 0;
@@ -5927,14 +6069,14 @@ var LogPrinter = class _LogPrinter {
5927
6069
  }
5928
6070
  return String(message);
5929
6071
  }
5930
- formatError(error, indentation = " ") {
5931
- if (!error) return [];
6072
+ formatError(error2, indentation = " ") {
6073
+ if (!error2) return [];
5932
6074
  const lines = [];
5933
6075
  lines.push(
5934
- `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error.name}: ${error.message}${this.colors.reset}`
6076
+ `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error2.name}: ${error2.message}${this.colors.reset}`
5935
6077
  );
5936
- if (error.stack) {
5937
- const frames = error.stack.split("\n").slice(1);
6078
+ if (error2.stack) {
6079
+ const frames = error2.stack.split("\n").slice(1);
5938
6080
  frames.forEach((frame) => {
5939
6081
  const cleaned = frame.trim().replace(/^at /, "");
5940
6082
  lines.push(
@@ -6085,13 +6227,13 @@ var Logger = class _Logger {
6085
6227
  * Core logging method with structured LogInfo
6086
6228
  */
6087
6229
  async log(level, message, logInfo = {}) {
6088
- const { source, error, data, ...context } = logInfo;
6230
+ const { source, error: error2, data, ...context } = logInfo;
6089
6231
  const log = {
6090
6232
  level,
6091
6233
  message,
6092
6234
  source: source || this.source,
6093
6235
  timestamp: /* @__PURE__ */ new Date(),
6094
- error: error ? this.extractErrorInfo(error) : void 0,
6236
+ error: error2 ? this.extractErrorInfo(error2) : void 0,
6095
6237
  data: data || void 0,
6096
6238
  context: { ...this.boundContext, ...context }
6097
6239
  };
@@ -6105,17 +6247,17 @@ var Logger = class _Logger {
6105
6247
  root.printer.print(log);
6106
6248
  }
6107
6249
  }
6108
- extractErrorInfo(error) {
6109
- if (error instanceof Error) {
6250
+ extractErrorInfo(error2) {
6251
+ if (error2 instanceof Error) {
6110
6252
  return {
6111
- name: error.name,
6112
- message: error.message,
6113
- stack: error.stack
6253
+ name: error2.name,
6254
+ message: error2.message,
6255
+ stack: error2.stack
6114
6256
  };
6115
6257
  }
6116
6258
  return {
6117
6259
  name: "UnknownError",
6118
- message: String(error)
6260
+ message: String(error2)
6119
6261
  };
6120
6262
  }
6121
6263
  async info(message, logInfo) {
@@ -6189,14 +6331,14 @@ var Logger = class _Logger {
6189
6331
  for (const listener of this.localListeners) {
6190
6332
  try {
6191
6333
  await listener(log);
6192
- } catch (error) {
6334
+ } catch (error2) {
6193
6335
  this.print({
6194
6336
  level: "error",
6195
6337
  message: "Error in log listener",
6196
6338
  timestamp: /* @__PURE__ */ new Date(),
6197
6339
  error: {
6198
6340
  name: "ListenerError",
6199
- message: error instanceof Error ? error.message : String(error)
6341
+ message: error2 instanceof Error ? error2.message : String(error2)
6200
6342
  }
6201
6343
  });
6202
6344
  continue;
@@ -6372,7 +6514,7 @@ var DependencyProcessor = class {
6372
6514
  } else if (Array.isArray(eventDefinition)) {
6373
6515
  for (const ed of eventDefinition) {
6374
6516
  if (this.store.events.get(ed.id) === void 0) {
6375
- throw new EventNotFoundError(ed.id);
6517
+ eventNotFoundError.throw({ id: ed.id });
6376
6518
  }
6377
6519
  }
6378
6520
  this.eventManager.addListener(eventDefinition, handler, {
@@ -6380,7 +6522,7 @@ var DependencyProcessor = class {
6380
6522
  });
6381
6523
  } else {
6382
6524
  if (this.store.events.get(eventDefinition.id) === void 0) {
6383
- throw new EventNotFoundError(eventDefinition.id);
6525
+ eventNotFoundError.throw({ id: eventDefinition.id });
6384
6526
  }
6385
6527
  this.eventManager.addListener(eventDefinition, handler, {
6386
6528
  order
@@ -6421,8 +6563,14 @@ var DependencyProcessor = class {
6421
6563
  } else if (isEvent(inner)) {
6422
6564
  const exists = this.store.events.get(inner.id) !== void 0;
6423
6565
  return exists ? this.extractEventDependency(inner, source) : void 0;
6566
+ } else if (isError(inner)) {
6567
+ const exists = this.store.errors.get(inner.id) !== void 0;
6568
+ return exists ? inner : void 0;
6569
+ } else if (isAsyncContext(inner)) {
6570
+ const exists = this.store.asyncContexts.get(inner.id) !== void 0;
6571
+ return exists ? inner : void 0;
6424
6572
  }
6425
- throw new UnknownItemTypeError(inner);
6573
+ unknownItemTypeError.throw({ item: inner });
6426
6574
  }
6427
6575
  if (isResource(object)) {
6428
6576
  return this.extractResourceDependency(object);
@@ -6430,8 +6578,18 @@ var DependencyProcessor = class {
6430
6578
  return this.extractTaskDependency(object);
6431
6579
  } else if (isEvent(object)) {
6432
6580
  return this.extractEventDependency(object, source);
6581
+ } else if (isError(object)) {
6582
+ if (this.store.errors.get(object.id) === void 0) {
6583
+ dependencyNotFoundError.throw({ key: `Error ${object.id}` });
6584
+ }
6585
+ return object;
6586
+ } else if (isAsyncContext(object)) {
6587
+ if (this.store.asyncContexts.get(object.id) === void 0) {
6588
+ dependencyNotFoundError.throw({ key: `AsyncContext ${object.id}` });
6589
+ }
6590
+ return object;
6433
6591
  } else {
6434
- throw new UnknownItemTypeError(object);
6592
+ unknownItemTypeError.throw({ item: object });
6435
6593
  }
6436
6594
  }
6437
6595
  /**
@@ -6447,27 +6605,29 @@ var DependencyProcessor = class {
6447
6605
  async extractTaskDependency(object) {
6448
6606
  const storeTask = this.store.tasks.get(object.id);
6449
6607
  if (storeTask === void 0) {
6450
- throw new DependencyNotFoundError(`Task ${object.id}`);
6608
+ dependencyNotFoundError.throw({ key: `Task ${object.id}` });
6451
6609
  }
6452
- if (!storeTask.isInitialized) {
6610
+ const st = storeTask;
6611
+ if (!st.isInitialized) {
6453
6612
  const dependencies = object.dependencies;
6454
- storeTask.computedDependencies = await this.extractDependencies(
6613
+ st.computedDependencies = await this.extractDependencies(
6455
6614
  dependencies,
6456
- storeTask.task.id
6615
+ st.task.id
6457
6616
  );
6458
- storeTask.isInitialized = true;
6617
+ st.isInitialized = true;
6459
6618
  }
6460
6619
  return (input) => {
6461
- return this.taskRunner.run(storeTask.task, input);
6620
+ return this.taskRunner.run(st.task, input);
6462
6621
  };
6463
6622
  }
6464
6623
  async extractResourceDependency(object) {
6465
6624
  const storeResource = this.store.resources.get(object.id);
6466
6625
  if (storeResource === void 0) {
6467
- throw new DependencyNotFoundError(`Resource ${object.id}`);
6626
+ dependencyNotFoundError.throw({ key: `Resource ${object.id}` });
6468
6627
  }
6469
- const { resource: resource2, config } = storeResource;
6470
- if (!storeResource.isInitialized) {
6628
+ const sr = storeResource;
6629
+ const { resource: resource2, config } = sr;
6630
+ if (!sr.isInitialized) {
6471
6631
  if (resource2.init) {
6472
6632
  const depMap = resource2.dependencies || {};
6473
6633
  const raw = await this.extractDependencies(depMap, resource2.id);
@@ -6477,12 +6637,12 @@ var DependencyProcessor = class {
6477
6637
  config,
6478
6638
  wrapped
6479
6639
  );
6480
- storeResource.context = context;
6481
- storeResource.value = value;
6640
+ sr.context = context;
6641
+ sr.value = value;
6482
6642
  }
6483
- storeResource.isInitialized = true;
6643
+ sr.isInitialized = true;
6484
6644
  }
6485
- return storeResource.value;
6645
+ return sr.value;
6486
6646
  }
6487
6647
  };
6488
6648
 
@@ -6540,12 +6700,12 @@ var EventManager = class {
6540
6700
  if (eventDefinition.payloadSchema) {
6541
6701
  try {
6542
6702
  data = eventDefinition.payloadSchema.parse(data);
6543
- } catch (error) {
6544
- throw new ValidationError(
6545
- "Event payload",
6546
- eventDefinition.id,
6547
- error instanceof Error ? error : new Error(String(error))
6548
- );
6703
+ } catch (error2) {
6704
+ validationError.throw({
6705
+ subject: "Event payload",
6706
+ id: eventDefinition.id,
6707
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
6708
+ });
6549
6709
  }
6550
6710
  }
6551
6711
  const frame = { id: eventDefinition.id, source };
@@ -6601,10 +6761,9 @@ var EventManager = class {
6601
6761
  const currentHookId = this.currentHookIdContext.getStore();
6602
6762
  const safeReEmitBySameHook = top.id === frame.id && currentHookId && currentHookId === source;
6603
6763
  if (!safeReEmitBySameHook) {
6604
- throw new EventCycleError([
6605
- ...currentStack.slice(cycleStart),
6606
- frame
6607
- ]);
6764
+ eventCycleError.throw({
6765
+ path: [...currentStack.slice(cycleStart), frame]
6766
+ });
6608
6767
  }
6609
6768
  }
6610
6769
  }
@@ -6744,7 +6903,7 @@ var EventManager = class {
6744
6903
  */
6745
6904
  checkLock() {
6746
6905
  if (this.#isLocked) {
6747
- throw new LockedError("EventManager");
6906
+ lockedError.throw({ what: "EventManager" });
6748
6907
  }
6749
6908
  }
6750
6909
  /**
@@ -6900,25 +7059,31 @@ var StoreValidator = class {
6900
7059
  }
6901
7060
  checkIfIDExists(id2) {
6902
7061
  if (this.registry.tasks.has(id2)) {
6903
- throw new DuplicateRegistrationError("Task", id2);
7062
+ duplicateRegistrationError.throw({ type: "Task", id: id2 });
6904
7063
  }
6905
7064
  if (this.registry.resources.has(id2)) {
6906
- throw new DuplicateRegistrationError("Resource", id2);
7065
+ duplicateRegistrationError.throw({ type: "Resource", id: id2 });
6907
7066
  }
6908
7067
  if (this.registry.events.has(id2)) {
6909
- throw new DuplicateRegistrationError("Event", id2);
7068
+ duplicateRegistrationError.throw({ type: "Event", id: id2 });
7069
+ }
7070
+ if (this.registry.errors.has(id2)) {
7071
+ duplicateRegistrationError.throw({ type: "Error", id: id2 });
7072
+ }
7073
+ if (this.registry.asyncContexts.has(id2)) {
7074
+ duplicateRegistrationError.throw({ type: "AsyncContext", id: id2 });
6910
7075
  }
6911
7076
  if (this.registry.taskMiddlewares.has(id2)) {
6912
- throw new DuplicateRegistrationError("Middleware", id2);
7077
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
6913
7078
  }
6914
7079
  if (this.registry.resourceMiddlewares.has(id2)) {
6915
- throw new DuplicateRegistrationError("Middleware", id2);
7080
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
6916
7081
  }
6917
7082
  if (this.registry.tags.has(id2)) {
6918
- throw new DuplicateRegistrationError("Tag", id2);
7083
+ duplicateRegistrationError.throw({ type: "Tag", id: id2 });
6919
7084
  }
6920
7085
  if (this.registry.hooks.has(id2)) {
6921
- throw new DuplicateRegistrationError("Hook", id2);
7086
+ duplicateRegistrationError.throw({ type: "Hook", id: id2 });
6922
7087
  }
6923
7088
  }
6924
7089
  runSanityChecks() {
@@ -6926,11 +7091,11 @@ var StoreValidator = class {
6926
7091
  const middlewares = task2.task.middleware;
6927
7092
  middlewares.forEach((middlewareAttachment) => {
6928
7093
  if (!this.registry.taskMiddlewares.has(middlewareAttachment.id)) {
6929
- throw new MiddlewareNotRegisteredError(
6930
- "task",
6931
- task2.task.id,
6932
- middlewareAttachment.id
6933
- );
7094
+ middlewareNotRegisteredError.throw({
7095
+ type: "task",
7096
+ source: task2.task.id,
7097
+ middlewareId: middlewareAttachment.id
7098
+ });
6934
7099
  }
6935
7100
  });
6936
7101
  }
@@ -6938,11 +7103,11 @@ var StoreValidator = class {
6938
7103
  const middlewares = resource2.resource.middleware;
6939
7104
  middlewares.forEach((middlewareAttachment) => {
6940
7105
  if (!this.registry.resourceMiddlewares.has(middlewareAttachment.id)) {
6941
- throw new MiddlewareNotRegisteredError(
6942
- "resource",
6943
- resource2.resource.id,
6944
- middlewareAttachment.id
6945
- );
7106
+ middlewareNotRegisteredError.throw({
7107
+ type: "resource",
7108
+ source: resource2.resource.id,
7109
+ middlewareId: middlewareAttachment.id
7110
+ });
6946
7111
  }
6947
7112
  });
6948
7113
  }
@@ -6966,7 +7131,7 @@ var StoreValidator = class {
6966
7131
  if (tags) {
6967
7132
  for (const tag2 of tags) {
6968
7133
  if (!this.registry.tags.has(tag2.id)) {
6969
- throw new TagNotFoundError(tag2.id);
7134
+ tagNotFoundError.throw({ id: tag2.id });
6970
7135
  }
6971
7136
  }
6972
7137
  }
@@ -6985,6 +7150,8 @@ var StoreRegistry = class {
6985
7150
  this.resourceMiddlewares = /* @__PURE__ */ new Map();
6986
7151
  this.hooks = /* @__PURE__ */ new Map();
6987
7152
  this.tags = /* @__PURE__ */ new Map();
7153
+ this.asyncContexts = /* @__PURE__ */ new Map();
7154
+ this.errors = /* @__PURE__ */ new Map();
6988
7155
  this.validator = new StoreValidator(this);
6989
7156
  }
6990
7157
  static {
@@ -6996,12 +7163,16 @@ var StoreRegistry = class {
6996
7163
  storeGenericItem(item) {
6997
7164
  if (isTask(item)) {
6998
7165
  this.storeTask(item);
7166
+ } else if (isError(item)) {
7167
+ this.storeError(item);
6999
7168
  } else if (isHook && isHook(item)) {
7000
7169
  this.storeHook(item);
7001
7170
  } else if (isResource(item)) {
7002
7171
  this.storeResource(item);
7003
7172
  } else if (isEvent(item)) {
7004
7173
  this.storeEvent(item);
7174
+ } else if (isAsyncContext(item)) {
7175
+ this.storeAsyncContext(item);
7005
7176
  } else if (isTaskMiddleware(item)) {
7006
7177
  this.storeTaskMiddleware(item);
7007
7178
  } else if (isResourceMiddleware(item)) {
@@ -7011,9 +7182,17 @@ var StoreRegistry = class {
7011
7182
  } else if (isTag(item)) {
7012
7183
  this.storeTag(item);
7013
7184
  } else {
7014
- throw new UnknownItemTypeError(item);
7185
+ unknownItemTypeError.throw({ item });
7015
7186
  }
7016
7187
  }
7188
+ storeError(item) {
7189
+ this.validator.checkIfIDExists(item.id);
7190
+ this.errors.set(item.id, item);
7191
+ }
7192
+ storeAsyncContext(item) {
7193
+ this.validator.checkIfIDExists(item.id);
7194
+ this.asyncContexts.set(item.id, item);
7195
+ }
7017
7196
  storeTag(item) {
7018
7197
  this.validator.checkIfIDExists(item.id);
7019
7198
  this.tags.set(item.id, item);
@@ -7377,7 +7556,7 @@ var OverrideManager = class {
7377
7556
  }
7378
7557
  if (!hasAnyItem) {
7379
7558
  const id2 = isResourceWithConfig(override) ? override.resource.id : override.id;
7380
- throw new DependencyNotFoundError(id2);
7559
+ dependencyNotFoundError.throw({ key: id2 });
7381
7560
  }
7382
7561
  }
7383
7562
  for (const override of this.overrides.values()) {
@@ -7430,6 +7609,15 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
7430
7609
  return value;
7431
7610
  }
7432
7611
  for (const t of tasks) {
7612
+ const currentOwner = t[symbolTunneledBy];
7613
+ const resourceId = resource2.definition.id;
7614
+ if (currentOwner && currentOwner !== resourceId) {
7615
+ tunnelOwnershipConflictError.throw({
7616
+ taskId: t.id,
7617
+ currentOwnerId: currentOwner,
7618
+ attemptedOwnerId: resourceId
7619
+ });
7620
+ }
7433
7621
  if (!originalRuns.has(t)) {
7434
7622
  originalRuns.set(t, t.run);
7435
7623
  }
@@ -7437,6 +7625,7 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
7437
7625
  return value.run(t, input);
7438
7626
  });
7439
7627
  t[symbolTunneledTask] = "client";
7628
+ t[symbolTunneledBy] = resourceId;
7440
7629
  }
7441
7630
  if (events.length > 0) {
7442
7631
  const selectedEventIds = new Set(events.map((e) => e.id));
@@ -7524,8 +7713,28 @@ function resolveEvents(store2, selector) {
7524
7713
  return out;
7525
7714
  }
7526
7715
  __name(resolveEvents, "resolveEvents");
7716
+
7717
+ // src/utils/detectRunnerMode.ts
7718
+ function detectRunnerMode(explicitMode) {
7719
+ if (explicitMode !== void 0) {
7720
+ return explicitMode;
7721
+ }
7722
+ const env = getPlatform().getEnv("NODE_ENV");
7723
+ switch (env) {
7724
+ case "test":
7725
+ return "test" /* TEST */;
7726
+ case "production":
7727
+ return "prod" /* PROD */;
7728
+ case "development":
7729
+ default:
7730
+ return "dev" /* DEV */;
7731
+ }
7732
+ }
7733
+ __name(detectRunnerMode, "detectRunnerMode");
7734
+
7735
+ // src/models/Store.ts
7527
7736
  var Store = class {
7528
- constructor(eventManager, logger, onUnhandledError) {
7737
+ constructor(eventManager, logger, onUnhandledError, mode) {
7529
7738
  this.eventManager = eventManager;
7530
7739
  this.logger = logger;
7531
7740
  this.onUnhandledError = onUnhandledError;
@@ -7533,6 +7742,7 @@ var Store = class {
7533
7742
  this.validator = this.registry.getValidator();
7534
7743
  this.overrideManager = new OverrideManager(this.registry);
7535
7744
  this.middlewareManager = new MiddlewareManager(this, eventManager, logger);
7745
+ this.mode = detectRunnerMode(mode);
7536
7746
  }
7537
7747
  static {
7538
7748
  __name(this, "Store");
@@ -7552,6 +7762,12 @@ var Store = class {
7552
7762
  get events() {
7553
7763
  return this.registry.events;
7554
7764
  }
7765
+ get errors() {
7766
+ return this.registry.errors;
7767
+ }
7768
+ get asyncContexts() {
7769
+ return this.registry.asyncContexts;
7770
+ }
7555
7771
  get taskMiddlewares() {
7556
7772
  return this.registry.taskMiddlewares;
7557
7773
  }
@@ -7654,19 +7870,19 @@ var Store = class {
7654
7870
  const dependentNodes = this.registry.getDependentNodes();
7655
7871
  const circularDependencies = findCircularDependencies(dependentNodes);
7656
7872
  if (circularDependencies.cycles.length > 0) {
7657
- throw new CircularDependenciesError(circularDependencies.cycles);
7873
+ circularDependenciesError.throw({ cycles: circularDependencies.cycles });
7658
7874
  }
7659
7875
  }
7660
7876
  validateEventEmissionGraph() {
7661
7877
  const eventNodes = this.registry.buildEventEmissionGraph();
7662
7878
  const circular = findCircularDependencies(eventNodes);
7663
7879
  if (circular.cycles.length > 0) {
7664
- throw new EventEmissionCycleError(circular.cycles);
7880
+ eventEmissionCycleError.throw({ cycles: circular.cycles });
7665
7881
  }
7666
7882
  }
7667
7883
  initializeStore(root, config) {
7668
7884
  if (this.#isInitialized) {
7669
- throw new StoreAlreadyInitializedError();
7885
+ storeAlreadyInitializedError.throw({});
7670
7886
  }
7671
7887
  this.registerGlobalComponents();
7672
7888
  this.setupRootResource(root, config);
@@ -7720,68 +7936,6 @@ var Store = class {
7720
7936
  }
7721
7937
  };
7722
7938
 
7723
- // src/globals/resources/debug/types.ts
7724
- var allFalse = Object.freeze({
7725
- logResourceBeforeRun: false,
7726
- logResourceAfterRun: false,
7727
- logMiddlewareBeforeRun: false,
7728
- logMiddlewareAfterRun: false,
7729
- logTaskBeforeRun: false,
7730
- logTaskAfterRun: false,
7731
- logTaskInput: false,
7732
- logTaskOutput: false,
7733
- logResourceConfig: false,
7734
- logResourceValue: false,
7735
- logHookTriggered: false,
7736
- logHookCompleted: false,
7737
- logEventEmissionOnRun: false,
7738
- logEventEmissionInput: false
7739
- });
7740
- var levelNormal = Object.freeze({
7741
- ...allFalse,
7742
- logTaskAfterRun: true,
7743
- logTaskBeforeRun: true,
7744
- logResourceBeforeRun: true,
7745
- logResourceAfterRun: true,
7746
- logMiddlewareBeforeRun: true,
7747
- logMiddlewareAfterRun: true,
7748
- logHookTriggered: true,
7749
- logHookCompleted: true,
7750
- logEventEmissionOnRun: true
7751
- });
7752
- Object.freeze(levelNormal);
7753
- var levelVerbose = Object.freeze({
7754
- ...levelNormal,
7755
- logTaskInput: true,
7756
- logTaskOutput: true,
7757
- logResourceConfig: true,
7758
- logResourceValue: true,
7759
- logHookTriggered: true,
7760
- logHookCompleted: true
7761
- });
7762
- Object.freeze(levelVerbose);
7763
- function formatConfig(config) {
7764
- if (config === "normal") {
7765
- return { ...levelNormal };
7766
- }
7767
- if (config === "verbose") {
7768
- return { ...levelVerbose };
7769
- }
7770
- return { ...allFalse, ...config };
7771
- }
7772
- __name(formatConfig, "formatConfig");
7773
- var getConfig = /* @__PURE__ */ __name((config, taggable) => {
7774
- if (!taggable) {
7775
- return formatConfig(config);
7776
- }
7777
- const debugTagConfig = debugTag.extract(taggable);
7778
- if (debugTagConfig) {
7779
- const debugTagConfigFormatted = formatConfig(debugTagConfig);
7780
- return { ...formatConfig(config), ...debugTagConfigFormatted };
7781
- }
7782
- return formatConfig(config);
7783
- }, "getConfig");
7784
-
7785
7939
  // src/globals/resources/debug/debugConfig.resource.ts
7786
7940
  var debugConfig = defineResource({
7787
7941
  id: "globals.debug.resources.config",
@@ -8109,8 +8263,8 @@ __name(registerShutdownHook, "registerShutdownHook");
8109
8263
 
8110
8264
  // src/models/UnhandledError.ts
8111
8265
  function createDefaultUnhandledError(logger) {
8112
- return async ({ error, kind, source }) => {
8113
- const normalizedError = error instanceof Error ? error : new Error(String(error));
8266
+ return async ({ error: error2, kind, source }) => {
8267
+ const normalizedError = error2 instanceof Error ? error2 : new Error(String(error2));
8114
8268
  await logger.error(`${normalizedError.toString()}`, {
8115
8269
  source,
8116
8270
  error: normalizedError,
@@ -8122,9 +8276,9 @@ function createDefaultUnhandledError(logger) {
8122
8276
  }
8123
8277
  __name(createDefaultUnhandledError, "createDefaultUnhandledError");
8124
8278
  function bindProcessErrorHandler(handler) {
8125
- return async (error, source) => {
8279
+ return async (error2, source) => {
8126
8280
  try {
8127
- await handler({ error, kind: "process", source });
8281
+ await handler({ error: error2, kind: "process", source });
8128
8282
  } catch {
8129
8283
  }
8130
8284
  };
@@ -8157,7 +8311,7 @@ var RunResult = class {
8157
8311
  if (typeof task2 === "string") {
8158
8312
  const taskId = task2;
8159
8313
  if (!this.store.tasks.has(taskId)) {
8160
- throw new RuntimeError(`Task "${taskId}" not found.`);
8314
+ throw new Error(`Task "${taskId}" not found.`);
8161
8315
  }
8162
8316
  task2 = this.store.tasks.get(taskId).task;
8163
8317
  }
@@ -8172,7 +8326,7 @@ var RunResult = class {
8172
8326
  if (typeof event2 === "string") {
8173
8327
  const eventId = event2;
8174
8328
  if (!this.store.events.has(eventId)) {
8175
- throw new RuntimeError(`Event "${eventId}" not found.`);
8329
+ throw new Error(`Event "${eventId}" not found.`);
8176
8330
  }
8177
8331
  event2 = this.store.events.get(eventId).event;
8178
8332
  }
@@ -8186,7 +8340,7 @@ var RunResult = class {
8186
8340
  this.getResourceValue = /* @__PURE__ */ __name((resource2) => {
8187
8341
  const resourceId = typeof resource2 === "string" ? resource2 : resource2.id;
8188
8342
  if (!this.store.resources.has(resourceId)) {
8189
- throw new ResourceNotFoundError(resourceId);
8343
+ throw new Error(`Resource "${resourceId}" not found.`);
8190
8344
  }
8191
8345
  return this.store.resources.get(resourceId).value;
8192
8346
  }, "getResourceValue");
@@ -8203,7 +8357,7 @@ var RunResult = class {
8203
8357
  async function run(resourceOrResourceWithConfig, options) {
8204
8358
  await getPlatform().init();
8205
8359
  const {
8206
- debug = void 0,
8360
+ debug: debug2 = void 0,
8207
8361
  logs = {},
8208
8362
  errorBoundary = true,
8209
8363
  shutdownHooks = true,
@@ -8259,8 +8413,8 @@ async function run(resourceOrResourceWithConfig, options) {
8259
8413
  }
8260
8414
  }, "disposeAll");
8261
8415
  try {
8262
- if (debug) {
8263
- store2.storeGenericItem(debugResource.with(debug));
8416
+ if (debug2) {
8417
+ store2.storeGenericItem(debugResource.with(debug2));
8264
8418
  }
8265
8419
  store2.initializeStore(resource2, config);
8266
8420
  await store2.processOverrides();
@@ -8327,11 +8481,13 @@ var TunnelError = class extends Error {
8327
8481
  static {
8328
8482
  __name(this, "TunnelError");
8329
8483
  }
8330
- constructor(code, message, details) {
8484
+ constructor(code, message, details, extras) {
8331
8485
  super(message);
8332
8486
  this.name = "TunnelError";
8333
8487
  this.code = code;
8334
8488
  this.details = details;
8489
+ this.id = extras?.id;
8490
+ this.data = extras?.data;
8335
8491
  }
8336
8492
  };
8337
8493
  function toTunnelError(input, fallbackMessage) {
@@ -8341,7 +8497,10 @@ function toTunnelError(input, fallbackMessage) {
8341
8497
  if (input && typeof input === "object" && "code" in input && "message" in input && typeof input.message === "string" && typeof input.code === "string") {
8342
8498
  const pe = input;
8343
8499
  const msg = pe.message || fallbackMessage || "Tunnel error";
8344
- return new TunnelError(pe.code, msg, pe.details);
8500
+ return new TunnelError(pe.code, msg, pe.details, {
8501
+ id: pe.id,
8502
+ data: pe.data
8503
+ });
8345
8504
  }
8346
8505
  if (input && typeof input === "object" && "message" in input && typeof input.message === "string") {
8347
8506
  return new TunnelError("UNKNOWN", input.message);
@@ -8372,7 +8531,7 @@ function assertOkEnvelope(envelope, opts) {
8372
8531
  __name(assertOkEnvelope, "assertOkEnvelope");
8373
8532
 
8374
8533
  // src/http-fetch-tunnel.resource.ts
8375
- async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest) {
8534
+ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest, contextHeaderText) {
8376
8535
  const controller = timeoutMs && timeoutMs > 0 ? new AbortController() : void 0;
8377
8536
  let timeout;
8378
8537
  try {
@@ -8383,6 +8542,7 @@ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer
8383
8542
  "content-type": "application/json; charset=utf-8",
8384
8543
  ...headers
8385
8544
  };
8545
+ if (contextHeaderText) reqHeaders["x-runner-context"] = contextHeaderText;
8386
8546
  if (onRequest) await onRequest({ url, headers: reqHeaders });
8387
8547
  const res = await fetchFn(url, {
8388
8548
  method: "POST",
@@ -8413,6 +8573,20 @@ function createExposureFetch(cfg) {
8413
8573
  "global fetch is not available; provide fetchImpl in config"
8414
8574
  );
8415
8575
  }
8576
+ const buildContextHeader = /* @__PURE__ */ __name(() => {
8577
+ if (!cfg.contexts || cfg.contexts.length === 0) return void 0;
8578
+ const map = {};
8579
+ for (const ctx of cfg.contexts) {
8580
+ try {
8581
+ const v = ctx.use();
8582
+ map[ctx.id] = ctx.serialize(v);
8583
+ } catch {
8584
+ }
8585
+ }
8586
+ const keys = Object.keys(map);
8587
+ if (keys.length === 0) return void 0;
8588
+ return cfg.serializer.stringify(map);
8589
+ }, "buildContextHeader");
8416
8590
  return {
8417
8591
  async task(id2, input) {
8418
8592
  const url = `${baseUrl}/task/${encodeURIComponent(id2)}`;
@@ -8423,9 +8597,19 @@ function createExposureFetch(cfg) {
8423
8597
  buildHeaders(),
8424
8598
  cfg?.timeoutMs,
8425
8599
  cfg.serializer,
8426
- cfg?.onRequest
8600
+ cfg?.onRequest,
8601
+ buildContextHeader()
8427
8602
  );
8428
- return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
8603
+ try {
8604
+ return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
8605
+ } catch (e) {
8606
+ const te = e;
8607
+ if (te && cfg.errorRegistry && te.id && te.data) {
8608
+ const helper = cfg.errorRegistry.get(String(te.id));
8609
+ if (helper) helper.throw(te.data);
8610
+ }
8611
+ throw e;
8612
+ }
8429
8613
  },
8430
8614
  async event(id2, payload) {
8431
8615
  const url = `${baseUrl}/event/${encodeURIComponent(id2)}`;
@@ -8436,9 +8620,19 @@ function createExposureFetch(cfg) {
8436
8620
  buildHeaders(),
8437
8621
  cfg?.timeoutMs,
8438
8622
  cfg.serializer,
8439
- cfg?.onRequest
8623
+ cfg?.onRequest,
8624
+ buildContextHeader()
8440
8625
  );
8441
- assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
8626
+ try {
8627
+ assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
8628
+ } catch (e) {
8629
+ const te = e;
8630
+ if (te && cfg.errorRegistry && te.id && te.data) {
8631
+ const helper = cfg.errorRegistry.get(String(te.id));
8632
+ if (helper) helper.throw(te.data);
8633
+ }
8634
+ throw e;
8635
+ }
8442
8636
  }
8443
8637
  };
8444
8638
  }
@@ -8490,14 +8684,14 @@ function buildTestFacade(deps) {
8490
8684
  __name(buildTestFacade, "buildTestFacade");
8491
8685
 
8492
8686
  // src/definers/builders/resource.ts
8493
- function clone(s, patch) {
8687
+ function clone2(s, patch) {
8494
8688
  return Object.freeze({
8495
8689
  // We reuse the frozen state while widening generics, hence the temporary cast.
8496
8690
  ...s,
8497
8691
  ...patch
8498
8692
  });
8499
8693
  }
8500
- __name(clone, "clone");
8694
+ __name(clone2, "clone");
8501
8695
  function toRegisterArray(items) {
8502
8696
  return Array.isArray(items) ? [...items] : [items];
8503
8697
  }
@@ -8581,7 +8775,7 @@ function makeResourceBuilder(state) {
8581
8775
  id: state.id,
8582
8776
  dependencies(deps, options) {
8583
8777
  const override = options?.override ?? false;
8584
- const next = clone(state, {
8778
+ const next = clone2(state, {
8585
8779
  dependencies: mergeDependencies(
8586
8780
  state.dependencies,
8587
8781
  deps,
@@ -8595,50 +8789,50 @@ function makeResourceBuilder(state) {
8595
8789
  },
8596
8790
  register(items, options) {
8597
8791
  const override = options?.override ?? false;
8598
- const next = clone(state, {
8792
+ const next = clone2(state, {
8599
8793
  register: mergeRegister(state.register, items, override)
8600
8794
  });
8601
8795
  return makeResourceBuilder(next);
8602
8796
  },
8603
8797
  middleware(mw, options) {
8604
8798
  const override = options?.override ?? false;
8605
- const next = clone(state, {
8799
+ const next = clone2(state, {
8606
8800
  middleware: mergeArray(state.middleware, mw, override)
8607
8801
  });
8608
8802
  return makeResourceBuilder(next);
8609
8803
  },
8610
8804
  tags(tags, options) {
8611
8805
  const override = options?.override ?? false;
8612
- const next = clone(state, { tags: mergeArray(state.tags, tags, override) });
8806
+ const next = clone2(state, { tags: mergeArray(state.tags, tags, override) });
8613
8807
  return makeResourceBuilder(next);
8614
8808
  },
8615
8809
  context(factory) {
8616
- const next = clone(state, { context: factory });
8810
+ const next = clone2(state, { context: factory });
8617
8811
  return makeResourceBuilder(next);
8618
8812
  },
8619
8813
  configSchema(schema) {
8620
- const next = clone(state, { configSchema: schema });
8814
+ const next = clone2(state, { configSchema: schema });
8621
8815
  return makeResourceBuilder(next);
8622
8816
  },
8623
8817
  resultSchema(schema) {
8624
- const next = clone(state, { resultSchema: schema });
8818
+ const next = clone2(state, { resultSchema: schema });
8625
8819
  return makeResourceBuilder(next);
8626
8820
  },
8627
8821
  init(fn) {
8628
- const next = clone(state, { init: fn });
8822
+ const next = clone2(state, { init: fn });
8629
8823
  return makeResourceBuilder(next);
8630
8824
  },
8631
8825
  dispose(fn) {
8632
- const next = clone(state, { dispose: fn });
8826
+ const next = clone2(state, { dispose: fn });
8633
8827
  return makeResourceBuilder(next);
8634
8828
  },
8635
8829
  meta(m) {
8636
- const next = clone(state, { meta: m });
8830
+ const next = clone2(state, { meta: m });
8637
8831
  return makeResourceBuilder(next);
8638
8832
  },
8639
8833
  overrides(o, options) {
8640
8834
  const override = options?.override ?? false;
8641
- const next = clone(state, {
8835
+ const next = clone2(state, {
8642
8836
  overrides: mergeArray(state.overrides, o, override)
8643
8837
  });
8644
8838
  return makeResourceBuilder(next);
@@ -8725,16 +8919,16 @@ function mergeDepsNoConfig(existing, addition, override) {
8725
8919
  __name(mergeDepsNoConfig, "mergeDepsNoConfig");
8726
8920
 
8727
8921
  // src/definers/builders/task.phantom.ts
8728
- function clone2(s, patch) {
8922
+ function clone3(s, patch) {
8729
8923
  return cloneState(s, patch);
8730
8924
  }
8731
- __name(clone2, "clone");
8925
+ __name(clone3, "clone");
8732
8926
  function makePhantomTaskBuilder(state) {
8733
8927
  const builder = {
8734
8928
  id: state.id,
8735
8929
  dependencies(deps, options) {
8736
8930
  const override = options?.override ?? false;
8737
- const next = clone2(state, {
8931
+ const next = clone3(state, {
8738
8932
  dependencies: mergeDepsNoConfig(
8739
8933
  state.dependencies,
8740
8934
  deps,
@@ -8748,26 +8942,26 @@ function makePhantomTaskBuilder(state) {
8748
8942
  },
8749
8943
  middleware(mw, options) {
8750
8944
  const override = options?.override ?? false;
8751
- const next = clone2(state, {
8945
+ const next = clone3(state, {
8752
8946
  middleware: mergeArray2(state.middleware, mw, override)
8753
8947
  });
8754
8948
  return makePhantomTaskBuilder(next);
8755
8949
  },
8756
8950
  tags(t, options) {
8757
8951
  const override = options?.override ?? false;
8758
- const next = clone2(state, { tags: mergeArray2(state.tags, t, override) });
8952
+ const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
8759
8953
  return makePhantomTaskBuilder(next);
8760
8954
  },
8761
8955
  inputSchema(schema) {
8762
- const next = clone2(state, { inputSchema: schema });
8956
+ const next = clone3(state, { inputSchema: schema });
8763
8957
  return makePhantomTaskBuilder(next);
8764
8958
  },
8765
8959
  resultSchema(schema) {
8766
- const next = clone2(state, { resultSchema: schema });
8960
+ const next = clone3(state, { resultSchema: schema });
8767
8961
  return makePhantomTaskBuilder(next);
8768
8962
  },
8769
8963
  meta(m) {
8770
- const next = clone2(state, { meta: m });
8964
+ const next = clone3(state, { meta: m });
8771
8965
  return makePhantomTaskBuilder(next);
8772
8966
  },
8773
8967
  build() {
@@ -8801,16 +8995,16 @@ function phantomTaskBuilder(id2) {
8801
8995
  __name(phantomTaskBuilder, "phantomTaskBuilder");
8802
8996
 
8803
8997
  // src/definers/builders/task.ts
8804
- function clone3(s, patch) {
8998
+ function clone4(s, patch) {
8805
8999
  return cloneState(s, patch);
8806
9000
  }
8807
- __name(clone3, "clone");
9001
+ __name(clone4, "clone");
8808
9002
  function makeTaskBuilder(state) {
8809
9003
  const builder = {
8810
9004
  id: state.id,
8811
9005
  dependencies(deps, options) {
8812
9006
  const override = options?.override ?? false;
8813
- const next = clone3(state, {
9007
+ const next = clone4(state, {
8814
9008
  dependencies: mergeDepsNoConfig(
8815
9009
  state.dependencies,
8816
9010
  deps,
@@ -8824,22 +9018,22 @@ function makeTaskBuilder(state) {
8824
9018
  },
8825
9019
  middleware(mw, options) {
8826
9020
  const override = options?.override ?? false;
8827
- const next = clone3(state, {
9021
+ const next = clone4(state, {
8828
9022
  middleware: mergeArray2(state.middleware, mw, override)
8829
9023
  });
8830
9024
  return makeTaskBuilder(next);
8831
9025
  },
8832
9026
  tags(t, options) {
8833
9027
  const override = options?.override ?? false;
8834
- const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
9028
+ const next = clone4(state, { tags: mergeArray2(state.tags, t, override) });
8835
9029
  return makeTaskBuilder(next);
8836
9030
  },
8837
9031
  inputSchema(schema) {
8838
- const next = clone3(state, { inputSchema: schema });
9032
+ const next = clone4(state, { inputSchema: schema });
8839
9033
  return makeTaskBuilder(next);
8840
9034
  },
8841
9035
  resultSchema(schema) {
8842
- const next = clone3(state, { resultSchema: schema });
9036
+ const next = clone4(state, { resultSchema: schema });
8843
9037
  return makeTaskBuilder(next);
8844
9038
  },
8845
9039
  run(fn) {
@@ -8847,11 +9041,11 @@ function makeTaskBuilder(state) {
8847
9041
  input,
8848
9042
  deps
8849
9043
  ), "wrapped");
8850
- const next = clone3(state, { run: wrapped });
9044
+ const next = clone4(state, { run: wrapped });
8851
9045
  return makeTaskBuilder(next);
8852
9046
  },
8853
9047
  meta(m) {
8854
- const next = clone3(state, { meta: m });
9048
+ const next = clone4(state, { meta: m });
8855
9049
  return makeTaskBuilder(next);
8856
9050
  },
8857
9051
  build() {
@@ -8882,25 +9076,25 @@ var task = Object.assign(taskBuilder, {
8882
9076
  });
8883
9077
 
8884
9078
  // src/definers/builders/event.ts
8885
- function clone4(s, patch) {
9079
+ function clone5(s, patch) {
8886
9080
  return Object.freeze({ ...s, ...patch });
8887
9081
  }
8888
- __name(clone4, "clone");
9082
+ __name(clone5, "clone");
8889
9083
  function makeEventBuilder(state) {
8890
9084
  const b = {
8891
9085
  id: state.id,
8892
9086
  payloadSchema(schema) {
8893
- const next = clone4(state, { payloadSchema: schema });
9087
+ const next = clone5(state, { payloadSchema: schema });
8894
9088
  return makeEventBuilder(next);
8895
9089
  },
8896
9090
  tags(t, options) {
8897
9091
  const override = options?.override ?? false;
8898
9092
  const tags = mergeArray2(state.tags, t, override);
8899
- const next = clone4(state, { tags });
9093
+ const next = clone5(state, { tags });
8900
9094
  return makeEventBuilder(next);
8901
9095
  },
8902
9096
  meta(m) {
8903
- const next = clone4(state, { meta: m });
9097
+ const next = clone5(state, { meta: m });
8904
9098
  return makeEventBuilder(next);
8905
9099
  },
8906
9100
  build() {
@@ -8925,21 +9119,21 @@ __name(eventBuilder, "eventBuilder");
8925
9119
  var event = eventBuilder;
8926
9120
 
8927
9121
  // src/definers/builders/hook.ts
8928
- function clone5(s, patch) {
9122
+ function clone6(s, patch) {
8929
9123
  return Object.freeze({ ...s, ...patch });
8930
9124
  }
8931
- __name(clone5, "clone");
9125
+ __name(clone6, "clone");
8932
9126
  function makeHookBuilder(state) {
8933
9127
  const b = {
8934
9128
  id: state.id,
8935
9129
  on(on) {
8936
- const next = clone5(state, { on });
9130
+ const next = clone6(state, { on });
8937
9131
  return makeHookBuilder(
8938
9132
  next
8939
9133
  );
8940
9134
  },
8941
9135
  order(order) {
8942
- const next = clone5(state, { order });
9136
+ const next = clone6(state, { order });
8943
9137
  return makeHookBuilder(next);
8944
9138
  },
8945
9139
  dependencies(deps, options) {
@@ -8966,7 +9160,7 @@ function makeHookBuilder(state) {
8966
9160
  const a = deps;
8967
9161
  merged = { ...e, ...a };
8968
9162
  }
8969
- const next = clone5(state, { dependencies: merged });
9163
+ const next = clone6(state, { dependencies: merged });
8970
9164
  if (override) {
8971
9165
  return makeHookBuilder(
8972
9166
  next
@@ -8979,17 +9173,17 @@ function makeHookBuilder(state) {
8979
9173
  tags(t, options) {
8980
9174
  const override = options?.override ?? false;
8981
9175
  const tags = mergeArray2(state.tags, t, override);
8982
- const next = clone5(state, { tags });
9176
+ const next = clone6(state, { tags });
8983
9177
  return makeHookBuilder(next);
8984
9178
  },
8985
9179
  meta(m) {
8986
- const next = clone5(state, { meta: m });
9180
+ const next = clone6(state, { meta: m });
8987
9181
  return makeHookBuilder(
8988
9182
  next
8989
9183
  );
8990
9184
  },
8991
9185
  run(fn) {
8992
- const next = clone5(state, { run: fn });
9186
+ const next = clone6(state, { run: fn });
8993
9187
  return makeHookBuilder(next);
8994
9188
  },
8995
9189
  build() {
@@ -9034,7 +9228,10 @@ function makeTaskMiddlewareBuilder(state) {
9034
9228
  } else if (isFnExisting && isFnAddition) {
9035
9229
  const e = state.dependencies;
9036
9230
  const a = deps;
9037
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
9231
+ merged = /* @__PURE__ */ __name(((cfg) => ({
9232
+ ...e(cfg),
9233
+ ...a(cfg)
9234
+ })), "merged");
9038
9235
  } else if (isFnExisting && !isFnAddition) {
9039
9236
  const e = state.dependencies;
9040
9237
  const a = deps;
@@ -9121,7 +9318,10 @@ function makeResourceMiddlewareBuilder(state) {
9121
9318
  } else if (isFnExisting && isFnAddition) {
9122
9319
  const e = state.dependencies;
9123
9320
  const a = deps;
9124
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
9321
+ merged = /* @__PURE__ */ __name(((cfg) => ({
9322
+ ...e(cfg),
9323
+ ...a(cfg)
9324
+ })), "merged");
9125
9325
  } else if (isFnExisting && !isFnAddition) {
9126
9326
  const e = state.dependencies;
9127
9327
  const a = deps;
@@ -9195,25 +9395,25 @@ var taskMiddleware = taskMiddlewareBuilder;
9195
9395
  var resourceMiddleware = resourceMiddlewareBuilder;
9196
9396
 
9197
9397
  // src/definers/builders/tag.ts
9198
- function clone6(s, patch) {
9398
+ function clone7(s, patch) {
9199
9399
  return Object.freeze({ ...s, ...patch });
9200
9400
  }
9201
- __name(clone6, "clone");
9401
+ __name(clone7, "clone");
9202
9402
  function makeTagBuilder(state) {
9203
9403
  const b = {
9204
9404
  id: state.id,
9205
9405
  meta(m) {
9206
- const next = clone6(state, { meta: m });
9406
+ const next = clone7(state, { meta: m });
9207
9407
  return makeTagBuilder(next);
9208
9408
  },
9209
9409
  configSchema(schema) {
9210
- const next = clone6(state, { configSchema: schema });
9410
+ const next = clone7(state, { configSchema: schema });
9211
9411
  return makeTagBuilder(
9212
9412
  next
9213
9413
  );
9214
9414
  },
9215
9415
  config(config) {
9216
- const next = clone6(state, { config });
9416
+ const next = clone7(state, { config });
9217
9417
  return makeTagBuilder(
9218
9418
  next
9219
9419
  );
@@ -9244,6 +9444,51 @@ function tagBuilder(id2) {
9244
9444
  __name(tagBuilder, "tagBuilder");
9245
9445
  var tag = tagBuilder;
9246
9446
 
9447
+ // src/definers/builders/asyncContext.ts
9448
+ function clone8(s, patch) {
9449
+ return Object.freeze({ ...s, ...patch });
9450
+ }
9451
+ __name(clone8, "clone");
9452
+ function makeAsyncContextBuilder(state) {
9453
+ const b = {
9454
+ id: state.id,
9455
+ serialize(fn) {
9456
+ const next = clone8(state, { serialize: fn });
9457
+ return makeAsyncContextBuilder(next);
9458
+ },
9459
+ parse(fn) {
9460
+ const next = clone8(state, { parse: fn });
9461
+ return makeAsyncContextBuilder(next);
9462
+ },
9463
+ configSchema(schema) {
9464
+ const next = clone8(state, { configSchema: schema });
9465
+ return makeAsyncContextBuilder(next);
9466
+ },
9467
+ build() {
9468
+ const def = {
9469
+ id: state.id,
9470
+ serialize: state.serialize,
9471
+ parse: state.parse,
9472
+ configSchema: state.configSchema
9473
+ };
9474
+ return defineAsyncContext(def);
9475
+ }
9476
+ };
9477
+ return b;
9478
+ }
9479
+ __name(makeAsyncContextBuilder, "makeAsyncContextBuilder");
9480
+ function asyncContextBuilder(id2) {
9481
+ const initial = Object.freeze({
9482
+ id: id2,
9483
+ serialize: void 0,
9484
+ parse: void 0,
9485
+ configSchema: void 0
9486
+ });
9487
+ return makeAsyncContextBuilder(initial);
9488
+ }
9489
+ __name(asyncContextBuilder, "asyncContextBuilder");
9490
+ var asyncContext = asyncContextBuilder;
9491
+
9247
9492
  // src/models/Semaphore.ts
9248
9493
  var Semaphore = class {
9249
9494
  constructor(maxPermits) {
@@ -9294,9 +9539,9 @@ var Semaphore = class {
9294
9539
  options.signal.removeEventListener("abort", abortHandler);
9295
9540
  originalResolve();
9296
9541
  };
9297
- operation.reject = (error) => {
9542
+ operation.reject = (error2) => {
9298
9543
  options.signal.removeEventListener("abort", abortHandler);
9299
- originalReject(error);
9544
+ originalReject(error2);
9300
9545
  };
9301
9546
  }
9302
9547
  this.waitingQueue.push(operation);
@@ -9397,14 +9642,18 @@ var globals = {
9397
9642
  resources: globalResources,
9398
9643
  middleware: globalMiddlewares,
9399
9644
  tags: globalTags,
9400
- tunnels
9645
+ tunnels,
9646
+ debug
9401
9647
  };
9648
+ var createContext2 = createContext;
9402
9649
  var r = Object.freeze({
9403
9650
  resource,
9404
9651
  task,
9405
9652
  event,
9406
9653
  hook,
9407
9654
  tag,
9655
+ asyncContext,
9656
+ error,
9408
9657
  middleware: Object.freeze({
9409
9658
  task: taskMiddleware,
9410
9659
  resource: resourceMiddleware
@@ -9427,12 +9676,17 @@ function jsonOkResponse(data = {}) {
9427
9676
  return { status: 200, body: { ok: true, ...data } };
9428
9677
  }
9429
9678
  __name(jsonOkResponse, "jsonOkResponse");
9430
- function jsonErrorResponse(status, message, code) {
9431
- const error = { message };
9679
+ function jsonErrorResponse(status, message, code, extra) {
9680
+ const error2 = { message };
9432
9681
  if (code) {
9433
- error.code = code;
9682
+ error2.code = code;
9683
+ }
9684
+ if (extra && typeof extra === "object") {
9685
+ for (const [k, v] of Object.entries(extra)) {
9686
+ error2[k] = v;
9687
+ }
9434
9688
  }
9435
- return { status, body: { ok: false, error } };
9689
+ return { status, body: { ok: false, error: error2 } };
9436
9690
  }
9437
9691
  __name(jsonErrorResponse, "jsonErrorResponse");
9438
9692
  function respondJson(res, response, serializer) {
@@ -9649,8 +9903,8 @@ function safeLogInfo(logger, message, data) {
9649
9903
  }
9650
9904
  }
9651
9905
  __name(safeLogInfo, "safeLogInfo");
9652
- function errorMessage(error) {
9653
- return error instanceof Error ? error.message : String(error);
9906
+ function errorMessage(error2) {
9907
+ return error2 instanceof Error ? error2.message : String(error2);
9654
9908
  }
9655
9909
  __name(errorMessage, "errorMessage");
9656
9910
 
@@ -9662,9 +9916,9 @@ function makeRequestListener(options) {
9662
9916
  if (!handled && respondOnMiss && !res.writableEnded) {
9663
9917
  respondJson(res, NOT_FOUND_RESPONSE);
9664
9918
  }
9665
- }).catch((error) => {
9919
+ }).catch((error2) => {
9666
9920
  safeLogError(logger, "exposure.http.unhandled", {
9667
- error: errorMessage(error)
9921
+ error: errorMessage(error2)
9668
9922
  });
9669
9923
  if (!res.writableEnded) {
9670
9924
  respondJson(
@@ -10073,7 +10327,14 @@ async function readRequestBody(req, signal) {
10073
10327
  if (aborted) return;
10074
10328
  aborted = true;
10075
10329
  cleanup();
10076
- reject(new CancellationError("Request aborted"));
10330
+ const err = (() => {
10331
+ try {
10332
+ cancellationError.throw({ reason: "Request aborted" });
10333
+ } catch (e) {
10334
+ return e;
10335
+ }
10336
+ })();
10337
+ reject(err);
10077
10338
  }, "onAbort");
10078
10339
  const onError = /* @__PURE__ */ __name((err) => {
10079
10340
  cleanup();
@@ -10192,9 +10453,9 @@ function trimTrailingSlash(path3) {
10192
10453
  __name(trimTrailingSlash, "trimTrailingSlash");
10193
10454
 
10194
10455
  // src/node/exposure/requestContext.ts
10195
- var ExposureRequestContext = createContext(
10196
- "platform.node.exposure.request"
10197
- );
10456
+ var ExposureRequestContext = defineAsyncContext({
10457
+ id: "platform.node.exposure.request"
10458
+ });
10198
10459
  function useExposureContext() {
10199
10460
  return ExposureRequestContext.use();
10200
10461
  }
@@ -10322,7 +10583,16 @@ function createAbortControllerForRequest(req, res) {
10322
10583
  const controller = new AbortController();
10323
10584
  const onAbort = /* @__PURE__ */ __name(() => {
10324
10585
  try {
10325
- controller.abort(new CancellationError("Client Closed Request"));
10586
+ controller.abort(
10587
+ // pass a typed error instance
10588
+ (() => {
10589
+ try {
10590
+ cancellationError.throw({ reason: "Client Closed Request" });
10591
+ } catch (e) {
10592
+ return e;
10593
+ }
10594
+ })()
10595
+ );
10326
10596
  } catch {
10327
10597
  }
10328
10598
  }, "onAbort");
@@ -10376,18 +10646,43 @@ function createRequestHandlers(deps) {
10376
10646
  try {
10377
10647
  const contentType = getContentType(req.headers);
10378
10648
  const url = requestUrl(req);
10379
- const provide = /* @__PURE__ */ __name((fn) => ExposureRequestContext.provide(
10380
- {
10381
- req,
10382
- res,
10383
- url,
10384
- basePath: router.basePath,
10385
- headers: req.headers,
10386
- method: req.method,
10387
- signal: controller.signal
10388
- },
10389
- fn
10390
- ), "provide");
10649
+ const buildProvider = /* @__PURE__ */ __name((fn) => {
10650
+ const rawHeader = req.headers["x-runner-context"];
10651
+ let headerText;
10652
+ if (Array.isArray(rawHeader)) headerText = rawHeader[0];
10653
+ else if (typeof rawHeader === "string") headerText = rawHeader;
10654
+ let userWrapped = fn;
10655
+ if (headerText) {
10656
+ try {
10657
+ const map = serializer.parse(headerText);
10658
+ for (const [id2, ctx] of store2.asyncContexts.entries()) {
10659
+ const raw = map[id2];
10660
+ if (typeof raw === "string") {
10661
+ try {
10662
+ const value = ctx.parse(raw);
10663
+ const prev = userWrapped;
10664
+ userWrapped = /* @__PURE__ */ __name(async () => await ctx.provide(value, prev), "userWrapped");
10665
+ } catch {
10666
+ }
10667
+ }
10668
+ }
10669
+ } catch {
10670
+ }
10671
+ }
10672
+ const run2 = /* @__PURE__ */ __name(() => ExposureRequestContext.provide(
10673
+ {
10674
+ req,
10675
+ res,
10676
+ url,
10677
+ basePath: router.basePath,
10678
+ headers: req.headers,
10679
+ method: req.method,
10680
+ signal: controller.signal
10681
+ },
10682
+ userWrapped
10683
+ ), "run");
10684
+ return run2();
10685
+ }, "buildProvider");
10391
10686
  if (isMultipart(contentType)) {
10392
10687
  const multipart = await parseMultipartInput(
10393
10688
  req,
@@ -10403,7 +10698,7 @@ function createRequestHandlers(deps) {
10403
10698
  let taskError = void 0;
10404
10699
  let taskResult;
10405
10700
  try {
10406
- taskResult = await provide(
10701
+ taskResult = await buildProvider(
10407
10702
  () => taskRunner.run(storeTask.task, multipart.value)
10408
10703
  );
10409
10704
  } catch (err) {
@@ -10436,7 +10731,7 @@ function createRequestHandlers(deps) {
10436
10731
  return;
10437
10732
  }
10438
10733
  if (/^application\/octet-stream(?:;|$)/i.test(contentType)) {
10439
- const result2 = await provide(
10734
+ const result2 = await buildProvider(
10440
10735
  () => taskRunner.run(storeTask.task, void 0)
10441
10736
  );
10442
10737
  if (!res.writableEnded && result2 && typeof result2.pipe === "function") {
@@ -10476,7 +10771,7 @@ function createRequestHandlers(deps) {
10476
10771
  }
10477
10772
  return body.value;
10478
10773
  })();
10479
- const result = await provide(
10774
+ const result = await buildProvider(
10480
10775
  () => taskRunner.run(storeTask.task, payload)
10481
10776
  );
10482
10777
  if (!res.writableEnded && result && typeof result.pipe === "function") {
@@ -10492,8 +10787,8 @@ function createRequestHandlers(deps) {
10492
10787
  if (res.writableEnded || res.headersSent) return;
10493
10788
  applyCorsActual(req, res, cors);
10494
10789
  respondJson(res, jsonOkResponse({ result }), serializer);
10495
- } catch (error) {
10496
- if (isCancellationError(error)) {
10790
+ } catch (error2) {
10791
+ if (isCancellationError(error2)) {
10497
10792
  if (!res.writableEnded && !res.headersSent) {
10498
10793
  applyCorsActual(req, res, cors);
10499
10794
  respondJson(
@@ -10504,15 +10799,26 @@ function createRequestHandlers(deps) {
10504
10799
  }
10505
10800
  return;
10506
10801
  }
10507
- const logMessage = errorMessage(error);
10508
- const displayMessage = error instanceof Error && error.message ? error.message : "Internal Error";
10802
+ let appErrorExtra;
10803
+ try {
10804
+ for (const helper of store2.errors.values()) {
10805
+ if (helper.is(error2)) {
10806
+ const errAny = error2;
10807
+ appErrorExtra = { id: errAny?.name, data: errAny?.data };
10808
+ break;
10809
+ }
10810
+ }
10811
+ } catch {
10812
+ }
10813
+ const logMessage = errorMessage(error2);
10814
+ const displayMessage = error2 instanceof Error && error2.message ? error2.message : "Internal Error";
10509
10815
  safeLogError(logger, "exposure.task.error", {
10510
10816
  error: logMessage
10511
10817
  });
10512
10818
  applyCorsActual(req, res, cors);
10513
10819
  respondJson(
10514
10820
  res,
10515
- jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR"),
10821
+ jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR", appErrorExtra),
10516
10822
  serializer
10517
10823
  );
10518
10824
  }
@@ -10556,15 +10862,39 @@ function createRequestHandlers(deps) {
10556
10862
  respondJson(res, body.response, serializer);
10557
10863
  return;
10558
10864
  }
10559
- await eventManager.emit(
10560
- storeEvent.event,
10561
- body.value?.payload,
10562
- "exposure:http"
10563
- );
10865
+ const rawHeader = req.headers["x-runner-context"];
10866
+ let headerText;
10867
+ if (Array.isArray(rawHeader)) headerText = rawHeader[0];
10868
+ else if (typeof rawHeader === "string") headerText = rawHeader;
10869
+ let runEmit = /* @__PURE__ */ __name(async () => {
10870
+ await eventManager.emit(
10871
+ storeEvent.event,
10872
+ body.value?.payload,
10873
+ "exposure:http"
10874
+ );
10875
+ }, "runEmit");
10876
+ if (headerText) {
10877
+ try {
10878
+ const map = serializer.parse(headerText);
10879
+ for (const [id2, ctx] of store2.asyncContexts.entries()) {
10880
+ const raw = map[id2];
10881
+ if (typeof raw === "string") {
10882
+ try {
10883
+ const value = ctx.parse(raw);
10884
+ const prev = runEmit;
10885
+ runEmit = /* @__PURE__ */ __name(async () => await ctx.provide(value, prev), "runEmit");
10886
+ } catch {
10887
+ }
10888
+ }
10889
+ }
10890
+ } catch {
10891
+ }
10892
+ }
10893
+ await runEmit();
10564
10894
  applyCorsActual(req, res, cors);
10565
10895
  respondJson(res, jsonOkResponse(), serializer);
10566
- } catch (error) {
10567
- if (isCancellationError(error)) {
10896
+ } catch (error2) {
10897
+ if (isCancellationError(error2)) {
10568
10898
  if (!res.writableEnded && !res.headersSent) {
10569
10899
  applyCorsActual(req, res, cors);
10570
10900
  respondJson(
@@ -10575,15 +10905,26 @@ function createRequestHandlers(deps) {
10575
10905
  }
10576
10906
  return;
10577
10907
  }
10578
- const logMessage = errorMessage(error);
10579
- const displayMessage = error instanceof Error && error.message ? error.message : "Internal Error";
10908
+ let appErrorExtra;
10909
+ try {
10910
+ for (const helper of store2.errors.values()) {
10911
+ if (helper.is(error2)) {
10912
+ const errAny = error2;
10913
+ appErrorExtra = { id: errAny?.name, data: errAny?.data };
10914
+ break;
10915
+ }
10916
+ }
10917
+ } catch {
10918
+ }
10919
+ const logMessage = errorMessage(error2);
10920
+ const displayMessage = error2 instanceof Error && error2.message ? error2.message : "Internal Error";
10580
10921
  safeLogError(logger, "exposure.event.error", {
10581
10922
  error: logMessage
10582
10923
  });
10583
10924
  applyCorsActual(req, res, cors);
10584
10925
  respondJson(
10585
10926
  res,
10586
- jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR"),
10927
+ jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR", appErrorExtra),
10587
10928
  serializer
10588
10929
  );
10589
10930
  }
@@ -10819,6 +11160,19 @@ async function postJson(cfg, url, body) {
10819
11160
  "content-type": "application/json; charset=utf-8",
10820
11161
  ...toHeaders(cfg.auth)
10821
11162
  };
11163
+ if (cfg.contexts && cfg.contexts.length > 0) {
11164
+ const map = {};
11165
+ for (const ctx of cfg.contexts) {
11166
+ try {
11167
+ const v = ctx.use();
11168
+ map[ctx.id] = ctx.serialize(v);
11169
+ } catch {
11170
+ }
11171
+ }
11172
+ if (Object.keys(map).length > 0) {
11173
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11174
+ }
11175
+ }
10822
11176
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10823
11177
  return await new Promise((resolve, reject) => {
10824
11178
  const req = lib.request(
@@ -10908,6 +11262,19 @@ async function postMultipart(cfg, url, manifestText, files) {
10908
11262
  "content-type": `multipart/form-data; boundary=${boundary}`,
10909
11263
  ...toHeaders(cfg.auth)
10910
11264
  };
11265
+ if (cfg.contexts && cfg.contexts.length > 0) {
11266
+ const map = {};
11267
+ for (const ctx of cfg.contexts) {
11268
+ try {
11269
+ const v = ctx.use();
11270
+ map[ctx.id] = ctx.serialize(v);
11271
+ } catch {
11272
+ }
11273
+ }
11274
+ if (Object.keys(map).length > 0) {
11275
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11276
+ }
11277
+ }
10911
11278
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10912
11279
  return await new Promise(
10913
11280
  (resolve, reject) => {
@@ -10937,6 +11304,19 @@ async function postOctetStream(cfg, url, stream) {
10937
11304
  "content-type": "application/octet-stream",
10938
11305
  ...toHeaders(cfg.auth)
10939
11306
  };
11307
+ if (cfg.contexts && cfg.contexts.length > 0) {
11308
+ const map = {};
11309
+ for (const ctx of cfg.contexts) {
11310
+ try {
11311
+ const v = ctx.use();
11312
+ map[ctx.id] = ctx.serialize(v);
11313
+ } catch {
11314
+ }
11315
+ }
11316
+ if (Object.keys(map).length > 0) {
11317
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11318
+ }
11319
+ }
10940
11320
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10941
11321
  return await new Promise(
10942
11322
  (resolve, reject) => {
@@ -10947,10 +11327,10 @@ async function postOctetStream(cfg, url, stream) {
10947
11327
  cleanup.forEach((fn) => fn());
10948
11328
  resolve(value);
10949
11329
  }, "resolveOnce");
10950
- const rejectOnce = /* @__PURE__ */ __name((error) => {
11330
+ const rejectOnce = /* @__PURE__ */ __name((error2) => {
10951
11331
  settled = true;
10952
11332
  cleanup.forEach((fn) => fn());
10953
- reject(error);
11333
+ reject(error2);
10954
11334
  }, "rejectOnce");
10955
11335
  const req = lib.request(
10956
11336
  {
@@ -11094,6 +11474,6 @@ async function writeInputFileToPath(file, targetPath) {
11094
11474
  }
11095
11475
  __name(writeInputFileToPath, "writeInputFileToPath");
11096
11476
 
11097
- export { DependencyProcessor, errors_exports as Errors, EventManager, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, Semaphore, Store, TaskRunner, allFalse, bindProcessErrorHandler, createContext, createDefaultUnhandledError, createHttpSmartClient, createNodeFile, createTestResource, defs_exports as definitions, defineEvent as event, getConfig, globals, hasExposureContext, defineHook as hook, levelNormal, levelVerbose, nodeExposure, defineOverride as override, r, readInputFileToBuffer, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware, useExposureContext, writeInputFileToPath };
11477
+ 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, createHttpSmartClient, createNodeFile, createTestResource, debug, debugLevels, defs_exports as definitions, defineEvent as event, getConfig, globals, hasExposureContext, defineHook as hook, levelNormal, levelVerbose, nodeExposure, defineOverride as override, r, readInputFileToBuffer, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware, useExposureContext, writeInputFileToPath };
11098
11478
  //# sourceMappingURL=node.mjs.map
11099
11479
  //# sourceMappingURL=node.mjs.map