trigger.dev 3.3.17 → 4.0.0-v4-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +31 -0
  2. package/dist/esm/apiClient.d.ts +70 -72
  3. package/dist/esm/apiClient.js +195 -31
  4. package/dist/esm/apiClient.js.map +1 -1
  5. package/dist/esm/build/buildWorker.d.ts +7 -6
  6. package/dist/esm/build/buildWorker.js +10 -36
  7. package/dist/esm/build/buildWorker.js.map +1 -1
  8. package/dist/esm/build/bundle.d.ts +12 -1
  9. package/dist/esm/build/bundle.js +61 -19
  10. package/dist/esm/build/bundle.js.map +1 -1
  11. package/dist/esm/build/entryPoints.js +17 -6
  12. package/dist/esm/build/entryPoints.js.map +1 -1
  13. package/dist/esm/build/packageModules.d.ts +14 -5
  14. package/dist/esm/build/packageModules.js +135 -35
  15. package/dist/esm/build/packageModules.js.map +1 -1
  16. package/dist/esm/cli/common.js +5 -3
  17. package/dist/esm/cli/common.js.map +1 -1
  18. package/dist/esm/cli/index.js +4 -0
  19. package/dist/esm/cli/index.js.map +1 -1
  20. package/dist/esm/commands/deploy.js +2 -1
  21. package/dist/esm/commands/deploy.js.map +1 -1
  22. package/dist/esm/commands/dev.d.ts +9 -0
  23. package/dist/esm/commands/dev.js +10 -1
  24. package/dist/esm/commands/dev.js.map +1 -1
  25. package/dist/esm/commands/list-profiles.d.ts +2 -6
  26. package/dist/esm/commands/list-profiles.js +7 -4
  27. package/dist/esm/commands/list-profiles.js.map +1 -1
  28. package/dist/esm/commands/login.js +3 -2
  29. package/dist/esm/commands/login.js.map +1 -1
  30. package/dist/esm/commands/switch.d.ts +19 -0
  31. package/dist/esm/commands/switch.js +68 -0
  32. package/dist/esm/commands/switch.js.map +1 -0
  33. package/dist/esm/commands/trigger.d.ts +33 -0
  34. package/dist/esm/commands/trigger.js +88 -0
  35. package/dist/esm/commands/trigger.js.map +1 -0
  36. package/dist/esm/commands/workers/build.d.ts +4 -0
  37. package/dist/esm/commands/workers/build.js +340 -0
  38. package/dist/esm/commands/workers/build.js.map +1 -0
  39. package/dist/esm/commands/workers/create.d.ts +2 -0
  40. package/dist/esm/commands/workers/create.js +91 -0
  41. package/dist/esm/commands/workers/create.js.map +1 -0
  42. package/dist/esm/commands/workers/index.d.ts +2 -0
  43. package/dist/esm/commands/workers/index.js +13 -0
  44. package/dist/esm/commands/workers/index.js.map +1 -0
  45. package/dist/esm/commands/workers/list.d.ts +2 -0
  46. package/dist/esm/commands/workers/list.js +80 -0
  47. package/dist/esm/commands/workers/list.js.map +1 -0
  48. package/dist/esm/commands/workers/run.d.ts +2 -0
  49. package/dist/esm/commands/workers/run.js +105 -0
  50. package/dist/esm/commands/workers/run.js.map +1 -0
  51. package/dist/esm/config.js +11 -1
  52. package/dist/esm/config.js.map +1 -1
  53. package/dist/esm/deploy/buildImage.d.ts +1 -1
  54. package/dist/esm/deploy/buildImage.js +54 -34
  55. package/dist/esm/deploy/buildImage.js.map +1 -1
  56. package/dist/esm/dev/backgroundWorker.d.ts +2 -240
  57. package/dist/esm/dev/backgroundWorker.js +8 -305
  58. package/dist/esm/dev/backgroundWorker.js.map +1 -1
  59. package/dist/esm/dev/devOutput.js +13 -5
  60. package/dist/esm/dev/devOutput.js.map +1 -1
  61. package/dist/esm/dev/devSession.js +25 -48
  62. package/dist/esm/dev/devSession.js.map +1 -1
  63. package/dist/esm/dev/devSupervisor.d.ts +12 -0
  64. package/dist/esm/dev/devSupervisor.js +515 -0
  65. package/dist/esm/dev/devSupervisor.js.map +1 -0
  66. package/dist/esm/dev/lock.d.ts +1 -0
  67. package/dist/esm/dev/lock.js +80 -0
  68. package/dist/esm/dev/lock.js.map +1 -0
  69. package/dist/esm/dev/mcpServer.d.ts +10 -0
  70. package/dist/esm/dev/mcpServer.js +201 -0
  71. package/dist/esm/dev/mcpServer.js.map +1 -0
  72. package/dist/esm/dev/workerRuntime.d.ts +0 -1
  73. package/dist/esm/dev/workerRuntime.js +1 -335
  74. package/dist/esm/dev/workerRuntime.js.map +1 -1
  75. package/dist/esm/entryPoints/dev-index-worker.js +9 -7
  76. package/dist/esm/entryPoints/dev-index-worker.js.map +1 -1
  77. package/dist/esm/entryPoints/dev-run-controller.d.ts +53 -0
  78. package/dist/esm/entryPoints/dev-run-controller.js +615 -0
  79. package/dist/esm/entryPoints/dev-run-controller.js.map +1 -0
  80. package/dist/esm/entryPoints/dev-run-worker.js +249 -174
  81. package/dist/esm/entryPoints/dev-run-worker.js.map +1 -1
  82. package/dist/esm/entryPoints/{deploy-index-controller.js → managed-index-controller.js} +3 -1
  83. package/dist/esm/entryPoints/managed-index-controller.js.map +1 -0
  84. package/dist/esm/entryPoints/{deploy-index-worker.js → managed-index-worker.js} +12 -24
  85. package/dist/esm/entryPoints/managed-index-worker.js.map +1 -0
  86. package/dist/esm/entryPoints/managed-run-controller.js +1350 -0
  87. package/dist/esm/entryPoints/managed-run-controller.js.map +1 -0
  88. package/dist/esm/entryPoints/{deploy-run-worker.js → managed-run-worker.js} +104 -67
  89. package/dist/esm/entryPoints/managed-run-worker.js.map +1 -0
  90. package/dist/esm/executions/taskRunProcess.d.ts +18 -79
  91. package/dist/esm/executions/taskRunProcess.js +74 -28
  92. package/dist/esm/executions/taskRunProcess.js.map +1 -1
  93. package/dist/esm/indexing/indexWorkerManifest.d.ts +9 -2
  94. package/dist/esm/indexing/registerResources.d.ts +2 -0
  95. package/dist/esm/indexing/registerResources.js +40 -0
  96. package/dist/esm/indexing/registerResources.js.map +1 -0
  97. package/dist/esm/utilities/configFiles.d.ts +36 -15
  98. package/dist/esm/utilities/configFiles.js +73 -26
  99. package/dist/esm/utilities/configFiles.js.map +1 -1
  100. package/dist/esm/utilities/eventBus.d.ts +6 -3
  101. package/dist/esm/utilities/eventBus.js.map +1 -1
  102. package/dist/esm/utilities/initialBanner.js +18 -6
  103. package/dist/esm/utilities/initialBanner.js.map +1 -1
  104. package/dist/esm/utilities/sanitizeEnvVars.d.ts +16 -3
  105. package/dist/esm/utilities/sanitizeEnvVars.js +15 -0
  106. package/dist/esm/utilities/sanitizeEnvVars.js.map +1 -1
  107. package/dist/esm/version.js +1 -1
  108. package/package.json +11 -5
  109. package/dist/esm/entryPoints/deploy-index-controller.js.map +0 -1
  110. package/dist/esm/entryPoints/deploy-index-worker.js.map +0 -1
  111. package/dist/esm/entryPoints/deploy-run-controller.js +0 -1141
  112. package/dist/esm/entryPoints/deploy-run-controller.js.map +0 -1
  113. package/dist/esm/entryPoints/deploy-run-worker.js.map +0 -1
  114. package/dist/esm/indexing/registerTasks.d.ts +0 -2
  115. package/dist/esm/indexing/registerTasks.js +0 -65
  116. package/dist/esm/indexing/registerTasks.js.map +0 -1
  117. /package/dist/esm/entryPoints/{deploy-index-controller.d.ts → managed-index-controller.d.ts} +0 -0
  118. /package/dist/esm/entryPoints/{deploy-index-worker.d.ts → managed-index-worker.d.ts} +0 -0
  119. /package/dist/esm/entryPoints/{deploy-run-controller.d.ts → managed-run-controller.d.ts} +0 -0
  120. /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;