@bluelibs/runner 5.2.1 → 5.3.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 (43) hide show
  1. package/README.md +54 -1
  2. package/dist/browser/index.cjs +149 -59
  3. package/dist/browser/index.cjs.map +1 -1
  4. package/dist/browser/index.mjs +149 -60
  5. package/dist/browser/index.mjs.map +1 -1
  6. package/dist/edge/index.cjs +149 -59
  7. package/dist/edge/index.cjs.map +1 -1
  8. package/dist/edge/index.mjs +149 -60
  9. package/dist/edge/index.mjs.map +1 -1
  10. package/dist/node/node.cjs +383 -201
  11. package/dist/node/node.cjs.map +1 -1
  12. package/dist/node/node.mjs +382 -202
  13. package/dist/node/node.mjs.map +1 -1
  14. package/dist/types/definers/builders/error/fluent-builder.interface.d.ts +6 -0
  15. package/dist/types/definers/builders/error/index.d.ts +10 -1
  16. package/dist/types/definers/builders/error/types.d.ts +2 -0
  17. package/dist/types/definers/defineError.d.ts +5 -3
  18. package/dist/types/defs.d.ts +1 -0
  19. package/dist/types/globals/resources/tunnel/protocol.d.ts +3 -0
  20. package/dist/types/models/Store.d.ts +5 -3
  21. package/dist/types/models/StoreRegistry.d.ts +5 -3
  22. package/dist/types/node/durable/core/DurableResource.d.ts +23 -9
  23. package/dist/types/node/durable/core/DurableService.d.ts +15 -9
  24. package/dist/types/node/durable/core/interfaces/service.d.ts +27 -19
  25. package/dist/types/node/durable/core/interfaces/store.d.ts +1 -1
  26. package/dist/types/node/durable/core/managers/ExecutionManager.d.ts +34 -4
  27. package/dist/types/node/durable/core/managers/ScheduleManager.d.ts +5 -3
  28. package/dist/types/node/durable/core/managers/TaskRegistry.d.ts +5 -5
  29. package/dist/types/node/durable/core/managers/WaitManager.d.ts +1 -1
  30. package/dist/types/node/durable/index.d.ts +1 -0
  31. package/dist/types/node/durable/tags/durableWorkflow.tag.d.ts +14 -0
  32. package/dist/types/public.d.ts +4 -1
  33. package/dist/types/testing.d.ts +0 -1
  34. package/dist/types/types/error.d.ts +22 -1
  35. package/dist/types/types/resource.d.ts +2 -4
  36. package/dist/types/types/symbols.d.ts +2 -2
  37. package/dist/types/types/tagged.d.ts +18 -0
  38. package/dist/universal/index.cjs +149 -59
  39. package/dist/universal/index.cjs.map +1 -1
  40. package/dist/universal/index.mjs +149 -60
  41. package/dist/universal/index.mjs.map +1 -1
  42. package/package.json +1 -1
  43. package/readmes/AI.md +25 -9
@@ -3,7 +3,7 @@ import { IResourceMiddleware, ResourceMiddlewareAttachmentType } from "./resourc
3
3
  import { TagType } from "./tag";
4
4
  import { IResourceMeta } from "./meta";
5
5
  import type { ThrowsList } from "./error";
6
- import { symbolFilePath, symbolResource, symbolResourceWithConfig, symbolResourceForkedFrom } from "./symbols";
6
+ import { symbolFilePath, symbolForkedFrom, symbolResource, symbolResourceWithConfig } from "./symbols";
7
7
  import { EnsureInputSatisfiesContracts, EnsureOutputSatisfiesContracts, HasInputContracts, HasOutputContracts, InferInputOrViolationFromContracts } from "./contracts";
8
8
  export type { DependencyMapType, IOptionalDependency, IValidationSchema, OverridableElements, RegisterableItems, ResourceDependencyValuesType, } from "./utilities";
9
9
  export type { ResourceMiddlewareAttachmentType } from "./resourceMiddleware";
@@ -27,8 +27,6 @@ export interface ResourceForkOptions {
27
27
  export interface ResourceForkInfo {
28
28
  /** The id of the resource that was forked. */
29
29
  readonly fromId: string;
30
- /** Best-effort call-site file path for the fork operation. */
31
- readonly forkedAtFilePath: string;
32
30
  }
33
31
  export type IsAny<T> = 0 extends 1 & T ? true : false;
34
32
  export type IsUnspecified<T> = [T] extends [undefined] ? true : [T] extends [void] ? true : IsAny<T> extends true ? true : false;
@@ -109,7 +107,7 @@ export interface IResource<TConfig = void, TValue extends Promise<any> = Promise
109
107
  [symbolFilePath]: string;
110
108
  [symbolResource]: true;
111
109
  /** Present only on forked resources. */
112
- [symbolResourceForkedFrom]?: ResourceForkInfo;
110
+ [symbolForkedFrom]?: ResourceForkInfo;
113
111
  /** Normalized list of error ids declared via `throws`. */
114
112
  throws?: readonly string[];
115
113
  /** Return an optional dependency wrapper for this resource. */
@@ -8,8 +8,8 @@ export declare const symbolTask: unique symbol;
8
8
  /** Marks a task as a phantom task (no-op run; meant to be tunneled/routed). */
9
9
  export declare const symbolPhantomTask: unique symbol;
10
10
  export declare const symbolResource: unique symbol;
11
- /** @internal Marks forked resources and records fork provenance */
12
- export declare const symbolResourceForkedFrom: unique symbol;
11
+ /** @internal Generic fork provenance metadata for definitions that support `.fork()` */
12
+ export declare const symbolForkedFrom: unique symbol;
13
13
  export declare const symbolResourceWithConfig: unique symbol;
14
14
  export declare const symbolEvent: unique symbol;
15
15
  /** @internal Marks an error helper definition */
@@ -0,0 +1,18 @@
1
+ import type { HasInputContracts, HasOutputContracts, InferInputOrViolationFromContracts, InferOutputOrViolationFromContracts } from "./contracts";
2
+ import type { IResource } from "./resource";
3
+ import type { ITask } from "./task";
4
+ import type { ITag } from "./tag";
5
+ type TagInputContract<TTag extends ITag<any, any, any>> = HasInputContracts<[TTag]> extends true ? InferInputOrViolationFromContracts<[TTag]> : any;
6
+ type TagOutputContract<TTag extends ITag<any, any, any>> = HasOutputContracts<[TTag]> extends true ? InferOutputOrViolationFromContracts<[TTag]> : any;
7
+ export type AnyResource = IResource<any, any, any, any, any, any, any>;
8
+ /**
9
+ * A task discovered by a concrete tag. If the tag carries contracts,
10
+ * its input/output contracts are reflected in the task signature.
11
+ */
12
+ export type TaggedTask<TTag extends ITag<any, any, any>> = ITask<TagInputContract<TTag>, Promise<TagOutputContract<TTag>>, any, any, any, any>;
13
+ /**
14
+ * A resource discovered by a concrete tag. If the tag carries contracts,
15
+ * its config/value contracts are reflected in the resource signature.
16
+ */
17
+ export type TaggedResource<TTag extends ITag<any, any, any>> = IResource<TagInputContract<TTag>, Promise<TagOutputContract<TTag>>, any, any, any, any, any>;
18
+ export {};
@@ -166,9 +166,7 @@ var symbolPhantomTask = Symbol.for(
166
166
  "runner.task.phantom"
167
167
  );
168
168
  var symbolResource = Symbol.for("runner.resource");
169
- var symbolResourceForkedFrom = Symbol.for(
170
- "runner.resourceForkedFrom"
171
- );
169
+ var symbolForkedFrom = Symbol.for("runner.forkedFrom");
172
170
  var symbolResourceWithConfig = Symbol.for(
173
171
  "runner.resourceWithConfig"
174
172
  );
@@ -235,13 +233,13 @@ __export(defs_exports, {
235
233
  symbolError: () => symbolError,
236
234
  symbolEvent: () => symbolEvent,
237
235
  symbolFilePath: () => symbolFilePath,
236
+ symbolForkedFrom: () => symbolForkedFrom,
238
237
  symbolHook: () => symbolHook,
239
238
  symbolMiddleware: () => symbolMiddleware,
240
239
  symbolMiddlewareConfigured: () => symbolMiddlewareConfigured,
241
240
  symbolOptionalDependency: () => symbolOptionalDependency,
242
241
  symbolPhantomTask: () => symbolPhantomTask,
243
242
  symbolResource: () => symbolResource,
244
- symbolResourceForkedFrom: () => symbolResourceForkedFrom,
245
243
  symbolResourceMiddleware: () => symbolResourceMiddleware,
246
244
  symbolResourceWithConfig: () => symbolResourceWithConfig,
247
245
  symbolTag: () => symbolTag,
@@ -446,12 +444,26 @@ __export(errors_exports, {
446
444
  });
447
445
 
448
446
  // src/definers/defineError.ts
447
+ var isValidHttpCode = /* @__PURE__ */ __name((value) => Number.isInteger(value) && value >= 100 && value <= 599, "isValidHttpCode");
448
+ var assertHttpCode = /* @__PURE__ */ __name((value) => {
449
+ if (!isValidHttpCode(value)) {
450
+ throw new Error(
451
+ `Error httpCode must be an integer between 100 and 599. Received: ${value}`
452
+ );
453
+ }
454
+ }, "assertHttpCode");
449
455
  var RunnerError = class extends Error {
450
- constructor(id2, message, data) {
451
- super(message);
456
+ constructor(id2, message, data, httpCode, remediation) {
457
+ super(
458
+ remediation !== void 0 ? `${message}
459
+
460
+ Remediation: ${remediation}` : message
461
+ );
452
462
  this.id = id2;
453
463
  this.data = data;
454
464
  this.name = id2;
465
+ this.httpCode = httpCode;
466
+ this.remediation = remediation;
455
467
  }
456
468
  static {
457
469
  __name(this, "RunnerError");
@@ -471,10 +483,20 @@ var ErrorHelper = class {
471
483
  get id() {
472
484
  return this.definition.id;
473
485
  }
486
+ get httpCode() {
487
+ return this.definition.httpCode;
488
+ }
474
489
  throw(data) {
475
490
  const parsed = this.definition.dataSchema ? this.definition.dataSchema.parse(data) : data;
476
491
  const message = this.definition.format(parsed);
477
- throw new RunnerError(this.definition.id, message, parsed);
492
+ const remediation = typeof this.definition.remediation === "function" ? this.definition.remediation(parsed) : this.definition.remediation;
493
+ throw new RunnerError(
494
+ this.definition.id,
495
+ message,
496
+ parsed,
497
+ this.definition.httpCode,
498
+ remediation
499
+ );
478
500
  }
479
501
  is(error2) {
480
502
  return error2 instanceof RunnerError && error2.name === this.definition.id;
@@ -487,6 +509,9 @@ var ErrorHelper = class {
487
509
  }
488
510
  };
489
511
  function defineError(definition, filePath) {
512
+ if (definition.httpCode !== void 0) {
513
+ assertHttpCode(definition.httpCode);
514
+ }
490
515
  if (!definition.format) {
491
516
  definition.format = (data) => `${JSON.stringify(data)}`;
492
517
  }
@@ -508,9 +533,22 @@ function clone(s, patch) {
508
533
  __name(clone, "clone");
509
534
 
510
535
  // src/definers/builders/error/fluent-builder.ts
536
+ var isValidHttpCode2 = /* @__PURE__ */ __name((value) => Number.isInteger(value) && value >= 100 && value <= 599, "isValidHttpCode");
537
+ var assertHttpCode2 = /* @__PURE__ */ __name((value) => {
538
+ if (!isValidHttpCode2(value)) {
539
+ throw new Error(
540
+ `Error httpCode must be an integer between 100 and 599. Received: ${value}`
541
+ );
542
+ }
543
+ }, "assertHttpCode");
511
544
  function makeErrorBuilder(state) {
512
545
  const builder = {
513
546
  id: state.id,
547
+ httpCode(code) {
548
+ assertHttpCode2(code);
549
+ const next = clone(state, { httpCode: code });
550
+ return makeErrorBuilder(next);
551
+ },
514
552
  serialize(fn) {
515
553
  const next = clone(state, { serialize: fn });
516
554
  return makeErrorBuilder(next);
@@ -527,6 +565,10 @@ function makeErrorBuilder(state) {
527
565
  const next = clone(state, { format: fn });
528
566
  return makeErrorBuilder(next);
529
567
  },
568
+ remediation(advice) {
569
+ const next = clone(state, { remediation: advice });
570
+ return makeErrorBuilder(next);
571
+ },
530
572
  meta(m) {
531
573
  const next = clone(state, { meta: m });
532
574
  return makeErrorBuilder(next);
@@ -535,10 +577,12 @@ function makeErrorBuilder(state) {
535
577
  return defineError(
536
578
  {
537
579
  id: state.id,
580
+ httpCode: state.httpCode,
538
581
  serialize: state.serialize,
539
582
  parse: state.parse,
540
583
  dataSchema: state.dataSchema,
541
584
  format: state.format,
585
+ remediation: state.remediation,
542
586
  meta: state.meta
543
587
  },
544
588
  state.filePath
@@ -555,6 +599,7 @@ function errorBuilder(id2) {
555
599
  const initial = Object.freeze({
556
600
  id: id2,
557
601
  filePath,
602
+ httpCode: void 0,
558
603
  serialize: void 0,
559
604
  parse: void 0,
560
605
  dataSchema: void 0,
@@ -563,7 +608,13 @@ function errorBuilder(id2) {
563
608
  return makeErrorBuilder(initial);
564
609
  }
565
610
  __name(errorBuilder, "errorBuilder");
566
- var error = errorBuilder;
611
+ function isRunnerError(error2) {
612
+ return error2 instanceof RunnerError;
613
+ }
614
+ __name(isRunnerError, "isRunnerError");
615
+ var error = Object.assign(errorBuilder, {
616
+ is: isRunnerError
617
+ });
567
618
 
568
619
  // src/platform/adapters/node-als.ts
569
620
  async function loadAsyncLocalStorageClass() {
@@ -994,9 +1045,13 @@ var PlatformAdapter = class {
994
1045
  // src/errors.ts
995
1046
  var duplicateRegistrationError = error("runner.errors.duplicateRegistration").format(
996
1047
  ({ 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.`
1048
+ ).remediation(
1049
+ ({ type }) => `Ensure each ${type} has a unique id. If you need the same definition in multiple places, use .fork() to create a copy with a new id.`
997
1050
  ).build();
998
1051
  var dependencyNotFoundError = error("runner.errors.dependencyNotFound").format(
999
1052
  ({ key }) => `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
1053
+ ).remediation(
1054
+ ({ key }) => `Register the dependency "${key.toString()}" in a parent resource using .register([${key.toString()}]). If the dependency is optional, use .optional() when declaring it.`
1000
1055
  ).build();
1001
1056
  var unknownItemTypeError = error(
1002
1057
  "runner.errors.unknownItemType"
@@ -1004,10 +1059,14 @@ var unknownItemTypeError = error(
1004
1059
  ({ item }) => `Unknown item type: ${String(
1005
1060
  item
1006
1061
  )}. Please ensure you are not using different versions of '@bluelibs/runner'`
1062
+ ).remediation(
1063
+ "Check that all packages depend on the same version of '@bluelibs/runner'. Run 'npm ls @bluelibs/runner' to detect duplicates."
1007
1064
  ).build();
1008
1065
  var contextError = error(
1009
1066
  "runner.errors.context"
1010
- ).format(({ details }) => details ?? "Context error").build();
1067
+ ).format(({ details }) => details ?? "Context error").remediation(
1068
+ "Verify the async context is registered in a parent resource and that .provide() was called before .use(). If the context is optional, use .optional() when declaring the dependency."
1069
+ ).build();
1011
1070
  var circularDependenciesError = error("runner.errors.circularDependencies").format(({ cycles }) => {
1012
1071
  const cycleDetails = cycles.map((cycle) => ` \u2022 ${cycle}`).join("\n");
1013
1072
  const hasMiddleware = cycles.some((cycle) => cycle.includes("middleware"));
@@ -1020,36 +1079,54 @@ var circularDependenciesError = error("runner.errors.circularDependencies").form
1020
1079
  }
1021
1080
  return `Circular dependencies detected:
1022
1081
  ${cycleDetails}${guidance}`;
1023
- }).build();
1082
+ }).remediation(
1083
+ "Break the cycle by extracting shared state into a new resource that both sides depend on, or use events for indirect communication."
1084
+ ).build();
1024
1085
  var eventNotFoundError = error(
1025
1086
  "runner.errors.eventNotFound"
1026
1087
  ).format(
1027
1088
  ({ id: id2 }) => `Event "${id2.toString()}" not found. Did you forget to register it?`
1089
+ ).remediation(
1090
+ ({ id: id2 }) => `Add the event "${id2.toString()}" to a parent resource via .register([yourEvent]). Ensure the event definition is built with r.event("${id2.toString()}").build().`
1028
1091
  ).build();
1029
1092
  var resourceNotFoundError = error(
1030
1093
  "runner.errors.resourceNotFound"
1031
1094
  ).format(
1032
1095
  ({ id: id2 }) => `Resource "${id2.toString()}" not found. Did you forget to register it or are you using the correct id?`
1096
+ ).remediation(
1097
+ ({ id: id2 }) => `Register the resource "${id2.toString()}" in a parent resource via .register([yourResource]). Verify the id string matches exactly (ids are case-sensitive).`
1033
1098
  ).build();
1034
1099
  var middlewareNotRegisteredError = error("runner.errors.middlewareNotRegistered").format(
1035
1100
  ({ type, source, middlewareId }) => `Middleware inside ${type} "${source}" depends on "${middlewareId}" but it's not registered. Did you forget to register it?`
1101
+ ).remediation(
1102
+ ({ middlewareId }) => `Register the middleware "${middlewareId}" alongside its consumer in a parent resource via .register([yourMiddleware]).`
1036
1103
  ).build();
1037
1104
  var tagNotFoundError = error(
1038
1105
  "runner.errors.tagNotFound"
1039
1106
  ).format(
1040
1107
  ({ id: id2 }) => `Tag "${id2}" not registered. Did you forget to register it inside a resource?`
1108
+ ).remediation(
1109
+ ({ id: id2 }) => `Register the tag "${id2}" in a parent resource via .register([yourTag]). Tags must be registered before they can be queried.`
1041
1110
  ).build();
1042
1111
  var lockedError = error(
1043
1112
  "runner.errors.locked"
1044
1113
  ).format(
1045
1114
  ({ what }) => `Cannot modify the ${what.toString()} when it is locked.`
1115
+ ).remediation(
1116
+ ({ what }) => `The ${what.toString()} is locked after initialization. Perform all modifications before calling run().`
1046
1117
  ).build();
1047
1118
  var storeAlreadyInitializedError = error(
1048
1119
  "runner.errors.storeAlreadyInitialized"
1049
- ).format(() => "Store already initialized. Cannot reinitialize.").build();
1120
+ ).format(() => "Store already initialized. Cannot reinitialize.").remediation(
1121
+ "Do not call run() more than once on the same resource tree. Create a fresh resource if you need a separate runtime."
1122
+ ).build();
1050
1123
  var validationError = error("runner.errors.validation").format(({ subject, id: id2, originalError }) => {
1051
1124
  const errorMessage = originalError instanceof Error ? originalError.message : String(originalError);
1052
1125
  return `${subject} validation failed for ${id2.toString()}: ${errorMessage}`;
1126
+ }).remediation(({ subject, id: id2 }) => {
1127
+ const lower = subject.toLowerCase();
1128
+ const schemaHint = lower.includes("input") ? "inputSchema" : lower.includes("config") ? "configSchema" : lower.includes("result") ? "resultSchema" : "schema";
1129
+ return `Check the ${subject} passed to "${id2.toString()}". Ensure it matches the schema defined via .${schemaHint}().`;
1053
1130
  }).build();
1054
1131
  var eventCycleError = error("runner.errors.eventCycle").format(({ path }) => {
1055
1132
  const chain = path.map((p) => `${p.id}\u2190${p.source}`).join(" -> ");
@@ -1057,33 +1134,49 @@ var eventCycleError = error("runner.errors.eventCycle").format(({ path }) => {
1057
1134
  ${chain}
1058
1135
 
1059
1136
  Break the cycle by changing hook logic (avoid mutual emits) or gate with conditions/tags.`;
1060
- }).build();
1137
+ }).remediation(
1138
+ "Refactor hooks to avoid circular event emissions. Use conditional guards, split events into finer-grained signals, or introduce an intermediate task to break the cycle."
1139
+ ).build();
1061
1140
  var eventEmissionCycleError = error("runner.errors.eventEmissionCycle").format(({ cycles }) => {
1062
1141
  const list = cycles.map((c) => ` \u2022 ${c}`).join("\n");
1063
1142
  return `Event emission cycles detected between hooks and events:
1064
1143
  ${list}
1065
1144
 
1066
1145
  This was detected at compile time (dry-run). Break the cycle by avoiding mutual emits between hooks or scoping hooks using tags.`;
1067
- }).build();
1146
+ }).remediation(
1147
+ "Redesign the event/hook graph so no hook emits an event that eventually triggers itself. Use tags or conditional logic to prevent re-entrant emissions."
1148
+ ).build();
1068
1149
  var platformUnsupportedFunctionError = error("runner.errors.platformUnsupportedFunction").format(
1069
1150
  ({ functionName }) => `Platform function not supported in this environment: ${functionName}. Detected platform: ${detectEnvironment()}.`
1151
+ ).remediation(
1152
+ ({ functionName }) => `The function "${functionName}" requires a Node.js environment. If running in a browser or edge runtime, use a platform-compatible alternative or guard the call with a platform check.`
1070
1153
  ).build();
1071
1154
  var cancellationError = error(
1072
1155
  "runner.errors.cancellation"
1073
- ).format(({ reason }) => reason || "Operation cancelled").build();
1156
+ ).format(({ reason }) => reason || "Operation cancelled").remediation(
1157
+ "The operation was cancelled, typically via an AbortController signal. If this is unexpected, check timeout middleware settings or ensure the caller is not aborting prematurely."
1158
+ ).build();
1074
1159
  var tunnelOwnershipConflictError = error("runner.errors.tunnelOwnershipConflict").format(
1075
1160
  ({ 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.`
1161
+ ).remediation(
1162
+ ({ taskId }) => `Each task can only be tunneled by one client. Remove the duplicate tunnel registration for "${taskId}" or split the task into separate definitions with distinct ids.`
1076
1163
  ).build();
1077
1164
  var phantomTaskNotRoutedError = error("runner.errors.phantomTaskNotRouted").format(
1078
1165
  ({ taskId }) => `Phantom task "${taskId}" is not routed through any tunnel. Ensure a tunnel client selects this task id (or avoid calling the phantom task directly).`
1166
+ ).remediation(
1167
+ ({ taskId }) => `Configure a tunnel client resource to select "${taskId}" so it routes to a remote server. Phantom tasks cannot be executed locally \u2014 they only serve as local proxies for remote tasks.`
1079
1168
  ).build();
1080
1169
  var taskNotRegisteredError = error("runner.errors.taskNotRegistered").format(
1081
1170
  ({ taskId }) => `Task "${taskId}" is not registered in the Store. This is an internal error\u2014ensure the task is registered before execution.`
1171
+ ).remediation(
1172
+ ({ taskId }) => `Register the task "${taskId}" in a parent resource via .register([yourTask]) before calling run(). If this error persists, it may indicate an internal framework bug.`
1082
1173
  ).build();
1083
1174
  var builderIncompleteError = error("runner.errors.builderIncomplete").format(({ type, builderId, missingFields }) => {
1084
1175
  const typeLabel = type === "hook" ? "Hook" : type === "task-middleware" ? "Task middleware" : "Resource middleware";
1085
1176
  return `${typeLabel} "${builderId}" is incomplete. Missing required: ${missingFields.join(", ")}. Call ${missingFields.map((f) => `.${f}()`).join(" and ")} before .build().`;
1086
- }).build();
1177
+ }).remediation(
1178
+ ({ missingFields }) => `Add the missing builder steps: ${missingFields.map((f) => `.${f}()`).join(", ")} before calling .build().`
1179
+ ).build();
1087
1180
  function isCancellationError(err) {
1088
1181
  return cancellationError.is(err);
1089
1182
  }
@@ -1317,6 +1410,7 @@ function defineResource(constConfig) {
1317
1410
  };
1318
1411
  },
1319
1412
  fork(newId, options) {
1413
+ const forkCallerFilePath = getCallerFile();
1320
1414
  const forkedParts = resolveForkedRegisterAndDependencies({
1321
1415
  register: constConfig.register,
1322
1416
  dependencies: constConfig.dependencies,
@@ -1328,11 +1422,10 @@ function defineResource(constConfig) {
1328
1422
  id: newId,
1329
1423
  register: forkedParts.register,
1330
1424
  dependencies: forkedParts.dependencies,
1331
- [symbolFilePath]: filePath
1425
+ [symbolFilePath]: forkCallerFilePath
1332
1426
  });
1333
- forked[symbolResourceForkedFrom] = {
1334
- fromId: id2,
1335
- forkedAtFilePath: getCallerFile()
1427
+ forked[symbolForkedFrom] = {
1428
+ fromId: id2
1336
1429
  };
1337
1430
  return forked;
1338
1431
  }
@@ -1563,7 +1656,7 @@ __name(defineTag, "defineTag");
1563
1656
 
1564
1657
  // src/globals/middleware/requireContext.middleware.ts
1565
1658
  var requireContextTaskMiddleware = defineTaskMiddleware({
1566
- id: "globals.middleware.requireContext",
1659
+ id: "globals.middleware.task.requireContext",
1567
1660
  async run({ task: task2, next }, _deps, config) {
1568
1661
  if (!config.context) {
1569
1662
  throw new Error(
@@ -3207,7 +3300,7 @@ var cacheFactoryTask = defineTask({
3207
3300
  });
3208
3301
  var journalKeys = {
3209
3302
  /** Whether the result was served from cache (true) or freshly computed (false) */
3210
- hit: journal.createKey("globals.middleware.cache.hit")
3303
+ hit: journal.createKey("globals.middleware.task.cache.hit")
3211
3304
  };
3212
3305
  var cacheResource = defineResource({
3213
3306
  id: "globals.resources.cache",
@@ -3237,7 +3330,7 @@ var cacheResource = defineResource({
3237
3330
  });
3238
3331
  var defaultKeyBuilder = /* @__PURE__ */ __name((taskId, input) => `${taskId}-${JSON.stringify(input)}`, "defaultKeyBuilder");
3239
3332
  var cacheMiddleware = defineTaskMiddleware({
3240
- id: "globals.middleware.cache",
3333
+ id: "globals.middleware.task.cache",
3241
3334
  dependencies: { cache: cacheResource },
3242
3335
  async run({ task: task2, next, journal: journal2 }, deps, config) {
3243
3336
  const { cache } = deps;
@@ -3288,11 +3381,11 @@ var CircuitBreakerOpenError = class extends Error {
3288
3381
  var journalKeys2 = {
3289
3382
  /** Current state of the circuit breaker (CLOSED, OPEN, or HALF_OPEN) */
3290
3383
  state: journal.createKey(
3291
- "globals.middleware.circuitBreaker.state"
3384
+ "globals.middleware.task.circuitBreaker.state"
3292
3385
  ),
3293
3386
  /** Current failure count */
3294
3387
  failures: journal.createKey(
3295
- "globals.middleware.circuitBreaker.failures"
3388
+ "globals.middleware.task.circuitBreaker.failures"
3296
3389
  )
3297
3390
  };
3298
3391
  var circuitBreakerResource = defineResource({
@@ -3305,7 +3398,7 @@ var circuitBreakerResource = defineResource({
3305
3398
  }, "init")
3306
3399
  });
3307
3400
  var circuitBreakerMiddleware = defineTaskMiddleware({
3308
- id: "globals.middleware.circuitBreaker",
3401
+ id: "globals.middleware.task.circuitBreaker",
3309
3402
  dependencies: { state: circuitBreakerResource },
3310
3403
  async run({ task: task2, next, journal: journal2 }, { state }, config) {
3311
3404
  const taskId = task2.definition.id;
@@ -3885,12 +3978,12 @@ var EventManager = class {
3885
3978
 
3886
3979
  // src/models/Semaphore.ts
3887
3980
  var SemaphoreEvents = {
3888
- queued: defineEvent({ id: "semaphore.queued" }),
3889
- acquired: defineEvent({ id: "semaphore.acquired" }),
3890
- released: defineEvent({ id: "semaphore.released" }),
3891
- timeout: defineEvent({ id: "semaphore.timeout" }),
3892
- aborted: defineEvent({ id: "semaphore.aborted" }),
3893
- disposed: defineEvent({ id: "semaphore.disposed" })
3981
+ queued: defineEvent({ id: "semaphore.events.queued" }),
3982
+ acquired: defineEvent({ id: "semaphore.events.acquired" }),
3983
+ released: defineEvent({ id: "semaphore.events.released" }),
3984
+ timeout: defineEvent({ id: "semaphore.events.timeout" }),
3985
+ aborted: defineEvent({ id: "semaphore.events.aborted" }),
3986
+ disposed: defineEvent({ id: "semaphore.events.disposed" })
3894
3987
  };
3895
3988
  var Semaphore = class {
3896
3989
  constructor(maxPermits) {
@@ -4163,7 +4256,7 @@ var concurrencyResource = defineResource({
4163
4256
  }), "init")
4164
4257
  });
4165
4258
  var concurrencyTaskMiddleware = defineTaskMiddleware({
4166
- id: "globals.middleware.concurrency",
4259
+ id: "globals.middleware.task.concurrency",
4167
4260
  dependencies: { state: concurrencyResource },
4168
4261
  async run({ task: task2, next }, { state }, config) {
4169
4262
  let semaphore = config.semaphore;
@@ -4242,14 +4335,16 @@ var RateLimitError = class extends Error {
4242
4335
  var journalKeys3 = {
4243
4336
  /** Number of remaining requests in the current window */
4244
4337
  remaining: journal.createKey(
4245
- "globals.middleware.rateLimit.remaining"
4338
+ "globals.middleware.task.rateLimit.remaining"
4246
4339
  ),
4247
4340
  /** Timestamp when the current window resets */
4248
4341
  resetTime: journal.createKey(
4249
- "globals.middleware.rateLimit.resetTime"
4342
+ "globals.middleware.task.rateLimit.resetTime"
4250
4343
  ),
4251
4344
  /** Maximum requests allowed per window */
4252
- limit: journal.createKey("globals.middleware.rateLimit.limit")
4345
+ limit: journal.createKey(
4346
+ "globals.middleware.task.rateLimit.limit"
4347
+ )
4253
4348
  };
4254
4349
  var rateLimitResource = defineResource({
4255
4350
  id: "globals.resources.rateLimit",
@@ -4261,7 +4356,7 @@ var rateLimitResource = defineResource({
4261
4356
  }, "init")
4262
4357
  });
4263
4358
  var rateLimitTaskMiddleware = defineTaskMiddleware({
4264
- id: "globals.middleware.rateLimit",
4359
+ id: "globals.middleware.task.rateLimit",
4265
4360
  configSchema: rateLimitConfigSchema,
4266
4361
  dependencies: { state: rateLimitResource },
4267
4362
  async run({ task: task2, next, journal: journal2 }, { state }, config) {
@@ -4309,7 +4404,7 @@ var temporalResource = defineResource({
4309
4404
  }, "init")
4310
4405
  });
4311
4406
  var debounceTaskMiddleware = defineTaskMiddleware({
4312
- id: "globals.middleware.debounce",
4407
+ id: "globals.middleware.task.debounce",
4313
4408
  dependencies: { state: temporalResource },
4314
4409
  async run({ task: task2, next }, { state }, config) {
4315
4410
  const { debounceStates } = state;
@@ -4346,7 +4441,7 @@ var debounceTaskMiddleware = defineTaskMiddleware({
4346
4441
  }
4347
4442
  });
4348
4443
  var throttleTaskMiddleware = defineTaskMiddleware({
4349
- id: "globals.middleware.throttle",
4444
+ id: "globals.middleware.task.throttle",
4350
4445
  dependencies: { state: temporalResource },
4351
4446
  async run({ task: task2, next }, { state }, config) {
4352
4447
  const { throttleStates } = state;
@@ -4418,12 +4513,12 @@ var throttleTaskMiddleware = defineTaskMiddleware({
4418
4513
 
4419
4514
  // src/models/Queue.ts
4420
4515
  var QueueEvents = {
4421
- enqueue: defineEvent({ id: "queue.enqueue" }),
4422
- start: defineEvent({ id: "queue.start" }),
4423
- finish: defineEvent({ id: "queue.finish" }),
4424
- error: defineEvent({ id: "queue.error" }),
4425
- cancel: defineEvent({ id: "queue.cancel" }),
4426
- disposed: defineEvent({ id: "queue.disposed" })
4516
+ enqueue: defineEvent({ id: "queue.events.enqueue" }),
4517
+ start: defineEvent({ id: "queue.events.start" }),
4518
+ finish: defineEvent({ id: "queue.events.finish" }),
4519
+ error: defineEvent({ id: "queue.events.error" }),
4520
+ cancel: defineEvent({ id: "queue.events.cancel" }),
4521
+ disposed: defineEvent({ id: "queue.events.disposed" })
4427
4522
  };
4428
4523
  var Queue = class {
4429
4524
  constructor() {
@@ -4582,6 +4677,7 @@ var TunnelError = class extends Error {
4582
4677
  this.name = "TunnelError";
4583
4678
  this.code = code;
4584
4679
  this.details = details;
4680
+ this.httpCode = extras?.httpCode;
4585
4681
  this.id = extras?.id;
4586
4682
  this.data = extras?.data;
4587
4683
  }
@@ -4596,6 +4692,7 @@ function toTunnelError(input, fallbackMessage) {
4596
4692
  const pe = input;
4597
4693
  const msg = pe.message || fallbackMessage || "Tunnel error";
4598
4694
  return new TunnelError(pe.code, msg, pe.details, {
4695
+ httpCode: pe.httpCode,
4599
4696
  id: pe.id,
4600
4697
  data: pe.data
4601
4698
  });
@@ -5243,13 +5340,15 @@ var retryResourceMiddleware = defineResourceMiddleware({
5243
5340
  var journalKeys6 = {
5244
5341
  /** Whether the fallback path was taken (true) or primary succeeded (false) */
5245
5342
  active: journal.createKey(
5246
- "globals.middleware.fallback.active"
5343
+ "globals.middleware.task.fallback.active"
5247
5344
  ),
5248
5345
  /** The error that triggered the fallback (only set when active is true) */
5249
- error: journal.createKey("globals.middleware.fallback.error")
5346
+ error: journal.createKey(
5347
+ "globals.middleware.task.fallback.error"
5348
+ )
5250
5349
  };
5251
5350
  var fallbackTaskMiddleware = defineTaskMiddleware({
5252
- id: "globals.middleware.fallback",
5351
+ id: "globals.middleware.task.fallback",
5253
5352
  dependencies: {
5254
5353
  taskRunner: globalResources.taskRunner
5255
5354
  },
@@ -7929,21 +8028,11 @@ var Store = class {
7929
8028
  storeGenericItem(item) {
7930
8029
  return this.registry.storeGenericItem(item);
7931
8030
  }
7932
- /**
7933
- * Returns all tasks with the given tag.
7934
- * @param tag - The tag to filter by.
7935
- * @returns The tasks with the given tag.
7936
- */
7937
8031
  getTasksWithTag(tag2) {
7938
- return this.registry.getTasksWithTag(tag2);
8032
+ return typeof tag2 === "string" ? this.registry.getTasksWithTag(tag2) : this.registry.getTasksWithTag(tag2);
7939
8033
  }
7940
- /**
7941
- * Returns all resources with the given tag.
7942
- * @param tag - The tag to filter by.
7943
- * @returns The resources with the given tag.
7944
- */
7945
8034
  getResourcesWithTag(tag2) {
7946
- return this.registry.getResourcesWithTag(tag2);
8035
+ return typeof tag2 === "string" ? this.registry.getResourcesWithTag(tag2) : this.registry.getResourcesWithTag(tag2);
7947
8036
  }
7948
8037
  };
7949
8038
 
@@ -10067,6 +10156,7 @@ exports.PlatformAdapter = PlatformAdapter;
10067
10156
  exports.Queue = Queue;
10068
10157
  exports.ResourceInitializer = ResourceInitializer;
10069
10158
  exports.RunResult = RunResult;
10159
+ exports.RunnerError = RunnerError;
10070
10160
  exports.Semaphore = Semaphore;
10071
10161
  exports.Serializer = Serializer;
10072
10162
  exports.Store = Store;