trigger.dev 3.3.17 → 4.0.0-v4-beta.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.
- package/README.md +31 -0
- package/dist/esm/apiClient.d.ts +70 -72
- package/dist/esm/apiClient.js +195 -31
- package/dist/esm/apiClient.js.map +1 -1
- package/dist/esm/build/buildWorker.d.ts +7 -6
- package/dist/esm/build/buildWorker.js +10 -36
- package/dist/esm/build/buildWorker.js.map +1 -1
- package/dist/esm/build/bundle.d.ts +12 -1
- package/dist/esm/build/bundle.js +65 -20
- package/dist/esm/build/bundle.js.map +1 -1
- package/dist/esm/build/entryPoints.js +17 -6
- package/dist/esm/build/entryPoints.js.map +1 -1
- package/dist/esm/build/packageModules.d.ts +14 -5
- package/dist/esm/build/packageModules.js +135 -35
- package/dist/esm/build/packageModules.js.map +1 -1
- package/dist/esm/cli/common.js +5 -3
- package/dist/esm/cli/common.js.map +1 -1
- package/dist/esm/cli/index.js +4 -0
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/commands/deploy.js +2 -1
- package/dist/esm/commands/deploy.js.map +1 -1
- package/dist/esm/commands/dev.d.ts +9 -0
- package/dist/esm/commands/dev.js +10 -1
- package/dist/esm/commands/dev.js.map +1 -1
- package/dist/esm/commands/init.js +6 -3
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/list-profiles.d.ts +2 -6
- package/dist/esm/commands/list-profiles.js +7 -4
- package/dist/esm/commands/list-profiles.js.map +1 -1
- package/dist/esm/commands/login.js +3 -2
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/switch.d.ts +19 -0
- package/dist/esm/commands/switch.js +68 -0
- package/dist/esm/commands/switch.js.map +1 -0
- package/dist/esm/commands/trigger.d.ts +33 -0
- package/dist/esm/commands/trigger.js +88 -0
- package/dist/esm/commands/trigger.js.map +1 -0
- package/dist/esm/commands/workers/build.d.ts +4 -0
- package/dist/esm/commands/workers/build.js +340 -0
- package/dist/esm/commands/workers/build.js.map +1 -0
- package/dist/esm/commands/workers/create.d.ts +2 -0
- package/dist/esm/commands/workers/create.js +91 -0
- package/dist/esm/commands/workers/create.js.map +1 -0
- package/dist/esm/commands/workers/index.d.ts +2 -0
- package/dist/esm/commands/workers/index.js +13 -0
- package/dist/esm/commands/workers/index.js.map +1 -0
- package/dist/esm/commands/workers/list.d.ts +2 -0
- package/dist/esm/commands/workers/list.js +80 -0
- package/dist/esm/commands/workers/list.js.map +1 -0
- package/dist/esm/commands/workers/run.d.ts +2 -0
- package/dist/esm/commands/workers/run.js +105 -0
- package/dist/esm/commands/workers/run.js.map +1 -0
- package/dist/esm/config.js +11 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/deploy/buildImage.d.ts +1 -1
- package/dist/esm/deploy/buildImage.js +54 -34
- package/dist/esm/deploy/buildImage.js.map +1 -1
- package/dist/esm/dev/backgroundWorker.d.ts +2 -240
- package/dist/esm/dev/backgroundWorker.js +8 -305
- package/dist/esm/dev/backgroundWorker.js.map +1 -1
- package/dist/esm/dev/devOutput.js +13 -5
- package/dist/esm/dev/devOutput.js.map +1 -1
- package/dist/esm/dev/devSession.js +25 -48
- package/dist/esm/dev/devSession.js.map +1 -1
- package/dist/esm/dev/devSupervisor.d.ts +12 -0
- package/dist/esm/dev/devSupervisor.js +515 -0
- package/dist/esm/dev/devSupervisor.js.map +1 -0
- package/dist/esm/dev/lock.d.ts +1 -0
- package/dist/esm/dev/lock.js +80 -0
- package/dist/esm/dev/lock.js.map +1 -0
- package/dist/esm/dev/mcpServer.d.ts +10 -0
- package/dist/esm/dev/mcpServer.js +201 -0
- package/dist/esm/dev/mcpServer.js.map +1 -0
- package/dist/esm/dev/workerRuntime.d.ts +0 -1
- package/dist/esm/dev/workerRuntime.js +1 -335
- package/dist/esm/dev/workerRuntime.js.map +1 -1
- package/dist/esm/entryPoints/dev-index-worker.js +9 -7
- package/dist/esm/entryPoints/dev-index-worker.js.map +1 -1
- package/dist/esm/entryPoints/dev-run-controller.d.ts +53 -0
- package/dist/esm/entryPoints/dev-run-controller.js +615 -0
- package/dist/esm/entryPoints/dev-run-controller.js.map +1 -0
- package/dist/esm/entryPoints/dev-run-worker.js +276 -174
- package/dist/esm/entryPoints/dev-run-worker.js.map +1 -1
- package/dist/esm/entryPoints/{deploy-index-controller.js → managed-index-controller.js} +3 -1
- package/dist/esm/entryPoints/managed-index-controller.js.map +1 -0
- package/dist/esm/entryPoints/{deploy-index-worker.js → managed-index-worker.js} +12 -24
- package/dist/esm/entryPoints/managed-index-worker.js.map +1 -0
- package/dist/esm/entryPoints/managed-run-controller.js +1350 -0
- package/dist/esm/entryPoints/managed-run-controller.js.map +1 -0
- package/dist/esm/entryPoints/{deploy-run-worker.js → managed-run-worker.js} +104 -67
- package/dist/esm/entryPoints/managed-run-worker.js.map +1 -0
- package/dist/esm/executions/taskRunProcess.d.ts +18 -79
- package/dist/esm/executions/taskRunProcess.js +74 -28
- package/dist/esm/executions/taskRunProcess.js.map +1 -1
- package/dist/esm/indexing/indexWorkerManifest.d.ts +9 -2
- package/dist/esm/indexing/registerResources.d.ts +2 -0
- package/dist/esm/indexing/registerResources.js +40 -0
- package/dist/esm/indexing/registerResources.js.map +1 -0
- package/dist/esm/utilities/configFiles.d.ts +36 -15
- package/dist/esm/utilities/configFiles.js +73 -26
- package/dist/esm/utilities/configFiles.js.map +1 -1
- package/dist/esm/utilities/eventBus.d.ts +6 -3
- package/dist/esm/utilities/eventBus.js.map +1 -1
- package/dist/esm/utilities/initialBanner.js +18 -6
- package/dist/esm/utilities/initialBanner.js.map +1 -1
- package/dist/esm/utilities/sanitizeEnvVars.d.ts +16 -3
- package/dist/esm/utilities/sanitizeEnvVars.js +15 -0
- package/dist/esm/utilities/sanitizeEnvVars.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +12 -6
- package/dist/esm/entryPoints/deploy-index-controller.js.map +0 -1
- package/dist/esm/entryPoints/deploy-index-worker.js.map +0 -1
- package/dist/esm/entryPoints/deploy-run-controller.js +0 -1141
- package/dist/esm/entryPoints/deploy-run-controller.js.map +0 -1
- package/dist/esm/entryPoints/deploy-run-worker.js.map +0 -1
- package/dist/esm/indexing/registerTasks.d.ts +0 -2
- package/dist/esm/indexing/registerTasks.js +0 -65
- package/dist/esm/indexing/registerTasks.js.map +0 -1
- /package/dist/esm/entryPoints/{deploy-index-controller.d.ts → managed-index-controller.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-index-worker.d.ts → managed-index-worker.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-run-controller.d.ts → managed-run-controller.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-run-worker.d.ts → managed-run-worker.d.ts} +0 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { setTimeout as awaitTimeout } from "node:timers/promises";
|
|
2
|
+
import { SemanticInternalAttributes, } from "@trigger.dev/core/v3";
|
|
3
|
+
import { resolveDotEnvVars } from "../utilities/dotEnv.js";
|
|
4
|
+
import { eventBus } from "../utilities/eventBus.js";
|
|
5
|
+
import { logger } from "../utilities/logger.js";
|
|
6
|
+
import { sanitizeEnvVars } from "../utilities/sanitizeEnvVars.js";
|
|
7
|
+
import { resolveSourceFiles } from "../utilities/sourceFiles.js";
|
|
8
|
+
import { BackgroundWorker } from "./backgroundWorker.js";
|
|
9
|
+
import { chalkTask, cliLink, prettyError } from "../utilities/cliOutput.js";
|
|
10
|
+
import { DevRunController } from "../entryPoints/dev-run-controller.js";
|
|
11
|
+
import { io } from "socket.io-client";
|
|
12
|
+
import pLimit from "p-limit";
|
|
13
|
+
export async function startWorkerRuntime(options) {
|
|
14
|
+
const runtime = new DevSupervisor(options);
|
|
15
|
+
await runtime.init();
|
|
16
|
+
return runtime;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The DevSupervisor is used when you run the `trigger.dev dev` command (with engine 2.0+)
|
|
20
|
+
* It's responsible for:
|
|
21
|
+
* - Creating/registering BackgroundWorkers
|
|
22
|
+
* - Pulling runs from the queue
|
|
23
|
+
* - Delegating executing the runs to DevRunController
|
|
24
|
+
* - Receiving snapshot update pings (via socket)
|
|
25
|
+
*/
|
|
26
|
+
class DevSupervisor {
|
|
27
|
+
options;
|
|
28
|
+
config;
|
|
29
|
+
disconnectPresence;
|
|
30
|
+
lastManifest;
|
|
31
|
+
latestWorkerId;
|
|
32
|
+
/** Receive notifications when runs change state */
|
|
33
|
+
socket;
|
|
34
|
+
socketIsReconnecting = false;
|
|
35
|
+
/** Workers are versions of the code */
|
|
36
|
+
workers = new Map();
|
|
37
|
+
/** Map of run friendly id to run controller. They process runs from start to finish. */
|
|
38
|
+
runControllers = new Map();
|
|
39
|
+
socketConnections = new Set();
|
|
40
|
+
runLimiter;
|
|
41
|
+
constructor(options) {
|
|
42
|
+
this.options = options;
|
|
43
|
+
}
|
|
44
|
+
async init() {
|
|
45
|
+
logger.debug("[DevSupervisor] initialized worker runtime", { options: this.options });
|
|
46
|
+
//get the settings for dev
|
|
47
|
+
const settings = await this.options.client.dev.config();
|
|
48
|
+
if (!settings.success) {
|
|
49
|
+
throw new Error(`Failed to connect to ${this.options.client.apiURL}. Couldn't retrieve settings: ${settings.error}`);
|
|
50
|
+
}
|
|
51
|
+
logger.debug("[DevSupervisor] Got dev settings", { settings: settings.data });
|
|
52
|
+
this.config = settings.data;
|
|
53
|
+
const maxConcurrentRuns = Math.min(this.config.maxConcurrentRuns, this.options.args.maxConcurrentRuns ?? this.config.maxConcurrentRuns);
|
|
54
|
+
logger.debug("[DevSupervisor] Using maxConcurrentRuns", { maxConcurrentRuns });
|
|
55
|
+
this.runLimiter = pLimit(maxConcurrentRuns);
|
|
56
|
+
this.#createSocket();
|
|
57
|
+
//start an SSE connection for presence
|
|
58
|
+
this.disconnectPresence = await this.#startPresenceConnection();
|
|
59
|
+
//start dequeuing
|
|
60
|
+
await this.#dequeueRuns();
|
|
61
|
+
}
|
|
62
|
+
async shutdown() {
|
|
63
|
+
this.disconnectPresence?.();
|
|
64
|
+
try {
|
|
65
|
+
this.socket.close();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.debug("[DevSupervisor] shutdown, socket failed to close", { error });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async initializeWorker(manifest, stop) {
|
|
72
|
+
if (this.lastManifest && this.lastManifest.contentHash === manifest.contentHash) {
|
|
73
|
+
logger.debug("worker skipped", { lastManifestContentHash: this.lastManifest?.contentHash });
|
|
74
|
+
eventBus.emit("workerSkipped");
|
|
75
|
+
stop();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const env = await this.#getEnvVars();
|
|
79
|
+
const backgroundWorker = new BackgroundWorker(manifest, {
|
|
80
|
+
env,
|
|
81
|
+
cwd: this.options.config.workingDir,
|
|
82
|
+
stop,
|
|
83
|
+
});
|
|
84
|
+
logger.debug("initializing background worker", { manifest });
|
|
85
|
+
await backgroundWorker.initialize();
|
|
86
|
+
if (!backgroundWorker.manifest) {
|
|
87
|
+
stop();
|
|
88
|
+
throw new Error("Could not initialize worker");
|
|
89
|
+
}
|
|
90
|
+
const validationIssue = validateWorkerManifest(backgroundWorker.manifest);
|
|
91
|
+
if (validationIssue) {
|
|
92
|
+
prettyError(generationValidationIssueHeader(validationIssue), generateValidationIssueMessage(validationIssue, backgroundWorker.manifest, manifest), generateValidationIssueFooter(validationIssue));
|
|
93
|
+
stop();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const sourceFiles = resolveSourceFiles(manifest.sources, backgroundWorker.manifest.tasks);
|
|
97
|
+
const backgroundWorkerBody = {
|
|
98
|
+
localOnly: true,
|
|
99
|
+
metadata: {
|
|
100
|
+
packageVersion: manifest.packageVersion,
|
|
101
|
+
cliPackageVersion: manifest.cliPackageVersion,
|
|
102
|
+
tasks: backgroundWorker.manifest.tasks,
|
|
103
|
+
queues: backgroundWorker.manifest.queues,
|
|
104
|
+
contentHash: manifest.contentHash,
|
|
105
|
+
sourceFiles,
|
|
106
|
+
},
|
|
107
|
+
engine: "V2",
|
|
108
|
+
supportsLazyAttempts: true,
|
|
109
|
+
};
|
|
110
|
+
const backgroundWorkerRecord = await this.options.client.createBackgroundWorker(this.options.config.project, backgroundWorkerBody);
|
|
111
|
+
if (!backgroundWorkerRecord.success) {
|
|
112
|
+
stop();
|
|
113
|
+
throw new Error(backgroundWorkerRecord.error);
|
|
114
|
+
}
|
|
115
|
+
backgroundWorker.serverWorker = backgroundWorkerRecord.data;
|
|
116
|
+
this.#registerWorker(backgroundWorker);
|
|
117
|
+
this.lastManifest = manifest;
|
|
118
|
+
this.latestWorkerId = backgroundWorker.serverWorker.id;
|
|
119
|
+
eventBus.emit("backgroundWorkerInitialized", backgroundWorker);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Tries to dequeue runs for all the active versions running.
|
|
123
|
+
* For the latest version we will pull from the main queue, so we don't specify that.
|
|
124
|
+
*/
|
|
125
|
+
async #dequeueRuns() {
|
|
126
|
+
if (!this.latestWorkerId) {
|
|
127
|
+
//try again later
|
|
128
|
+
logger.debug(`[DevSupervisor] dequeueRuns. No latest worker ID, trying again later`);
|
|
129
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithoutRun);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.runLimiter &&
|
|
133
|
+
this.runLimiter.activeCount + this.runLimiter.pendingCount > this.runLimiter.concurrency) {
|
|
134
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Run limit reached, trying again later`);
|
|
135
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithoutRun);
|
|
136
|
+
}
|
|
137
|
+
//get relevant versions
|
|
138
|
+
//ignore deprecated and the latest worker
|
|
139
|
+
const oldWorkerIds = this.#getActiveOldWorkers();
|
|
140
|
+
try {
|
|
141
|
+
//todo later we should track available resources and machines used, and pass them in here (it supports it)
|
|
142
|
+
const result = await this.options.client.dev.dequeue({
|
|
143
|
+
currentWorker: this.latestWorkerId,
|
|
144
|
+
oldWorkers: oldWorkerIds,
|
|
145
|
+
});
|
|
146
|
+
if (!result.success) {
|
|
147
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Failed to dequeue runs`, {
|
|
148
|
+
error: result.error,
|
|
149
|
+
});
|
|
150
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithoutRun);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
//no runs, try again later
|
|
154
|
+
if (result.data.dequeuedMessages.length === 0) {
|
|
155
|
+
// logger.debug(`No dequeue runs for versions`, {
|
|
156
|
+
// oldWorkerIds,
|
|
157
|
+
// latestWorkerId: this.latestWorkerId,
|
|
158
|
+
// });
|
|
159
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithoutRun);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Results`, {
|
|
163
|
+
dequeuedMessages: JSON.stringify(result.data.dequeuedMessages),
|
|
164
|
+
});
|
|
165
|
+
//start runs
|
|
166
|
+
for (const message of result.data.dequeuedMessages) {
|
|
167
|
+
const worker = this.workers.get(message.backgroundWorker.friendlyId);
|
|
168
|
+
if (!worker) {
|
|
169
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Dequeued a run but there's no BackgroundWorker so we can't execute it`, {
|
|
170
|
+
run: message.run.friendlyId,
|
|
171
|
+
workerId: message.backgroundWorker.friendlyId,
|
|
172
|
+
});
|
|
173
|
+
//todo call the API to crash the run with a good message
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
let runController = this.runControllers.get(message.run.friendlyId);
|
|
177
|
+
if (runController) {
|
|
178
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Dequeuing a run that already has a runController`, {
|
|
179
|
+
runController: message.run.friendlyId,
|
|
180
|
+
});
|
|
181
|
+
//todo, what do we do here?
|
|
182
|
+
//todo I think the run shouldn't exist and we should kill the process but TBC
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (!worker.serverWorker) {
|
|
186
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Worker doesn't have a serverWorker`, {
|
|
187
|
+
run: message.run.friendlyId,
|
|
188
|
+
worker,
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (!worker.manifest) {
|
|
193
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Worker doesn't have a manifest`, {
|
|
194
|
+
run: message.run.friendlyId,
|
|
195
|
+
worker,
|
|
196
|
+
});
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
//new run
|
|
200
|
+
runController = new DevRunController({
|
|
201
|
+
runFriendlyId: message.run.friendlyId,
|
|
202
|
+
worker: worker,
|
|
203
|
+
httpClient: this.options.client,
|
|
204
|
+
logLevel: this.options.args.logLevel,
|
|
205
|
+
onFinished: () => {
|
|
206
|
+
logger.debug("[DevSupervisor] Run finished", { runId: message.run.friendlyId });
|
|
207
|
+
//stop the run controller, and remove it
|
|
208
|
+
runController?.stop();
|
|
209
|
+
this.runControllers.delete(message.run.friendlyId);
|
|
210
|
+
this.#unsubscribeFromRunNotifications(message.run.friendlyId);
|
|
211
|
+
//stop the worker if it is deprecated and there are no more runs
|
|
212
|
+
if (worker.deprecated) {
|
|
213
|
+
this.#tryDeleteWorker(message.backgroundWorker.friendlyId).finally(() => { });
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
onSubscribeToRunNotifications: async (run, snapshot) => {
|
|
217
|
+
this.#subscribeToRunNotifications();
|
|
218
|
+
},
|
|
219
|
+
onUnsubscribeFromRunNotifications: async (run, snapshot) => {
|
|
220
|
+
this.#unsubscribeFromRunNotifications(run.friendlyId);
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
this.runControllers.set(message.run.friendlyId, runController);
|
|
224
|
+
if (this.runLimiter) {
|
|
225
|
+
this.runLimiter(() => runController.start(message)).then(() => {
|
|
226
|
+
logger.debug("[DevSupervisor] Run started", { runId: message.run.friendlyId });
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
//don't await for run completion, we want to dequeue more runs
|
|
231
|
+
runController.start(message).then(() => {
|
|
232
|
+
logger.debug("[DevSupervisor] Run started", { runId: message.run.friendlyId });
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithRun);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
logger.debug(`[DevSupervisor] dequeueRuns. Error thrown`, { error });
|
|
240
|
+
//dequeue again
|
|
241
|
+
setTimeout(() => this.#dequeueRuns(), this.config.dequeueIntervalWithoutRun);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async #startPresenceConnection() {
|
|
245
|
+
try {
|
|
246
|
+
const eventSource = this.options.client.dev.presenceConnection();
|
|
247
|
+
// Regular "ping" messages
|
|
248
|
+
eventSource.addEventListener("presence", (event) => {
|
|
249
|
+
// logger.debug(`Presence ping received`, { event });
|
|
250
|
+
});
|
|
251
|
+
// Connection was lost and successfully reconnected
|
|
252
|
+
eventSource.addEventListener("reconnect", (event) => {
|
|
253
|
+
logger.debug("[DevSupervisor] Presence connection restored");
|
|
254
|
+
});
|
|
255
|
+
// Handle messages that might have been missed during disconnection
|
|
256
|
+
eventSource.addEventListener("missed_events", (event) => {
|
|
257
|
+
logger.debug("[DevSupervisor] Missed some presence events during disconnection");
|
|
258
|
+
});
|
|
259
|
+
// If you need to close it manually
|
|
260
|
+
return () => {
|
|
261
|
+
logger.info("[DevSupervisor] Closing presence connection");
|
|
262
|
+
eventSource.close();
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async #getEnvVars() {
|
|
270
|
+
const environmentVariablesResponse = await this.options.client.getEnvironmentVariables(this.options.config.project);
|
|
271
|
+
const processEnv = gatherProcessEnv();
|
|
272
|
+
const dotEnvVars = resolveDotEnvVars(undefined, this.options.args.envFile);
|
|
273
|
+
const OTEL_IMPORT_HOOK_INCLUDES = (this.options.config.instrumentedPackageNames ?? []).join(",");
|
|
274
|
+
return {
|
|
275
|
+
...sanitizeEnvVars(processEnv),
|
|
276
|
+
...sanitizeEnvVars(environmentVariablesResponse.success ? environmentVariablesResponse.data.variables : {}),
|
|
277
|
+
...sanitizeEnvVars(dotEnvVars),
|
|
278
|
+
TRIGGER_API_URL: this.options.client.apiURL,
|
|
279
|
+
TRIGGER_SECRET_KEY: this.options.client.accessToken,
|
|
280
|
+
OTEL_EXPORTER_OTLP_COMPRESSION: "none",
|
|
281
|
+
OTEL_RESOURCE_ATTRIBUTES: JSON.stringify({
|
|
282
|
+
[SemanticInternalAttributes.PROJECT_DIR]: this.options.config.workingDir,
|
|
283
|
+
}),
|
|
284
|
+
OTEL_IMPORT_HOOK_INCLUDES,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
async #registerWorker(worker) {
|
|
288
|
+
if (!worker.serverWorker) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
//deprecate other workers
|
|
292
|
+
for (const [workerId, existingWorker] of this.workers.entries()) {
|
|
293
|
+
if (workerId === worker.serverWorker.id) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
existingWorker.deprecate();
|
|
297
|
+
this.#tryDeleteWorker(workerId).finally(() => { });
|
|
298
|
+
}
|
|
299
|
+
this.workers.set(worker.serverWorker.id, worker);
|
|
300
|
+
}
|
|
301
|
+
#createSocket() {
|
|
302
|
+
const wsUrl = new URL(this.options.client.apiURL);
|
|
303
|
+
wsUrl.pathname = "/dev-worker";
|
|
304
|
+
this.socket = io(wsUrl.href, {
|
|
305
|
+
transports: ["websocket"],
|
|
306
|
+
extraHeaders: {
|
|
307
|
+
Authorization: `Bearer ${this.options.client.accessToken}`,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
this.socket.on("run:notify", async ({ version, run }) => {
|
|
311
|
+
logger.debug("[DevSupervisor] Received run notification", { version, run });
|
|
312
|
+
this.options.client.dev.sendDebugLog(run.friendlyId, {
|
|
313
|
+
time: new Date(),
|
|
314
|
+
message: "run:notify received by runner",
|
|
315
|
+
});
|
|
316
|
+
const controller = this.runControllers.get(run.friendlyId);
|
|
317
|
+
if (!controller) {
|
|
318
|
+
logger.debug("[DevSupervisor] Ignoring notification, no local run ID", {
|
|
319
|
+
runId: run.friendlyId,
|
|
320
|
+
});
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
await controller.getLatestSnapshot();
|
|
324
|
+
});
|
|
325
|
+
this.socket.on("connect", () => {
|
|
326
|
+
logger.debug("[DevSupervisor] Connected to supervisor");
|
|
327
|
+
if (this.socket.recovered || this.socketIsReconnecting) {
|
|
328
|
+
logger.debug("[DevSupervisor] Socket recovered");
|
|
329
|
+
eventBus.emit("socketConnectionReconnected", `Connection was recovered`);
|
|
330
|
+
}
|
|
331
|
+
this.socketIsReconnecting = false;
|
|
332
|
+
for (const controller of this.runControllers.values()) {
|
|
333
|
+
controller.resubscribeToRunNotifications();
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
this.socket.on("connect_error", (error) => {
|
|
337
|
+
logger.debug("[DevSupervisor] Connection error", { error });
|
|
338
|
+
});
|
|
339
|
+
this.socket.on("disconnect", (reason, description) => {
|
|
340
|
+
logger.debug("[DevSupervisor] socket was disconnected", {
|
|
341
|
+
reason,
|
|
342
|
+
description,
|
|
343
|
+
active: this.socket.active,
|
|
344
|
+
});
|
|
345
|
+
if (reason === "io server disconnect") {
|
|
346
|
+
// the disconnection was initiated by the server, you need to manually reconnect
|
|
347
|
+
this.socket.connect();
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.socketIsReconnecting = true;
|
|
351
|
+
eventBus.emit("socketConnectionDisconnected", reason);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
const interval = setInterval(() => {
|
|
355
|
+
logger.debug("[DevSupervisor] Socket connections", {
|
|
356
|
+
connections: Array.from(this.socketConnections),
|
|
357
|
+
});
|
|
358
|
+
}, 5000);
|
|
359
|
+
}
|
|
360
|
+
#subscribeToRunNotifications() {
|
|
361
|
+
const runFriendlyIds = Array.from(this.runControllers.keys());
|
|
362
|
+
if (!this.socket) {
|
|
363
|
+
logger.debug("[DevSupervisor] Socket not connected");
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
for (const id of runFriendlyIds) {
|
|
367
|
+
this.socketConnections.add(id);
|
|
368
|
+
}
|
|
369
|
+
logger.debug("[DevSupervisor] Subscribing to run notifications", {
|
|
370
|
+
runFriendlyIds,
|
|
371
|
+
connections: Array.from(this.socketConnections),
|
|
372
|
+
});
|
|
373
|
+
this.socket.emit("run:subscribe", { version: "1", runFriendlyIds });
|
|
374
|
+
}
|
|
375
|
+
#unsubscribeFromRunNotifications(friendlyId) {
|
|
376
|
+
if (!this.socket) {
|
|
377
|
+
logger.debug("[DevSupervisor] Socket not connected");
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
this.socketConnections.delete(friendlyId);
|
|
381
|
+
logger.debug("[DevSupervisor] Unsubscribing from run notifications", {
|
|
382
|
+
runFriendlyId: friendlyId,
|
|
383
|
+
connections: Array.from(this.socketConnections),
|
|
384
|
+
});
|
|
385
|
+
this.socket.emit("run:unsubscribe", { version: "1", runFriendlyIds: [friendlyId] });
|
|
386
|
+
}
|
|
387
|
+
#getActiveOldWorkers() {
|
|
388
|
+
return Array.from(this.workers.values())
|
|
389
|
+
.filter((worker) => {
|
|
390
|
+
//exclude the latest
|
|
391
|
+
if (worker.serverWorker?.id === this.latestWorkerId) {
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
//if it's deprecated AND there are no executing runs, then filter it out
|
|
395
|
+
if (worker.deprecated && worker.serverWorker?.id) {
|
|
396
|
+
return this.#workerHasInProgressRuns(worker.serverWorker.id);
|
|
397
|
+
}
|
|
398
|
+
return true;
|
|
399
|
+
})
|
|
400
|
+
.map((worker) => worker.serverWorker?.id)
|
|
401
|
+
.filter((id) => id !== undefined);
|
|
402
|
+
}
|
|
403
|
+
#workerHasInProgressRuns(friendlyId) {
|
|
404
|
+
for (const controller of this.runControllers.values()) {
|
|
405
|
+
logger.debug("[DevSupervisor] Checking controller", {
|
|
406
|
+
controllerFriendlyId: controller.workerFriendlyId,
|
|
407
|
+
friendlyId,
|
|
408
|
+
});
|
|
409
|
+
if (controller.workerFriendlyId === friendlyId) {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
/** Deletes the worker if there are no active runs, after a delay */
|
|
416
|
+
async #tryDeleteWorker(friendlyId) {
|
|
417
|
+
await awaitTimeout(1_000);
|
|
418
|
+
this.#deleteWorker(friendlyId);
|
|
419
|
+
}
|
|
420
|
+
#deleteWorker(friendlyId) {
|
|
421
|
+
logger.debug("[DevSupervisor] Delete worker (if relevant)", {
|
|
422
|
+
workerId: friendlyId,
|
|
423
|
+
});
|
|
424
|
+
const worker = this.workers.get(friendlyId);
|
|
425
|
+
if (!worker) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (this.#workerHasInProgressRuns(friendlyId)) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
worker.stop();
|
|
432
|
+
this.workers.delete(friendlyId);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function gatherProcessEnv() {
|
|
436
|
+
const $env = {
|
|
437
|
+
...process.env,
|
|
438
|
+
NODE_ENV: "development",
|
|
439
|
+
};
|
|
440
|
+
// Filter out undefined values
|
|
441
|
+
return Object.fromEntries(Object.entries($env).filter(([key, value]) => value !== undefined));
|
|
442
|
+
}
|
|
443
|
+
function validateWorkerManifest(manifest) {
|
|
444
|
+
const issues = [];
|
|
445
|
+
if (!manifest.tasks || manifest.tasks.length === 0) {
|
|
446
|
+
return { type: "noTasksDefined" };
|
|
447
|
+
}
|
|
448
|
+
// Check for any duplicate task ids
|
|
449
|
+
const taskIds = manifest.tasks.map((task) => task.id);
|
|
450
|
+
const duplicateTaskIds = taskIds.filter((id, index) => taskIds.indexOf(id) !== index);
|
|
451
|
+
if (duplicateTaskIds.length > 0) {
|
|
452
|
+
return { type: "duplicateTaskId", duplicationTaskIds: duplicateTaskIds };
|
|
453
|
+
}
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
function generationValidationIssueHeader(issue) {
|
|
457
|
+
switch (issue.type) {
|
|
458
|
+
case "duplicateTaskId": {
|
|
459
|
+
return `Duplicate task ids detected`;
|
|
460
|
+
}
|
|
461
|
+
case "noTasksDefined": {
|
|
462
|
+
return `No tasks exported from your trigger files`;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
function generateValidationIssueFooter(issue) {
|
|
467
|
+
switch (issue.type) {
|
|
468
|
+
case "duplicateTaskId": {
|
|
469
|
+
return cliLink("View the task docs", "https://trigger.dev/docs/tasks/overview");
|
|
470
|
+
}
|
|
471
|
+
case "noTasksDefined": {
|
|
472
|
+
return cliLink("View the task docs", "https://trigger.dev/docs/tasks/overview");
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function generateValidationIssueMessage(issue, manifest, buildManifest) {
|
|
477
|
+
switch (issue.type) {
|
|
478
|
+
case "duplicateTaskId": {
|
|
479
|
+
return createDuplicateTaskIdOutputErrorMessage(issue.duplicationTaskIds, manifest.tasks);
|
|
480
|
+
}
|
|
481
|
+
case "noTasksDefined": {
|
|
482
|
+
return `
|
|
483
|
+
Files:
|
|
484
|
+
${buildManifest.files.map((file) => file.entry).join("\n")}
|
|
485
|
+
Make sure you have at least one task exported from your trigger files.
|
|
486
|
+
You may have defined a task and forgot to add the export statement:
|
|
487
|
+
\`\`\`ts
|
|
488
|
+
import { task } from "@trigger.dev/sdk/v3";
|
|
489
|
+
👇 Don't forget this
|
|
490
|
+
export const myTask = task({
|
|
491
|
+
id: "myTask",
|
|
492
|
+
async run() {
|
|
493
|
+
// Your task logic here
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
\`\`\`
|
|
497
|
+
`.replace(/^ {8}/gm, "");
|
|
498
|
+
}
|
|
499
|
+
default: {
|
|
500
|
+
return `Unknown validation issue: ${issue}`;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
function createDuplicateTaskIdOutputErrorMessage(duplicateTaskIds, tasks) {
|
|
505
|
+
const duplicateTable = duplicateTaskIds
|
|
506
|
+
.map((id) => {
|
|
507
|
+
const $tasks = tasks.filter((task) => task.id === id);
|
|
508
|
+
return `\n\n${chalkTask(id)} was found in:${tasks
|
|
509
|
+
.map((task) => `\n${task.filePath} -> ${task.exportName}`)
|
|
510
|
+
.join("")}`;
|
|
511
|
+
})
|
|
512
|
+
.join("");
|
|
513
|
+
return `Duplicate ${chalkTask("task id")} detected:${duplicateTable}`;
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=devSupervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devSupervisor.js","sourceRoot":"","sources":["../../../src/dev/devSupervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createLockFile(cwd: string): Promise<() => void>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile } from "../utilities/fileSystem.js";
|
|
3
|
+
import { tryCatch } from "@trigger.dev/core/utils";
|
|
4
|
+
import { logger } from "../utilities/logger.js";
|
|
5
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
6
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
7
|
+
import { onExit } from "signal-exit";
|
|
8
|
+
const LOCK_FILE_NAME = "dev.lock";
|
|
9
|
+
export async function createLockFile(cwd) {
|
|
10
|
+
const currentPid = process.pid;
|
|
11
|
+
const lockFilePath = path.join(cwd, ".trigger", LOCK_FILE_NAME);
|
|
12
|
+
logger.debug("Checking for lockfile", { lockFilePath, currentPid });
|
|
13
|
+
const removeLockFile = () => {
|
|
14
|
+
try {
|
|
15
|
+
logger.debug("Removing lockfile", { lockFilePath });
|
|
16
|
+
return unlinkSync(lockFilePath);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
// This sometimes fails on Windows with EBUSY
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const removeExitListener = onExit(removeLockFile);
|
|
23
|
+
const [, existingLockfileContents] = await tryCatch(readFile(lockFilePath));
|
|
24
|
+
if (existingLockfileContents) {
|
|
25
|
+
// Read the pid number from the lockfile
|
|
26
|
+
const existingPid = Number(existingLockfileContents);
|
|
27
|
+
logger.debug("Lockfile exists", { lockFilePath, existingPid, currentPid });
|
|
28
|
+
if (existingPid === currentPid) {
|
|
29
|
+
logger.debug("Lockfile exists and is owned by current process", {
|
|
30
|
+
lockFilePath,
|
|
31
|
+
existingPid,
|
|
32
|
+
currentPid,
|
|
33
|
+
});
|
|
34
|
+
return () => {
|
|
35
|
+
removeExitListener();
|
|
36
|
+
removeLockFile();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// If the pid is different, try and kill the existing pid
|
|
40
|
+
logger.debug("Lockfile exists and is owned by another process, killing it", {
|
|
41
|
+
lockFilePath,
|
|
42
|
+
existingPid,
|
|
43
|
+
currentPid,
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
process.kill(existingPid);
|
|
47
|
+
// If it did kill the process, it will have exited, deleting the lockfile, so let's wait for that to happen
|
|
48
|
+
// But let's not wait forever
|
|
49
|
+
await new Promise((resolve, reject) => {
|
|
50
|
+
const timeout = setTimeout(() => {
|
|
51
|
+
clearInterval(interval);
|
|
52
|
+
reject(new Error("Timed out waiting for lockfile to be deleted"));
|
|
53
|
+
}, 5000);
|
|
54
|
+
const interval = setInterval(() => {
|
|
55
|
+
if (!existsSync(lockFilePath)) {
|
|
56
|
+
clearInterval(interval);
|
|
57
|
+
clearTimeout(timeout);
|
|
58
|
+
resolve(true);
|
|
59
|
+
}
|
|
60
|
+
}, 100);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
logger.debug("Failed to kill existing process, lets assume it's not running", { error });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Now write the current pid to the lockfile
|
|
68
|
+
await writeFileAndEnsureDirExists(lockFilePath, currentPid.toString());
|
|
69
|
+
logger.debug("Lockfile created", { lockFilePath, currentPid });
|
|
70
|
+
return () => {
|
|
71
|
+
removeExitListener();
|
|
72
|
+
removeLockFile();
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function writeFileAndEnsureDirExists(filePath, data) {
|
|
76
|
+
const dir = path.dirname(filePath);
|
|
77
|
+
await mkdir(dir, { recursive: true });
|
|
78
|
+
await writeFile(filePath, data);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/dev/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CliApiClient } from "../apiClient.js";
|
|
2
|
+
export declare const startMcpServer: (options: {
|
|
3
|
+
port: number;
|
|
4
|
+
cliApiClient: CliApiClient;
|
|
5
|
+
devSession: {
|
|
6
|
+
dashboardUrl: string;
|
|
7
|
+
projectRef: string;
|
|
8
|
+
};
|
|
9
|
+
}) => Promise<void>;
|
|
10
|
+
export declare const stopMcpServer: () => void;
|