@pattern-stack/codegen 0.13.1 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/{job-orchestrator.protocol-CHOEqBDk.d.ts → job-orchestrator.protocol-CARhMLCO.d.ts} +1 -1
  2. package/dist/runtime/subsystems/analytics/analytics.module.js +6 -2
  3. package/dist/runtime/subsystems/analytics/analytics.module.js.map +1 -1
  4. package/dist/runtime/subsystems/analytics/analytics.tokens.d.ts +0 -11
  5. package/dist/runtime/subsystems/analytics/analytics.tokens.js +6 -2
  6. package/dist/runtime/subsystems/analytics/analytics.tokens.js.map +1 -1
  7. package/dist/runtime/subsystems/analytics/cube-backend.js +6 -2
  8. package/dist/runtime/subsystems/analytics/cube-backend.js.map +1 -1
  9. package/dist/runtime/subsystems/analytics/index.js +6 -2
  10. package/dist/runtime/subsystems/analytics/index.js.map +1 -1
  11. package/dist/runtime/subsystems/auth/auth.module.js +12 -6
  12. package/dist/runtime/subsystems/auth/auth.module.js.map +1 -1
  13. package/dist/runtime/subsystems/auth/auth.tokens.d.ts +0 -28
  14. package/dist/runtime/subsystems/auth/auth.tokens.js +12 -8
  15. package/dist/runtime/subsystems/auth/auth.tokens.js.map +1 -1
  16. package/dist/runtime/subsystems/auth/controllers/auth.controller.js +12 -5
  17. package/dist/runtime/subsystems/auth/controllers/auth.controller.js.map +1 -1
  18. package/dist/runtime/subsystems/auth/index.js +12 -8
  19. package/dist/runtime/subsystems/auth/index.js.map +1 -1
  20. package/dist/runtime/subsystems/auth/middleware/requester-context.js +12 -1
  21. package/dist/runtime/subsystems/auth/middleware/requester-context.js.map +1 -1
  22. package/dist/runtime/subsystems/bridge/bridge-delivery-handler.d.ts +1 -1
  23. package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js +10 -2
  24. package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js.map +1 -1
  25. package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.d.ts +1 -1
  26. package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js +2 -2
  27. package/dist/runtime/subsystems/bridge/bridge-delivery.memory-backend.js.map +1 -1
  28. package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js +10 -2
  29. package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js.map +1 -1
  30. package/dist/runtime/subsystems/bridge/bridge.module.d.ts +1 -1
  31. package/dist/runtime/subsystems/bridge/bridge.module.js +186 -168
  32. package/dist/runtime/subsystems/bridge/bridge.module.js.map +1 -1
  33. package/dist/runtime/subsystems/bridge/bridge.protocol.d.ts +1 -1
  34. package/dist/runtime/subsystems/bridge/event-flow.service.d.ts +1 -1
  35. package/dist/runtime/subsystems/bridge/event-flow.service.js +9 -1
  36. package/dist/runtime/subsystems/bridge/event-flow.service.js.map +1 -1
  37. package/dist/runtime/subsystems/bridge/index.d.ts +1 -1
  38. package/dist/runtime/subsystems/bridge/index.js +168 -150
  39. package/dist/runtime/subsystems/bridge/index.js.map +1 -1
  40. package/dist/runtime/subsystems/cache/cache.drizzle-backend.js +6 -1
  41. package/dist/runtime/subsystems/cache/cache.drizzle-backend.js.map +1 -1
  42. package/dist/runtime/subsystems/cache/cache.memory-backend.js +6 -1
  43. package/dist/runtime/subsystems/cache/cache.memory-backend.js.map +1 -1
  44. package/dist/runtime/subsystems/cache/cache.module.js +6 -2
  45. package/dist/runtime/subsystems/cache/cache.module.js.map +1 -1
  46. package/dist/runtime/subsystems/cache/cache.tokens.d.ts +0 -10
  47. package/dist/runtime/subsystems/cache/cache.tokens.js +6 -2
  48. package/dist/runtime/subsystems/cache/cache.tokens.js.map +1 -1
  49. package/dist/runtime/subsystems/cache/index.js +6 -2
  50. package/dist/runtime/subsystems/cache/index.js.map +1 -1
  51. package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js +5 -0
  52. package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js.map +1 -1
  53. package/dist/runtime/subsystems/events/event-bus.memory-backend.js +5 -0
  54. package/dist/runtime/subsystems/events/event-bus.memory-backend.js.map +1 -1
  55. package/dist/runtime/subsystems/events/event-bus.redis-backend.js +5 -1
  56. package/dist/runtime/subsystems/events/event-bus.redis-backend.js.map +1 -1
  57. package/dist/runtime/subsystems/events/events.module.js +5 -1
  58. package/dist/runtime/subsystems/events/events.module.js.map +1 -1
  59. package/dist/runtime/subsystems/events/events.tokens.d.ts +5 -11
  60. package/dist/runtime/subsystems/events/events.tokens.js +5 -1
  61. package/dist/runtime/subsystems/events/events.tokens.js.map +1 -1
  62. package/dist/runtime/subsystems/events/generated/bus.js +5 -0
  63. package/dist/runtime/subsystems/events/generated/bus.js.map +1 -1
  64. package/dist/runtime/subsystems/events/generated/index.js +5 -0
  65. package/dist/runtime/subsystems/events/generated/index.js.map +1 -1
  66. package/dist/runtime/subsystems/events/index.js +5 -1
  67. package/dist/runtime/subsystems/events/index.js.map +1 -1
  68. package/dist/runtime/subsystems/index.d.ts +2 -2
  69. package/dist/runtime/subsystems/index.js +186 -168
  70. package/dist/runtime/subsystems/index.js.map +1 -1
  71. package/dist/runtime/subsystems/jobs/bullmq.config.d.ts +0 -9
  72. package/dist/runtime/subsystems/jobs/bullmq.config.js +6 -2
  73. package/dist/runtime/subsystems/jobs/bullmq.config.js.map +1 -1
  74. package/dist/runtime/subsystems/jobs/index.d.ts +1 -1
  75. package/dist/runtime/subsystems/jobs/index.js +141 -124
  76. package/dist/runtime/subsystems/jobs/index.js.map +1 -1
  77. package/dist/runtime/subsystems/jobs/job-handler.base.d.ts +1 -1
  78. package/dist/runtime/subsystems/jobs/job-handler.base.js +5 -1
  79. package/dist/runtime/subsystems/jobs/job-handler.base.js.map +1 -1
  80. package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.d.ts +1 -1
  81. package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js +10 -3
  82. package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js.map +1 -1
  83. package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.d.ts +1 -1
  84. package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js +8 -1
  85. package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js.map +1 -1
  86. package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.d.ts +1 -1
  87. package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js +137 -7
  88. package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js.map +1 -1
  89. package/dist/runtime/subsystems/jobs/job-orchestrator.protocol.d.ts +1 -1
  90. package/dist/runtime/subsystems/jobs/job-run-keyset-cursor.d.ts +1 -1
  91. package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.d.ts +1 -1
  92. package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js +8 -2
  93. package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js.map +1 -1
  94. package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.d.ts +1 -1
  95. package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js +25 -2
  96. package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js.map +1 -1
  97. package/dist/runtime/subsystems/jobs/job-run-service.protocol.d.ts +1 -1
  98. package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js +25 -2
  99. package/dist/runtime/subsystems/jobs/job-step-service.memory-backend.js.map +1 -1
  100. package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.d.ts +1 -1
  101. package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js +5 -0
  102. package/dist/runtime/subsystems/jobs/job-worker.bullmq-backend.js.map +1 -1
  103. package/dist/runtime/subsystems/jobs/job-worker.d.ts +1 -1
  104. package/dist/runtime/subsystems/jobs/job-worker.js +10 -4
  105. package/dist/runtime/subsystems/jobs/job-worker.js.map +1 -1
  106. package/dist/runtime/subsystems/jobs/job-worker.module.d.ts +31 -3
  107. package/dist/runtime/subsystems/jobs/job-worker.module.js +163 -145
  108. package/dist/runtime/subsystems/jobs/job-worker.module.js.map +1 -1
  109. package/dist/runtime/subsystems/jobs/jobs-domain.module.js +144 -130
  110. package/dist/runtime/subsystems/jobs/jobs-domain.module.js.map +1 -1
  111. package/dist/runtime/subsystems/jobs/jobs-domain.tokens.d.ts +0 -11
  112. package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js +8 -4
  113. package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js.map +1 -1
  114. package/dist/runtime/subsystems/jobs/jobs-errors.d.ts +1 -1
  115. package/dist/runtime/subsystems/observability/index.d.ts +1 -1
  116. package/dist/runtime/subsystems/observability/index.js +9 -1
  117. package/dist/runtime/subsystems/observability/index.js.map +1 -1
  118. package/dist/runtime/subsystems/observability/observability.module.js +9 -1
  119. package/dist/runtime/subsystems/observability/observability.module.js.map +1 -1
  120. package/dist/runtime/subsystems/observability/observability.protocol.d.ts +1 -1
  121. package/dist/runtime/subsystems/observability/observability.service.d.ts +1 -1
  122. package/dist/runtime/subsystems/observability/observability.service.js +9 -1
  123. package/dist/runtime/subsystems/observability/observability.service.js.map +1 -1
  124. package/dist/runtime/subsystems/observability/reporters/bridge-metrics.reporter.d.ts +1 -1
  125. package/dist/runtime/subsystems/observability/reporters/index.d.ts +1 -1
  126. package/dist/runtime/subsystems/storage/index.js +5 -1
  127. package/dist/runtime/subsystems/storage/index.js.map +1 -1
  128. package/dist/runtime/subsystems/storage/storage.module.js +5 -1
  129. package/dist/runtime/subsystems/storage/storage.module.js.map +1 -1
  130. package/dist/runtime/subsystems/storage/storage.tokens.d.ts +0 -8
  131. package/dist/runtime/subsystems/storage/storage.tokens.js +5 -1
  132. package/dist/runtime/subsystems/storage/storage.tokens.js.map +1 -1
  133. package/dist/runtime/subsystems/token-key.d.ts +7 -0
  134. package/dist/runtime/subsystems/token-key.js +8 -0
  135. package/dist/runtime/subsystems/token-key.js.map +1 -0
  136. package/dist/src/cli/index.js +1160 -694
  137. package/dist/src/cli/index.js.map +1 -1
  138. package/package.json +5 -1
  139. package/runtime/subsystems/analytics/analytics.tokens.ts +6 -2
  140. package/runtime/subsystems/auth/auth.tokens.ts +15 -8
  141. package/runtime/subsystems/bridge/bridge-delivery.memory-backend.ts +8 -1
  142. package/runtime/subsystems/cache/cache.tokens.ts +7 -2
  143. package/runtime/subsystems/events/events.tokens.ts +8 -1
  144. package/runtime/subsystems/index.ts +5 -1
  145. package/runtime/subsystems/jobs/bullmq.config.ts +5 -2
  146. package/runtime/subsystems/jobs/job-handler.base.ts +6 -1
  147. package/runtime/subsystems/jobs/job-orchestrator.memory-backend.ts +8 -3
  148. package/runtime/subsystems/jobs/job-run-service.memory-backend.ts +4 -1
  149. package/runtime/subsystems/jobs/job-step-service.memory-backend.ts +7 -2
  150. package/runtime/subsystems/jobs/job-worker.module.ts +18 -2
  151. package/runtime/subsystems/jobs/job-worker.ts +4 -1
  152. package/runtime/subsystems/jobs/jobs-domain.tokens.ts +10 -7
  153. package/runtime/subsystems/storage/storage.tokens.ts +6 -1
  154. package/runtime/subsystems/token-key.ts +7 -0
  155. package/src/config/runtime-mode.mjs +82 -0
  156. package/templates/entity/new/backend/modules/core/integration-source.ejs.t +3 -2
  157. package/templates/entity/new/clean-lite-ps/controller.ejs.t +1 -1
  158. package/templates/entity/new/clean-lite-ps/module.ejs.t +1 -1
  159. package/templates/entity/new/clean-lite-ps/prompt-extension.js +8 -2
  160. package/templates/entity/new/clean-lite-ps/repository.ejs.t +4 -4
  161. package/templates/entity/new/clean-lite-ps/service.ejs.t +4 -4
  162. package/templates/entity/new/prompt.js +49 -10
@@ -12,19 +12,24 @@ var __decorateParam = (index4, decorator) => (target, key2) => decorator(target,
12
12
 
13
13
  // runtime/subsystems/bridge/bridge.module.ts
14
14
  import {
15
- Inject as Inject12,
15
+ Inject as Inject13,
16
16
  Module as Module3,
17
17
  Optional as Optional7
18
18
  } from "@nestjs/common";
19
19
 
20
20
  // runtime/subsystems/jobs/job-worker.module.ts
21
21
  import {
22
- Inject as Inject7,
22
+ Inject as Inject8,
23
23
  Injectable as Injectable8,
24
24
  Logger as Logger4,
25
25
  Module as Module2,
26
26
  Optional as Optional2
27
27
  } from "@nestjs/common";
28
+ import { ModuleRef as ModuleRef2 } from "@nestjs/core";
29
+
30
+ // runtime/subsystems/token-key.ts
31
+ var PKG = "@pattern-stack/codegen";
32
+ var tokenKey = (area, name) => `${PKG}.${area}.${name}`;
28
33
 
29
34
  // runtime/constants/tokens.ts
30
35
  var DRIZZLE = "DRIZZLE";
@@ -33,7 +38,7 @@ var DRIZZLE = "DRIZZLE";
33
38
  var JobHandlerBase = class {
34
39
  };
35
40
  var JOB_HANDLER_REGISTRY = /* @__PURE__ */ new Map();
36
- var JOB_HANDLER_METADATA_KEY = /* @__PURE__ */ Symbol("JobHandlerMeta");
41
+ var JOB_HANDLER_METADATA_KEY = Symbol.for(tokenKey("jobs", "handler-metadata"));
37
42
  function JobHandler(type, meta) {
38
43
  return (target) => {
39
44
  if (JOB_HANDLER_REGISTRY.has(type)) {
@@ -73,10 +78,10 @@ var HandlerRegistry;
73
78
  import { Module } from "@nestjs/common";
74
79
 
75
80
  // runtime/subsystems/jobs/jobs-domain.tokens.ts
76
- var JOB_ORCHESTRATOR = /* @__PURE__ */ Symbol("JOB_ORCHESTRATOR");
77
- var JOB_RUN_SERVICE = /* @__PURE__ */ Symbol("JOB_RUN_SERVICE");
78
- var JOB_STEP_SERVICE = /* @__PURE__ */ Symbol("JOB_STEP_SERVICE");
79
- var JOBS_MULTI_TENANT = /* @__PURE__ */ Symbol("JOBS_MULTI_TENANT");
81
+ var JOB_ORCHESTRATOR = Symbol.for(tokenKey("jobs", "orchestrator"));
82
+ var JOB_RUN_SERVICE = Symbol.for(tokenKey("jobs", "run-service"));
83
+ var JOB_STEP_SERVICE = Symbol.for(tokenKey("jobs", "step-service"));
84
+ var JOBS_MULTI_TENANT = Symbol.for(tokenKey("jobs", "multi-tenant"));
80
85
 
81
86
  // runtime/subsystems/jobs/job-orchestrator.drizzle-backend.ts
82
87
  import { randomUUID } from "crypto";
@@ -912,8 +917,129 @@ DrizzleJobStepService = __decorateClass([
912
917
  ], DrizzleJobStepService);
913
918
 
914
919
  // runtime/subsystems/jobs/job-orchestrator.memory-backend.ts
920
+ import { randomUUID as randomUUID3 } from "crypto";
921
+ import { Inject as Inject5, Injectable as Injectable5, Logger as Logger2, Optional } from "@nestjs/common";
922
+ import { ModuleRef } from "@nestjs/core";
923
+
924
+ // runtime/subsystems/jobs/memory-job-store.ts
925
+ var MemoryJobStore = class {
926
+ /** Runs keyed by `id` (single source of truth for status/scope/lineage). */
927
+ runs = /* @__PURE__ */ new Map();
928
+ /** Steps keyed by `job_run_id`; array order matches insertion order. */
929
+ steps = /* @__PURE__ */ new Map();
930
+ /** Job definitions keyed by `type` — memory mirror of the `job` table. */
931
+ jobs = /* @__PURE__ */ new Map();
932
+ /** Reset everything. Tests call this in `beforeEach`. */
933
+ clear() {
934
+ this.runs.clear();
935
+ this.steps.clear();
936
+ this.jobs.clear();
937
+ }
938
+ };
939
+
940
+ // runtime/subsystems/jobs/job-step-service.memory-backend.ts
915
941
  import { randomUUID as randomUUID2 } from "crypto";
916
- import { Inject as Inject4, Injectable as Injectable4, Logger as Logger2, Optional } from "@nestjs/common";
942
+ import { Inject as Inject4, Injectable as Injectable4 } from "@nestjs/common";
943
+ var MemoryJobStepService = class {
944
+ // ADR-037 (package-mode DI): explicit `@Inject(MemoryJobStore)` — the
945
+ // published bundle carries no `design:paramtypes`, so a by-type inject
946
+ // would resolve to `undefined` in package mode.
947
+ constructor(store) {
948
+ this.store = store;
949
+ }
950
+ store;
951
+ async findStep(runId, stepId) {
952
+ const rows = this.store.steps.get(runId);
953
+ if (!rows) return null;
954
+ const match = rows.find(
955
+ (r) => r.stepId === stepId && r.status === "completed"
956
+ );
957
+ return match ?? null;
958
+ }
959
+ async recordStep(input) {
960
+ const rows = this.getOrCreateRows(input.jobRunId);
961
+ const existingIdx = rows.findIndex((r) => r.stepId === input.stepId);
962
+ const normalisedInput = input.input ?? null;
963
+ const normalisedOutput = input.output ?? null;
964
+ if (existingIdx >= 0) {
965
+ const prev = rows[existingIdx];
966
+ const next = {
967
+ ...prev,
968
+ status: input.status,
969
+ input: normalisedInput ?? prev.input,
970
+ output: normalisedOutput ?? prev.output,
971
+ error: input.error ?? prev.error,
972
+ attempts: input.attempts ?? prev.attempts,
973
+ startedAt: input.startedAt ?? prev.startedAt,
974
+ finishedAt: input.finishedAt ?? prev.finishedAt
975
+ };
976
+ rows[existingIdx] = next;
977
+ return next;
978
+ }
979
+ const seq = input.seq ?? this.nextSeq(rows);
980
+ const row = {
981
+ id: randomUUID2(),
982
+ jobRunId: input.jobRunId,
983
+ stepId: input.stepId,
984
+ kind: input.kind,
985
+ seq,
986
+ status: input.status,
987
+ input: normalisedInput,
988
+ output: normalisedOutput,
989
+ error: input.error ?? null,
990
+ attempts: input.attempts ?? 0,
991
+ startedAt: input.startedAt ?? null,
992
+ finishedAt: input.finishedAt ?? null
993
+ };
994
+ rows.push(row);
995
+ return row;
996
+ }
997
+ /**
998
+ * Replay helper — wipe every step row for a run. Mirrors the `scratch`
999
+ * replay mode of the Drizzle backend (`DELETE FROM job_step WHERE job_run_id = …`).
1000
+ */
1001
+ clearStepsForRun(runId) {
1002
+ this.store.steps.delete(runId);
1003
+ }
1004
+ /**
1005
+ * Remove every non-`completed` row for the run. Memoized (`completed`)
1006
+ * rows are preserved — this is the `last_checkpoint` / `last_step`
1007
+ * semantics the Drizzle backend implements via
1008
+ * `DELETE … WHERE status != 'completed'`. Both replay modes route here
1009
+ * (Phase 1 collapses `last_step` onto this behaviour; see JOB-3 notes).
1010
+ */
1011
+ clearIncompleteSteps(runId) {
1012
+ const rows = this.store.steps.get(runId);
1013
+ if (!rows) return;
1014
+ const kept = rows.filter((r) => r.status === "completed");
1015
+ if (kept.length === 0) {
1016
+ this.store.steps.delete(runId);
1017
+ } else {
1018
+ this.store.steps.set(runId, kept);
1019
+ }
1020
+ }
1021
+ getOrCreateRows(runId) {
1022
+ let rows = this.store.steps.get(runId);
1023
+ if (!rows) {
1024
+ rows = [];
1025
+ this.store.steps.set(runId, rows);
1026
+ }
1027
+ return rows;
1028
+ }
1029
+ nextSeq(rows) {
1030
+ let max = 0;
1031
+ for (const r of rows) {
1032
+ if (r.seq > max) max = r.seq;
1033
+ }
1034
+ return max + 1;
1035
+ }
1036
+ };
1037
+ MemoryJobStepService = __decorateClass([
1038
+ Injectable4(),
1039
+ __decorateParam(0, Inject4(MemoryJobStore))
1040
+ ], MemoryJobStepService);
1041
+
1042
+ // runtime/subsystems/jobs/job-orchestrator.memory-backend.ts
917
1043
  var QUEUED_RUN_AT = /* @__PURE__ */ new Date(864e13);
918
1044
  var TERMINAL_STATUSES2 = [
919
1045
  "completed",
@@ -1084,7 +1210,7 @@ var MemoryJobOrchestrator = class {
1084
1210
  }
1085
1211
  }
1086
1212
  }
1087
- const newId = randomUUID2();
1213
+ const newId = randomUUID3();
1088
1214
  let rootRunId = newId;
1089
1215
  if (opts.parentRunId) {
1090
1216
  const parent = this.store.runs.get(opts.parentRunId);
@@ -1482,9 +1608,12 @@ var MemoryJobOrchestrator = class {
1482
1608
  }
1483
1609
  };
1484
1610
  MemoryJobOrchestrator = __decorateClass([
1485
- Injectable4(),
1486
- __decorateParam(2, Inject4(JOBS_MULTI_TENANT)),
1487
- __decorateParam(3, Optional())
1611
+ Injectable5(),
1612
+ __decorateParam(0, Inject5(MemoryJobStore)),
1613
+ __decorateParam(1, Inject5(MemoryJobStepService)),
1614
+ __decorateParam(2, Inject5(JOBS_MULTI_TENANT)),
1615
+ __decorateParam(3, Optional()),
1616
+ __decorateParam(3, Inject5(ModuleRef))
1488
1617
  ], MemoryJobOrchestrator);
1489
1618
  function classifyError(err, policy, currentAttempts) {
1490
1619
  if (!policy) return "fail";
@@ -1518,7 +1647,7 @@ function serialiseError(err, attempt, retryable) {
1518
1647
  }
1519
1648
 
1520
1649
  // runtime/subsystems/jobs/job-run-service.memory-backend.ts
1521
- import { Inject as Inject5, Injectable as Injectable5 } from "@nestjs/common";
1650
+ import { Inject as Inject6, Injectable as Injectable6 } from "@nestjs/common";
1522
1651
  var NON_TERMINAL_STATUSES2 = [
1523
1652
  "pending",
1524
1653
  "running",
@@ -1685,9 +1814,10 @@ var MemoryJobRunService = class {
1685
1814
  }
1686
1815
  };
1687
1816
  MemoryJobRunService = __decorateClass([
1688
- Injectable5(),
1689
- __decorateParam(1, Inject5(JOB_ORCHESTRATOR)),
1690
- __decorateParam(2, Inject5(JOBS_MULTI_TENANT))
1817
+ Injectable6(),
1818
+ __decorateParam(0, Inject6(MemoryJobStore)),
1819
+ __decorateParam(1, Inject6(JOB_ORCHESTRATOR)),
1820
+ __decorateParam(2, Inject6(JOBS_MULTI_TENANT))
1691
1821
  ], MemoryJobRunService);
1692
1822
  function compareBy(a, b, order) {
1693
1823
  switch (order) {
@@ -1703,120 +1833,6 @@ function compareBy(a, b, order) {
1703
1833
  }
1704
1834
  }
1705
1835
 
1706
- // runtime/subsystems/jobs/job-step-service.memory-backend.ts
1707
- import { randomUUID as randomUUID3 } from "crypto";
1708
- import { Injectable as Injectable6 } from "@nestjs/common";
1709
- var MemoryJobStepService = class {
1710
- constructor(store) {
1711
- this.store = store;
1712
- }
1713
- store;
1714
- async findStep(runId, stepId) {
1715
- const rows = this.store.steps.get(runId);
1716
- if (!rows) return null;
1717
- const match = rows.find(
1718
- (r) => r.stepId === stepId && r.status === "completed"
1719
- );
1720
- return match ?? null;
1721
- }
1722
- async recordStep(input) {
1723
- const rows = this.getOrCreateRows(input.jobRunId);
1724
- const existingIdx = rows.findIndex((r) => r.stepId === input.stepId);
1725
- const normalisedInput = input.input ?? null;
1726
- const normalisedOutput = input.output ?? null;
1727
- if (existingIdx >= 0) {
1728
- const prev = rows[existingIdx];
1729
- const next = {
1730
- ...prev,
1731
- status: input.status,
1732
- input: normalisedInput ?? prev.input,
1733
- output: normalisedOutput ?? prev.output,
1734
- error: input.error ?? prev.error,
1735
- attempts: input.attempts ?? prev.attempts,
1736
- startedAt: input.startedAt ?? prev.startedAt,
1737
- finishedAt: input.finishedAt ?? prev.finishedAt
1738
- };
1739
- rows[existingIdx] = next;
1740
- return next;
1741
- }
1742
- const seq = input.seq ?? this.nextSeq(rows);
1743
- const row = {
1744
- id: randomUUID3(),
1745
- jobRunId: input.jobRunId,
1746
- stepId: input.stepId,
1747
- kind: input.kind,
1748
- seq,
1749
- status: input.status,
1750
- input: normalisedInput,
1751
- output: normalisedOutput,
1752
- error: input.error ?? null,
1753
- attempts: input.attempts ?? 0,
1754
- startedAt: input.startedAt ?? null,
1755
- finishedAt: input.finishedAt ?? null
1756
- };
1757
- rows.push(row);
1758
- return row;
1759
- }
1760
- /**
1761
- * Replay helper — wipe every step row for a run. Mirrors the `scratch`
1762
- * replay mode of the Drizzle backend (`DELETE FROM job_step WHERE job_run_id = …`).
1763
- */
1764
- clearStepsForRun(runId) {
1765
- this.store.steps.delete(runId);
1766
- }
1767
- /**
1768
- * Remove every non-`completed` row for the run. Memoized (`completed`)
1769
- * rows are preserved — this is the `last_checkpoint` / `last_step`
1770
- * semantics the Drizzle backend implements via
1771
- * `DELETE … WHERE status != 'completed'`. Both replay modes route here
1772
- * (Phase 1 collapses `last_step` onto this behaviour; see JOB-3 notes).
1773
- */
1774
- clearIncompleteSteps(runId) {
1775
- const rows = this.store.steps.get(runId);
1776
- if (!rows) return;
1777
- const kept = rows.filter((r) => r.status === "completed");
1778
- if (kept.length === 0) {
1779
- this.store.steps.delete(runId);
1780
- } else {
1781
- this.store.steps.set(runId, kept);
1782
- }
1783
- }
1784
- getOrCreateRows(runId) {
1785
- let rows = this.store.steps.get(runId);
1786
- if (!rows) {
1787
- rows = [];
1788
- this.store.steps.set(runId, rows);
1789
- }
1790
- return rows;
1791
- }
1792
- nextSeq(rows) {
1793
- let max = 0;
1794
- for (const r of rows) {
1795
- if (r.seq > max) max = r.seq;
1796
- }
1797
- return max + 1;
1798
- }
1799
- };
1800
- MemoryJobStepService = __decorateClass([
1801
- Injectable6()
1802
- ], MemoryJobStepService);
1803
-
1804
- // runtime/subsystems/jobs/memory-job-store.ts
1805
- var MemoryJobStore = class {
1806
- /** Runs keyed by `id` (single source of truth for status/scope/lineage). */
1807
- runs = /* @__PURE__ */ new Map();
1808
- /** Steps keyed by `job_run_id`; array order matches insertion order. */
1809
- steps = /* @__PURE__ */ new Map();
1810
- /** Job definitions keyed by `type` — memory mirror of the `job` table. */
1811
- jobs = /* @__PURE__ */ new Map();
1812
- /** Reset everything. Tests call this in `beforeEach`. */
1813
- clear() {
1814
- this.runs.clear();
1815
- this.steps.clear();
1816
- this.jobs.clear();
1817
- }
1818
- };
1819
-
1820
1836
  // runtime/subsystems/jobs/pool-config.loader.ts
1821
1837
  import { existsSync, readFileSync } from "fs";
1822
1838
  import { resolve } from "path";
@@ -1940,8 +1956,8 @@ function extractUserPools(raw) {
1940
1956
  }
1941
1957
 
1942
1958
  // runtime/subsystems/jobs/bullmq.config.ts
1943
- var BULLMQ_CONNECTION = /* @__PURE__ */ Symbol("BULLMQ_CONNECTION");
1944
- var BULLMQ_RESOLVED_CONFIG = /* @__PURE__ */ Symbol("BULLMQ_RESOLVED_CONFIG");
1959
+ var BULLMQ_CONNECTION = Symbol.for(tokenKey("jobs", "bullmq-connection"));
1960
+ var BULLMQ_RESOLVED_CONFIG = Symbol.for(tokenKey("jobs", "bullmq-resolved-config"));
1945
1961
  var DEFAULT_REDIS_URL = "redis://localhost:6379";
1946
1962
  var DEFAULT_BULL_BOARD_MOUNT = "/admin/queues";
1947
1963
  function resolveBullMqConfig(ext) {
@@ -2032,9 +2048,9 @@ JobsDomainModule = __decorateClass([
2032
2048
  ], JobsDomainModule);
2033
2049
 
2034
2050
  // runtime/subsystems/jobs/job-worker.ts
2035
- import { Inject as Inject6, Injectable as Injectable7, Logger as Logger3 } from "@nestjs/common";
2051
+ import { Inject as Inject7, Injectable as Injectable7, Logger as Logger3 } from "@nestjs/common";
2036
2052
  import { and as and4, asc as asc2, desc as desc3, eq as eq4, inArray as inArray3, lt as lt2, lte, sql as sql4 } from "drizzle-orm";
2037
- var JOB_WORKER_OPTIONS = /* @__PURE__ */ Symbol("JOB_WORKER_OPTIONS");
2053
+ var JOB_WORKER_OPTIONS = Symbol.for(tokenKey("jobs", "worker-options"));
2038
2054
  var DEFAULT_POLL_INTERVAL_MS = 1e3;
2039
2055
  var DEFAULT_STALE_SWEEPER_INTERVAL_MS = 6e4;
2040
2056
  var DEFAULT_STALE_THRESHOLD_MS = 5 * 6e4;
@@ -2419,16 +2435,16 @@ var JobWorker = class {
2419
2435
  };
2420
2436
  JobWorker = __decorateClass([
2421
2437
  Injectable7(),
2422
- __decorateParam(0, Inject6(DRIZZLE)),
2423
- __decorateParam(1, Inject6(JOB_ORCHESTRATOR)),
2424
- __decorateParam(2, Inject6(JOB_RUN_SERVICE)),
2425
- __decorateParam(3, Inject6(JOB_STEP_SERVICE)),
2426
- __decorateParam(4, Inject6(JOB_WORKER_OPTIONS))
2438
+ __decorateParam(0, Inject7(DRIZZLE)),
2439
+ __decorateParam(1, Inject7(JOB_ORCHESTRATOR)),
2440
+ __decorateParam(2, Inject7(JOB_RUN_SERVICE)),
2441
+ __decorateParam(3, Inject7(JOB_STEP_SERVICE)),
2442
+ __decorateParam(4, Inject7(JOB_WORKER_OPTIONS))
2427
2443
  ], JobWorker);
2428
2444
 
2429
2445
  // runtime/subsystems/jobs/job-worker.module.ts
2430
2446
  var DEFAULT_SHUTDOWN_TIMEOUT_MS2 = 3e4;
2431
- var JOB_WORKER_MODULE_OPTIONS = /* @__PURE__ */ Symbol("JOB_WORKER_MODULE_OPTIONS");
2447
+ var JOB_WORKER_MODULE_OPTIONS = Symbol.for(tokenKey("jobs", "worker-module-options"));
2432
2448
  var JobWorkerOrchestrator = class {
2433
2449
  constructor(orchestrator, runService, stepService, options, db = null, moduleRef, bullConnection = null, bullConfig = null) {
2434
2450
  this.orchestrator = orchestrator;
@@ -2621,16 +2637,17 @@ var JobWorkerOrchestrator = class {
2621
2637
  };
2622
2638
  JobWorkerOrchestrator = __decorateClass([
2623
2639
  Injectable8(),
2624
- __decorateParam(0, Inject7(JOB_ORCHESTRATOR)),
2625
- __decorateParam(1, Inject7(JOB_RUN_SERVICE)),
2626
- __decorateParam(2, Inject7(JOB_STEP_SERVICE)),
2627
- __decorateParam(3, Inject7(JOB_WORKER_MODULE_OPTIONS)),
2640
+ __decorateParam(0, Inject8(JOB_ORCHESTRATOR)),
2641
+ __decorateParam(1, Inject8(JOB_RUN_SERVICE)),
2642
+ __decorateParam(2, Inject8(JOB_STEP_SERVICE)),
2643
+ __decorateParam(3, Inject8(JOB_WORKER_MODULE_OPTIONS)),
2628
2644
  __decorateParam(4, Optional2()),
2629
- __decorateParam(4, Inject7(DRIZZLE)),
2645
+ __decorateParam(4, Inject8(DRIZZLE)),
2646
+ __decorateParam(5, Inject8(ModuleRef2)),
2630
2647
  __decorateParam(6, Optional2()),
2631
- __decorateParam(6, Inject7(BULLMQ_CONNECTION)),
2648
+ __decorateParam(6, Inject8(BULLMQ_CONNECTION)),
2632
2649
  __decorateParam(7, Optional2()),
2633
- __decorateParam(7, Inject7(BULLMQ_RESOLVED_CONFIG))
2650
+ __decorateParam(7, Inject8(BULLMQ_RESOLVED_CONFIG))
2634
2651
  ], JobWorkerOrchestrator);
2635
2652
  var JobWorkerModule = class {
2636
2653
  static forRoot(opts) {
@@ -2770,11 +2787,11 @@ var MemoryBridgeDeliveryRepo = class {
2770
2787
  * Unlike `insertDelivery`, this read does NOT call `assertTenantId`:
2771
2788
  * `tenantId === undefined` is the supported cross-tenant admin view.
2772
2789
  */
2773
- async getStatusHistogram(windowHours, tenantId) {
2790
+ async getStatusHistogram(windowHours, tenantId, nowMs = Date.now()) {
2774
2791
  if (!Number.isFinite(windowHours) || windowHours <= 0) {
2775
2792
  throw new RangeError("windowHours must be positive");
2776
2793
  }
2777
- const cutoffMs = Date.now() - windowHours * 36e5;
2794
+ const cutoffMs = nowMs - windowHours * 36e5;
2778
2795
  const histogram = {
2779
2796
  pending: 0,
2780
2797
  delivered: 0,
@@ -2816,7 +2833,7 @@ var MemoryBridgeDeliveryRepo = class {
2816
2833
  };
2817
2834
 
2818
2835
  // runtime/subsystems/bridge/bridge-delivery.drizzle-backend.ts
2819
- import { Inject as Inject8, Injectable as Injectable9, Optional as Optional3 } from "@nestjs/common";
2836
+ import { Inject as Inject9, Injectable as Injectable9, Optional as Optional3 } from "@nestjs/common";
2820
2837
  import { eq as eq5, and as and5, gte as gte2, isNull as isNull2, sql as sql7 } from "drizzle-orm";
2821
2838
 
2822
2839
  // runtime/subsystems/bridge/bridge-delivery.schema.ts
@@ -3076,20 +3093,21 @@ var DrizzleBridgeDeliveryRepo = class {
3076
3093
  };
3077
3094
  DrizzleBridgeDeliveryRepo = __decorateClass([
3078
3095
  Injectable9(),
3079
- __decorateParam(0, Inject8(DRIZZLE)),
3096
+ __decorateParam(0, Inject9(DRIZZLE)),
3080
3097
  __decorateParam(1, Optional3()),
3081
- __decorateParam(1, Inject8(BRIDGE_MULTI_TENANT))
3098
+ __decorateParam(1, Inject9(BRIDGE_MULTI_TENANT))
3082
3099
  ], DrizzleBridgeDeliveryRepo);
3083
3100
 
3084
3101
  // runtime/subsystems/bridge/bridge-outbox-drain-hook.ts
3085
- import { Inject as Inject10, Injectable as Injectable11, Logger as Logger6, Optional as Optional5 } from "@nestjs/common";
3102
+ import { Inject as Inject11, Injectable as Injectable11, Logger as Logger6, Optional as Optional5 } from "@nestjs/common";
3086
3103
  import { randomUUID as randomUUID5 } from "crypto";
3087
3104
 
3088
3105
  // runtime/subsystems/bridge/bridge-delivery-handler.ts
3089
- import { Inject as Inject9, Injectable as Injectable10, Logger as Logger5, Optional as Optional4 } from "@nestjs/common";
3106
+ import { Inject as Inject10, Injectable as Injectable10, Logger as Logger5, Optional as Optional4 } from "@nestjs/common";
3090
3107
 
3091
3108
  // runtime/subsystems/events/events.tokens.ts
3092
3109
  var EVENT_BUS = "EVENT_BUS";
3110
+ var REDIS_URL = Symbol.for(tokenKey("events", "redis-url"));
3093
3111
 
3094
3112
  // runtime/subsystems/bridge/bridge-delivery-handler.ts
3095
3113
  var BRIDGE_DELIVERY_JOB_TYPE = "@framework/bridge_delivery";
@@ -3175,12 +3193,12 @@ BridgeDeliveryHandler = __decorateClass([
3175
3193
  retry: { attempts: 3, backoff: "exponential", baseMs: 250 },
3176
3194
  replayFrom: "last_step"
3177
3195
  }),
3178
- __decorateParam(0, Inject9(BRIDGE_DELIVERY_REPO)),
3179
- __decorateParam(1, Inject9(JOB_ORCHESTRATOR)),
3180
- __decorateParam(2, Inject9(EVENT_BUS)),
3181
- __decorateParam(3, Inject9(BRIDGE_REGISTRY)),
3196
+ __decorateParam(0, Inject10(BRIDGE_DELIVERY_REPO)),
3197
+ __decorateParam(1, Inject10(JOB_ORCHESTRATOR)),
3198
+ __decorateParam(2, Inject10(EVENT_BUS)),
3199
+ __decorateParam(3, Inject10(BRIDGE_REGISTRY)),
3182
3200
  __decorateParam(4, Optional4()),
3183
- __decorateParam(4, Inject9(BRIDGE_MULTI_TENANT))
3201
+ __decorateParam(4, Inject10(BRIDGE_MULTI_TENANT))
3184
3202
  ], BridgeDeliveryHandler);
3185
3203
 
3186
3204
  // runtime/subsystems/bridge/bridge-outbox-drain-hook.ts
@@ -3289,11 +3307,11 @@ var BridgeOutboxDrainHook = class {
3289
3307
  BridgeOutboxDrainHook = __decorateClass([
3290
3308
  Injectable11(),
3291
3309
  __decorateParam(0, Optional5()),
3292
- __decorateParam(0, Inject10(BRIDGE_REGISTRY))
3310
+ __decorateParam(0, Inject11(BRIDGE_REGISTRY))
3293
3311
  ], BridgeOutboxDrainHook);
3294
3312
 
3295
3313
  // runtime/subsystems/bridge/event-flow.service.ts
3296
- import { Inject as Inject11, Injectable as Injectable12, Optional as Optional6 } from "@nestjs/common";
3314
+ import { Inject as Inject12, Injectable as Injectable12, Optional as Optional6 } from "@nestjs/common";
3297
3315
  var EventFlowService = class {
3298
3316
  constructor(db, eventBus, orchestrator, bridgeRepo, registry = {}, multiTenant = false) {
3299
3317
  this.db = db;
@@ -3365,14 +3383,14 @@ var EventFlowService = class {
3365
3383
  };
3366
3384
  EventFlowService = __decorateClass([
3367
3385
  Injectable12(),
3368
- __decorateParam(0, Inject11(DRIZZLE)),
3369
- __decorateParam(1, Inject11(EVENT_BUS)),
3370
- __decorateParam(2, Inject11(JOB_ORCHESTRATOR)),
3371
- __decorateParam(3, Inject11(BRIDGE_DELIVERY_REPO)),
3386
+ __decorateParam(0, Inject12(DRIZZLE)),
3387
+ __decorateParam(1, Inject12(EVENT_BUS)),
3388
+ __decorateParam(2, Inject12(JOB_ORCHESTRATOR)),
3389
+ __decorateParam(3, Inject12(BRIDGE_DELIVERY_REPO)),
3372
3390
  __decorateParam(4, Optional6()),
3373
- __decorateParam(4, Inject11(BRIDGE_REGISTRY)),
3391
+ __decorateParam(4, Inject12(BRIDGE_REGISTRY)),
3374
3392
  __decorateParam(5, Optional6()),
3375
- __decorateParam(5, Inject11(BRIDGE_MULTI_TENANT))
3393
+ __decorateParam(5, Inject12(BRIDGE_MULTI_TENANT))
3376
3394
  ], EventFlowService);
3377
3395
 
3378
3396
  // runtime/subsystems/bridge/generated/registry.ts
@@ -3451,7 +3469,7 @@ var BridgeModule = class {
3451
3469
  BridgeModule = __decorateClass([
3452
3470
  Module3({}),
3453
3471
  __decorateParam(0, Optional7()),
3454
- __decorateParam(0, Inject12(JOB_WORKER_MODULE_OPTIONS))
3472
+ __decorateParam(0, Inject13(JOB_WORKER_MODULE_OPTIONS))
3455
3473
  ], BridgeModule);
3456
3474
  export {
3457
3475
  BridgeModule