@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
@@ -3812,8 +3812,11 @@ var require_lib = __commonJS({
3812
3812
  // src/defs.ts
3813
3813
  var defs_exports = {};
3814
3814
  __export(defs_exports, {
3815
+ RunnerMode: () => RunnerMode,
3815
3816
  isOneOf: () => isOneOf,
3816
3817
  onAnyOf: () => onAnyOf,
3818
+ symbolAsyncContext: () => symbolAsyncContext,
3819
+ symbolError: () => symbolError,
3817
3820
  symbolEvent: () => symbolEvent,
3818
3821
  symbolFilePath: () => symbolFilePath,
3819
3822
  symbolHook: () => symbolHook,
@@ -3828,6 +3831,7 @@ __export(defs_exports, {
3828
3831
  symbolTagConfigured: () => symbolTagConfigured,
3829
3832
  symbolTask: () => symbolTask,
3830
3833
  symbolTaskMiddleware: () => symbolTaskMiddleware,
3834
+ symbolTunneledBy: () => symbolTunneledBy,
3831
3835
  symbolTunneledTask: () => symbolTunneledTask
3832
3836
  });
3833
3837
 
@@ -3841,6 +3845,7 @@ var symbolResourceWithConfig = Symbol.for(
3841
3845
  "runner.resourceWithConfig"
3842
3846
  );
3843
3847
  var symbolEvent = Symbol.for("runner.event");
3848
+ var symbolError = Symbol.for("runner.error");
3844
3849
  var symbolMiddleware = Symbol.for("runner.middleware");
3845
3850
  var symbolTaskMiddleware = Symbol.for(
3846
3851
  "runner.taskMiddleware"
@@ -3854,6 +3859,9 @@ var symbolMiddlewareConfigured = Symbol.for(
3854
3859
  var symbolTunneledTask = Symbol.for(
3855
3860
  "runner.tunneledTask"
3856
3861
  );
3862
+ var symbolTunneledBy = Symbol.for(
3863
+ "runner.tunneledBy"
3864
+ );
3857
3865
  var symbolHook = Symbol.for("runner.hook");
3858
3866
  var symbolTag = Symbol.for("runner.tag");
3859
3867
  var symbolTagConfigured = Symbol.for(
@@ -3863,6 +3871,9 @@ var symbolOptionalDependency = Symbol.for(
3863
3871
  "runner.optionalDependency"
3864
3872
  );
3865
3873
  var symbolFilePath = Symbol.for("runner.filePath");
3874
+ var symbolAsyncContext = Symbol.for(
3875
+ "runner.asyncContext"
3876
+ );
3866
3877
 
3867
3878
  // src/types/event.ts
3868
3879
  function onAnyOf(...defs) {
@@ -3873,6 +3884,14 @@ function isOneOf(emission, defs) {
3873
3884
  return defs.some((d) => d.id === emission.id);
3874
3885
  }
3875
3886
  __name(isOneOf, "isOneOf");
3887
+
3888
+ // src/types/runner.ts
3889
+ var RunnerMode = /* @__PURE__ */ ((RunnerMode2) => {
3890
+ RunnerMode2["TEST"] = "test";
3891
+ RunnerMode2["DEV"] = "dev";
3892
+ RunnerMode2["PROD"] = "prod";
3893
+ return RunnerMode2;
3894
+ })(RunnerMode || {});
3876
3895
  var cacheFactoryTask = defineTask({
3877
3896
  id: "globals.tasks.cacheFactory",
3878
3897
  run: /* @__PURE__ */ __name(async (options) => {
@@ -4017,26 +4036,123 @@ __name(defineHook, "defineHook");
4017
4036
  // src/errors.ts
4018
4037
  var errors_exports = {};
4019
4038
  __export(errors_exports, {
4020
- CancellationError: () => CancellationError,
4021
- CircularDependenciesError: () => CircularDependenciesError,
4022
- ContextError: () => ContextError,
4023
- DependencyNotFoundError: () => DependencyNotFoundError,
4024
- DuplicateRegistrationError: () => DuplicateRegistrationError,
4025
- EventCycleError: () => EventCycleError,
4026
- EventEmissionCycleError: () => EventEmissionCycleError,
4027
- EventNotFoundError: () => EventNotFoundError,
4028
- LockedError: () => LockedError,
4029
- MiddlewareNotRegisteredError: () => MiddlewareNotRegisteredError,
4030
- PlatformUnsupportedFunction: () => PlatformUnsupportedFunction,
4031
- ResourceNotFoundError: () => ResourceNotFoundError,
4032
- RuntimeError: () => RuntimeError,
4033
- StoreAlreadyInitializedError: () => StoreAlreadyInitializedError,
4034
- TagNotFoundError: () => TagNotFoundError,
4035
- UnknownItemTypeError: () => UnknownItemTypeError,
4036
- ValidationError: () => ValidationError,
4037
- isCancellationError: () => isCancellationError
4039
+ cancellationError: () => cancellationError,
4040
+ circularDependenciesError: () => circularDependenciesError,
4041
+ contextError: () => contextError,
4042
+ dependencyNotFoundError: () => dependencyNotFoundError,
4043
+ duplicateRegistrationError: () => duplicateRegistrationError,
4044
+ eventCycleError: () => eventCycleError,
4045
+ eventEmissionCycleError: () => eventEmissionCycleError,
4046
+ eventNotFoundError: () => eventNotFoundError,
4047
+ isCancellationError: () => isCancellationError,
4048
+ lockedError: () => lockedError,
4049
+ middlewareNotRegisteredError: () => middlewareNotRegisteredError,
4050
+ platformUnsupportedFunctionError: () => platformUnsupportedFunctionError,
4051
+ resourceNotFoundError: () => resourceNotFoundError,
4052
+ storeAlreadyInitializedError: () => storeAlreadyInitializedError,
4053
+ tagNotFoundError: () => tagNotFoundError,
4054
+ tunnelOwnershipConflictError: () => tunnelOwnershipConflictError,
4055
+ unknownItemTypeError: () => unknownItemTypeError,
4056
+ validationError: () => validationError
4038
4057
  });
4039
4058
 
4059
+ // src/definers/defineError.ts
4060
+ var RunnerError = class extends Error {
4061
+ constructor(id2, message, data) {
4062
+ super(message);
4063
+ this.id = id2;
4064
+ this.data = data;
4065
+ this.name = id2;
4066
+ }
4067
+ static {
4068
+ __name(this, "RunnerError");
4069
+ }
4070
+ };
4071
+ var _a;
4072
+ _a = symbolError;
4073
+ var ErrorHelper = class {
4074
+ constructor(definition) {
4075
+ this.definition = definition;
4076
+ this[_a] = true;
4077
+ }
4078
+ static {
4079
+ __name(this, "ErrorHelper");
4080
+ }
4081
+ get id() {
4082
+ return this.definition.id;
4083
+ }
4084
+ throw(data) {
4085
+ const parsed = this.definition.dataSchema ? this.definition.dataSchema.parse(data) : data;
4086
+ const message = this.definition.format(parsed);
4087
+ throw new RunnerError(this.definition.id, message, parsed);
4088
+ }
4089
+ is(error2) {
4090
+ return error2 instanceof RunnerError && error2.name === this.definition.id;
4091
+ }
4092
+ optional() {
4093
+ return {
4094
+ inner: this,
4095
+ [symbolOptionalDependency]: true
4096
+ };
4097
+ }
4098
+ };
4099
+ function defineError(definition) {
4100
+ if (!definition.format) {
4101
+ definition.format = (data) => `${JSON.stringify(data)}`;
4102
+ }
4103
+ return new ErrorHelper(definition);
4104
+ }
4105
+ __name(defineError, "defineError");
4106
+
4107
+ // src/definers/builders/error.ts
4108
+ function clone(s, patch) {
4109
+ return Object.freeze({ ...s, ...patch });
4110
+ }
4111
+ __name(clone, "clone");
4112
+ function makeErrorBuilder(state) {
4113
+ const b = {
4114
+ id: state.id,
4115
+ serialize(fn) {
4116
+ const next = clone(state, { serialize: fn });
4117
+ return makeErrorBuilder(next);
4118
+ },
4119
+ parse(fn) {
4120
+ const next = clone(state, { parse: fn });
4121
+ return makeErrorBuilder(next);
4122
+ },
4123
+ dataSchema(schema) {
4124
+ const next = clone(state, { dataSchema: schema });
4125
+ return makeErrorBuilder(next);
4126
+ },
4127
+ format(fn) {
4128
+ const next = clone(state, { format: fn });
4129
+ return makeErrorBuilder(next);
4130
+ },
4131
+ build() {
4132
+ return defineError({
4133
+ id: state.id,
4134
+ serialize: state.serialize,
4135
+ parse: state.parse,
4136
+ dataSchema: state.dataSchema,
4137
+ format: state.format
4138
+ });
4139
+ }
4140
+ };
4141
+ return b;
4142
+ }
4143
+ __name(makeErrorBuilder, "makeErrorBuilder");
4144
+ function errorBuilder(id2) {
4145
+ const initial = Object.freeze({
4146
+ id: id2,
4147
+ serialize: void 0,
4148
+ parse: void 0,
4149
+ dataSchema: void 0
4150
+ });
4151
+ return makeErrorBuilder(initial);
4152
+ }
4153
+ __name(errorBuilder, "errorBuilder");
4154
+ var error = errorBuilder;
4155
+
4040
4156
  // src/platform/adapters/node-als.ts
4041
4157
  async function loadAsyncLocalStorageClass() {
4042
4158
  const mod = await import('async_hooks');
@@ -4160,7 +4276,7 @@ var BrowserPlatformAdapter = class {
4160
4276
  };
4161
4277
  }
4162
4278
  exit() {
4163
- throw new PlatformUnsupportedFunction("exit");
4279
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
4164
4280
  }
4165
4281
  getEnv(key) {
4166
4282
  const g = globalThis;
@@ -4176,10 +4292,14 @@ var BrowserPlatformAdapter = class {
4176
4292
  createAsyncLocalStorage() {
4177
4293
  return {
4178
4294
  getStore: /* @__PURE__ */ __name(() => {
4179
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4295
+ platformUnsupportedFunctionError.throw({
4296
+ functionName: "createAsyncLocalStorage"
4297
+ });
4180
4298
  }, "getStore"),
4181
- run: /* @__PURE__ */ __name(() => {
4182
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4299
+ run: /* @__PURE__ */ __name((_store, _callback) => {
4300
+ platformUnsupportedFunctionError.throw({
4301
+ functionName: "createAsyncLocalStorage"
4302
+ });
4183
4303
  }, "run")
4184
4304
  };
4185
4305
  }
@@ -4255,7 +4375,7 @@ var GenericUniversalPlatformAdapter = class {
4255
4375
  };
4256
4376
  }
4257
4377
  exit() {
4258
- throw new PlatformUnsupportedFunction("exit");
4378
+ platformUnsupportedFunctionError.throw({ functionName: "exit" });
4259
4379
  }
4260
4380
  getEnv(key) {
4261
4381
  const g = globalThis;
@@ -4271,10 +4391,14 @@ var GenericUniversalPlatformAdapter = class {
4271
4391
  createAsyncLocalStorage() {
4272
4392
  return {
4273
4393
  getStore: /* @__PURE__ */ __name(() => {
4274
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4394
+ platformUnsupportedFunctionError.throw({
4395
+ functionName: "createAsyncLocalStorage"
4396
+ });
4275
4397
  }, "getStore"),
4276
- run: /* @__PURE__ */ __name(() => {
4277
- throw new PlatformUnsupportedFunction("createAsyncLocalStorage");
4398
+ run: /* @__PURE__ */ __name((_store, _callback) => {
4399
+ platformUnsupportedFunctionError.throw({
4400
+ functionName: "createAsyncLocalStorage"
4401
+ });
4278
4402
  }, "run")
4279
4403
  };
4280
4404
  }
@@ -4471,198 +4595,90 @@ var PlatformAdapter = class {
4471
4595
  };
4472
4596
 
4473
4597
  // src/errors.ts
4474
- var RuntimeError = class extends Error {
4475
- static {
4476
- __name(this, "RuntimeError");
4477
- }
4478
- constructor(message) {
4479
- super(message);
4480
- this.name = "RuntimeError";
4481
- }
4482
- };
4483
- var DuplicateRegistrationError = class extends RuntimeError {
4484
- static {
4485
- __name(this, "DuplicateRegistrationError");
4486
- }
4487
- constructor(type, id2) {
4488
- super(
4489
- `${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.`
4490
- );
4491
- this.name = "DuplicateRegistrationError";
4492
- }
4493
- };
4494
- var DependencyNotFoundError = class extends RuntimeError {
4495
- static {
4496
- __name(this, "DependencyNotFoundError");
4497
- }
4498
- constructor(key) {
4499
- super(
4500
- `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
4501
- );
4502
- this.name = "DependencyNotFoundError";
4503
- }
4504
- };
4505
- var UnknownItemTypeError = class extends RuntimeError {
4506
- static {
4507
- __name(this, "UnknownItemTypeError");
4508
- }
4509
- constructor(item) {
4510
- super(
4511
- `Unknown item type: ${item}. Please ensure you are not using different versions of '@bluelibs/runner'`
4512
- );
4513
- this.name = "UnknownItemTypeError";
4514
- }
4515
- };
4516
- var ContextError = class extends Error {
4517
- static {
4518
- __name(this, "ContextError");
4519
- }
4520
- constructor(message) {
4521
- super(message);
4522
- this.name = "ContextError";
4523
- }
4524
- };
4525
- var CircularDependenciesError = class extends RuntimeError {
4526
- static {
4527
- __name(this, "CircularDependenciesError");
4528
- }
4529
- constructor(cycles) {
4530
- const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
4531
- const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
4532
- let guidance = "\n\nTo resolve circular dependencies:";
4533
- guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
4534
- guidance += "\n \u2022 Extract shared dependencies into separate resources";
4535
- if (hasMiddleware) {
4536
- guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
4537
- guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
4538
- }
4539
- super(`Circular dependencies detected:
4540
- ${cycleDetails}${guidance}`);
4541
- this.name = "CircularDependenciesError";
4542
- }
4543
- };
4544
- var EventNotFoundError = class extends RuntimeError {
4545
- static {
4546
- __name(this, "EventNotFoundError");
4547
- }
4548
- constructor(id2) {
4549
- super(`Event "${id2.toString()}" not found. Did you forget to register it?`);
4550
- this.name = "EventNotFoundError";
4551
- }
4552
- };
4553
- var ResourceNotFoundError = class extends RuntimeError {
4554
- static {
4555
- __name(this, "ResourceNotFoundError");
4556
- }
4557
- constructor(id2) {
4558
- super(
4559
- `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
4560
- );
4561
- this.name = "ResourceNotFoundError";
4562
- }
4563
- };
4564
- var MiddlewareNotRegisteredError = class extends RuntimeError {
4565
- static {
4566
- __name(this, "MiddlewareNotRegisteredError");
4567
- }
4568
- constructor(type, source, middlewareId) {
4569
- super(
4570
- `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
4571
- );
4572
- this.name = `MiddlewareNotRegisteredError: ${type} ${source} ${middlewareId}`;
4573
- }
4574
- };
4575
- var TagNotFoundError = class extends RuntimeError {
4576
- static {
4577
- __name(this, "TagNotFoundError");
4578
- }
4579
- constructor(id2) {
4580
- super(
4581
- `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
4582
- );
4583
- this.name = "TagNotRegisteredError";
4584
- }
4585
- };
4586
- var LockedError = class extends RuntimeError {
4587
- static {
4588
- __name(this, "LockedError");
4589
- }
4590
- constructor(what) {
4591
- super(`Cannot modify the ${what.toString()} when it is locked.`);
4592
- this.name = "LockedError";
4593
- }
4594
- };
4595
- var StoreAlreadyInitializedError = class extends RuntimeError {
4596
- static {
4597
- __name(this, "StoreAlreadyInitializedError");
4598
- }
4599
- constructor() {
4600
- super("Store already initialized. Cannot reinitialize.");
4601
- this.name = "StoreAlreadyInitializedError";
4602
- }
4603
- };
4604
- var ValidationError = class extends RuntimeError {
4605
- static {
4606
- __name(this, "ValidationError");
4607
- }
4608
- constructor(type, id2, originalError) {
4609
- const errorMessage2 = originalError instanceof Error ? originalError.message : String(originalError);
4610
- super(`${type} validation failed for ${id2.toString()}: ${errorMessage2}`);
4611
- this.name = "ValidationError";
4612
- }
4613
- };
4614
- var EventCycleError = class extends RuntimeError {
4615
- static {
4616
- __name(this, "EventCycleError");
4617
- }
4618
- constructor(path3) {
4619
- const chain = path3.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
4620
- super(
4621
- `Event emission cycle detected:
4598
+ var duplicateRegistrationError = error("runner.errors.duplicateRegistration").format(
4599
+ ({ 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.`
4600
+ ).build();
4601
+ var dependencyNotFoundError = error("runner.errors.dependencyNotFound").format(
4602
+ ({ key }) => `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
4603
+ ).build();
4604
+ var unknownItemTypeError = error(
4605
+ "runner.errors.unknownItemType"
4606
+ ).format(
4607
+ ({ item }) => `Unknown item type: ${String(
4608
+ item
4609
+ )}. Please ensure you are not using different versions of '@bluelibs/runner'`
4610
+ ).build();
4611
+ var contextError = error(
4612
+ "runner.errors.context"
4613
+ ).format(({ details }) => details ?? "Context error").build();
4614
+ var circularDependenciesError = error("runner.errors.circularDependencies").format(({ cycles }) => {
4615
+ const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
4616
+ const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
4617
+ let guidance = "\n\nTo resolve circular dependencies:";
4618
+ guidance += "\n \u2022 Consider refactoring to reduce coupling between components";
4619
+ guidance += "\n \u2022 Extract shared dependencies into separate resources";
4620
+ if (hasMiddleware) {
4621
+ guidance += "\n \u2022 For middleware: you can filter out tasks/resources using everywhere(fn)";
4622
+ guidance += "\n \u2022 Consider using events for communication instead of direct dependencies";
4623
+ }
4624
+ return `Circular dependencies detected:
4625
+ ${cycleDetails}${guidance}`;
4626
+ }).build();
4627
+ var eventNotFoundError = error(
4628
+ "runner.errors.eventNotFound"
4629
+ ).format(
4630
+ ({ id: id2 }) => `Event "${id2.toString()}" not found. Did you forget to register it?`
4631
+ ).build();
4632
+ var resourceNotFoundError = error(
4633
+ "runner.errors.resourceNotFound"
4634
+ ).format(
4635
+ ({ id: id2 }) => `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
4636
+ ).build();
4637
+ var middlewareNotRegisteredError = error("runner.errors.middlewareNotRegistered").format(
4638
+ ({ type, source, middlewareId }) => `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
4639
+ ).build();
4640
+ var tagNotFoundError = error(
4641
+ "runner.errors.tagNotFound"
4642
+ ).format(
4643
+ ({ id: id2 }) => `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
4644
+ ).build();
4645
+ var lockedError = error(
4646
+ "runner.errors.locked"
4647
+ ).format(
4648
+ ({ what }) => `Cannot modify the ${what.toString()} when it is locked.`
4649
+ ).build();
4650
+ var storeAlreadyInitializedError = error(
4651
+ "runner.errors.storeAlreadyInitialized"
4652
+ ).format(() => "Store already initialized. Cannot reinitialize.").build();
4653
+ var validationError = error("runner.errors.validation").format(({ subject, id: id2, originalError }) => {
4654
+ const errorMessage2 = originalError instanceof Error ? originalError.message : String(originalError);
4655
+ return `${subject} validation failed for ${id2.toString()}: ${errorMessage2}`;
4656
+ }).build();
4657
+ var eventCycleError = error("runner.errors.eventCycle").format(({ path: path3 }) => {
4658
+ const chain = path3.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
4659
+ return `Event emission cycle detected:
4622
4660
  ${chain}
4623
4661
 
4624
- Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`
4625
- );
4626
- this.name = "EventCycleError";
4627
- }
4628
- };
4629
- var EventEmissionCycleError = class extends RuntimeError {
4630
- static {
4631
- __name(this, "EventEmissionCycleError");
4632
- }
4633
- constructor(cycles) {
4634
- const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
4635
- super(
4636
- `Event emission cycles detected between hooks and events:
4662
+ Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`;
4663
+ }).build();
4664
+ var eventEmissionCycleError = error("runner.errors.eventEmissionCycle").format(({ cycles }) => {
4665
+ const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
4666
+ return `Event emission cycles detected between hooks and events:
4637
4667
  ${list}
4638
4668
 
4639
- This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`
4640
- );
4641
- this.name = "EventEmissionCycleError";
4642
- }
4643
- };
4644
- var PlatformUnsupportedFunction = class extends RuntimeError {
4645
- static {
4646
- __name(this, "PlatformUnsupportedFunction");
4647
- }
4648
- constructor(functionName) {
4649
- super(
4650
- `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
4651
- );
4652
- this.name = "PlatformUnsupportedFunction";
4653
- }
4654
- };
4655
- var CancellationError = class extends RuntimeError {
4656
- static {
4657
- __name(this, "CancellationError");
4658
- }
4659
- constructor(message = "Operation cancelled") {
4660
- super(message);
4661
- this.name = "CancellationError";
4662
- }
4663
- };
4669
+ This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`;
4670
+ }).build();
4671
+ var platformUnsupportedFunctionError = error("runner.errors.platformUnsupportedFunction").format(
4672
+ ({ functionName }) => `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
4673
+ ).build();
4674
+ var cancellationError = error(
4675
+ "runner.errors.cancellation"
4676
+ ).format(({ reason }) => reason || "Operation cancelled").build();
4677
+ var tunnelOwnershipConflictError = error("runner.errors.tunnelOwnershipConflict").format(
4678
+ ({ 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.`
4679
+ ).build();
4664
4680
  function isCancellationError(err) {
4665
- return !!err && err.name === "CancellationError";
4681
+ return cancellationError.is(err);
4666
4682
  }
4667
4683
  __name(isCancellationError, "isCancellationError");
4668
4684
 
@@ -4687,12 +4703,12 @@ function defineResource(constConfig) {
4687
4703
  if (constConfig.configSchema) {
4688
4704
  try {
4689
4705
  config = constConfig.configSchema.parse(config);
4690
- } catch (error) {
4691
- throw new ValidationError(
4692
- "Resource config",
4693
- id2,
4694
- error instanceof Error ? error : new Error(String(error))
4695
- );
4706
+ } catch (error2) {
4707
+ validationError.throw({
4708
+ subject: "Resource config",
4709
+ id: id2,
4710
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
4711
+ });
4696
4712
  }
4697
4713
  }
4698
4714
  return {
@@ -4753,12 +4769,12 @@ function defineTaskMiddleware(middlewareDef) {
4753
4769
  if (obj.configSchema) {
4754
4770
  try {
4755
4771
  config = obj.configSchema.parse(config);
4756
- } catch (error) {
4757
- throw new ValidationError(
4758
- "Middleware config",
4759
- obj.id,
4760
- error instanceof Error ? error : new Error(String(error))
4761
- );
4772
+ } catch (error2) {
4773
+ validationError.throw({
4774
+ subject: "Middleware config",
4775
+ id: obj.id,
4776
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
4777
+ });
4762
4778
  }
4763
4779
  }
4764
4780
  return wrap({
@@ -4794,12 +4810,12 @@ function defineResourceMiddleware(middlewareDef) {
4794
4810
  if (obj.configSchema) {
4795
4811
  try {
4796
4812
  config = obj.configSchema.parse(config);
4797
- } catch (error) {
4798
- throw new ValidationError(
4799
- "Middleware config",
4800
- obj.id,
4801
- error
4802
- );
4813
+ } catch (error2) {
4814
+ validationError.throw({
4815
+ subject: "Middleware config",
4816
+ id: obj.id,
4817
+ originalError: error2
4818
+ });
4803
4819
  }
4804
4820
  }
4805
4821
  return wrap({
@@ -4851,8 +4867,12 @@ function defineTag(definition) {
4851
4867
  if (definition.configSchema) {
4852
4868
  try {
4853
4869
  tagConfig = definition.configSchema.parse(tagConfig);
4854
- } catch (error) {
4855
- throw new ValidationError("Tag config", this.id, error);
4870
+ } catch (error2) {
4871
+ validationError.throw({
4872
+ subject: "Tag config",
4873
+ id: this.id,
4874
+ originalError: error2
4875
+ });
4856
4876
  }
4857
4877
  }
4858
4878
  let config;
@@ -4953,6 +4973,14 @@ function isOptional(definition) {
4953
4973
  return definition && definition[symbolOptionalDependency];
4954
4974
  }
4955
4975
  __name(isOptional, "isOptional");
4976
+ function isError(definition) {
4977
+ return Boolean(definition && definition[symbolError]);
4978
+ }
4979
+ __name(isError, "isError");
4980
+ function isAsyncContext(definition) {
4981
+ return Boolean(definition && definition[symbolAsyncContext]);
4982
+ }
4983
+ __name(isAsyncContext, "isAsyncContext");
4956
4984
 
4957
4985
  // src/globals/middleware/requireContext.middleware.ts
4958
4986
  var requireContextTaskMiddleware = defineTaskMiddleware({
@@ -4967,29 +4995,45 @@ var requireContextTaskMiddleware = defineTaskMiddleware({
4967
4995
  return next(task2?.input);
4968
4996
  }
4969
4997
  });
4998
+ var EjsonSerializer = {
4999
+ stringify(value) {
5000
+ return ejson.EJSON.stringify(value);
5001
+ },
5002
+ parse(text) {
5003
+ return ejson.EJSON.parse(text);
5004
+ },
5005
+ addType(name, factory) {
5006
+ ejson.EJSON.addType(name, factory);
5007
+ }
5008
+ };
5009
+ function getDefaultSerializer() {
5010
+ return EjsonSerializer;
5011
+ }
5012
+ __name(getDefaultSerializer, "getDefaultSerializer");
4970
5013
 
4971
- // src/context.ts
5014
+ // src/definers/defineAsyncContext.ts
4972
5015
  var platform = getPlatform();
4973
5016
  var storage = platform.createAsyncLocalStorage();
4974
5017
  function getCurrentStore() {
4975
5018
  return storage.getStore();
4976
5019
  }
4977
5020
  __name(getCurrentStore, "getCurrentStore");
4978
- function createContext(name = "runner.context") {
5021
+ function defineAsyncContext(def) {
4979
5022
  if (!platform.hasAsyncLocalStorage()) {
4980
- throw new PlatformUnsupportedFunction(
4981
- `createAsyncLocalStorage: Cannot create context ${name}: no async storage available in this environment`
4982
- );
5023
+ platformUnsupportedFunctionError.throw({
5024
+ functionName: `createAsyncLocalStorage: Cannot create context ${def.id}: no async storage available in this environment`
5025
+ });
4983
5026
  }
4984
- const ctxId = Symbol(name);
5027
+ const ctxId = def.id;
4985
5028
  const use = /* @__PURE__ */ __name(() => {
4986
5029
  const store2 = getCurrentStore();
4987
5030
  if (!store2 || !store2.has(ctxId)) {
4988
- throw new ContextError(
4989
- `Context not available for symbol ${ctxId.toString()}`
4990
- );
5031
+ contextError.throw({
5032
+ details: `Context not available for symbol ${ctxId.toString()}`
5033
+ });
4991
5034
  }
4992
- return store2.get(ctxId);
5035
+ const s = store2;
5036
+ return s.get(ctxId);
4993
5037
  }, "use");
4994
5038
  const provide = /* @__PURE__ */ __name((value, fn) => {
4995
5039
  const currentStore = getCurrentStore();
@@ -4997,16 +5041,39 @@ function createContext(name = "runner.context") {
4997
5041
  map.set(ctxId, value);
4998
5042
  return storage.run(map, fn);
4999
5043
  }, "provide");
5044
+ const serializer = getDefaultSerializer();
5000
5045
  const api = {
5001
5046
  id: ctxId,
5047
+ [symbolAsyncContext]: true,
5002
5048
  use,
5003
- provide,
5049
+ /* istanbul ignore next */
5050
+ provide(value, fn) {
5051
+ const validated = def.configSchema ? def.configSchema.parse(value) : value;
5052
+ return provide(validated, fn);
5053
+ },
5004
5054
  require() {
5005
- return requireContextTaskMiddleware.with({ context: api });
5055
+ return requireContextTaskMiddleware.with({
5056
+ context: api
5057
+ });
5058
+ },
5059
+ /* istanbul ignore next */
5060
+ serialize: def.serialize || ((data) => serializer.stringify(data)),
5061
+ /* istanbul ignore next */
5062
+ parse: def.parse || ((data) => serializer.parse(data)),
5063
+ optional() {
5064
+ return {
5065
+ inner: api,
5066
+ [symbolOptionalDependency]: true
5067
+ };
5006
5068
  }
5007
5069
  };
5008
5070
  return api;
5009
5071
  }
5072
+ __name(defineAsyncContext, "defineAsyncContext");
5073
+ function createContext(name) {
5074
+ const id2 = name ?? `context.${Math.random().toString(36).slice(2)}.${Date.now()}`;
5075
+ return defineAsyncContext({ id: id2 });
5076
+ }
5010
5077
  __name(createContext, "createContext");
5011
5078
 
5012
5079
  // src/globals/resources/debug/debug.tag.ts
@@ -5221,10 +5288,10 @@ var retryTaskMiddleware = defineTaskMiddleware({
5221
5288
  while (true) {
5222
5289
  try {
5223
5290
  return await next(input);
5224
- } catch (error) {
5225
- const err = error;
5291
+ } catch (error2) {
5292
+ const err = error2;
5226
5293
  if (shouldStop(err) || attempts >= maxRetries) {
5227
- throw error;
5294
+ throw error2;
5228
5295
  }
5229
5296
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
5230
5297
  if (delay > 0) {
@@ -5245,10 +5312,10 @@ var retryResourceMiddleware = defineResourceMiddleware({
5245
5312
  while (true) {
5246
5313
  try {
5247
5314
  return await next(input);
5248
- } catch (error) {
5249
- const err = error;
5315
+ } catch (error2) {
5316
+ const err = error2;
5250
5317
  if (shouldStop(err) || attempts >= maxRetries) {
5251
- throw error;
5318
+ throw error2;
5252
5319
  }
5253
5320
  const delay = config.delayStrategy ? config.delayStrategy(attempts, err) : 100 * Math.pow(2, attempts);
5254
5321
  if (delay > 0) {
@@ -5268,17 +5335,17 @@ var timeoutTaskMiddleware = defineTaskMiddleware({
5268
5335
  const ttl = Math.max(0, config.ttl);
5269
5336
  const message = `Operation timed out after ${ttl}ms`;
5270
5337
  if (ttl === 0) {
5271
- const error = new Error(message);
5272
- error.name = "TimeoutError";
5273
- throw error;
5338
+ const error2 = new Error(message);
5339
+ error2.name = "TimeoutError";
5340
+ throw error2;
5274
5341
  }
5275
5342
  const controller = new AbortController();
5276
5343
  const timeoutPromise = new Promise((_, reject) => {
5277
5344
  const timeoutId = setTimeout(() => {
5278
5345
  controller.abort();
5279
- const error = new Error(message);
5280
- error.name = "TimeoutError";
5281
- reject(error);
5346
+ const error2 = new Error(message);
5347
+ error2.name = "TimeoutError";
5348
+ reject(error2);
5282
5349
  }, ttl);
5283
5350
  controller.signal.addEventListener("abort", () => {
5284
5351
  clearTimeout(timeoutId);
@@ -5294,17 +5361,17 @@ var timeoutResourceMiddleware = defineResourceMiddleware({
5294
5361
  const ttl = Math.max(0, config.ttl);
5295
5362
  const message = `Operation timed out after ${ttl}ms`;
5296
5363
  if (ttl === 0) {
5297
- const error = new Error(message);
5298
- error.name = "TimeoutError";
5299
- throw error;
5364
+ const error2 = new Error(message);
5365
+ error2.name = "TimeoutError";
5366
+ throw error2;
5300
5367
  }
5301
5368
  const controller = new AbortController();
5302
5369
  const timeoutPromise = new Promise((_, reject) => {
5303
5370
  const timeoutId = setTimeout(() => {
5304
5371
  controller.abort();
5305
- const error = new Error(message);
5306
- error.name = "TimeoutError";
5307
- reject(error);
5372
+ const error2 = new Error(message);
5373
+ error2.name = "TimeoutError";
5374
+ reject(error2);
5308
5375
  }, ttl);
5309
5376
  controller.signal.addEventListener("abort", () => {
5310
5377
  clearTimeout(timeoutId);
@@ -5330,6 +5397,77 @@ var globalMiddlewares = {
5330
5397
  }
5331
5398
  };
5332
5399
 
5400
+ // src/globals/resources/debug/types.ts
5401
+ var allFalse = Object.freeze({
5402
+ logResourceBeforeRun: false,
5403
+ logResourceAfterRun: false,
5404
+ logMiddlewareBeforeRun: false,
5405
+ logMiddlewareAfterRun: false,
5406
+ logTaskBeforeRun: false,
5407
+ logTaskAfterRun: false,
5408
+ logTaskInput: false,
5409
+ logTaskOutput: false,
5410
+ logResourceConfig: false,
5411
+ logResourceValue: false,
5412
+ logHookTriggered: false,
5413
+ logHookCompleted: false,
5414
+ logEventEmissionOnRun: false,
5415
+ logEventEmissionInput: false
5416
+ });
5417
+ var levelNormal = Object.freeze({
5418
+ ...allFalse,
5419
+ logTaskAfterRun: true,
5420
+ logTaskBeforeRun: true,
5421
+ logResourceBeforeRun: true,
5422
+ logResourceAfterRun: true,
5423
+ logMiddlewareBeforeRun: true,
5424
+ logMiddlewareAfterRun: true,
5425
+ logHookTriggered: true,
5426
+ logHookCompleted: true,
5427
+ logEventEmissionOnRun: true
5428
+ });
5429
+ Object.freeze(levelNormal);
5430
+ var levelVerbose = Object.freeze({
5431
+ ...levelNormal,
5432
+ logTaskInput: true,
5433
+ logTaskOutput: true,
5434
+ logResourceConfig: true,
5435
+ logResourceValue: true,
5436
+ logHookTriggered: true,
5437
+ logHookCompleted: true
5438
+ });
5439
+ Object.freeze(levelVerbose);
5440
+ function formatConfig(config) {
5441
+ if (config === "normal") {
5442
+ return { ...levelNormal };
5443
+ }
5444
+ if (config === "verbose") {
5445
+ return { ...levelVerbose };
5446
+ }
5447
+ return { ...allFalse, ...config };
5448
+ }
5449
+ __name(formatConfig, "formatConfig");
5450
+ var getConfig = /* @__PURE__ */ __name((config, taggable) => {
5451
+ if (!taggable) {
5452
+ return formatConfig(config);
5453
+ }
5454
+ const debugTagConfig = debugTag.extract(taggable);
5455
+ if (debugTagConfig) {
5456
+ const debugTagConfigFormatted = formatConfig(debugTagConfig);
5457
+ return { ...formatConfig(config), ...debugTagConfigFormatted };
5458
+ }
5459
+ return formatConfig(config);
5460
+ }, "getConfig");
5461
+
5462
+ // src/globals/debug.ts
5463
+ var debugLevels = {
5464
+ normal: levelNormal,
5465
+ verbose: levelVerbose
5466
+ };
5467
+ var debug = {
5468
+ levels: debugLevels
5469
+ };
5470
+
5333
5471
  // src/models/TaskRunner.ts
5334
5472
  var TaskRunner = class {
5335
5473
  constructor(store2, eventManager, logger) {
@@ -5356,16 +5494,16 @@ var TaskRunner = class {
5356
5494
  }
5357
5495
  try {
5358
5496
  return await runner(input);
5359
- } catch (error) {
5497
+ } catch (error2) {
5360
5498
  try {
5361
5499
  await this.store.onUnhandledError({
5362
- error,
5500
+ error: error2,
5363
5501
  kind: "task",
5364
5502
  source: task2.id
5365
5503
  });
5366
5504
  } catch (_) {
5367
5505
  }
5368
- throw error;
5506
+ throw error2;
5369
5507
  }
5370
5508
  }
5371
5509
  /**
@@ -5416,7 +5554,7 @@ var MiddlewareManager = class {
5416
5554
  */
5417
5555
  checkLock() {
5418
5556
  if (this.#isLocked) {
5419
- throw new LockedError("MiddlewareManager");
5557
+ lockedError.throw({ what: "MiddlewareManager" });
5420
5558
  }
5421
5559
  }
5422
5560
  /**
@@ -5534,12 +5672,12 @@ var MiddlewareManager = class {
5534
5672
  if (runnerTask.inputSchema) {
5535
5673
  try {
5536
5674
  rawInput = runnerTask.inputSchema.parse(rawInput);
5537
- } catch (error) {
5538
- throw new ValidationError(
5539
- "Task input",
5540
- runnerTask.id,
5541
- error instanceof Error ? error : new Error(String(error))
5542
- );
5675
+ } catch (error2) {
5676
+ validationError.throw({
5677
+ subject: "Task input",
5678
+ id: runnerTask.id,
5679
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
5680
+ });
5543
5681
  }
5544
5682
  }
5545
5683
  const deps = storeTask.computedDependencies;
@@ -5547,8 +5685,12 @@ var MiddlewareManager = class {
5547
5685
  if (runnerTask.resultSchema) {
5548
5686
  try {
5549
5687
  return runnerTask.resultSchema.parse(rawResult);
5550
- } catch (error) {
5551
- throw new ValidationError("Task result", runnerTask.id, error);
5688
+ } catch (error2) {
5689
+ validationError.throw({
5690
+ subject: "Task result",
5691
+ id: runnerTask.id,
5692
+ originalError: error2
5693
+ });
5552
5694
  }
5553
5695
  }
5554
5696
  return rawResult;
@@ -5643,12 +5785,12 @@ var MiddlewareManager = class {
5643
5785
  if (resource2.resultSchema) {
5644
5786
  try {
5645
5787
  return resource2.resultSchema.parse(rawValue);
5646
- } catch (error) {
5647
- throw new ValidationError(
5648
- "Resource result",
5649
- resource2.id,
5650
- error
5651
- );
5788
+ } catch (error2) {
5789
+ validationError.throw({
5790
+ subject: "Resource result",
5791
+ id: resource2.id,
5792
+ originalError: error2
5793
+ });
5652
5794
  }
5653
5795
  }
5654
5796
  return rawValue;
@@ -5674,16 +5816,16 @@ var MiddlewareManager = class {
5674
5816
  middleware.config
5675
5817
  );
5676
5818
  return result;
5677
- } catch (error) {
5819
+ } catch (error2) {
5678
5820
  try {
5679
5821
  await this.store.onUnhandledError({
5680
- error,
5822
+ error: error2,
5681
5823
  kind: "resourceInit",
5682
5824
  source: resource2.id
5683
5825
  });
5684
5826
  } catch (_) {
5685
5827
  }
5686
- throw error;
5828
+ throw error2;
5687
5829
  }
5688
5830
  }, "baseMiddlewareRunner");
5689
5831
  const middlewareInterceptors = this.perResourceMiddlewareInterceptors.get(middleware.id) || [];
@@ -5895,7 +6037,7 @@ var LogPrinter = class _LogPrinter {
5895
6037
  _LogPrinter.writers.log(safeStringify(this.normalizeForJson(log), 2));
5896
6038
  return;
5897
6039
  }
5898
- const { level, source, message, timestamp, error, data, context } = log;
6040
+ const { level, source, message, timestamp, error: error2, data, context } = log;
5899
6041
  const timePart = this.formatTime(timestamp);
5900
6042
  const levelPart = this.formatLevel(level);
5901
6043
  const sourcePart = this.formatSource(source);
@@ -5909,7 +6051,7 @@ var LogPrinter = class _LogPrinter {
5909
6051
  if (message) {
5910
6052
  output.push(...messageLines.map((line) => `${indentation}${line}`));
5911
6053
  }
5912
- const errorLines = this.formatError(error);
6054
+ const errorLines = this.formatError(error2);
5913
6055
  const dataLines = this.formatData(data);
5914
6056
  const contextLines = this.formatContext(context);
5915
6057
  const detailsExist = errorLines.length > 0 || dataLines.length > 0 || contextLines.length > 0;
@@ -5952,14 +6094,14 @@ var LogPrinter = class _LogPrinter {
5952
6094
  }
5953
6095
  return String(message);
5954
6096
  }
5955
- formatError(error, indentation = " ") {
5956
- if (!error) return [];
6097
+ formatError(error2, indentation = " ") {
6098
+ if (!error2) return [];
5957
6099
  const lines = [];
5958
6100
  lines.push(
5959
- `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error.name}: ${error.message}${this.colors.reset}`
6101
+ `${indentation}${this.colors.gray}\u2570\u2500${this.colors.reset} ${this.colors.error}Error: ${error2.name}: ${error2.message}${this.colors.reset}`
5960
6102
  );
5961
- if (error.stack) {
5962
- const frames = error.stack.split("\n").slice(1);
6103
+ if (error2.stack) {
6104
+ const frames = error2.stack.split("\n").slice(1);
5963
6105
  frames.forEach((frame) => {
5964
6106
  const cleaned = frame.trim().replace(/^at /, "");
5965
6107
  lines.push(
@@ -6110,13 +6252,13 @@ var Logger = class _Logger {
6110
6252
  * Core logging method with structured LogInfo
6111
6253
  */
6112
6254
  async log(level, message, logInfo = {}) {
6113
- const { source, error, data, ...context } = logInfo;
6255
+ const { source, error: error2, data, ...context } = logInfo;
6114
6256
  const log = {
6115
6257
  level,
6116
6258
  message,
6117
6259
  source: source || this.source,
6118
6260
  timestamp: /* @__PURE__ */ new Date(),
6119
- error: error ? this.extractErrorInfo(error) : void 0,
6261
+ error: error2 ? this.extractErrorInfo(error2) : void 0,
6120
6262
  data: data || void 0,
6121
6263
  context: { ...this.boundContext, ...context }
6122
6264
  };
@@ -6130,17 +6272,17 @@ var Logger = class _Logger {
6130
6272
  root.printer.print(log);
6131
6273
  }
6132
6274
  }
6133
- extractErrorInfo(error) {
6134
- if (error instanceof Error) {
6275
+ extractErrorInfo(error2) {
6276
+ if (error2 instanceof Error) {
6135
6277
  return {
6136
- name: error.name,
6137
- message: error.message,
6138
- stack: error.stack
6278
+ name: error2.name,
6279
+ message: error2.message,
6280
+ stack: error2.stack
6139
6281
  };
6140
6282
  }
6141
6283
  return {
6142
6284
  name: "UnknownError",
6143
- message: String(error)
6285
+ message: String(error2)
6144
6286
  };
6145
6287
  }
6146
6288
  async info(message, logInfo) {
@@ -6214,14 +6356,14 @@ var Logger = class _Logger {
6214
6356
  for (const listener of this.localListeners) {
6215
6357
  try {
6216
6358
  await listener(log);
6217
- } catch (error) {
6359
+ } catch (error2) {
6218
6360
  this.print({
6219
6361
  level: "error",
6220
6362
  message: "Error in log listener",
6221
6363
  timestamp: /* @__PURE__ */ new Date(),
6222
6364
  error: {
6223
6365
  name: "ListenerError",
6224
- message: error instanceof Error ? error.message : String(error)
6366
+ message: error2 instanceof Error ? error2.message : String(error2)
6225
6367
  }
6226
6368
  });
6227
6369
  continue;
@@ -6397,7 +6539,7 @@ var DependencyProcessor = class {
6397
6539
  } else if (Array.isArray(eventDefinition)) {
6398
6540
  for (const ed of eventDefinition) {
6399
6541
  if (this.store.events.get(ed.id) === void 0) {
6400
- throw new EventNotFoundError(ed.id);
6542
+ eventNotFoundError.throw({ id: ed.id });
6401
6543
  }
6402
6544
  }
6403
6545
  this.eventManager.addListener(eventDefinition, handler, {
@@ -6405,7 +6547,7 @@ var DependencyProcessor = class {
6405
6547
  });
6406
6548
  } else {
6407
6549
  if (this.store.events.get(eventDefinition.id) === void 0) {
6408
- throw new EventNotFoundError(eventDefinition.id);
6550
+ eventNotFoundError.throw({ id: eventDefinition.id });
6409
6551
  }
6410
6552
  this.eventManager.addListener(eventDefinition, handler, {
6411
6553
  order
@@ -6446,8 +6588,14 @@ var DependencyProcessor = class {
6446
6588
  } else if (isEvent(inner)) {
6447
6589
  const exists = this.store.events.get(inner.id) !== void 0;
6448
6590
  return exists ? this.extractEventDependency(inner, source) : void 0;
6591
+ } else if (isError(inner)) {
6592
+ const exists = this.store.errors.get(inner.id) !== void 0;
6593
+ return exists ? inner : void 0;
6594
+ } else if (isAsyncContext(inner)) {
6595
+ const exists = this.store.asyncContexts.get(inner.id) !== void 0;
6596
+ return exists ? inner : void 0;
6449
6597
  }
6450
- throw new UnknownItemTypeError(inner);
6598
+ unknownItemTypeError.throw({ item: inner });
6451
6599
  }
6452
6600
  if (isResource(object)) {
6453
6601
  return this.extractResourceDependency(object);
@@ -6455,8 +6603,18 @@ var DependencyProcessor = class {
6455
6603
  return this.extractTaskDependency(object);
6456
6604
  } else if (isEvent(object)) {
6457
6605
  return this.extractEventDependency(object, source);
6606
+ } else if (isError(object)) {
6607
+ if (this.store.errors.get(object.id) === void 0) {
6608
+ dependencyNotFoundError.throw({ key: `Error ${object.id}` });
6609
+ }
6610
+ return object;
6611
+ } else if (isAsyncContext(object)) {
6612
+ if (this.store.asyncContexts.get(object.id) === void 0) {
6613
+ dependencyNotFoundError.throw({ key: `AsyncContext ${object.id}` });
6614
+ }
6615
+ return object;
6458
6616
  } else {
6459
- throw new UnknownItemTypeError(object);
6617
+ unknownItemTypeError.throw({ item: object });
6460
6618
  }
6461
6619
  }
6462
6620
  /**
@@ -6472,27 +6630,29 @@ var DependencyProcessor = class {
6472
6630
  async extractTaskDependency(object) {
6473
6631
  const storeTask = this.store.tasks.get(object.id);
6474
6632
  if (storeTask === void 0) {
6475
- throw new DependencyNotFoundError(`Task ${object.id}`);
6633
+ dependencyNotFoundError.throw({ key: `Task ${object.id}` });
6476
6634
  }
6477
- if (!storeTask.isInitialized) {
6635
+ const st = storeTask;
6636
+ if (!st.isInitialized) {
6478
6637
  const dependencies = object.dependencies;
6479
- storeTask.computedDependencies = await this.extractDependencies(
6638
+ st.computedDependencies = await this.extractDependencies(
6480
6639
  dependencies,
6481
- storeTask.task.id
6640
+ st.task.id
6482
6641
  );
6483
- storeTask.isInitialized = true;
6642
+ st.isInitialized = true;
6484
6643
  }
6485
6644
  return (input) => {
6486
- return this.taskRunner.run(storeTask.task, input);
6645
+ return this.taskRunner.run(st.task, input);
6487
6646
  };
6488
6647
  }
6489
6648
  async extractResourceDependency(object) {
6490
6649
  const storeResource = this.store.resources.get(object.id);
6491
6650
  if (storeResource === void 0) {
6492
- throw new DependencyNotFoundError(`Resource ${object.id}`);
6651
+ dependencyNotFoundError.throw({ key: `Resource ${object.id}` });
6493
6652
  }
6494
- const { resource: resource2, config } = storeResource;
6495
- if (!storeResource.isInitialized) {
6653
+ const sr = storeResource;
6654
+ const { resource: resource2, config } = sr;
6655
+ if (!sr.isInitialized) {
6496
6656
  if (resource2.init) {
6497
6657
  const depMap = resource2.dependencies || {};
6498
6658
  const raw = await this.extractDependencies(depMap, resource2.id);
@@ -6502,12 +6662,12 @@ var DependencyProcessor = class {
6502
6662
  config,
6503
6663
  wrapped
6504
6664
  );
6505
- storeResource.context = context;
6506
- storeResource.value = value;
6665
+ sr.context = context;
6666
+ sr.value = value;
6507
6667
  }
6508
- storeResource.isInitialized = true;
6668
+ sr.isInitialized = true;
6509
6669
  }
6510
- return storeResource.value;
6670
+ return sr.value;
6511
6671
  }
6512
6672
  };
6513
6673
 
@@ -6565,12 +6725,12 @@ var EventManager = class {
6565
6725
  if (eventDefinition.payloadSchema) {
6566
6726
  try {
6567
6727
  data = eventDefinition.payloadSchema.parse(data);
6568
- } catch (error) {
6569
- throw new ValidationError(
6570
- "Event payload",
6571
- eventDefinition.id,
6572
- error instanceof Error ? error : new Error(String(error))
6573
- );
6728
+ } catch (error2) {
6729
+ validationError.throw({
6730
+ subject: "Event payload",
6731
+ id: eventDefinition.id,
6732
+ originalError: error2 instanceof Error ? error2 : new Error(String(error2))
6733
+ });
6574
6734
  }
6575
6735
  }
6576
6736
  const frame = { id: eventDefinition.id, source };
@@ -6626,10 +6786,9 @@ var EventManager = class {
6626
6786
  const currentHookId = this.currentHookIdContext.getStore();
6627
6787
  const safeReEmitBySameHook = top.id === frame.id && currentHookId && currentHookId === source;
6628
6788
  if (!safeReEmitBySameHook) {
6629
- throw new EventCycleError([
6630
- ...currentStack.slice(cycleStart),
6631
- frame
6632
- ]);
6789
+ eventCycleError.throw({
6790
+ path: [...currentStack.slice(cycleStart), frame]
6791
+ });
6633
6792
  }
6634
6793
  }
6635
6794
  }
@@ -6769,7 +6928,7 @@ var EventManager = class {
6769
6928
  */
6770
6929
  checkLock() {
6771
6930
  if (this.#isLocked) {
6772
- throw new LockedError("EventManager");
6931
+ lockedError.throw({ what: "EventManager" });
6773
6932
  }
6774
6933
  }
6775
6934
  /**
@@ -6925,25 +7084,31 @@ var StoreValidator = class {
6925
7084
  }
6926
7085
  checkIfIDExists(id2) {
6927
7086
  if (this.registry.tasks.has(id2)) {
6928
- throw new DuplicateRegistrationError("Task", id2);
7087
+ duplicateRegistrationError.throw({ type: "Task", id: id2 });
6929
7088
  }
6930
7089
  if (this.registry.resources.has(id2)) {
6931
- throw new DuplicateRegistrationError("Resource", id2);
7090
+ duplicateRegistrationError.throw({ type: "Resource", id: id2 });
6932
7091
  }
6933
7092
  if (this.registry.events.has(id2)) {
6934
- throw new DuplicateRegistrationError("Event", id2);
7093
+ duplicateRegistrationError.throw({ type: "Event", id: id2 });
7094
+ }
7095
+ if (this.registry.errors.has(id2)) {
7096
+ duplicateRegistrationError.throw({ type: "Error", id: id2 });
7097
+ }
7098
+ if (this.registry.asyncContexts.has(id2)) {
7099
+ duplicateRegistrationError.throw({ type: "AsyncContext", id: id2 });
6935
7100
  }
6936
7101
  if (this.registry.taskMiddlewares.has(id2)) {
6937
- throw new DuplicateRegistrationError("Middleware", id2);
7102
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
6938
7103
  }
6939
7104
  if (this.registry.resourceMiddlewares.has(id2)) {
6940
- throw new DuplicateRegistrationError("Middleware", id2);
7105
+ duplicateRegistrationError.throw({ type: "Middleware", id: id2 });
6941
7106
  }
6942
7107
  if (this.registry.tags.has(id2)) {
6943
- throw new DuplicateRegistrationError("Tag", id2);
7108
+ duplicateRegistrationError.throw({ type: "Tag", id: id2 });
6944
7109
  }
6945
7110
  if (this.registry.hooks.has(id2)) {
6946
- throw new DuplicateRegistrationError("Hook", id2);
7111
+ duplicateRegistrationError.throw({ type: "Hook", id: id2 });
6947
7112
  }
6948
7113
  }
6949
7114
  runSanityChecks() {
@@ -6951,11 +7116,11 @@ var StoreValidator = class {
6951
7116
  const middlewares = task2.task.middleware;
6952
7117
  middlewares.forEach((middlewareAttachment) => {
6953
7118
  if (!this.registry.taskMiddlewares.has(middlewareAttachment.id)) {
6954
- throw new MiddlewareNotRegisteredError(
6955
- "task",
6956
- task2.task.id,
6957
- middlewareAttachment.id
6958
- );
7119
+ middlewareNotRegisteredError.throw({
7120
+ type: "task",
7121
+ source: task2.task.id,
7122
+ middlewareId: middlewareAttachment.id
7123
+ });
6959
7124
  }
6960
7125
  });
6961
7126
  }
@@ -6963,11 +7128,11 @@ var StoreValidator = class {
6963
7128
  const middlewares = resource2.resource.middleware;
6964
7129
  middlewares.forEach((middlewareAttachment) => {
6965
7130
  if (!this.registry.resourceMiddlewares.has(middlewareAttachment.id)) {
6966
- throw new MiddlewareNotRegisteredError(
6967
- "resource",
6968
- resource2.resource.id,
6969
- middlewareAttachment.id
6970
- );
7131
+ middlewareNotRegisteredError.throw({
7132
+ type: "resource",
7133
+ source: resource2.resource.id,
7134
+ middlewareId: middlewareAttachment.id
7135
+ });
6971
7136
  }
6972
7137
  });
6973
7138
  }
@@ -6991,7 +7156,7 @@ var StoreValidator = class {
6991
7156
  if (tags) {
6992
7157
  for (const tag2 of tags) {
6993
7158
  if (!this.registry.tags.has(tag2.id)) {
6994
- throw new TagNotFoundError(tag2.id);
7159
+ tagNotFoundError.throw({ id: tag2.id });
6995
7160
  }
6996
7161
  }
6997
7162
  }
@@ -7010,6 +7175,8 @@ var StoreRegistry = class {
7010
7175
  this.resourceMiddlewares = /* @__PURE__ */ new Map();
7011
7176
  this.hooks = /* @__PURE__ */ new Map();
7012
7177
  this.tags = /* @__PURE__ */ new Map();
7178
+ this.asyncContexts = /* @__PURE__ */ new Map();
7179
+ this.errors = /* @__PURE__ */ new Map();
7013
7180
  this.validator = new StoreValidator(this);
7014
7181
  }
7015
7182
  static {
@@ -7021,12 +7188,16 @@ var StoreRegistry = class {
7021
7188
  storeGenericItem(item) {
7022
7189
  if (isTask(item)) {
7023
7190
  this.storeTask(item);
7191
+ } else if (isError(item)) {
7192
+ this.storeError(item);
7024
7193
  } else if (isHook && isHook(item)) {
7025
7194
  this.storeHook(item);
7026
7195
  } else if (isResource(item)) {
7027
7196
  this.storeResource(item);
7028
7197
  } else if (isEvent(item)) {
7029
7198
  this.storeEvent(item);
7199
+ } else if (isAsyncContext(item)) {
7200
+ this.storeAsyncContext(item);
7030
7201
  } else if (isTaskMiddleware(item)) {
7031
7202
  this.storeTaskMiddleware(item);
7032
7203
  } else if (isResourceMiddleware(item)) {
@@ -7036,9 +7207,17 @@ var StoreRegistry = class {
7036
7207
  } else if (isTag(item)) {
7037
7208
  this.storeTag(item);
7038
7209
  } else {
7039
- throw new UnknownItemTypeError(item);
7210
+ unknownItemTypeError.throw({ item });
7040
7211
  }
7041
7212
  }
7213
+ storeError(item) {
7214
+ this.validator.checkIfIDExists(item.id);
7215
+ this.errors.set(item.id, item);
7216
+ }
7217
+ storeAsyncContext(item) {
7218
+ this.validator.checkIfIDExists(item.id);
7219
+ this.asyncContexts.set(item.id, item);
7220
+ }
7042
7221
  storeTag(item) {
7043
7222
  this.validator.checkIfIDExists(item.id);
7044
7223
  this.tags.set(item.id, item);
@@ -7402,7 +7581,7 @@ var OverrideManager = class {
7402
7581
  }
7403
7582
  if (!hasAnyItem) {
7404
7583
  const id2 = isResourceWithConfig(override) ? override.resource.id : override.id;
7405
- throw new DependencyNotFoundError(id2);
7584
+ dependencyNotFoundError.throw({ key: id2 });
7406
7585
  }
7407
7586
  }
7408
7587
  for (const override of this.overrides.values()) {
@@ -7455,6 +7634,15 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
7455
7634
  return value;
7456
7635
  }
7457
7636
  for (const t of tasks) {
7637
+ const currentOwner = t[symbolTunneledBy];
7638
+ const resourceId = resource2.definition.id;
7639
+ if (currentOwner && currentOwner !== resourceId) {
7640
+ tunnelOwnershipConflictError.throw({
7641
+ taskId: t.id,
7642
+ currentOwnerId: currentOwner,
7643
+ attemptedOwnerId: resourceId
7644
+ });
7645
+ }
7458
7646
  if (!originalRuns.has(t)) {
7459
7647
  originalRuns.set(t, t.run);
7460
7648
  }
@@ -7462,6 +7650,7 @@ var tunnelResourceMiddleware = defineResourceMiddleware({
7462
7650
  return value.run(t, input);
7463
7651
  });
7464
7652
  t[symbolTunneledTask] = "client";
7653
+ t[symbolTunneledBy] = resourceId;
7465
7654
  }
7466
7655
  if (events.length > 0) {
7467
7656
  const selectedEventIds = new Set(events.map((e) => e.id));
@@ -7549,8 +7738,28 @@ function resolveEvents(store2, selector) {
7549
7738
  return out;
7550
7739
  }
7551
7740
  __name(resolveEvents, "resolveEvents");
7741
+
7742
+ // src/utils/detectRunnerMode.ts
7743
+ function detectRunnerMode(explicitMode) {
7744
+ if (explicitMode !== void 0) {
7745
+ return explicitMode;
7746
+ }
7747
+ const env = getPlatform().getEnv("NODE_ENV");
7748
+ switch (env) {
7749
+ case "test":
7750
+ return "test" /* TEST */;
7751
+ case "production":
7752
+ return "prod" /* PROD */;
7753
+ case "development":
7754
+ default:
7755
+ return "dev" /* DEV */;
7756
+ }
7757
+ }
7758
+ __name(detectRunnerMode, "detectRunnerMode");
7759
+
7760
+ // src/models/Store.ts
7552
7761
  var Store = class {
7553
- constructor(eventManager, logger, onUnhandledError) {
7762
+ constructor(eventManager, logger, onUnhandledError, mode) {
7554
7763
  this.eventManager = eventManager;
7555
7764
  this.logger = logger;
7556
7765
  this.onUnhandledError = onUnhandledError;
@@ -7558,6 +7767,7 @@ var Store = class {
7558
7767
  this.validator = this.registry.getValidator();
7559
7768
  this.overrideManager = new OverrideManager(this.registry);
7560
7769
  this.middlewareManager = new MiddlewareManager(this, eventManager, logger);
7770
+ this.mode = detectRunnerMode(mode);
7561
7771
  }
7562
7772
  static {
7563
7773
  __name(this, "Store");
@@ -7577,6 +7787,12 @@ var Store = class {
7577
7787
  get events() {
7578
7788
  return this.registry.events;
7579
7789
  }
7790
+ get errors() {
7791
+ return this.registry.errors;
7792
+ }
7793
+ get asyncContexts() {
7794
+ return this.registry.asyncContexts;
7795
+ }
7580
7796
  get taskMiddlewares() {
7581
7797
  return this.registry.taskMiddlewares;
7582
7798
  }
@@ -7679,19 +7895,19 @@ var Store = class {
7679
7895
  const dependentNodes = this.registry.getDependentNodes();
7680
7896
  const circularDependencies = findCircularDependencies(dependentNodes);
7681
7897
  if (circularDependencies.cycles.length > 0) {
7682
- throw new CircularDependenciesError(circularDependencies.cycles);
7898
+ circularDependenciesError.throw({ cycles: circularDependencies.cycles });
7683
7899
  }
7684
7900
  }
7685
7901
  validateEventEmissionGraph() {
7686
7902
  const eventNodes = this.registry.buildEventEmissionGraph();
7687
7903
  const circular = findCircularDependencies(eventNodes);
7688
7904
  if (circular.cycles.length > 0) {
7689
- throw new EventEmissionCycleError(circular.cycles);
7905
+ eventEmissionCycleError.throw({ cycles: circular.cycles });
7690
7906
  }
7691
7907
  }
7692
7908
  initializeStore(root, config) {
7693
7909
  if (this.#isInitialized) {
7694
- throw new StoreAlreadyInitializedError();
7910
+ storeAlreadyInitializedError.throw({});
7695
7911
  }
7696
7912
  this.registerGlobalComponents();
7697
7913
  this.setupRootResource(root, config);
@@ -7745,68 +7961,6 @@ var Store = class {
7745
7961
  }
7746
7962
  };
7747
7963
 
7748
- // src/globals/resources/debug/types.ts
7749
- var allFalse = Object.freeze({
7750
- logResourceBeforeRun: false,
7751
- logResourceAfterRun: false,
7752
- logMiddlewareBeforeRun: false,
7753
- logMiddlewareAfterRun: false,
7754
- logTaskBeforeRun: false,
7755
- logTaskAfterRun: false,
7756
- logTaskInput: false,
7757
- logTaskOutput: false,
7758
- logResourceConfig: false,
7759
- logResourceValue: false,
7760
- logHookTriggered: false,
7761
- logHookCompleted: false,
7762
- logEventEmissionOnRun: false,
7763
- logEventEmissionInput: false
7764
- });
7765
- var levelNormal = Object.freeze({
7766
- ...allFalse,
7767
- logTaskAfterRun: true,
7768
- logTaskBeforeRun: true,
7769
- logResourceBeforeRun: true,
7770
- logResourceAfterRun: true,
7771
- logMiddlewareBeforeRun: true,
7772
- logMiddlewareAfterRun: true,
7773
- logHookTriggered: true,
7774
- logHookCompleted: true,
7775
- logEventEmissionOnRun: true
7776
- });
7777
- Object.freeze(levelNormal);
7778
- var levelVerbose = Object.freeze({
7779
- ...levelNormal,
7780
- logTaskInput: true,
7781
- logTaskOutput: true,
7782
- logResourceConfig: true,
7783
- logResourceValue: true,
7784
- logHookTriggered: true,
7785
- logHookCompleted: true
7786
- });
7787
- Object.freeze(levelVerbose);
7788
- function formatConfig(config) {
7789
- if (config === "normal") {
7790
- return { ...levelNormal };
7791
- }
7792
- if (config === "verbose") {
7793
- return { ...levelVerbose };
7794
- }
7795
- return { ...allFalse, ...config };
7796
- }
7797
- __name(formatConfig, "formatConfig");
7798
- var getConfig = /* @__PURE__ */ __name((config, taggable) => {
7799
- if (!taggable) {
7800
- return formatConfig(config);
7801
- }
7802
- const debugTagConfig = debugTag.extract(taggable);
7803
- if (debugTagConfig) {
7804
- const debugTagConfigFormatted = formatConfig(debugTagConfig);
7805
- return { ...formatConfig(config), ...debugTagConfigFormatted };
7806
- }
7807
- return formatConfig(config);
7808
- }, "getConfig");
7809
-
7810
7964
  // src/globals/resources/debug/debugConfig.resource.ts
7811
7965
  var debugConfig = defineResource({
7812
7966
  id: "globals.debug.resources.config",
@@ -8134,8 +8288,8 @@ __name(registerShutdownHook, "registerShutdownHook");
8134
8288
 
8135
8289
  // src/models/UnhandledError.ts
8136
8290
  function createDefaultUnhandledError(logger) {
8137
- return async ({ error, kind, source }) => {
8138
- const normalizedError = error instanceof Error ? error : new Error(String(error));
8291
+ return async ({ error: error2, kind, source }) => {
8292
+ const normalizedError = error2 instanceof Error ? error2 : new Error(String(error2));
8139
8293
  await logger.error(`${normalizedError.toString()}`, {
8140
8294
  source,
8141
8295
  error: normalizedError,
@@ -8147,9 +8301,9 @@ function createDefaultUnhandledError(logger) {
8147
8301
  }
8148
8302
  __name(createDefaultUnhandledError, "createDefaultUnhandledError");
8149
8303
  function bindProcessErrorHandler(handler) {
8150
- return async (error, source) => {
8304
+ return async (error2, source) => {
8151
8305
  try {
8152
- await handler({ error, kind: "process", source });
8306
+ await handler({ error: error2, kind: "process", source });
8153
8307
  } catch {
8154
8308
  }
8155
8309
  };
@@ -8182,7 +8336,7 @@ var RunResult = class {
8182
8336
  if (typeof task2 === "string") {
8183
8337
  const taskId = task2;
8184
8338
  if (!this.store.tasks.has(taskId)) {
8185
- throw new RuntimeError(`Task "${taskId}" not found.`);
8339
+ throw new Error(`Task "${taskId}" not found.`);
8186
8340
  }
8187
8341
  task2 = this.store.tasks.get(taskId).task;
8188
8342
  }
@@ -8197,7 +8351,7 @@ var RunResult = class {
8197
8351
  if (typeof event2 === "string") {
8198
8352
  const eventId = event2;
8199
8353
  if (!this.store.events.has(eventId)) {
8200
- throw new RuntimeError(`Event "${eventId}" not found.`);
8354
+ throw new Error(`Event "${eventId}" not found.`);
8201
8355
  }
8202
8356
  event2 = this.store.events.get(eventId).event;
8203
8357
  }
@@ -8211,7 +8365,7 @@ var RunResult = class {
8211
8365
  this.getResourceValue = /* @__PURE__ */ __name((resource2) => {
8212
8366
  const resourceId = typeof resource2 === "string" ? resource2 : resource2.id;
8213
8367
  if (!this.store.resources.has(resourceId)) {
8214
- throw new ResourceNotFoundError(resourceId);
8368
+ throw new Error(`Resource "${resourceId}" not found.`);
8215
8369
  }
8216
8370
  return this.store.resources.get(resourceId).value;
8217
8371
  }, "getResourceValue");
@@ -8228,7 +8382,7 @@ var RunResult = class {
8228
8382
  async function run(resourceOrResourceWithConfig, options) {
8229
8383
  await getPlatform().init();
8230
8384
  const {
8231
- debug = void 0,
8385
+ debug: debug2 = void 0,
8232
8386
  logs = {},
8233
8387
  errorBoundary = true,
8234
8388
  shutdownHooks = true,
@@ -8284,8 +8438,8 @@ async function run(resourceOrResourceWithConfig, options) {
8284
8438
  }
8285
8439
  }, "disposeAll");
8286
8440
  try {
8287
- if (debug) {
8288
- store2.storeGenericItem(debugResource.with(debug));
8441
+ if (debug2) {
8442
+ store2.storeGenericItem(debugResource.with(debug2));
8289
8443
  }
8290
8444
  store2.initializeStore(resource2, config);
8291
8445
  await store2.processOverrides();
@@ -8352,11 +8506,13 @@ var TunnelError = class extends Error {
8352
8506
  static {
8353
8507
  __name(this, "TunnelError");
8354
8508
  }
8355
- constructor(code, message, details) {
8509
+ constructor(code, message, details, extras) {
8356
8510
  super(message);
8357
8511
  this.name = "TunnelError";
8358
8512
  this.code = code;
8359
8513
  this.details = details;
8514
+ this.id = extras?.id;
8515
+ this.data = extras?.data;
8360
8516
  }
8361
8517
  };
8362
8518
  function toTunnelError(input, fallbackMessage) {
@@ -8366,7 +8522,10 @@ function toTunnelError(input, fallbackMessage) {
8366
8522
  if (input && typeof input === "object" && "code" in input && "message" in input && typeof input.message === "string" && typeof input.code === "string") {
8367
8523
  const pe = input;
8368
8524
  const msg = pe.message || fallbackMessage || "Tunnel error";
8369
- return new TunnelError(pe.code, msg, pe.details);
8525
+ return new TunnelError(pe.code, msg, pe.details, {
8526
+ id: pe.id,
8527
+ data: pe.data
8528
+ });
8370
8529
  }
8371
8530
  if (input && typeof input === "object" && "message" in input && typeof input.message === "string") {
8372
8531
  return new TunnelError("UNKNOWN", input.message);
@@ -8397,7 +8556,7 @@ function assertOkEnvelope(envelope, opts) {
8397
8556
  __name(assertOkEnvelope, "assertOkEnvelope");
8398
8557
 
8399
8558
  // src/http-fetch-tunnel.resource.ts
8400
- async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest) {
8559
+ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer, onRequest, contextHeaderText) {
8401
8560
  const controller = timeoutMs && timeoutMs > 0 ? new AbortController() : void 0;
8402
8561
  let timeout;
8403
8562
  try {
@@ -8408,6 +8567,7 @@ async function postSerialized(fetchFn, url, body, headers, timeoutMs, serializer
8408
8567
  "content-type": "application/json; charset=utf-8",
8409
8568
  ...headers
8410
8569
  };
8570
+ if (contextHeaderText) reqHeaders["x-runner-context"] = contextHeaderText;
8411
8571
  if (onRequest) await onRequest({ url, headers: reqHeaders });
8412
8572
  const res = await fetchFn(url, {
8413
8573
  method: "POST",
@@ -8438,6 +8598,20 @@ function createExposureFetch(cfg) {
8438
8598
  "global fetch is not available; provide fetchImpl in config"
8439
8599
  );
8440
8600
  }
8601
+ const buildContextHeader = /* @__PURE__ */ __name(() => {
8602
+ if (!cfg.contexts || cfg.contexts.length === 0) return void 0;
8603
+ const map = {};
8604
+ for (const ctx of cfg.contexts) {
8605
+ try {
8606
+ const v = ctx.use();
8607
+ map[ctx.id] = ctx.serialize(v);
8608
+ } catch {
8609
+ }
8610
+ }
8611
+ const keys = Object.keys(map);
8612
+ if (keys.length === 0) return void 0;
8613
+ return cfg.serializer.stringify(map);
8614
+ }, "buildContextHeader");
8441
8615
  return {
8442
8616
  async task(id2, input) {
8443
8617
  const url = `${baseUrl}/task/${encodeURIComponent(id2)}`;
@@ -8448,9 +8622,19 @@ function createExposureFetch(cfg) {
8448
8622
  buildHeaders(),
8449
8623
  cfg?.timeoutMs,
8450
8624
  cfg.serializer,
8451
- cfg?.onRequest
8625
+ cfg?.onRequest,
8626
+ buildContextHeader()
8452
8627
  );
8453
- return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
8628
+ try {
8629
+ return assertOkEnvelope(r2, { fallbackMessage: "Tunnel task error" });
8630
+ } catch (e) {
8631
+ const te = e;
8632
+ if (te && cfg.errorRegistry && te.id && te.data) {
8633
+ const helper = cfg.errorRegistry.get(String(te.id));
8634
+ if (helper) helper.throw(te.data);
8635
+ }
8636
+ throw e;
8637
+ }
8454
8638
  },
8455
8639
  async event(id2, payload) {
8456
8640
  const url = `${baseUrl}/event/${encodeURIComponent(id2)}`;
@@ -8461,9 +8645,19 @@ function createExposureFetch(cfg) {
8461
8645
  buildHeaders(),
8462
8646
  cfg?.timeoutMs,
8463
8647
  cfg.serializer,
8464
- cfg?.onRequest
8648
+ cfg?.onRequest,
8649
+ buildContextHeader()
8465
8650
  );
8466
- assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
8651
+ try {
8652
+ assertOkEnvelope(r2, { fallbackMessage: "Tunnel event error" });
8653
+ } catch (e) {
8654
+ const te = e;
8655
+ if (te && cfg.errorRegistry && te.id && te.data) {
8656
+ const helper = cfg.errorRegistry.get(String(te.id));
8657
+ if (helper) helper.throw(te.data);
8658
+ }
8659
+ throw e;
8660
+ }
8467
8661
  }
8468
8662
  };
8469
8663
  }
@@ -8515,14 +8709,14 @@ function buildTestFacade(deps) {
8515
8709
  __name(buildTestFacade, "buildTestFacade");
8516
8710
 
8517
8711
  // src/definers/builders/resource.ts
8518
- function clone(s, patch) {
8712
+ function clone2(s, patch) {
8519
8713
  return Object.freeze({
8520
8714
  // We reuse the frozen state while widening generics, hence the temporary cast.
8521
8715
  ...s,
8522
8716
  ...patch
8523
8717
  });
8524
8718
  }
8525
- __name(clone, "clone");
8719
+ __name(clone2, "clone");
8526
8720
  function toRegisterArray(items) {
8527
8721
  return Array.isArray(items) ? [...items] : [items];
8528
8722
  }
@@ -8606,7 +8800,7 @@ function makeResourceBuilder(state) {
8606
8800
  id: state.id,
8607
8801
  dependencies(deps, options) {
8608
8802
  const override = options?.override ?? false;
8609
- const next = clone(state, {
8803
+ const next = clone2(state, {
8610
8804
  dependencies: mergeDependencies(
8611
8805
  state.dependencies,
8612
8806
  deps,
@@ -8620,50 +8814,50 @@ function makeResourceBuilder(state) {
8620
8814
  },
8621
8815
  register(items, options) {
8622
8816
  const override = options?.override ?? false;
8623
- const next = clone(state, {
8817
+ const next = clone2(state, {
8624
8818
  register: mergeRegister(state.register, items, override)
8625
8819
  });
8626
8820
  return makeResourceBuilder(next);
8627
8821
  },
8628
8822
  middleware(mw, options) {
8629
8823
  const override = options?.override ?? false;
8630
- const next = clone(state, {
8824
+ const next = clone2(state, {
8631
8825
  middleware: mergeArray(state.middleware, mw, override)
8632
8826
  });
8633
8827
  return makeResourceBuilder(next);
8634
8828
  },
8635
8829
  tags(tags, options) {
8636
8830
  const override = options?.override ?? false;
8637
- const next = clone(state, { tags: mergeArray(state.tags, tags, override) });
8831
+ const next = clone2(state, { tags: mergeArray(state.tags, tags, override) });
8638
8832
  return makeResourceBuilder(next);
8639
8833
  },
8640
8834
  context(factory) {
8641
- const next = clone(state, { context: factory });
8835
+ const next = clone2(state, { context: factory });
8642
8836
  return makeResourceBuilder(next);
8643
8837
  },
8644
8838
  configSchema(schema) {
8645
- const next = clone(state, { configSchema: schema });
8839
+ const next = clone2(state, { configSchema: schema });
8646
8840
  return makeResourceBuilder(next);
8647
8841
  },
8648
8842
  resultSchema(schema) {
8649
- const next = clone(state, { resultSchema: schema });
8843
+ const next = clone2(state, { resultSchema: schema });
8650
8844
  return makeResourceBuilder(next);
8651
8845
  },
8652
8846
  init(fn) {
8653
- const next = clone(state, { init: fn });
8847
+ const next = clone2(state, { init: fn });
8654
8848
  return makeResourceBuilder(next);
8655
8849
  },
8656
8850
  dispose(fn) {
8657
- const next = clone(state, { dispose: fn });
8851
+ const next = clone2(state, { dispose: fn });
8658
8852
  return makeResourceBuilder(next);
8659
8853
  },
8660
8854
  meta(m) {
8661
- const next = clone(state, { meta: m });
8855
+ const next = clone2(state, { meta: m });
8662
8856
  return makeResourceBuilder(next);
8663
8857
  },
8664
8858
  overrides(o, options) {
8665
8859
  const override = options?.override ?? false;
8666
- const next = clone(state, {
8860
+ const next = clone2(state, {
8667
8861
  overrides: mergeArray(state.overrides, o, override)
8668
8862
  });
8669
8863
  return makeResourceBuilder(next);
@@ -8750,16 +8944,16 @@ function mergeDepsNoConfig(existing, addition, override) {
8750
8944
  __name(mergeDepsNoConfig, "mergeDepsNoConfig");
8751
8945
 
8752
8946
  // src/definers/builders/task.phantom.ts
8753
- function clone2(s, patch) {
8947
+ function clone3(s, patch) {
8754
8948
  return cloneState(s, patch);
8755
8949
  }
8756
- __name(clone2, "clone");
8950
+ __name(clone3, "clone");
8757
8951
  function makePhantomTaskBuilder(state) {
8758
8952
  const builder = {
8759
8953
  id: state.id,
8760
8954
  dependencies(deps, options) {
8761
8955
  const override = options?.override ?? false;
8762
- const next = clone2(state, {
8956
+ const next = clone3(state, {
8763
8957
  dependencies: mergeDepsNoConfig(
8764
8958
  state.dependencies,
8765
8959
  deps,
@@ -8773,26 +8967,26 @@ function makePhantomTaskBuilder(state) {
8773
8967
  },
8774
8968
  middleware(mw, options) {
8775
8969
  const override = options?.override ?? false;
8776
- const next = clone2(state, {
8970
+ const next = clone3(state, {
8777
8971
  middleware: mergeArray2(state.middleware, mw, override)
8778
8972
  });
8779
8973
  return makePhantomTaskBuilder(next);
8780
8974
  },
8781
8975
  tags(t, options) {
8782
8976
  const override = options?.override ?? false;
8783
- const next = clone2(state, { tags: mergeArray2(state.tags, t, override) });
8977
+ const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
8784
8978
  return makePhantomTaskBuilder(next);
8785
8979
  },
8786
8980
  inputSchema(schema) {
8787
- const next = clone2(state, { inputSchema: schema });
8981
+ const next = clone3(state, { inputSchema: schema });
8788
8982
  return makePhantomTaskBuilder(next);
8789
8983
  },
8790
8984
  resultSchema(schema) {
8791
- const next = clone2(state, { resultSchema: schema });
8985
+ const next = clone3(state, { resultSchema: schema });
8792
8986
  return makePhantomTaskBuilder(next);
8793
8987
  },
8794
8988
  meta(m) {
8795
- const next = clone2(state, { meta: m });
8989
+ const next = clone3(state, { meta: m });
8796
8990
  return makePhantomTaskBuilder(next);
8797
8991
  },
8798
8992
  build() {
@@ -8826,16 +9020,16 @@ function phantomTaskBuilder(id2) {
8826
9020
  __name(phantomTaskBuilder, "phantomTaskBuilder");
8827
9021
 
8828
9022
  // src/definers/builders/task.ts
8829
- function clone3(s, patch) {
9023
+ function clone4(s, patch) {
8830
9024
  return cloneState(s, patch);
8831
9025
  }
8832
- __name(clone3, "clone");
9026
+ __name(clone4, "clone");
8833
9027
  function makeTaskBuilder(state) {
8834
9028
  const builder = {
8835
9029
  id: state.id,
8836
9030
  dependencies(deps, options) {
8837
9031
  const override = options?.override ?? false;
8838
- const next = clone3(state, {
9032
+ const next = clone4(state, {
8839
9033
  dependencies: mergeDepsNoConfig(
8840
9034
  state.dependencies,
8841
9035
  deps,
@@ -8849,22 +9043,22 @@ function makeTaskBuilder(state) {
8849
9043
  },
8850
9044
  middleware(mw, options) {
8851
9045
  const override = options?.override ?? false;
8852
- const next = clone3(state, {
9046
+ const next = clone4(state, {
8853
9047
  middleware: mergeArray2(state.middleware, mw, override)
8854
9048
  });
8855
9049
  return makeTaskBuilder(next);
8856
9050
  },
8857
9051
  tags(t, options) {
8858
9052
  const override = options?.override ?? false;
8859
- const next = clone3(state, { tags: mergeArray2(state.tags, t, override) });
9053
+ const next = clone4(state, { tags: mergeArray2(state.tags, t, override) });
8860
9054
  return makeTaskBuilder(next);
8861
9055
  },
8862
9056
  inputSchema(schema) {
8863
- const next = clone3(state, { inputSchema: schema });
9057
+ const next = clone4(state, { inputSchema: schema });
8864
9058
  return makeTaskBuilder(next);
8865
9059
  },
8866
9060
  resultSchema(schema) {
8867
- const next = clone3(state, { resultSchema: schema });
9061
+ const next = clone4(state, { resultSchema: schema });
8868
9062
  return makeTaskBuilder(next);
8869
9063
  },
8870
9064
  run(fn) {
@@ -8872,11 +9066,11 @@ function makeTaskBuilder(state) {
8872
9066
  input,
8873
9067
  deps
8874
9068
  ), "wrapped");
8875
- const next = clone3(state, { run: wrapped });
9069
+ const next = clone4(state, { run: wrapped });
8876
9070
  return makeTaskBuilder(next);
8877
9071
  },
8878
9072
  meta(m) {
8879
- const next = clone3(state, { meta: m });
9073
+ const next = clone4(state, { meta: m });
8880
9074
  return makeTaskBuilder(next);
8881
9075
  },
8882
9076
  build() {
@@ -8907,25 +9101,25 @@ var task = Object.assign(taskBuilder, {
8907
9101
  });
8908
9102
 
8909
9103
  // src/definers/builders/event.ts
8910
- function clone4(s, patch) {
9104
+ function clone5(s, patch) {
8911
9105
  return Object.freeze({ ...s, ...patch });
8912
9106
  }
8913
- __name(clone4, "clone");
9107
+ __name(clone5, "clone");
8914
9108
  function makeEventBuilder(state) {
8915
9109
  const b = {
8916
9110
  id: state.id,
8917
9111
  payloadSchema(schema) {
8918
- const next = clone4(state, { payloadSchema: schema });
9112
+ const next = clone5(state, { payloadSchema: schema });
8919
9113
  return makeEventBuilder(next);
8920
9114
  },
8921
9115
  tags(t, options) {
8922
9116
  const override = options?.override ?? false;
8923
9117
  const tags = mergeArray2(state.tags, t, override);
8924
- const next = clone4(state, { tags });
9118
+ const next = clone5(state, { tags });
8925
9119
  return makeEventBuilder(next);
8926
9120
  },
8927
9121
  meta(m) {
8928
- const next = clone4(state, { meta: m });
9122
+ const next = clone5(state, { meta: m });
8929
9123
  return makeEventBuilder(next);
8930
9124
  },
8931
9125
  build() {
@@ -8950,21 +9144,21 @@ __name(eventBuilder, "eventBuilder");
8950
9144
  var event = eventBuilder;
8951
9145
 
8952
9146
  // src/definers/builders/hook.ts
8953
- function clone5(s, patch) {
9147
+ function clone6(s, patch) {
8954
9148
  return Object.freeze({ ...s, ...patch });
8955
9149
  }
8956
- __name(clone5, "clone");
9150
+ __name(clone6, "clone");
8957
9151
  function makeHookBuilder(state) {
8958
9152
  const b = {
8959
9153
  id: state.id,
8960
9154
  on(on) {
8961
- const next = clone5(state, { on });
9155
+ const next = clone6(state, { on });
8962
9156
  return makeHookBuilder(
8963
9157
  next
8964
9158
  );
8965
9159
  },
8966
9160
  order(order) {
8967
- const next = clone5(state, { order });
9161
+ const next = clone6(state, { order });
8968
9162
  return makeHookBuilder(next);
8969
9163
  },
8970
9164
  dependencies(deps, options) {
@@ -8991,7 +9185,7 @@ function makeHookBuilder(state) {
8991
9185
  const a = deps;
8992
9186
  merged = { ...e, ...a };
8993
9187
  }
8994
- const next = clone5(state, { dependencies: merged });
9188
+ const next = clone6(state, { dependencies: merged });
8995
9189
  if (override) {
8996
9190
  return makeHookBuilder(
8997
9191
  next
@@ -9004,17 +9198,17 @@ function makeHookBuilder(state) {
9004
9198
  tags(t, options) {
9005
9199
  const override = options?.override ?? false;
9006
9200
  const tags = mergeArray2(state.tags, t, override);
9007
- const next = clone5(state, { tags });
9201
+ const next = clone6(state, { tags });
9008
9202
  return makeHookBuilder(next);
9009
9203
  },
9010
9204
  meta(m) {
9011
- const next = clone5(state, { meta: m });
9205
+ const next = clone6(state, { meta: m });
9012
9206
  return makeHookBuilder(
9013
9207
  next
9014
9208
  );
9015
9209
  },
9016
9210
  run(fn) {
9017
- const next = clone5(state, { run: fn });
9211
+ const next = clone6(state, { run: fn });
9018
9212
  return makeHookBuilder(next);
9019
9213
  },
9020
9214
  build() {
@@ -9059,7 +9253,10 @@ function makeTaskMiddlewareBuilder(state) {
9059
9253
  } else if (isFnExisting && isFnAddition) {
9060
9254
  const e = state.dependencies;
9061
9255
  const a = deps;
9062
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
9256
+ merged = /* @__PURE__ */ __name(((cfg) => ({
9257
+ ...e(cfg),
9258
+ ...a(cfg)
9259
+ })), "merged");
9063
9260
  } else if (isFnExisting && !isFnAddition) {
9064
9261
  const e = state.dependencies;
9065
9262
  const a = deps;
@@ -9146,7 +9343,10 @@ function makeResourceMiddlewareBuilder(state) {
9146
9343
  } else if (isFnExisting && isFnAddition) {
9147
9344
  const e = state.dependencies;
9148
9345
  const a = deps;
9149
- merged = /* @__PURE__ */ __name(((cfg) => ({ ...e(cfg), ...a(cfg) })), "merged");
9346
+ merged = /* @__PURE__ */ __name(((cfg) => ({
9347
+ ...e(cfg),
9348
+ ...a(cfg)
9349
+ })), "merged");
9150
9350
  } else if (isFnExisting && !isFnAddition) {
9151
9351
  const e = state.dependencies;
9152
9352
  const a = deps;
@@ -9220,25 +9420,25 @@ var taskMiddleware = taskMiddlewareBuilder;
9220
9420
  var resourceMiddleware = resourceMiddlewareBuilder;
9221
9421
 
9222
9422
  // src/definers/builders/tag.ts
9223
- function clone6(s, patch) {
9423
+ function clone7(s, patch) {
9224
9424
  return Object.freeze({ ...s, ...patch });
9225
9425
  }
9226
- __name(clone6, "clone");
9426
+ __name(clone7, "clone");
9227
9427
  function makeTagBuilder(state) {
9228
9428
  const b = {
9229
9429
  id: state.id,
9230
9430
  meta(m) {
9231
- const next = clone6(state, { meta: m });
9431
+ const next = clone7(state, { meta: m });
9232
9432
  return makeTagBuilder(next);
9233
9433
  },
9234
9434
  configSchema(schema) {
9235
- const next = clone6(state, { configSchema: schema });
9435
+ const next = clone7(state, { configSchema: schema });
9236
9436
  return makeTagBuilder(
9237
9437
  next
9238
9438
  );
9239
9439
  },
9240
9440
  config(config) {
9241
- const next = clone6(state, { config });
9441
+ const next = clone7(state, { config });
9242
9442
  return makeTagBuilder(
9243
9443
  next
9244
9444
  );
@@ -9269,6 +9469,51 @@ function tagBuilder(id2) {
9269
9469
  __name(tagBuilder, "tagBuilder");
9270
9470
  var tag = tagBuilder;
9271
9471
 
9472
+ // src/definers/builders/asyncContext.ts
9473
+ function clone8(s, patch) {
9474
+ return Object.freeze({ ...s, ...patch });
9475
+ }
9476
+ __name(clone8, "clone");
9477
+ function makeAsyncContextBuilder(state) {
9478
+ const b = {
9479
+ id: state.id,
9480
+ serialize(fn) {
9481
+ const next = clone8(state, { serialize: fn });
9482
+ return makeAsyncContextBuilder(next);
9483
+ },
9484
+ parse(fn) {
9485
+ const next = clone8(state, { parse: fn });
9486
+ return makeAsyncContextBuilder(next);
9487
+ },
9488
+ configSchema(schema) {
9489
+ const next = clone8(state, { configSchema: schema });
9490
+ return makeAsyncContextBuilder(next);
9491
+ },
9492
+ build() {
9493
+ const def = {
9494
+ id: state.id,
9495
+ serialize: state.serialize,
9496
+ parse: state.parse,
9497
+ configSchema: state.configSchema
9498
+ };
9499
+ return defineAsyncContext(def);
9500
+ }
9501
+ };
9502
+ return b;
9503
+ }
9504
+ __name(makeAsyncContextBuilder, "makeAsyncContextBuilder");
9505
+ function asyncContextBuilder(id2) {
9506
+ const initial = Object.freeze({
9507
+ id: id2,
9508
+ serialize: void 0,
9509
+ parse: void 0,
9510
+ configSchema: void 0
9511
+ });
9512
+ return makeAsyncContextBuilder(initial);
9513
+ }
9514
+ __name(asyncContextBuilder, "asyncContextBuilder");
9515
+ var asyncContext = asyncContextBuilder;
9516
+
9272
9517
  // src/models/Semaphore.ts
9273
9518
  var Semaphore = class {
9274
9519
  constructor(maxPermits) {
@@ -9319,9 +9564,9 @@ var Semaphore = class {
9319
9564
  options.signal.removeEventListener("abort", abortHandler);
9320
9565
  originalResolve();
9321
9566
  };
9322
- operation.reject = (error) => {
9567
+ operation.reject = (error2) => {
9323
9568
  options.signal.removeEventListener("abort", abortHandler);
9324
- originalReject(error);
9569
+ originalReject(error2);
9325
9570
  };
9326
9571
  }
9327
9572
  this.waitingQueue.push(operation);
@@ -9422,14 +9667,18 @@ var globals = {
9422
9667
  resources: globalResources,
9423
9668
  middleware: globalMiddlewares,
9424
9669
  tags: globalTags,
9425
- tunnels
9670
+ tunnels,
9671
+ debug
9426
9672
  };
9673
+ var createContext2 = createContext;
9427
9674
  var r = Object.freeze({
9428
9675
  resource,
9429
9676
  task,
9430
9677
  event,
9431
9678
  hook,
9432
9679
  tag,
9680
+ asyncContext,
9681
+ error,
9433
9682
  middleware: Object.freeze({
9434
9683
  task: taskMiddleware,
9435
9684
  resource: resourceMiddleware
@@ -9452,12 +9701,17 @@ function jsonOkResponse(data = {}) {
9452
9701
  return { status: 200, body: { ok: true, ...data } };
9453
9702
  }
9454
9703
  __name(jsonOkResponse, "jsonOkResponse");
9455
- function jsonErrorResponse(status, message, code) {
9456
- const error = { message };
9704
+ function jsonErrorResponse(status, message, code, extra) {
9705
+ const error2 = { message };
9457
9706
  if (code) {
9458
- error.code = code;
9707
+ error2.code = code;
9708
+ }
9709
+ if (extra && typeof extra === "object") {
9710
+ for (const [k, v] of Object.entries(extra)) {
9711
+ error2[k] = v;
9712
+ }
9459
9713
  }
9460
- return { status, body: { ok: false, error } };
9714
+ return { status, body: { ok: false, error: error2 } };
9461
9715
  }
9462
9716
  __name(jsonErrorResponse, "jsonErrorResponse");
9463
9717
  function respondJson(res, response, serializer) {
@@ -9674,8 +9928,8 @@ function safeLogInfo(logger, message, data) {
9674
9928
  }
9675
9929
  }
9676
9930
  __name(safeLogInfo, "safeLogInfo");
9677
- function errorMessage(error) {
9678
- return error instanceof Error ? error.message : String(error);
9931
+ function errorMessage(error2) {
9932
+ return error2 instanceof Error ? error2.message : String(error2);
9679
9933
  }
9680
9934
  __name(errorMessage, "errorMessage");
9681
9935
 
@@ -9687,9 +9941,9 @@ function makeRequestListener(options) {
9687
9941
  if (!handled && respondOnMiss && !res.writableEnded) {
9688
9942
  respondJson(res, NOT_FOUND_RESPONSE);
9689
9943
  }
9690
- }).catch((error) => {
9944
+ }).catch((error2) => {
9691
9945
  safeLogError(logger, "exposure.http.unhandled", {
9692
- error: errorMessage(error)
9946
+ error: errorMessage(error2)
9693
9947
  });
9694
9948
  if (!res.writableEnded) {
9695
9949
  respondJson(
@@ -10098,7 +10352,14 @@ async function readRequestBody(req, signal) {
10098
10352
  if (aborted) return;
10099
10353
  aborted = true;
10100
10354
  cleanup();
10101
- reject(new CancellationError("Request aborted"));
10355
+ const err = (() => {
10356
+ try {
10357
+ cancellationError.throw({ reason: "Request aborted" });
10358
+ } catch (e) {
10359
+ return e;
10360
+ }
10361
+ })();
10362
+ reject(err);
10102
10363
  }, "onAbort");
10103
10364
  const onError = /* @__PURE__ */ __name((err) => {
10104
10365
  cleanup();
@@ -10217,9 +10478,9 @@ function trimTrailingSlash(path3) {
10217
10478
  __name(trimTrailingSlash, "trimTrailingSlash");
10218
10479
 
10219
10480
  // src/node/exposure/requestContext.ts
10220
- var ExposureRequestContext = createContext(
10221
- "platform.node.exposure.request"
10222
- );
10481
+ var ExposureRequestContext = defineAsyncContext({
10482
+ id: "platform.node.exposure.request"
10483
+ });
10223
10484
  function useExposureContext() {
10224
10485
  return ExposureRequestContext.use();
10225
10486
  }
@@ -10347,7 +10608,16 @@ function createAbortControllerForRequest(req, res) {
10347
10608
  const controller = new AbortController();
10348
10609
  const onAbort = /* @__PURE__ */ __name(() => {
10349
10610
  try {
10350
- controller.abort(new CancellationError("Client Closed Request"));
10611
+ controller.abort(
10612
+ // pass a typed error instance
10613
+ (() => {
10614
+ try {
10615
+ cancellationError.throw({ reason: "Client Closed Request" });
10616
+ } catch (e) {
10617
+ return e;
10618
+ }
10619
+ })()
10620
+ );
10351
10621
  } catch {
10352
10622
  }
10353
10623
  }, "onAbort");
@@ -10401,18 +10671,43 @@ function createRequestHandlers(deps) {
10401
10671
  try {
10402
10672
  const contentType = getContentType(req.headers);
10403
10673
  const url = requestUrl(req);
10404
- const provide = /* @__PURE__ */ __name((fn) => ExposureRequestContext.provide(
10405
- {
10406
- req,
10407
- res,
10408
- url,
10409
- basePath: router.basePath,
10410
- headers: req.headers,
10411
- method: req.method,
10412
- signal: controller.signal
10413
- },
10414
- fn
10415
- ), "provide");
10674
+ const buildProvider = /* @__PURE__ */ __name((fn) => {
10675
+ const rawHeader = req.headers["x-runner-context"];
10676
+ let headerText;
10677
+ if (Array.isArray(rawHeader)) headerText = rawHeader[0];
10678
+ else if (typeof rawHeader === "string") headerText = rawHeader;
10679
+ let userWrapped = fn;
10680
+ if (headerText) {
10681
+ try {
10682
+ const map = serializer.parse(headerText);
10683
+ for (const [id2, ctx] of store2.asyncContexts.entries()) {
10684
+ const raw = map[id2];
10685
+ if (typeof raw === "string") {
10686
+ try {
10687
+ const value = ctx.parse(raw);
10688
+ const prev = userWrapped;
10689
+ userWrapped = /* @__PURE__ */ __name(async () => await ctx.provide(value, prev), "userWrapped");
10690
+ } catch {
10691
+ }
10692
+ }
10693
+ }
10694
+ } catch {
10695
+ }
10696
+ }
10697
+ const run2 = /* @__PURE__ */ __name(() => ExposureRequestContext.provide(
10698
+ {
10699
+ req,
10700
+ res,
10701
+ url,
10702
+ basePath: router.basePath,
10703
+ headers: req.headers,
10704
+ method: req.method,
10705
+ signal: controller.signal
10706
+ },
10707
+ userWrapped
10708
+ ), "run");
10709
+ return run2();
10710
+ }, "buildProvider");
10416
10711
  if (isMultipart(contentType)) {
10417
10712
  const multipart = await parseMultipartInput(
10418
10713
  req,
@@ -10428,7 +10723,7 @@ function createRequestHandlers(deps) {
10428
10723
  let taskError = void 0;
10429
10724
  let taskResult;
10430
10725
  try {
10431
- taskResult = await provide(
10726
+ taskResult = await buildProvider(
10432
10727
  () => taskRunner.run(storeTask.task, multipart.value)
10433
10728
  );
10434
10729
  } catch (err) {
@@ -10461,7 +10756,7 @@ function createRequestHandlers(deps) {
10461
10756
  return;
10462
10757
  }
10463
10758
  if (/^application\/octet-stream(?:;|$)/i.test(contentType)) {
10464
- const result2 = await provide(
10759
+ const result2 = await buildProvider(
10465
10760
  () => taskRunner.run(storeTask.task, void 0)
10466
10761
  );
10467
10762
  if (!res.writableEnded && result2 && typeof result2.pipe === "function") {
@@ -10501,7 +10796,7 @@ function createRequestHandlers(deps) {
10501
10796
  }
10502
10797
  return body.value;
10503
10798
  })();
10504
- const result = await provide(
10799
+ const result = await buildProvider(
10505
10800
  () => taskRunner.run(storeTask.task, payload)
10506
10801
  );
10507
10802
  if (!res.writableEnded && result && typeof result.pipe === "function") {
@@ -10517,8 +10812,8 @@ function createRequestHandlers(deps) {
10517
10812
  if (res.writableEnded || res.headersSent) return;
10518
10813
  applyCorsActual(req, res, cors);
10519
10814
  respondJson(res, jsonOkResponse({ result }), serializer);
10520
- } catch (error) {
10521
- if (isCancellationError(error)) {
10815
+ } catch (error2) {
10816
+ if (isCancellationError(error2)) {
10522
10817
  if (!res.writableEnded && !res.headersSent) {
10523
10818
  applyCorsActual(req, res, cors);
10524
10819
  respondJson(
@@ -10529,15 +10824,26 @@ function createRequestHandlers(deps) {
10529
10824
  }
10530
10825
  return;
10531
10826
  }
10532
- const logMessage = errorMessage(error);
10533
- const displayMessage = error instanceof Error && error.message ? error.message : "Internal Error";
10827
+ let appErrorExtra;
10828
+ try {
10829
+ for (const helper of store2.errors.values()) {
10830
+ if (helper.is(error2)) {
10831
+ const errAny = error2;
10832
+ appErrorExtra = { id: errAny?.name, data: errAny?.data };
10833
+ break;
10834
+ }
10835
+ }
10836
+ } catch {
10837
+ }
10838
+ const logMessage = errorMessage(error2);
10839
+ const displayMessage = error2 instanceof Error && error2.message ? error2.message : "Internal Error";
10534
10840
  safeLogError(logger, "exposure.task.error", {
10535
10841
  error: logMessage
10536
10842
  });
10537
10843
  applyCorsActual(req, res, cors);
10538
10844
  respondJson(
10539
10845
  res,
10540
- jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR"),
10846
+ jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR", appErrorExtra),
10541
10847
  serializer
10542
10848
  );
10543
10849
  }
@@ -10581,15 +10887,39 @@ function createRequestHandlers(deps) {
10581
10887
  respondJson(res, body.response, serializer);
10582
10888
  return;
10583
10889
  }
10584
- await eventManager.emit(
10585
- storeEvent.event,
10586
- body.value?.payload,
10587
- "exposure:http"
10588
- );
10890
+ const rawHeader = req.headers["x-runner-context"];
10891
+ let headerText;
10892
+ if (Array.isArray(rawHeader)) headerText = rawHeader[0];
10893
+ else if (typeof rawHeader === "string") headerText = rawHeader;
10894
+ let runEmit = /* @__PURE__ */ __name(async () => {
10895
+ await eventManager.emit(
10896
+ storeEvent.event,
10897
+ body.value?.payload,
10898
+ "exposure:http"
10899
+ );
10900
+ }, "runEmit");
10901
+ if (headerText) {
10902
+ try {
10903
+ const map = serializer.parse(headerText);
10904
+ for (const [id2, ctx] of store2.asyncContexts.entries()) {
10905
+ const raw = map[id2];
10906
+ if (typeof raw === "string") {
10907
+ try {
10908
+ const value = ctx.parse(raw);
10909
+ const prev = runEmit;
10910
+ runEmit = /* @__PURE__ */ __name(async () => await ctx.provide(value, prev), "runEmit");
10911
+ } catch {
10912
+ }
10913
+ }
10914
+ }
10915
+ } catch {
10916
+ }
10917
+ }
10918
+ await runEmit();
10589
10919
  applyCorsActual(req, res, cors);
10590
10920
  respondJson(res, jsonOkResponse(), serializer);
10591
- } catch (error) {
10592
- if (isCancellationError(error)) {
10921
+ } catch (error2) {
10922
+ if (isCancellationError(error2)) {
10593
10923
  if (!res.writableEnded && !res.headersSent) {
10594
10924
  applyCorsActual(req, res, cors);
10595
10925
  respondJson(
@@ -10600,15 +10930,26 @@ function createRequestHandlers(deps) {
10600
10930
  }
10601
10931
  return;
10602
10932
  }
10603
- const logMessage = errorMessage(error);
10604
- const displayMessage = error instanceof Error && error.message ? error.message : "Internal Error";
10933
+ let appErrorExtra;
10934
+ try {
10935
+ for (const helper of store2.errors.values()) {
10936
+ if (helper.is(error2)) {
10937
+ const errAny = error2;
10938
+ appErrorExtra = { id: errAny?.name, data: errAny?.data };
10939
+ break;
10940
+ }
10941
+ }
10942
+ } catch {
10943
+ }
10944
+ const logMessage = errorMessage(error2);
10945
+ const displayMessage = error2 instanceof Error && error2.message ? error2.message : "Internal Error";
10605
10946
  safeLogError(logger, "exposure.event.error", {
10606
10947
  error: logMessage
10607
10948
  });
10608
10949
  applyCorsActual(req, res, cors);
10609
10950
  respondJson(
10610
10951
  res,
10611
- jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR"),
10952
+ jsonErrorResponse(500, displayMessage, "INTERNAL_ERROR", appErrorExtra),
10612
10953
  serializer
10613
10954
  );
10614
10955
  }
@@ -10844,6 +11185,19 @@ async function postJson(cfg, url, body) {
10844
11185
  "content-type": "application/json; charset=utf-8",
10845
11186
  ...toHeaders(cfg.auth)
10846
11187
  };
11188
+ if (cfg.contexts && cfg.contexts.length > 0) {
11189
+ const map = {};
11190
+ for (const ctx of cfg.contexts) {
11191
+ try {
11192
+ const v = ctx.use();
11193
+ map[ctx.id] = ctx.serialize(v);
11194
+ } catch {
11195
+ }
11196
+ }
11197
+ if (Object.keys(map).length > 0) {
11198
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11199
+ }
11200
+ }
10847
11201
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10848
11202
  return await new Promise((resolve, reject) => {
10849
11203
  const req = lib.request(
@@ -10933,6 +11287,19 @@ async function postMultipart(cfg, url, manifestText, files) {
10933
11287
  "content-type": `multipart/form-data; boundary=${boundary}`,
10934
11288
  ...toHeaders(cfg.auth)
10935
11289
  };
11290
+ if (cfg.contexts && cfg.contexts.length > 0) {
11291
+ const map = {};
11292
+ for (const ctx of cfg.contexts) {
11293
+ try {
11294
+ const v = ctx.use();
11295
+ map[ctx.id] = ctx.serialize(v);
11296
+ } catch {
11297
+ }
11298
+ }
11299
+ if (Object.keys(map).length > 0) {
11300
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11301
+ }
11302
+ }
10936
11303
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10937
11304
  return await new Promise(
10938
11305
  (resolve, reject) => {
@@ -10962,6 +11329,19 @@ async function postOctetStream(cfg, url, stream$1) {
10962
11329
  "content-type": "application/octet-stream",
10963
11330
  ...toHeaders(cfg.auth)
10964
11331
  };
11332
+ if (cfg.contexts && cfg.contexts.length > 0) {
11333
+ const map = {};
11334
+ for (const ctx of cfg.contexts) {
11335
+ try {
11336
+ const v = ctx.use();
11337
+ map[ctx.id] = ctx.serialize(v);
11338
+ } catch {
11339
+ }
11340
+ }
11341
+ if (Object.keys(map).length > 0) {
11342
+ headers["x-runner-context"] = cfg.serializer.stringify(map);
11343
+ }
11344
+ }
10965
11345
  if (cfg.onRequest) await cfg.onRequest({ url, headers });
10966
11346
  return await new Promise(
10967
11347
  (resolve, reject) => {
@@ -10972,10 +11352,10 @@ async function postOctetStream(cfg, url, stream$1) {
10972
11352
  cleanup.forEach((fn) => fn());
10973
11353
  resolve(value);
10974
11354
  }, "resolveOnce");
10975
- const rejectOnce = /* @__PURE__ */ __name((error) => {
11355
+ const rejectOnce = /* @__PURE__ */ __name((error2) => {
10976
11356
  settled = true;
10977
11357
  cleanup.forEach((fn) => fn());
10978
- reject(error);
11358
+ reject(error2);
10979
11359
  }, "rejectOnce");
10980
11360
  const req = lib.request(
10981
11361
  {
@@ -11136,12 +11516,15 @@ exports.Semaphore = Semaphore;
11136
11516
  exports.Store = Store;
11137
11517
  exports.TaskRunner = TaskRunner;
11138
11518
  exports.allFalse = allFalse;
11519
+ exports.asyncContext = defineAsyncContext;
11139
11520
  exports.bindProcessErrorHandler = bindProcessErrorHandler;
11140
- exports.createContext = createContext;
11521
+ exports.createContext = createContext2;
11141
11522
  exports.createDefaultUnhandledError = createDefaultUnhandledError;
11142
11523
  exports.createHttpSmartClient = createHttpSmartClient;
11143
11524
  exports.createNodeFile = createNodeFile;
11144
11525
  exports.createTestResource = createTestResource;
11526
+ exports.debug = debug;
11527
+ exports.debugLevels = debugLevels;
11145
11528
  exports.definitions = defs_exports;
11146
11529
  exports.event = defineEvent;
11147
11530
  exports.getConfig = getConfig;