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

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 (38) hide show
  1. package/dist/esm/build/bundle.js +7 -4
  2. package/dist/esm/build/bundle.js.map +1 -1
  3. package/dist/esm/commands/init.js +6 -3
  4. package/dist/esm/commands/init.js.map +1 -1
  5. package/dist/esm/dev/devSupervisor.js +14 -10
  6. package/dist/esm/dev/devSupervisor.js.map +1 -1
  7. package/dist/esm/entryPoints/dev-run-controller.js +6 -6
  8. package/dist/esm/entryPoints/dev-run-controller.js.map +1 -1
  9. package/dist/esm/entryPoints/dev-run-worker.js +28 -1
  10. package/dist/esm/entryPoints/dev-run-worker.js.map +1 -1
  11. package/dist/esm/entryPoints/managed/controller.d.ts +50 -0
  12. package/dist/esm/entryPoints/managed/controller.js +441 -0
  13. package/dist/esm/entryPoints/managed/controller.js.map +1 -0
  14. package/dist/esm/entryPoints/managed/env.d.ts +170 -0
  15. package/dist/esm/entryPoints/managed/env.js +191 -0
  16. package/dist/esm/entryPoints/managed/env.js.map +1 -0
  17. package/dist/esm/entryPoints/managed/execution.d.ts +94 -0
  18. package/dist/esm/entryPoints/managed/execution.js +638 -0
  19. package/dist/esm/entryPoints/managed/execution.js.map +1 -0
  20. package/dist/esm/entryPoints/managed/heartbeat.d.ts +23 -0
  21. package/dist/esm/entryPoints/managed/heartbeat.js +68 -0
  22. package/dist/esm/entryPoints/managed/heartbeat.js.map +1 -0
  23. package/dist/esm/entryPoints/managed/logger.d.ts +19 -0
  24. package/dist/esm/entryPoints/managed/logger.js +31 -0
  25. package/dist/esm/entryPoints/managed/logger.js.map +1 -0
  26. package/dist/esm/entryPoints/managed/overrides.d.ts +16 -0
  27. package/dist/esm/entryPoints/managed/overrides.js +17 -0
  28. package/dist/esm/entryPoints/managed/overrides.js.map +1 -0
  29. package/dist/esm/entryPoints/managed/poller.d.ts +26 -0
  30. package/dist/esm/entryPoints/managed/poller.js +94 -0
  31. package/dist/esm/entryPoints/managed/poller.js.map +1 -0
  32. package/dist/esm/entryPoints/managed-run-controller.js +8 -1347
  33. package/dist/esm/entryPoints/managed-run-controller.js.map +1 -1
  34. package/dist/esm/executions/taskRunProcess.d.ts +2 -2
  35. package/dist/esm/executions/taskRunProcess.js +1 -1
  36. package/dist/esm/executions/taskRunProcess.js.map +1 -1
  37. package/dist/esm/version.js +1 -1
  38. package/package.json +4 -4
@@ -0,0 +1,23 @@
1
+ import { WorkloadHttpClient } from "@trigger.dev/core/v3/runEngineWorker";
2
+ import { RunLogger } from "./logger.js";
3
+ export type RunExecutionHeartbeatOptions = {
4
+ runFriendlyId: string;
5
+ snapshotFriendlyId: string;
6
+ httpClient: WorkloadHttpClient;
7
+ logger: RunLogger;
8
+ heartbeatIntervalSeconds: number;
9
+ };
10
+ export declare class RunExecutionHeartbeat {
11
+ private readonly runFriendlyId;
12
+ private snapshotFriendlyId;
13
+ private readonly httpClient;
14
+ private readonly logger;
15
+ private readonly heartbeatIntervalMs;
16
+ private readonly heartbeat;
17
+ constructor(opts: RunExecutionHeartbeatOptions);
18
+ resetCurrentInterval(): void;
19
+ updateSnapshotId(snapshotFriendlyId: string): void;
20
+ updateInterval(intervalMs: number): void;
21
+ start(): void;
22
+ stop(): void;
23
+ }
@@ -0,0 +1,68 @@
1
+ import { IntervalService } from "@trigger.dev/core/v3";
2
+ export class RunExecutionHeartbeat {
3
+ runFriendlyId;
4
+ snapshotFriendlyId;
5
+ httpClient;
6
+ logger;
7
+ heartbeatIntervalMs;
8
+ heartbeat;
9
+ constructor(opts) {
10
+ this.runFriendlyId = opts.runFriendlyId;
11
+ this.snapshotFriendlyId = opts.snapshotFriendlyId;
12
+ this.httpClient = opts.httpClient;
13
+ this.logger = opts.logger;
14
+ this.heartbeatIntervalMs = opts.heartbeatIntervalSeconds * 1000;
15
+ this.logger.sendDebugLog({
16
+ runId: this.runFriendlyId,
17
+ message: "RunExecutionHeartbeat",
18
+ properties: {
19
+ runFriendlyId: this.runFriendlyId,
20
+ snapshotFriendlyId: this.snapshotFriendlyId,
21
+ heartbeatIntervalSeconds: opts.heartbeatIntervalSeconds,
22
+ },
23
+ });
24
+ this.heartbeat = new IntervalService({
25
+ onInterval: async () => {
26
+ this.logger.sendDebugLog({
27
+ runId: this.runFriendlyId,
28
+ message: "heartbeat: started",
29
+ });
30
+ const response = await this.httpClient.heartbeatRun(this.runFriendlyId, this.snapshotFriendlyId);
31
+ if (!response.success) {
32
+ this.logger.sendDebugLog({
33
+ runId: this.runFriendlyId,
34
+ message: "heartbeat: failed",
35
+ properties: {
36
+ error: response.error,
37
+ },
38
+ });
39
+ }
40
+ },
41
+ intervalMs: this.heartbeatIntervalMs,
42
+ leadingEdge: false,
43
+ onError: async (error) => {
44
+ this.logger.sendDebugLog({
45
+ runId: this.runFriendlyId,
46
+ message: "Failed to send heartbeat",
47
+ properties: { error: error instanceof Error ? error.message : String(error) },
48
+ });
49
+ },
50
+ });
51
+ }
52
+ resetCurrentInterval() {
53
+ this.heartbeat.resetCurrentInterval();
54
+ }
55
+ updateSnapshotId(snapshotFriendlyId) {
56
+ this.snapshotFriendlyId = snapshotFriendlyId;
57
+ }
58
+ updateInterval(intervalMs) {
59
+ this.heartbeat.updateInterval(intervalMs);
60
+ }
61
+ start() {
62
+ this.heartbeat.start();
63
+ }
64
+ stop() {
65
+ this.heartbeat.stop();
66
+ }
67
+ }
68
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAYvD,MAAM,OAAO,qBAAqB;IACf,aAAa,CAAS;IAC/B,kBAAkB,CAAS;IAElB,UAAU,CAAqB;IAC/B,MAAM,CAAY;IAClB,mBAAmB,CAAS;IAC5B,SAAS,CAAkB;IAE5C,YAAY,IAAkC;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAEhE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YACvB,KAAK,EAAE,IAAI,CAAC,aAAa;YACzB,OAAO,EAAE,uBAAuB;YAChC,UAAU,EAAE;gBACV,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;aACxD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC;YACnC,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;oBACvB,KAAK,EAAE,IAAI,CAAC,aAAa;oBACzB,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CACjD,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,CACxB,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;wBACvB,KAAK,EAAE,IAAI,CAAC,aAAa;wBACzB,OAAO,EAAE,mBAAmB;wBAC5B,UAAU,EAAE;4BACV,KAAK,EAAE,QAAQ,CAAC,KAAK;yBACtB;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,UAAU,EAAE,IAAI,CAAC,mBAAmB;YACpC,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;oBACvB,KAAK,EAAE,IAAI,CAAC,aAAa;oBACzB,OAAO,EAAE,0BAA0B;oBACnC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC9E,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC;IACxC,CAAC;IAED,gBAAgB,CAAC,kBAA0B;QACzC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,UAAkB;QAC/B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { WorkloadDebugLogRequestBody, WorkloadHttpClient } from "@trigger.dev/core/v3/runEngineWorker";
2
+ import { RunnerEnv } from "./env.js";
3
+ export type SendDebugLogOptions = {
4
+ runId?: string;
5
+ message: string;
6
+ date?: Date;
7
+ properties?: WorkloadDebugLogRequestBody["properties"];
8
+ };
9
+ export type RunLoggerOptions = {
10
+ httpClient: WorkloadHttpClient;
11
+ env: RunnerEnv;
12
+ };
13
+ export declare class RunLogger {
14
+ private readonly opts;
15
+ private readonly httpClient;
16
+ private readonly env;
17
+ constructor(opts: RunLoggerOptions);
18
+ sendDebugLog({ runId, message, date, properties }: SendDebugLogOptions): void;
19
+ }
@@ -0,0 +1,31 @@
1
+ export class RunLogger {
2
+ opts;
3
+ httpClient;
4
+ env;
5
+ constructor(opts) {
6
+ this.opts = opts;
7
+ this.httpClient = opts.httpClient;
8
+ this.env = opts.env;
9
+ }
10
+ sendDebugLog({ runId, message, date, properties }) {
11
+ if (!runId) {
12
+ runId = this.env.TRIGGER_RUN_ID;
13
+ }
14
+ if (!runId) {
15
+ return;
16
+ }
17
+ const mergedProperties = {
18
+ ...properties,
19
+ runId,
20
+ runnerId: this.env.TRIGGER_RUNNER_ID,
21
+ workerName: this.env.TRIGGER_WORKER_INSTANCE_NAME,
22
+ };
23
+ console.log(message, mergedProperties);
24
+ this.httpClient.sendDebugLog(runId, {
25
+ message,
26
+ time: date ?? new Date(),
27
+ properties: mergedProperties,
28
+ });
29
+ }
30
+ }
31
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/logger.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,SAAS;IAIS;IAHZ,UAAU,CAAqB;IAC/B,GAAG,CAAY;IAEhC,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAuB;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GAAG;YACvB,GAAG,UAAU;YACb,KAAK;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB;YACpC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,4BAA4B;SAClD,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAEvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE;YAClC,OAAO;YACP,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE;YACxB,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export type Metadata = {
2
+ TRIGGER_SUPERVISOR_API_PROTOCOL: string | undefined;
3
+ TRIGGER_SUPERVISOR_API_DOMAIN: string | undefined;
4
+ TRIGGER_SUPERVISOR_API_PORT: number | undefined;
5
+ TRIGGER_WORKER_INSTANCE_NAME: string | undefined;
6
+ TRIGGER_HEARTBEAT_INTERVAL_SECONDS: number | undefined;
7
+ TRIGGER_SNAPSHOT_POLL_INTERVAL_SECONDS: number | undefined;
8
+ TRIGGER_SUCCESS_EXIT_CODE: number | undefined;
9
+ TRIGGER_FAILURE_EXIT_CODE: number | undefined;
10
+ TRIGGER_RUNNER_ID: string | undefined;
11
+ };
12
+ export declare class MetadataClient {
13
+ private readonly url;
14
+ constructor(url: string);
15
+ getEnvOverrides(): Promise<Metadata | null>;
16
+ }
@@ -0,0 +1,17 @@
1
+ export class MetadataClient {
2
+ url;
3
+ constructor(url) {
4
+ this.url = new URL(url);
5
+ }
6
+ async getEnvOverrides() {
7
+ try {
8
+ const response = await fetch(new URL("/env", this.url));
9
+ return response.json();
10
+ }
11
+ catch (error) {
12
+ console.error("Failed to fetch metadata", { error });
13
+ return null;
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/overrides.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAc;IACR,GAAG,CAAM;IAE1B,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import { WorkloadHttpClient } from "@trigger.dev/core/v3/runEngineWorker";
2
+ import { RunLogger } from "./logger.js";
3
+ import { RunExecutionData } from "@trigger.dev/core/v3";
4
+ export type RunExecutionSnapshotPollerOptions = {
5
+ runFriendlyId: string;
6
+ snapshotFriendlyId: string;
7
+ httpClient: WorkloadHttpClient;
8
+ logger: RunLogger;
9
+ snapshotPollIntervalSeconds: number;
10
+ handleSnapshotChange: (execution: RunExecutionData) => Promise<void>;
11
+ };
12
+ export declare class RunExecutionSnapshotPoller {
13
+ private runFriendlyId;
14
+ private snapshotFriendlyId;
15
+ private readonly httpClient;
16
+ private readonly logger;
17
+ private readonly snapshotPollIntervalMs;
18
+ private readonly handleSnapshotChange;
19
+ private readonly poller;
20
+ constructor(opts: RunExecutionSnapshotPollerOptions);
21
+ resetCurrentInterval(): void;
22
+ updateSnapshotId(snapshotFriendlyId: string): void;
23
+ updateInterval(intervalMs: number): void;
24
+ start(): void;
25
+ stop(): void;
26
+ }
@@ -0,0 +1,94 @@
1
+ import { IntervalService } from "@trigger.dev/core/v3";
2
+ export class RunExecutionSnapshotPoller {
3
+ runFriendlyId;
4
+ snapshotFriendlyId;
5
+ httpClient;
6
+ logger;
7
+ snapshotPollIntervalMs;
8
+ handleSnapshotChange;
9
+ poller;
10
+ constructor(opts) {
11
+ this.runFriendlyId = opts.runFriendlyId;
12
+ this.snapshotFriendlyId = opts.snapshotFriendlyId;
13
+ this.httpClient = opts.httpClient;
14
+ this.logger = opts.logger;
15
+ this.snapshotPollIntervalMs = opts.snapshotPollIntervalSeconds * 1000;
16
+ this.handleSnapshotChange = opts.handleSnapshotChange;
17
+ this.logger.sendDebugLog({
18
+ runId: this.runFriendlyId,
19
+ message: "RunExecutionSnapshotPoller",
20
+ properties: {
21
+ runFriendlyId: this.runFriendlyId,
22
+ snapshotFriendlyId: this.snapshotFriendlyId,
23
+ snapshotPollIntervalSeconds: opts.snapshotPollIntervalSeconds,
24
+ },
25
+ });
26
+ this.poller = new IntervalService({
27
+ onInterval: async () => {
28
+ if (!this.runFriendlyId) {
29
+ this.logger.sendDebugLog({
30
+ runId: this.runFriendlyId,
31
+ message: "Skipping snapshot poll, no run ID",
32
+ });
33
+ return;
34
+ }
35
+ this.logger.sendDebugLog({
36
+ runId: this.runFriendlyId,
37
+ message: "Polling for latest snapshot",
38
+ });
39
+ this.logger.sendDebugLog({
40
+ runId: this.runFriendlyId,
41
+ message: `snapshot poll: started`,
42
+ properties: {
43
+ snapshotId: this.snapshotFriendlyId,
44
+ },
45
+ });
46
+ const response = await this.httpClient.getRunExecutionData(this.runFriendlyId);
47
+ if (!response.success) {
48
+ this.logger.sendDebugLog({
49
+ runId: this.runFriendlyId,
50
+ message: "Snapshot poll failed",
51
+ properties: {
52
+ error: response.error,
53
+ },
54
+ });
55
+ this.logger.sendDebugLog({
56
+ runId: this.runFriendlyId,
57
+ message: `snapshot poll: failed`,
58
+ properties: {
59
+ snapshotId: this.snapshotFriendlyId,
60
+ error: response.error,
61
+ },
62
+ });
63
+ return;
64
+ }
65
+ await this.handleSnapshotChange(response.data.execution);
66
+ },
67
+ intervalMs: this.snapshotPollIntervalMs,
68
+ leadingEdge: false,
69
+ onError: async (error) => {
70
+ this.logger.sendDebugLog({
71
+ runId: this.runFriendlyId,
72
+ message: "Failed to poll for snapshot",
73
+ properties: { error: error instanceof Error ? error.message : String(error) },
74
+ });
75
+ },
76
+ });
77
+ }
78
+ resetCurrentInterval() {
79
+ this.poller.resetCurrentInterval();
80
+ }
81
+ updateSnapshotId(snapshotFriendlyId) {
82
+ this.snapshotFriendlyId = snapshotFriendlyId;
83
+ }
84
+ updateInterval(intervalMs) {
85
+ this.poller.updateInterval(intervalMs);
86
+ }
87
+ start() {
88
+ this.poller.start();
89
+ }
90
+ stop() {
91
+ this.poller.stop();
92
+ }
93
+ }
94
+ //# sourceMappingURL=poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/poller.ts"],"names":[],"mappings":"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"}