@pattern-stack/codegen 0.15.3 → 0.16.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.
- package/CHANGELOG.md +48 -0
- package/dist/{chunk-GCYKMF22.js → chunk-24WXSC3C.js} +6 -6
- package/dist/{chunk-O37C3YE6.js → chunk-3RWMQC3K.js} +23 -17
- package/dist/chunk-3RWMQC3K.js.map +1 -0
- package/dist/{chunk-4JLJYWJC.js → chunk-4PFF3ED4.js} +98 -10
- package/dist/chunk-4PFF3ED4.js.map +1 -0
- package/dist/{chunk-32BMMV4H.js → chunk-5RT7JGKT.js} +5 -5
- package/dist/{chunk-RDVTWIYY.js → chunk-BHZP6LOV.js} +8 -8
- package/dist/{chunk-4MVGAMUA.js → chunk-BK5ICA2F.js} +4 -4
- package/dist/{chunk-4RFHUZXU.js → chunk-BULPAAD3.js} +2 -2
- package/dist/{chunk-IYNSRIGR.js → chunk-CEWLVVAH.js} +6 -6
- package/dist/{chunk-27ETSJ2X.js → chunk-COGHTKXY.js} +2 -2
- package/dist/{chunk-J7JMVS2B.js → chunk-DKKFTHHI.js} +4 -4
- package/dist/{chunk-YTN6BKWA.js → chunk-DRCLNYH7.js} +7 -7
- package/dist/{chunk-TNXH7BJS.js → chunk-E45CSC33.js} +2 -2
- package/dist/{chunk-L7BNNRGI.js → chunk-EBKVKN75.js} +26 -6
- package/dist/chunk-EBKVKN75.js.map +1 -0
- package/dist/{chunk-EOLLMEAH.js → chunk-EJBK7I4F.js} +3 -3
- package/dist/chunk-EJBK7I4F.js.map +1 -0
- package/dist/{chunk-K2I6XIK5.js → chunk-KSTZIULO.js} +4 -4
- package/dist/{chunk-Z7PQCAVK.js → chunk-LQ6PYFU6.js} +4 -4
- package/dist/chunk-MYQIQ27N.js +118 -0
- package/dist/chunk-MYQIQ27N.js.map +1 -0
- package/dist/{chunk-5Y7W3XR6.js → chunk-OTR44OH6.js} +24 -5
- package/dist/chunk-OTR44OH6.js.map +1 -0
- package/dist/{chunk-4H3PETLM.js → chunk-RUYLXR5F.js} +15 -12
- package/dist/chunk-RUYLXR5F.js.map +1 -0
- package/dist/{chunk-7YGORYZD.js → chunk-T6C4LFLC.js} +4 -4
- package/dist/{chunk-OGIZXGPY.js → chunk-TDEHU73T.js} +4 -4
- package/dist/{chunk-FBGHYQIZ.js → chunk-VNBC3VXM.js} +5 -5
- package/dist/{chunk-YPWODKD5.js → chunk-W2UIDI3R.js} +5 -5
- package/dist/chunk-W4HOHZVF.js +1 -0
- package/dist/{chunk-RC23QROE.js → chunk-XDIIVIIK.js} +79 -5
- package/dist/chunk-XDIIVIIK.js.map +1 -0
- package/dist/{chunk-DCCZB4UC.js → chunk-XWBK3XJK.js} +4 -4
- package/dist/{chunk-SR7F3TJY.js → chunk-YK5JEVLX.js} +4 -4
- package/dist/{chunk-BIO6F7YI.js → chunk-ZPL74UQN.js} +4 -2
- package/dist/{chunk-BIO6F7YI.js.map → chunk-ZPL74UQN.js.map} +1 -1
- package/dist/runtime/base-classes/index.js +22 -22
- package/dist/runtime/shared/openapi/index.js +3 -3
- package/dist/runtime/subsystems/analytics/analytics.module.js +2 -2
- package/dist/runtime/subsystems/analytics/index.js +4 -4
- package/dist/runtime/subsystems/auth/index.js +1 -1
- package/dist/runtime/subsystems/bridge/bridge-delivery-handler.js +3 -3
- package/dist/runtime/subsystems/bridge/bridge-delivery.drizzle-backend.js +3 -3
- package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.d.ts +2 -1
- package/dist/runtime/subsystems/bridge/bridge-outbox-drain-hook.js +7 -6
- package/dist/runtime/subsystems/bridge/bridge.module.js +20 -19
- package/dist/runtime/subsystems/bridge/event-flow.service.js +3 -3
- package/dist/runtime/subsystems/bridge/index.js +22 -21
- package/dist/runtime/subsystems/cache/cache.drizzle-backend.js +2 -2
- package/dist/runtime/subsystems/cache/cache.module.js +3 -3
- package/dist/runtime/subsystems/cache/index.js +5 -5
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.d.ts +20 -0
- package/dist/runtime/subsystems/events/event-bus.drizzle-backend.js +4 -3
- package/dist/runtime/subsystems/events/event-bus.memory-backend.js +2 -2
- package/dist/runtime/subsystems/events/events.module.d.ts +14 -0
- package/dist/runtime/subsystems/events/events.module.js +6 -5
- package/dist/runtime/subsystems/events/index.js +12 -11
- package/dist/runtime/subsystems/index.js +65 -64
- package/dist/runtime/subsystems/integration/execute-integration.use-case.js +2 -2
- package/dist/runtime/subsystems/integration/index.js +14 -14
- package/dist/runtime/subsystems/integration/integration-cursor-store.drizzle-backend.js +2 -2
- package/dist/runtime/subsystems/integration/integration-run-recorder.drizzle-backend.js +2 -2
- package/dist/runtime/subsystems/integration/integration.module.js +4 -4
- package/dist/runtime/subsystems/jobs/index.d.ts +2 -1
- package/dist/runtime/subsystems/jobs/index.js +44 -32
- package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js +6 -5
- package/dist/runtime/subsystems/jobs/job-orchestrator.bullmq-backend.js.map +1 -1
- package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.d.ts +2 -1
- package/dist/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.js +3 -2
- package/dist/runtime/subsystems/jobs/job-orchestrator.memory-backend.js +2 -2
- package/dist/runtime/subsystems/jobs/job-run-service.drizzle-backend.js +3 -3
- package/dist/runtime/subsystems/jobs/job-run-service.memory-backend.js +3 -3
- package/dist/runtime/subsystems/jobs/job-worker.d.ts +28 -0
- package/dist/runtime/subsystems/jobs/job-worker.js +3 -2
- package/dist/runtime/subsystems/jobs/job-worker.module.js +12 -11
- package/dist/runtime/subsystems/jobs/jobs-domain.module.d.ts +12 -7
- package/dist/runtime/subsystems/jobs/jobs-domain.module.js +10 -9
- package/dist/runtime/subsystems/jobs/jobs-domain.tokens.d.ts +13 -1
- package/dist/runtime/subsystems/jobs/jobs-domain.tokens.js +3 -1
- package/dist/runtime/subsystems/jobs/pg-notify.d.ts +85 -0
- package/dist/runtime/subsystems/jobs/pg-notify.js +14 -0
- package/dist/runtime/subsystems/jobs/pg-notify.js.map +1 -0
- package/dist/runtime/subsystems/observability/index.js +4 -4
- package/dist/runtime/subsystems/observability/observability.module.js +4 -4
- package/dist/runtime/subsystems/observability/observability.service.js +3 -3
- package/dist/runtime/subsystems/storage/index.js +4 -4
- package/dist/runtime/subsystems/storage/storage.module.js +2 -2
- package/dist/src/cli/index.js +49 -11
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.js +5 -5
- package/package.json +1 -1
- package/runtime/subsystems/bridge/bridge-outbox-drain-hook.ts +27 -0
- package/runtime/subsystems/events/event-bus.drizzle-backend.ts +108 -4
- package/runtime/subsystems/events/events.module.ts +14 -0
- package/runtime/subsystems/jobs/index.ts +10 -0
- package/runtime/subsystems/jobs/job-orchestrator.drizzle-backend.ts +29 -2
- package/runtime/subsystems/jobs/job-worker.module.ts +11 -0
- package/runtime/subsystems/jobs/job-worker.ts +98 -0
- package/runtime/subsystems/jobs/jobs-domain.module.ts +22 -7
- package/runtime/subsystems/jobs/jobs-domain.tokens.ts +13 -0
- package/runtime/subsystems/jobs/pg-notify.ts +216 -0
- package/templates/subsystem/events-config/codegen-config-events-block.ejs.t +14 -0
- package/templates/subsystem/jobs-config/codegen-config-jobs-block.ejs.t +13 -4
- package/dist/chunk-4H3PETLM.js.map +0 -1
- package/dist/chunk-4JLJYWJC.js.map +0 -1
- package/dist/chunk-5Y7W3XR6.js.map +0 -1
- package/dist/chunk-EOLLMEAH.js.map +0 -1
- package/dist/chunk-L7BNNRGI.js.map +0 -1
- package/dist/chunk-O37C3YE6.js.map +0 -1
- package/dist/chunk-RC23QROE.js.map +0 -1
- package/dist/chunk-UTN4GBPQ.js +0 -1
- /package/dist/{chunk-GCYKMF22.js.map → chunk-24WXSC3C.js.map} +0 -0
- /package/dist/{chunk-32BMMV4H.js.map → chunk-5RT7JGKT.js.map} +0 -0
- /package/dist/{chunk-RDVTWIYY.js.map → chunk-BHZP6LOV.js.map} +0 -0
- /package/dist/{chunk-4MVGAMUA.js.map → chunk-BK5ICA2F.js.map} +0 -0
- /package/dist/{chunk-4RFHUZXU.js.map → chunk-BULPAAD3.js.map} +0 -0
- /package/dist/{chunk-IYNSRIGR.js.map → chunk-CEWLVVAH.js.map} +0 -0
- /package/dist/{chunk-27ETSJ2X.js.map → chunk-COGHTKXY.js.map} +0 -0
- /package/dist/{chunk-J7JMVS2B.js.map → chunk-DKKFTHHI.js.map} +0 -0
- /package/dist/{chunk-YTN6BKWA.js.map → chunk-DRCLNYH7.js.map} +0 -0
- /package/dist/{chunk-TNXH7BJS.js.map → chunk-E45CSC33.js.map} +0 -0
- /package/dist/{chunk-K2I6XIK5.js.map → chunk-KSTZIULO.js.map} +0 -0
- /package/dist/{chunk-Z7PQCAVK.js.map → chunk-LQ6PYFU6.js.map} +0 -0
- /package/dist/{chunk-7YGORYZD.js.map → chunk-T6C4LFLC.js.map} +0 -0
- /package/dist/{chunk-OGIZXGPY.js.map → chunk-TDEHU73T.js.map} +0 -0
- /package/dist/{chunk-FBGHYQIZ.js.map → chunk-VNBC3VXM.js.map} +0 -0
- /package/dist/{chunk-YPWODKD5.js.map → chunk-W2UIDI3R.js.map} +0 -0
- /package/dist/{chunk-UTN4GBPQ.js.map → chunk-W4HOHZVF.js.map} +0 -0
- /package/dist/{chunk-DCCZB4UC.js.map → chunk-XWBK3XJK.js.map} +0 -0
- /package/dist/{chunk-SR7F3TJY.js.map → chunk-YK5JEVLX.js.map} +0 -0
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
assertTenantId
|
|
3
|
-
} from "./chunk-MZ6GV4YF.js";
|
|
4
1
|
import {
|
|
5
2
|
INTEGRATION_CHANGE_SOURCE,
|
|
6
3
|
INTEGRATION_CURSOR_STORE,
|
|
@@ -9,6 +6,9 @@ import {
|
|
|
9
6
|
INTEGRATION_RUN_RECORDER,
|
|
10
7
|
INTEGRATION_SINK
|
|
11
8
|
} from "./chunk-S7C6TIIF.js";
|
|
9
|
+
import {
|
|
10
|
+
assertTenantId
|
|
11
|
+
} from "./chunk-MZ6GV4YF.js";
|
|
12
12
|
import {
|
|
13
13
|
__decorateClass,
|
|
14
14
|
__decorateParam
|
|
@@ -219,4 +219,4 @@ ExecuteIntegrationUseCase = __decorateClass([
|
|
|
219
219
|
export {
|
|
220
220
|
ExecuteIntegrationUseCase
|
|
221
221
|
};
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
222
|
+
//# sourceMappingURL=chunk-TDEHU73T.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MissingTenantIdError
|
|
3
|
+
} from "./chunk-T4BIIU5E.js";
|
|
1
4
|
import {
|
|
2
5
|
clampLimit,
|
|
3
6
|
decodeKeysetCursor,
|
|
4
7
|
encodeKeysetCursor,
|
|
5
8
|
toJobRunSummary
|
|
6
9
|
} from "./chunk-L3LZWWSX.js";
|
|
7
|
-
import {
|
|
8
|
-
MissingTenantIdError
|
|
9
|
-
} from "./chunk-T4BIIU5E.js";
|
|
10
10
|
import {
|
|
11
11
|
JOBS_MULTI_TENANT,
|
|
12
12
|
JOB_ORCHESTRATOR
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ZPL74UQN.js";
|
|
14
14
|
import {
|
|
15
15
|
jobRuns
|
|
16
16
|
} from "./chunk-OKXZ63IA.js";
|
|
@@ -198,4 +198,4 @@ DrizzleJobRunService = __decorateClass([
|
|
|
198
198
|
export {
|
|
199
199
|
DrizzleJobRunService
|
|
200
200
|
};
|
|
201
|
-
//# sourceMappingURL=chunk-
|
|
201
|
+
//# sourceMappingURL=chunk-VNBC3VXM.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
JOB_RUN_SERVICE
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
EVENT_READ_PORT
|
|
6
|
-
} from "./chunk-H5NH7KPE.js";
|
|
3
|
+
} from "./chunk-ZPL74UQN.js";
|
|
7
4
|
import {
|
|
8
5
|
BRIDGE_DELIVERY_REPO
|
|
9
6
|
} from "./chunk-4LH67P4U.js";
|
|
7
|
+
import {
|
|
8
|
+
EVENT_READ_PORT
|
|
9
|
+
} from "./chunk-H5NH7KPE.js";
|
|
10
10
|
import {
|
|
11
11
|
INTEGRATION_CURSOR_STORE,
|
|
12
12
|
INTEGRATION_RUN_RECORDER
|
|
@@ -181,4 +181,4 @@ ObservabilityService = __decorateClass([
|
|
|
181
181
|
export {
|
|
182
182
|
ObservabilityService
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-W2UIDI3R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-W4HOHZVF.js.map
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
JOB_HANDLER_REGISTRY
|
|
3
|
-
} from "./chunk-CO6LUM72.js";
|
|
4
1
|
import {
|
|
5
2
|
JOB_ORCHESTRATOR,
|
|
6
3
|
JOB_RUN_SERVICE,
|
|
7
4
|
JOB_STEP_SERVICE
|
|
8
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZPL74UQN.js";
|
|
6
|
+
import {
|
|
7
|
+
JOB_HANDLER_REGISTRY
|
|
8
|
+
} from "./chunk-CO6LUM72.js";
|
|
9
9
|
import {
|
|
10
10
|
jobRuns
|
|
11
11
|
} from "./chunk-OKXZ63IA.js";
|
|
12
|
+
import {
|
|
13
|
+
JOBS_WAKE_CHANNEL,
|
|
14
|
+
PgNotifyListener
|
|
15
|
+
} from "./chunk-MYQIQ27N.js";
|
|
12
16
|
import {
|
|
13
17
|
tokenKey
|
|
14
18
|
} from "./chunk-GYGNEQSC.js";
|
|
@@ -96,6 +100,7 @@ var JobWorker = class {
|
|
|
96
100
|
this.staleSweeperIntervalMs = options.staleSweeperIntervalMs ?? DEFAULT_STALE_SWEEPER_INTERVAL_MS;
|
|
97
101
|
this.staleThresholdMs = options.staleThresholdMs ?? DEFAULT_STALE_THRESHOLD_MS;
|
|
98
102
|
this.shutdownTimeoutMs = options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
103
|
+
this.listenNotifyEnabled = options.listenNotify ?? false;
|
|
99
104
|
this.sigtermHandler = () => {
|
|
100
105
|
if (this.sigtermHandled) return;
|
|
101
106
|
this.sigtermHandled = true;
|
|
@@ -120,6 +125,14 @@ var JobWorker = class {
|
|
|
120
125
|
staleSweeperIntervalMs;
|
|
121
126
|
staleThresholdMs;
|
|
122
127
|
shutdownTimeoutMs;
|
|
128
|
+
// LISTEN-NOTIFY-1 — dedicated listener + debounce state. `null` when
|
|
129
|
+
// `listenNotify` is off (the common case); polling is the only driver then.
|
|
130
|
+
listenNotifyEnabled;
|
|
131
|
+
notifyListener = null;
|
|
132
|
+
/** True while a wake-driven claim cycle is in flight (debounce gate). */
|
|
133
|
+
wakeDraining = false;
|
|
134
|
+
/** A notify arrived mid-cycle → re-check once when the cycle ends. */
|
|
135
|
+
wakeRecheckPending = false;
|
|
123
136
|
// ============================================================================
|
|
124
137
|
// Lifecycle
|
|
125
138
|
// ============================================================================
|
|
@@ -131,6 +144,59 @@ var JobWorker = class {
|
|
|
131
144
|
void this.sweepStaleClaims();
|
|
132
145
|
}, this.staleSweeperIntervalMs);
|
|
133
146
|
process.on("SIGTERM", this.sigtermHandler);
|
|
147
|
+
if (this.listenNotifyEnabled) {
|
|
148
|
+
const pool = this.db.$client;
|
|
149
|
+
if (!pool || typeof pool.connect !== "function") {
|
|
150
|
+
this.logger.warn(
|
|
151
|
+
`listen_notify enabled but the Drizzle client exposes no pg Pool ($client.connect missing) \u2014 falling back to interval polling only.`
|
|
152
|
+
);
|
|
153
|
+
} else {
|
|
154
|
+
this.notifyListener = new PgNotifyListener({
|
|
155
|
+
channel: JOBS_WAKE_CHANNEL,
|
|
156
|
+
pool,
|
|
157
|
+
label: `jobs:${this.options.pool}`,
|
|
158
|
+
onNotify: (payload) => this.onWake(payload)
|
|
159
|
+
});
|
|
160
|
+
void this.notifyListener.start();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Wake handler — a `codegen_jobs_wake` notification arrived. Only payloads
|
|
166
|
+
* naming THIS worker's pool are relevant (other pools have their own workers).
|
|
167
|
+
* Debounced: if a claim cycle is already running we just flag a re-check so a
|
|
168
|
+
* burst of N enqueues collapses to at most one extra cycle (D3).
|
|
169
|
+
*/
|
|
170
|
+
onWake(payload) {
|
|
171
|
+
if (this.shuttingDown) return;
|
|
172
|
+
if (payload !== this.options.pool) return;
|
|
173
|
+
if (this.wakeDraining) {
|
|
174
|
+
this.wakeRecheckPending = true;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
void this.drainOnWake();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Claim-until-empty on a wake. Unlike the interval `pollAndProcess` (one
|
|
181
|
+
* claim per tick), a wake drains greedily up to the concurrency ceiling so a
|
|
182
|
+
* burst that arrived together is dispatched without waiting for N ticks. The
|
|
183
|
+
* `wakeRecheckPending` flag coalesces notifies that land mid-drain.
|
|
184
|
+
*/
|
|
185
|
+
async drainOnWake() {
|
|
186
|
+
this.wakeDraining = true;
|
|
187
|
+
try {
|
|
188
|
+
do {
|
|
189
|
+
this.wakeRecheckPending = false;
|
|
190
|
+
let progressed = true;
|
|
191
|
+
while (progressed && !this.shuttingDown && this.inFlight.size < this.options.concurrency) {
|
|
192
|
+
const before = this.inFlight.size;
|
|
193
|
+
await this.pollAndProcess();
|
|
194
|
+
progressed = this.inFlight.size > before;
|
|
195
|
+
}
|
|
196
|
+
} while (this.wakeRecheckPending && !this.shuttingDown);
|
|
197
|
+
} finally {
|
|
198
|
+
this.wakeDraining = false;
|
|
199
|
+
}
|
|
134
200
|
}
|
|
135
201
|
async onModuleDestroy() {
|
|
136
202
|
if (this.shuttingDown) {
|
|
@@ -147,6 +213,14 @@ var JobWorker = class {
|
|
|
147
213
|
this.sweeperTimer = null;
|
|
148
214
|
}
|
|
149
215
|
process.removeListener("SIGTERM", this.sigtermHandler);
|
|
216
|
+
if (this.notifyListener) {
|
|
217
|
+
try {
|
|
218
|
+
await this.notifyListener.stop();
|
|
219
|
+
} catch (err) {
|
|
220
|
+
this.logger.error(`notify listener stop failed: ${err.message}`);
|
|
221
|
+
}
|
|
222
|
+
this.notifyListener = null;
|
|
223
|
+
}
|
|
150
224
|
await this.drainInFlight();
|
|
151
225
|
try {
|
|
152
226
|
await this.db.update(jobRuns).set({ status: "pending", claimedAt: null, startedAt: null }).where(
|
|
@@ -444,4 +518,4 @@ export {
|
|
|
444
518
|
buildStaleSweepQuery,
|
|
445
519
|
JobWorker
|
|
446
520
|
};
|
|
447
|
-
//# sourceMappingURL=chunk-
|
|
521
|
+
//# sourceMappingURL=chunk-XDIIVIIK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../runtime/subsystems/jobs/job-worker.ts"],"sourcesContent":["/**\n * JobWorker — backend-agnostic tick loop for the job orchestration domain\n * (ADR-022, JOB-3).\n *\n * One worker instance per active pool. On `onModuleInit` it starts two\n * intervals: the poll loop (claim → process → repeat) and the stale-claim\n * sweeper. On `onModuleDestroy` / SIGTERM it drains in-flight work and\n * releases still-`running` rows back to `pending` so a replacement worker\n * can resume with step memoization intact.\n *\n * The claim query is the beating heart: `SELECT … FOR UPDATE SKIP LOCKED`\n * inside a single transaction. Multiple worker processes share the table\n * without serialising on row locks.\n */\n// TODO(logging-subsystem): swap to ILogger once ADR-028 lands\nimport { Inject, Injectable, Logger, type OnModuleDestroy, type OnModuleInit } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport { and, asc, desc, eq, inArray, lt, lte, sql } from 'drizzle-orm';\nimport type { DrizzleClient } from '../../types/drizzle';\nimport { tokenKey } from '../token-key';\nimport { DRIZZLE } from '../../constants/tokens';\nimport { jobRuns, type JobRunRow } from './job-orchestration.schema';\nimport type { IJobOrchestrator, JobRun } from './job-orchestrator.protocol';\nimport type { IJobRunService } from './job-run-service.protocol';\nimport type { IJobStepService } from './job-step-service.protocol';\nimport {\n JOB_ORCHESTRATOR,\n JOB_RUN_SERVICE,\n JOB_STEP_SERVICE,\n} from './jobs-domain.tokens';\nimport {\n JOB_HANDLER_REGISTRY,\n JobHandlerBase,\n type JobContext,\n type JobHandlerMeta,\n type RetryPolicy,\n type SpawnChildOptions,\n type StepOptions,\n} from './job-handler.base';\nimport { JOBS_WAKE_CHANNEL, PgNotifyListener } from './pg-notify';\n\n/**\n * Options accepted by `JobWorker`. JOB-5 threads these through module\n * `.forRoot()` config; supplied here as a plain DI-constructor argument\n * so the worker compiles standalone.\n */\nexport interface JobWorkerOptions {\n /** Pool name this worker claims from. Matches `job.pool`. */\n pool: string;\n /** Max concurrent in-flight `processRun` calls. */\n concurrency: number;\n /** Poll interval in ms. Default 1000. */\n pollIntervalMs?: number;\n /** Stale sweep interval in ms. Default 60_000. */\n staleSweeperIntervalMs?: number;\n /**\n * Threshold beyond which a `running` row is presumed stranded by a\n * crashed worker. Default 5 min. Must be >= 2× max handler duration.\n */\n staleThresholdMs?: number;\n /** Max ms to wait for in-flight drain on SIGTERM. Default 30_000. */\n shutdownTimeoutMs?: number;\n /**\n * LISTEN-NOTIFY-1 — when true, hold a dedicated listener connection and\n * LISTEN on `codegen_jobs_wake`. A notification naming this worker's `pool`\n * triggers an immediate (debounced) claim cycle, so an enqueue is claimed in\n * milliseconds instead of waiting for the next `pollIntervalMs` tick. Polling\n * continues unchanged as the fallback heartbeat. Default false.\n */\n listenNotify?: boolean;\n}\n\n// ADR-037: namespaced `Symbol.for(...)` (via `tokenKey()`) — matches by value\n// across runtime copies.\nexport const JOB_WORKER_OPTIONS = Symbol.for(tokenKey('jobs', 'worker-options'));\n\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_STALE_SWEEPER_INTERVAL_MS = 60_000;\nconst DEFAULT_STALE_THRESHOLD_MS = 5 * 60_000;\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30_000;\n\nconst TERMINAL_STATUSES: JobRunRow['status'][] = [\n 'completed',\n 'failed',\n 'timed_out',\n 'canceled',\n];\n\n// ─── Pure helpers (exported for unit tests) ────────────────────────────────\n\n/**\n * Backoff delay in ms for the Nth attempt (1-indexed). Supports both\n * policy modes. Exponential is capped at `Number.MAX_SAFE_INTEGER` so\n * pathological attempt counts don't overflow.\n */\nexport function computeBackoff(policy: RetryPolicy, attempts: number): number {\n const base = Math.max(policy.baseMs, 0);\n if (policy.backoff === 'fixed') {\n return base;\n }\n // exponential: baseMs * 2^(attempts-1)\n const exponent = Math.max(attempts - 1, 0);\n if (exponent >= 53) return Number.MAX_SAFE_INTEGER; // 2^53 overflow guard\n const raw = base * Math.pow(2, exponent);\n if (!Number.isFinite(raw) || raw >= Number.MAX_SAFE_INTEGER) {\n return Number.MAX_SAFE_INTEGER;\n }\n return raw;\n}\n\n/**\n * Decide whether an error should be retried under the given policy.\n * Matches `nonRetryableErrors` by `.name` OR `.code`. Returns\n * - `'retry'` if attempts remain and the error isn't blacklisted,\n * - `'fail'` otherwise (terminal failure).\n */\nexport function classifyError(\n err: unknown,\n policy: RetryPolicy | undefined,\n currentAttempts: number,\n): 'retry' | 'fail' {\n if (!policy) return 'fail';\n const errObj = err as { name?: string; code?: string } | undefined;\n const name = errObj?.name;\n const code = errObj?.code;\n const nonRetryable = policy.nonRetryableErrors ?? [];\n if (nonRetryable.some((n) => n === name || n === code)) return 'fail';\n if (currentAttempts + 1 >= policy.attempts) return 'fail';\n return 'retry';\n}\n\n/**\n * Build the raw claim-candidate select. Exported so tests can inspect\n * `.toSQL()` without spinning up the full worker. Matches JOB-3 §4 and\n * ADR-022 \"Claim query (Drizzle backend)\".\n */\nexport function buildClaimQuery(db: DrizzleClient, pool: string) {\n return db\n .select({ id: jobRuns.id })\n .from(jobRuns)\n .where(\n and(\n eq(jobRuns.status, 'pending'),\n eq(jobRuns.pool, pool),\n lte(jobRuns.runAt, new Date()),\n ),\n )\n .orderBy(desc(jobRuns.priority), asc(jobRuns.runAt))\n .limit(1)\n .for('update', { skipLocked: true });\n}\n\n/**\n * Build the stale-claim sweep candidate select. `FOR UPDATE SKIP LOCKED`\n * per OQ-2 resolution (2026-04-19): per-worker sweeper, safe without\n * leader election because the update is self-gating.\n */\nexport function buildStaleSweepQuery(\n db: DrizzleClient,\n staleThresholdMs: number,\n) {\n const threshold = new Date(Date.now() - staleThresholdMs);\n return db\n .select({ id: jobRuns.id })\n .from(jobRuns)\n .where(\n and(\n eq(jobRuns.status, 'running'),\n lt(jobRuns.claimedAt, threshold),\n ),\n )\n .for('update', { skipLocked: true });\n}\n\n// ─── Error serialisation ───────────────────────────────────────────────────\n\nfunction serialiseError(err: unknown, attempt: number, retryable: boolean) {\n const e = err as { message?: string; stack?: string; code?: string } | undefined;\n return {\n message: (e?.message ?? String(err)) as string,\n stack: e?.stack,\n retryable,\n attempt,\n };\n}\n\n// ─── JobWorker ─────────────────────────────────────────────────────────────\n\n@Injectable()\nexport class JobWorker implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(JobWorker.name);\n private shuttingDown = false;\n private readonly inFlight = new Set<Promise<void>>();\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private sweeperTimer: ReturnType<typeof setInterval> | null = null;\n private sigtermHandled = false;\n private readonly sigtermHandler: () => void;\n\n private readonly pollIntervalMs: number;\n private readonly staleSweeperIntervalMs: number;\n private readonly staleThresholdMs: number;\n private readonly shutdownTimeoutMs: number;\n\n // LISTEN-NOTIFY-1 — dedicated listener + debounce state. `null` when\n // `listenNotify` is off (the common case); polling is the only driver then.\n private readonly listenNotifyEnabled: boolean;\n private notifyListener: PgNotifyListener | null = null;\n /** True while a wake-driven claim cycle is in flight (debounce gate). */\n private wakeDraining = false;\n /** A notify arrived mid-cycle → re-check once when the cycle ends. */\n private wakeRecheckPending = false;\n\n constructor(\n @Inject(DRIZZLE) private readonly db: DrizzleClient,\n @Inject(JOB_ORCHESTRATOR) private readonly orchestrator: IJobOrchestrator,\n @Inject(JOB_RUN_SERVICE) private readonly runService: IJobRunService,\n @Inject(JOB_STEP_SERVICE) private readonly stepService: IJobStepService,\n @Inject(JOB_WORKER_OPTIONS) private readonly options: JobWorkerOptions,\n private readonly moduleRef: ModuleRef,\n ) {\n this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n this.staleSweeperIntervalMs =\n options.staleSweeperIntervalMs ?? DEFAULT_STALE_SWEEPER_INTERVAL_MS;\n this.staleThresholdMs = options.staleThresholdMs ?? DEFAULT_STALE_THRESHOLD_MS;\n this.shutdownTimeoutMs =\n options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n this.listenNotifyEnabled = options.listenNotify ?? false;\n\n this.sigtermHandler = () => {\n if (this.sigtermHandled) return;\n this.sigtermHandled = true;\n void this.onModuleDestroy();\n };\n void this.runService; // reserved for future scope-aware cancellation paths\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n onModuleInit(): void {\n this.pollTimer = setInterval(() => {\n void this.pollAndProcess();\n }, this.pollIntervalMs);\n this.sweeperTimer = setInterval(() => {\n void this.sweepStaleClaims();\n }, this.staleSweeperIntervalMs);\n process.on('SIGTERM', this.sigtermHandler);\n\n // LISTEN-NOTIFY-1 — start the wake listener ALONGSIDE the poll timer (never\n // instead). A notify for this worker's pool drives an immediate claim cycle;\n // the interval timer above stays the durability heartbeat. Listener startup\n // is fire-and-forget: a connect failure self-heals via the listener's own\n // backoff, and until it's up the poll loop is the sole driver.\n if (this.listenNotifyEnabled) {\n // The DRIZZLE provider wraps a `pg.Pool`, exposed by drizzle as `$client`.\n const pool = (this.db as unknown as { $client?: unknown }).$client;\n if (!pool || typeof (pool as { connect?: unknown }).connect !== 'function') {\n this.logger.warn(\n `listen_notify enabled but the Drizzle client exposes no pg Pool ` +\n `($client.connect missing) — falling back to interval polling only.`,\n );\n } else {\n this.notifyListener = new PgNotifyListener({\n channel: JOBS_WAKE_CHANNEL,\n pool: pool as { connect(): Promise<never> },\n label: `jobs:${this.options.pool}`,\n onNotify: (payload) => this.onWake(payload),\n });\n void this.notifyListener.start();\n }\n }\n }\n\n /**\n * Wake handler — a `codegen_jobs_wake` notification arrived. Only payloads\n * naming THIS worker's pool are relevant (other pools have their own workers).\n * Debounced: if a claim cycle is already running we just flag a re-check so a\n * burst of N enqueues collapses to at most one extra cycle (D3).\n */\n private onWake(payload: string): void {\n if (this.shuttingDown) return;\n if (payload !== this.options.pool) return;\n if (this.wakeDraining) {\n this.wakeRecheckPending = true;\n return;\n }\n void this.drainOnWake();\n }\n\n /**\n * Claim-until-empty on a wake. Unlike the interval `pollAndProcess` (one\n * claim per tick), a wake drains greedily up to the concurrency ceiling so a\n * burst that arrived together is dispatched without waiting for N ticks. The\n * `wakeRecheckPending` flag coalesces notifies that land mid-drain.\n */\n private async drainOnWake(): Promise<void> {\n this.wakeDraining = true;\n try {\n do {\n this.wakeRecheckPending = false;\n // Claim while there's capacity; pollAndProcess no-ops at the ceiling.\n let progressed = true;\n while (\n progressed &&\n !this.shuttingDown &&\n this.inFlight.size < this.options.concurrency\n ) {\n const before = this.inFlight.size;\n await this.pollAndProcess();\n progressed = this.inFlight.size > before;\n }\n } while (this.wakeRecheckPending && !this.shuttingDown);\n } finally {\n this.wakeDraining = false;\n }\n }\n\n async onModuleDestroy(): Promise<void> {\n if (this.shuttingDown) {\n // Still drain, but don't tear intervals down twice.\n await this.drainInFlight();\n return;\n }\n this.shuttingDown = true;\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.sweeperTimer) {\n clearInterval(this.sweeperTimer);\n this.sweeperTimer = null;\n }\n process.removeListener('SIGTERM', this.sigtermHandler);\n\n // LISTEN-NOTIFY-1 — release the listener connection so the process can exit\n // cleanly. Best-effort; a failure here doesn't block the drain.\n if (this.notifyListener) {\n try {\n await this.notifyListener.stop();\n } catch (err) {\n this.logger.error(`notify listener stop failed: ${(err as Error).message}`);\n }\n this.notifyListener = null;\n }\n\n await this.drainInFlight();\n\n // Any rows still `running` past timeout → release back to pending.\n try {\n await this.db\n .update(jobRuns)\n .set({ status: 'pending', claimedAt: null, startedAt: null })\n .where(\n and(eq(jobRuns.status, 'running'), eq(jobRuns.pool, this.options.pool)),\n );\n } catch (err) {\n this.logger.error(`shutdown reset failed: ${(err as Error).message}`);\n }\n }\n\n private async drainInFlight(): Promise<void> {\n if (this.inFlight.size === 0) return;\n const timeout = new Promise<void>((resolve) =>\n setTimeout(resolve, this.shutdownTimeoutMs),\n );\n await Promise.race([\n Promise.allSettled([...this.inFlight]).then(() => undefined),\n timeout,\n ]);\n }\n\n // ============================================================================\n // Poll loop\n // ============================================================================\n\n async pollAndProcess(): Promise<void> {\n if (this.shuttingDown) return;\n if (this.inFlight.size >= this.options.concurrency) return;\n\n let claimed: JobRunRow | null;\n try {\n claimed = await this.claimNext(this.options.pool);\n } catch (err) {\n this.logger.error(`claimNext failed: ${(err as Error).message}`);\n return;\n }\n if (!claimed) return;\n\n const run = claimed;\n const promise = this.processRun(run).catch((err) => {\n this.logger.error(\n `processRun(${run.id}) unhandled: ${(err as Error).message}`,\n );\n });\n this.inFlight.add(promise);\n promise.finally(() => {\n this.inFlight.delete(promise);\n });\n }\n\n /**\n * Claim the next runnable row from the pool. Transaction ensures the\n * select-candidate + update-to-running pair is atomic; FOR UPDATE SKIP\n * LOCKED lets multiple workers share the table without serialising.\n */\n async claimNext(pool: string): Promise<JobRunRow | null> {\n return this.db.transaction(async (tx) => {\n const candidates = await tx\n .select({ id: jobRuns.id })\n .from(jobRuns)\n .where(\n and(\n eq(jobRuns.status, 'pending'),\n eq(jobRuns.pool, pool),\n lte(jobRuns.runAt, new Date()),\n ),\n )\n .orderBy(desc(jobRuns.priority), asc(jobRuns.runAt))\n .limit(1)\n .for('update', { skipLocked: true });\n const candidate = candidates[0];\n if (!candidate) return null;\n\n const [claimed] = await tx\n .update(jobRuns)\n .set({\n status: 'running',\n claimedAt: new Date(),\n startedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(eq(jobRuns.id, candidate.id))\n .returning();\n return (claimed ?? null) as JobRunRow | null;\n });\n }\n\n // ============================================================================\n // Stale claim sweeper\n // ============================================================================\n\n /**\n * Release rows whose `claimed_at` is older than the threshold. Safe to\n * run concurrently across workers — the two-phase tx (select-for-update\n * then update) guarantees each stranded row is only reset once.\n */\n async sweepStaleClaims(): Promise<void> {\n if (this.shuttingDown) return;\n try {\n await this.db.transaction(async (tx) => {\n const threshold = new Date(Date.now() - this.staleThresholdMs);\n const stale = await tx\n .select({ id: jobRuns.id })\n .from(jobRuns)\n .where(\n and(eq(jobRuns.status, 'running'), lt(jobRuns.claimedAt, threshold)),\n )\n .for('update', { skipLocked: true });\n if (stale.length === 0) return;\n const ids = stale.map((r) => r.id);\n await tx\n .update(jobRuns)\n .set({ status: 'pending', claimedAt: null, startedAt: null })\n .where(inArray(jobRuns.id, ids));\n for (const id of ids) {\n this.logger.warn(`Recovered stale claim on run ${id}`);\n }\n });\n } catch (err) {\n this.logger.error(`sweepStaleClaims failed: ${(err as Error).message}`);\n }\n }\n\n // ============================================================================\n // processRun\n // ============================================================================\n\n private async processRun(claimed: JobRunRow): Promise<void> {\n const registryEntry = JOB_HANDLER_REGISTRY.get(claimed.jobType);\n\n // (a) Missing handler — defensive; JOB-5 boot validator should have caught.\n if (!registryEntry) {\n this.logger.error(\n `No handler registered for jobType='${claimed.jobType}' (run ${claimed.id})`,\n );\n await this.markFailed(\n claimed,\n new Error(`No handler registered for jobType='${claimed.jobType}'`),\n /*finalAttempts*/ (claimed.attempts ?? 0) + 1,\n );\n return;\n }\n\n // (b) Concurrency-queue release gate — defer if another run with the\n // same key is already `running`.\n if (claimed.concurrencyKey) {\n const inflight = await this.db\n .select({ id: jobRuns.id })\n .from(jobRuns)\n .where(\n and(\n eq(jobRuns.concurrencyKey, claimed.concurrencyKey),\n eq(jobRuns.status, 'running'),\n ),\n );\n const other = inflight.find((r) => r.id !== claimed.id);\n if (other) {\n await this.db\n .update(jobRuns)\n .set({\n status: 'pending',\n claimedAt: null,\n startedAt: null,\n updatedAt: new Date(),\n })\n .where(eq(jobRuns.id, claimed.id));\n return;\n }\n }\n\n const meta = registryEntry.meta as JobHandlerMeta<unknown>;\n const HandlerClass = registryEntry.handlerClass;\n\n // (c) Build JobContext. Resolve the handler instance from Nest's DI\n // graph so its `@Inject` constructor params (which may come from\n // any module in the app graph) are satisfied. `moduleRef.create()`\n // would otherwise instantiate a fresh class within JobWorkerModule's\n // scope only — which blows up with \"not a provider of the current\n // module\" for any handler that consumes a service from a peer\n // module (e.g. CrmSyncJob injecting CrmSyncFactory from CrmModule).\n // Consequence: handlers MUST be registered as providers in their\n // owning module (@Injectable + `providers: [HandlerClass]`). The\n // @JobHandler decorator handles registry registration only, not DI.\n // See the jobs skill's handler-authoring.md for the registration\n // rule.\n const handler = this.moduleRef.get(\n HandlerClass as unknown as new (...args: unknown[]) => unknown,\n { strict: false },\n ) as JobHandlerBase<unknown>;\n const ctx: JobContext<unknown> = {\n input: claimed.input,\n run: claimed as JobRun,\n step: this.makeStepFn(claimed),\n spawnChild: this.makeSpawnFn(claimed),\n logger: new Logger(`JobRun:${claimed.id}`),\n };\n\n const attemptsBefore = claimed.attempts ?? 0;\n try {\n // (d) Run the handler.\n const output = (await handler.run(ctx)) as Record<string, unknown> | undefined;\n // (e) Success.\n await this.db\n .update(jobRuns)\n .set({\n status: 'completed',\n output: (output ?? {}) as Record<string, unknown>,\n finishedAt: new Date(),\n updatedAt: new Date(),\n attempts: attemptsBefore + 1,\n })\n .where(eq(jobRuns.id, claimed.id));\n } catch (err) {\n // (f) Error classification + retry/fail.\n const policy = meta.retry;\n const decision = classifyError(err, policy, attemptsBefore);\n const nextAttempts = attemptsBefore + 1;\n if (decision === 'retry' && policy) {\n const delay = computeBackoff(policy, nextAttempts);\n await this.db\n .update(jobRuns)\n .set({\n status: 'pending',\n attempts: nextAttempts,\n runAt: new Date(Date.now() + delay),\n startedAt: null,\n claimedAt: null,\n error: serialiseError(err, nextAttempts, true),\n updatedAt: new Date(),\n })\n .where(eq(jobRuns.id, claimed.id));\n } else {\n await this.markFailed(claimed, err, nextAttempts);\n }\n }\n }\n\n private async markFailed(\n claimed: JobRunRow,\n err: unknown,\n finalAttempts: number,\n ): Promise<void> {\n await this.db\n .update(jobRuns)\n .set({\n status: 'failed',\n attempts: finalAttempts,\n finishedAt: new Date(),\n error: serialiseError(err, finalAttempts, false),\n updatedAt: new Date(),\n })\n .where(eq(jobRuns.id, claimed.id));\n\n // Parent-close-policy cascade: if this run has children under the same\n // root_run_id and this run's own parentClosePolicy is 'terminate', cascade.\n if (claimed.parentClosePolicy === 'terminate') {\n try {\n // JOB-8 — thread the run's own tenantId so the orchestrator's\n // multi-tenant gate passes. Without this, every terminate-policy\n // cascade throws MissingTenantIdError under multiTenant=true and\n // the outer catch silently swallows it — children never cancel.\n await this.orchestrator.cancel(claimed.id, {\n cascade: true,\n reason: 'parent-failed',\n tenantId: claimed.tenantId,\n });\n } catch (cascadeErr) {\n // cancel is idempotent; failure here is unusual but not fatal.\n this.logger.warn(\n `cascade on failed run ${claimed.id}: ${(cascadeErr as Error).message}`,\n );\n }\n }\n }\n\n // ============================================================================\n // ctx.step / ctx.spawnChild builders\n // ============================================================================\n\n private makeStepFn(run: JobRunRow) {\n return async <TOutput>(\n stepId: string,\n fn: () => Promise<TOutput>,\n _opts?: StepOptions,\n ): Promise<TOutput> => {\n void _opts;\n const existing = await this.stepService.findStep(run.id, stepId);\n if (existing?.status === 'completed') {\n return existing.output as TOutput;\n }\n\n const seq = await this.nextStepSeq(run.id);\n const startedAt = new Date();\n const nextAttempts = (existing?.attempts ?? 0) + 1;\n await this.stepService.recordStep({\n jobRunId: run.id,\n stepId,\n kind: 'task',\n seq,\n status: 'running',\n startedAt,\n attempts: nextAttempts,\n });\n try {\n const output = await fn();\n await this.stepService.recordStep({\n jobRunId: run.id,\n stepId,\n kind: 'task',\n seq,\n status: 'completed',\n output: output as Record<string, unknown> | undefined,\n finishedAt: new Date(),\n attempts: nextAttempts,\n });\n return output;\n } catch (err) {\n await this.stepService.recordStep({\n jobRunId: run.id,\n stepId,\n kind: 'task',\n seq,\n status: 'failed',\n error: serialiseError(err, nextAttempts, false),\n finishedAt: new Date(),\n attempts: nextAttempts,\n });\n throw err;\n }\n };\n }\n\n private makeSpawnFn(run: JobRunRow) {\n return async (\n type: string,\n input: unknown,\n opts?: SpawnChildOptions,\n ): Promise<JobRun> => {\n return this.orchestrator.start(type, input, {\n parentRunId: run.id,\n parentClosePolicy: opts?.closePolicy,\n runAt: opts?.runAt,\n priority: opts?.priority,\n tags: opts?.tags,\n triggerSource: 'parent',\n triggerRef: run.id,\n });\n };\n }\n\n /**\n * Allocate the next `seq` for a given run. SELECT-max approach — runs\n * typically have <100 steps so the scan is cheap, and correctness across\n * retries is more important than the microseconds saved by an in-memory\n * counter (which would drift if the worker crashes mid-run and another\n * worker resumes via stale-claim sweep).\n */\n private async nextStepSeq(runId: string): Promise<number> {\n const result = await this.db.execute(\n sql`SELECT COALESCE(MAX(seq), 0) + 1 AS next FROM job_step WHERE job_run_id = ${runId}`,\n );\n // Driver shape varies and is NOT uniformly array-iterable, so we must\n // never array-destructure the raw result (that throws `{} is not iterable`\n // on the node-postgres `Result` object, which exposes `.rows` instead of\n // being an array — first hit by package-mode bridge deliveries on\n // `drizzle-orm/node-postgres`). Normalise to a row array first, then read.\n // - node-postgres `db.execute(sql)` → `{ rows: [{ next }], ... }`\n // - some drivers / future shapes → a plain `[{ next }]` array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const raw = result as any;\n const rows: Array<{ next?: unknown }> = Array.isArray(raw)\n ? raw\n : Array.isArray(raw?.rows)\n ? raw.rows\n : [];\n const next = rows[0]?.next;\n return typeof next === 'undefined' ? 1 : Number(next);\n }\n\n // ============================================================================\n // (suppress unused-import noise)\n // ============================================================================\n}\n\n// Terminal statuses re-exported for JOB-4 parity imports.\nexport { TERMINAL_STATUSES };\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
INTEGRATION_MULTI_TENANT
|
|
3
|
+
} from "./chunk-S7C6TIIF.js";
|
|
1
4
|
import {
|
|
2
5
|
assertTenantId
|
|
3
6
|
} from "./chunk-MZ6GV4YF.js";
|
|
4
7
|
import {
|
|
5
8
|
integrationSubscriptions
|
|
6
9
|
} from "./chunk-HNWZFNKP.js";
|
|
7
|
-
import {
|
|
8
|
-
INTEGRATION_MULTI_TENANT
|
|
9
|
-
} from "./chunk-S7C6TIIF.js";
|
|
10
10
|
import {
|
|
11
11
|
DRIZZLE
|
|
12
12
|
} from "./chunk-U64T4YZE.js";
|
|
@@ -97,4 +97,4 @@ PostgresCursorStore = __decorateClass([
|
|
|
97
97
|
export {
|
|
98
98
|
PostgresCursorStore
|
|
99
99
|
};
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
100
|
+
//# sourceMappingURL=chunk-XWBK3XJK.js.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FieldDiffSchema
|
|
3
3
|
} from "./chunk-SQDOBLBP.js";
|
|
4
|
+
import {
|
|
5
|
+
INTEGRATION_MULTI_TENANT
|
|
6
|
+
} from "./chunk-S7C6TIIF.js";
|
|
4
7
|
import {
|
|
5
8
|
assertTenantId
|
|
6
9
|
} from "./chunk-MZ6GV4YF.js";
|
|
@@ -9,9 +12,6 @@ import {
|
|
|
9
12
|
integrationRuns,
|
|
10
13
|
integrationSubscriptions
|
|
11
14
|
} from "./chunk-HNWZFNKP.js";
|
|
12
|
-
import {
|
|
13
|
-
INTEGRATION_MULTI_TENANT
|
|
14
|
-
} from "./chunk-S7C6TIIF.js";
|
|
15
15
|
import {
|
|
16
16
|
DRIZZLE
|
|
17
17
|
} from "./chunk-U64T4YZE.js";
|
|
@@ -127,4 +127,4 @@ DrizzleIntegrationRunRecorder = __decorateClass([
|
|
|
127
127
|
export {
|
|
128
128
|
DrizzleIntegrationRunRecorder
|
|
129
129
|
};
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-YK5JEVLX.js.map
|
|
@@ -7,11 +7,13 @@ var JOB_ORCHESTRATOR = Symbol.for(tokenKey("jobs", "orchestrator"));
|
|
|
7
7
|
var JOB_RUN_SERVICE = Symbol.for(tokenKey("jobs", "run-service"));
|
|
8
8
|
var JOB_STEP_SERVICE = Symbol.for(tokenKey("jobs", "step-service"));
|
|
9
9
|
var JOBS_MULTI_TENANT = Symbol.for(tokenKey("jobs", "multi-tenant"));
|
|
10
|
+
var JOBS_LISTEN_NOTIFY = Symbol.for(tokenKey("jobs", "listen-notify"));
|
|
10
11
|
|
|
11
12
|
export {
|
|
12
13
|
JOB_ORCHESTRATOR,
|
|
13
14
|
JOB_RUN_SERVICE,
|
|
14
15
|
JOB_STEP_SERVICE,
|
|
15
|
-
JOBS_MULTI_TENANT
|
|
16
|
+
JOBS_MULTI_TENANT,
|
|
17
|
+
JOBS_LISTEN_NOTIFY
|
|
16
18
|
};
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-ZPL74UQN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../runtime/subsystems/jobs/jobs-domain.tokens.ts"],"sourcesContent":["/**\n * Injection tokens for the job orchestration domain layer (ADR-022, JOB-2).\n *\n * Consumer code injects these symbols via `@Inject(JOB_ORCHESTRATOR)` etc.;\n * concrete backends (JOB-3 Drizzle, JOB-4 Memory) provide the implementations\n * through `JobsDomainModule.forRoot({ backend })` in JOB-5.\n *\n * Each token is a namespaced `Symbol.for(...)` (ADR-037, via `tokenKey()`) —\n * distinct per key, so Nest's DI lookup is unambiguous, AND matching by VALUE\n * across import boundaries so the package and a (legacy) vendored runtime copy\n * resolve to the same symbol.\n */\nimport { tokenKey } from '../token-key';\n\nexport const JOB_ORCHESTRATOR = Symbol.for(tokenKey('jobs', 'orchestrator'));\nexport const JOB_RUN_SERVICE = Symbol.for(tokenKey('jobs', 'run-service'));\nexport const JOB_STEP_SERVICE = Symbol.for(tokenKey('jobs', 'step-service'));\n\n/**\n * Multi-tenancy opt-in flag (JOB-8). Bound to the boolean passed in via\n * `JobsDomainModule.forRoot({ multiTenant })`, defaulting to `false`.\n *\n * When `true`, the four service-layer backends (Drizzle + Memory orchestrator\n * and run-service) enforce `tenantId` on every mutating / targeted-read call:\n * `start`, `cancel`, `listForScope`, `cancelForScope`, `rescheduleForScope`.\n * Missing (`undefined`) `tenantId` throws `MissingTenantIdError`; explicit\n * `null` opts into cross-tenant background work and passes through.\n *\n * The JobWorker claim loop is **cross-tenant by design** — the worker has no\n * tenant context; `tenantId` is populated at write time and enforced on\n * targeted reads. See docs/specs/JOB-8.md.\n */\nexport const JOBS_MULTI_TENANT = Symbol.for(tokenKey('jobs', 'multi-tenant'));\n"],"mappings":";;;;;AAcO,IAAM,mBAAmB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;AACpE,IAAM,kBAAkB,OAAO,IAAI,SAAS,QAAQ,aAAa,CAAC;AAClE,IAAM,mBAAmB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;AAgBpE,IAAM,oBAAoB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../runtime/subsystems/jobs/jobs-domain.tokens.ts"],"sourcesContent":["/**\n * Injection tokens for the job orchestration domain layer (ADR-022, JOB-2).\n *\n * Consumer code injects these symbols via `@Inject(JOB_ORCHESTRATOR)` etc.;\n * concrete backends (JOB-3 Drizzle, JOB-4 Memory) provide the implementations\n * through `JobsDomainModule.forRoot({ backend })` in JOB-5.\n *\n * Each token is a namespaced `Symbol.for(...)` (ADR-037, via `tokenKey()`) —\n * distinct per key, so Nest's DI lookup is unambiguous, AND matching by VALUE\n * across import boundaries so the package and a (legacy) vendored runtime copy\n * resolve to the same symbol.\n */\nimport { tokenKey } from '../token-key';\n\nexport const JOB_ORCHESTRATOR = Symbol.for(tokenKey('jobs', 'orchestrator'));\nexport const JOB_RUN_SERVICE = Symbol.for(tokenKey('jobs', 'run-service'));\nexport const JOB_STEP_SERVICE = Symbol.for(tokenKey('jobs', 'step-service'));\n\n/**\n * Multi-tenancy opt-in flag (JOB-8). Bound to the boolean passed in via\n * `JobsDomainModule.forRoot({ multiTenant })`, defaulting to `false`.\n *\n * When `true`, the four service-layer backends (Drizzle + Memory orchestrator\n * and run-service) enforce `tenantId` on every mutating / targeted-read call:\n * `start`, `cancel`, `listForScope`, `cancelForScope`, `rescheduleForScope`.\n * Missing (`undefined`) `tenantId` throws `MissingTenantIdError`; explicit\n * `null` opts into cross-tenant background work and passes through.\n *\n * The JobWorker claim loop is **cross-tenant by design** — the worker has no\n * tenant context; `tenantId` is populated at write time and enforced on\n * targeted reads. See docs/specs/JOB-8.md.\n */\nexport const JOBS_MULTI_TENANT = Symbol.for(tokenKey('jobs', 'multi-tenant'));\n\n/**\n * LISTEN/NOTIFY wakeup opt-in flag (LISTEN-NOTIFY-1). Bound to\n * `JobsDomainModule.forRoot({ extensions: { drizzle: { listenNotify } } })`,\n * defaulting to `false`.\n *\n * When `true`, the Drizzle orchestrator emits an in-transaction\n * `pg_notify(codegen_jobs_wake, <pool>)` on every `start()` INSERT so a worker\n * with `listen_notify` enabled wakes the moment the enqueue commits. Off by\n * default; polling is unchanged. The flag is read by `DrizzleJobOrchestrator`\n * and by the bridge outbox drain hook (its wrapper `job_run` inserts notify too).\n */\nexport const JOBS_LISTEN_NOTIFY = Symbol.for(tokenKey('jobs', 'listen-notify'));\n"],"mappings":";;;;;AAcO,IAAM,mBAAmB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;AACpE,IAAM,kBAAkB,OAAO,IAAI,SAAS,QAAQ,aAAa,CAAC;AAClE,IAAM,mBAAmB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;AAgBpE,IAAM,oBAAoB,OAAO,IAAI,SAAS,QAAQ,cAAc,CAAC;AAarE,IAAM,qBAAqB,OAAO,IAAI,SAAS,QAAQ,eAAe,CAAC;","names":[]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
KnowledgeEntityRepository
|
|
3
|
+
} from "../../chunk-NN7XZEGF.js";
|
|
4
|
+
import {
|
|
5
|
+
KnowledgeEntityService
|
|
6
|
+
} from "../../chunk-AS3NAZB6.js";
|
|
1
7
|
import {
|
|
2
8
|
MetadataEntityRepository
|
|
3
9
|
} from "../../chunk-7KOW6PU6.js";
|
|
@@ -7,6 +13,10 @@ import {
|
|
|
7
13
|
import {
|
|
8
14
|
WithAnalytics
|
|
9
15
|
} from "../../chunk-IBGER4YK.js";
|
|
16
|
+
import {
|
|
17
|
+
BaseFindByIdUseCase,
|
|
18
|
+
BaseListUseCase
|
|
19
|
+
} from "../../chunk-EXVDJMIY.js";
|
|
10
20
|
import {
|
|
11
21
|
IntegratedEntityRepository
|
|
12
22
|
} from "../../chunk-OTDN3OUQ.js";
|
|
@@ -18,25 +28,24 @@ import {
|
|
|
18
28
|
buildCompositeExternalId,
|
|
19
29
|
parseCompositeExternalId
|
|
20
30
|
} from "../../chunk-2FTZLDBP.js";
|
|
21
|
-
import {
|
|
22
|
-
KnowledgeEntityRepository
|
|
23
|
-
} from "../../chunk-NN7XZEGF.js";
|
|
24
|
-
import {
|
|
25
|
-
KnowledgeEntityService
|
|
26
|
-
} from "../../chunk-AS3NAZB6.js";
|
|
27
31
|
import {
|
|
28
32
|
ActivityEntityRepository
|
|
29
33
|
} from "../../chunk-XCEI7NUH.js";
|
|
30
|
-
import {
|
|
31
|
-
ActivityEntityService
|
|
32
|
-
} from "../../chunk-BOPZWRJK.js";
|
|
33
|
-
import {
|
|
34
|
-
BaseFindByIdUseCase,
|
|
35
|
-
BaseListUseCase
|
|
36
|
-
} from "../../chunk-EXVDJMIY.js";
|
|
37
34
|
import {
|
|
38
35
|
BaseRepository
|
|
39
36
|
} from "../../chunk-J6KZS54B.js";
|
|
37
|
+
import {
|
|
38
|
+
requireRequester,
|
|
39
|
+
requireRequesterScope,
|
|
40
|
+
tryGetRequester,
|
|
41
|
+
withOrgScope,
|
|
42
|
+
withRequester,
|
|
43
|
+
withSuperuserScope,
|
|
44
|
+
withUserScope
|
|
45
|
+
} from "../../chunk-ZUKFQL6E.js";
|
|
46
|
+
import {
|
|
47
|
+
ActivityEntityService
|
|
48
|
+
} from "../../chunk-BOPZWRJK.js";
|
|
40
49
|
import {
|
|
41
50
|
BaseService
|
|
42
51
|
} from "../../chunk-W72PRNJY.js";
|
|
@@ -47,15 +56,6 @@ import {
|
|
|
47
56
|
emitSafely,
|
|
48
57
|
entitySnapshot
|
|
49
58
|
} from "../../chunk-KYR3B3OW.js";
|
|
50
|
-
import {
|
|
51
|
-
requireRequester,
|
|
52
|
-
requireRequesterScope,
|
|
53
|
-
tryGetRequester,
|
|
54
|
-
withOrgScope,
|
|
55
|
-
withRequester,
|
|
56
|
-
withSuperuserScope,
|
|
57
|
-
withUserScope
|
|
58
|
-
} from "../../chunk-ZUKFQL6E.js";
|
|
59
59
|
import "../../chunk-2E224ZSN.js";
|
|
60
60
|
export {
|
|
61
61
|
ActivityEntityRepository,
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
OPENAPI_REGISTRY
|
|
3
|
-
} from "../../../chunk-PSXUNOVU.js";
|
|
4
1
|
import {
|
|
5
2
|
OpenApiRegistry
|
|
6
3
|
} from "../../../chunk-Y7GDG744.js";
|
|
@@ -12,6 +9,9 @@ import {
|
|
|
12
9
|
DuplicateSchemaError,
|
|
13
10
|
OpenApiPeerDepMissingError
|
|
14
11
|
} from "../../../chunk-YSLTTQLC.js";
|
|
12
|
+
import {
|
|
13
|
+
OPENAPI_REGISTRY
|
|
14
|
+
} from "../../../chunk-PSXUNOVU.js";
|
|
15
15
|
import "../../../chunk-2E224ZSN.js";
|
|
16
16
|
export {
|
|
17
17
|
DuplicateSchemaError,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AnalyticsModule
|
|
3
|
-
} from "../../../chunk-
|
|
4
|
-
import "../../../chunk-7B3RYX45.js";
|
|
3
|
+
} from "../../../chunk-DKKFTHHI.js";
|
|
5
4
|
import "../../../chunk-J37YWU7Y.js";
|
|
5
|
+
import "../../../chunk-7B3RYX45.js";
|
|
6
6
|
import "../../../chunk-6I7ULIN6.js";
|
|
7
7
|
import "../../../chunk-GYGNEQSC.js";
|
|
8
8
|
import "../../../chunk-2E224ZSN.js";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AnalyticsModule
|
|
3
|
-
} from "../../../chunk-
|
|
4
|
-
import {
|
|
5
|
-
CubeAnalyticsBackend
|
|
6
|
-
} from "../../../chunk-7B3RYX45.js";
|
|
3
|
+
} from "../../../chunk-DKKFTHHI.js";
|
|
7
4
|
import {
|
|
8
5
|
NoopAnalyticsBackend
|
|
9
6
|
} from "../../../chunk-J37YWU7Y.js";
|
|
7
|
+
import {
|
|
8
|
+
CubeAnalyticsBackend
|
|
9
|
+
} from "../../../chunk-7B3RYX45.js";
|
|
10
10
|
import {
|
|
11
11
|
ANALYTICS_QUERY,
|
|
12
12
|
CUBE_API_SECRET,
|
|
@@ -49,8 +49,8 @@ import {
|
|
|
49
49
|
STRATEGY_REGISTRY
|
|
50
50
|
} from "../../../chunk-6XY6ZMMD.js";
|
|
51
51
|
import "../../../chunk-GYGNEQSC.js";
|
|
52
|
-
import "../../../chunk-ZUKFQL6E.js";
|
|
53
52
|
import "../../../chunk-U64T4YZE.js";
|
|
53
|
+
import "../../../chunk-ZUKFQL6E.js";
|
|
54
54
|
import "../../../chunk-2E224ZSN.js";
|
|
55
55
|
export {
|
|
56
56
|
AUTH_CONNECTION_GRANT_SINK,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BRIDGE_DELIVERY_JOB_TYPE,
|
|
3
3
|
BridgeDeliveryHandler
|
|
4
|
-
} from "../../../chunk-
|
|
4
|
+
} from "../../../chunk-DRCLNYH7.js";
|
|
5
5
|
import "../../../chunk-6DWFJNIK.js";
|
|
6
6
|
import "../../../chunk-NXXDZ6ZF.js";
|
|
7
|
+
import "../../../chunk-ZPL74UQN.js";
|
|
7
8
|
import "../../../chunk-CO6LUM72.js";
|
|
8
|
-
import "../../../chunk-BIO6F7YI.js";
|
|
9
|
-
import "../../../chunk-H5NH7KPE.js";
|
|
10
9
|
import "../../../chunk-4LH67P4U.js";
|
|
10
|
+
import "../../../chunk-H5NH7KPE.js";
|
|
11
11
|
import "../../../chunk-GYGNEQSC.js";
|
|
12
12
|
import "../../../chunk-2E224ZSN.js";
|
|
13
13
|
export {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DrizzleBridgeDeliveryRepo
|
|
3
|
-
} from "../../../chunk-
|
|
4
|
-
import "../../../chunk-6DWFJNIK.js";
|
|
3
|
+
} from "../../../chunk-KSTZIULO.js";
|
|
5
4
|
import "../../../chunk-2TVVBC53.js";
|
|
5
|
+
import "../../../chunk-6DWFJNIK.js";
|
|
6
6
|
import "../../../chunk-NXXDZ6ZF.js";
|
|
7
|
-
import "../../../chunk-4LH67P4U.js";
|
|
8
7
|
import "../../../chunk-OKXZ63IA.js";
|
|
8
|
+
import "../../../chunk-4LH67P4U.js";
|
|
9
9
|
import "../../../chunk-OFRRBC7M.js";
|
|
10
10
|
import "../../../chunk-U64T4YZE.js";
|
|
11
11
|
import "../../../chunk-2E224ZSN.js";
|
|
@@ -9,10 +9,11 @@ import 'drizzle-orm/pg-core';
|
|
|
9
9
|
|
|
10
10
|
declare class BridgeOutboxDrainHook implements IBridgeOutboxDrainHook {
|
|
11
11
|
private readonly registry;
|
|
12
|
+
private readonly listenNotify;
|
|
12
13
|
private readonly logger;
|
|
13
14
|
private warnedNullDirection;
|
|
14
15
|
private readonly warnedAuditTypes;
|
|
15
|
-
constructor(registry?: BridgeRegistry);
|
|
16
|
+
constructor(registry?: BridgeRegistry, listenNotify?: boolean);
|
|
16
17
|
processEvent(event: DomainEvent, tx: DrizzleTransaction): Promise<BridgeOutboxDrainResult>;
|
|
17
18
|
private warnAuditBlockedOnce;
|
|
18
19
|
private lookupTriggers;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BridgeOutboxDrainHook
|
|
3
|
-
} from "../../../chunk-
|
|
4
|
-
import "../../../chunk-
|
|
5
|
-
import "../../../chunk-6DWFJNIK.js";
|
|
3
|
+
} from "../../../chunk-EBKVKN75.js";
|
|
4
|
+
import "../../../chunk-DRCLNYH7.js";
|
|
6
5
|
import "../../../chunk-2TVVBC53.js";
|
|
6
|
+
import "../../../chunk-6DWFJNIK.js";
|
|
7
7
|
import "../../../chunk-NXXDZ6ZF.js";
|
|
8
|
+
import "../../../chunk-ZPL74UQN.js";
|
|
8
9
|
import "../../../chunk-CO6LUM72.js";
|
|
9
|
-
import "../../../chunk-BIO6F7YI.js";
|
|
10
|
-
import "../../../chunk-H5NH7KPE.js";
|
|
11
|
-
import "../../../chunk-4LH67P4U.js";
|
|
12
10
|
import "../../../chunk-OKXZ63IA.js";
|
|
11
|
+
import "../../../chunk-MYQIQ27N.js";
|
|
12
|
+
import "../../../chunk-4LH67P4U.js";
|
|
13
13
|
import "../../../chunk-OFRRBC7M.js";
|
|
14
|
+
import "../../../chunk-H5NH7KPE.js";
|
|
14
15
|
import "../../../chunk-GYGNEQSC.js";
|
|
15
16
|
import "../../../chunk-2E224ZSN.js";
|
|
16
17
|
export {
|
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BridgeModule
|
|
3
|
-
} from "../../../chunk-
|
|
3
|
+
} from "../../../chunk-CEWLVVAH.js";
|
|
4
4
|
import "../../../chunk-5A432NZJ.js";
|
|
5
|
-
import "../../../chunk-
|
|
5
|
+
import "../../../chunk-5RT7JGKT.js";
|
|
6
6
|
import "../../../chunk-EDKJU5BO.js";
|
|
7
|
-
import "../../../chunk-
|
|
7
|
+
import "../../../chunk-KSTZIULO.js";
|
|
8
8
|
import "../../../chunk-4DOJBQTP.js";
|
|
9
|
-
import "../../../chunk-
|
|
10
|
-
import "../../../chunk-
|
|
11
|
-
import "../../../chunk-6DWFJNIK.js";
|
|
9
|
+
import "../../../chunk-EBKVKN75.js";
|
|
10
|
+
import "../../../chunk-DRCLNYH7.js";
|
|
12
11
|
import "../../../chunk-2TVVBC53.js";
|
|
12
|
+
import "../../../chunk-6DWFJNIK.js";
|
|
13
13
|
import "../../../chunk-NXXDZ6ZF.js";
|
|
14
|
-
import "../../../chunk-
|
|
15
|
-
import "../../../chunk-
|
|
16
|
-
import "../../../chunk-
|
|
17
|
-
import "../../../chunk-FBGHYQIZ.js";
|
|
18
|
-
import "../../../chunk-RDVTWIYY.js";
|
|
19
|
-
import "../../../chunk-L3LZWWSX.js";
|
|
14
|
+
import "../../../chunk-RUYLXR5F.js";
|
|
15
|
+
import "../../../chunk-XDIIVIIK.js";
|
|
16
|
+
import "../../../chunk-3RWMQC3K.js";
|
|
20
17
|
import "../../../chunk-DV4RV2DC.js";
|
|
21
|
-
import "../../../chunk-
|
|
22
|
-
import "../../../chunk-
|
|
23
|
-
import "../../../chunk-5Y7W3XR6.js";
|
|
24
|
-
import "../../../chunk-4RFHUZXU.js";
|
|
18
|
+
import "../../../chunk-OTR44OH6.js";
|
|
19
|
+
import "../../../chunk-BULPAAD3.js";
|
|
25
20
|
import "../../../chunk-PNZSGAB2.js";
|
|
21
|
+
import "../../../chunk-VNBC3VXM.js";
|
|
22
|
+
import "../../../chunk-BHZP6LOV.js";
|
|
26
23
|
import "../../../chunk-SNQ3TOWP.js";
|
|
27
24
|
import "../../../chunk-T4BIIU5E.js";
|
|
25
|
+
import "../../../chunk-L3LZWWSX.js";
|
|
26
|
+
import "../../../chunk-I6MVCB5A.js";
|
|
27
|
+
import "../../../chunk-RHVN6NA7.js";
|
|
28
|
+
import "../../../chunk-ZPL74UQN.js";
|
|
28
29
|
import "../../../chunk-CO6LUM72.js";
|
|
29
|
-
import "../../../chunk-BIO6F7YI.js";
|
|
30
|
-
import "../../../chunk-H5NH7KPE.js";
|
|
31
|
-
import "../../../chunk-4LH67P4U.js";
|
|
32
30
|
import "../../../chunk-OKXZ63IA.js";
|
|
31
|
+
import "../../../chunk-MYQIQ27N.js";
|
|
32
|
+
import "../../../chunk-4LH67P4U.js";
|
|
33
33
|
import "../../../chunk-OFRRBC7M.js";
|
|
34
|
+
import "../../../chunk-H5NH7KPE.js";
|
|
34
35
|
import "../../../chunk-GYGNEQSC.js";
|
|
35
36
|
import "../../../chunk-U64T4YZE.js";
|
|
36
37
|
import "../../../chunk-2E224ZSN.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EventFlowService
|
|
3
|
-
} from "../../../chunk-
|
|
3
|
+
} from "../../../chunk-5RT7JGKT.js";
|
|
4
4
|
import "../../../chunk-6DWFJNIK.js";
|
|
5
5
|
import "../../../chunk-NXXDZ6ZF.js";
|
|
6
|
-
import "../../../chunk-
|
|
7
|
-
import "../../../chunk-H5NH7KPE.js";
|
|
6
|
+
import "../../../chunk-ZPL74UQN.js";
|
|
8
7
|
import "../../../chunk-4LH67P4U.js";
|
|
8
|
+
import "../../../chunk-H5NH7KPE.js";
|
|
9
9
|
import "../../../chunk-GYGNEQSC.js";
|
|
10
10
|
import "../../../chunk-U64T4YZE.js";
|
|
11
11
|
import "../../../chunk-2E224ZSN.js";
|